From 7e55ac002f90738f3bb162fd6f527acf12cb4b1b Mon Sep 17 00:00:00 2001 From: Amy Zhang Date: Thu, 4 Feb 2021 18:09:09 -0800 Subject: [PATCH] Connect TunerFilter with FilterClient Test: make Bug: 174095851 Change-Id: If57bda43eea7e4404692943510a33ab4e66bf2e6 --- media/jni/android_media_tv_Tuner.cpp | 2 +- media/jni/tuner/FilterClient.cpp | 92 ++++++++++++++++++---------- media/jni/tuner/FilterClient.h | 15 +++-- 3 files changed, 72 insertions(+), 37 deletions(-) diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index 9ec84d9d22654..eee9f1e08131d 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -3786,7 +3786,7 @@ static jint android_media_tv_Tuner_read_filter_fmq( jniThrowRuntimeException(env, "Failed to GetByteArrayElements"); return -1; } - int realReadSize = filterClient->read(reinterpret_cast(dst) + offset, size); + int realReadSize = filterClient->read(reinterpret_cast(dst) + offset, size); env->ReleaseByteArrayElements(buffer, dst, 0); return (jint) realReadSize; } diff --git a/media/jni/tuner/FilterClient.cpp b/media/jni/tuner/FilterClient.cpp index 6b788170a9449..2aaf96c758a1f 100644 --- a/media/jni/tuner/FilterClient.cpp +++ b/media/jni/tuner/FilterClient.cpp @@ -18,6 +18,7 @@ #include #include +#include #include #include "FilterClient.h" @@ -68,18 +69,12 @@ void FilterClient::setHidlFilter(sp filter) { mFilter_1_1 = ::android::hardware::tv::tuner::V1_1::IFilter::castFrom(mFilter); } -int FilterClient::read(uint8_t* buffer, int size) { - // TODO: pending aidl interface - - if (mFilter != NULL) { - Result res = getFilterMq(); - if (res != Result::SUCCESS) { - return -1; - } - return copyData(buffer, size); +int FilterClient::read(int8_t* buffer, int size) { + Result res = getFilterMq(); + if (res != Result::SUCCESS) { + return -1; } - - return -1; + return copyData(buffer, size); } SharedHandleInfo FilterClient::getAvSharedHandleInfo() { @@ -106,7 +101,10 @@ Result FilterClient::configure(DemuxFilterSettings configure) { } Result FilterClient::configureMonitorEvent(int monitorEventType) { - // TODO: pending aidl interface + if (mTunerFilter != NULL) { + Status s = mTunerFilter->configureMonitorEvent(monitorEventType); + return ClientHelper::getServiceSpecificErrorCode(s); + } if (mFilter_1_1 != NULL) { return mFilter_1_1->configureMonitorEvent(monitorEventType); @@ -116,7 +114,10 @@ Result FilterClient::configureMonitorEvent(int monitorEventType) { } Result FilterClient::configureIpFilterContextId(int cid) { - // TODO: pending aidl interface + if (mTunerFilter != NULL) { + Status s = mTunerFilter->configureIpFilterContextId(cid); + return ClientHelper::getServiceSpecificErrorCode(s); + } if (mFilter_1_1 != NULL) { return mFilter_1_1->configureIpCid(cid); @@ -126,7 +127,19 @@ Result FilterClient::configureIpFilterContextId(int cid) { } Result FilterClient::configureAvStreamType(AvStreamType avStreamType) { - // TODO: pending aidl interface + if (mTunerFilter != NULL) { + int type; + switch (avStreamType.getDiscriminator()) { + case AvStreamType::hidl_discriminator::audio: + type = (int)avStreamType.audio(); + break; + case AvStreamType::hidl_discriminator::video: + type = (int)avStreamType.video(); + break; + } + Status s = mTunerFilter->configureAvStreamType(type); + return ClientHelper::getServiceSpecificErrorCode(s); + } if (mFilter_1_1 != NULL) { return mFilter_1_1->configureAvStreamType(avStreamType); @@ -228,7 +241,10 @@ Result FilterClient::releaseAvHandle(native_handle_t* handle, uint64_t avDataId) } Result FilterClient::setDataSource(sp filterClient){ - // TODO: pending aidl interface + if (mTunerFilter != NULL) { + Status s = mTunerFilter->setDataSource(filterClient->getAidlFilter()); + return ClientHelper::getServiceSpecificErrorCode(s); + } if (mFilter != NULL) { sp sourceFilter = filterClient->getHalFilter(); @@ -891,29 +907,43 @@ void TunerFilterCallback::getHidlRestartEvent(const vector& fi } Result FilterClient::getFilterMq() { - if (mFilter == NULL) { - return Result::INVALID_STATE; - } - if (mFilterMQ != NULL) { return Result::SUCCESS; } - Result getQueueDescResult = Result::UNKNOWN_ERROR; - MQDescriptorSync filterMQDesc; - mFilter->getQueueDesc( - [&](Result r, const MQDescriptorSync& desc) { - filterMQDesc = desc; - getQueueDescResult = r; - }); - if (getQueueDescResult == Result::SUCCESS) { - mFilterMQ = std::make_unique(filterMQDesc, true); - EventFlag::createEventFlag(mFilterMQ->getEventFlagWord(), &mFilterMQEventFlag); + AidlMQDesc aidlMqDesc; + Result res = Result::UNAVAILABLE; + + if (mTunerFilter != NULL) { + Status s = mTunerFilter->getQueueDesc(&aidlMqDesc); + res = ClientHelper::getServiceSpecificErrorCode(s); + if (res == Result::SUCCESS) { + mFilterMQ = new (nothrow) AidlMQ(aidlMqDesc); + EventFlag::createEventFlag(mFilterMQ->getEventFlagWord(), &mFilterMQEventFlag); + } + return res; } - return getQueueDescResult; + + if (mFilter != NULL) { + MQDescriptorSync filterMQDesc; + mFilter->getQueueDesc( + [&](Result r, const MQDescriptorSync& desc) { + filterMQDesc = desc; + res = r; + }); + if (res == Result::SUCCESS) { + AidlMQDesc aidlMQDesc; + unsafeHidlToAidlMQDescriptor( + filterMQDesc, &aidlMQDesc); + mFilterMQ = new (nothrow) AidlMessageQueue(aidlMQDesc); + EventFlag::createEventFlag(mFilterMQ->getEventFlagWord(), &mFilterMQEventFlag); + } + } + + return res; } -int FilterClient::copyData(uint8_t* buffer, int size) { +int FilterClient::copyData(int8_t* buffer, int size) { if (mFilter == NULL || mFilterMQ == NULL || mFilterMQEventFlag == NULL) { return -1; } diff --git a/media/jni/tuner/FilterClient.h b/media/jni/tuner/FilterClient.h index 21919ac102820..bbabc282464a8 100644 --- a/media/jni/tuner/FilterClient.h +++ b/media/jni/tuner/FilterClient.h @@ -25,12 +25,14 @@ #include #include #include +#include #include #include "ClientHelper.h" #include "FilterClientCallback.h" using Status = ::ndk::ScopedAStatus; +using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite; using ::aidl::android::media::tv::tuner::BnTunerFilterCallback; using ::aidl::android::media::tv::tuner::ITunerFilter; using ::aidl::android::media::tv::tuner::TunerDemuxIpAddress; @@ -69,10 +71,13 @@ using ::android::hardware::tv::tuner::V1_1::IFilterCallback; using namespace std; -using MQ = MessageQueue; - namespace android { +using MQ = MessageQueue; +using MQDesc = MQDescriptorSync; +using AidlMQ = AidlMessageQueue; +using AidlMQDesc = MQDescriptor; + struct SharedHandleInfo { native_handle_t* sharedHandle; uint64_t size; @@ -139,7 +144,7 @@ public: * * @return the actual reading size. -1 if failed to read. */ - int read(uint8_t* buffer, int size); + int read(int8_t* buffer, int size); /** * Get the a/v shared memory handle information @@ -234,7 +239,7 @@ private: void getAidlIpAddress(DemuxIpAddress ipAddr, TunerDemuxIpAddress& srcIpAddress, TunerDemuxIpAddress& dstIpAddress); Result getFilterMq(); - int copyData(uint8_t* buffer, int size); + int copyData(int8_t* buffer, int size); void checkIsMediaFilter(DemuxFilterType type); void handleAvShareMemory(); void closeAvSharedMemory(); @@ -259,7 +264,7 @@ private: */ sp<::android::hardware::tv::tuner::V1_1::IFilter> mFilter_1_1; - unique_ptr mFilterMQ; + AidlMQ* mFilterMQ; EventFlag* mFilterMQEventFlag; sp mCallback;