Loading tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.cpp +179 −53 Original line number Diff line number Diff line Loading @@ -56,9 +56,6 @@ void TunerFilterHidlTest::configSingleFilterInDemuxTest(FilterConfig filterConf, } void TunerFilterHidlTest::testTimeFilter(TimeFilterConfig filterConf) { if (!timeFilter.support) { return; } uint32_t demuxId; sp<IDemux> demux; DemuxCapabilities caps; Loading Loading @@ -161,12 +158,14 @@ void TunerPlaybackHidlTest::playbackSingleFilterTest(FilterConfig filterConf, Dv void TunerRecordHidlTest::recordSingleFilterTest(FilterConfig filterConf, FrontendConfig frontendConf, DvrConfig dvrConf) { uint32_t feId; uint32_t demuxId; sp<IDemux> demux; uint32_t filterId; sp<IFilter> filter; 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)); Loading @@ -177,11 +176,18 @@ void TunerRecordHidlTest::recordSingleFilterTest(FilterConfig filterConf, 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); } 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<IFilter> filter; mFilterTests.setDemux(demux); ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize)); ASSERT_TRUE(mDvrTests.configDvrRecord(dvrConf.settings)); ASSERT_TRUE(mDvrTests.getDvrRecordMQDescriptor()); Loading @@ -195,17 +201,39 @@ void TunerRecordHidlTest::recordSingleFilterTest(FilterConfig filterConf, ASSERT_TRUE(mDvrTests.attachFilterToDvr(filter)); ASSERT_TRUE(mDvrTests.startDvrRecord()); ASSERT_TRUE(mFilterTests.startFilter(filterId)); 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(); 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(); ASSERT_TRUE(mDemuxTests.closeDemux()); if (mLnbId || record.hasFrontendConnection) { ASSERT_TRUE(mFrontendTests.closeFrontend()); } else { mDvrTests.closeDvrPlayback(); } ASSERT_TRUE(mDemuxTests.closeDemux()); } void TunerRecordHidlTest::recordSingleFilterTestWithLnb(FilterConfig filterConf, Loading Loading @@ -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<IDemux> demux; uint32_t filterId; sp<IFilter> filter; 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.openDemux(demux, demuxId)); ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); } uint32_t filterId; sp<IFilter> filter; 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)); Loading @@ -268,30 +301,42 @@ void TunerRecordHidlTest::attachSingleFilterToRecordDvrTest(FilterConfig filterC ASSERT_TRUE(mFilterTests.closeFilter(filterId)); mDvrTests.closeDvrRecord(); ASSERT_TRUE(mDemuxTests.closeDemux()); if (record.hasFrontendConnection) { ASSERT_TRUE(mFrontendTests.closeFrontend()); } } void TunerDescramblerHidlTest::scrambledBroadcastTest(set<struct FilterConfig> mediaFilterConfs, FrontendConfig frontendConf, DescramblerConfig descConfig) { uint32_t feId; uint32_t demuxId; sp<IDemux> demux; set<uint32_t> filterIds; uint32_t filterId; set<struct FilterConfig>::iterator config; set<uint32_t>::iterator id; 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.openDemux(demux, demuxId)); ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); mFilterTests.setDemux(demux); 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<uint32_t> filterIds; uint32_t filterId; set<struct FilterConfig>::iterator config; set<uint32_t>::iterator id; mFilterTests.setDemux(demux); for (config = mediaFilterConfs.begin(); config != mediaFilterConfs.end(); config++) { ASSERT_TRUE(mFilterTests.openFilterInDemux((*config).type, (*config).bufferSize)); ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(filterId)); Loading @@ -314,10 +359,26 @@ void TunerDescramblerHidlTest::scrambledBroadcastTest(set<struct FilterConfig> m for (id = filterIds.begin(); id != filterIds.end(); id++) { ASSERT_TRUE(mFilterTests.startFilter(*id)); } 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()); 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)); } Loading @@ -328,27 +389,45 @@ void TunerDescramblerHidlTest::scrambledBroadcastTest(set<struct FilterConfig> m for (id = filterIds.begin(); id != filterIds.end(); id++) { ASSERT_TRUE(mFilterTests.closeFilter(*id)); } ASSERT_TRUE(mDemuxTests.closeDemux()); if (descrambling.hasFrontendConnection) { ASSERT_TRUE(mFrontendTests.closeFrontend()); } else { mDvrTests.closeDvrPlayback(); } ASSERT_TRUE(mDemuxTests.closeDemux()); } 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<uint32_t> ids; ASSERT_TRUE(mLnbTests.getLnbIds(ids)); Loading @@ -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<IDemux> demux; Loading @@ -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; } Loading Loading @@ -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]); } Loading Loading @@ -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; } Loading @@ -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]); } Loading @@ -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 Loading Loading @@ -535,20 +654,27 @@ TEST_P(TunerDescramblerHidlTest, CreateDescrambler) { if (descrambling.support) { return; } uint32_t feId; uint32_t demuxId; sp<IDemux> demux; ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); 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.openDemux(demux, demuxId)); ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); } ASSERT_TRUE(mDescramblerTests.openDescrambler(demuxId)); ASSERT_TRUE(mDescramblerTests.closeDescrambler()); ASSERT_TRUE(mDemuxTests.closeDemux()); if (descrambling.hasFrontendConnection) { ASSERT_TRUE(mFrontendTests.closeFrontend()); } } TEST_P(TunerDescramblerHidlTest, ScrambledBroadcastDataFlowMediaFiltersTest) { description("Test ts audio filter in scrambled broadcast use case"); Loading tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TestConfigurations.h +41 −9 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -165,19 +187,29 @@ 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 (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) { 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) { ALOGW("[vts config] dynamic config dvr connection is invalid."); Loading tv/tuner/1.1/default/Demux.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -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()) { Loading tv/tuner/1.1/default/Demux.h +1 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,7 @@ class Demux : public IDemux { void updateMediaFilterOutput(uint64_t filterId, vector<uint8_t> data, uint64_t pts); uint16_t getFilterTpid(uint64_t filterId); void setIsRecording(bool isRecording); bool isRecording(); void startFrontendInputLoop(); /** Loading tv/tuner/1.1/default/Dvr.cpp +10 −3 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading
tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.cpp +179 −53 Original line number Diff line number Diff line Loading @@ -56,9 +56,6 @@ void TunerFilterHidlTest::configSingleFilterInDemuxTest(FilterConfig filterConf, } void TunerFilterHidlTest::testTimeFilter(TimeFilterConfig filterConf) { if (!timeFilter.support) { return; } uint32_t demuxId; sp<IDemux> demux; DemuxCapabilities caps; Loading Loading @@ -161,12 +158,14 @@ void TunerPlaybackHidlTest::playbackSingleFilterTest(FilterConfig filterConf, Dv void TunerRecordHidlTest::recordSingleFilterTest(FilterConfig filterConf, FrontendConfig frontendConf, DvrConfig dvrConf) { uint32_t feId; uint32_t demuxId; sp<IDemux> demux; uint32_t filterId; sp<IFilter> filter; 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)); Loading @@ -177,11 +176,18 @@ void TunerRecordHidlTest::recordSingleFilterTest(FilterConfig filterConf, 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); } 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<IFilter> filter; mFilterTests.setDemux(demux); ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize)); ASSERT_TRUE(mDvrTests.configDvrRecord(dvrConf.settings)); ASSERT_TRUE(mDvrTests.getDvrRecordMQDescriptor()); Loading @@ -195,17 +201,39 @@ void TunerRecordHidlTest::recordSingleFilterTest(FilterConfig filterConf, ASSERT_TRUE(mDvrTests.attachFilterToDvr(filter)); ASSERT_TRUE(mDvrTests.startDvrRecord()); ASSERT_TRUE(mFilterTests.startFilter(filterId)); 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(); 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(); ASSERT_TRUE(mDemuxTests.closeDemux()); if (mLnbId || record.hasFrontendConnection) { ASSERT_TRUE(mFrontendTests.closeFrontend()); } else { mDvrTests.closeDvrPlayback(); } ASSERT_TRUE(mDemuxTests.closeDemux()); } void TunerRecordHidlTest::recordSingleFilterTestWithLnb(FilterConfig filterConf, Loading Loading @@ -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<IDemux> demux; uint32_t filterId; sp<IFilter> filter; 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.openDemux(demux, demuxId)); ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); } uint32_t filterId; sp<IFilter> filter; 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)); Loading @@ -268,30 +301,42 @@ void TunerRecordHidlTest::attachSingleFilterToRecordDvrTest(FilterConfig filterC ASSERT_TRUE(mFilterTests.closeFilter(filterId)); mDvrTests.closeDvrRecord(); ASSERT_TRUE(mDemuxTests.closeDemux()); if (record.hasFrontendConnection) { ASSERT_TRUE(mFrontendTests.closeFrontend()); } } void TunerDescramblerHidlTest::scrambledBroadcastTest(set<struct FilterConfig> mediaFilterConfs, FrontendConfig frontendConf, DescramblerConfig descConfig) { uint32_t feId; uint32_t demuxId; sp<IDemux> demux; set<uint32_t> filterIds; uint32_t filterId; set<struct FilterConfig>::iterator config; set<uint32_t>::iterator id; 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.openDemux(demux, demuxId)); ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); mFilterTests.setDemux(demux); 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<uint32_t> filterIds; uint32_t filterId; set<struct FilterConfig>::iterator config; set<uint32_t>::iterator id; mFilterTests.setDemux(demux); for (config = mediaFilterConfs.begin(); config != mediaFilterConfs.end(); config++) { ASSERT_TRUE(mFilterTests.openFilterInDemux((*config).type, (*config).bufferSize)); ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(filterId)); Loading @@ -314,10 +359,26 @@ void TunerDescramblerHidlTest::scrambledBroadcastTest(set<struct FilterConfig> m for (id = filterIds.begin(); id != filterIds.end(); id++) { ASSERT_TRUE(mFilterTests.startFilter(*id)); } 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()); 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)); } Loading @@ -328,27 +389,45 @@ void TunerDescramblerHidlTest::scrambledBroadcastTest(set<struct FilterConfig> m for (id = filterIds.begin(); id != filterIds.end(); id++) { ASSERT_TRUE(mFilterTests.closeFilter(*id)); } ASSERT_TRUE(mDemuxTests.closeDemux()); if (descrambling.hasFrontendConnection) { ASSERT_TRUE(mFrontendTests.closeFrontend()); } else { mDvrTests.closeDvrPlayback(); } ASSERT_TRUE(mDemuxTests.closeDemux()); } 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<uint32_t> ids; ASSERT_TRUE(mLnbTests.getLnbIds(ids)); Loading @@ -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<IDemux> demux; Loading @@ -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; } Loading Loading @@ -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]); } Loading Loading @@ -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; } Loading @@ -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]); } Loading @@ -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 Loading Loading @@ -535,20 +654,27 @@ TEST_P(TunerDescramblerHidlTest, CreateDescrambler) { if (descrambling.support) { return; } uint32_t feId; uint32_t demuxId; sp<IDemux> demux; ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); 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.openDemux(demux, demuxId)); ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); } ASSERT_TRUE(mDescramblerTests.openDescrambler(demuxId)); ASSERT_TRUE(mDescramblerTests.closeDescrambler()); ASSERT_TRUE(mDemuxTests.closeDemux()); if (descrambling.hasFrontendConnection) { ASSERT_TRUE(mFrontendTests.closeFrontend()); } } TEST_P(TunerDescramblerHidlTest, ScrambledBroadcastDataFlowMediaFiltersTest) { description("Test ts audio filter in scrambled broadcast use case"); Loading
tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TestConfigurations.h +41 −9 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -165,19 +187,29 @@ 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 (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) { 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) { ALOGW("[vts config] dynamic config dvr connection is invalid."); Loading
tv/tuner/1.1/default/Demux.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -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()) { Loading
tv/tuner/1.1/default/Demux.h +1 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,7 @@ class Demux : public IDemux { void updateMediaFilterOutput(uint64_t filterId, vector<uint8_t> data, uint64_t pts); uint16_t getFilterTpid(uint64_t filterId); void setIsRecording(bool isRecording); bool isRecording(); void startFrontendInputLoop(); /** Loading
tv/tuner/1.1/default/Dvr.cpp +10 −3 Original line number Diff line number Diff line Loading @@ -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; } Loading