Loading tv/tuner/1.0/default/Demux.cpp +43 −14 Original line number Diff line number Diff line Loading @@ -60,13 +60,7 @@ Return<void> Demux::openFilter(const DemuxFilterType& type, uint32_t bufferSize, ALOGV("%s", __FUNCTION__); uint32_t filterId; if (!mUnusedFilterIds.empty()) { filterId = *mUnusedFilterIds.begin(); mUnusedFilterIds.erase(filterId); } else { filterId = ++mLastUsedFilterId; } mUsedFilterIds.insert(filterId); Loading @@ -84,6 +78,9 @@ Return<void> Demux::openFilter(const DemuxFilterType& type, uint32_t bufferSize, } mFilters[filterId] = filter; if (filter->isPcrFilter()) { mPcrFilterIds.insert(filterId); } bool result = true; if (mDvr != nullptr && mDvr->getType() == DvrType::PLAYBACK) { result = mDvr->addPlaybackFilter(filter); Loading @@ -102,19 +99,53 @@ Return<void> Demux::openTimeFilter(openTimeFilter_cb _hidl_cb) { return Void(); } Return<void> Demux::getAvSyncHwId(const sp<IFilter>& /* filter */, getAvSyncHwId_cb _hidl_cb) { Return<void> Demux::getAvSyncHwId(const sp<IFilter>& filter, getAvSyncHwId_cb _hidl_cb) { ALOGV("%s", __FUNCTION__); AvSyncHwId avSyncHwId = 0; uint32_t avSyncHwId = -1; int id; Result status; filter->getId([&](Result result, uint32_t filterId) { id = filterId; status = result; }); if (status != Result::SUCCESS) { ALOGE("[Demux] Can't get filter Id."); _hidl_cb(Result::INVALID_STATE, avSyncHwId); return Void(); } if (!mFilters[id]->isMediaFilter()) { ALOGE("[Demux] Given filter is not a media filter."); _hidl_cb(Result::INVALID_ARGUMENT, avSyncHwId); return Void(); } if (!mPcrFilterIds.empty()) { ALOGE("[Demux] No PCR filter opened."); // Return the lowest pcr filter id in the default implementation as the av sync id _hidl_cb(Result::SUCCESS, *mPcrFilterIds.begin()); return Void(); } _hidl_cb(Result::SUCCESS, avSyncHwId); _hidl_cb(Result::INVALID_STATE, avSyncHwId); return Void(); } Return<void> Demux::getAvSyncTime(AvSyncHwId /* avSyncHwId */, getAvSyncTime_cb _hidl_cb) { Return<void> Demux::getAvSyncTime(AvSyncHwId avSyncHwId, getAvSyncTime_cb _hidl_cb) { ALOGV("%s", __FUNCTION__); uint64_t avSyncTime = 0; uint64_t avSyncTime = -1; if (mPcrFilterIds.empty()) { _hidl_cb(Result::INVALID_STATE, avSyncTime); return Void(); } if (avSyncHwId != *mPcrFilterIds.begin()) { _hidl_cb(Result::INVALID_ARGUMENT, avSyncTime); return Void(); } _hidl_cb(Result::SUCCESS, avSyncTime); return Void(); Loading @@ -123,7 +154,6 @@ Return<void> Demux::getAvSyncTime(AvSyncHwId /* avSyncHwId */, getAvSyncTime_cb Return<Result> Demux::close() { ALOGV("%s", __FUNCTION__); mUnusedFilterIds.clear(); mUsedFilterIds.clear(); mLastUsedFilterId = -1; Loading Loading @@ -171,7 +201,6 @@ Result Demux::removeFilter(uint32_t filterId) { // resetFilterRecords(filterId); mUsedFilterIds.erase(filterId); mRecordFilterIds.erase(filterId); mUnusedFilterIds.insert(filterId); mFilters.erase(filterId); return Result::SUCCESS; Loading tv/tuner/1.0/default/Demux.h +1 −7 Original line number Diff line number Diff line Loading @@ -130,6 +130,7 @@ class Demux : public IDemux { uint32_t mDemuxId; uint32_t mCiCamId; set<uint32_t> mPcrFilterIds; /** * Record the last used filter id. Initial value is -1. * Filter Id starts with 0. Loading @@ -140,13 +141,6 @@ class Demux : public IDemux { * Any removed filter id should be removed from this set. */ set<uint32_t> mUsedFilterIds; /** * Record all the unused filter Ids within mLastUsedFilterId. * Removed filter Id should be added into this set. * When this set is not empty, ids here should be allocated first * and added into usedFilterIds. */ set<uint32_t> mUnusedFilterIds; /** * Record all the attached record filter Ids. * Any removed filter id should be removed from this set. Loading tv/tuner/1.0/default/Filter.cpp +26 −8 Original line number Diff line number Diff line Loading @@ -37,6 +37,32 @@ Filter::Filter(DemuxFilterType type, uint32_t filterId, uint32_t bufferSize, mBufferSize = bufferSize; mCallback = cb; mDemux = demux; switch (mType.mainType) { case DemuxFilterMainType::TS: if (mType.subType.tsFilterType() == DemuxTsFilterType::AUDIO || mType.subType.tsFilterType() == DemuxTsFilterType::VIDEO) { mIsMediaFilter = true; } if (mType.subType.tsFilterType() == DemuxTsFilterType::PCR) { mIsPcrFilter = true; } break; case DemuxFilterMainType::MMTP: if (mType.subType.mmtpFilterType() == DemuxMmtpFilterType::AUDIO || mType.subType.mmtpFilterType() == DemuxMmtpFilterType::VIDEO) { mIsMediaFilter = true; } break; case DemuxFilterMainType::IP: break; case DemuxFilterMainType::TLV: break; case DemuxFilterMainType::ALP: break; default: break; } } Filter::~Filter() {} Loading Loading @@ -73,16 +99,8 @@ Return<Result> Filter::configure(const DemuxFilterSettings& settings) { switch (mType.mainType) { case DemuxFilterMainType::TS: mTpid = settings.ts().tpid; if (mType.subType.tsFilterType() == DemuxTsFilterType::AUDIO || mType.subType.tsFilterType() == DemuxTsFilterType::VIDEO) { mIsMediaFilter = true; } break; case DemuxFilterMainType::MMTP: if (mType.subType.mmtpFilterType() == DemuxMmtpFilterType::AUDIO || mType.subType.mmtpFilterType() == DemuxMmtpFilterType::VIDEO) { mIsMediaFilter = true; } break; case DemuxFilterMainType::IP: break; Loading tv/tuner/1.0/default/Filter.h +3 −0 Original line number Diff line number Diff line Loading @@ -89,6 +89,8 @@ class Filter : public IFilter { void attachFilterToRecord(const sp<Dvr> dvr); void detachFilterFromRecord(); void freeAvHandle(); bool isMediaFilter() { return mIsMediaFilter; }; bool isPcrFilter() { return mIsPcrFilter; }; private: // Tuner service Loading @@ -104,6 +106,7 @@ class Filter : public IFilter { uint32_t mBufferSize; DemuxFilterType mType; bool mIsMediaFilter = false; bool mIsPcrFilter = false; DemuxFilterSettings mFilterSettings; uint16_t mTpid; Loading tv/tuner/1.0/vts/functional/DemuxTests.cpp +21 −0 Original line number Diff line number Diff line Loading @@ -39,3 +39,24 @@ AssertionResult DemuxTests::closeDemux() { mDemux = nullptr; return AssertionResult(status.isOk()); } void DemuxTests::getAvSyncId(sp<IFilter> filter, uint32_t& avSyncHwId) { ASSERT_TRUE(mDemux) << "Demux is not opened yet."; Result status; mDemux->getAvSyncHwId(filter, [&](Result result, uint32_t id) { status = result; avSyncHwId = id; }); ASSERT_TRUE(status == Result::SUCCESS) << "Fail to get avSyncHwId."; } void DemuxTests::getAvSyncTime(uint32_t avSyncId) { ASSERT_TRUE(mDemux) << "Demux is not opened yet."; Result status; uint64_t syncTime; mDemux->getAvSyncTime(avSyncId, [&](Result result, uint64_t time) { status = result; syncTime = time; }); ASSERT_TRUE(status == Result::SUCCESS) << "Fail to get avSyncTime."; } No newline at end of file Loading
tv/tuner/1.0/default/Demux.cpp +43 −14 Original line number Diff line number Diff line Loading @@ -60,13 +60,7 @@ Return<void> Demux::openFilter(const DemuxFilterType& type, uint32_t bufferSize, ALOGV("%s", __FUNCTION__); uint32_t filterId; if (!mUnusedFilterIds.empty()) { filterId = *mUnusedFilterIds.begin(); mUnusedFilterIds.erase(filterId); } else { filterId = ++mLastUsedFilterId; } mUsedFilterIds.insert(filterId); Loading @@ -84,6 +78,9 @@ Return<void> Demux::openFilter(const DemuxFilterType& type, uint32_t bufferSize, } mFilters[filterId] = filter; if (filter->isPcrFilter()) { mPcrFilterIds.insert(filterId); } bool result = true; if (mDvr != nullptr && mDvr->getType() == DvrType::PLAYBACK) { result = mDvr->addPlaybackFilter(filter); Loading @@ -102,19 +99,53 @@ Return<void> Demux::openTimeFilter(openTimeFilter_cb _hidl_cb) { return Void(); } Return<void> Demux::getAvSyncHwId(const sp<IFilter>& /* filter */, getAvSyncHwId_cb _hidl_cb) { Return<void> Demux::getAvSyncHwId(const sp<IFilter>& filter, getAvSyncHwId_cb _hidl_cb) { ALOGV("%s", __FUNCTION__); AvSyncHwId avSyncHwId = 0; uint32_t avSyncHwId = -1; int id; Result status; filter->getId([&](Result result, uint32_t filterId) { id = filterId; status = result; }); if (status != Result::SUCCESS) { ALOGE("[Demux] Can't get filter Id."); _hidl_cb(Result::INVALID_STATE, avSyncHwId); return Void(); } if (!mFilters[id]->isMediaFilter()) { ALOGE("[Demux] Given filter is not a media filter."); _hidl_cb(Result::INVALID_ARGUMENT, avSyncHwId); return Void(); } if (!mPcrFilterIds.empty()) { ALOGE("[Demux] No PCR filter opened."); // Return the lowest pcr filter id in the default implementation as the av sync id _hidl_cb(Result::SUCCESS, *mPcrFilterIds.begin()); return Void(); } _hidl_cb(Result::SUCCESS, avSyncHwId); _hidl_cb(Result::INVALID_STATE, avSyncHwId); return Void(); } Return<void> Demux::getAvSyncTime(AvSyncHwId /* avSyncHwId */, getAvSyncTime_cb _hidl_cb) { Return<void> Demux::getAvSyncTime(AvSyncHwId avSyncHwId, getAvSyncTime_cb _hidl_cb) { ALOGV("%s", __FUNCTION__); uint64_t avSyncTime = 0; uint64_t avSyncTime = -1; if (mPcrFilterIds.empty()) { _hidl_cb(Result::INVALID_STATE, avSyncTime); return Void(); } if (avSyncHwId != *mPcrFilterIds.begin()) { _hidl_cb(Result::INVALID_ARGUMENT, avSyncTime); return Void(); } _hidl_cb(Result::SUCCESS, avSyncTime); return Void(); Loading @@ -123,7 +154,6 @@ Return<void> Demux::getAvSyncTime(AvSyncHwId /* avSyncHwId */, getAvSyncTime_cb Return<Result> Demux::close() { ALOGV("%s", __FUNCTION__); mUnusedFilterIds.clear(); mUsedFilterIds.clear(); mLastUsedFilterId = -1; Loading Loading @@ -171,7 +201,6 @@ Result Demux::removeFilter(uint32_t filterId) { // resetFilterRecords(filterId); mUsedFilterIds.erase(filterId); mRecordFilterIds.erase(filterId); mUnusedFilterIds.insert(filterId); mFilters.erase(filterId); return Result::SUCCESS; Loading
tv/tuner/1.0/default/Demux.h +1 −7 Original line number Diff line number Diff line Loading @@ -130,6 +130,7 @@ class Demux : public IDemux { uint32_t mDemuxId; uint32_t mCiCamId; set<uint32_t> mPcrFilterIds; /** * Record the last used filter id. Initial value is -1. * Filter Id starts with 0. Loading @@ -140,13 +141,6 @@ class Demux : public IDemux { * Any removed filter id should be removed from this set. */ set<uint32_t> mUsedFilterIds; /** * Record all the unused filter Ids within mLastUsedFilterId. * Removed filter Id should be added into this set. * When this set is not empty, ids here should be allocated first * and added into usedFilterIds. */ set<uint32_t> mUnusedFilterIds; /** * Record all the attached record filter Ids. * Any removed filter id should be removed from this set. Loading
tv/tuner/1.0/default/Filter.cpp +26 −8 Original line number Diff line number Diff line Loading @@ -37,6 +37,32 @@ Filter::Filter(DemuxFilterType type, uint32_t filterId, uint32_t bufferSize, mBufferSize = bufferSize; mCallback = cb; mDemux = demux; switch (mType.mainType) { case DemuxFilterMainType::TS: if (mType.subType.tsFilterType() == DemuxTsFilterType::AUDIO || mType.subType.tsFilterType() == DemuxTsFilterType::VIDEO) { mIsMediaFilter = true; } if (mType.subType.tsFilterType() == DemuxTsFilterType::PCR) { mIsPcrFilter = true; } break; case DemuxFilterMainType::MMTP: if (mType.subType.mmtpFilterType() == DemuxMmtpFilterType::AUDIO || mType.subType.mmtpFilterType() == DemuxMmtpFilterType::VIDEO) { mIsMediaFilter = true; } break; case DemuxFilterMainType::IP: break; case DemuxFilterMainType::TLV: break; case DemuxFilterMainType::ALP: break; default: break; } } Filter::~Filter() {} Loading Loading @@ -73,16 +99,8 @@ Return<Result> Filter::configure(const DemuxFilterSettings& settings) { switch (mType.mainType) { case DemuxFilterMainType::TS: mTpid = settings.ts().tpid; if (mType.subType.tsFilterType() == DemuxTsFilterType::AUDIO || mType.subType.tsFilterType() == DemuxTsFilterType::VIDEO) { mIsMediaFilter = true; } break; case DemuxFilterMainType::MMTP: if (mType.subType.mmtpFilterType() == DemuxMmtpFilterType::AUDIO || mType.subType.mmtpFilterType() == DemuxMmtpFilterType::VIDEO) { mIsMediaFilter = true; } break; case DemuxFilterMainType::IP: break; Loading
tv/tuner/1.0/default/Filter.h +3 −0 Original line number Diff line number Diff line Loading @@ -89,6 +89,8 @@ class Filter : public IFilter { void attachFilterToRecord(const sp<Dvr> dvr); void detachFilterFromRecord(); void freeAvHandle(); bool isMediaFilter() { return mIsMediaFilter; }; bool isPcrFilter() { return mIsPcrFilter; }; private: // Tuner service Loading @@ -104,6 +106,7 @@ class Filter : public IFilter { uint32_t mBufferSize; DemuxFilterType mType; bool mIsMediaFilter = false; bool mIsPcrFilter = false; DemuxFilterSettings mFilterSettings; uint16_t mTpid; Loading
tv/tuner/1.0/vts/functional/DemuxTests.cpp +21 −0 Original line number Diff line number Diff line Loading @@ -39,3 +39,24 @@ AssertionResult DemuxTests::closeDemux() { mDemux = nullptr; return AssertionResult(status.isOk()); } void DemuxTests::getAvSyncId(sp<IFilter> filter, uint32_t& avSyncHwId) { ASSERT_TRUE(mDemux) << "Demux is not opened yet."; Result status; mDemux->getAvSyncHwId(filter, [&](Result result, uint32_t id) { status = result; avSyncHwId = id; }); ASSERT_TRUE(status == Result::SUCCESS) << "Fail to get avSyncHwId."; } void DemuxTests::getAvSyncTime(uint32_t avSyncId) { ASSERT_TRUE(mDemux) << "Demux is not opened yet."; Result status; uint64_t syncTime; mDemux->getAvSyncTime(avSyncId, [&](Result result, uint64_t time) { status = result; syncTime = time; }); ASSERT_TRUE(status == Result::SUCCESS) << "Fail to get avSyncTime."; } No newline at end of file