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

Commit 7648a3c0 authored by shubang's avatar shubang
Browse files

Add a cpp filter wraper

So we can store the FMQ for each filter instance.
Otherwise, we may need to get MQDesc from HAL for each MQ operation,
or store a filter to FMQ map.

Test: make; cuttlefish;
Change-Id: I1a9d94df518bd132eb832f20e9ce9cff15841d60
parent 75c87085
Loading
Loading
Loading
Loading
+23 −14
Original line number Original line Diff line number Diff line
@@ -115,6 +115,14 @@ void FilterCallback::setFilter(const jobject filter) {
    mFilter = env->NewWeakGlobalRef(filter);
    mFilter = env->NewWeakGlobalRef(filter);
}
}


/////////////// Filter ///////////////////////

Filter::Filter(sp<IFilter> sp, jweak obj) : mFilterSp(sp), mFilterObj(obj) {}

sp<IFilter> Filter::getIFilter() {
    return mFilterSp;
}

/////////////// FrontendCallback ///////////////////////
/////////////// FrontendCallback ///////////////////////


FrontendCallback::FrontendCallback(jweak tunerObj, FrontendId id) : mObject(tunerObj), mId(id) {}
FrontendCallback::FrontendCallback(jweak tunerObj, FrontendId id) : mObject(tunerObj), mId(id) {}
@@ -330,18 +338,18 @@ jobject JTuner::openFilter(DemuxFilterType type, int bufferSize) {
        }
        }
    }
    }


    sp<IFilter> filterSp;
    sp<IFilter> iFilterSp;
    sp<FilterCallback> callback = new FilterCallback();
    sp<FilterCallback> callback = new FilterCallback();
    mDemux->openFilter(type, bufferSize, callback,
    mDemux->openFilter(type, bufferSize, callback,
            [&](Result, const sp<IFilter>& filter) {
            [&](Result, const sp<IFilter>& filter) {
                filterSp = filter;
                iFilterSp = filter;
            });
            });
    if (filterSp == NULL) {
    if (iFilterSp == NULL) {
        ALOGD("Failed to open filter, type = %d", type.mainType);
        ALOGD("Failed to open filter, type = %d", type.mainType);
        return NULL;
        return NULL;
    }
    }
    int fId;
    int fId;
    filterSp->getId([&](Result, uint32_t filterId) {
    iFilterSp->getId([&](Result, uint32_t filterId) {
        fId = filterId;
        fId = filterId;
    });
    });


@@ -353,6 +361,7 @@ jobject JTuner::openFilter(DemuxFilterType type, int bufferSize) {
                    mObject,
                    mObject,
                    (jint) fId);
                    (jint) fId);


    sp<Filter> filterSp = new Filter(iFilterSp, filterObj);
    filterSp->incStrong(filterObj);
    filterSp->incStrong(filterObj);
    env->SetLongField(filterObj, gFields.filterContext, (jlong)filterSp.get());
    env->SetLongField(filterObj, gFields.filterContext, (jlong)filterSp.get());


@@ -458,8 +467,8 @@ static FrontendSettings getFrontendSettings(JNIEnv *env, int type, jobject setti
    return frontendSettings;
    return frontendSettings;
}
}


static sp<IFilter> getFilter(JNIEnv *env, jobject filter) {
static sp<Filter> getFilter(JNIEnv *env, jobject filter) {
    return (IFilter *)env->GetLongField(filter, gFields.filterContext);
    return (Filter *)env->GetLongField(filter, gFields.filterContext);
}
}


