From 160a72c9e245c3576e4ee877f89718d456fccbfd Mon Sep 17 00:00:00 2001 From: Amy Zhang Date: Sat, 24 Apr 2021 21:15:26 -0700 Subject: [PATCH] Allow users to switch between FE source and DVR source when testing record/descrambling/broadcast Test: atest VtsHalTvTunerV1_0TargetTest Test: atest VtsHalTvTunerV1_1TargetTest Bug: 182519645 CTS-Coverage-Bug: 184077478 Change-Id: I6c57657ac3539d6a6fb3f63d2ecc9af7f6b9e2dc --- .../VtsHalTvTunerV1_0TargetTest.cpp | 232 ++++++++++++++---- .../VtsHalTvTunerV1_0TestConfigurations.h | 50 +++- tv/tuner/1.1/default/Demux.cpp | 4 + tv/tuner/1.1/default/Demux.h | 1 + tv/tuner/1.1/default/Dvr.cpp | 13 +- .../VtsHalTvTunerV1_1TargetTest.cpp | 92 +++++-- .../functional/VtsHalTvTunerV1_1TargetTest.h | 1 - .../VtsHalTvTunerV1_1TestConfigurations.h | 14 +- .../config/TunerTestingConfigReaderV1_0.h | 46 +++- tv/tuner/config/api/current.txt | 8 + .../config/sample_tuner_vts_config_1_0.xml | 6 +- .../config/sample_tuner_vts_config_1_1.xml | 9 +- .../tuner_testing_dynamic_configuration.xsd | 24 +- 13 files changed, 400 insertions(+), 100 deletions(-) diff --git a/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.cpp b/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.cpp index 4c92665b63..62093ccbe5 100644 --- a/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.cpp +++ b/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.cpp @@ -56,9 +56,6 @@ void TunerFilterHidlTest::configSingleFilterInDemuxTest(FilterConfig filterConf, } void TunerFilterHidlTest::testTimeFilter(TimeFilterConfig filterConf) { - if (!timeFilter.support) { - return; - } uint32_t demuxId; sp demux; DemuxCapabilities caps; @@ -161,27 +158,36 @@ void TunerPlaybackHidlTest::playbackSingleFilterTest(FilterConfig filterConf, Dv void TunerRecordHidlTest::recordSingleFilterTest(FilterConfig filterConf, FrontendConfig frontendConf, DvrConfig dvrConf) { - uint32_t feId; uint32_t demuxId; sp demux; + ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); + mDvrTests.setDemux(demux); + + DvrConfig dvrSourceConfig; + if (mLnbId || record.hasFrontendConnection) { + uint32_t feId; + mFrontendTests.getFrontendIdByType(frontendConf.type, feId); + ASSERT_TRUE(feId != INVALID_ID); + ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); + ASSERT_TRUE(mFrontendTests.setFrontendCallback()); + if (mLnbId) { + ASSERT_TRUE(mFrontendTests.setLnb(*mLnbId)); + } + if (frontendConf.isSoftwareFe) { + mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[record.dvrSoftwareFeId]); + } + ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); + mFrontendTests.setDvrTests(mDvrTests); + } else { + dvrSourceConfig = dvrMap[record.dvrSourceId]; + ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize)); + ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings)); + ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor()); + } + uint32_t filterId; sp filter; - - mFrontendTests.getFrontendIdByType(frontendConf.type, feId); - ASSERT_TRUE(feId != INVALID_ID); - ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); - ASSERT_TRUE(mFrontendTests.setFrontendCallback()); - if (mLnbId) { - ASSERT_TRUE(mFrontendTests.setLnb(*mLnbId)); - } - if (frontendConf.isSoftwareFe) { - mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[record.dvrSoftwareFeId]); - } - ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); - ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); mFilterTests.setDemux(demux); - mDvrTests.setDemux(demux); - mFrontendTests.setDvrTests(mDvrTests); ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize)); ASSERT_TRUE(mDvrTests.configDvrRecord(dvrConf.settings)); ASSERT_TRUE(mDvrTests.getDvrRecordMQDescriptor()); @@ -195,17 +201,39 @@ void TunerRecordHidlTest::recordSingleFilterTest(FilterConfig filterConf, ASSERT_TRUE(mDvrTests.attachFilterToDvr(filter)); ASSERT_TRUE(mDvrTests.startDvrRecord()); ASSERT_TRUE(mFilterTests.startFilter(filterId)); - ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/)); + + if (mLnbId || record.hasFrontendConnection) { + ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/)); + } else { + // Start DVR Source + mDvrTests.startPlaybackInputThread(dvrSourceConfig.playbackInputFile, + dvrSourceConfig.settings.playback()); + ASSERT_TRUE(mDvrTests.startDvrPlayback()); + } + mDvrTests.testRecordOutput(); mDvrTests.stopRecordThread(); - ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/)); + + if (mLnbId || record.hasFrontendConnection) { + ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/)); + } else { + mDvrTests.stopPlaybackThread(); + ASSERT_TRUE(mDvrTests.stopDvrPlayback()); + } + ASSERT_TRUE(mFilterTests.stopFilter(filterId)); ASSERT_TRUE(mDvrTests.stopDvrRecord()); ASSERT_TRUE(mDvrTests.detachFilterToDvr(filter)); ASSERT_TRUE(mFilterTests.closeFilter(filterId)); mDvrTests.closeDvrRecord(); + + if (mLnbId || record.hasFrontendConnection) { + ASSERT_TRUE(mFrontendTests.closeFrontend()); + } else { + mDvrTests.closeDvrPlayback(); + } + ASSERT_TRUE(mDemuxTests.closeDemux()); - ASSERT_TRUE(mFrontendTests.closeFrontend()); } void TunerRecordHidlTest::recordSingleFilterTestWithLnb(FilterConfig filterConf, @@ -236,23 +264,28 @@ void TunerRecordHidlTest::recordSingleFilterTestWithLnb(FilterConfig filterConf, void TunerRecordHidlTest::attachSingleFilterToRecordDvrTest(FilterConfig filterConf, FrontendConfig frontendConf, DvrConfig dvrConf) { - uint32_t feId; uint32_t demuxId; sp demux; + ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); + + if (record.hasFrontendConnection) { + uint32_t feId; + mFrontendTests.getFrontendIdByType(frontendConf.type, feId); + ASSERT_TRUE(feId != INVALID_ID); + ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); + ASSERT_TRUE(mFrontendTests.setFrontendCallback()); + ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); + } + uint32_t filterId; sp filter; - - mFrontendTests.getFrontendIdByType(frontendConf.type, feId); - ASSERT_TRUE(feId != INVALID_ID); - ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); - ASSERT_TRUE(mFrontendTests.setFrontendCallback()); - ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); - ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); mFilterTests.setDemux(demux); + mDvrTests.setDemux(demux); ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize)); ASSERT_TRUE(mDvrTests.configDvrRecord(dvrConf.settings)); ASSERT_TRUE(mDvrTests.getDvrRecordMQDescriptor()); + ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize)); ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(filterId)); ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId)); @@ -268,30 +301,42 @@ void TunerRecordHidlTest::attachSingleFilterToRecordDvrTest(FilterConfig filterC ASSERT_TRUE(mFilterTests.closeFilter(filterId)); mDvrTests.closeDvrRecord(); ASSERT_TRUE(mDemuxTests.closeDemux()); - ASSERT_TRUE(mFrontendTests.closeFrontend()); + + if (record.hasFrontendConnection) { + ASSERT_TRUE(mFrontendTests.closeFrontend()); + } } void TunerDescramblerHidlTest::scrambledBroadcastTest(set mediaFilterConfs, FrontendConfig frontendConf, DescramblerConfig descConfig) { - uint32_t feId; uint32_t demuxId; sp demux; + ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); + + DvrConfig dvrSourceConfig; + if (descrambling.hasFrontendConnection) { + uint32_t feId; + mFrontendTests.getFrontendIdByType(frontendConf.type, feId); + ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); + ASSERT_TRUE(mFrontendTests.setFrontendCallback()); + if (frontendConf.isSoftwareFe) { + mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[descrambling.dvrSoftwareFeId]); + } + ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); + mFrontendTests.setDemux(demux); + } else { + dvrSourceConfig = dvrMap[descrambling.dvrSourceId]; + ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize)); + ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings)); + ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor()); + } + set filterIds; uint32_t filterId; set::iterator config; set::iterator id; - - mFrontendTests.getFrontendIdByType(frontendConf.type, feId); - ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); - ASSERT_TRUE(mFrontendTests.setFrontendCallback()); - if (frontendConf.isSoftwareFe) { - mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[descrambling.dvrSoftwareFeId]); - } - ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); - ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); mFilterTests.setDemux(demux); - mFrontendTests.setDemux(demux); for (config = mediaFilterConfs.begin(); config != mediaFilterConfs.end(); config++) { ASSERT_TRUE(mFilterTests.openFilterInDemux((*config).type, (*config).bufferSize)); ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(filterId)); @@ -314,10 +359,26 @@ void TunerDescramblerHidlTest::scrambledBroadcastTest(set m for (id = filterIds.begin(); id != filterIds.end(); id++) { ASSERT_TRUE(mFilterTests.startFilter(*id)); } - // tune test - ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/)); + + if (descrambling.hasFrontendConnection) { + // tune test + ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/)); + } else { + // Start DVR Source + mDvrTests.startPlaybackInputThread(dvrSourceConfig.playbackInputFile, + dvrSourceConfig.settings.playback()); + ASSERT_TRUE(mDvrTests.startDvrPlayback()); + } + ASSERT_TRUE(filterDataOutputTest()); - ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/)); + + if (descrambling.hasFrontendConnection) { + ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/)); + } else { + mDvrTests.stopPlaybackThread(); + ASSERT_TRUE(mDvrTests.stopDvrPlayback()); + } + for (id = filterIds.begin(); id != filterIds.end(); id++) { ASSERT_TRUE(mFilterTests.stopFilter(*id)); } @@ -328,27 +389,45 @@ void TunerDescramblerHidlTest::scrambledBroadcastTest(set m for (id = filterIds.begin(); id != filterIds.end(); id++) { ASSERT_TRUE(mFilterTests.closeFilter(*id)); } + + if (descrambling.hasFrontendConnection) { + ASSERT_TRUE(mFrontendTests.closeFrontend()); + } else { + mDvrTests.closeDvrPlayback(); + } + ASSERT_TRUE(mDemuxTests.closeDemux()); - ASSERT_TRUE(mFrontendTests.closeFrontend()); } TEST_P(TunerFrontendHidlTest, TuneFrontend) { description("Tune one Frontend with specific setting and check Lock event"); + if (!live.hasFrontendConnection) { + return; + } mFrontendTests.tuneTest(frontendMap[live.frontendId]); } TEST_P(TunerFrontendHidlTest, AutoScanFrontend) { description("Run an auto frontend scan with specific setting and check lock scanMessage"); + if (!scan.hasFrontendConnection) { + return; + } mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_AUTO); } TEST_P(TunerFrontendHidlTest, BlindScanFrontend) { description("Run an blind frontend scan with specific setting and check lock scanMessage"); + if (!scan.hasFrontendConnection) { + return; + } mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_BLIND); } TEST_P(TunerLnbHidlTest, SendDiseqcMessageToLnb) { description("Open and configure an Lnb with specific settings then send a diseqc msg to it."); + if (!lnbLive.support) { + return; + } if (lnbMap[lnbLive.lnbId].name.compare(emptyHardwareId) == 0) { vector ids; ASSERT_TRUE(mLnbTests.getLnbIds(ids)); @@ -370,6 +449,9 @@ TEST_P(TunerLnbHidlTest, SendDiseqcMessageToLnb) { TEST_P(TunerDemuxHidlTest, openDemux) { description("Open and close a Demux."); + if (!live.hasFrontendConnection) { + return; + } uint32_t feId; uint32_t demuxId; sp demux; @@ -385,6 +467,9 @@ TEST_P(TunerDemuxHidlTest, openDemux) { TEST_P(TunerDemuxHidlTest, getAvSyncTime) { description("Get the A/V sync time from a PCR filter."); + if (!live.hasFrontendConnection) { + return; + } if (live.pcrFilterId.compare(emptyHardwareId) == 0) { return; } @@ -423,6 +508,9 @@ TEST_P(TunerDemuxHidlTest, getAvSyncTime) { TEST_P(TunerFilterHidlTest, StartFilterInDemux) { description("Open and start a filter in Demux."); + if (!live.hasFrontendConnection) { + return; + } // TODO use paramterized tests configSingleFilterInDemuxTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]); } @@ -457,22 +545,34 @@ TEST_P(TunerFilterHidlTest, SetFilterLinkage) { TEST_P(TunerFilterHidlTest, testTimeFilter) { description("Open a timer filter in Demux and set time stamp."); + if (!timeFilter.support) { + return; + } // TODO use paramterized tests testTimeFilter(timeFilterMap[timeFilter.timeFilterId]); } TEST_P(TunerBroadcastHidlTest, BroadcastDataFlowVideoFilterTest) { description("Test Video Filter functionality in Broadcast use case."); + if (!live.hasFrontendConnection) { + return; + } broadcastSingleFilterTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]); } TEST_P(TunerBroadcastHidlTest, BroadcastDataFlowAudioFilterTest) { description("Test Audio Filter functionality in Broadcast use case."); + if (!live.hasFrontendConnection) { + return; + } broadcastSingleFilterTest(filterMap[live.audioFilterId], frontendMap[live.frontendId]); } TEST_P(TunerBroadcastHidlTest, BroadcastDataFlowSectionFilterTest) { description("Test Section Filter functionality in Broadcast use case."); + if (!live.hasFrontendConnection) { + return; + } if (live.sectionFilterId.compare(emptyHardwareId) == 0) { return; } @@ -481,6 +581,9 @@ TEST_P(TunerBroadcastHidlTest, BroadcastDataFlowSectionFilterTest) { TEST_P(TunerBroadcastHidlTest, IonBufferTest) { description("Test the av filter data bufferring."); + if (!live.hasFrontendConnection) { + return; + } broadcastSingleFilterTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]); } @@ -501,6 +604,22 @@ TEST_P(TunerPlaybackHidlTest, PlaybackDataFlowWithTsSectionFilterTest) { playbackSingleFilterTest(filterMap[playback.sectionFilterId], dvrMap[playback.dvrId]); } +TEST_P(TunerPlaybackHidlTest, PlaybackDataFlowWithTsAudioFilterTest) { + description("Feed ts data from playback and configure Ts audio filter to get output"); + if (!playback.support) { + return; + } + playbackSingleFilterTest(filterMap[playback.audioFilterId], dvrMap[playback.dvrId]); +} + +TEST_P(TunerPlaybackHidlTest, PlaybackDataFlowWithTsVideoFilterTest) { + description("Feed ts data from playback and configure Ts video filter to get output"); + if (!playback.support) { + return; + } + playbackSingleFilterTest(filterMap[playback.videoFilterId], dvrMap[playback.dvrId]); +} + TEST_P(TunerRecordHidlTest, AttachFiltersToRecordTest) { description("Attach a single filter to the record dvr test."); // TODO use paramterized tests @@ -535,19 +654,26 @@ TEST_P(TunerDescramblerHidlTest, CreateDescrambler) { if (descrambling.support) { return; } - uint32_t feId; uint32_t demuxId; sp demux; - mFrontendTests.getFrontendIdByType(frontendMap[descrambling.frontendId].type, feId); - ASSERT_TRUE(feId != INVALID_ID); - ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); - ASSERT_TRUE(mFrontendTests.setFrontendCallback()); ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); - ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); + + if (descrambling.hasFrontendConnection) { + uint32_t feId; + mFrontendTests.getFrontendIdByType(frontendMap[descrambling.frontendId].type, feId); + ASSERT_TRUE(feId != INVALID_ID); + ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); + ASSERT_TRUE(mFrontendTests.setFrontendCallback()); + ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); + } + ASSERT_TRUE(mDescramblerTests.openDescrambler(demuxId)); ASSERT_TRUE(mDescramblerTests.closeDescrambler()); ASSERT_TRUE(mDemuxTests.closeDemux()); - ASSERT_TRUE(mFrontendTests.closeFrontend()); + + if (descrambling.hasFrontendConnection) { + ASSERT_TRUE(mFrontendTests.closeFrontend()); + } } TEST_P(TunerDescramblerHidlTest, ScrambledBroadcastDataFlowMediaFiltersTest) { diff --git a/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TestConfigurations.h b/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TestConfigurations.h index a1597c7e95..885cafd303 100644 --- a/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TestConfigurations.h +++ b/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TestConfigurations.h @@ -150,10 +150,32 @@ inline void connectHardwaresToTestCases() { }; inline bool validateConnections() { - bool feIsValid = frontendMap.find(live.frontendId) != frontendMap.end() && - frontendMap.find(scan.frontendId) != frontendMap.end(); - feIsValid &= record.support ? frontendMap.find(record.frontendId) != frontendMap.end() : true; - feIsValid &= descrambling.support + if ((!live.hasFrontendConnection || !scan.hasFrontendConnection) && !playback.support) { + ALOGW("[vts config] VTS must support either a DVR source or a Frontend source."); + return false; + } + + if (record.support && !record.hasFrontendConnection && + record.dvrSourceId.compare(emptyHardwareId) == 0) { + ALOGW("[vts config] Record must support either a DVR source or a Frontend source."); + return false; + } + + if (descrambling.support && !descrambling.hasFrontendConnection && + descrambling.dvrSourceId.compare(emptyHardwareId) == 0) { + ALOGW("[vts config] Descrambling must support either a DVR source or a Frontend source."); + return false; + } + + bool feIsValid = live.hasFrontendConnection + ? frontendMap.find(live.frontendId) != frontendMap.end() + : true; + feIsValid &= scan.hasFrontendConnection ? frontendMap.find(scan.frontendId) != frontendMap.end() + : true; + feIsValid &= record.support && record.hasFrontendConnection + ? frontendMap.find(record.frontendId) != frontendMap.end() + : true; + feIsValid &= (descrambling.support && descrambling.hasFrontendConnection) ? frontendMap.find(descrambling.frontendId) != frontendMap.end() : true; feIsValid &= lnbLive.support ? frontendMap.find(lnbLive.frontendId) != frontendMap.end() : true; @@ -165,18 +187,28 @@ inline bool validateConnections() { return false; } - bool dvrIsValid = frontendMap[live.frontendId].isSoftwareFe + bool dvrIsValid = (live.hasFrontendConnection && frontendMap[live.frontendId].isSoftwareFe) ? dvrMap.find(live.dvrSoftwareFeId) != dvrMap.end() : true; dvrIsValid &= playback.support ? dvrMap.find(playback.dvrId) != dvrMap.end() : true; if (record.support) { - if (frontendMap[record.frontendId].isSoftwareFe) { - dvrIsValid &= dvrMap.find(record.dvrSoftwareFeId) != dvrMap.end(); + if (record.hasFrontendConnection) { + if (frontendMap[record.frontendId].isSoftwareFe) { + dvrIsValid &= dvrMap.find(record.dvrSoftwareFeId) != dvrMap.end(); + } + } else { + dvrIsValid &= dvrMap.find(record.dvrSourceId) != dvrMap.end(); } dvrIsValid &= dvrMap.find(record.dvrRecordId) != dvrMap.end(); } - if (descrambling.support && frontendMap[descrambling.frontendId].isSoftwareFe) { - dvrIsValid &= dvrMap.find(descrambling.dvrSoftwareFeId) != dvrMap.end(); + if (descrambling.support) { + if (descrambling.hasFrontendConnection) { + if (frontendMap[descrambling.frontendId].isSoftwareFe) { + dvrIsValid &= dvrMap.find(descrambling.dvrSoftwareFeId) != dvrMap.end(); + } + } else { + dvrIsValid &= dvrMap.find(descrambling.dvrSourceId) != dvrMap.end(); + } } if (!dvrIsValid) { diff --git a/tv/tuner/1.1/default/Demux.cpp b/tv/tuner/1.1/default/Demux.cpp index db25c2e43d..15b8e6c82a 100644 --- a/tv/tuner/1.1/default/Demux.cpp +++ b/tv/tuner/1.1/default/Demux.cpp @@ -392,6 +392,10 @@ void Demux::setIsRecording(bool isRecording) { mIsRecording = isRecording; } +bool Demux::isRecording() { + return mIsRecording; +} + bool Demux::attachRecordFilter(uint64_t filterId) { if (mFilters[filterId] == nullptr || mDvrRecord == nullptr || !mFilters[filterId]->isRecordFilter()) { diff --git a/tv/tuner/1.1/default/Demux.h b/tv/tuner/1.1/default/Demux.h index 5212eae02d..ce46f9c10c 100644 --- a/tv/tuner/1.1/default/Demux.h +++ b/tv/tuner/1.1/default/Demux.h @@ -85,6 +85,7 @@ class Demux : public IDemux { void updateMediaFilterOutput(uint64_t filterId, vector data, uint64_t pts); uint16_t getFilterTpid(uint64_t filterId); void setIsRecording(bool isRecording); + bool isRecording(); void startFrontendInputLoop(); /** diff --git a/tv/tuner/1.1/default/Dvr.cpp b/tv/tuner/1.1/default/Dvr.cpp index 93bb6a875b..c487d98c36 100644 --- a/tv/tuner/1.1/default/Dvr.cpp +++ b/tv/tuner/1.1/default/Dvr.cpp @@ -218,19 +218,26 @@ void Dvr::playbackThreadLoop() { continue; } + // If the both dvr playback and dvr record are created, the playback will be treated as + // the source of the record. isVirtualFrontend set to true would direct the dvr playback + // input to the demux record filters or live broadcast filters. + bool isRecording = mDemux->isRecording(); + bool isVirtualFrontend = isRecording; + if (mDvrSettings.playback().dataFormat == DataFormat::ES) { - if (!processEsDataOnPlayback(false /*isVirtualFrontend*/, false /*isRecording*/)) { + if (!processEsDataOnPlayback(isVirtualFrontend, isRecording)) { ALOGE("[Dvr] playback es data failed to be filtered. Ending thread"); break; } maySendPlaybackStatusCallback(); continue; } + // Our current implementation filter the data and write it into the filter FMQ immediately // after the DATA_READY from the VTS/framework // This is for the non-ES data source, real playback use case handling. - if (!readPlaybackFMQ(false /*isVirtualFrontend*/, false /*isRecording*/) || - !startFilterDispatcher(false /*isVirtualFrontend*/, false /*isRecording*/)) { + if (!readPlaybackFMQ(isVirtualFrontend, isRecording) || + !startFilterDispatcher(isVirtualFrontend, isRecording)) { ALOGE("[Dvr] playback data failed to be filtered. Ending thread"); break; } diff --git a/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.cpp b/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.cpp index 10808614f5..e70c320bf2 100644 --- a/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.cpp +++ b/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.cpp @@ -22,10 +22,6 @@ AssertionResult TunerBroadcastHidlTest::filterDataOutputTest() { return filterDataOutputTestBase(mFilterTests); } -AssertionResult TunerRecordHidlTest::filterDataOutputTest() { - return filterDataOutputTestBase(mFilterTests); -} - void TunerFilterHidlTest::configSingleFilterInDemuxTest(FilterConfig1_1 filterConf, FrontendConfig1_1 frontendConf) { uint32_t feId; @@ -70,6 +66,9 @@ void TunerFilterHidlTest::reconfigSingleFilterInDemuxTest(FilterConfig1_1 filter ASSERT_TRUE(feId != INVALID_ID); ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); ASSERT_TRUE(mFrontendTests.setFrontendCallback()); + if (frontendConf.config1_0.isSoftwareFe) { + mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[live.dvrSoftwareFeId]); + } ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); mFrontendTests.setDemux(demux); @@ -103,6 +102,9 @@ void TunerBroadcastHidlTest::mediaFilterUsingSharedMemoryTest(FilterConfig1_1 fi ASSERT_TRUE(feId != INVALID_ID); ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); ASSERT_TRUE(mFrontendTests.setFrontendCallback()); + if (frontendConf.config1_0.isSoftwareFe) { + mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[live.dvrSoftwareFeId]); + } ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); mFrontendTests.setDemux(demux); @@ -129,21 +131,33 @@ void TunerBroadcastHidlTest::mediaFilterUsingSharedMemoryTest(FilterConfig1_1 fi void TunerRecordHidlTest::recordSingleFilterTest(FilterConfig1_1 filterConf, FrontendConfig1_1 frontendConf, DvrConfig dvrConf) { - uint32_t feId; uint32_t demuxId; sp demux; + ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); + mDvrTests.setDemux(demux); + + DvrConfig dvrSourceConfig; + if (record.hasFrontendConnection) { + uint32_t feId; + mFrontendTests.getFrontendIdByType(frontendConf.config1_0.type, feId); + ASSERT_TRUE(feId != INVALID_ID); + ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); + ASSERT_TRUE(mFrontendTests.setFrontendCallback()); + if (frontendConf.config1_0.isSoftwareFe) { + mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[record.dvrSoftwareFeId]); + } + ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); + mFrontendTests.setDvrTests(mDvrTests); + } else { + dvrSourceConfig = dvrMap[record.dvrSourceId]; + ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize)); + ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings)); + ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor()); + } + uint64_t filterId; sp filter; - - mFrontendTests.getFrontendIdByType(frontendConf.config1_0.type, feId); - ASSERT_TRUE(feId != INVALID_ID); - ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); - ASSERT_TRUE(mFrontendTests.setFrontendCallback()); - ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); - ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); mFilterTests.setDemux(demux); - mDvrTests.setDemux(demux); - mFrontendTests.setDvrTests(mDvrTests); ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize)); ASSERT_TRUE(mDvrTests.configDvrRecord(dvrConf.settings)); ASSERT_TRUE(mDvrTests.getDvrRecordMQDescriptor()); @@ -158,22 +172,46 @@ void TunerRecordHidlTest::recordSingleFilterTest(FilterConfig1_1 filterConf, ASSERT_TRUE(mDvrTests.attachFilterToDvr(filter)); ASSERT_TRUE(mDvrTests.startDvrRecord()); ASSERT_TRUE(mFilterTests.startFilter(filterId)); - ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/)); + + if (record.hasFrontendConnection) { + ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/)); + } else { + // Start DVR Source + mDvrTests.startPlaybackInputThread(dvrSourceConfig.playbackInputFile, + dvrSourceConfig.settings.playback()); + ASSERT_TRUE(mDvrTests.startDvrPlayback()); + } + mDvrTests.testRecordOutput(); - ASSERT_TRUE(filterDataOutputTest()); mDvrTests.stopRecordThread(); - ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/)); + + if (record.hasFrontendConnection) { + ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/)); + } else { + mDvrTests.stopPlaybackThread(); + ASSERT_TRUE(mDvrTests.stopDvrPlayback()); + } + ASSERT_TRUE(mFilterTests.stopFilter(filterId)); ASSERT_TRUE(mDvrTests.stopDvrRecord()); ASSERT_TRUE(mDvrTests.detachFilterToDvr(filter)); ASSERT_TRUE(mFilterTests.closeFilter(filterId)); mDvrTests.closeDvrRecord(); + + if (record.hasFrontendConnection) { + ASSERT_TRUE(mFrontendTests.closeFrontend()); + } else { + mDvrTests.closeDvrPlayback(); + } + ASSERT_TRUE(mDemuxTests.closeDemux()); - ASSERT_TRUE(mFrontendTests.closeFrontend()); } TEST_P(TunerFilterHidlTest, StartFilterInDemux) { description("Open and start a filter in Demux."); + if (!live.hasFrontendConnection) { + return; + } // TODO use parameterized tests configSingleFilterInDemuxTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]); } @@ -181,6 +219,9 @@ TEST_P(TunerFilterHidlTest, StartFilterInDemux) { TEST_P(TunerFilterHidlTest, ConfigIpFilterInDemuxWithCid) { description("Open and configure an ip filter in Demux."); // TODO use parameterized tests + if (!live.hasFrontendConnection) { + return; + } if (live.ipFilterId.compare(emptyHardwareId) == 0) { return; } @@ -189,6 +230,9 @@ TEST_P(TunerFilterHidlTest, ConfigIpFilterInDemuxWithCid) { TEST_P(TunerFilterHidlTest, ReconfigFilterToReceiveStartId) { description("Recofigure and restart a filter to test start id."); + if (!live.hasFrontendConnection) { + return; + } // TODO use parameterized tests reconfigSingleFilterInDemuxTest(filterMap[live.videoFilterId], filterMap[live.videoFilterId], frontendMap[live.frontendId]); @@ -205,16 +249,25 @@ TEST_P(TunerRecordHidlTest, RecordDataFlowWithTsRecordFilterTest) { TEST_P(TunerFrontendHidlTest, TuneFrontendWithFrontendSettingsExt1_1) { description("Tune one Frontend with v1_1 extended setting and check Lock event"); + if (!live.hasFrontendConnection) { + return; + } mFrontendTests.tuneTest(frontendMap[live.frontendId]); } TEST_P(TunerFrontendHidlTest, BlindScanFrontendWithEndFrequency) { description("Run an blind frontend scan with v1_1 extended setting and check lock scanMessage"); + if (!scan.hasFrontendConnection) { + return; + } mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_BLIND); } TEST_P(TunerBroadcastHidlTest, MediaFilterWithSharedMemoryHandle) { description("Test the Media Filter with shared memory handle"); + if (!live.hasFrontendConnection) { + return; + } mediaFilterUsingSharedMemoryTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]); } @@ -225,6 +278,9 @@ TEST_P(TunerFrontendHidlTest, GetFrontendDtmbCaps) { TEST_P(TunerFrontendHidlTest, LinkToCiCam) { description("Test Frontend link to CiCam"); + if (!live.hasFrontendConnection) { + return; + } if (!frontendMap[live.frontendId].canConnectToCiCam) { return; } diff --git a/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.h b/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.h index 863f649dd8..007e3d53df 100644 --- a/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.h +++ b/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.h @@ -97,7 +97,6 @@ class TunerRecordHidlTest : public testing::TestWithParam { void recordSingleFilterTest(FilterConfig1_1 filterConf, FrontendConfig1_1 frontendConf, DvrConfig dvrConf); - AssertionResult filterDataOutputTest(); sp mService; FrontendTests mFrontendTests; diff --git a/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TestConfigurations.h b/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TestConfigurations.h index 390bd4c2d3..2b5ad466b8 100644 --- a/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TestConfigurations.h +++ b/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TestConfigurations.h @@ -148,6 +148,11 @@ inline void connectHardwaresToTestCases() { }; inline bool validateConnections() { + if (record.support && !record.hasFrontendConnection && + record.dvrSourceId.compare(emptyHardwareId) == 0) { + ALOGW("[vts config] Record must support either a DVR source or a Frontend source."); + return false; + } bool feIsValid = frontendMap.find(live.frontendId) != frontendMap.end() && frontendMap.find(scan.frontendId) != frontendMap.end(); feIsValid &= record.support ? frontendMap.find(record.frontendId) != frontendMap.end() : true; @@ -160,9 +165,14 @@ inline bool validateConnections() { bool dvrIsValid = frontendMap[live.frontendId].config1_0.isSoftwareFe ? dvrMap.find(live.dvrSoftwareFeId) != dvrMap.end() : true; + if (record.support) { - if (frontendMap[record.frontendId].config1_0.isSoftwareFe) { - dvrIsValid &= dvrMap.find(record.dvrSoftwareFeId) != dvrMap.end(); + if (record.hasFrontendConnection) { + if (frontendMap[record.frontendId].config1_0.isSoftwareFe) { + dvrIsValid &= dvrMap.find(record.dvrSoftwareFeId) != dvrMap.end(); + } + } else { + dvrIsValid &= dvrMap.find(record.dvrSourceId) != dvrMap.end(); } dvrIsValid &= dvrMap.find(record.dvrRecordId) != dvrMap.end(); } diff --git a/tv/tuner/config/TunerTestingConfigReaderV1_0.h b/tv/tuner/config/TunerTestingConfigReaderV1_0.h index cff4af11d8..f7f72b038e 100644 --- a/tv/tuner/config/TunerTestingConfigReaderV1_0.h +++ b/tv/tuner/config/TunerTestingConfigReaderV1_0.h @@ -123,6 +123,7 @@ struct DescramblerConfig { }; struct LiveBroadcastHardwareConnections { + bool hasFrontendConnection; string frontendId; string dvrSoftwareFeId; string audioFilterId; @@ -134,6 +135,7 @@ struct LiveBroadcastHardwareConnections { }; struct ScanHardwareConnections { + bool hasFrontendConnection; string frontendId; }; @@ -149,19 +151,23 @@ struct DvrPlaybackHardwareConnections { struct DvrRecordHardwareConnections { bool support; + bool hasFrontendConnection; string frontendId; string dvrRecordId; string dvrSoftwareFeId; string recordFilterId; + string dvrSourceId; }; struct DescramblingHardwareConnections { bool support; + bool hasFrontendConnection; string frontendId; string dvrSoftwareFeId; string audioFilterId; string videoFilterId; string descramblerId; + string dvrSourceId; /* list string of extra filters; */ }; @@ -402,7 +408,14 @@ struct TunerTestingConfigReader1_0 { } static void connectLiveBroadcast(LiveBroadcastHardwareConnections& live) { - auto liveConfig = *getDataFlowConfiguration().getFirstClearLiveBroadcast(); + auto dataFlow = getDataFlowConfiguration(); + if (dataFlow.hasClearLiveBroadcast()) { + live.hasFrontendConnection = true; + } else { + live.hasFrontendConnection = false; + return; + } + auto liveConfig = *dataFlow.getFirstClearLiveBroadcast(); live.frontendId = liveConfig.getFrontendConnection(); live.audioFilterId = liveConfig.getAudioFilterConnection(); @@ -428,8 +441,15 @@ struct TunerTestingConfigReader1_0 { } static void connectScan(ScanHardwareConnections& scan) { - auto scanConfig = getDataFlowConfiguration().getFirstScan(); - scan.frontendId = scanConfig->getFrontendConnection(); + auto dataFlow = getDataFlowConfiguration(); + if (dataFlow.hasScan()) { + scan.hasFrontendConnection = true; + } else { + scan.hasFrontendConnection = false; + return; + } + auto scanConfig = *dataFlow.getFirstScan(); + scan.frontendId = scanConfig.getFrontendConnection(); } static void connectDvrPlayback(DvrPlaybackHardwareConnections& playback) { @@ -437,6 +457,7 @@ struct TunerTestingConfigReader1_0 { if (dataFlow.hasDvrPlayback()) { playback.support = true; } else { + playback.support = false; return; } auto playbackConfig = *dataFlow.getFirstDvrPlayback(); @@ -455,6 +476,7 @@ struct TunerTestingConfigReader1_0 { if (dataFlow.hasDvrRecord()) { record.support = true; } else { + record.support = false; return; } auto recordConfig = *dataFlow.getFirstDvrRecord(); @@ -464,6 +486,13 @@ struct TunerTestingConfigReader1_0 { if (recordConfig.hasDvrSoftwareFeConnection()) { record.dvrSoftwareFeId = recordConfig.getDvrSoftwareFeConnection(); } + if (recordConfig.getHasFrontendConnection()) { + record.hasFrontendConnection = true; + record.dvrSourceId = emptyHardwareId; + } else { + record.hasFrontendConnection = false; + record.dvrSourceId = recordConfig.getDvrSourceConnection(); + } } static void connectDescrambling(DescramblingHardwareConnections& descrambling) { @@ -471,6 +500,7 @@ struct TunerTestingConfigReader1_0 { if (dataFlow.hasDescrambling()) { descrambling.support = true; } else { + descrambling.support = false; return; } auto descConfig = *dataFlow.getFirstDescrambling(); @@ -481,6 +511,13 @@ struct TunerTestingConfigReader1_0 { if (descConfig.hasDvrSoftwareFeConnection()) { descrambling.dvrSoftwareFeId = descConfig.getDvrSoftwareFeConnection(); } + if (descConfig.getHasFrontendConnection()) { + descrambling.hasFrontendConnection = true; + descrambling.dvrSourceId = emptyHardwareId; + } else { + descrambling.hasFrontendConnection = false; + descrambling.dvrSourceId = descConfig.getDvrSourceConnection(); + } } static void connectLnbLive(LnbLiveHardwareConnections& lnbLive) { @@ -488,6 +525,7 @@ struct TunerTestingConfigReader1_0 { if (dataFlow.hasLnbLive()) { lnbLive.support = true; } else { + lnbLive.support = false; return; } auto lnbLiveConfig = *dataFlow.getFirstLnbLive(); @@ -507,6 +545,7 @@ struct TunerTestingConfigReader1_0 { if (dataFlow.hasLnbRecord()) { lnbRecord.support = true; } else { + lnbRecord.support = false; return; } auto lnbRecordConfig = *dataFlow.getFirstLnbRecord(); @@ -526,6 +565,7 @@ struct TunerTestingConfigReader1_0 { if (dataFlow.hasTimeFilter()) { timeFilter.support = true; } else { + timeFilter.support = false; return; } auto timeFilterConfig = *dataFlow.getFirstTimeFilter(); diff --git a/tv/tuner/config/api/current.txt b/tv/tuner/config/api/current.txt index a9602e705d..ef733151b1 100644 --- a/tv/tuner/config/api/current.txt +++ b/tv/tuner/config/api/current.txt @@ -54,12 +54,16 @@ package android.media.tuner.testing.configuration.V1_0 { method @Nullable public String getAudioFilterConnection(); method @Nullable public String getDescramblerConnection(); method @Nullable public String getDvrSoftwareFeConnection(); + method @Nullable public String getDvrSourceConnection(); method @Nullable public String getFrontendConnection(); + method @Nullable public boolean getHasFrontendConnection(); method @Nullable public String getVideoFilterConnection(); method public void setAudioFilterConnection(@Nullable String); method public void setDescramblerConnection(@Nullable String); method public void setDvrSoftwareFeConnection(@Nullable String); + method public void setDvrSourceConnection(@Nullable String); method public void setFrontendConnection(@Nullable String); + method public void setHasFrontendConnection(@Nullable boolean); method public void setVideoFilterConnection(@Nullable String); } @@ -79,11 +83,15 @@ package android.media.tuner.testing.configuration.V1_0 { ctor public DataFlowConfiguration.DvrRecord(); method @Nullable public String getDvrRecordConnection(); method @Nullable public String getDvrSoftwareFeConnection(); + method @Nullable public String getDvrSourceConnection(); method @Nullable public String getFrontendConnection(); + method @Nullable public boolean getHasFrontendConnection(); method @Nullable public String getRecordFilterConnection(); method public void setDvrRecordConnection(@Nullable String); method public void setDvrSoftwareFeConnection(@Nullable String); + method public void setDvrSourceConnection(@Nullable String); method public void setFrontendConnection(@Nullable String); + method public void setHasFrontendConnection(@Nullable boolean); method public void setRecordFilterConnection(@Nullable String); } diff --git a/tv/tuner/config/sample_tuner_vts_config_1_0.xml b/tv/tuner/config/sample_tuner_vts_config_1_0.xml index 570171edb7..26240765d6 100644 --- a/tv/tuner/config/sample_tuner_vts_config_1_0.xml +++ b/tv/tuner/config/sample_tuner_vts_config_1_0.xml @@ -196,7 +196,8 @@ sectionFilterConnection="FILTER_TS_SECTION_0" dvrSoftwareFeConnection="DVR_PLAYBACK_0"/> - - diff --git a/tv/tuner/config/sample_tuner_vts_config_1_1.xml b/tv/tuner/config/sample_tuner_vts_config_1_1.xml index 191e51cb81..8c99207a69 100644 --- a/tv/tuner/config/sample_tuner_vts_config_1_1.xml +++ b/tv/tuner/config/sample_tuner_vts_config_1_1.xml @@ -145,14 +145,15 @@ audioFilterConnection="FILTER_AUDIO_DEFAULT" videoFilterConnection="FILTER_VIDEO_DEFAULT" ipFilterConnection="FILTER_IP_IP_0" - dvrSoftwareFeConnection="DVR_PLAYBACK_0"/> + dvrSoftwareFeConnection="DVR_PLAYBACK_1"/> - - + dvrSoftwareFeConnection="DVR_PLAYBACK_1"/> diff --git a/tv/tuner/config/tuner_testing_dynamic_configuration.xsd b/tv/tuner/config/tuner_testing_dynamic_configuration.xsd index 3303657876..52168374f7 100644 --- a/tv/tuner/config/tuner_testing_dynamic_configuration.xsd +++ b/tv/tuner/config/tuner_testing_dynamic_configuration.xsd @@ -587,7 +587,9 @@ - + + @@ -600,20 +602,27 @@ - + + + + - + + + @@ -627,10 +636,15 @@ - + + + - + + +