Refactor JNI to remove ITimeFilter/IDemux/ITuner
Test: atest android.media.tv.tuner.cts on Cuttlefish
Bug: 174095851
Change-Id: I21ba3734602bd5246c2fb876e88cd2f77ec75632
diff --git a/media/jni/tuner/DemuxClient.cpp b/media/jni/tuner/DemuxClient.cpp
index 58f9a46..08b7398 100644
--- a/media/jni/tuner/DemuxClient.cpp
+++ b/media/jni/tuner/DemuxClient.cpp
@@ -79,6 +79,21 @@
return NULL;
}
+sp<TimeFilterClient> DemuxClient::openTimeFilter() {
+ // TODO: pending aidl interface
+
+ if (mDemux != NULL) {
+ sp<ITimeFilter> hidlTimeFilter = openHidlTimeFilter();
+ if (hidlTimeFilter != NULL) {
+ sp<TimeFilterClient> timeFilterClient = new TimeFilterClient();
+ timeFilterClient->setHidlTimeFilter(hidlTimeFilter);
+ return timeFilterClient;
+ }
+ }
+
+ return NULL;
+}
+
int DemuxClient::getAvSyncHwId(sp<FilterClient> filterClient) {
// pending aidl interface
@@ -190,6 +205,26 @@
return hidlFilter;
}
+sp<ITimeFilter> DemuxClient::openHidlTimeFilter() {
+ if (mDemux == NULL) {
+ return NULL;
+ }
+
+ sp<ITimeFilter> timeFilter;
+ Result res;
+ mDemux->openTimeFilter(
+ [&](Result r, const sp<ITimeFilter>& timeFilterSp) {
+ timeFilter = timeFilterSp;
+ res = r;
+ });
+
+ if (res != Result::SUCCESS || timeFilter == NULL) {
+ return NULL;
+ }
+
+ return timeFilter;
+}
+
sp<IDvr> DemuxClient::openHidlDvr(DvrType dvrType, int bufferSize,
sp<HidlDvrCallback> callback) {
if (mDemux == NULL) {
diff --git a/media/jni/tuner/DemuxClient.h b/media/jni/tuner/DemuxClient.h
index 7b8eede..2950dd4 100644
--- a/media/jni/tuner/DemuxClient.h
+++ b/media/jni/tuner/DemuxClient.h
@@ -26,12 +26,14 @@
#include "FilterClient.h"
#include "FilterClientCallback.h"
#include "FrontendClient.h"
+#include "TimeFilterClient.h"
//using ::aidl::android::media::tv::tuner::ITunerDemux;
using ::android::hardware::tv::tuner::V1_0::DemuxFilterType;
using ::android::hardware::tv::tuner::V1_0::DvrType;
using ::android::hardware::tv::tuner::V1_0::IDemux;
+using ::android::hardware::tv::tuner::V1_0::ITimeFilter;
using namespace std;
@@ -56,7 +58,10 @@
*/
sp<FilterClient> openFilter(DemuxFilterType type, int bufferSize, sp<FilterClientCallback> cb);
- // TODO: handle TimeFilterClient
+ /**
+ * Open time filter of the demux.
+ */
+ sp<TimeFilterClient> openTimeFilter();
/**
* Get hardware sync ID for audio and video.
@@ -93,6 +98,7 @@
private:
sp<IFilter> openHidlFilter(DemuxFilterType type, int bufferSize, sp<HidlFilterCallback> cb);
+ sp<ITimeFilter> openHidlTimeFilter();
sp<IDvr> openHidlDvr(DvrType type, int bufferSize, sp<HidlDvrCallback> cb);
/**
diff --git a/media/jni/tuner/TimeFilterClient.cpp b/media/jni/tuner/TimeFilterClient.cpp
new file mode 100644
index 0000000..27ea6e5
--- /dev/null
+++ b/media/jni/tuner/TimeFilterClient.cpp
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "TimeFilterClient"
+
+#include <android-base/logging.h>
+#include <utils/Log.h>
+
+#include "TimeFilterClient.h"
+
+using ::android::hardware::tv::tuner::V1_0::Result;
+using ::android::hardware::tv::tuner::V1_1::Constant64Bit;
+
+namespace android {
+
+/////////////// TimeFilterClient ///////////////////////
+
+// TODO: pending aidl interface
+TimeFilterClient::TimeFilterClient() {
+ //mTunerTimeFilter = tunerTimeFilter;
+}
+
+TimeFilterClient::~TimeFilterClient() {
+ //mTunerTimeFilter = NULL;
+ mTimeFilter = NULL;
+}
+
+// TODO: remove after migration to Tuner Service is done.
+void TimeFilterClient::setHidlTimeFilter(sp<ITimeFilter> timeFilter) {
+ mTimeFilter = timeFilter;
+}
+
+Result TimeFilterClient::setTimeStamp(long timeStamp) {
+ // TODO: pending aidl interface
+
+ if (mTimeFilter != NULL) {
+ return mTimeFilter->setTimeStamp(timeStamp);
+ }
+
+ return Result::INVALID_STATE;
+}
+
+Result TimeFilterClient::clearTimeStamp() {
+ // TODO: pending aidl interface
+
+ if (mTimeFilter != NULL) {
+ return mTimeFilter->clearTimeStamp();
+ }
+
+ return Result::INVALID_STATE;
+}
+
+long TimeFilterClient::getTimeStamp() {
+ // TODO: pending aidl interface
+
+ if (mTimeFilter != NULL) {
+ Result res;
+ long timestamp;
+ mTimeFilter->getTimeStamp(
+ [&](Result r, uint64_t t) {
+ res = r;
+ timestamp = t;
+ });
+ if (res != Result::SUCCESS) {
+ return (long)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP;
+ }
+ return timestamp;
+ }
+
+ return (long)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP;
+}
+
+long TimeFilterClient::getSourceTime() {
+ // TODO: pending aidl interface
+
+ if (mTimeFilter != NULL) {
+ Result res;
+ long timestamp;
+ mTimeFilter->getSourceTime(
+ [&](Result r, uint64_t t) {
+ res = r;
+ timestamp = t;
+ });
+ if (res != Result::SUCCESS) {
+ return (long)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP;
+ }
+ return timestamp;
+ }
+
+ return (long)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP;
+}
+
+Result TimeFilterClient::close() {
+ // TODO: pending aidl interface
+
+ if (mTimeFilter != NULL) {
+ return mTimeFilter->close();
+ }
+
+ return Result::INVALID_STATE;
+}
+} // namespace android
diff --git a/media/jni/tuner/TimeFilterClient.h b/media/jni/tuner/TimeFilterClient.h
new file mode 100644
index 0000000..9a9d172
--- /dev/null
+++ b/media/jni/tuner/TimeFilterClient.h
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _ANDROID_MEDIA_TV_TIME_FILTER_CLIENT_H_
+#define _ANDROID_MEDIA_TV_TIME_FILTER_CLIENT_H_
+
+//#include <aidl/android/media/tv/tuner/ITunerTimeFilter.h>
+#include <android/hardware/tv/tuner/1.0/ITimeFilter.h>
+#include <android/hardware/tv/tuner/1.1/types.h>
+
+//using ::aidl::android::media::tv::tuner::ITunerTimeFilter;
+
+using ::android::hardware::Return;
+using ::android::hardware::Void;
+using ::android::hardware::hidl_vec;
+using ::android::hardware::tv::tuner::V1_0::ITimeFilter;
+using ::android::hardware::tv::tuner::V1_0::Result;
+
+using namespace std;
+
+namespace android {
+
+struct TimeFilterClient : public RefBase {
+
+public:
+ // TODO: add TunerTimeFilter as parameter.
+ TimeFilterClient();
+ ~TimeFilterClient();
+
+ // TODO: remove after migration to Tuner Service is done.
+ void setHidlTimeFilter(sp<ITimeFilter> timeFilter);
+
+ /**
+ * Set time stamp for time based filter.
+ */
+ Result setTimeStamp(long timeStamp);
+
+ /**
+ * Clear the time stamp in the time filter.
+ */
+ Result clearTimeStamp();
+
+ /**
+ * Get the current time in the time filter.
+ */
+ long getTimeStamp();
+
+ /**
+ * Get the time from the beginning of current data source.
+ */
+ long getSourceTime();
+
+ /**
+ * Releases the Time Filter instance.
+ */
+ Result close();
+
+private:
+ /**
+ * An AIDL Tuner TimeFilter Singleton assigned at the first time the Tuner Client
+ * opens an TimeFilter. Default null when time filter is not opened.
+ */
+ // TODO: pending on aidl interface
+ //shared_ptr<ITunerTimeFilter> mTunerTimeFilter;
+
+ /**
+ * A TimeFilter HAL interface that is ready before migrating to the TunerTimeFilter.
+ * This is a temprary interface before Tuner Framework migrates to use TunerService.
+ * Default null when the HAL service does not exist.
+ */
+ sp<ITimeFilter> mTimeFilter;
+};
+} // namespace android
+
+#endif // _ANDROID_MEDIA_TV_TIME_FILTER_CLIENT_H_
diff --git a/media/jni/tuner/TunerClient.cpp b/media/jni/tuner/TunerClient.cpp
index e469aa3..b14e902 100644
--- a/media/jni/tuner/TunerClient.cpp
+++ b/media/jni/tuner/TunerClient.cpp
@@ -173,9 +173,22 @@
return NULL;
}
-DemuxCapabilities TunerClient::getDemuxCaps() {
- DemuxCapabilities caps;
- return caps;
+shared_ptr<DemuxCapabilities> TunerClient::getDemuxCaps() {
+ // pending aidl interface
+
+ if (mTuner != NULL) {
+ Result res;
+ DemuxCapabilities caps;
+ mTuner->getDemuxCaps([&](Result r, const DemuxCapabilities& demuxCaps) {
+ caps = demuxCaps;
+ res = r;
+ });
+ if (res == Result::SUCCESS) {
+ return make_shared<DemuxCapabilities>(caps);
+ }
+ }
+
+ return NULL;
}
sp<DescramblerClient> TunerClient::openDescrambler(int /*descramblerHandle*/) {
diff --git a/media/jni/tuner/TunerClient.h b/media/jni/tuner/TunerClient.h
index 036360f..94fdf27 100644
--- a/media/jni/tuner/TunerClient.h
+++ b/media/jni/tuner/TunerClient.h
@@ -96,7 +96,7 @@
*
* @return the demux’s capabilities.
*/
- DemuxCapabilities getDemuxCaps();
+ shared_ptr<DemuxCapabilities> getDemuxCaps();
/**
* Open a new interface of DescramblerClient given a descramblerHandle.