summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--media/jni/android_media_tv_Tuner.cpp2
-rw-r--r--media/jni/tuner/FilterClient.cpp45
-rw-r--r--media/jni/tuner/FilterClient.h2
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