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()) {