/* * Copyright 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include "../../../config/TunerTestingConfigAidlReaderV1_0.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using namespace aidl::android::hardware::tv::tuner; using namespace android::media::tuner::testing::configuration::V1_0; const int32_t FMQ_SIZE_4M = 0x400000; const int32_t FMQ_SIZE_16M = 0x1000000; const string configFilePath = "/vendor/etc/tuner_vts_config_aidl_V1.xml"; #define FILTER_MAIN_TYPE_BIT_COUNT 5 // Hardware configs static map frontendMap; static map filterMap; static map dvrMap; static map lnbMap; static map timeFilterMap; static map> diseqcMsgMap; static map descramblerMap; // 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; static TimeFilterHardwareConnections timeFilter; /** 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 // without overriding in the xml config. string defaultFeId = "FE_DEFAULT"; FrontendDvbtSettings dvbtSettings{ .frequency = 578000000, .transmissionMode = FrontendDvbtTransmissionMode::AUTO, .bandwidth = FrontendDvbtBandwidth::BANDWIDTH_8MHZ, .isHighPriority = true, }; frontendMap[defaultFeId].type = FrontendType::DVBT; frontendMap[defaultFeId].settings.set(dvbtSettings); vector types; types.push_back(FrontendStatusType::UEC); types.push_back(FrontendStatusType::IS_MISO); vector statuses; FrontendStatus status; status.set(4); statuses.push_back(status); status.set(true); statuses.push_back(status); frontendMap[defaultFeId].tuneStatusTypes = types; frontendMap[defaultFeId].expectTuneStatuses = statuses; frontendMap[defaultFeId].isSoftwareFe = true; frontendMap[defaultFeId].canConnectToCiCam = true; frontendMap[defaultFeId].ciCamId = 0; FrontendDvbtSettings dvbt; dvbt.transmissionMode = FrontendDvbtTransmissionMode::MODE_8K_E; frontendMap[defaultFeId].settings.set(dvbt); // Read customized config TunerTestingConfigAidlReader1_0::readFrontendConfig1_0(frontendMap); }; inline void initFilterConfig() { // The test will use the internal default filter when default filter is connected to any // data flow without overriding in the xml config. string defaultAudioFilterId = "FILTER_AUDIO_DEFAULT"; string defaultVideoFilterId = "FILTER_VIDEO_DEFAULT"; filterMap[defaultVideoFilterId].type.mainType = DemuxFilterMainType::TS; filterMap[defaultVideoFilterId].type.subType.set( DemuxTsFilterType::VIDEO); filterMap[defaultVideoFilterId].bufferSize = FMQ_SIZE_16M; filterMap[defaultVideoFilterId].settings = DemuxFilterSettings::make(); filterMap[defaultVideoFilterId].settings.get().tpid = 256; DemuxFilterAvSettings video; video.isPassthrough = false; filterMap[defaultVideoFilterId] .settings.get() .filterSettings.set(video); filterMap[defaultVideoFilterId].monitorEventTypes = static_cast(DemuxFilterMonitorEventType::SCRAMBLING_STATUS) | static_cast(DemuxFilterMonitorEventType::IP_CID_CHANGE); filterMap[defaultVideoFilterId].streamType.set( VideoStreamType::MPEG1); filterMap[defaultAudioFilterId].type.mainType = DemuxFilterMainType::TS; filterMap[defaultAudioFilterId].type.subType.set( DemuxTsFilterType::AUDIO); filterMap[defaultAudioFilterId].bufferSize = FMQ_SIZE_16M; filterMap[defaultAudioFilterId].settings = DemuxFilterSettings::make(); filterMap[defaultAudioFilterId].settings.get().tpid = 256; DemuxFilterAvSettings audio; audio.isPassthrough = false; filterMap[defaultAudioFilterId] .settings.get() .filterSettings.set(audio); filterMap[defaultAudioFilterId].monitorEventTypes = static_cast(DemuxFilterMonitorEventType::SCRAMBLING_STATUS) | static_cast(DemuxFilterMonitorEventType::IP_CID_CHANGE); filterMap[defaultAudioFilterId].streamType.set(AudioStreamType::MP3); // Read customized config TunerTestingConfigAidlReader1_0::readFilterConfig1_0(filterMap); }; /** Config all the dvrs that would be used in the tests */ inline void initDvrConfig() { // Read customized config TunerTestingConfigAidlReader1_0::readDvrConfig1_0(dvrMap); }; /** Read the vendor configurations of which hardware to use for each test cases/data flows */ inline void connectHardwaresToTestCases() { TunerTestingConfigAidlReader1_0::connectLiveBroadcast(live); TunerTestingConfigAidlReader1_0::connectScan(scan); TunerTestingConfigAidlReader1_0::connectDvrRecord(record); }; 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 = 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; 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; 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 (!dvrIsValid) { ALOGW("[vts config] dynamic config dvr connection is invalid."); return false; } bool filterIsValid = (live.hasFrontendConnection) ? filterMap.find(live.audioFilterId) != filterMap.end() && filterMap.find(live.videoFilterId) != filterMap.end() : true; filterIsValid &= record.support ? filterMap.find(record.recordFilterId) != filterMap.end() : true; if (!filterIsValid) { ALOGW("[vts config] dynamic config filter connection is invalid."); return false; } return true; }