Add IDemux getSyncHwId/getAcSyncTime tests in Tuner VTS
Test: atest VtsHalTvTunerV1_0TargetTest
Bug: 150953857
Change-Id: I6e19de3666e9a0edc9db12f002db3ce45c940a2f
diff --git a/tv/tuner/1.0/default/Demux.cpp b/tv/tuner/1.0/default/Demux.cpp
index 4e5ae4b..da56041 100644
--- a/tv/tuner/1.0/default/Demux.cpp
+++ b/tv/tuner/1.0/default/Demux.cpp
@@ -60,13 +60,7 @@
ALOGV("%s", __FUNCTION__);
uint32_t filterId;
- if (!mUnusedFilterIds.empty()) {
- filterId = *mUnusedFilterIds.begin();
-
- mUnusedFilterIds.erase(filterId);
- } else {
- filterId = ++mLastUsedFilterId;
- }
+ filterId = ++mLastUsedFilterId;
mUsedFilterIds.insert(filterId);
@@ -84,6 +78,9 @@
}
mFilters[filterId] = filter;
+ if (filter->isPcrFilter()) {
+ mPcrFilterIds.insert(filterId);
+ }
bool result = true;
if (mDvr != nullptr && mDvr->getType() == DvrType::PLAYBACK) {
result = mDvr->addPlaybackFilter(filter);
@@ -102,19 +99,53 @@
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;
- _hidl_cb(Result::SUCCESS, avSyncHwId);
+ 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::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();
@@ -123,7 +154,6 @@
Return<Result> Demux::close() {
ALOGV("%s", __FUNCTION__);
- mUnusedFilterIds.clear();
mUsedFilterIds.clear();
mLastUsedFilterId = -1;
@@ -171,7 +201,6 @@
// resetFilterRecords(filterId);
mUsedFilterIds.erase(filterId);
mRecordFilterIds.erase(filterId);
- mUnusedFilterIds.insert(filterId);
mFilters.erase(filterId);
return Result::SUCCESS;
diff --git a/tv/tuner/1.0/default/Demux.h b/tv/tuner/1.0/default/Demux.h
index 3c91daf..6c46b0d 100644
--- a/tv/tuner/1.0/default/Demux.h
+++ b/tv/tuner/1.0/default/Demux.h
@@ -130,6 +130,7 @@
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.
@@ -141,13 +142,6 @@
*/
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.
*/
diff --git a/tv/tuner/1.0/default/Filter.cpp b/tv/tuner/1.0/default/Filter.cpp
index fef7a35..8bca70c 100644
--- a/tv/tuner/1.0/default/Filter.cpp
+++ b/tv/tuner/1.0/default/Filter.cpp
@@ -37,6 +37,32 @@
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() {}
@@ -73,16 +99,8 @@
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;
diff --git a/tv/tuner/1.0/default/Filter.h b/tv/tuner/1.0/default/Filter.h
index 9b49ad8..09e9604 100644
--- a/tv/tuner/1.0/default/Filter.h
+++ b/tv/tuner/1.0/default/Filter.h
@@ -89,6 +89,8 @@
void attachFilterToRecord(const sp<Dvr> dvr);
void detachFilterFromRecord();
void freeAvHandle();
+ bool isMediaFilter() { return mIsMediaFilter; };
+ bool isPcrFilter() { return mIsPcrFilter; };
private:
// Tuner service
@@ -104,6 +106,7 @@
uint32_t mBufferSize;
DemuxFilterType mType;
bool mIsMediaFilter = false;
+ bool mIsPcrFilter = false;
DemuxFilterSettings mFilterSettings;
uint16_t mTpid;