Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 168a40a6 authored by Amy Zhang's avatar Amy Zhang
Browse files

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
parent 15565a13
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -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(
+40 −5
Original line number Diff line number Diff line
@@ -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());
+2 −0
Original line number Diff line number Diff line
@@ -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