From 2ecfc3989db3af785614b2ada6272010fb3a223a Mon Sep 17 00:00:00 2001 From: Hongguang Date: Tue, 23 Nov 2021 10:29:15 -0800 Subject: [PATCH] Add new features to tuner HAL. *) Add DTS info to DemuxFilterMediaEvent. *) Allow to ignore download Id in DemuxFilterDownloadSettings and put download id into DemuxFilterDownloadEvent. *) Support dumpsys. *) Change section data size 64 bits. *) Support FrontendStatus streamIdList. Bug: 183583908 Bug: 183024067 Bug: 184017033 Bug: 203181023 Bug: 171540818 Test: atest VtsHalTvTunerTargetTest Test: atest android.media.tv.tuner.cts Test: dumpsys android.hardware.tv.tuner.ITuner/default Change-Id: I7478d008fc50da6700c551ae398dca15f8b350be --- .../tv/tuner/DemuxFilterDownloadEvent.aidl | 1 + .../tv/tuner/DemuxFilterDownloadSettings.aidl | 1 + .../tv/tuner/DemuxFilterMediaEvent.aidl | 2 + .../tv/tuner/DemuxFilterSectionEvent.aidl | 2 +- .../hardware/tv/tuner/FrontendStatus.aidl | 1 + .../hardware/tv/tuner/FrontendStatusType.aidl | 1 + .../tv/tuner/DemuxFilterDownloadEvent.aidl | 5 +++ .../tv/tuner/DemuxFilterDownloadSettings.aidl | 5 +++ .../tv/tuner/DemuxFilterMediaEvent.aidl | 10 +++++ .../tv/tuner/DemuxFilterSectionEvent.aidl | 2 +- .../hardware/tv/tuner/FrontendStatus.aidl | 6 +++ .../hardware/tv/tuner/FrontendStatusType.aidl | 5 +++ tv/tuner/aidl/default/Demux.cpp | 31 +++++++++++++ tv/tuner/aidl/default/Demux.h | 2 + tv/tuner/aidl/default/Dvr.cpp | 7 +++ tv/tuner/aidl/default/Dvr.h | 2 + tv/tuner/aidl/default/Filter.cpp | 14 ++++++ tv/tuner/aidl/default/Filter.h | 2 + tv/tuner/aidl/default/Frontend.cpp | 13 ++++++ tv/tuner/aidl/default/Frontend.h | 2 + tv/tuner/aidl/default/TimeFilter.cpp | 6 +++ tv/tuner/aidl/default/TimeFilter.h | 4 +- tv/tuner/aidl/default/Tuner.cpp | 43 +++++++++++++++++-- tv/tuner/aidl/default/Tuner.h | 2 + .../aidl/vts/functional/FrontendTests.cpp | 7 +++ 25 files changed, 169 insertions(+), 7 deletions(-) diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterDownloadEvent.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterDownloadEvent.aidl index b51e633840..8a05dbd6b8 100644 --- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterDownloadEvent.aidl +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterDownloadEvent.aidl @@ -36,6 +36,7 @@ package android.hardware.tv.tuner; @VintfStability parcelable DemuxFilterDownloadEvent { int itemId; + int downloadId; int mpuSequenceNumber; int itemFragmentIndex; int lastItemFragmentIndex; diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterDownloadSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterDownloadSettings.aidl index ff06888b47..86ce646f69 100644 --- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterDownloadSettings.aidl +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterDownloadSettings.aidl @@ -35,5 +35,6 @@ package android.hardware.tv.tuner; /* @hide */ @VintfStability parcelable DemuxFilterDownloadSettings { + boolean useDownloadId; int downloadId; } diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMediaEvent.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMediaEvent.aidl index a463d68035..993c6396e5 100644 --- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMediaEvent.aidl +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMediaEvent.aidl @@ -38,6 +38,8 @@ parcelable DemuxFilterMediaEvent { int streamId; boolean isPtsPresent; long pts; + boolean isDtsPresent; + long dts; long dataLength; long offset; android.hardware.common.NativeHandle avMemory; diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterSectionEvent.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterSectionEvent.aidl index 01b8a775e8..199a09c747 100644 --- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterSectionEvent.aidl +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterSectionEvent.aidl @@ -38,5 +38,5 @@ parcelable DemuxFilterSectionEvent { int tableId; int version; int sectionNum; - int dataLength; + long dataLength; } diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatus.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatus.aidl index 7677221a70..c79b7517fe 100644 --- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatus.aidl +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatus.aidl @@ -74,4 +74,5 @@ union FrontendStatus { boolean isShortFrames; android.hardware.tv.tuner.FrontendIsdbtMode isdbtMode; android.hardware.tv.tuner.FrontendIsdbtPartialReceptionFlag partialReceptionFlag; + int[] streamIdList; } diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatusType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatusType.aidl index 6342479233..9ea3200d35 100644 --- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatusType.aidl +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatusType.aidl @@ -74,4 +74,5 @@ enum FrontendStatusType { IS_SHORT_FRAMES = 36, ISDBT_MODE = 37, ISDBT_PARTIAL_RECEPTION_FLAG = 38, + STREAM_ID_LIST = 39, } diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterDownloadEvent.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterDownloadEvent.aidl index cf88928886..b9df5a02b9 100644 --- a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterDownloadEvent.aidl +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterDownloadEvent.aidl @@ -27,6 +27,11 @@ parcelable DemuxFilterDownloadEvent { */ int itemId; + /** + * Uniquely identify data content within the same Package ID (PID). + */ + int downloadId; + /** * MPU sequence number of filtered data (only for MMTP) */ diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterDownloadSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterDownloadSettings.aidl index bd79bd529e..1188b033a3 100644 --- a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterDownloadSettings.aidl +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterDownloadSettings.aidl @@ -22,6 +22,11 @@ package android.hardware.tv.tuner; */ @VintfStability parcelable DemuxFilterDownloadSettings { + /** + * Whether download ID should be used. + */ + boolean useDownloadId; + /** * Download ID (also known as the carousel ID) is carried in the PMT in * ISO/IEC 13818-1 for the service containing the object carousel. diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMediaEvent.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMediaEvent.aidl index ec7bbf1aa7..e92b711fd2 100644 --- a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMediaEvent.aidl +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMediaEvent.aidl @@ -39,6 +39,16 @@ parcelable DemuxFilterMediaEvent { */ long pts; + /** + * true if DTS is present in the PES header. + */ + boolean isDtsPresent; + + /** + * Decode TimeStamp for audio or video frame. + */ + long dts; + /** * Data size in bytes of audio or video frame */ diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterSectionEvent.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterSectionEvent.aidl index d6663168d8..a5f9ca7c1c 100644 --- a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterSectionEvent.aidl +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterSectionEvent.aidl @@ -40,5 +40,5 @@ parcelable DemuxFilterSectionEvent { /** * Data size in bytes of filtered data */ - int dataLength; + long dataLength; } diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStatus.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStatus.aidl index 9302b76a01..234e18392e 100644 --- a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStatus.aidl +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStatus.aidl @@ -202,4 +202,10 @@ union FrontendStatus { * ISDB-T Partial Reception Flag. */ FrontendIsdbtPartialReceptionFlag partialReceptionFlag; + + /** + * Stream ID list included in a transponder. + */ + int[] streamIdList; + } diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStatusType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStatusType.aidl index 103a4ab3fb..7feb72d742 100644 --- a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStatusType.aidl +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStatusType.aidl @@ -218,4 +218,9 @@ enum FrontendStatusType { * ISDB-T Partial Reception Flag. */ ISDBT_PARTIAL_RECEPTION_FLAG, + + /** + * Stream ID list included in a transponder. + */ + STREAM_ID_LIST, } diff --git a/tv/tuner/aidl/default/Demux.cpp b/tv/tuner/aidl/default/Demux.cpp index 4385461815..a94b4ad38a 100644 --- a/tv/tuner/aidl/default/Demux.cpp +++ b/tv/tuner/aidl/default/Demux.cpp @@ -410,6 +410,37 @@ bool Demux::isRecording() { return mIsRecording; } +binder_status_t Demux::dump(int fd, const char** args, uint32_t numArgs) { + dprintf(fd, " Demux %d:\n", mDemuxId); + dprintf(fd, " mIsRecording %d\n", mIsRecording); + { + dprintf(fd, " Filters:\n"); + map>::iterator it; + for (it = mFilters.begin(); it != mFilters.end(); it++) { + it->second->dump(fd, args, numArgs); + } + } + { + dprintf(fd, " TimeFilter:\n"); + if (mTimeFilter != nullptr) { + mTimeFilter->dump(fd, args, numArgs); + } + } + { + dprintf(fd, " DvrPlayback:\n"); + if (mDvrPlayback != nullptr) { + mDvrPlayback->dump(fd, args, numArgs); + } + } + { + dprintf(fd, " DvrRecord:\n"); + if (mDvrRecord != nullptr) { + mDvrRecord->dump(fd, args, numArgs); + } + } + return STATUS_OK; +} + bool Demux::attachRecordFilter(int64_t filterId) { if (mFilters[filterId] == nullptr || mDvrRecord == nullptr || !mFilters[filterId]->isRecordFilter()) { diff --git a/tv/tuner/aidl/default/Demux.h b/tv/tuner/aidl/default/Demux.h index 1b789bd5d0..7f0b0a7d62 100644 --- a/tv/tuner/aidl/default/Demux.h +++ b/tv/tuner/aidl/default/Demux.h @@ -71,6 +71,8 @@ class Demux : public BnDemux { ::ndk::ScopedAStatus connectCiCam(int32_t in_ciCamId) override; ::ndk::ScopedAStatus disconnectCiCam() override; + binder_status_t dump(int fd, const char** args, uint32_t numArgs) override; + // Functions interacts with Tuner Service void stopFrontendInput(); ::ndk::ScopedAStatus removeFilter(int64_t filterId); diff --git a/tv/tuner/aidl/default/Dvr.cpp b/tv/tuner/aidl/default/Dvr.cpp index 4f34b8e2c8..c591d079a8 100644 --- a/tv/tuner/aidl/default/Dvr.cpp +++ b/tv/tuner/aidl/default/Dvr.cpp @@ -177,6 +177,13 @@ EventFlag* Dvr::getDvrEventFlag() { return mDvrEventFlag; } +binder_status_t Dvr::dump(int fd, const char** /* args */, uint32_t /* numArgs */) { + dprintf(fd, " Dvr:\n"); + dprintf(fd, " mType: %hhd\n", mType); + dprintf(fd, " mDvrThreadRunning: %d\n", (bool)mDvrThreadRunning); + return STATUS_OK; +} + void Dvr::playbackThreadLoop() { ALOGD("[Dvr] playback threadLoop start."); diff --git a/tv/tuner/aidl/default/Dvr.h b/tv/tuner/aidl/default/Dvr.h index ad8728e54b..6ff71cd13f 100644 --- a/tv/tuner/aidl/default/Dvr.h +++ b/tv/tuner/aidl/default/Dvr.h @@ -71,6 +71,8 @@ class Dvr : public BnDvr { ::ndk::ScopedAStatus flush() override; ::ndk::ScopedAStatus close() override; + binder_status_t dump(int fd, const char** args, uint32_t numArgs) override; + /** * To create a DvrMQ and its Event Flag. * diff --git a/tv/tuner/aidl/default/Filter.cpp b/tv/tuner/aidl/default/Filter.cpp index 54037be492..769ebe21ee 100644 --- a/tv/tuner/aidl/default/Filter.cpp +++ b/tv/tuner/aidl/default/Filter.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include "Filter.h" @@ -655,6 +656,17 @@ void Filter::freeSharedAvHandle() { mSharedAvMemHandle = nullptr; } +binder_status_t Filter::dump(int fd, const char** /* args */, uint32_t /* numArgs */) { + dprintf(fd, " Filter %" PRIu64 ":\n", mFilterId); + dprintf(fd, " Main type: %d\n", mType.mainType); + dprintf(fd, " mIsMediaFilter: %d\n", mIsMediaFilter); + dprintf(fd, " mIsPcrFilter: %d\n", mIsPcrFilter); + dprintf(fd, " mIsRecordFilter: %d\n", mIsRecordFilter); + dprintf(fd, " mIsUsingFMQ: %d\n", mIsUsingFMQ); + dprintf(fd, " mFilterThreadRunning: %d\n", (bool)mFilterThreadRunning); + return STATUS_OK; +} + void Filter::maySendFilterStatusCallback() { if (!mIsUsingFMQ) { return; @@ -1148,6 +1160,7 @@ void Filter::createMediaEvent(vector& events) { DemuxFilterMediaEvent mediaEvent; mediaEvent.streamId = 1; mediaEvent.isPtsPresent = true; + mediaEvent.isDtsPresent = false; mediaEvent.dataLength = 3; mediaEvent.offset = 4; mediaEvent.isSecureMemory = true; @@ -1238,6 +1251,7 @@ void Filter::createPesEvent(vector& events) { void Filter::createDownloadEvent(vector& events) { DemuxFilterDownloadEvent download; download.itemId = 1; + download.downloadId = 1; download.mpuSequenceNumber = 2; download.itemFragmentIndex = 3; download.lastItemFragmentIndex = 4; diff --git a/tv/tuner/aidl/default/Filter.h b/tv/tuner/aidl/default/Filter.h index 8388c9861f..e301249e81 100644 --- a/tv/tuner/aidl/default/Filter.h +++ b/tv/tuner/aidl/default/Filter.h @@ -126,6 +126,8 @@ class Filter : public BnFilter { ::ndk::ScopedAStatus setDataSource(const std::shared_ptr& in_filter) override; ::ndk::ScopedAStatus setDelayHint(const FilterDelayHint& in_hint) override; + binder_status_t dump(int fd, const char** args, uint32_t numArgs) override; + /** * To create a FilterMQ and its Event Flag. * diff --git a/tv/tuner/aidl/default/Frontend.cpp b/tv/tuner/aidl/default/Frontend.cpp index 77d20e28cf..a4dde2a721 100644 --- a/tv/tuner/aidl/default/Frontend.cpp +++ b/tv/tuner/aidl/default/Frontend.cpp @@ -676,6 +676,11 @@ Frontend::~Frontend() {} FrontendIsdbtPartialReceptionFlag::AUTO); break; } + case FrontendStatusType::STREAM_ID_LIST: { + vector streamIds = {0, 1}; + status.set(streamIds); + break; + } default: { continue; } @@ -718,6 +723,14 @@ Frontend::~Frontend() {} return ::ndk::ScopedAStatus::ok(); } +binder_status_t Frontend::dump(int fd, const char** /* args */, uint32_t /* numArgs */) { + dprintf(fd, " Frontend %d\n", mId); + dprintf(fd, " mType: %d\n", mType); + dprintf(fd, " mIsLocked: %d\n", mIsLocked); + dprintf(fd, " mCiCamId: %d\n", mCiCamId); + return STATUS_OK; +} + FrontendType Frontend::getFrontendType() { return mType; } diff --git a/tv/tuner/aidl/default/Frontend.h b/tv/tuner/aidl/default/Frontend.h index 3c602cff8f..5e7b10c3c2 100644 --- a/tv/tuner/aidl/default/Frontend.h +++ b/tv/tuner/aidl/default/Frontend.h @@ -50,6 +50,8 @@ class Frontend : public BnFrontend { ::ndk::ScopedAStatus linkCiCam(int32_t in_ciCamId, int32_t* _aidl_return) override; ::ndk::ScopedAStatus unlinkCiCam(int32_t in_ciCamId) override; + binder_status_t dump(int fd, const char** args, uint32_t numArgs) override; + FrontendType getFrontendType(); int32_t getFrontendId(); string getSourceFile(); diff --git a/tv/tuner/aidl/default/TimeFilter.cpp b/tv/tuner/aidl/default/TimeFilter.cpp index dde7be34ca..9611ed9fb0 100644 --- a/tv/tuner/aidl/default/TimeFilter.cpp +++ b/tv/tuner/aidl/default/TimeFilter.cpp @@ -83,6 +83,12 @@ TimeFilter::~TimeFilter() {} return ::ndk::ScopedAStatus::ok(); } +binder_status_t TimeFilter::dump(int fd, const char** /* args */, uint32_t /* numArgs */) { + dprintf(fd, " TimeFilter:\n"); + dprintf(fd, " mTimeStamp: %" PRIu64 "\n", mTimeStamp); + return STATUS_OK; +} + } // namespace tuner } // namespace tv } // namespace hardware diff --git a/tv/tuner/aidl/default/TimeFilter.h b/tv/tuner/aidl/default/TimeFilter.h index ff35c47d70..5f4c2d4708 100644 --- a/tv/tuner/aidl/default/TimeFilter.h +++ b/tv/tuner/aidl/default/TimeFilter.h @@ -44,8 +44,10 @@ class TimeFilter : public BnTimeFilter { ::ndk::ScopedAStatus getSourceTime(int64_t* _aidl_return) override; ::ndk::ScopedAStatus close() override; + binder_status_t dump(int fd, const char** args, uint32_t numArgs) override; + private: - std::shared_ptr mDemux; + ::std::shared_ptr mDemux; uint64_t mTimeStamp = INVALID_TIME_STAMP; time_t mBeginTime; }; diff --git a/tv/tuner/aidl/default/Tuner.cpp b/tv/tuner/aidl/default/Tuner.cpp index badb08fb33..96e83bbf65 100644 --- a/tv/tuner/aidl/default/Tuner.cpp +++ b/tv/tuner/aidl/default/Tuner.cpp @@ -55,9 +55,13 @@ void Tuner::init() { capsIsdbs.set(FrontendIsdbsCapabilities()); mFrontendCaps[0] = capsIsdbs; statusCaps = { - FrontendStatusType::DEMOD_LOCK, FrontendStatusType::SNR, - FrontendStatusType::FEC, FrontendStatusType::MODULATION, - FrontendStatusType::MODULATIONS, FrontendStatusType::ROLL_OFF, + FrontendStatusType::DEMOD_LOCK, + FrontendStatusType::SNR, + FrontendStatusType::FEC, + FrontendStatusType::MODULATION, + FrontendStatusType::MODULATIONS, + FrontendStatusType::ROLL_OFF, + FrontendStatusType::STREAM_ID_LIST, }; mFrontendStatusCaps[0] = statusCaps; @@ -169,7 +173,7 @@ void Tuner::init() { statusCaps = { FrontendStatusType::DEMOD_LOCK, FrontendStatusType::MODULATION, FrontendStatusType::MODULATIONS, FrontendStatusType::ROLL_OFF, - FrontendStatusType::IS_SHORT_FRAMES, + FrontendStatusType::IS_SHORT_FRAMES, FrontendStatusType::STREAM_ID_LIST, }; mFrontendStatusCaps[8] = statusCaps; @@ -313,6 +317,33 @@ std::shared_ptr Tuner::getFrontendById(int32_t frontendId) { return ::ndk::ScopedAStatus::ok(); } +binder_status_t Tuner::dump(int fd, const char** args, uint32_t numArgs) { + ALOGV("%s", __FUNCTION__); + { + dprintf(fd, "Frontends:\n"); + for (int i = 0; i < mFrontendSize; i++) { + mFrontends[i]->dump(fd, args, numArgs); + for (int j = 0; j < mFrontendStatusCaps[i].size(); j++) { + dprintf(fd, " statusCap: %d\n", mFrontendStatusCaps[i][j]); + } + } + } + { + dprintf(fd, "Demuxs:\n"); + map>::iterator it; + for (it = mDemuxes.begin(); it != mDemuxes.end(); it++) { + it->second->dump(fd, args, numArgs); + } + } + { + dprintf(fd, "Lnbs:\n"); + for (int i = 0; i < mLnbs.size(); i++) { + mLnbs[i]->dump(fd, args, numArgs); + } + } + return STATUS_OK; +} + void Tuner::setFrontendAsDemuxSource(int32_t frontendId, int32_t demuxId) { mFrontendToDemux[frontendId] = demuxId; if (mFrontends[frontendId] != nullptr && mFrontends[frontendId]->isLocked()) { @@ -332,6 +363,10 @@ void Tuner::removeDemux(int32_t demuxId) { } void Tuner::removeFrontend(int32_t frontendId) { + map::iterator it = mFrontendToDemux.find(frontendId); + if (it != mFrontendToDemux.end()) { + mDemuxes.erase(it->second); + } mFrontendToDemux.erase(frontendId); } diff --git a/tv/tuner/aidl/default/Tuner.h b/tv/tuner/aidl/default/Tuner.h index 7af7ab8d53..682496c15e 100644 --- a/tv/tuner/aidl/default/Tuner.h +++ b/tv/tuner/aidl/default/Tuner.h @@ -57,6 +57,8 @@ class Tuner : public BnTuner { std::vector* out_lnbId, std::shared_ptr* _aidl_return) override; + binder_status_t dump(int fd, const char** args, uint32_t numArgs) override; + std::shared_ptr getFrontendById(int32_t frontendId); void setFrontendAsDemuxSource(int32_t frontendId, int32_t demuxId); void frontendStartTune(int32_t frontendId); diff --git a/tv/tuner/aidl/vts/functional/FrontendTests.cpp b/tv/tuner/aidl/vts/functional/FrontendTests.cpp index 6204803c15..12b1f33735 100644 --- a/tv/tuner/aidl/vts/functional/FrontendTests.cpp +++ b/tv/tuner/aidl/vts/functional/FrontendTests.cpp @@ -398,6 +398,13 @@ void FrontendTests::verifyFrontendStatus(vector statusTypes, expectStatuses[i].get()); break; } + case FrontendStatusType::STREAM_ID_LIST: { + ASSERT_TRUE(std::equal( + realStatuses[i].get().begin(), + realStatuses[i].get().end(), + expectStatuses[i].get().begin())); + break; + } default: { continue; }