Connect TunerTimeFilter/TunerDemux with TimeFilterClient/DemuxClient

Test: make
Bug: 174095851
Change-Id: I43bbb5a33a099a6898a54ec1e8844ab56884ea74
diff --git a/media/jni/tuner/DemuxClient.cpp b/media/jni/tuner/DemuxClient.cpp
index 1a2f8c0..748d458 100644
--- a/media/jni/tuner/DemuxClient.cpp
+++ b/media/jni/tuner/DemuxClient.cpp
@@ -88,12 +88,19 @@
 }
 
 sp<TimeFilterClient> DemuxClient::openTimeFilter() {
-    // TODO: pending aidl interface
+    if (mTunerDemux != NULL) {
+        shared_ptr<ITunerTimeFilter> tunerTimeFilter;
+        Status s = mTunerDemux->openTimeFilter(&tunerTimeFilter);
+        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
+            return NULL;
+        }
+        return new TimeFilterClient(tunerTimeFilter);
+    }
 
     if (mDemux != NULL) {
         sp<ITimeFilter> hidlTimeFilter = openHidlTimeFilter();
         if (hidlTimeFilter != NULL) {
-            sp<TimeFilterClient> timeFilterClient = new TimeFilterClient();
+            sp<TimeFilterClient> timeFilterClient = new TimeFilterClient(NULL);
             timeFilterClient->setHidlTimeFilter(hidlTimeFilter);
             return timeFilterClient;
         }
@@ -103,7 +110,14 @@
 }
 
 int DemuxClient::getAvSyncHwId(sp<FilterClient> filterClient) {
-    // pending aidl interface
+    if (mTunerDemux != NULL) {
+        int hwId;
+        Status s = mTunerDemux->getAvSyncHwId(filterClient->getAidlFilter(), &hwId);
+        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
+            return INVALID_AV_SYNC_HW_ID;
+        }
+        return hwId;
+    }
 
     if (mDemux != NULL) {
         uint32_t avSyncHwId;
@@ -119,11 +133,18 @@
         }
     }
 
-    return -1;
+    return INVALID_AV_SYNC_HW_ID;
 }
 
 long DemuxClient::getAvSyncTime(int avSyncHwId) {
-    // pending aidl interface
+    if (mTunerDemux != NULL) {
+        int64_t time;
+        Status s = mTunerDemux->getAvSyncTime(avSyncHwId, &time);
+        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
+            return INVALID_AV_SYNC_TIME;
+        }
+        return time;
+    }
 
     if (mDemux != NULL) {
         uint64_t time;
@@ -138,7 +159,7 @@
         }
     }
 
