From f4e0796ef34e596d527239ce94274b61187a9cc9 Mon Sep 17 00:00:00 2001 From: Frankie Lizcano Date: Wed, 13 Jul 2022 20:54:34 +0000 Subject: [PATCH] Improve Tuner VTS: Generate Descrambling Combos This CL allows the VTS to read a vendor's configuration file, determine if the given devices could support the Descrambling dataflow, and generate all combinations of units to run them on corresponding integration tests. Each combination is error checked to ensure they meet the minumum requirements, and any invalid ones are discared, which may narrow the combination space immensely. Bug: b/182519645 Test: vts-tradefed run vts --module VtsHalTvTunerTargetTest. Manual tests with different input configuration files. Change-Id: Ic1b9dae6b43f8f01bc4e490ef9e910a933562bd2 --- .../functional/VtsHalTvTunerTargetTest.cpp | 60 +++++++++----- .../vts/functional/VtsHalTvTunerTargetTest.h | 1 + .../VtsHalTvTunerTestConfigurations.h | 81 +++++++++++++++++++ .../config/TunerTestingConfigAidlReaderV1_0.h | 2 + 4 files changed, 123 insertions(+), 21 deletions(-) diff --git a/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.cpp b/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.cpp index a6c523f3de..e6c66911d8 100644 --- a/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.cpp +++ b/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.cpp @@ -1073,25 +1073,34 @@ TEST_P(TunerDescramblerAidlTest, CreateDescrambler) { if (!descrambling.support) { return; } - int32_t demuxId; - std::shared_ptr demux; - ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); - - if (descrambling.hasFrontendConnection) { - int32_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)); + vector descrambling_configs = + generateDescramblingConfigurations(); + if (descrambling_configs.empty()) { + ALOGD("No valid descrambling combinations in the configuration file."); + return; } + for (auto& combination : descrambling_configs) { + descrambling = combination; + int32_t demuxId; + std::shared_ptr demux; + ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); - ASSERT_TRUE(mDescramblerTests.openDescrambler(demuxId)); - ASSERT_TRUE(mDescramblerTests.closeDescrambler()); - ASSERT_TRUE(mDemuxTests.closeDemux()); + if (descrambling.hasFrontendConnection) { + int32_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)); + } - if (descrambling.hasFrontendConnection) { - ASSERT_TRUE(mFrontendTests.closeFrontend()); + ASSERT_TRUE(mDescramblerTests.openDescrambler(demuxId)); + ASSERT_TRUE(mDescramblerTests.closeDescrambler()); + ASSERT_TRUE(mDemuxTests.closeDemux()); + + if (descrambling.hasFrontendConnection) { + ASSERT_TRUE(mFrontendTests.closeFrontend()); + } } } @@ -1100,11 +1109,20 @@ TEST_P(TunerDescramblerAidlTest, ScrambledBroadcastDataFlowMediaFiltersTest) { if (!descrambling.support) { return; } - set filterConfs; - filterConfs.insert(static_cast(filterMap[descrambling.audioFilterId])); - filterConfs.insert(static_cast(filterMap[descrambling.videoFilterId])); - scrambledBroadcastTest(filterConfs, frontendMap[descrambling.frontendId], - descramblerMap[descrambling.descramblerId]); + vector descrambling_configs = + generateDescramblingConfigurations(); + if (descrambling_configs.empty()) { + ALOGD("No valid descrambling combinations in the configuration file."); + return; + } + for (auto& combination : descrambling_configs) { + descrambling = combination; + set filterConfs; + filterConfs.insert(static_cast(filterMap[descrambling.audioFilterId])); + filterConfs.insert(static_cast(filterMap[descrambling.videoFilterId])); + scrambledBroadcastTest(filterConfs, frontendMap[descrambling.frontendId], + descramblerMap[descrambling.descramblerId]); + } } INSTANTIATE_TEST_SUITE_P(PerInstance, TunerBroadcastAidlTest, diff --git a/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.h b/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.h index d6b852f62a..6ffa18f5bd 100644 --- a/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.h +++ b/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.h @@ -69,6 +69,7 @@ void clearIds() { diseqcMsgs.clear(); frontendIds.clear(); recordDvrIds.clear(); + descramblerIds.clear(); audioFilterIds.clear(); videoFilterIds.clear(); playbackDvrIds.clear(); diff --git a/tv/tuner/aidl/vts/functional/VtsHalTvTunerTestConfigurations.h b/tv/tuner/aidl/vts/functional/VtsHalTvTunerTestConfigurations.h index bcc8c61e0d..de12dc0efa 100644 --- a/tv/tuner/aidl/vts/functional/VtsHalTvTunerTestConfigurations.h +++ b/tv/tuner/aidl/vts/functional/VtsHalTvTunerTestConfigurations.h @@ -297,6 +297,87 @@ static inline vector generateLnbRecordConfiguratio return lnbRecord_configs; } +/* + * index 0 - decramblers + * index 1 - frontends + * index 2 - audio filters + * index 3 - video filters + * index 4 - Dvr SW Fe Connections + * index 5 - DVR Source Connections + */ +static inline vector generateDescramblingCombinations() { + vector combinations; + vector mfrontendIds = frontendIds; + vector mDvrFeConnectionIds = playbackDvrIds; + vector mDvrSourceConnectionIds = playbackDvrIds; + + // Add the empty hardware id to each vector to include combinations where these 3 fields might + // be optional + mfrontendIds.push_back(emptyHardwareId); + mDvrFeConnectionIds.push_back(emptyHardwareId); + mDvrSourceConnectionIds.push_back(emptyHardwareId); + + const int descramblerIndex = 0; + const int frontendIndex = 1; + const int audioFilterIndex = 2; + const int videoFilterIndex = 3; + const int dvrFeIdIndex = 4; + const int dvrSourceIdIndex = 5; + + vector> deviceIds{descramblerIds, mfrontendIds, audioFilterIds, + videoFilterIds, mDvrFeConnectionIds, mDvrSourceConnectionIds}; + auto idCombinations = generateIdCombinations(deviceIds); + for (auto& combo : idCombinations) { + DescramblingHardwareConnections mDescrambling; + const string feId = combo[frontendIndex]; + const string dvrSwFeId = combo[dvrFeIdIndex]; + const string dvrSourceId = combo[dvrSourceIdIndex]; + mDescrambling.hasFrontendConnection = feId.compare(emptyHardwareId) == 0 ? false : true; + if (!mDescrambling.hasFrontendConnection) { + if (dvrSourceId.compare(emptyHardwareId) == 0) { + // If combination does not have a frontend or dvr source connection, do not include + // it + continue; + } + } else { + if (frontendMap[feId].isSoftwareFe && dvrSwFeId.compare(emptyHardwareId) == 0) { + // If combination has a software frontend and no dvr->software frontend connection, + // do not include it + continue; + } + } + if (dvrSwFeId.compare(dvrSourceId) == 0) { + // If dvr->software frontend connection is the same as dvr source input to tuner, do not + // include it. + continue; + } + mDescrambling.frontendId = feId; + mDescrambling.audioFilterId = combo[audioFilterIndex]; + mDescrambling.videoFilterId = combo[videoFilterIndex]; + mDescrambling.dvrSoftwareFeId = dvrSwFeId; + mDescrambling.dvrSourceId = dvrSourceId; + mDescrambling.descramblerId = combo[descramblerIndex]; + combinations.push_back(mDescrambling); + } + + return combinations; +} + +static inline vector generateDescramblingConfigurations() { + vector descrambling_configs; + if (configuredDescrambling) { + ALOGD("Using Descrambling configuration provided."); + descrambling_configs = {descrambling}; + } else { + ALOGD("Descrambling not provided. Generating possible combinations. Consider adding it to " + "the " + "configuration file."); + descrambling_configs = generateDescramblingCombinations(); + } + + return descrambling_configs; +} + /** Config all the frontends that would be used in the tests */ inline void initFrontendConfig() { // The test will use the internal default fe when default fe is connected to any data flow diff --git a/tv/tuner/config/TunerTestingConfigAidlReaderV1_0.h b/tv/tuner/config/TunerTestingConfigAidlReaderV1_0.h index 31f07553d1..53246d38d8 100644 --- a/tv/tuner/config/TunerTestingConfigAidlReaderV1_0.h +++ b/tv/tuner/config/TunerTestingConfigAidlReaderV1_0.h @@ -87,6 +87,7 @@ static vector sectionFilterIds; static vector frontendIds; static vector lnbIds; static vector diseqcMsgs; +static vector descramblerIds; #define PROVISION_STR \ "{ " \ @@ -461,6 +462,7 @@ struct TunerTestingConfigAidlReader1_0 { auto descramblers = *hardwareConfig.getFirstDescramblers(); for (auto descramblerConfig : descramblers.getDescrambler()) { string id = descramblerConfig.getId(); + descramblerIds.push_back(id); descramblerMap[id].casSystemId = static_cast(descramblerConfig.getCasSystemId()); if (descramblerConfig.hasProvisionStr()) {