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

This commit is contained in:
Amy Zhang
2021-01-13 00:24:22 +00:00
committed by Android (Google) Code Review
7 changed files with 117 additions and 49 deletions

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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.

View File

@@ -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

View File

@@ -42,25 +42,56 @@ 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;
}
// 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 ///////////////////////

View File

@@ -161,9 +161,11 @@ sp<DemuxClient> TunerClient::openDemux(int /*demuxHandle*/) {
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 @@ DemuxCapabilities TunerClient::getDemuxCaps() {
}
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 @@ Result TunerClient::getHidlFrontendInfo(int id, FrontendInfo& feInfo) {
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 @@ sp<ILnb> TunerClient::openHidlLnbByName(string name, LnbId& lnbId) {
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),

View File

@@ -131,10 +131,11 @@ public:
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);