diff options
-rw-r--r-- | media/jni/android_media_tv_Tuner.cpp | 2 | ||||
-rw-r--r-- | media/jni/tuner/FilterClient.cpp | 45 | ||||
-rw-r--r-- | 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<uint64_t>(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 |