From e50f08d05f4795006d4e5dc3a4eeb0ad7dc9446e Mon Sep 17 00:00:00 2001 From: Amy Zhang Date: Tue, 30 Mar 2021 15:56:02 -0700 Subject: [PATCH] Add dvr dynamic configuration into Tuner 1.0 VTS Test: atest VtsHalTvTunerV1_0TargetTest Bug: 182519645 CTS-Coverage-Bug: 184077478 Change-Id: I04ef708064179e62c0c7b8c790fe844543b3eac8 --- .../VtsHalTvTunerV1_0TargetTest.cpp | 91 ++++------------- .../functional/VtsHalTvTunerV1_0TargetTest.h | 2 +- .../VtsHalTvTunerV1_0TestConfigurations.h | 83 ++++++++-------- tv/tuner/config/OWNERS | 4 + tv/tuner/config/TunerTestingConfigReader.h | 97 +++++++++++++++++- tv/tuner/config/api/current.txt | 69 +++++++++++++ tv/tuner/config/sample_tuner_vts_config.xml | 41 +++++++- .../tuner_testing_dynamic_configuration.xsd | 99 ++++++++++++++++++- 8 files changed, 360 insertions(+), 126 deletions(-) create mode 100644 tv/tuner/config/OWNERS diff --git a/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.cpp b/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.cpp index 92996f9dc7..5fbdd2df0c 100644 --- a/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.cpp +++ b/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.cpp @@ -86,17 +86,14 @@ void TunerBroadcastHidlTest::broadcastSingleFilterTest(FilterConfig filterConf, uint32_t filterId; mFrontendTests.getFrontendIdByType(frontendConf.type, feId); - if (feId == INVALID_ID) { - // TODO broadcast test on Cuttlefish needs licensed ts input, - // these tests are runnable on vendor device with real frontend module - // or with manual ts installing and use DVBT frontend. - return; - } ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); ASSERT_TRUE(mFrontendTests.setFrontendCallback()); if (mLnbId) { ASSERT_TRUE(mFrontendTests.setLnb(*mLnbId)); } + if (frontendConf.isSoftwareFe) { + mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[live.dvrSoftwareFeId]); + } ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); mFrontendTests.setDemux(demux); @@ -178,6 +175,9 @@ void TunerRecordHidlTest::recordSingleFilterTest(FilterConfig filterConf, 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); @@ -279,14 +279,11 @@ void TunerDescramblerHidlTest::scrambledBroadcastTest(set m set::iterator id; mFrontendTests.getFrontendIdByType(frontendConf.type, feId); - if (feId == INVALID_ID) { - // TODO broadcast test on Cuttlefish needs licensed ts input, - // these tests are runnable on vendor device with real frontend module - // or with manual ts installing and use DVBT frontend. - return; - } 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); @@ -301,7 +298,7 @@ void TunerDescramblerHidlTest::scrambledBroadcastTest(set m TunerKeyToken token; ASSERT_TRUE(mDescramblerTests.getKeyToken(descConfig.casSystemId, descConfig.provisionStr, descConfig.hidlPvtData, token)); - ASSERT_TRUE(mDescramblerTests.setKeyToken(token)); + mDescramblerTests.setKeyToken(token); vector pids; DemuxPid pid; for (config = mediaFilterConfs.begin(); config != mediaFilterConfs.end(); config++) { @@ -497,66 +494,12 @@ TEST_P(TunerBroadcastHidlTest, LnbBroadcastDataFlowVideoFilterTest) { broadcastSingleFilterTest(filterArray[TS_VIDEO0], frontendMap[live.frontendId]); } -TEST_P(TunerBroadcastHidlTest, BroadcastEsDataFlowMediaFiltersTest) { - description("Test Meida Filters functionality in Broadcast use case with ES input."); - uint32_t feId; - uint32_t demuxId; - sp demux; - uint32_t filterId; - - mFrontendTests.getFrontendIdByType(frontendMap[live.frontendId].type, feId); - if (feId == INVALID_ID) { - // TODO broadcast test on Cuttlefish needs licensed ts input, - // these tests are runnable on vendor device with real frontend module - // or with manual ts installing and use defaultFrontend frontend. - return; - } - ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); - ASSERT_TRUE(mFrontendTests.setFrontendCallback()); - ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); - ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); - mFrontendTests.setDemux(demux); - mFilterTests.setDemux(demux); - ASSERT_TRUE(mFilterTests.openFilterInDemux(filterArray[TS_AUDIO1].type, - filterArray[TS_AUDIO1].bufferSize)); - ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(filterId)); - ASSERT_TRUE(mFilterTests.configFilter(filterArray[TS_AUDIO1].settings, filterId)); - ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterArray[TS_AUDIO1].getMqDesc)); - ASSERT_TRUE(mFilterTests.startFilter(filterId)); - ASSERT_TRUE(mFilterTests.openFilterInDemux(filterArray[TS_VIDEO1].type, - filterArray[TS_VIDEO1].bufferSize)); - ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(filterId)); - ASSERT_TRUE(mFilterTests.configFilter(filterArray[TS_VIDEO1].settings, filterId)); - ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterArray[TS_VIDEO1].getMqDesc)); - ASSERT_TRUE(mFilterTests.startFilter(filterId)); - // tune test - // TODO: replace with customized dvr input - PlaybackSettings playbackSettings{ - .statusMask = 0xf, - .lowThreshold = 0x1000, - .highThreshold = 0x07fff, - .dataFormat = DataFormat::ES, - .packetSize = 188, - }; - DvrConfig dvrConfig{ - .type = DvrType::PLAYBACK, - .playbackInputFile = "/data/local/tmp/test.es", - .bufferSize = FMQ_SIZE_4M, - }; - dvrConfig.settings.playback(playbackSettings); - mFrontendTests.setSoftwareFrontendDvrConfig(dvrConfig); - ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendMap[live.frontendId], true /*testWithDemux*/)); - ASSERT_TRUE(filterDataOutputTest()); - ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/)); - ASSERT_TRUE(mFilterTests.stopFilter(filterId)); - ASSERT_TRUE(mFilterTests.closeFilter(filterId)); - ASSERT_TRUE(mDemuxTests.closeDemux()); - ASSERT_TRUE(mFrontendTests.closeFrontend()); -} - TEST_P(TunerPlaybackHidlTest, PlaybackDataFlowWithTsSectionFilterTest) { description("Feed ts data from playback and configure Ts section filter to get output"); - playbackSingleFilterTest(filterArray[TS_SECTION0], dvrArray[DVR_PLAYBACK0]); + if (!playback.support) { + return; + } + playbackSingleFilterTest(filterArray[TS_SECTION0], dvrMap[playback.dvrId]); } TEST_P(TunerRecordHidlTest, AttachFiltersToRecordTest) { @@ -566,7 +509,7 @@ TEST_P(TunerRecordHidlTest, AttachFiltersToRecordTest) { return; } attachSingleFilterToRecordDvrTest(filterArray[TS_RECORD0], frontendMap[record.frontendId], - dvrArray[DVR_RECORD0]); + dvrMap[record.dvrRecordId]); } TEST_P(TunerRecordHidlTest, RecordDataFlowWithTsRecordFilterTest) { @@ -575,7 +518,7 @@ TEST_P(TunerRecordHidlTest, RecordDataFlowWithTsRecordFilterTest) { return; } recordSingleFilterTest(filterArray[TS_RECORD0], frontendMap[record.frontendId], - dvrArray[DVR_RECORD0]); + dvrMap[record.dvrRecordId]); } TEST_P(TunerRecordHidlTest, LnbRecordDataFlowWithTsRecordFilterTest) { @@ -584,7 +527,7 @@ TEST_P(TunerRecordHidlTest, LnbRecordDataFlowWithTsRecordFilterTest) { return; } recordSingleFilterTestWithLnb(filterArray[TS_RECORD0], frontendMap[lnbRecord.frontendId], - dvrArray[DVR_RECORD0], lnbArray[LNB0]); + dvrMap[record.dvrRecordId], lnbArray[LNB0]); } TEST_P(TunerDescramblerHidlTest, CreateDescrambler) { diff --git a/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.h b/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.h index d1f6a45366..9723c2d645 100644 --- a/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.h +++ b/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.h @@ -33,6 +33,7 @@ bool initConfiguration() { return false; } initFrontendConfig(); + initDvrConfig(); connectHardwaresToTestCases(); if (!validateConnections()) { ALOGW("[vts] failed to validate connections."); @@ -42,7 +43,6 @@ bool initConfiguration() { initLnbConfig(); initFilterConfig(); initTimeFilterConfig(); - initDvrConfig(); initDescramblerConfig(); return true; diff --git a/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TestConfigurations.h b/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TestConfigurations.h index 384455bc74..a1c5cd9aa2 100644 --- a/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TestConfigurations.h +++ b/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TestConfigurations.h @@ -114,12 +114,6 @@ typedef enum { DISEQC_MAX, } Diseqc; -typedef enum { - DVR_RECORD0, - DVR_PLAYBACK0, - DVR_MAX, -} Dvr; - typedef enum { DESC_0, DESC_MAX, @@ -147,13 +141,6 @@ struct LnbConfig { LnbPosition position; }; -struct DvrConfig { - DvrType type; - uint32_t bufferSize; - DvrSettings settings; - string playbackInputFile; -}; - struct DescramblerConfig { uint32_t casSystemId; string provisionStr; @@ -166,24 +153,25 @@ static vector diseqcMsgArray[DISEQC_MAX]; static FilterConfig filterArray[FILTER_MAX]; static TimeFilterConfig timeFilterArray[TIMER_MAX]; static DemuxFilterType filterLinkageTypes[LINKAGE_DIR][FILTER_MAIN_TYPE_BIT_COUNT]; -static DvrConfig dvrArray[DVR_MAX]; static DescramblerConfig descramblerArray[DESC_MAX]; // Hardware configs static map frontendMap; +static map dvrMap; // Hardware and test cases connections static LiveBroadcastHardwareConnections live; static ScanHardwareConnections scan; +static DvrPlaybackHardwareConnections playback; static DvrRecordHardwareConnections record; static DescramblingHardwareConnections descrambling; static LnbLiveHardwareConnections lnbLive; static LnbRecordHardwareConnections lnbRecord; -/** Configuration array for the frontend tune test */ +/** Config all the frontends that would be used in the tests */ inline void initFrontendConfig() { - // The test will use the internal default fe is default fe is connected to any data flow without - // overriding in the xml config. + // The test will use the internal default fe when default fe is connected to any data flow + // without overriding in the xml config. string defaultFeId = "FE_DEFAULT"; FrontendDvbtSettings dvbtSettings{ .frequency = 578000, @@ -208,10 +196,17 @@ inline void initFrontendConfig() { TunerTestingConfigReader::readFrontendConfig1_0(frontendMap); }; +/** Config all the dvrs that would be used in the tests */ +inline void initDvrConfig() { + // Read customized config + TunerTestingConfigReader::readDvrConfig1_0(dvrMap); +}; + /** Read the vendor configurations of which hardware to use for each test cases/data flows */ inline void connectHardwaresToTestCases() { TunerTestingConfigReader::connectLiveBroadcast(live); TunerTestingConfigReader::connectScan(scan); + TunerTestingConfigReader::connectDvrPlayback(playback); TunerTestingConfigReader::connectDvrRecord(record); TunerTestingConfigReader::connectDescrambling(descrambling); TunerTestingConfigReader::connectLnbLive(lnbLive); @@ -228,7 +223,34 @@ inline bool validateConnections() { feIsValid &= lnbLive.support ? frontendMap.find(lnbLive.frontendId) != frontendMap.end() : true; feIsValid &= lnbRecord.support ? frontendMap.find(lnbRecord.frontendId) != frontendMap.end() : true; - return feIsValid; + + if (!feIsValid) { + ALOGW("[vts config] dynamic config fe connection is invalid."); + return false; + } + + bool dvrIsValid = 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(); + } + dvrIsValid &= dvrMap.find(record.dvrRecordId) != dvrMap.end(); + } + + if (descrambling.support && frontendMap[descrambling.frontendId].isSoftwareFe) { + dvrIsValid &= dvrMap.find(descrambling.dvrSoftwareFeId) != dvrMap.end(); + } + + if (!dvrIsValid) { + ALOGW("[vts config] dynamic config dvr connection is invalid."); + return false; + } + + return true; } // TODO: remove all the manual configs after the dynamic config refactoring is done. @@ -341,31 +363,6 @@ inline void initTimeFilterConfig() { timeFilterArray[TIMER0].timeStamp = 1; } -/** Configuration array for the dvr test */ -inline void initDvrConfig() { - RecordSettings recordSettings{ - .statusMask = 0xf, - .lowThreshold = 0x1000, - .highThreshold = 0x07fff, - .dataFormat = DataFormat::TS, - .packetSize = 188, - }; - dvrArray[DVR_RECORD0].type = DvrType::RECORD; - dvrArray[DVR_RECORD0].bufferSize = FMQ_SIZE_4M; - dvrArray[DVR_RECORD0].settings.record(recordSettings); - PlaybackSettings playbackSettings{ - .statusMask = 0xf, - .lowThreshold = 0x1000, - .highThreshold = 0x07fff, - .dataFormat = DataFormat::TS, - .packetSize = 188, - }; - dvrArray[DVR_PLAYBACK0].type = DvrType::PLAYBACK; - dvrArray[DVR_PLAYBACK0].playbackInputFile = "/data/local/tmp/segment000000.ts"; - dvrArray[DVR_PLAYBACK0].bufferSize = FMQ_SIZE_4M; - dvrArray[DVR_PLAYBACK0].settings.playback(playbackSettings); -}; - /** Configuration array for the descrambler test */ inline void initDescramblerConfig() { descramblerArray[DESC_0].casSystemId = CLEAR_KEY_SYSTEM_ID; diff --git a/tv/tuner/config/OWNERS b/tv/tuner/config/OWNERS new file mode 100644 index 0000000000..1b3d095f9c --- /dev/null +++ b/tv/tuner/config/OWNERS @@ -0,0 +1,4 @@ +nchalko@google.com +amyjojo@google.com +shubang@google.com +quxiangfang@google.com diff --git a/tv/tuner/config/TunerTestingConfigReader.h b/tv/tuner/config/TunerTestingConfigReader.h index 5c7f5648d3..aa2b75c1de 100644 --- a/tv/tuner/config/TunerTestingConfigReader.h +++ b/tv/tuner/config/TunerTestingConfigReader.h @@ -70,8 +70,16 @@ struct FrontendConfig { vector expectTuneStatuses; }; +struct DvrConfig { + DvrType type; + uint32_t bufferSize; + DvrSettings settings; + string playbackInputFile; +}; + struct LiveBroadcastHardwareConnections { string frontendId; + string dvrSoftwareFeId; /* string audioFilterId; string videoFilterId; list string of extra filters; */ @@ -81,9 +89,20 @@ struct ScanHardwareConnections { string frontendId; }; +struct DvrPlaybackHardwareConnections { + bool support; + string frontendId; + string dvrId; + /* string audioFilterId; + string videoFilterId; + list string of extra filters; */ +}; + struct DvrRecordHardwareConnections { bool support; string frontendId; + string dvrRecordId; + string dvrSoftwareFeId; /* string recordFilterId; string dvrId; */ }; @@ -91,6 +110,7 @@ struct DvrRecordHardwareConnections { struct DescramblingHardwareConnections { bool support; string frontendId; + string dvrSoftwareFeId; /* string descramblerId; string audioFilterId; string videoFilterId; @@ -196,9 +216,41 @@ struct TunerTestingConfigReader { } } + static void readDvrConfig1_0(map& dvrMap) { + auto hardwareConfig = getHardwareConfig(); + if (hardwareConfig.hasDvrs()) { + auto dvrs = *hardwareConfig.getFirstDvrs(); + for (auto dvrConfig : dvrs.getDvr()) { + string id = dvrConfig.getId(); + DvrType type; + switch (dvrConfig.getType()) { + case DvrTypeEnum::PLAYBACK: + type = DvrType::PLAYBACK; + dvrMap[id].settings.playback(readPlaybackSettings(dvrConfig)); + break; + case DvrTypeEnum::RECORD: + type = DvrType::RECORD; + dvrMap[id].settings.record(readRecordSettings(dvrConfig)); + break; + case DvrTypeEnum::UNKNOWN: + ALOGW("[ConfigReader] invalid DVR type"); + return; + } + dvrMap[id].type = type; + dvrMap[id].bufferSize = static_cast(dvrConfig.getBufferSize()); + if (dvrConfig.hasInputFilePath()) { + dvrMap[id].playbackInputFile = dvrConfig.getInputFilePath(); + } + } + } + } + static void connectLiveBroadcast(LiveBroadcastHardwareConnections& live) { auto liveConfig = getDataFlowConfiguration().getFirstClearLiveBroadcast(); live.frontendId = liveConfig->getFrontendConnection(); + if (liveConfig->hasDvrSoftwareFeConnection()) { + live.dvrSoftwareFeId = liveConfig->getDvrSoftwareFeConnection(); + } } static void connectScan(ScanHardwareConnections& scan) { @@ -206,6 +258,16 @@ struct TunerTestingConfigReader { scan.frontendId = scanConfig->getFrontendConnection(); } + static void connectDvrPlayback(DvrPlaybackHardwareConnections& playback) { + auto dataFlow = getDataFlowConfiguration(); + if (!dataFlow.hasDvrPlayback()) { + playback.support = false; + return; + } + auto playbackConfig = dataFlow.getFirstDvrPlayback(); + playback.dvrId = playbackConfig->getDvrConnection(); + } + static void connectDvrRecord(DvrRecordHardwareConnections& record) { auto dataFlow = getDataFlowConfiguration(); if (!dataFlow.hasDvrRecord()) { @@ -214,6 +276,10 @@ struct TunerTestingConfigReader { } auto recordConfig = dataFlow.getFirstDvrRecord(); record.frontendId = recordConfig->getFrontendConnection(); + record.dvrRecordId = recordConfig->getDvrRecordConnection(); + if (recordConfig->hasDvrSoftwareFeConnection()) { + record.dvrSoftwareFeId = recordConfig->getDvrSoftwareFeConnection(); + } } static void connectDescrambling(DescramblingHardwareConnections& descrambling) { @@ -224,6 +290,9 @@ struct TunerTestingConfigReader { } auto descConfig = dataFlow.getFirstDescrambling(); descrambling.frontendId = descConfig->getFrontendConnection(); + if (descConfig->hasDvrSoftwareFeConnection()) { + descrambling.dvrSoftwareFeId = descConfig->getDvrSoftwareFeConnection(); + } } static void connectLnbLive(LnbLiveHardwareConnections& lnbLive) { @@ -248,7 +317,7 @@ struct TunerTestingConfigReader { private: static FrontendDvbtSettings readDvbtFrontendSettings(Frontend feConfig) { - ALOGW("[ConfigReader] type is dvbt"); + ALOGW("[ConfigReader] fe type is dvbt"); FrontendDvbtSettings dvbtSettings{ .frequency = (uint32_t)feConfig.getFrequency(), }; @@ -266,7 +335,7 @@ struct TunerTestingConfigReader { } static FrontendDvbsSettings readDvbsFrontendSettings(Frontend feConfig) { - ALOGW("[ConfigReader] type is dvbs"); + ALOGW("[ConfigReader] fe type is dvbs"); FrontendDvbsSettings dvbsSettings{ .frequency = (uint32_t)feConfig.getFrequency(), }; @@ -281,6 +350,30 @@ struct TunerTestingConfigReader { return dvbsSettings; } + static PlaybackSettings readPlaybackSettings(Dvr dvrConfig) { + ALOGW("[ConfigReader] dvr type is playback"); + PlaybackSettings playbackSettings{ + .statusMask = static_cast(dvrConfig.getStatusMask()), + .lowThreshold = static_cast(dvrConfig.getLowThreshold()), + .highThreshold = static_cast(dvrConfig.getHighThreshold()), + .dataFormat = static_cast(dvrConfig.getDataFormat()), + .packetSize = static_cast(dvrConfig.getPacketSize()), + }; + return playbackSettings; + } + + static RecordSettings readRecordSettings(Dvr dvrConfig) { + ALOGW("[ConfigReader] dvr type is record"); + RecordSettings recordSettings{ + .statusMask = static_cast(dvrConfig.getStatusMask()), + .lowThreshold = static_cast(dvrConfig.getLowThreshold()), + .highThreshold = static_cast(dvrConfig.getHighThreshold()), + .dataFormat = static_cast(dvrConfig.getDataFormat()), + .packetSize = static_cast(dvrConfig.getPacketSize()), + }; + return recordSettings; + } + static TunerConfiguration getTunerConfig() { return *read(configFilePath.c_str()); } static HardwareConfiguration getHardwareConfig() { diff --git a/tv/tuner/config/api/current.txt b/tv/tuner/config/api/current.txt index b0f410d25e..1ebd8e1494 100644 --- a/tv/tuner/config/api/current.txt +++ b/tv/tuner/config/api/current.txt @@ -5,12 +5,14 @@ package android.media.tuner.testing.configuration.V1_0 { ctor public DataFlowConfiguration(); method @Nullable public android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.ClearLiveBroadcast getClearLiveBroadcast(); method @Nullable public android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.Descrambling getDescrambling(); + method @Nullable public android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.DvrPlayback getDvrPlayback(); method @Nullable public android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.DvrRecord getDvrRecord(); method @Nullable public android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.LnbLive getLnbLive(); method @Nullable public android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.LnbRecord getLnbRecord(); method @Nullable public android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.Scan getScan(); method public void setClearLiveBroadcast(@Nullable android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.ClearLiveBroadcast); method public void setDescrambling(@Nullable android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.Descrambling); + method public void setDvrPlayback(@Nullable android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.DvrPlayback); method public void setDvrRecord(@Nullable android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.DvrRecord); method public void setLnbLive(@Nullable android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.LnbLive); method public void setLnbRecord(@Nullable android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.LnbRecord); @@ -19,19 +21,33 @@ package android.media.tuner.testing.configuration.V1_0 { public static class DataFlowConfiguration.ClearLiveBroadcast { ctor public DataFlowConfiguration.ClearLiveBroadcast(); + method @Nullable public String getDvrSoftwareFeConnection(); method @Nullable public String getFrontendConnection(); + method public void setDvrSoftwareFeConnection(@Nullable String); method public void setFrontendConnection(@Nullable String); } public static class DataFlowConfiguration.Descrambling { ctor public DataFlowConfiguration.Descrambling(); + method @Nullable public String getDvrSoftwareFeConnection(); method @Nullable public String getFrontendConnection(); + method public void setDvrSoftwareFeConnection(@Nullable String); method public void setFrontendConnection(@Nullable String); } + public static class DataFlowConfiguration.DvrPlayback { + ctor public DataFlowConfiguration.DvrPlayback(); + method @Nullable public String getDvrConnection(); + method public void setDvrConnection(@Nullable String); + } + public static class DataFlowConfiguration.DvrRecord { ctor public DataFlowConfiguration.DvrRecord(); + method @Nullable public String getDvrRecordConnection(); + method @Nullable public String getDvrSoftwareFeConnection(); method @Nullable public String getFrontendConnection(); + method public void setDvrRecordConnection(@Nullable String); + method public void setDvrSoftwareFeConnection(@Nullable String); method public void setFrontendConnection(@Nullable String); } @@ -43,7 +59,9 @@ package android.media.tuner.testing.configuration.V1_0 { public static class DataFlowConfiguration.LnbRecord { ctor public DataFlowConfiguration.LnbRecord(); + method @Nullable public String getDvrRecordConnection(); method @Nullable public String getFrontendConnection(); + method public void setDvrRecordConnection(@Nullable String); method public void setFrontendConnection(@Nullable String); } @@ -71,6 +89,50 @@ package android.media.tuner.testing.configuration.V1_0 { method public void setTransmissionMode(@Nullable java.math.BigInteger); } + public class Dvr { + ctor public Dvr(); + method @Nullable public java.math.BigInteger getBufferSize(); + method @Nullable public android.media.tuner.testing.configuration.V1_0.DvrDataFormatEnum getDataFormat(); + method @Nullable public java.math.BigInteger getHighThreshold(); + method @Nullable public String getId(); + method @Nullable public String getInputFilePath(); + method @Nullable public java.math.BigInteger getLowThreshold(); + method @Nullable public java.math.BigInteger getPacketSize(); + method @Nullable public java.math.BigInteger getStatusMask(); + method @Nullable public android.media.tuner.testing.configuration.V1_0.DvrTypeEnum getType(); + method public void setBufferSize(@Nullable java.math.BigInteger); + method public void setDataFormat(@Nullable android.media.tuner.testing.configuration.V1_0.DvrDataFormatEnum); + method public void setHighThreshold(@Nullable java.math.BigInteger); + method public void setId(@Nullable String); + method public void setInputFilePath(@Nullable String); + method public void setLowThreshold(@Nullable java.math.BigInteger); + method public void setPacketSize(@Nullable java.math.BigInteger); + method public void setStatusMask(@Nullable java.math.BigInteger); + method public void setType(@Nullable android.media.tuner.testing.configuration.V1_0.DvrTypeEnum); + } + + public enum DvrDataFormatEnum { + method @NonNull public String getRawName(); + enum_constant public static final android.media.tuner.testing.configuration.V1_0.DvrDataFormatEnum ES; + enum_constant public static final android.media.tuner.testing.configuration.V1_0.DvrDataFormatEnum PES; + enum_constant public static final android.media.tuner.testing.configuration.V1_0.DvrDataFormatEnum SHV_TLV; + enum_constant public static final android.media.tuner.testing.configuration.V1_0.DvrDataFormatEnum TS; + } + + public enum DvrStatusEnum { + method @NonNull public String getRawName(); + enum_constant public static final android.media.tuner.testing.configuration.V1_0.DvrStatusEnum DATA_READY; + enum_constant public static final android.media.tuner.testing.configuration.V1_0.DvrStatusEnum HIGH_WATER; + enum_constant public static final android.media.tuner.testing.configuration.V1_0.DvrStatusEnum LOW_WATER; + enum_constant public static final android.media.tuner.testing.configuration.V1_0.DvrStatusEnum OVERFLOW; + } + + public enum DvrTypeEnum { + method @NonNull public String getRawName(); + enum_constant public static final android.media.tuner.testing.configuration.V1_0.DvrTypeEnum PLAYBACK; + enum_constant public static final android.media.tuner.testing.configuration.V1_0.DvrTypeEnum RECORD; + } + public class Frontend { ctor public Frontend(); method @Nullable public java.math.BigInteger getConnectToCicamId(); @@ -108,10 +170,17 @@ package android.media.tuner.testing.configuration.V1_0 { public class HardwareConfiguration { ctor public HardwareConfiguration(); + method @Nullable public android.media.tuner.testing.configuration.V1_0.HardwareConfiguration.Dvrs getDvrs(); method @Nullable public android.media.tuner.testing.configuration.V1_0.HardwareConfiguration.Frontends getFrontends(); + method public void setDvrs(@Nullable android.media.tuner.testing.configuration.V1_0.HardwareConfiguration.Dvrs); method public void setFrontends(@Nullable android.media.tuner.testing.configuration.V1_0.HardwareConfiguration.Frontends); } + public static class HardwareConfiguration.Dvrs { + ctor public HardwareConfiguration.Dvrs(); + method @Nullable public java.util.List getDvr(); + } + public static class HardwareConfiguration.Frontends { ctor public HardwareConfiguration.Frontends(); method @Nullable public java.util.List getFrontend(); diff --git a/tv/tuner/config/sample_tuner_vts_config.xml b/tv/tuner/config/sample_tuner_vts_config.xml index c4080d9ac7..001e04574e 100644 --- a/tv/tuner/config/sample_tuner_vts_config.xml +++ b/tv/tuner/config/sample_tuner_vts_config.xml @@ -60,16 +60,49 @@ connectToCicamId="0" frequency="578000" endFrequency="800000"> + + + + + + - + - - + + - + diff --git a/tv/tuner/config/tuner_testing_dynamic_configuration.xsd b/tv/tuner/config/tuner_testing_dynamic_configuration.xsd index cd8b061309..45d25e5999 100644 --- a/tv/tuner/config/tuner_testing_dynamic_configuration.xsd +++ b/tv/tuner/config/tuner_testing_dynamic_configuration.xsd @@ -99,14 +99,80 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Each dvr element contain the following attributes: + "id": unique id of the dvr that could be used to connect to the test the + "dataFlowConfiguration" + "type": the dvr type. + "bufferSize": the dvr buffer size. + "statusMask": register callbacks of specific status. + "lowThreshold": the dvr status low threshold. + "highThreshold": the dvr status high threshold. + "dataFormat": the dvr data format. + "packetSize": the dvr packet size. + "inputFilePath": the dvr playback input file path. Only required in playback + dvr. + + + + + + + + + + + + + @@ -131,6 +197,23 @@ + + + + + This section contains configurations of all the dvrs that would be used + in the tests. + - This section is optional and can be skipped if the device does + not support dvr. + - The users can configure 1 or more dvr elements in the dvrs + sections. + + + + + + + @@ -139,8 +222,9 @@ - + + @@ -151,11 +235,21 @@ + + + + + + + + + + @@ -166,6 +260,7 @@ +