diff --git a/media/jni/Android.bp b/media/jni/Android.bp index 65b64d7e8df35..4972529eb705b 100644 --- a/media/jni/Android.bp +++ b/media/jni/Android.bp @@ -180,6 +180,10 @@ cc_library_shared { "libstagefright_foundation_headers", ], + // TunerService is a system service required for Tuner feature. + // TunerJNI is a client of TunerService so we build the dependency here. + required: ["mediatuner"], + export_include_dirs: ["."], cflags: [ diff --git a/media/jni/tuner/ClientHelper.h b/media/jni/tuner/ClientHelper.h index 185b2f651d29f..508dccf368419 100644 --- a/media/jni/tuner/ClientHelper.h +++ b/media/jni/tuner/ClientHelper.h @@ -19,6 +19,7 @@ #include #include +#include using Status = ::ndk::ScopedAStatus; @@ -37,6 +38,7 @@ public: } else if (s.isOk()) { return Result::SUCCESS; } + ALOGE("Aidl exception code %s", s.getDescription().c_str()); return Result::UNKNOWN_ERROR; } }; diff --git a/media/jni/tuner/FilterClient.cpp b/media/jni/tuner/FilterClient.cpp index 8b4ca371056ee..f618890354324 100644 --- a/media/jni/tuner/FilterClient.cpp +++ b/media/jni/tuner/FilterClient.cpp @@ -43,6 +43,7 @@ using ::android::hardware::tv::tuner::V1_0::DemuxStreamId; using ::android::hardware::tv::tuner::V1_0::DemuxTpid; using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterSettings; using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterType; +using ::android::hardware::tv::tuner::V1_1::DemuxFilterMonitorEvent; using ::android::hardware::tv::tuner::V1_1::ScramblingStatus; namespace android { @@ -480,7 +481,7 @@ void FilterClient::getAidlIpAddress(DemuxIpAddress ipAddr, case DemuxIpAddress::SrcIpAddress::hidl_discriminator::v4: { int size = ipAddr.srcIpAddress.v4().size(); srcIpAddress.isIpV6 = false; - srcIpAddress.addr.resize(ipAddr.srcIpAddress.v4().size()); + srcIpAddress.addr.resize(size); copy(&ipAddr.srcIpAddress.v4()[0], &ipAddr.srcIpAddress.v4()[size], srcIpAddress.addr.begin()); break; @@ -493,8 +494,6 @@ void FilterClient::getAidlIpAddress(DemuxIpAddress ipAddr, srcIpAddress.addr.begin()); break; } - default: - break; } switch (ipAddr.dstIpAddress.getDiscriminator()) { case DemuxIpAddress::DstIpAddress::hidl_discriminator::v4: { @@ -513,8 +512,6 @@ void FilterClient::getAidlIpAddress(DemuxIpAddress ipAddr, dstIpAddress.addr.begin()); break; } - default: - break; } } @@ -696,8 +693,6 @@ void TunerFilterCallback::getHidlFilterEvent(const vector& fil getHidlRestartEvent(filterEvents, eventExt); break; } - default: - break; } } @@ -883,19 +878,18 @@ void TunerFilterCallback::getHidlMonitorEvent(const vector& fi DemuxFilterEventExt& eventExt) { auto monitor = filterEvents[0].get(); eventExt.events.resize(1); + DemuxFilterMonitorEvent monitorEvent; switch (monitor.getTag()) { case TunerFilterMonitorEvent::scramblingStatus: { - eventExt.events[0].monitorEvent().scramblingStatus( - static_cast(monitor.scramblingStatus)); + monitorEvent.scramblingStatus(static_cast(monitor.scramblingStatus)); + eventExt.events[0].monitorEvent(monitorEvent); break; } case TunerFilterMonitorEvent::cid: { - eventExt.events[0].monitorEvent().cid(static_cast(monitor.cid)); + monitorEvent.cid(static_cast(monitor.cid)); + eventExt.events[0].monitorEvent(monitorEvent); break; } - default: - eventExt.events[0].noinit(); - break; } } diff --git a/media/jni/tuner/FrontendClient.cpp b/media/jni/tuner/FrontendClient.cpp index 3a00133c69e28..0613223bd5dc1 100644 --- a/media/jni/tuner/FrontendClient.cpp +++ b/media/jni/tuner/FrontendClient.cpp @@ -49,9 +49,12 @@ using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtBandwidth; using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtGuardInterval; using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtMode; using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtModulation; +using ::android::hardware::tv::tuner::V1_0::FrontendModulationStatus; using ::android::hardware::tv::tuner::V1_0::FrontendScanAtsc3PlpInfo; +using ::android::hardware::tv::tuner::V1_0::FrontendStatusAtsc3PlpInfo; using ::android::hardware::tv::tuner::V1_0::LnbVoltage; using ::android::hardware::tv::tuner::V1_1::Constant; +using ::android::hardware::tv::tuner::V1_1::FrontendBandwidth; using ::android::hardware::tv::tuner::V1_1::FrontendCableTimeInterleaveMode; using ::android::hardware::tv::tuner::V1_1::FrontendDtmbBandwidth; using ::android::hardware::tv::tuner::V1_1::FrontendDtmbGuardInterval; @@ -61,19 +64,22 @@ using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTransmissionMode; using ::android::hardware::tv::tuner::V1_1::FrontendDvbcBandwidth; using ::android::hardware::tv::tuner::V1_1::FrontendDvbtConstellation; using ::android::hardware::tv::tuner::V1_1::FrontendDvbtTransmissionMode; +using ::android::hardware::tv::tuner::V1_1::FrontendGuardInterval; +using ::android::hardware::tv::tuner::V1_1::FrontendInterleaveMode; using ::android::hardware::tv::tuner::V1_1::FrontendModulation; +using ::android::hardware::tv::tuner::V1_1::FrontendRollOff; using ::android::hardware::tv::tuner::V1_1::FrontendSpectralInversion; +using ::android::hardware::tv::tuner::V1_1::FrontendTransmissionMode; using ::android::hardware::tv::tuner::V1_1::FrontendType; namespace android { /////////////// FrontendClient /////////////////////// -FrontendClient::FrontendClient(shared_ptr tunerFrontend, int id, int type) { +FrontendClient::FrontendClient(shared_ptr tunerFrontend, int type) { mTunerFrontend = tunerFrontend; mAidlCallback = NULL; mHidlCallback = NULL; - mId = id; mType = type; } @@ -104,6 +110,11 @@ void FrontendClient::setHidlFrontend(sp frontend) { mFrontend_1_1 = ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFrontend); } +// TODO: move after migration is done +void FrontendClient::setId(int id) { + mId = id; +} + Result FrontendClient::tune(const FrontendSettings& settings, const FrontendSettingsExt1_1& settingsExt1_1) { if (mTunerFrontend != NULL) { @@ -333,13 +344,26 @@ shared_ptr FrontendClient::getAidlFrontend() { } int FrontendClient::getId() { - return mId; + if (mTunerFrontend != NULL) { + Status s = mTunerFrontend->getFrontendId(&mId); + if (ClientHelper::getServiceSpecificErrorCode(s) == Result::SUCCESS) { + return mId; + } + ALOGE("Failed to getFrontendId from Tuner Frontend"); + return -1; + } + + if (mFrontend != NULL) { + return mId; + } + + return -1; } vector FrontendClient::getHidlStatus(vector& aidlStatus) { vector hidlStatus; for (TunerFrontendStatus s : aidlStatus) { - FrontendStatus status; + FrontendStatus status = FrontendStatus(); switch (s.getTag()) { case TunerFrontendStatus::isDemodLocked: { status.isDemodLocked(s.get()); @@ -389,25 +413,31 @@ vector FrontendClient::getHidlStatus(vector } case TunerFrontendStatus::modulation: { auto aidlMod = s.get(); + FrontendModulationStatus modulation; switch (mType) { case (int)FrontendType::DVBC: - status.modulation().dvbc(static_cast(aidlMod)); + modulation.dvbc(static_cast(aidlMod)); + status.modulation(modulation); hidlStatus.push_back(status); break; case (int)FrontendType::DVBS: - status.modulation().dvbs(static_cast(aidlMod)); + modulation.dvbs(static_cast(aidlMod)); + status.modulation(modulation); hidlStatus.push_back(status); break; case (int)FrontendType::ISDBS: - status.modulation().isdbs(static_cast(aidlMod)); + modulation.isdbs(static_cast(aidlMod)); + status.modulation(modulation); hidlStatus.push_back(status); break; case (int)FrontendType::ISDBS3: - status.modulation().isdbs3(static_cast(aidlMod)); + modulation.isdbs3(static_cast(aidlMod)); + status.modulation(modulation); hidlStatus.push_back(status); break; case (int)FrontendType::ISDBT: - status.modulation().isdbt(static_cast(aidlMod)); + modulation.isdbt(static_cast(aidlMod)); + status.modulation(modulation); hidlStatus.push_back(status); break; default: @@ -466,7 +496,7 @@ vector FrontendClient::getHidlStatus(vector } case TunerFrontendStatus::hierarchy: { status.hierarchy(static_cast( - s.get())); + s.get())); hidlStatus.push_back(status); break; } @@ -477,15 +507,16 @@ vector FrontendClient::getHidlStatus(vector } case TunerFrontendStatus::plpInfo: { int size = s.get().size(); - status.plpInfo().resize(size); + hidl_vec info(size); for (int i = 0; i < size; i++) { auto aidlInfo = s.get()[i]; - status.plpInfo()[i] = { + info[i] = { .plpId = (uint8_t)aidlInfo.plpId, .isLocked = aidlInfo.isLocked, .uec = (uint32_t)aidlInfo.uec, }; } + status.plpInfo(info); hidlStatus.push_back(status); break; } @@ -503,52 +534,54 @@ vector FrontendClient::getHidlStatusExt( FrontendStatusExt1_1 status; switch (s.getTag()) { case TunerFrontendStatus::modulations: { + vector ms; for (auto aidlMod : s.get()) { - int size = status.modulations().size(); - status.modulations().resize(size + 1); + FrontendModulation m; switch (mType) { case (int)FrontendType::DVBC: - status.modulations()[size].dvbc( - static_cast(aidlMod)); + m.dvbc(static_cast(aidlMod)); + ms.push_back(m); break; case (int)FrontendType::DVBS: - status.modulations()[size].dvbs( - static_cast(aidlMod)); + m.dvbs(static_cast(aidlMod)); + ms.push_back(m); break; case (int)FrontendType::DVBT: - status.modulations()[size].dvbt( - static_cast(aidlMod)); + m.dvbt(static_cast(aidlMod)); + ms.push_back(m); break; case (int)FrontendType::ISDBS: - status.modulations()[size].isdbs( - static_cast(aidlMod)); + m.isdbs(static_cast(aidlMod)); + ms.push_back(m); break; case (int)FrontendType::ISDBS3: - status.modulations()[size].isdbs3( - static_cast(aidlMod)); + m.isdbs3(static_cast(aidlMod)); + ms.push_back(m); break; case (int)FrontendType::ISDBT: - status.modulations()[size].isdbt( - static_cast(aidlMod)); + m.isdbt(static_cast(aidlMod)); + ms.push_back(m); break; case (int)FrontendType::ATSC: - status.modulations()[size].atsc( - static_cast(aidlMod)); + m.atsc(static_cast(aidlMod)); + ms.push_back(m); break; case (int)FrontendType::ATSC3: - status.modulations()[size].atsc3( - static_cast(aidlMod)); + m.atsc3(static_cast(aidlMod)); + ms.push_back(m); break; case (int)FrontendType::DTMB: - status.modulations()[size].dtmb( - static_cast(aidlMod)); + m.dtmb(static_cast(aidlMod)); + ms.push_back(m); break; default: - status.modulations().resize(size); break; } } - hidlStatus.push_back(status); + if (ms.size() > 0) { + status.modulations(ms); + hidlStatus.push_back(status); + } break; } case TunerFrontendStatus::bers: { @@ -571,25 +604,31 @@ vector FrontendClient::getHidlStatusExt( } case TunerFrontendStatus::bandwidth: { auto aidlBand = s.get(); + FrontendBandwidth band; switch (mType) { case (int)FrontendType::ATSC3: - status.bandwidth().atsc3(static_cast(aidlBand)); + band.atsc3(static_cast(aidlBand)); + status.bandwidth(band); hidlStatus.push_back(status); break; case (int)FrontendType::DVBC: - status.bandwidth().dvbc(static_cast(aidlBand)); + band.dvbc(static_cast(aidlBand)); + status.bandwidth(band); hidlStatus.push_back(status); break; case (int)FrontendType::DVBT: - status.bandwidth().dvbt(static_cast(aidlBand)); + band.dvbt(static_cast(aidlBand)); + status.bandwidth(band); hidlStatus.push_back(status); break; case (int)FrontendType::ISDBT: - status.bandwidth().isdbt(static_cast(aidlBand)); + band.isdbt(static_cast(aidlBand)); + status.bandwidth(band); hidlStatus.push_back(status); break; case (int)FrontendType::DTMB: - status.bandwidth().dtmb(static_cast(aidlBand)); + band.dtmb(static_cast(aidlBand)); + status.bandwidth(band); hidlStatus.push_back(status); break; default: @@ -599,17 +638,21 @@ vector FrontendClient::getHidlStatusExt( } case TunerFrontendStatus::interval: { auto aidlInter = s.get(); + FrontendGuardInterval inter; switch (mType) { case (int)FrontendType::DVBT: - status.interval().dvbt(static_cast(aidlInter)); + inter.dvbt(static_cast(aidlInter)); + status.interval(inter); hidlStatus.push_back(status); break; case (int)FrontendType::ISDBT: - status.interval().isdbt(static_cast(aidlInter)); + inter.isdbt(static_cast(aidlInter)); + status.interval(inter); hidlStatus.push_back(status); break; case (int)FrontendType::DTMB: - status.interval().dtmb(static_cast(aidlInter)); + inter.dtmb(static_cast(aidlInter)); + status.interval(inter); hidlStatus.push_back(status); break; default: @@ -619,19 +662,21 @@ vector FrontendClient::getHidlStatusExt( } case TunerFrontendStatus::transmissionMode: { auto aidlTran = s.get(); + FrontendTransmissionMode trans; switch (mType) { case (int)FrontendType::DVBT: - status.transmissionMode().dvbt( - static_cast(aidlTran)); + trans.dvbt(static_cast(aidlTran)); + status.transmissionMode(trans); hidlStatus.push_back(status); break; case (int)FrontendType::ISDBT: - status.transmissionMode().isdbt(static_cast(aidlTran)); + trans.isdbt(static_cast(aidlTran)); + status.transmissionMode(trans); hidlStatus.push_back(status); break; case (int)FrontendType::DTMB: - status.transmissionMode().dtmb( - static_cast(aidlTran)); + trans.dtmb(static_cast(aidlTran)); + status.transmissionMode(trans); hidlStatus.push_back(status); break; default: @@ -650,28 +695,30 @@ vector FrontendClient::getHidlStatusExt( break; } case TunerFrontendStatus::interleaving: { + vector modes; for (auto aidlInter : s.get()) { - int size = status.interleaving().size(); - status.interleaving().resize(size + 1); + FrontendInterleaveMode mode; switch (mType) { case (int)FrontendType::DVBC: - status.interleaving()[size].dvbc( - static_cast(aidlInter)); + mode.dvbc(static_cast(aidlInter)); + modes.push_back(mode); break; case (int)FrontendType::ATSC3: - status.interleaving()[size].atsc3( - static_cast(aidlInter)); + mode.atsc3(static_cast(aidlInter)); + modes.push_back(mode); break; case (int)FrontendType::DTMB: - status.interleaving()[size].dtmb( - static_cast(aidlInter)); + mode.dtmb(static_cast(aidlInter)); + modes.push_back(mode); break; default: - status.interleaving().resize(size); break; } } - hidlStatus.push_back(status); + if (modes.size() > 0) { + status.interleaving(modes); + hidlStatus.push_back(status); + } break; } case TunerFrontendStatus::isdbtSegment: { @@ -690,17 +737,21 @@ vector FrontendClient::getHidlStatusExt( } case TunerFrontendStatus::rollOff: { auto aidlRoll = s.get(); + FrontendRollOff roll; switch (mType) { case (int)FrontendType::DVBS: - status.rollOff().dvbs(static_cast(aidlRoll)); + roll.dvbs(static_cast(aidlRoll)); + status.rollOff(roll); hidlStatus.push_back(status); break; case (int)FrontendType::ISDBS: - status.rollOff().isdbs(static_cast(aidlRoll)); + roll.isdbs(static_cast(aidlRoll)); + status.rollOff(roll); hidlStatus.push_back(status); break; case (int)FrontendType::ISDBS3: - status.rollOff().isdbs3(static_cast(aidlRoll)); + roll.isdbs3(static_cast(aidlRoll)); + status.rollOff(roll); hidlStatus.push_back(status); break; default: diff --git a/media/jni/tuner/FrontendClient.h b/media/jni/tuner/FrontendClient.h index 298b3974aeb99..f71616cb32b76 100644 --- a/media/jni/tuner/FrontendClient.h +++ b/media/jni/tuner/FrontendClient.h @@ -108,7 +108,7 @@ private: struct FrontendClient : public RefBase { public: - FrontendClient(shared_ptr tunerFrontend, int id, int type); + FrontendClient(shared_ptr tunerFrontend, int type); ~FrontendClient(); /** @@ -180,6 +180,7 @@ public: shared_ptr getAidlFrontend(); + void setId(int id); int getId(); private: diff --git a/media/jni/tuner/TunerClient.cpp b/media/jni/tuner/TunerClient.cpp index 7f954b561567c..cf17ed6f43833 100644 --- a/media/jni/tuner/TunerClient.cpp +++ b/media/jni/tuner/TunerClient.cpp @@ -46,13 +46,12 @@ TunerClient::TunerClient() { // Connect with Tuner Service. ::ndk::SpAIBinder binder(AServiceManager_getService("media.tuner")); mTunerService = ITunerService::fromBinder(binder); - // TODO: Remove after JNI migration is done. - mTunerService = NULL; if (mTunerService == NULL) { ALOGE("Failed to get tuner service"); } else { // TODO: b/178124017 update TRM in TunerService independently. mTunerService->updateTunerResources(); + mTunerService->getTunerHalVersion(&mTunerVersion); } } @@ -115,7 +114,7 @@ sp TunerClient::openFrontend(int frontendHandle) { if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) { return NULL; } - return new FrontendClient(tunerFrontend, frontendHandle, aidlFrontendInfo.type); + return new FrontendClient(tunerFrontend, aidlFrontendInfo.type); } if (mTuner != NULL) { @@ -127,8 +126,10 @@ sp TunerClient::openFrontend(int frontendHandle) { if (res != Result::SUCCESS) { return NULL; } - sp frontendClient = new FrontendClient(NULL, id, (int)hidlInfo.type); + sp frontendClient = new FrontendClient( + NULL, (int)hidlInfo.type); frontendClient->setHidlFrontend(hidlFrontend); + frontendClient->setId(id); return frontendClient; } } @@ -358,7 +359,7 @@ void TunerClient::updateLnbResources() { sp TunerClient::getHidlTuner() { if (mTuner == NULL) { - mTunerVersion = 0; + mTunerVersion = TUNER_HAL_VERSION_UNKNOWN; mTuner_1_1 = ::android::hardware::tv::tuner::V1_1::ITuner::getService(); if (mTuner_1_1 == NULL) { @@ -367,11 +368,11 @@ sp TunerClient::getHidlTuner() { if (mTuner == NULL) { ALOGW("Failed to get tuner 1.0 service."); } else { - mTunerVersion = 1 << 16; + mTunerVersion = TUNER_HAL_VERSION_1_0; } } else { mTuner = static_cast>(mTuner_1_1); - mTunerVersion = ((1 << 16) | 1); + mTunerVersion = TUNER_HAL_VERSION_1_1; } } return mTuner; diff --git a/media/jni/tuner/TunerClient.h b/media/jni/tuner/TunerClient.h index 744bf20587660..9671cf787e3ec 100644 --- a/media/jni/tuner/TunerClient.h +++ b/media/jni/tuner/TunerClient.h @@ -48,6 +48,10 @@ using namespace std; namespace android { +const static int TUNER_HAL_VERSION_UNKNOWN = 0; +const static int TUNER_HAL_VERSION_1_0 = 1 << 16; +const static int TUNER_HAL_VERSION_1_1 = (1 << 16) | 1; + typedef enum { FRONTEND, LNB,