Merge "Refactor Tuner JNI and move the interaction with IDescrambler into DescramblerClient"
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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 ///////////////////////
|
||||
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user