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
diff --git a/media/java/android/media/tv/tuner/dvr/DvrRecorder.java b/media/java/android/media/tv/tuner/dvr/DvrRecorder.java
index c4b622d..2f2cd96 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 @@
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 5a18a4c..3825133 100644
--- a/media/jni/android_media_tv_Tuner.cpp
+++ b/media/jni/android_media_tv_Tuner.cpp
@@ -1747,21 +1747,17 @@
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 @@
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 @@
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 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;
}
diff --git a/media/jni/tuner/DemuxClient.cpp b/media/jni/tuner/DemuxClient.cpp
index 59dfd70..58f9a46 100644
--- a/media/jni/tuner/DemuxClient.cpp
+++ b/media/jni/tuner/DemuxClient.cpp
@@ -32,11 +32,13 @@
// 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 f11f2c6..7b8eede 100644
--- a/media/jni/tuner/DemuxClient.h
+++ b/media/jni/tuner/DemuxClient.h
@@ -88,6 +88,9 @@
*/
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 @@
* Default null when the HAL service does not exist.
*/
sp<IDemux> mDemux;
+
+ int mId;
};
} // namespace android
diff --git a/media/jni/tuner/DescramblerClient.cpp b/media/jni/tuner/DescramblerClient.cpp
index f0ea418b..979beea 100644
--- a/media/jni/tuner/DescramblerClient.cpp
+++ b/media/jni/tuner/DescramblerClient.cpp
@@ -42,25 +42,56 @@
mDescrambler = descrambler;
}
-Result DescramblerClient::setDemuxSource(sp<DemuxClient> /*demuxClient*/) {
- return Result::SUCCESS;
+Result DescramblerClient::setDemuxSource(sp<DemuxClient> 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<uint8_t> /*keyToken*/) {
- return Result::SUCCESS;
+Result DescramblerClient::setKeyToken(vector<uint8_t> keyToken) {
+ // TODO: pending aidl interface
+
+ if (mDescrambler != NULL) {
+ return mDescrambler->setKeyToken(keyToken);
+ }
+
+ return Result::INVALID_STATE;
}
-Result DescramblerClient::addPid(DemuxPid /*pid*/, sp<FilterClient> /*optionalSourceFilter*/) {
- return Result::SUCCESS;
-}
+Result DescramblerClient::addPid(DemuxPid pid, sp<FilterClient> optionalSourceFilter) {
+ // TODO: pending aidl interface
-Result DescramblerClient::removePid(DemuxPid /*pid*/, sp<FilterClient> /*optionalSourceFilter*/) {
- return Result::SUCCESS;
-}
+ 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 ///////////////////////
diff --git a/media/jni/tuner/TunerClient.cpp b/media/jni/tuner/TunerClient.cpp
index 69cd3d3..e469aa3 100644
--- a/media/jni/tuner/TunerClient.cpp
+++ b/media/jni/tuner/TunerClient.cpp
@@ -161,9 +161,11 @@
if (mTuner != NULL) {
// TODO: pending aidl interface
sp<DemuxClient> demuxClient = new DemuxClient();
- sp<IDemux> hidlDemux = openHidlDemux();
+ int demuxId;
+ sp<IDemux> hidlDemux = openHidlDemux(demuxId);
if (hidlDemux != NULL) {
demuxClient->setHidlDemux(hidlDemux);
+ demuxClient->setId(demuxId);
return demuxClient;
}
}
@@ -177,8 +179,24 @@
}
sp<DescramblerClient> TunerClient::openDescrambler(int /*descramblerHandle*/) {
- return NULL;
-}
+ if (mTunerService != NULL) {
+ // TODO: handle error code
+ /*shared_ptr<ITunerDescrambler> tunerDescrambler;
+ mTunerService->openDescrambler(demuxHandle, &tunerDescrambler);
+ return new DescramblerClient(tunerDescrambler);*/
+ }
+
+ if (mTuner != NULL) {
+ // TODO: pending aidl interface
+ sp<DescramblerClient> descramblerClient = new DescramblerClient();
+ sp<IDescrambler> hidlDescrambler = openHidlDescrambler();
+ if (hidlDescrambler != NULL) {
+ descramblerClient->setHidlDescrambler(hidlDescrambler);
+ return descramblerClient;
+ }
+ }
+
+ return NULL;}
sp<LnbClient> TunerClient::openLnb(int lnbHandle) {
if (mTunerService != NULL) {
@@ -272,12 +290,13 @@
return res;
}
-sp<IDemux> TunerClient::openHidlDemux() {
+sp<IDemux> TunerClient::openHidlDemux(int& demuxId) {
sp<IDemux> demux;
Result res;
- mTuner->openDemux([&](Result result, uint32_t /*id*/, const sp<IDemux>& demuxSp) {
+ mTuner->openDemux([&](Result result, uint32_t id, const sp<IDemux>& demuxSp) {
demux = demuxSp;
+ demuxId = id;
res = result;
});
if (res != Result::SUCCESS || demux == nullptr) {
@@ -318,6 +337,22 @@
return lnb;
}
+sp<IDescrambler> TunerClient::openHidlDescrambler() {
+ sp<IDescrambler> descrambler;
+ Result res;
+
+ mTuner->openDescrambler([&](Result r, const sp<IDescrambler>& 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<FrontendType>(aidlFrontendInfo.type),
diff --git a/media/jni/tuner/TunerClient.h b/media/jni/tuner/TunerClient.h
index 06ba7a5..036360f 100644
--- a/media/jni/tuner/TunerClient.h
+++ b/media/jni/tuner/TunerClient.h
@@ -131,10 +131,11 @@
private:
sp<ITuner> getHidlTuner();
sp<IFrontend> openHidlFrontendById(int id);
- sp<IDemux> openHidlDemux();
+ sp<IDemux> openHidlDemux(int& demuxId);
Result getHidlFrontendInfo(int id, FrontendInfo& info);
sp<ILnb> openHidlLnbById(int id);
sp<ILnb> openHidlLnbByName(string name, LnbId& lnbId);
+ sp<IDescrambler> openHidlDescrambler();
FrontendInfo FrontendInfoAidlToHidl(TunerServiceFrontendInfo aidlFrontendInfo);
int getResourceIdFromHandle(int handle, int resourceType);