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

Commit c6200938 authored by Amy Zhang's avatar Amy Zhang Committed by Android (Google) Code Review
Browse files

Merge "Refactor Tuner JNI and move the interaction with IDescrambler into DescramblerClient"

parents b81bacba 921fd433
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
@@ -1750,21 +1750,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 =
@@ -1772,8 +1768,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;
}
@@ -2573,8 +2569,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) {
@@ -4100,49 +4096,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