static sp<IDvr> getDvr(JNIEnv *env, jobject dvr) {
static sp<IDvr> getDvr(JNIEnv *env, jobject dvr) {
@@ -585,7 +594,7 @@ static DemuxFilterSettings getFilterSettings(
static int android_media_tv_Tuner_configure_filter(
static int android_media_tv_Tuner_configure_filter(
        JNIEnv *env, jobject filter, int type, int subtype, jobject settings) {
        JNIEnv *env, jobject filter, int type, int subtype, jobject settings) {
    ALOGD("configure filter type=%d, subtype=%d", type, subtype);
    ALOGD("configure filter type=%d, subtype=%d", type, subtype);
    sp<IFilter> filterSp = getFilter(env, filter);
    sp<IFilter> filterSp = getFilter(env, filter)->getIFilter();
    if (filterSp == NULL) {
    if (filterSp == NULL) {
        ALOGD("Failed to configure filter: filter not found");
        ALOGD("Failed to configure filter: filter not found");
        return (int)Result::INVALID_STATE;
        return (int)Result::INVALID_STATE;
@@ -596,7 +605,7 @@ static int android_media_tv_Tuner_configure_filter(
}
}


static bool android_media_tv_Tuner_start_filter(JNIEnv *env, jobject filter) {
static bool android_media_tv_Tuner_start_filter(JNIEnv *env, jobject filter) {
    sp<IFilter> filterSp = getFilter(env, filter);
    sp<IFilter> filterSp = getFilter(env, filter)->getIFilter();
    if (filterSp == NULL) {
    if (filterSp == NULL) {
        ALOGD("Failed to start filter: filter not found");
        ALOGD("Failed to start filter: filter not found");
        return false;
        return false;
@@ -605,7 +614,7 @@ static bool android_media_tv_Tuner_start_filter(JNIEnv *env, jobject filter) {
}
}


static bool android_media_tv_Tuner_stop_filter(JNIEnv *env, jobject filter) {
static bool android_media_tv_Tuner_stop_filter(JNIEnv *env, jobject filter) {
    sp<IFilter> filterSp = getFilter(env, filter);
    sp<IFilter> filterSp = getFilter(env, filter)->getIFilter();
    if (filterSp == NULL) {
    if (filterSp == NULL) {
        ALOGD("Failed to stop filter: filter not found");
        ALOGD("Failed to stop filter: filter not found");
        return false;
        return false;
@@ -614,7 +623,7 @@ static bool android_media_tv_Tuner_stop_filter(JNIEnv *env, jobject filter) {
}
}


static bool android_media_tv_Tuner_flush_filter(JNIEnv *env, jobject filter) {
static bool android_media_tv_Tuner_flush_filter(JNIEnv *env, jobject filter) {
    sp<IFilter> filterSp = getFilter(env, filter);
    sp<IFilter> filterSp = getFilter(env, filter)->getIFilter();
    if (filterSp == NULL) {
    if (filterSp == NULL) {
        ALOGD("Failed to flush filter: filter not found");
        ALOGD("Failed to flush filter: filter not found");
        return false;
        return false;
@@ -633,7 +642,7 @@ static bool android_media_tv_Tuner_add_pid(
    if (descramblerSp == NULL) {
    if (descramblerSp == NULL) {
        return false;
        return false;
    }
    }
    sp<IFilter> filterSp = getFilter(env, filter);
    sp<IFilter> filterSp = getFilter(env, filter)->getIFilter();
    Result result = descramblerSp->addPid(getDemuxPid((int)pidType, (int)pid), filterSp);
    Result result = descramblerSp->addPid(getDemuxPid((int)pidType, (int)pid), filterSp);
    return result == Result::SUCCESS;
    return result == Result::SUCCESS;
}
}
@@ -644,7 +653,7 @@ static bool android_media_tv_Tuner_remove_pid(
    if (descramblerSp == NULL) {
    if (descramblerSp == NULL) {
        return false;
        return false;
    }
    }
    sp<IFilter> filterSp = getFilter(env, filter);
    sp<IFilter> filterSp = getFilter(env, filter)->getIFilter();
    Result result = descramblerSp->removePid(getDemuxPid((int)pidType, (int)pid), filterSp);
    Result result = descramblerSp->removePid(getDemuxPid((int)pidType, (int)pid), filterSp);
    return result == Result::SUCCESS;
    return result == Result::SUCCESS;
}
}
@@ -656,7 +665,7 @@ static jobject android_media_tv_Tuner_open_dvr(JNIEnv *env, jobject thiz, jint t


static bool android_media_tv_Tuner_attach_filter(JNIEnv *env, jobject dvr, jobject filter) {
static bool android_media_tv_Tuner_attach_filter(JNIEnv *env, jobject dvr, jobject filter) {
    sp<IDvr> dvrSp = getDvr(env, dvr);
    sp<IDvr> dvrSp = getDvr(env, dvr);
    sp<IFilter> filterSp = getFilter(env, filter);
    sp<IFilter> filterSp = getFilter(env, filter)->getIFilter();
    if (dvrSp == NULL || filterSp == NULL) {
    if (dvrSp == NULL || filterSp == NULL) {
        return false;
        return false;
    }
    }
@@ -666,7 +675,7 @@ static bool android_media_tv_Tuner_attach_filter(JNIEnv *env, jobject dvr, jobje


static bool android_media_tv_Tuner_detach_filter(JNIEnv *env, jobject dvr, jobject filter) {
static bool android_media_tv_Tuner_detach_filter(JNIEnv *env, jobject dvr, jobject filter) {
    sp<IDvr> dvrSp = getDvr(env, dvr);
    sp<IDvr> dvrSp = getDvr(env, dvr);
    sp<IFilter> filterSp = getFilter(env, filter);
    sp<IFilter> filterSp = getFilter(env, filter)->getIFilter();
    if (dvrSp == NULL || filterSp == NULL) {
    if (dvrSp == NULL || filterSp == NULL) {
        return false;
        return false;
    }
    }
+7 −0
Original line number Original line Diff line number Diff line
@@ -91,6 +91,13 @@ struct FrontendCallback : public IFrontendCallback {
    FrontendId mId;
    FrontendId mId;
};
};


struct Filter : public RefBase {
    Filter(sp<IFilter> sp, jweak obj);
    sp<IFilter> getIFilter();
    sp<IFilter> mFilterSp;
    jweak mFilterObj;
};

struct JTuner : public RefBase {
struct JTuner : public RefBase {
    JTuner(JNIEnv *env, jobject thiz);
    JTuner(JNIEnv *env, jobject thiz);
    sp<ITuner> getTunerService();
    sp<ITuner> getTunerService();