summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmy Zhang <amyjojo@google.com>2021-04-29 12:04:34 -0700
committerAmy Zhang <amyjojo@google.com>2021-04-29 13:25:23 -0700
commit168a40a6a75e532ea98c9580c712975e5624f70c (patch)
tree84cc0f631dfb5a5f8bea0a4e62f9086321b0f33a
parent15565a139c2dc1f9fdfb37d53392254af5e61669 (diff)
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
-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