blob: 1ddb64197904ce18b3641f7a9ae291e87bb42e35 [file] [log] [blame]
Hongguang600a6ae2021-07-08 18:51:51 -07001/*
2 * Copyright 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <binder/MemoryDealer.h>
18
19#include "../../../config/TunerTestingConfigAidlReaderV1_0.h"
20
21#include <aidl/android/hardware/tv/tuner/DataFormat.h>
22#include <aidl/android/hardware/tv/tuner/DemuxAlpFilterType.h>
23#include <aidl/android/hardware/tv/tuner/DemuxFilterMainType.h>
24#include <aidl/android/hardware/tv/tuner/DemuxFilterMonitorEventType.h>
25#include <aidl/android/hardware/tv/tuner/DemuxFilterSettings.h>
26#include <aidl/android/hardware/tv/tuner/DemuxFilterType.h>
27#include <aidl/android/hardware/tv/tuner/DemuxIpAddress.h>
28#include <aidl/android/hardware/tv/tuner/DemuxIpFilterSettings.h>
29#include <aidl/android/hardware/tv/tuner/DemuxIpFilterType.h>
30#include <aidl/android/hardware/tv/tuner/DemuxMmtpFilterType.h>
31#include <aidl/android/hardware/tv/tuner/DemuxRecordScIndexType.h>
32#include <aidl/android/hardware/tv/tuner/DemuxTsFilterType.h>
33#include <aidl/android/hardware/tv/tuner/DvrSettings.h>
34#include <aidl/android/hardware/tv/tuner/DvrType.h>
35#include <aidl/android/hardware/tv/tuner/FrontendDvbtBandwidth.h>
36#include <aidl/android/hardware/tv/tuner/FrontendDvbtCoderate.h>
37#include <aidl/android/hardware/tv/tuner/FrontendDvbtConstellation.h>
38#include <aidl/android/hardware/tv/tuner/FrontendDvbtGuardInterval.h>
39#include <aidl/android/hardware/tv/tuner/FrontendDvbtHierarchy.h>
40#include <aidl/android/hardware/tv/tuner/FrontendDvbtSettings.h>
41#include <aidl/android/hardware/tv/tuner/FrontendDvbtStandard.h>
42#include <aidl/android/hardware/tv/tuner/FrontendDvbtTransmissionMode.h>
43#include <aidl/android/hardware/tv/tuner/FrontendSettings.h>
44#include <aidl/android/hardware/tv/tuner/FrontendType.h>
45#include <aidl/android/hardware/tv/tuner/PlaybackSettings.h>
46#include <aidl/android/hardware/tv/tuner/RecordSettings.h>
47
48using namespace std;
49using namespace aidl::android::hardware::tv::tuner;
50using namespace android::media::tuner::testing::configuration::V1_0;
51
52const int32_t FMQ_SIZE_4M = 0x400000;
53const int32_t FMQ_SIZE_16M = 0x1000000;
54
55const string configFilePath = "/vendor/etc/tuner_vts_config_1_1.xml";
56
57#define FILTER_MAIN_TYPE_BIT_COUNT 5
58
59// Hardware configs
60static map<string, FrontendConfig> frontendMap;
61static map<string, FilterConfig> filterMap;
62static map<string, DvrConfig> dvrMap;
63static map<string, LnbConfig> lnbMap;
64static map<string, TimeFilterConfig> timeFilterMap;
65static map<string, vector<uint8_t>> diseqcMsgMap;
66static map<string, DescramblerConfig> descramblerMap;
67
68// Hardware and test cases connections
69static LiveBroadcastHardwareConnections live;
70static ScanHardwareConnections scan;
71static DvrPlaybackHardwareConnections playback;
72static DvrRecordHardwareConnections record;
73static DescramblingHardwareConnections descrambling;
74static LnbLiveHardwareConnections lnbLive;
75static LnbRecordHardwareConnections lnbRecord;
76static TimeFilterHardwareConnections timeFilter;
77
78/** Config all the frontends that would be used in the tests */
79inline void initFrontendConfig() {
80 // The test will use the internal default fe when default fe is connected to any data flow
81 // without overriding in the xml config.
82 string defaultFeId = "FE_DEFAULT";
83 FrontendDvbtSettings dvbtSettings{
84 .frequency = 578000,
85 .transmissionMode = FrontendDvbtTransmissionMode::AUTO,
86 .bandwidth = FrontendDvbtBandwidth::BANDWIDTH_8MHZ,
87 .isHighPriority = true,
88 };
89 frontendMap[defaultFeId].type = FrontendType::DVBT;
90 frontendMap[defaultFeId].settings.set<FrontendSettings::Tag::dvbt>(dvbtSettings);
91
92 vector<FrontendStatusType> types;
93 types.push_back(FrontendStatusType::UEC);
94 types.push_back(FrontendStatusType::IS_MISO);
95
96 vector<FrontendStatus> statuses;
97 FrontendStatus status;
98 status.set<FrontendStatus::Tag::uec>(4);
99 statuses.push_back(status);
100 status.set<FrontendStatus::Tag::isMiso>(true);
101 statuses.push_back(status);
102
103 frontendMap[defaultFeId].tuneStatusTypes = types;
104 frontendMap[defaultFeId].expectTuneStatuses = statuses;
105 frontendMap[defaultFeId].isSoftwareFe = true;
106 frontendMap[defaultFeId].canConnectToCiCam = true;
107 frontendMap[defaultFeId].ciCamId = 0;
108 FrontendDvbtSettings dvbt;
109 dvbt.transmissionMode = FrontendDvbtTransmissionMode::MODE_8K_E;
110 frontendMap[defaultFeId].settings.set<FrontendSettings::Tag::dvbt>(dvbt);
111 // Read customized config
112 TunerTestingConfigAidlReader1_0::readFrontendConfig1_0(frontendMap);
113};
114
115inline void initFilterConfig() {
116 // The test will use the internal default filter when default filter is connected to any
117 // data flow without overriding in the xml config.
118 string defaultAudioFilterId = "FILTER_AUDIO_DEFAULT";
119 string defaultVideoFilterId = "FILTER_VIDEO_DEFAULT";
120
121 filterMap[defaultVideoFilterId].type.mainType = DemuxFilterMainType::TS;
122 filterMap[defaultVideoFilterId]
123 .type.subType.set<DemuxFilterTypeDemuxFilterSubType::Tag::tsFilterType>(
124 DemuxTsFilterType::VIDEO);
125 filterMap[defaultVideoFilterId].bufferSize = FMQ_SIZE_16M;
126 filterMap[defaultVideoFilterId].settings =
127 DemuxFilterSettings::make<DemuxFilterSettings::Tag::ts>();
128 filterMap[defaultVideoFilterId].settings.get<DemuxFilterSettings::Tag::ts>().tpid = 256;
129 DemuxFilterAvSettings video;
130 video.isPassthrough = false;
131 filterMap[defaultVideoFilterId]
132 .settings.get<DemuxFilterSettings::Tag::ts>()
133 .filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::av>(video);
134 filterMap[defaultVideoFilterId].monitorEventTypes =
135 static_cast<int32_t>(DemuxFilterMonitorEventType::SCRAMBLING_STATUS) |
136 static_cast<int32_t>(DemuxFilterMonitorEventType::IP_CID_CHANGE);
137 filterMap[defaultVideoFilterId].streamType.set<AvStreamType::Tag::video>(
138 VideoStreamType::MPEG1);
139
140 filterMap[defaultAudioFilterId].type.mainType = DemuxFilterMainType::TS;
141 filterMap[defaultAudioFilterId]
142 .type.subType.set<DemuxFilterTypeDemuxFilterSubType::Tag::tsFilterType>(
143 DemuxTsFilterType::AUDIO);
144 filterMap[defaultAudioFilterId].bufferSize = FMQ_SIZE_16M;
145 filterMap[defaultAudioFilterId].settings =
146 DemuxFilterSettings::make<DemuxFilterSettings::Tag::ts>();
147 filterMap[defaultAudioFilterId].settings.get<DemuxFilterSettings::Tag::ts>().tpid = 256;
148 DemuxFilterAvSettings audio;
149 audio.isPassthrough = false;
150 filterMap[defaultAudioFilterId]
151 .settings.get<DemuxFilterSettings::Tag::ts>()
152 .filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::av>(audio);
153 filterMap[defaultAudioFilterId].monitorEventTypes =
154 static_cast<int32_t>(DemuxFilterMonitorEventType::SCRAMBLING_STATUS) |
155 static_cast<int32_t>(DemuxFilterMonitorEventType::IP_CID_CHANGE);
156 filterMap[defaultAudioFilterId].streamType.set<AvStreamType::Tag::audio>(AudioStreamType::MP3);
157 // Read customized config
158 TunerTestingConfigAidlReader1_0::readFilterConfig1_0(filterMap);
159};
160
161/** Config all the dvrs that would be used in the tests */
162inline void initDvrConfig() {
163 // Read customized config
164 TunerTestingConfigAidlReader1_0::readDvrConfig1_0(dvrMap);
165};
166
167/** Read the vendor configurations of which hardware to use for each test cases/data flows */
168inline void connectHardwaresToTestCases() {
169 TunerTestingConfigAidlReader1_0::connectLiveBroadcast(live);
170 TunerTestingConfigAidlReader1_0::connectScan(scan);
171 TunerTestingConfigAidlReader1_0::connectDvrRecord(record);
172};
173
174inline bool validateConnections() {
175 if (record.support && !record.hasFrontendConnection &&
176 record.dvrSourceId.compare(emptyHardwareId) == 0) {
177 ALOGW("[vts config] Record must support either a DVR source or a Frontend source.");
178 return false;
179 }
180 bool feIsValid = frontendMap.find(live.frontendId) != frontendMap.end() &&
181 frontendMap.find(scan.frontendId) != frontendMap.end();
182 feIsValid &= record.support ? frontendMap.find(record.frontendId) != frontendMap.end() : true;
183
184 if (!feIsValid) {
185 ALOGW("[vts config] dynamic config fe connection is invalid.");
186 return false;
187 }
188
189 bool dvrIsValid = frontendMap[live.frontendId].isSoftwareFe
190 ? dvrMap.find(live.dvrSoftwareFeId) != dvrMap.end()
191 : true;
192
193 if (record.support) {
194 if (record.hasFrontendConnection) {
195 if (frontendMap[record.frontendId].isSoftwareFe) {
196 dvrIsValid &= dvrMap.find(record.dvrSoftwareFeId) != dvrMap.end();
197 }
198 } else {
199 dvrIsValid &= dvrMap.find(record.dvrSourceId) != dvrMap.end();
200 }
201 dvrIsValid &= dvrMap.find(record.dvrRecordId) != dvrMap.end();
202 }
203
204 if (!dvrIsValid) {
205 ALOGW("[vts config] dynamic config dvr connection is invalid.");
206 return false;
207 }
208
209 bool filterIsValid = filterMap.find(live.audioFilterId) != filterMap.end() &&
210 filterMap.find(live.videoFilterId) != filterMap.end();
211 filterIsValid &=
212 record.support ? filterMap.find(record.recordFilterId) != filterMap.end() : true;
213
214 if (!filterIsValid) {
215 ALOGW("[vts config] dynamic config filter connection is invalid.");
216 return false;
217 }
218
219 return true;
220}