From 168a40a6a75e532ea98c9580c712975e5624f70c Mon Sep 17 00:00:00 2001 From: Amy Zhang Date: Thu, 29 Apr 2021 12:04:34 -0700 Subject: [PATCH] Get media share memory handle only when the filter is not a passthrough media filter Previously we get the share memory handle on filter opening, which only has the information on filter types. Now we move the share memory handle to the filter config API call so that only the non-passthrough filter will get the share memory handle. Test: sample tis on cuttlefish Bug: 185627837 Change-Id: I33fd4950ec12291f6ca31a36b081d66643d5c319 --- media/jni/android_media_tv_Tuner.cpp | 2 -- media/jni/tuner/FilterClient.cpp | 45 ++++++++++++++++++++++++---- media/jni/tuner/FilterClient.h | 2 ++ 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index 4bdbe362a615..657c9eff1034 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -1737,8 +1737,6 @@ jobject JTuner::openFilter(DemuxFilterType type, int bufferSize) { fId = static_cast(id); } - filterClient->getAvSharedHandleInfo(); - JNIEnv *env = AndroidRuntime::getJNIEnv(); jobject filterObj = env->NewObject( diff --git a/media/jni/tuner/FilterClient.cpp b/media/jni/tuner/FilterClient.cpp index dc1d8b705d8f..324c09a94b63 100644 --- a/media/jni/tuner/FilterClient.cpp +++ b/media/jni/tuner/FilterClient.cpp @@ -63,6 +63,7 @@ FilterClient::~FilterClient() { mAvSharedHandle = NULL; mAvSharedMemSize = 0; mIsMediaFilter = false; + mIsPassthroughFilter = false; mFilterMQ = NULL; mFilterMQEventFlag = NULL; } @@ -84,7 +85,7 @@ int FilterClient::read(int8_t* buffer, int size) { SharedHandleInfo FilterClient::getAvSharedHandleInfo() { handleAvShareMemory(); SharedHandleInfo info{ - .sharedHandle = mIsMediaFilter ? mAvSharedHandle : NULL, + .sharedHandle = (mIsMediaFilter && !mIsPassthroughFilter) ? mAvSharedHandle : NULL, .size = mAvSharedMemSize, }; @@ -92,13 +93,24 @@ SharedHandleInfo FilterClient::getAvSharedHandleInfo() { } Result FilterClient::configure(DemuxFilterSettings configure) { + Result res; + checkIsPassthroughFilter(configure); + if (mTunerFilter != NULL) { Status s = mTunerFilter->configure(getAidlFilterSettings(configure)); - return ClientHelper::getServiceSpecificErrorCode(s); + res = ClientHelper::getServiceSpecificErrorCode(s); + if (res == Result::SUCCESS) { + getAvSharedHandleInfo(); + } + return res; } if (mFilter != NULL) { - return mFilter->configure(configure); + res = mFilter->configure(configure); + if (res == Result::SUCCESS) { + getAvSharedHandleInfo(); + } + return res; } return Result::INVALID_STATE; @@ -983,11 +995,34 @@ void FilterClient::checkIsMediaFilter(DemuxFilterType type) { mIsMediaFilter = false; } +void FilterClient::checkIsPassthroughFilter(DemuxFilterSettings configure) { + if (!mIsMediaFilter) { + mIsPassthroughFilter = false; + return; + } + + if (configure.getDiscriminator() == DemuxFilterSettings::hidl_discriminator::ts) { + if (configure.ts().filterSettings.av().isPassthrough) { + mIsPassthroughFilter = true; + return; + } + } + + if (configure.getDiscriminator() == DemuxFilterSettings::hidl_discriminator::mmtp) { + if (configure.mmtp().filterSettings.av().isPassthrough) { + mIsPassthroughFilter = true; + return; + } + } + + mIsPassthroughFilter = false; +} + void FilterClient::handleAvShareMemory() { if (mAvSharedHandle != NULL) { return; } - if (mTunerFilter != NULL && mIsMediaFilter) { + if (mTunerFilter != NULL && mIsMediaFilter && !mIsPassthroughFilter) { TunerFilterSharedHandleInfo aidlHandleInfo; Status s = mTunerFilter->getAvSharedHandleInfo(&aidlHandleInfo); if (ClientHelper::getServiceSpecificErrorCode(s) == Result::SUCCESS) { @@ -997,7 +1032,7 @@ void FilterClient::handleAvShareMemory() { return; } - if (mFilter_1_1 != NULL && mIsMediaFilter) { + if (mFilter_1_1 != NULL && mIsMediaFilter && !mIsPassthroughFilter) { mFilter_1_1->getAvSharedHandle([&](Result r, hidl_handle avMemory, uint64_t avMemSize) { if (r == Result::SUCCESS) { mAvSharedHandle = native_handle_clone(avMemory.getNativeHandle()); diff --git a/media/jni/tuner/FilterClient.h b/media/jni/tuner/FilterClient.h index d03274941690..5d78bfdb2349 100644 --- a/media/jni/tuner/FilterClient.h +++ b/media/jni/tuner/FilterClient.h @@ -241,6 +241,7 @@ private: Result getFilterMq(); int copyData(int8_t* buffer, int size); void checkIsMediaFilter(DemuxFilterType type); + void checkIsPassthroughFilter(DemuxFilterSettings configure); void handleAvShareMemory(); void closeAvSharedMemory(); @@ -270,6 +271,7 @@ private: native_handle_t* mAvSharedHandle; uint64_t mAvSharedMemSize; bool mIsMediaFilter; + bool mIsPassthroughFilter; }; } // namespace android