Add a getAvSyncHwId_64bit in Tuner HAL 1.1 to support 64 bit hw sync id
Test: atest VtsHalTvTunerV1_1TargetTest
Bug: b/159058358
Change-Id: I3e58beaf4f61b27acce71a530e42293c4a87b181
diff --git a/tv/tuner/1.1/default/Demux.cpp b/tv/tuner/1.1/default/Demux.cpp
index b6b029f..f501d74 100644
--- a/tv/tuner/1.1/default/Demux.cpp
+++ b/tv/tuner/1.1/default/Demux.cpp
@@ -34,6 +34,49 @@
Demux::~Demux() {}
+Return<void> Demux::getAvSyncHwId64Bit(const sp<IFilter>& filter, getAvSyncHwId64Bit_cb _hidl_cb) {
+ ALOGV("%s", __FUNCTION__);
+
+ uint64_t avSyncHwId = -1;
+ uint64_t id;
+ Result status;
+
+ sp<V1_1::IFilter> filter_v1_1 = V1_1::IFilter::castFrom(filter);
+ if (filter_v1_1 != NULL) {
+ filter_v1_1->getId64Bit([&](Result result, uint64_t filterId) {
+ id = filterId;
+ status = result;
+ });
+ } else {
+ filter->getId([&](Result result, uint32_t filterId) {
+ id = filterId;
+ status = result;
+ });
+ }
+
+ if (status != Result::SUCCESS) {
+ ALOGE("[Demux] Can't get 64-bit 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()) {
+ // Return the lowest pcr filter id in the default implementation as the av sync id
+ _hidl_cb(Result::SUCCESS, *mPcrFilterIds.begin());
+ return Void();
+ }
+
+ ALOGE("[Demux] No PCR filter opened.");
+ _hidl_cb(Result::INVALID_STATE, avSyncHwId);
+ return Void();
+}
+
Return<Result> Demux::setFrontendDataSource(uint32_t frontendId) {
ALOGV("%s", __FUNCTION__);
@@ -170,6 +213,7 @@
mRecordFilterIds.clear();
mFilters.clear();
mLastUsedFilterId = -1;
+ mTunerService->removeDemux(mDemuxId);
return Result::SUCCESS;
}
@@ -325,6 +369,12 @@
std::lock_guard<std::mutex> lock(mFrontendInputThreadLock);
mFrontendInputThreadRunning = true;
+ if (!mDvrPlayback) {
+ ALOGW("[Demux] No software Frontend input configured. Ending Frontend thread loop.");
+ mFrontendInputThreadRunning = false;
+ return;
+ }
+
while (mFrontendInputThreadRunning) {
uint32_t efState = 0;
status_t status = mDvrPlayback->getDvrEventFlag()->wait(
diff --git a/tv/tuner/1.1/default/Demux.h b/tv/tuner/1.1/default/Demux.h
index 62f9162..f38f006 100644
--- a/tv/tuner/1.1/default/Demux.h
+++ b/tv/tuner/1.1/default/Demux.h
@@ -17,6 +17,7 @@
#ifndef ANDROID_HARDWARE_TV_TUNER_V1_1_DEMUX_H_
#define ANDROID_HARDWARE_TV_TUNER_V1_1_DEMUX_H_
+#include <android/hardware/tv/tuner/1.1/IDemux.h>
#include <fmq/MessageQueue.h>
#include <math.h>
#include <set>
@@ -48,12 +49,15 @@
class TimeFilter;
class Tuner;
-class Demux : public IDemux {
+class Demux : public V1_1::IDemux {
public:
Demux(uint32_t demuxId, sp<Tuner> tuner);
~Demux();
+ virtual Return<void> getAvSyncHwId64Bit(const sp<IFilter>& filter,
+ getAvSyncHwId64Bit_cb _hidl_cb) override;
+
virtual Return<Result> setFrontendDataSource(uint32_t frontendId) override;
virtual Return<void> openFilter(const DemuxFilterType& type, uint32_t bufferSize,
diff --git a/tv/tuner/1.1/default/Frontend.cpp b/tv/tuner/1.1/default/Frontend.cpp
index 3475c36..6f5885f 100644
--- a/tv/tuner/1.1/default/Frontend.cpp
+++ b/tv/tuner/1.1/default/Frontend.cpp
@@ -42,6 +42,7 @@
// Reset callback
mCallback = nullptr;
mIsLocked = false;
+ mTunerService->removeFrontend(mId);
return Result::SUCCESS;
}
diff --git a/tv/tuner/1.1/default/Tuner.cpp b/tv/tuner/1.1/default/Tuner.cpp
index c220ea2..0a0667e 100644
--- a/tv/tuner/1.1/default/Tuner.cpp
+++ b/tv/tuner/1.1/default/Tuner.cpp
@@ -34,7 +34,6 @@
// Static Frontends array to maintain local frontends information
// Array index matches their FrontendId in the default impl
mFrontendSize = 8;
- mFrontends.resize(mFrontendSize);
mFrontends[0] = new Frontend(FrontendType::DVBT, 0, this);
mFrontends[1] = new Frontend(FrontendType::ATSC, 1, this);
mFrontends[2] = new Frontend(FrontendType::DVBC, 2, this);
@@ -45,7 +44,6 @@
mFrontends[7] = new Frontend(FrontendType::ATSC, 7, this);
FrontendInfo::FrontendCapabilities caps;
- mFrontendCaps.resize(mFrontendSize);
caps = FrontendInfo::FrontendCapabilities();
caps.dvbtCaps(FrontendDvbtCapabilities());
mFrontendCaps[0] = caps;
@@ -233,6 +231,22 @@
}
}
+void Tuner::removeDemux(uint32_t demuxId) {
+ map<uint32_t, uint32_t>::iterator it;
+ for (it = mFrontendToDemux.begin(); it != mFrontendToDemux.end();) {
+ if (it->second == demuxId) {
+ it = mFrontendToDemux.erase(it);
+ } else {
+ it++;
+ }
+ }
+ mDemuxes.erase(demuxId);
+}
+
+void Tuner::removeFrontend(uint32_t frontendId) {
+ mFrontendToDemux.erase(frontendId);
+}
+
void Tuner::frontendStopTune(uint32_t frontendId) {
map<uint32_t, uint32_t>::iterator it = mFrontendToDemux.find(frontendId);
uint32_t demuxId;
diff --git a/tv/tuner/1.1/default/Tuner.h b/tv/tuner/1.1/default/Tuner.h
index 9463278..3b1574b 100644
--- a/tv/tuner/1.1/default/Tuner.h
+++ b/tv/tuner/1.1/default/Tuner.h
@@ -68,14 +68,16 @@
void frontendStartTune(uint32_t frontendId);
void frontendStopTune(uint32_t frontendId);
+ void removeDemux(uint32_t demuxId);
+ void removeFrontend(uint32_t frontendId);
private:
virtual ~Tuner();
// Static mFrontends array to maintain local frontends information
- vector<sp<Frontend>> mFrontends;
- vector<FrontendInfo::FrontendCapabilities> mFrontendCaps;
- std::map<uint32_t, uint32_t> mFrontendToDemux;
- std::map<uint32_t, sp<Demux>> mDemuxes;
+ map<uint32_t, sp<Frontend>> mFrontends;
+ map<uint32_t, FrontendInfo::FrontendCapabilities> mFrontendCaps;
+ map<uint32_t, uint32_t> mFrontendToDemux;
+ map<uint32_t, sp<Demux>> mDemuxes;
// To maintain how many Frontends we have
int mFrontendSize;
// The last used demux id. Initial value is -1.