Add various filter events callbacks after filter starting in the Filter
default impl
Note: these events are only for testing purpose. This would make sure
that CTS could cover more of the Filter events codes.
Test: atest android.media.tv.tuner.cts
Bug: 181152149
Change-Id: I8b4318a384af75646b61060f849353602ecefc03
diff --git a/tv/tuner/1.1/default/Demux.cpp b/tv/tuner/1.1/default/Demux.cpp
index f4e4a91..db25c2e 100644
--- a/tv/tuner/1.1/default/Demux.cpp
+++ b/tv/tuner/1.1/default/Demux.cpp
@@ -340,6 +340,10 @@
}
void Demux::frontendInputThreadLoop() {
+ if (!mFrontendInputThreadRunning) {
+ return;
+ }
+
std::lock_guard<std::mutex> lock(mFrontendInputThreadLock);
if (!mDvrPlayback) {
ALOGW("[Demux] No software Frontend input configured. Ending Frontend thread loop.");
diff --git a/tv/tuner/1.1/default/Filter.cpp b/tv/tuner/1.1/default/Filter.cpp
index 2e29aa9..884b507 100644
--- a/tv/tuner/1.1/default/Filter.cpp
+++ b/tv/tuner/1.1/default/Filter.cpp
@@ -72,9 +72,8 @@
sp<V1_1::IFilterCallback> filterCallback_v1_1 = V1_1::IFilterCallback::castFrom(cb);
if (filterCallback_v1_1 != NULL) {
mCallback_1_1 = filterCallback_v1_1;
- } else {
- mCallback = cb;
}
+ mCallback = cb;
}
Filter::~Filter() {
@@ -141,6 +140,36 @@
Return<Result> Filter::start() {
ALOGV("%s", __FUNCTION__);
mFilterThreadRunning = true;
+ // All the filter event callbacks in start are for testing purpose.
+ switch (mType.mainType) {
+ case DemuxFilterMainType::TS:
+ mCallback->onFilterEvent(createMediaEvent());
+ mCallback->onFilterEvent(createTsRecordEvent());
+ mCallback_1_1->onFilterEvent_1_1(createTsRecordEvent(), createTsRecordEventExt());
+ mCallback->onFilterEvent(createTemiEvent());
+ break;
+ case DemuxFilterMainType::MMTP:
+ mCallback->onFilterEvent(createDownloadEvent());
+ mCallback->onFilterEvent(createMmtpRecordEvent());
+ mCallback_1_1->onFilterEvent_1_1(createMmtpRecordEvent(), createMmtpRecordEventExt());
+ break;
+ case DemuxFilterMainType::IP:
+ mCallback->onFilterEvent(createSectionEvent());
+ mCallback->onFilterEvent(createIpPayloadEvent());
+ break;
+ case DemuxFilterMainType::TLV: {
+ DemuxFilterEvent emptyFilterEvent;
+ mCallback_1_1->onFilterEvent_1_1(emptyFilterEvent, createMonitorEvent());
+ break;
+ }
+ case DemuxFilterMainType::ALP: {
+ DemuxFilterEvent emptyFilterEvent;
+ mCallback_1_1->onFilterEvent_1_1(emptyFilterEvent, createRestartEvent());
+ break;
+ }
+ default:
+ break;
+ }
return startFilterLoop();
}
@@ -926,6 +955,176 @@
}
return (stat1.st_dev == stat2.st_dev) && (stat1.st_ino == stat2.st_ino);
}
+
+DemuxFilterEvent Filter::createMediaEvent() {
+ DemuxFilterEvent event;
+ event.events.resize(1);
+
+ event.events[0].media({
+ .streamId = 1,
+ .isPtsPresent = true,
+ .pts = 2,
+ .dataLength = 3,
+ .offset = 4,
+ .isSecureMemory = true,
+ .avDataId = 5,
+ .mpuSequenceNumber = 6,
+ .isPesPrivateData = true,
+ });
+
+ event.events[0].media().extraMetaData.audio({
+ .adFade = 1,
+ .adPan = 2,
+ .versionTextTag = 3,
+ .adGainCenter = 4,
+ .adGainFront = 5,
+ .adGainSurround = 6,
+ });
+
+ int av_fd = createAvIonFd(BUFFER_SIZE_16M);
+ if (av_fd == -1) {
+ return event;
+ }
+
+ native_handle_t* nativeHandle = createNativeHandle(av_fd);
+ if (nativeHandle == NULL) {
+ return event;
+ }
+
+ hidl_handle handle;
+ handle.setTo(nativeHandle, /*shouldOwn=*/true);
+ event.events[0].media().avMemory = std::move(handle);
+ ::close(av_fd);
+
+ return event;
+}
+
+DemuxFilterEvent Filter::createTsRecordEvent() {
+ DemuxFilterEvent event;
+ event.events.resize(1);
+
+ DemuxPid pid;
+ pid.tPid(1);
+ DemuxFilterTsRecordEvent::ScIndexMask mask;
+ mask.sc(1);
+ event.events[0].tsRecord({
+ .pid = pid,
+ .tsIndexMask = 1,
+ .scIndexMask = mask,
+ .byteNumber = 2,
+ });
+ return event;
+}
+
+V1_1::DemuxFilterEventExt Filter::createTsRecordEventExt() {
+ V1_1::DemuxFilterEventExt event;
+ event.events.resize(1);
+
+ event.events[0].tsRecord({
+ .pts = 1,
+ .firstMbInSlice = 2, // random address
+ });
+ return event;
+}
+
+DemuxFilterEvent Filter::createMmtpRecordEvent() {
+ DemuxFilterEvent event;
+ event.events.resize(1);
+
+ event.events[0].mmtpRecord({
+ .scHevcIndexMask = 1,
+ .byteNumber = 2,
+ });
+ return event;
+}
+
+V1_1::DemuxFilterEventExt Filter::createMmtpRecordEventExt() {
+ V1_1::DemuxFilterEventExt event;
+ event.events.resize(1);
+
+ event.events[0].mmtpRecord({
+ .pts = 1,
+ .mpuSequenceNumber = 2,
+ .firstMbInSlice = 3,
+ .tsIndexMask = 4,
+ });
+ return event;
+}
+
+DemuxFilterEvent Filter::createSectionEvent() {
+ DemuxFilterEvent event;
+ event.events.resize(1);
+
+ event.events[0].section({
+ .tableId = 1,
+ .version = 2,
+ .sectionNum = 3,
+ .dataLength = 0,
+ });
+ return event;
+}
+
+DemuxFilterEvent Filter::createPesEvent() {
+ DemuxFilterEvent event;
+ event.events.resize(1);
+
+ event.events[0].pes({
+ .streamId = static_cast<DemuxStreamId>(1),
+ .dataLength = 1,
+ .mpuSequenceNumber = 2,
+ });
+ return event;
+}
+
+DemuxFilterEvent Filter::createDownloadEvent() {
+ DemuxFilterEvent event;
+ event.events.resize(1);
+
+ event.events[0].download({
+ .itemId = 1,
+ .mpuSequenceNumber = 2,
+ .itemFragmentIndex = 3,
+ .lastItemFragmentIndex = 4,
+ .dataLength = 0,
+ });
+ return event;
+}
+
+DemuxFilterEvent Filter::createIpPayloadEvent() {
+ DemuxFilterEvent event;
+ event.events.resize(1);
+
+ event.events[0].ipPayload({
+ .dataLength = 0,
+ });
+ return event;
+}
+
+DemuxFilterEvent Filter::createTemiEvent() {
+ DemuxFilterEvent event;
+ event.events.resize(1);
+
+ event.events[0].temi({.pts = 1, .descrTag = 2, .descrData = {3}});
+ return event;
+}
+
+V1_1::DemuxFilterEventExt Filter::createMonitorEvent() {
+ V1_1::DemuxFilterEventExt event;
+ event.events.resize(1);
+
+ V1_1::DemuxFilterMonitorEvent monitor;
+ monitor.scramblingStatus(V1_1::ScramblingStatus::SCRAMBLED);
+ event.events[0].monitorEvent(monitor);
+ return event;
+}
+
+V1_1::DemuxFilterEventExt Filter::createRestartEvent() {
+ V1_1::DemuxFilterEventExt event;
+ event.events.resize(1);
+
+ event.events[0].startId(1);
+ return event;
+}
} // namespace implementation
} // namespace V1_0
} // namespace tuner
diff --git a/tv/tuner/1.1/default/Filter.h b/tv/tuner/1.1/default/Filter.h
index 3a4246e..659bebf 100644
--- a/tv/tuner/1.1/default/Filter.h
+++ b/tv/tuner/1.1/default/Filter.h
@@ -198,6 +198,18 @@
Result createShareMemMediaEvents(vector<uint8_t> output);
bool sameFile(int fd1, int fd2);
+ DemuxFilterEvent createMediaEvent();
+ DemuxFilterEvent createTsRecordEvent();
+ V1_1::DemuxFilterEventExt createTsRecordEventExt();
+ DemuxFilterEvent createMmtpRecordEvent();
+ V1_1::DemuxFilterEventExt createMmtpRecordEventExt();
+ DemuxFilterEvent createSectionEvent();
+ DemuxFilterEvent createPesEvent();
+ DemuxFilterEvent createDownloadEvent();
+ DemuxFilterEvent createIpPayloadEvent();
+ DemuxFilterEvent createTemiEvent();
+ V1_1::DemuxFilterEventExt createMonitorEvent();
+ V1_1::DemuxFilterEventExt createRestartEvent();
/**
* Lock to protect writes to the FMQs
*/