From d08c2736178b043508536d0f38bfa8de2b987d30 Mon Sep 17 00:00:00 2001 From: Amy Zhang Date: Fri, 8 Jan 2021 17:22:59 -0800 Subject: [PATCH] Fully remove Frontend HAL from Tuner JNI and use Frontend Client instead Test: atest android.media.tv.tuner.cts on Cuttlefish Bug: 174095851 Change-Id: Ia011e776035827ca4dcf2ae9f4728513e5cf5a0a --- media/jni/android_media_tv_Tuner.cpp | 144 +++++---------------------- media/jni/android_media_tv_Tuner.h | 10 +- media/jni/tuner/FrontendClient.cpp | 144 +++++++++++++++++++++++++++ media/jni/tuner/FrontendClient.h | 44 ++++++++ 4 files changed, 212 insertions(+), 130 deletions(-) diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index 3825133f758ca..b91d34735e192 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -859,8 +859,7 @@ sp TimeFilter::getITimeFilter() { /////////////// FrontendClientCallbackImpl /////////////////////// -FrontendClientCallbackImpl::FrontendClientCallbackImpl( - jweak tunerObj, FrontendId id) : mObject(tunerObj), mId(id) {} +FrontendClientCallbackImpl::FrontendClientCallbackImpl(jweak tunerObj) : mObject(tunerObj) {} void FrontendClientCallbackImpl::onEvent(FrontendEventType frontendEventType) { ALOGD("FrontendClientCallbackImpl::onEvent, type=%d", frontendEventType); @@ -1123,8 +1122,8 @@ JTuner::JTuner(JNIEnv *env, jobject thiz) } JTuner::~JTuner() { - if (mFe != NULL) { - mFe->close(); + if (mFeClient != NULL) { + mFeClient->close(); } if (mDemux != NULL) { mDemux->close(); @@ -1134,7 +1133,6 @@ JTuner::~JTuner() { env->DeleteWeakGlobalRef(mObject); env->DeleteGlobalRef(mClass); mTuner = NULL; - mFe = NULL; mDemux = NULL; mTunerClient = NULL; mFeClient = NULL; @@ -1189,27 +1187,6 @@ jobject JTuner::getFrontendIds() { } jobject JTuner::openFrontendByHandle(int feHandle) { - sp fe; - Result res; - uint32_t id = getResourceIdFromHandle(feHandle); - - mTuner->openFrontendById(id, [&](Result r, const sp& frontend) { - fe = frontend; - res = r; - }); - if (res != Result::SUCCESS || fe == nullptr) { - ALOGE("Failed to open frontend"); - return NULL; - } - mFe = fe; - mFe_1_1 = ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFe); - mFeId = id; - if (mDemux != NULL) { - mDemux->setFrontendDataSource(mFeId); - } - - jint jId = (jint) id; - // TODO: Handle reopening frontend with different handle sp feClient = mTunerClient->openFrontend(feHandle); if (feClient == NULL) { @@ -1219,11 +1196,10 @@ jobject JTuner::openFrontendByHandle(int feHandle) { mFeClient = feClient; mFeId = mFeClient->getId(); - jId = (jint) id; if (mDemuxClient != NULL) { mDemuxClient->setFrontendDataSource(mFeClient); } - sp feClientCb = new FrontendClientCallbackImpl(mObject, id); + sp feClientCb = new FrontendClientCallbackImpl(mObject); mFeClient->setCallback(feClientCb); JNIEnv *env = AndroidRuntime::getJNIEnv(); @@ -1232,7 +1208,7 @@ jobject JTuner::openFrontendByHandle(int feHandle) { env->FindClass("android/media/tv/tuner/Tuner$Frontend"), gFields.frontendInitID, mObject, - (jint) jId); + (jint) mFeId); } jobject JTuner::getAnalogFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps) { @@ -1536,29 +1512,20 @@ int JTuner::stopTune() { int JTuner::scan(const FrontendSettings& settings, FrontendScanType scanType, const FrontendSettingsExt1_1& settingsExt1_1) { - if (mFe == NULL) { - ALOGE("frontend is not initialized"); + if (mFeClient == NULL) { + ALOGE("frontend client is not initialized"); return (int)Result::INVALID_STATE; } - Result result; - sp<::android::hardware::tv::tuner::V1_1::IFrontend> fe_1_1 = - ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFe); - if (fe_1_1 == NULL) { - ALOGD("1.1 frontend is not found. Using 1.0 instead."); - result = mFe->scan(settings, scanType); - return (int)result; - } - - result = fe_1_1->scan_1_1(settings, scanType, settingsExt1_1); + Result result = mFeClient->scan(settings, scanType, settingsExt1_1); return (int)result; } int JTuner::stopScan() { - if (mFe == NULL) { - ALOGE("frontend is not initialized"); + if (mFeClient == NULL) { + ALOGE("frontend client is not initialized"); return (int)Result::INVALID_STATE; } - Result result = mFe->stopScan(); + Result result = mFeClient->stopScan(); return (int)result; } @@ -1576,11 +1543,11 @@ int JTuner::setLnb(sp lnbClient) { } int JTuner::setLna(bool enable) { - if (mFe == NULL) { - ALOGE("frontend is not initialized"); + if (mFeClient == NULL) { + ALOGE("frontend client is not initialized"); return (int)Result::INVALID_STATE; } - Result result = mFe->setLna(enable); + Result result = mFeClient->setLna(enable); return (int)result; } @@ -1603,9 +1570,6 @@ Result JTuner::openDemux() { if (res == Result::SUCCESS) { mDemux = demuxSp; mDemuxId = id; - if (mFe != NULL) { - mDemux->setFrontendDataSource(mFeId); - } } else { return res; } @@ -1631,12 +1595,6 @@ Result JTuner::openDemux() { jint JTuner::close() { Result res = Result::SUCCESS; - if (mFe != NULL) { - res = mFe->close(); - if (res != Result::SUCCESS) { - return (jint) res; - } - } if (mDemux != NULL) { res = mDemux->close(); if (res != Result::SUCCESS) { @@ -1702,24 +1660,11 @@ int JTuner::connectCiCam(jint id) { } int JTuner::linkCiCam(int id) { - if (mFe_1_1 == NULL) { - ALOGE("frontend 1.1 is not initialized"); + if (mFeClient == NULL) { + ALOGE("frontend client is not initialized"); return (int)Constant::INVALID_LTS_ID; } - - Result res; - uint32_t ltsId; - mFe_1_1->linkCiCam(static_cast(id), - [&](Result r, uint32_t id) { - res = r; - ltsId = id; - }); - - if (res != Result::SUCCESS) { - return (int)Constant::INVALID_LTS_ID; - } - - return (int) ltsId; + return mFeClient->linkCiCamToFrontend(id); } int JTuner::disconnectCiCam() { @@ -1735,12 +1680,12 @@ int JTuner::disconnectCiCam() { int JTuner::unlinkCiCam(int id) { - if (mFe_1_1 == NULL) { - ALOGE("frontend 1.1 is not initialized"); + if (mFeClient == NULL) { + ALOGE("frontend client is not initialized"); return (int)Result::INVALID_STATE; } - Result r = mFe_1_1->unlinkCiCam(static_cast(id)); + Result r = mFeClient->unlinkCiCamToFrontend(id); return (int) r; } @@ -1910,7 +1855,7 @@ jobject JTuner::getDemuxCaps() { } jobject JTuner::getFrontendStatus(jintArray types) { - if (mFe == NULL) { + if (mFeClient == NULL) { return NULL; } JNIEnv *env = AndroidRuntime::getJNIEnv(); @@ -1927,38 +1872,8 @@ jobject JTuner::getFrontendStatus(jintArray types) { } } - Result res; - hidl_vec status; - hidl_vec status_1_1; - - if (v.size() > 0) { - mFe->getStatus(v, - [&](Result r, const hidl_vec& s) { - res = r; - status = s; - }); - if (res != Result::SUCCESS) { - return NULL; - } - } - - if (v_1_1.size() > 0) { - sp<::android::hardware::tv::tuner::V1_1::IFrontend> iFeSp_1_1; - iFeSp_1_1 = ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFe); - - if (iFeSp_1_1 != NULL) { - iFeSp_1_1->getStatusExt1_1(v_1_1, - [&](Result r, const hidl_vec& s) { - res = r; - status_1_1 = s; - }); - if (res != Result::SUCCESS) { - return NULL; - } - } else { - ALOGW("getStatusExt1_1 is not supported with the current HAL implementation."); - } - } + hidl_vec status = mFeClient->getStatus(v); + hidl_vec status_1_1 = mFeClient->getStatusExtended_1_1(v_1_1); jclass clazz = env->FindClass("android/media/tv/tuner/frontend/FrontendStatus"); jmethodID init = env->GetMethodID(clazz, "", "()V"); @@ -2504,15 +2419,6 @@ bool JTuner::isV1_1ExtendedStatusType(int type) { jint JTuner::closeFrontend() { Result r = Result::SUCCESS; - if (mFe != NULL) { - r = mFe->close(); - } - if (r == Result::SUCCESS) { - mFe = NULL; - mFe_1_1 = NULL; - } else { - return (jint) r; - } if (mFeClient != NULL) { r = mFeClient->close(); @@ -2570,10 +2476,6 @@ static sp getDescramblerClient(JNIEnv *env, jobject descrambl return (DescramblerClient *)env->GetLongField(descrambler, gFields.descramblerContext); } -static uint32_t getResourceIdFromHandle(jint handle) { - return (handle & 0x00ff0000) >> 16; -} - static DemuxPid getDemuxPid(int pidType, int pid) { DemuxPid demuxPid; if ((int)pidType == 1) { diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h index b0613d4b5ee4b..bbead260b8cf4 100644 --- a/media/jni/android_media_tv_Tuner.h +++ b/media/jni/android_media_tv_Tuner.h @@ -178,7 +178,7 @@ private: }; struct FrontendClientCallbackImpl : public FrontendClientCallback { - FrontendClientCallbackImpl(jweak tunerObj, FrontendId id); + FrontendClientCallbackImpl(jweak tunerObj); virtual void onEvent(FrontendEventType frontendEventType); virtual void onScanMessage( @@ -187,7 +187,6 @@ struct FrontendClientCallbackImpl : public FrontendClientCallback { FrontendScanMessageTypeExt1_1 type, const FrontendScanMessageExt1_1& messageExt); jweak mObject; - FrontendId mId; }; struct TimeFilter : public RefBase { @@ -244,10 +243,6 @@ private: static sp mTuner; static sp<::android::hardware::tv::tuner::V1_1::ITuner> mTuner_1_1; static sp mTunerClient; - // TODO: remove after migrate to client lib - sp mFe; - // TODO: remove after migrate to client lib - sp<::android::hardware::tv::tuner::V1_1::IFrontend> mFe_1_1; sp mFeClient; int mFeId; sp mLnbClient; @@ -267,9 +262,6 @@ private: static jobject getDtmbFrontendCaps(JNIEnv *env, int id); bool isV1_1ExtendedStatusType(jint type); - static uint32_t getResourceIdFromHandle(jint handle) { - return (handle & 0x00ff0000) >> 16; - } }; class C2DataIdInfo : public C2Param { diff --git a/media/jni/tuner/FrontendClient.cpp b/media/jni/tuner/FrontendClient.cpp index 9dd4df762198c..14761a6f92a83 100644 --- a/media/jni/tuner/FrontendClient.cpp +++ b/media/jni/tuner/FrontendClient.cpp @@ -22,6 +22,7 @@ #include "FrontendClient.h" using ::aidl::android::media::tv::tuner::TunerFrontendSettings; +using ::android::hardware::tv::tuner::V1_1::Constant; namespace android { @@ -99,6 +100,96 @@ Result FrontendClient::stopTune() { return Result::INVALID_STATE; } +Result FrontendClient::scan(const FrontendSettings& settings, FrontendScanType type, + const FrontendSettingsExt1_1& settingsExt1_1) { + if (mTunerFrontend != NULL) { + // TODO: parse hidl settings to aidl settings + // TODO: aidl frontend settings to include Tuner HAL 1.1 settings + TunerFrontendSettings settings; + // TODO: handle error message. + mTunerFrontend->scan(settings, (int)type); + return Result::SUCCESS; + } + + Result result; + if (mFrontend_1_1 != NULL) { + result = mFrontend_1_1->scan_1_1(settings, type, settingsExt1_1); + return result; + } + + if (mFrontend != NULL) { + result = mFrontend->scan(settings, type); + return result; + } + + return Result::INVALID_STATE; +} + +Result FrontendClient::stopScan() { + if (mTunerFrontend != NULL) { + // TODO: handle error message. + mTunerFrontend->stopScan(); + return Result::SUCCESS; + } + + if (mFrontend != NULL) { + Result result = mFrontend->stopScan(); + return result; + } + + return Result::INVALID_STATE; +} + +vector FrontendClient::getStatus(vector statusTypes) { + vector status; + + if (mTunerFrontend != NULL) { + // TODO: handle error message. + /*status = mTunerFrontend->getStatus(statusTypes); + return status;*/ + } + + if (mFrontend != NULL && statusTypes.size() > 0) { + Result res; + mFrontend->getStatus(statusTypes, + [&](Result r, const hidl_vec& s) { + res = r; + status = s; + }); + if (res != Result::SUCCESS) { + status.clear(); + return status; + } + } + + return status; +} +vector FrontendClient::getStatusExtended_1_1( + vector statusTypes) { + vector status; + + if (mTunerFrontend != NULL) { + // TODO: handle error message. + /*status = mTunerFrontend->getStatusExtended_1_1(statusTypes); + return status;*/ + } + + if (mFrontend_1_1 != NULL && statusTypes.size() > 0) { + Result res; + mFrontend_1_1->getStatusExt1_1(statusTypes, + [&](Result r, const hidl_vec& s) { + res = r; + status = s; + }); + if (res != Result::SUCCESS) { + status.clear(); + return status; + } + } + + return status; +} + Result FrontendClient::setLnb(sp lnbClient) { if (mTunerFrontend != NULL) { // TODO: handle error message. @@ -114,6 +205,59 @@ Result FrontendClient::setLnb(sp lnbClient) { return Result::INVALID_STATE; } +Result FrontendClient::setLna(bool bEnable) { + if (mTunerFrontend != NULL) { + // TODO: handle error message. + /*mTunerFrontend->setLna(bEnable); + return Result::SUCCESS;*/ + } + + if (mFrontend != NULL) { + Result result = mFrontend->setLna(bEnable); + return result; + } + + return Result::INVALID_STATE; +} + +int FrontendClient::linkCiCamToFrontend(int ciCamId) { + int ltsId = (int)Constant::INVALID_LTS_ID; + + if (mTunerFrontend != NULL) { + // TODO: handle error message. + /*mTunerFrontend->linkCiCamToFrontend(ciCamId, ltsId); + return ltsId;*/ + } + + if (mFrontend_1_1 != NULL) { + Result res; + mFrontend_1_1->linkCiCam(static_cast(ciCamId), + [&](Result r, uint32_t id) { + res = r; + ltsId = id; + }); + if (res != Result::SUCCESS) { + return (int)Constant::INVALID_LTS_ID; + } + } + + return ltsId; +} + +Result FrontendClient::unlinkCiCamToFrontend(int ciCamId) { + if (mTunerFrontend != NULL) { + // TODO: handle error message. + /*mTunerFrontend->unlinkCiCamToFrontend(ciCamId); + return Result::SUCCESS;*/ + } + + if (mFrontend_1_1 != NULL) { + return mFrontend_1_1->unlinkCiCam(static_cast(ciCamId)); + } + + return Result::INVALID_STATE; +} + Result FrontendClient::close() { if (mTunerFrontend != NULL) { // TODO: handle error message. diff --git a/media/jni/tuner/FrontendClient.h b/media/jni/tuner/FrontendClient.h index b24f944638e76..32356744c8393 100644 --- a/media/jni/tuner/FrontendClient.h +++ b/media/jni/tuner/FrontendClient.h @@ -38,13 +38,18 @@ using ::android::hardware::tv::tuner::V1_0::FrontendInfo; using ::android::hardware::tv::tuner::V1_0::FrontendEventType; using ::android::hardware::tv::tuner::V1_0::FrontendScanMessage; using ::android::hardware::tv::tuner::V1_0::FrontendScanMessageType; +using ::android::hardware::tv::tuner::V1_0::FrontendScanType; using ::android::hardware::tv::tuner::V1_0::FrontendSettings; +using ::android::hardware::tv::tuner::V1_0::FrontendStatus; +using ::android::hardware::tv::tuner::V1_0::FrontendStatusType; using ::android::hardware::tv::tuner::V1_0::IFrontend; using ::android::hardware::tv::tuner::V1_0::Result; using ::android::hardware::tv::tuner::V1_1::FrontendScanMessageExt1_1; using ::android::hardware::tv::tuner::V1_1::FrontendScanMessageTypeExt1_1; using ::android::hardware::tv::tuner::V1_1::FrontendSettingsExt1_1; +using ::android::hardware::tv::tuner::V1_1::FrontendStatusExt1_1; +using ::android::hardware::tv::tuner::V1_1::FrontendStatusTypeExt1_1; using ::android::hardware::tv::tuner::V1_1::IFrontendCallback; using namespace std; @@ -127,11 +132,50 @@ public: */ Result stopTune(); + /** + * Scan the frontend to use the settings given. + */ + Result scan(const FrontendSettings& settings, FrontendScanType frontendScanType, + const FrontendSettingsExt1_1& settingsExt1_1); + + /** + * Stop the previous scanning. + */ + Result stopScan(); + + /** + * Gets the statuses of the frontend. + */ + vector getStatus(vector statusTypes); + + /** + * Gets the 1.1 extended statuses of the frontend. + */ + vector getStatusExtended_1_1( + vector statusTypes); + /** * Sets Low-Noise Block downconverter (LNB) for satellite frontend. */ Result setLnb(sp lnbClient); + /** + * Enable or Disable Low Noise Amplifier (LNA). + */ + Result setLna(bool bEnable); + + /** + * Link Frontend to the cicam with given id. + * + * @return lts id + */ + int linkCiCamToFrontend(int ciCamId); + + /** + * Unink Frontend to the cicam with given id. + */ + Result unlinkCiCamToFrontend(int ciCamId); + /** * Close Frontend. */