[PARTIAL] Migrate Tuner JNI to use Client interfaces

Test: atest android.media.tv.tuner.cts
Test: local test on SampleTIS Cuttlefish

Bug: 174095851
Change-Id: I69e28132d6b5da34f99da4611b4fbc72e96913f8
diff --git a/media/jni/tuner/DemuxClient.cpp b/media/jni/tuner/DemuxClient.cpp
index 11acb5e..b237a24 100644
--- a/media/jni/tuner/DemuxClient.cpp
+++ b/media/jni/tuner/DemuxClient.cpp
@@ -68,14 +68,12 @@
         sp<HidlFilterCallback> callback = new HidlFilterCallback(cb);
         sp<IFilter> hidlFilter = openHidlFilter(type, bufferSize, callback);
         if (hidlFilter != NULL) {
-            sp<FilterClient> filterClient = new FilterClient();
+            sp<FilterClient> filterClient = new FilterClient(type);
             filterClient->setHidlFilter(hidlFilter);
             return filterClient;
         }
     }
 
-    // TODO: handle share av memory handle
-
     return NULL;
 }
 
@@ -141,7 +139,7 @@
 }
 
 Result DemuxClient::close() {
-    // pending aidl interface
+    // TODO: pending aidl interface
 
     if (mDemux != NULL) {
         Result res = mDemux->close();
diff --git a/media/jni/tuner/FilterClient.cpp b/media/jni/tuner/FilterClient.cpp
index a71cae60..0aab5fe 100644
--- a/media/jni/tuner/FilterClient.cpp
+++ b/media/jni/tuner/FilterClient.cpp
@@ -22,6 +22,9 @@
 #include "FilterClient.h"
 
 using ::android::hardware::tv::tuner::V1_0::DemuxQueueNotifyBits;
+using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType;
+using ::android::hardware::tv::tuner::V1_0::DemuxMmtpFilterType;
+using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterType;
 
 namespace android {
 
@@ -29,20 +32,25 @@
 
 // TODO: pending aidl interface
 // TODO: add filter callback
-FilterClient::FilterClient() {
+FilterClient::FilterClient(DemuxFilterType type) {
     //mTunerFilter = tunerFilter;
+    mAvSharedHandle = NULL;
+    checkIsMediaFilter(type);
 }
 
 FilterClient::~FilterClient() {
     //mTunerFilter = NULL;
     mFilter = NULL;
     mFilter_1_1 = NULL;
+    mAvSharedHandle = NULL;
+    mAvSharedMemSize = 0;
 }
 
 // TODO: remove after migration to Tuner Service is done.
 void FilterClient::setHidlFilter(sp<IFilter> filter) {
     mFilter = filter;
     mFilter_1_1 = ::android::hardware::tv::tuner::V1_1::IFilter::castFrom(mFilter);
+    handleAvShareMemory();
 }
 
 int FilterClient::read(uint8_t* buffer, int size) {
@@ -59,6 +67,22 @@
     return -1;
 }
 
+SharedHandleInfo FilterClient::getAvSharedHandleInfo() {
+    SharedHandleInfo info{
+        .sharedHandle = NULL,
+        .size = 0,
+    };
+
+    // TODO: pending aidl interface
+
+    if (mFilter_1_1 != NULL) {
+        info.sharedHandle = mAvSharedHandle;
+        info.size = mAvSharedMemSize;
+    }
+
+    return info;
+}
+
 Result FilterClient::configure(DemuxFilterSettings configure) {
     // TODO: pending aidl interface
 
@@ -187,7 +211,11 @@
     // TODO: pending aidl interface
 
     if (mFilter != NULL) {
-        return mFilter->close();
+        Result res = mFilter->close();
+        if (res == Result::SUCCESS) {
+            mFilter = NULL;
+        }
+        return res;
     }
 
     return Result::INVALID_STATE;
@@ -261,4 +289,31 @@
 
     return size;
 }
+
+void FilterClient::checkIsMediaFilter(DemuxFilterType type) {
+    if (type.mainType == DemuxFilterMainType::MMTP) {
+        if (type.subType.mmtpFilterType() == DemuxMmtpFilterType::AUDIO ||
+                type.subType.mmtpFilterType() == DemuxMmtpFilterType::VIDEO) {
+            mIsMediaFilter = true;
+        }
+    }
+
+    if (type.mainType == DemuxFilterMainType::TS) {
+        if (type.subType.tsFilterType() == DemuxTsFilterType::AUDIO ||
+                type.subType.tsFilterType() == DemuxTsFilterType::VIDEO) {
+            mIsMediaFilter = true;
+        }
+    }
+}
+
+void FilterClient::handleAvShareMemory() {
+    if (mFilter_1_1 != NULL && mIsMediaFilter) {
+        mFilter_1_1->getAvSharedHandle([&](Result r, hidl_handle avMemory, uint64_t avMemSize) {
+            if (r == Result::SUCCESS) {
+                mAvSharedHandle = native_handle_clone(avMemory.getNativeHandle());
+                mAvSharedMemSize = avMemSize;
+            }
+        });
+    }
+}
 }  // namespace android
diff --git a/media/jni/tuner/FilterClient.h b/media/jni/tuner/FilterClient.h
index 4af74b0..976b2f5 100644
--- a/media/jni/tuner/FilterClient.h
+++ b/media/jni/tuner/FilterClient.h
@@ -34,6 +34,7 @@
 using ::android::hardware::Void;
 using ::android::hardware::hidl_handle;
 using ::android::hardware::tv::tuner::V1_0::DemuxFilterSettings;
+using ::android::hardware::tv::tuner::V1_0::DemuxFilterType;
 using ::android::hardware::tv::tuner::V1_0::IFilter;
 using ::android::hardware::tv::tuner::V1_0::Result;
 using ::android::hardware::tv::tuner::V1_1::AvStreamType;
@@ -45,6 +46,11 @@
 
 namespace android {
 
+struct SharedHandleInfo {
+    native_handle_t* sharedHandle;
+    uint64_t size;
+};
+
 // TODO: pending aidl interface
 /*class TunerFilterCallback : public BnTunerFilterCallback {
 
@@ -75,7 +81,7 @@
 
 public:
     // TODO: pending aidl interface
-    FilterClient();
+    FilterClient(DemuxFilterType type);
     ~FilterClient();
 
     // TODO: remove after migration to Tuner Service is done.
@@ -89,6 +95,11 @@
     int read(uint8_t* buffer, int size);
 
     /**
+     * Get the a/v shared memory handle information
+     */
+    SharedHandleInfo getAvSharedHandleInfo();
+
+    /**
      * Configure the filter.
      */
     Result configure(DemuxFilterSettings configure);
@@ -161,6 +172,8 @@
 private:
     Result getFilterMq();
     int copyData(uint8_t* buffer, int size);
+    void checkIsMediaFilter(DemuxFilterType type);
+    void handleAvShareMemory();
 
     /**
      * An AIDL Tuner Filter Singleton assigned at the first time when the Tuner Client
@@ -189,6 +202,10 @@
     sp<FilterClientCallback> mCallback;
     //shared_ptr<TunerFilterCallback> mAidlCallback;
     sp<HidlFilterCallback> mHidlCallback;
+
+    native_handle_t* mAvSharedHandle;
+    uint64_t mAvSharedMemSize;
+    bool mIsMediaFilter;
 };
 }  // namespace android