-    return -1;
+    return INVALID_AV_SYNC_TIME;
 }
 
 sp<DvrClient> DemuxClient::openDvr(DvrType dvbType, int bufferSize, sp<DvrClientCallback> cb) {
@@ -167,7 +188,10 @@
 }
 
 Result DemuxClient::connectCiCam(int ciCamId) {
-    // pending aidl interface
+    if (mTunerDemux != NULL) {
+        Status s = mTunerDemux->connectCiCam(ciCamId);
+        return ClientHelper::getServiceSpecificErrorCode(s);
+    }
 
     if (mDemux != NULL) {
         return mDemux->connectCiCam(static_cast<uint32_t>(ciCamId));
@@ -177,7 +201,10 @@
 }
 
 Result DemuxClient::disconnectCiCam() {
-    // pending aidl interface
+    if (mTunerDemux != NULL) {
+        Status s = mTunerDemux->disconnectCiCam();
+        return ClientHelper::getServiceSpecificErrorCode(s);
+    }
 
     if (mDemux != NULL) {
         return mDemux->disconnectCiCam();
diff --git a/media/jni/tuner/DemuxClient.h b/media/jni/tuner/DemuxClient.h
index 463944a..31eb35a 100644
--- a/media/jni/tuner/DemuxClient.h
+++ b/media/jni/tuner/DemuxClient.h
@@ -31,7 +31,9 @@
 
 using Status = ::ndk::ScopedAStatus;
 using ::aidl::android::media::tv::tuner::ITunerDemux;
+using ::aidl::android::media::tv::tuner::ITunerTimeFilter;
 
+using ::android::hardware::tv::tuner::V1_0::IDemux;
 using ::android::hardware::tv::tuner::V1_0::DemuxFilterType;
 using ::android::hardware::tv::tuner::V1_0::DvrType;
 using ::android::hardware::tv::tuner::V1_0::IDemux;
@@ -39,6 +41,9 @@
 
 using namespace std;
 
+const int64_t INVALID_AV_SYNC_TIME = -1;
+const int INVALID_AV_SYNC_HW_ID = -1;
+
 namespace android {
 
 struct DemuxClient : public RefBase {
diff --git a/media/jni/tuner/TimeFilterClient.cpp b/media/jni/tuner/TimeFilterClient.cpp
index 27ea6e5..432238d 100644
--- a/media/jni/tuner/TimeFilterClient.cpp
+++ b/media/jni/tuner/TimeFilterClient.cpp
@@ -19,6 +19,7 @@
 #include <android-base/logging.h>
 #include <utils/Log.h>
 
+#include "ClientHelper.h"
 #include "TimeFilterClient.h"
 
 using ::android::hardware::tv::tuner::V1_0::Result;
@@ -28,13 +29,12 @@
 
 /////////////// TimeFilterClient ///////////////////////
 
-// TODO: pending aidl interface
-TimeFilterClient::TimeFilterClient() {
-    //mTunerTimeFilter = tunerTimeFilter;
+TimeFilterClient::TimeFilterClient(shared_ptr<ITunerTimeFilter> tunerTimeFilter) {
+    mTunerTimeFilter = tunerTimeFilter;
 }
 
 TimeFilterClient::~TimeFilterClient() {
-    //mTunerTimeFilter = NULL;
+    mTunerTimeFilter = NULL;
     mTimeFilter = NULL;
 }
 
@@ -44,7 +44,10 @@
 }
 
 Result TimeFilterClient::setTimeStamp(long timeStamp) {
-    // TODO: pending aidl interface
+    if (mTunerTimeFilter != NULL) {
+        Status s = mTunerTimeFilter->setTimeStamp(timeStamp);
+        return ClientHelper::getServiceSpecificErrorCode(s);
+    }
 
     if (mTimeFilter != NULL) {
         return mTimeFilter->setTimeStamp(timeStamp);
@@ -54,7 +57,10 @@
 }
 
 Result TimeFilterClient::clearTimeStamp() {
-    // TODO: pending aidl interface
+    if (mTunerTimeFilter != NULL) {
+        Status s = mTunerTimeFilter->clearTimeStamp();
+        return ClientHelper::getServiceSpecificErrorCode(s);
+    }
 
     if (mTimeFilter != NULL) {
         return mTimeFilter->clearTimeStamp();
@@ -64,7 +70,14 @@
 }
 
 long TimeFilterClient::getTimeStamp() {
-    // TODO: pending aidl interface
+    if (mTunerTimeFilter != NULL) {
+        int64_t timeStamp;
+        Status s = mTunerTimeFilter->getTimeStamp(&timeStamp);
+        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
+            return (long)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP;
+        }
+        return timeStamp;
+    }
 
     if (mTimeFilter != NULL) {
         Result res;
@@ -84,27 +97,37 @@
 }
 
 long TimeFilterClient::getSourceTime() {
-    // TODO: pending aidl interface
+    if (mTunerTimeFilter != NULL) {
+        int64_t sourceTime;
+        Status s = mTunerTimeFilter->getTimeStamp(&sourceTime);
+        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
+            return (long)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP;
+        }
+        return sourceTime;
+    }
 
     if (mTimeFilter != NULL) {
         Result res;
-        long timestamp;
+        long sourceTime;
         mTimeFilter->getSourceTime(
                 [&](Result r, uint64_t t) {
                     res = r;
-                    timestamp = t;
+                    sourceTime = t;
                 });
         if (res != Result::SUCCESS) {
             return (long)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP;
         }
-        return timestamp;
+        return sourceTime;
     }
 
     return (long)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP;
 }
 
 Result TimeFilterClient::close() {
-    // TODO: pending aidl interface
+    if (mTunerTimeFilter != NULL) {
+        Status s = mTunerTimeFilter->close();
+        return ClientHelper::getServiceSpecificErrorCode(s);
+    }
 
     if (mTimeFilter != NULL) {
         return mTimeFilter->close();
diff --git a/media/jni/tuner/TimeFilterClient.h b/media/jni/tuner/TimeFilterClient.h
index 9a9d172..56ddd68 100644
--- a/media/jni/tuner/TimeFilterClient.h
+++ b/media/jni/tuner/TimeFilterClient.h
@@ -17,12 +17,13 @@
 #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 <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 ::aidl::android::media::tv::tuner::ITunerTimeFilter;
 
+using Status = ::ndk::ScopedAStatus;
 using ::android::hardware::Return;
 using ::android::hardware::Void;
 using ::android::hardware::hidl_vec;
@@ -36,8 +37,7 @@
 struct TimeFilterClient : public RefBase {
 
 public:
-    // TODO: add TunerTimeFilter as parameter.
-    TimeFilterClient();
+    TimeFilterClient(shared_ptr<ITunerTimeFilter> tunerTimeFilter);
     ~TimeFilterClient();
 
     // TODO: remove after migration to Tuner Service is done.
@@ -73,8 +73,7 @@
      * 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;
+    shared_ptr<ITunerTimeFilter> mTunerTimeFilter;
 
     /**
      * A TimeFilter HAL interface that is ready before migrating to the TunerTimeFilter.
diff --git a/media/jni/tuner/TunerClient.cpp b/media/jni/tuner/TunerClient.cpp
index 14393a1..a604490d 100644
--- a/media/jni/tuner/TunerClient.cpp
+++ b/media/jni/tuner/TunerClient.cpp
@@ -200,7 +200,14 @@
 }
 
 shared_ptr<DemuxCapabilities> TunerClient::getDemuxCaps() {
-    // pending aidl interface
+    if (mTunerService != NULL) {
+        TunerDemuxCapabilities aidlCaps;
+        Status s = mTunerService->getDemuxCaps(&aidlCaps);
+        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
+            return NULL;
+        }
+        return make_shared<DemuxCapabilities>(getHidlDemuxCaps(aidlCaps));
+    }
 
     if (mTuner != NULL) {
         Result res;
@@ -459,6 +466,26 @@
     return descrambler;
 }
 
+DemuxCapabilities TunerClient::getHidlDemuxCaps(TunerDemuxCapabilities& aidlCaps) {
+    DemuxCapabilities caps{
+        .numDemux = (uint32_t)aidlCaps.numDemux,
+        .numRecord = (uint32_t)aidlCaps.numRecord,
+        .numPlayback = (uint32_t)aidlCaps.numPlayback,
+        .numTsFilter = (uint32_t)aidlCaps.numTsFilter,
+        .numSectionFilter = (uint32_t)aidlCaps.numSectionFilter,
+        .numAudioFilter = (uint32_t)aidlCaps.numAudioFilter,
+        .numVideoFilter = (uint32_t)aidlCaps.numVideoFilter,
+        .numPesFilter = (uint32_t)aidlCaps.numPesFilter,
+        .numPcrFilter = (uint32_t)aidlCaps.numPcrFilter,
+        .numBytesInSectionFilter = (uint32_t)aidlCaps.numBytesInSectionFilter,
+        .filterCaps = (uint32_t)aidlCaps.filterCaps,
+        .bTimeFilter = aidlCaps.bTimeFilter,
+    };
+    caps.linkCaps.resize(aidlCaps.linkCaps.size());
+    copy(aidlCaps.linkCaps.begin(), aidlCaps.linkCaps.end(), caps.linkCaps.begin());
+    return caps;
+}
+
 FrontendInfo TunerClient::FrontendInfoAidlToHidl(TunerFrontendInfo aidlFrontendInfo) {
     FrontendInfo hidlFrontendInfo {
         .type = static_cast<FrontendType>(aidlFrontendInfo.type),
diff --git a/media/jni/tuner/TunerClient.h b/media/jni/tuner/TunerClient.h
index 6ce6661..acd018e 100644
--- a/media/jni/tuner/TunerClient.h
+++ b/media/jni/tuner/TunerClient.h
@@ -32,6 +32,7 @@
 
 using Status = ::ndk::ScopedAStatus;
 
+using ::aidl::android::media::tv::tuner::TunerDemuxCapabilities;
 using ::aidl::android::media::tv::tuner::ITunerService;
 using ::aidl::android::media::tv::tuner::TunerFrontendInfo;
 using ::aidl::android::media::tv::tunerresourcemanager::ITunerResourceManager;
@@ -145,6 +146,7 @@
     sp<ILnb> openHidlLnbByName(string name, LnbId& lnbId);
     sp<IDescrambler> openHidlDescrambler();
     vector<int> getLnbHandles();
+    DemuxCapabilities getHidlDemuxCaps(TunerDemuxCapabilities& aidlCaps);
     FrontendInfo FrontendInfoAidlToHidl(TunerFrontendInfo aidlFrontendInfo);
     void updateTunerResources();
     void updateFrontendResources();