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

Commit 921fd433 authored by Amy Zhang's avatar Amy Zhang
Browse files

Refactor Tuner JNI and move the interaction with IDescrambler into DescramblerClient

Test: atest android.media.tv.tuner.cts on Cuttlefish
Bug: 174095851
Change-Id: Ie6c465324bbec71b080f9fdead003f3c56d79010
parent d3d57b45
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@ public class DvrRecorder implements AutoCloseable {
    private static int sInstantId = 0;
    private int mSegmentId = 0;
    private int mOverflow;
    private Boolean mIsStopped = null;
    private Boolean mIsStopped = true;

    private native int nativeAttachFilter(Filter filter);
    private native int nativeDetachFilter(Filter filter);
+24 −30
Original line number Diff line number Diff line
@@ -1747,21 +1747,17 @@ int JTuner::unlinkCiCam(int id) {

jobject JTuner::openDescrambler() {
    ALOGD("JTuner::openDescrambler");
    if (mTuner == nullptr || mDemux == nullptr) {
    if (mTunerClient == nullptr || mDemuxClient == nullptr) {
        return NULL;
    }
    sp<IDescrambler> descramblerSp;
    Result res;
    mTuner->openDescrambler([&](Result r, const sp<IDescrambler>& descrambler) {
        res = r;
        descramblerSp = descrambler;
    });
    sp<DescramblerClient> descramblerClient = mTunerClient->openDescrambler(0/*unused*/);

    if (res != Result::SUCCESS || descramblerSp == NULL) {
    if (descramblerClient == NULL) {
        ALOGD("Failed to open descrambler");
        return NULL;
    }

    descramblerSp->setDemuxSource(mDemuxId);
    descramblerClient->setDemuxSource(mDemuxClient);

    JNIEnv *env = AndroidRuntime::getJNIEnv();
    jobject descramblerObj =
@@ -1769,8 +1765,8 @@ jobject JTuner::openDescrambler() {
                    env->FindClass("android/media/tv/tuner/Descrambler"),
                    gFields.descramblerInitID);

    descramblerSp->incStrong(descramblerObj);
    env->SetLongField(descramblerObj, gFields.descramblerContext, (jlong)descramblerSp.get());
    descramblerClient->incStrong(descramblerObj);
    env->SetLongField(descramblerObj, gFields.descramblerContext, (jlong)descramblerClient.get());

    return descramblerObj;
}
@@ -2570,8 +2566,8 @@ static sp<JTuner> getTuner(JNIEnv *env, jobject thiz) {
    return (JTuner *)env->GetLongField(thiz, gFields.tunerContext);
}

static sp<IDescrambler> getDescrambler(JNIEnv *env, jobject descrambler) {
    return (IDescrambler *)env->GetLongField(descrambler, gFields.descramblerContext);
static sp<DescramblerClient> getDescramblerClient(JNIEnv *env, jobject descrambler) {
    return (DescramblerClient *)env->GetLongField(descrambler, gFields.descramblerContext);
}

static uint32_t getResourceIdFromHandle(jint handle) {
@@ -4097,49 +4093,47 @@ static jobject android_media_tv_Tuner_open_descrambler(JNIEnv *env, jobject thiz

static jint android_media_tv_Tuner_descrambler_add_pid(
        JNIEnv *env, jobject descrambler, jint pidType, jint pid, jobject filter) {
    sp<IDescrambler> descramblerSp = getDescrambler(env, descrambler);
    if (descramblerSp == NULL) {
    sp<DescramblerClient> descramblerClient = getDescramblerClient(env, descrambler);
    if (descramblerClient == NULL) {
        return (jint) Result::NOT_INITIALIZED;
    }
    // TODO: use filter client once descramblerClient is ready
    sp<IFilter> iFilterSp = getFilterClient(env, filter)->getHalFilter();
    Result result = descramblerSp->addPid(getDemuxPid((int)pidType, (int)pid), iFilterSp);
    sp<FilterClient> filterClient = getFilterClient(env, filter);
    Result result = descramblerClient->addPid(getDemuxPid((int)pidType, (int)pid), filterClient);
    return (jint) result;
}

static jint android_media_tv_Tuner_descrambler_remove_pid(
        JNIEnv *env, jobject descrambler, jint pidType, jint pid, jobject filter) {
    sp<IDescrambler> descramblerSp = getDescrambler(env, descrambler);
    if (descramblerSp == NULL) {
    sp<DescramblerClient> descramblerClient = getDescramblerClient(env, descrambler);
    if (descramblerClient == NULL) {
        return (jint) Result::NOT_INITIALIZED;
    }
    // TODO: use filter client once descramblerClient is ready
    sp<IFilter> iFilterSp = getFilterClient(env, filter)->getHalFilter();
    Result result = descramblerSp->removePid(getDemuxPid((int)pidType, (int)pid), iFilterSp);
    sp<FilterClient> filterClient = getFilterClient(env, filter);
    Result result = descramblerClient->removePid(getDemuxPid((int)pidType, (int)pid), filterClient);
    return (jint) result;
}

static jint android_media_tv_Tuner_descrambler_set_key_token(
        JNIEnv* env, jobject descrambler, jbyteArray keyToken) {
    sp<IDescrambler> descramblerSp = getDescrambler(env, descrambler);
    if (descramblerSp == NULL) {
    sp<DescramblerClient> descramblerClient = getDescramblerClient(env, descrambler);
    if (descramblerClient == NULL) {
        return (jint) Result::NOT_INITIALIZED;
    }
    int size = env->GetArrayLength(keyToken);
    std::vector<uint8_t> v(size);
    env->GetByteArrayRegion(keyToken, 0, size, reinterpret_cast<jbyte*>(&v[0]));
    Result result = descramblerSp->setKeyToken(v);
    Result result = descramblerClient->setKeyToken(v);
    return (jint) result;
}

static jint android_media_tv_Tuner_close_descrambler(JNIEnv* env, jobject descrambler) {
    sp<IDescrambler> descramblerSp = getDescrambler(env, descrambler);
    if (descramblerSp == NULL) {
    sp<DescramblerClient> descramblerClient = getDescramblerClient(env, descrambler);
    if (descramblerClient == NULL) {
        return (jint) Result::NOT_INITIALIZED;
    }
    Result r = descramblerSp->close();
    Result r = descramblerClient->close();
    if (r == Result::SUCCESS) {
        descramblerSp->decStrong(descrambler);
        descramblerClient->decStrong(descrambler);
    }
    return (jint) r;
}
+2 −0
Original line number Diff line number Diff line
@@ -32,11 +32,13 @@ namespace android {
// TODO: pending aidl interface
DemuxClient::DemuxClient() {
    //mTunerDemux = tunerDemux;
    mId = -1;
}

DemuxClient::~DemuxClient() {
    //mTunerDemux = NULL;
    mDemux = NULL;
    mId = -1;
}

// TODO: remove after migration to Tuner Service is done.
+5 −0
Original line number Diff line number Diff line
@@ -88,6 +88,9 @@ public:
     */
    Result close();

    void setId(int id) { mId = id; }
    int getId() { return mId; }

private:
    sp<IFilter> openHidlFilter(DemuxFilterType type, int bufferSize, sp<HidlFilterCallback> cb);
    sp<IDvr> openHidlDvr(DvrType type, int bufferSize, sp<HidlDvrCallback> cb);
@@ -105,6 +108,8 @@ private:
     * Default null when the HAL service does not exist.
     */
    sp<IDemux> mDemux;

    int mId;
};
}  // namespace android

+43 −12
Original line number Diff line number Diff line
@@ -42,26 +42,57 @@ void DescramblerClient::setHidlDescrambler(sp<IDescrambler> descrambler) {
    mDescrambler = descrambler;
}

Result DescramblerClient::setDemuxSource(sp<DemuxClient> /*demuxClient*/) {
    return Result::SUCCESS;
Result DescramblerClient::setDemuxSource(sp<DemuxClient> demuxClient) {
    if (demuxClient == NULL) {
        return Result::INVALID_ARGUMENT;
    }

Result DescramblerClient::setKeyToken(vector<uint8_t> /*keyToken*/) {
    return Result::SUCCESS;
    // TODO: pending aidl interface

    if (mDescrambler != NULL) {
        return mDescrambler->setDemuxSource(demuxClient->getId());
    }

    return Result::INVALID_STATE;
}

Result DescramblerClient::setKeyToken(vector<uint8_t> keyToken) {
    // TODO: pending aidl interface

    if (mDescrambler != NULL) {
        return mDescrambler->setKeyToken(keyToken);
    }

Result DescramblerClient::addPid(DemuxPid /*pid*/, sp<FilterClient> /*optionalSourceFilter*/) {
    return Result::SUCCESS;
    return Result::INVALID_STATE;
}

Result DescramblerClient::removePid(DemuxPid /*pid*/, sp<FilterClient> /*optionalSourceFilter*/) {
    return Result::SUCCESS;
Result DescramblerClient::addPid(DemuxPid pid, sp<FilterClient> optionalSourceFilter) {
    // TODO: pending aidl interface

    if (mDescrambler != NULL) {
        return mDescrambler->addPid(pid, optionalSourceFilter->getHalFilter());
    }

    return Result::INVALID_STATE;}

Result DescramblerClient::removePid(DemuxPid pid, sp<FilterClient> optionalSourceFilter) {
    // TODO: pending aidl interface

    if (mDescrambler != NULL) {
        return mDescrambler->addPid(pid, optionalSourceFilter->getHalFilter());
    }

    return Result::INVALID_STATE;}

Result DescramblerClient::close() {
    return Result::SUCCESS;
    // TODO: pending aidl interface

    if (mDescrambler != NULL) {
        return mDescrambler->close();
    }

    return Result::INVALID_STATE;}

/////////////// DescramblerClient Helper Methods ///////////////////////

}  // namespace android
Loading