Merge "Get media share memory handle only when the filter is not a passthrough media filter" into sc-dev

This commit is contained in:
Amy Zhang 2021-04-30 00:02:05 +00:00 committed by Android (Google) Code Review
commit 75d890a7f3
3 changed files with 42 additions and 7 deletions

View File

@ -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(

View File

@ -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());

View File

@ -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