diff --git a/media/java/android/media/tv/tuner/dvr/DvrRecorder.java b/media/java/android/media/tv/tuner/dvr/DvrRecorder.java index c4b622d0fba91..2f2cd964d6f34 100644 --- a/media/java/android/media/tv/tuner/dvr/DvrRecorder.java +++ b/media/java/android/media/tv/tuner/dvr/DvrRecorder.java @@ -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); diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index b63dc10122bd8..448da8658bee1 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -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 descramblerSp; - Result res; - mTuner->openDescrambler([&](Result r, const sp& descrambler) { - res = r; - descramblerSp = descrambler; - }); + sp 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 getTuner(JNIEnv *env, jobject thiz) { return (JTuner *)env->GetLongField(thiz, gFields.tunerContext); } -static sp getDescrambler(JNIEnv *env, jobject descrambler) { - return (IDescrambler *)env->GetLongField(descrambler, gFields.descramblerContext); +static sp 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 descramblerSp = getDescrambler(env, descrambler); - if (descramblerSp == NULL) { + sp descramblerClient = getDescramblerClient(env, descrambler); + if (descramblerClient == NULL) { return (jint) Result::NOT_INITIALIZED; } - // TODO: use filter client once descramblerClient is ready - sp iFilterSp = getFilterClient(env, filter)->getHalFilter(); - Result result = descramblerSp->addPid(getDemuxPid((int)pidType, (int)pid), iFilterSp); + sp 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 descramblerSp = getDescrambler(env, descrambler); - if (descramblerSp == NULL) { + sp descramblerClient = getDescramblerClient(env, descrambler); + if (descramblerClient == NULL) { return (jint) Result::NOT_INITIALIZED; } - // TODO: use filter client once descramblerClient is ready - sp iFilterSp = getFilterClient(env, filter)->getHalFilter(); - Result result = descramblerSp->removePid(getDemuxPid((int)pidType, (int)pid), iFilterSp); + sp 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 descramblerSp = getDescrambler(env, descrambler); - if (descramblerSp == NULL) { + sp descramblerClient = getDescramblerClient(env, descrambler); + if (descramblerClient == NULL) { return (jint) Result::NOT_INITIALIZED; } int size = env->GetArrayLength(keyToken); std::vector v(size); env->GetByteArrayRegion(keyToken, 0, size, reinterpret_cast(&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 descramblerSp = getDescrambler(env, descrambler); - if (descramblerSp == NULL) { + sp 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; } diff --git a/media/jni/tuner/DemuxClient.cpp b/media/jni/tuner/DemuxClient.cpp index 59dfd704179ed..58f9a46bdbeb2 100644 --- a/media/jni/tuner/DemuxClient.cpp +++ b/media/jni/tuner/DemuxClient.cpp @@ -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. diff --git a/media/jni/tuner/DemuxClient.h b/media/jni/tuner/DemuxClient.h index f11f2c6cc22b0..7b8eedeacf0e3 100644 --- a/media/jni/tuner/DemuxClient.h +++ b/media/jni/tuner/DemuxClient.h @@ -88,6 +88,9 @@ public: */ Result close(); + void setId(int id) { mId = id; } + int getId() { return mId; } + private: sp openHidlFilter(DemuxFilterType type, int bufferSize, sp cb); sp openHidlDvr(DvrType type, int bufferSize, sp cb); @@ -105,6 +108,8 @@ private: * Default null when the HAL service does not exist. */ sp mDemux; + + int mId; }; } // namespace android diff --git a/media/jni/tuner/DescramblerClient.cpp b/media/jni/tuner/DescramblerClient.cpp index f0ea418b6587a..979beeac6b3a3 100644 --- a/media/jni/tuner/DescramblerClient.cpp +++ b/media/jni/tuner/DescramblerClient.cpp @@ -42,25 +42,56 @@ void DescramblerClient::setHidlDescrambler(sp descrambler) { mDescrambler = descrambler; } -Result DescramblerClient::setDemuxSource(sp /*demuxClient*/) { - return Result::SUCCESS; +Result DescramblerClient::setDemuxSource(sp demuxClient) { + if (demuxClient == NULL) { + return Result::INVALID_ARGUMENT; + } + + // TODO: pending aidl interface + + if (mDescrambler != NULL) { + return mDescrambler->setDemuxSource(demuxClient->getId()); + } + + return Result::INVALID_STATE; } -Result DescramblerClient::setKeyToken(vector /*keyToken*/) { - return Result::SUCCESS; +Result DescramblerClient::setKeyToken(vector keyToken) { + // TODO: pending aidl interface + + if (mDescrambler != NULL) { + return mDescrambler->setKeyToken(keyToken); + } + + return Result::INVALID_STATE; } -Result DescramblerClient::addPid(DemuxPid /*pid*/, sp /*optionalSourceFilter*/) { - return Result::SUCCESS; -} +Result DescramblerClient::addPid(DemuxPid pid, sp optionalSourceFilter) { + // TODO: pending aidl interface -Result DescramblerClient::removePid(DemuxPid /*pid*/, sp /*optionalSourceFilter*/) { - return Result::SUCCESS; -} + if (mDescrambler != NULL) { + return mDescrambler->addPid(pid, optionalSourceFilter->getHalFilter()); + } + + return Result::INVALID_STATE;} + +Result DescramblerClient::removePid(DemuxPid pid, sp 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 /////////////////////// diff --git a/media/jni/tuner/TunerClient.cpp b/media/jni/tuner/TunerClient.cpp index 69cd3d332c7f6..e469aa3126471 100644 --- a/media/jni/tuner/TunerClient.cpp +++ b/media/jni/tuner/TunerClient.cpp @@ -161,9 +161,11 @@ sp TunerClient::openDemux(int /*demuxHandle*/) { if (mTuner != NULL) { // TODO: pending aidl interface sp demuxClient = new DemuxClient(); - sp hidlDemux = openHidlDemux(); + int demuxId; + sp hidlDemux = openHidlDemux(demuxId); if (hidlDemux != NULL) { demuxClient->setHidlDemux(hidlDemux); + demuxClient->setId(demuxId); return demuxClient; } } @@ -177,8 +179,24 @@ DemuxCapabilities TunerClient::getDemuxCaps() { } sp TunerClient::openDescrambler(int /*descramblerHandle*/) { - return NULL; -} + if (mTunerService != NULL) { + // TODO: handle error code + /*shared_ptr tunerDescrambler; + mTunerService->openDescrambler(demuxHandle, &tunerDescrambler); + return new DescramblerClient(tunerDescrambler);*/ + } + + if (mTuner != NULL) { + // TODO: pending aidl interface + sp descramblerClient = new DescramblerClient(); + sp hidlDescrambler = openHidlDescrambler(); + if (hidlDescrambler != NULL) { + descramblerClient->setHidlDescrambler(hidlDescrambler); + return descramblerClient; + } + } + + return NULL;} sp TunerClient::openLnb(int lnbHandle) { if (mTunerService != NULL) { @@ -272,12 +290,13 @@ Result TunerClient::getHidlFrontendInfo(int id, FrontendInfo& feInfo) { return res; } -sp TunerClient::openHidlDemux() { +sp TunerClient::openHidlDemux(int& demuxId) { sp demux; Result res; - mTuner->openDemux([&](Result result, uint32_t /*id*/, const sp& demuxSp) { + mTuner->openDemux([&](Result result, uint32_t id, const sp& demuxSp) { demux = demuxSp; + demuxId = id; res = result; }); if (res != Result::SUCCESS || demux == nullptr) { @@ -318,6 +337,22 @@ sp TunerClient::openHidlLnbByName(string name, LnbId& lnbId) { return lnb; } +sp TunerClient::openHidlDescrambler() { + sp descrambler; + Result res; + + mTuner->openDescrambler([&](Result r, const sp& descramblerSp) { + res = r; + descrambler = descramblerSp; + }); + + if (res != Result::SUCCESS || descrambler == NULL) { + return NULL; + } + + return descrambler; +} + FrontendInfo TunerClient::FrontendInfoAidlToHidl(TunerServiceFrontendInfo aidlFrontendInfo) { FrontendInfo hidlFrontendInfo { .type = static_cast(aidlFrontendInfo.type), diff --git a/media/jni/tuner/TunerClient.h b/media/jni/tuner/TunerClient.h index 06ba7a552cfbd..036360f213525 100644 --- a/media/jni/tuner/TunerClient.h +++ b/media/jni/tuner/TunerClient.h @@ -131,10 +131,11 @@ public: private: sp getHidlTuner(); sp openHidlFrontendById(int id); - sp openHidlDemux(); + sp openHidlDemux(int& demuxId); Result getHidlFrontendInfo(int id, FrontendInfo& info); sp openHidlLnbById(int id); sp openHidlLnbByName(string name, LnbId& lnbId); + sp openHidlDescrambler(); FrontendInfo FrontendInfoAidlToHidl(TunerServiceFrontendInfo aidlFrontendInfo); int getResourceIdFromHandle(int handle, int resourceType);