blob: e1f5695bbbb5f0898836bfbaf27eb37219cabfd2 [file] [log] [blame]
Amy Zhangc1789912021-03-30 13:44:43 -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 <android-base/logging.h>
18#include <android/hardware/tv/tuner/1.0/types.h>
19#include <android_media_tuner_testing_configuration_V1_0.h>
20#include <android_media_tuner_testing_configuration_V1_0_enums.h>
21#include <binder/MemoryDealer.h>
22#include <hidl/HidlSupport.h>
23#include <hidl/HidlTransportSupport.h>
24#include <hidl/Status.h>
25#include <hidlmemory/FrameworkUtils.h>
26
27using namespace std;
28using namespace android::media::tuner::testing::configuration::V1_0;
29
30using android::hardware::tv::tuner::V1_0::DataFormat;
31using android::hardware::tv::tuner::V1_0::DemuxAlpFilterType;
Amy Zhang1d603672021-04-01 11:55:41 -070032using android::hardware::tv::tuner::V1_0::DemuxFilterAvSettings;
Amy Zhangc1789912021-03-30 13:44:43 -070033using android::hardware::tv::tuner::V1_0::DemuxFilterEvent;
34using android::hardware::tv::tuner::V1_0::DemuxFilterMainType;
Amy Zhang1d603672021-04-01 11:55:41 -070035using android::hardware::tv::tuner::V1_0::DemuxFilterRecordSettings;
36using android::hardware::tv::tuner::V1_0::DemuxFilterSectionSettings;
Amy Zhangc1789912021-03-30 13:44:43 -070037using android::hardware::tv::tuner::V1_0::DemuxFilterSettings;
38using android::hardware::tv::tuner::V1_0::DemuxFilterType;
39using android::hardware::tv::tuner::V1_0::DemuxIpFilterType;
40using android::hardware::tv::tuner::V1_0::DemuxMmtpFilterType;
41using android::hardware::tv::tuner::V1_0::DemuxRecordScIndexType;
42using android::hardware::tv::tuner::V1_0::DemuxTlvFilterType;
43using android::hardware::tv::tuner::V1_0::DemuxTpid;
44using android::hardware::tv::tuner::V1_0::DemuxTsFilterType;
45using android::hardware::tv::tuner::V1_0::DvrSettings;
46using android::hardware::tv::tuner::V1_0::DvrType;
47using android::hardware::tv::tuner::V1_0::FrontendDvbsSettings;
48using android::hardware::tv::tuner::V1_0::FrontendDvbtBandwidth;
49using android::hardware::tv::tuner::V1_0::FrontendDvbtCoderate;
50using android::hardware::tv::tuner::V1_0::FrontendDvbtConstellation;
51using android::hardware::tv::tuner::V1_0::FrontendDvbtGuardInterval;
52using android::hardware::tv::tuner::V1_0::FrontendDvbtHierarchy;
Gareth Fenn8fa4cff2021-04-30 16:31:02 +010053using android::hardware::tv::tuner::V1_0::FrontendDvbtPlpMode;
Amy Zhangc1789912021-03-30 13:44:43 -070054using android::hardware::tv::tuner::V1_0::FrontendDvbtSettings;
55using android::hardware::tv::tuner::V1_0::FrontendDvbtStandard;
56using android::hardware::tv::tuner::V1_0::FrontendDvbtTransmissionMode;
57using android::hardware::tv::tuner::V1_0::FrontendSettings;
58using android::hardware::tv::tuner::V1_0::FrontendStatus;
59using android::hardware::tv::tuner::V1_0::FrontendStatusType;
60using android::hardware::tv::tuner::V1_0::FrontendType;
61using android::hardware::tv::tuner::V1_0::LnbPosition;
62using android::hardware::tv::tuner::V1_0::LnbTone;
63using android::hardware::tv::tuner::V1_0::LnbVoltage;
64using android::hardware::tv::tuner::V1_0::PlaybackSettings;
65using android::hardware::tv::tuner::V1_0::RecordSettings;
66
67const string configFilePath = "/vendor/etc/tuner_vts_config.xml";
Amy Zhang1d603672021-04-01 11:55:41 -070068const string emptyHardwareId = "";
Amy Zhangc1789912021-03-30 13:44:43 -070069
Amy Zhangf36edfc2021-04-02 15:01:17 -070070#define PROVISION_STR \
71 "{ " \
72 " \"id\": 21140844, " \
73 " \"name\": \"Test Title\", " \
74 " \"lowercase_organization_name\": \"Android\", " \
75 " \"asset_key\": { " \
76 " \"encryption_key\": \"nezAr3CHFrmBR9R8Tedotw==\" " \
77 " }, " \
78 " \"cas_type\": 1, " \
79 " \"track_types\": [ ] " \
80 "} "
81
Amy Zhangc1789912021-03-30 13:44:43 -070082struct FrontendConfig {
83 bool isSoftwareFe;
84 FrontendType type;
85 FrontendSettings settings;
86 vector<FrontendStatusType> tuneStatusTypes;
87 vector<FrontendStatus> expectTuneStatuses;
88};
89
Amy Zhang1d603672021-04-01 11:55:41 -070090struct FilterConfig {
91 uint32_t bufferSize;
92 DemuxFilterType type;
93 DemuxFilterSettings settings;
94 bool getMqDesc;
95
96 bool operator<(const FilterConfig& /*c*/) const { return false; }
97};
98
Amy Zhang131d5302021-03-30 15:56:02 -070099struct DvrConfig {
100 DvrType type;
101 uint32_t bufferSize;
102 DvrSettings settings;
103 string playbackInputFile;
104};
105
Amy Zhang78e3dad2021-04-01 19:25:21 -0700106struct LnbConfig {
107 string name;
108 LnbVoltage voltage;
109 LnbTone tone;
110 LnbPosition position;
111};
112
113struct TimeFilterConfig {
114 uint64_t timeStamp;
115};
116
Amy Zhangf36edfc2021-04-02 15:01:17 -0700117struct DescramblerConfig {
118 uint32_t casSystemId;
119 string provisionStr;
120 vector<uint8_t> hidlPvtData;
121};
122
Amy Zhangc1789912021-03-30 13:44:43 -0700123struct LiveBroadcastHardwareConnections {
Amy Zhang63f41752021-04-28 20:22:03 -0700124 bool hasFrontendConnection;
Amy Zhangc1789912021-03-30 13:44:43 -0700125 string frontendId;
Amy Zhang131d5302021-03-30 15:56:02 -0700126 string dvrSoftwareFeId;
Amy Zhang1d603672021-04-01 11:55:41 -0700127 string audioFilterId;
Amy Zhangc1789912021-03-30 13:44:43 -0700128 string videoFilterId;
Amy Zhang1d603672021-04-01 11:55:41 -0700129 string sectionFilterId;
130 string pcrFilterId;
131 /* list string of extra filters; */
Amy Zhangc1789912021-03-30 13:44:43 -0700132};
133
134struct ScanHardwareConnections {
Amy Zhang63f41752021-04-28 20:22:03 -0700135 bool hasFrontendConnection;
Amy Zhangc1789912021-03-30 13:44:43 -0700136 string frontendId;
137};
138
Amy Zhang131d5302021-03-30 15:56:02 -0700139struct DvrPlaybackHardwareConnections {
140 bool support;
141 string frontendId;
142 string dvrId;
Amy Zhang1d603672021-04-01 11:55:41 -0700143 string audioFilterId;
Amy Zhang131d5302021-03-30 15:56:02 -0700144 string videoFilterId;
Amy Zhang1d603672021-04-01 11:55:41 -0700145 string sectionFilterId;
146 /* list string of extra filters; */
Amy Zhang131d5302021-03-30 15:56:02 -0700147};
148
Amy Zhangc1789912021-03-30 13:44:43 -0700149struct DvrRecordHardwareConnections {
150 bool support;
Amy Zhang63f41752021-04-28 20:22:03 -0700151 bool hasFrontendConnection;
Amy Zhangc1789912021-03-30 13:44:43 -0700152 string frontendId;
Amy Zhang131d5302021-03-30 15:56:02 -0700153 string dvrRecordId;
154 string dvrSoftwareFeId;
Amy Zhang1d603672021-04-01 11:55:41 -0700155 string recordFilterId;
Amy Zhang63f41752021-04-28 20:22:03 -0700156 string dvrSourceId;
Amy Zhangc1789912021-03-30 13:44:43 -0700157};
158
159struct DescramblingHardwareConnections {
160 bool support;
Amy Zhang63f41752021-04-28 20:22:03 -0700161 bool hasFrontendConnection;
Amy Zhangc1789912021-03-30 13:44:43 -0700162 string frontendId;
Amy Zhang131d5302021-03-30 15:56:02 -0700163 string dvrSoftwareFeId;
Amy Zhangc1789912021-03-30 13:44:43 -0700164 string audioFilterId;
165 string videoFilterId;
Amy Zhangf36edfc2021-04-02 15:01:17 -0700166 string descramblerId;
Amy Zhang63f41752021-04-28 20:22:03 -0700167 string dvrSourceId;
Amy Zhangf36edfc2021-04-02 15:01:17 -0700168 /* list string of extra filters; */
Amy Zhangc1789912021-03-30 13:44:43 -0700169};
170
171struct LnbLiveHardwareConnections {
172 bool support;
173 string frontendId;
Amy Zhang1d603672021-04-01 11:55:41 -0700174 string audioFilterId;
Amy Zhangc1789912021-03-30 13:44:43 -0700175 string videoFilterId;
Amy Zhang78e3dad2021-04-01 19:25:21 -0700176 string lnbId;
177 vector<string> diseqcMsgs;
178 /* list string of extra filters; */
Amy Zhangc1789912021-03-30 13:44:43 -0700179};
180
181struct LnbRecordHardwareConnections {
182 bool support;
183 string frontendId;
Amy Zhang1d603672021-04-01 11:55:41 -0700184 string dvrRecordId;
185 string recordFilterId;
Amy Zhang78e3dad2021-04-01 19:25:21 -0700186 string lnbId;
187 vector<string> diseqcMsgs;
188 /* list string of extra filters; */
189};
190
191struct TimeFilterHardwareConnections {
192 bool support;
193 string timeFilterId;
Amy Zhangc1789912021-03-30 13:44:43 -0700194};
195
196struct TunerTestingConfigReader {
197 public:
198 static bool checkConfigFileExists() {
199 auto res = read(configFilePath.c_str());
200 if (res == nullopt) {
201 ALOGW("[ConfigReader] Couldn't read /vendor/etc/tuner_vts_config.xml."
202 "Please check tuner_testing_dynamic_configuration.xsd"
203 "and sample_tuner_vts_config.xml for more details on how to config Tune VTS.");
204 }
205 return (res != nullopt);
206 }
207
208 static void readFrontendConfig1_0(map<string, FrontendConfig>& frontendMap) {
209 auto hardwareConfig = getHardwareConfig();
210 if (hardwareConfig.hasFrontends()) {
Amy Zhang1d603672021-04-01 11:55:41 -0700211 // TODO: b/182519645 complete the tune status config
Amy Zhangc1789912021-03-30 13:44:43 -0700212 vector<FrontendStatusType> types;
213 types.push_back(FrontendStatusType::DEMOD_LOCK);
214 FrontendStatus status;
215 status.isDemodLocked(true);
216 vector<FrontendStatus> statuses;
217 statuses.push_back(status);
218
219 auto frontends = *hardwareConfig.getFirstFrontends();
220 for (auto feConfig : frontends.getFrontend()) {
221 string id = feConfig.getId();
222 if (id.compare(string("FE_DEFAULT")) == 0) {
223 // overrid default
224 frontendMap.erase(string("FE_DEFAULT"));
225 }
226 FrontendType type;
227 switch (feConfig.getType()) {
228 case FrontendTypeEnum::UNDEFINED:
229 type = FrontendType::UNDEFINED;
230 break;
Amy Zhang1d603672021-04-01 11:55:41 -0700231 // TODO: b/182519645 finish all other frontend settings
Amy Zhangc1789912021-03-30 13:44:43 -0700232 case FrontendTypeEnum::ANALOG:
233 type = FrontendType::ANALOG;
234 break;
235 case FrontendTypeEnum::ATSC:
236 type = FrontendType::ATSC;
237 break;
238 case FrontendTypeEnum::ATSC3:
239 type = FrontendType::ATSC3;
240 break;
241 case FrontendTypeEnum::DVBC:
242 type = FrontendType::DVBC;
243 break;
244 case FrontendTypeEnum::DVBS:
245 type = FrontendType::DVBS;
246 frontendMap[id].settings.dvbs(readDvbsFrontendSettings(feConfig));
247 break;
248 case FrontendTypeEnum::DVBT: {
249 type = FrontendType::DVBT;
250 frontendMap[id].settings.dvbt(readDvbtFrontendSettings(feConfig));
251 break;
252 }
253 case FrontendTypeEnum::ISDBS:
254 type = FrontendType::ISDBS;
255 break;
256 case FrontendTypeEnum::ISDBS3:
257 type = FrontendType::ISDBS3;
258 break;
259 case FrontendTypeEnum::ISDBT:
260 type = FrontendType::ISDBT;
261 break;
262 case FrontendTypeEnum::DTMB:
263 // dtmb will be handled in readFrontendConfig1_1;
264 continue;
265 case FrontendTypeEnum::UNKNOWN:
266 ALOGW("[ConfigReader] invalid frontend type");
267 return;
268 }
269 frontendMap[id].type = type;
270 frontendMap[id].isSoftwareFe = feConfig.getIsSoftwareFrontend();
Amy Zhang1d603672021-04-01 11:55:41 -0700271 // TODO: b/182519645 complete the tune status config
Amy Zhangc1789912021-03-30 13:44:43 -0700272 frontendMap[id].tuneStatusTypes = types;
273 frontendMap[id].expectTuneStatuses = statuses;
274 }
275 }
276 }
277
Amy Zhang1d603672021-04-01 11:55:41 -0700278 static void readFilterConfig1_0(map<string, FilterConfig>& filterMap) {
279 auto hardwareConfig = getHardwareConfig();
280 if (hardwareConfig.hasFilters()) {
281 auto filters = *hardwareConfig.getFirstFilters();
282 for (auto filterConfig : filters.getFilter()) {
283 string id = filterConfig.getId();
284 if (id.compare(string("FILTER_AUDIO_DEFAULT")) == 0) {
285 // overrid default
286 filterMap.erase(string("FILTER_AUDIO_DEFAULT"));
287 }
288 if (id.compare(string("FILTER_VIDEO_DEFAULT")) == 0) {
289 // overrid default
290 filterMap.erase(string("FILTER_VIDEO_DEFAULT"));
291 }
292
293 DemuxFilterType type;
294 DemuxFilterSettings settings;
295 if (!readFilterTypeAndSettings(filterConfig, type, settings)) {
296 ALOGW("[ConfigReader] invalid filter type");
297 return;
298 }
299 filterMap[id].type = type;
300 filterMap[id].bufferSize = filterConfig.getBufferSize();
301 filterMap[id].getMqDesc = filterConfig.getUseFMQ();
302 filterMap[id].settings = settings;
303 }
304 }
305 }
306
Amy Zhang131d5302021-03-30 15:56:02 -0700307 static void readDvrConfig1_0(map<string, DvrConfig>& dvrMap) {
308 auto hardwareConfig = getHardwareConfig();
309 if (hardwareConfig.hasDvrs()) {
310 auto dvrs = *hardwareConfig.getFirstDvrs();
311 for (auto dvrConfig : dvrs.getDvr()) {
312 string id = dvrConfig.getId();
313 DvrType type;
314 switch (dvrConfig.getType()) {
315 case DvrTypeEnum::PLAYBACK:
316 type = DvrType::PLAYBACK;
317 dvrMap[id].settings.playback(readPlaybackSettings(dvrConfig));
318 break;
319 case DvrTypeEnum::RECORD:
320 type = DvrType::RECORD;
321 dvrMap[id].settings.record(readRecordSettings(dvrConfig));
322 break;
323 case DvrTypeEnum::UNKNOWN:
324 ALOGW("[ConfigReader] invalid DVR type");
325 return;
326 }
327 dvrMap[id].type = type;
328 dvrMap[id].bufferSize = static_cast<uint32_t>(dvrConfig.getBufferSize());
329 if (dvrConfig.hasInputFilePath()) {
330 dvrMap[id].playbackInputFile = dvrConfig.getInputFilePath();
331 }
332 }
333 }
334 }
335
Amy Zhang78e3dad2021-04-01 19:25:21 -0700336 static void readLnbConfig1_0(map<string, LnbConfig>& lnbMap) {
337 auto hardwareConfig = getHardwareConfig();
338 if (hardwareConfig.hasLnbs()) {
339 auto lnbs = *hardwareConfig.getFirstLnbs();
340 for (auto lnbConfig : lnbs.getLnb()) {
341 string id = lnbConfig.getId();
342 if (lnbConfig.hasName()) {
343 lnbMap[id].name = lnbConfig.getName();
344 } else {
345 lnbMap[id].name = emptyHardwareId;
346 }
347 lnbMap[id].voltage = static_cast<LnbVoltage>(lnbConfig.getVoltage());
348 lnbMap[id].tone = static_cast<LnbTone>(lnbConfig.getTone());
349 lnbMap[id].position = static_cast<LnbPosition>(lnbConfig.getPosition());
350 }
351 }
352 }
353
Amy Zhangf36edfc2021-04-02 15:01:17 -0700354 static void readDescramblerConfig1_0(map<string, DescramblerConfig>& descramblerMap) {
355 auto hardwareConfig = getHardwareConfig();
356 if (hardwareConfig.hasDescramblers()) {
357 auto descramblers = *hardwareConfig.getFirstDescramblers();
358 for (auto descramblerConfig : descramblers.getDescrambler()) {
359 string id = descramblerConfig.getId();
360 descramblerMap[id].casSystemId =
361 static_cast<uint32_t>(descramblerConfig.getCasSystemId());
362 if (descramblerConfig.hasProvisionStr()) {
363 descramblerMap[id].provisionStr = descramblerConfig.getProvisionStr();
364 } else {
365 descramblerMap[id].provisionStr = PROVISION_STR;
366 }
367 if (descramblerConfig.hasSesstionPrivatData()) {
368 auto privateData = descramblerConfig.getSesstionPrivatData();
369 int size = privateData.size();
370 descramblerMap[id].hidlPvtData.resize(size);
371 memcpy(descramblerMap[id].hidlPvtData.data(), privateData.data(), size);
Amy Zhangf36edfc2021-04-02 15:01:17 -0700372 }
373 }
374 }
375 }
376
Amy Zhang78e3dad2021-04-01 19:25:21 -0700377 static void readDiseqcMessages(map<string, vector<uint8_t>>& diseqcMsgMap) {
378 auto hardwareConfig = getHardwareConfig();
379 if (hardwareConfig.hasDiseqcMessages()) {
380 auto msgs = *hardwareConfig.getFirstDiseqcMessages();
381 for (auto msgConfig : msgs.getDiseqcMessage()) {
382 string name = msgConfig.getMsgName();
383 for (uint8_t atom : msgConfig.getMsgBody()) {
384 diseqcMsgMap[name].push_back(atom);
385 }
386 }
387 }
388 }
389
390 static void readTimeFilterConfig1_0(map<string, TimeFilterConfig>& timeFilterMap) {
391 auto hardwareConfig = getHardwareConfig();
392 if (hardwareConfig.hasTimeFilters()) {
393 auto timeFilters = *hardwareConfig.getFirstTimeFilters();
394 for (auto timeFilterConfig : timeFilters.getTimeFilter()) {
395 string id = timeFilterConfig.getId();
396 timeFilterMap[id].timeStamp =
397 static_cast<uint64_t>(timeFilterConfig.getTimeStamp());
398 }
399 }
400 }
401
Amy Zhangc1789912021-03-30 13:44:43 -0700402 static void connectLiveBroadcast(LiveBroadcastHardwareConnections& live) {
Amy Zhang63f41752021-04-28 20:22:03 -0700403 auto dataFlow = getDataFlowConfiguration();
404 if (dataFlow.hasClearLiveBroadcast()) {
405 live.hasFrontendConnection = true;
406 } else {
407 live.hasFrontendConnection = false;
408 return;
409 }
410 auto liveConfig = *dataFlow.getFirstClearLiveBroadcast();
Amy Zhang1d603672021-04-01 11:55:41 -0700411 live.frontendId = liveConfig.getFrontendConnection();
412
413 live.audioFilterId = liveConfig.getAudioFilterConnection();
414 live.videoFilterId = liveConfig.getVideoFilterConnection();
415 if (liveConfig.hasPcrFilterConnection()) {
416 live.pcrFilterId = liveConfig.getPcrFilterConnection();
417 } else {
418 live.pcrFilterId = emptyHardwareId;
419 }
420 if (liveConfig.hasSectionFilterConnection()) {
421 live.sectionFilterId = liveConfig.getSectionFilterConnection();
422 } else {
423 live.sectionFilterId = emptyHardwareId;
424 }
425 if (liveConfig.hasDvrSoftwareFeConnection()) {
426 live.dvrSoftwareFeId = liveConfig.getDvrSoftwareFeConnection();
Amy Zhang131d5302021-03-30 15:56:02 -0700427 }
Amy Zhangc1789912021-03-30 13:44:43 -0700428 }
429
430 static void connectScan(ScanHardwareConnections& scan) {
Amy Zhang63f41752021-04-28 20:22:03 -0700431 auto dataFlow = getDataFlowConfiguration();
432 if (dataFlow.hasScan()) {
433 scan.hasFrontendConnection = true;
434 } else {
435 scan.hasFrontendConnection = false;
436 return;
437 }
438 auto scanConfig = *dataFlow.getFirstScan();
439 scan.frontendId = scanConfig.getFrontendConnection();
Amy Zhangc1789912021-03-30 13:44:43 -0700440 }
441
Amy Zhang131d5302021-03-30 15:56:02 -0700442 static void connectDvrPlayback(DvrPlaybackHardwareConnections& playback) {
443 auto dataFlow = getDataFlowConfiguration();
Amy Zhang1d603672021-04-01 11:55:41 -0700444 if (dataFlow.hasDvrPlayback()) {
445 playback.support = true;
446 } else {
Amy Zhang63f41752021-04-28 20:22:03 -0700447 playback.support = false;
Amy Zhang131d5302021-03-30 15:56:02 -0700448 return;
449 }
Amy Zhang1d603672021-04-01 11:55:41 -0700450 auto playbackConfig = *dataFlow.getFirstDvrPlayback();
451 playback.dvrId = playbackConfig.getDvrConnection();
452 playback.audioFilterId = playbackConfig.getAudioFilterConnection();
453 playback.videoFilterId = playbackConfig.getVideoFilterConnection();
454 if (playbackConfig.hasSectionFilterConnection()) {
455 playback.sectionFilterId = playbackConfig.getSectionFilterConnection();
456 } else {
457 playback.sectionFilterId = emptyHardwareId;
458 }
Amy Zhang131d5302021-03-30 15:56:02 -0700459 }
460
Amy Zhangc1789912021-03-30 13:44:43 -0700461 static void connectDvrRecord(DvrRecordHardwareConnections& record) {
462 auto dataFlow = getDataFlowConfiguration();
Amy Zhang1d603672021-04-01 11:55:41 -0700463 if (dataFlow.hasDvrRecord()) {
464 record.support = true;
465 } else {
Amy Zhang63f41752021-04-28 20:22:03 -0700466 record.support = false;
Amy Zhangc1789912021-03-30 13:44:43 -0700467 return;
468 }
Amy Zhang1d603672021-04-01 11:55:41 -0700469 auto recordConfig = *dataFlow.getFirstDvrRecord();
Amy Zhang1d603672021-04-01 11:55:41 -0700470 record.recordFilterId = recordConfig.getRecordFilterConnection();
471 record.dvrRecordId = recordConfig.getDvrRecordConnection();
472 if (recordConfig.hasDvrSoftwareFeConnection()) {
473 record.dvrSoftwareFeId = recordConfig.getDvrSoftwareFeConnection();
Amy Zhang131d5302021-03-30 15:56:02 -0700474 }
Amy Zhang63f41752021-04-28 20:22:03 -0700475 if (recordConfig.getHasFrontendConnection()) {
476 record.hasFrontendConnection = true;
477 record.dvrSourceId = emptyHardwareId;
Henry Fangdfb386f2021-05-10 09:06:32 -0700478 record.frontendId = recordConfig.getFrontendConnection();
Amy Zhang63f41752021-04-28 20:22:03 -0700479 } else {
480 record.hasFrontendConnection = false;
481 record.dvrSourceId = recordConfig.getDvrSourceConnection();
482 }
Amy Zhangc1789912021-03-30 13:44:43 -0700483 }
484
485 static void connectDescrambling(DescramblingHardwareConnections& descrambling) {
486 auto dataFlow = getDataFlowConfiguration();
Amy Zhang1d603672021-04-01 11:55:41 -0700487 if (dataFlow.hasDescrambling()) {
488 descrambling.support = true;
489 } else {
Amy Zhang63f41752021-04-28 20:22:03 -0700490 descrambling.support = false;
Amy Zhangc1789912021-03-30 13:44:43 -0700491 return;
492 }
Amy Zhang1d603672021-04-01 11:55:41 -0700493 auto descConfig = *dataFlow.getFirstDescrambling();
Amy Zhangf36edfc2021-04-02 15:01:17 -0700494 descrambling.descramblerId = descConfig.getDescramblerConnection();
Amy Zhang1d603672021-04-01 11:55:41 -0700495 descrambling.audioFilterId = descConfig.getAudioFilterConnection();
496 descrambling.videoFilterId = descConfig.getVideoFilterConnection();
497 if (descConfig.hasDvrSoftwareFeConnection()) {
498 descrambling.dvrSoftwareFeId = descConfig.getDvrSoftwareFeConnection();
Amy Zhang131d5302021-03-30 15:56:02 -0700499 }
Amy Zhang63f41752021-04-28 20:22:03 -0700500 if (descConfig.getHasFrontendConnection()) {
501 descrambling.hasFrontendConnection = true;
502 descrambling.dvrSourceId = emptyHardwareId;
Henry Fangdfb386f2021-05-10 09:06:32 -0700503 descrambling.frontendId = descConfig.getFrontendConnection();
Amy Zhang63f41752021-04-28 20:22:03 -0700504 } else {
505 descrambling.hasFrontendConnection = false;
506 descrambling.dvrSourceId = descConfig.getDvrSourceConnection();
507 }
Amy Zhangc1789912021-03-30 13:44:43 -0700508 }
509
510 static void connectLnbLive(LnbLiveHardwareConnections& lnbLive) {
511 auto dataFlow = getDataFlowConfiguration();
Amy Zhang1d603672021-04-01 11:55:41 -0700512 if (dataFlow.hasLnbLive()) {
513 lnbLive.support = true;
514 } else {
Amy Zhang63f41752021-04-28 20:22:03 -0700515 lnbLive.support = false;
Amy Zhangc1789912021-03-30 13:44:43 -0700516 return;
517 }
Amy Zhang1d603672021-04-01 11:55:41 -0700518 auto lnbLiveConfig = *dataFlow.getFirstLnbLive();
519 lnbLive.frontendId = lnbLiveConfig.getFrontendConnection();
520 lnbLive.audioFilterId = lnbLiveConfig.getAudioFilterConnection();
521 lnbLive.videoFilterId = lnbLiveConfig.getVideoFilterConnection();
Amy Zhang78e3dad2021-04-01 19:25:21 -0700522 lnbLive.lnbId = lnbLiveConfig.getLnbConnection();
523 if (lnbLiveConfig.hasDiseqcMsgSender()) {
524 for (auto msgName : lnbLiveConfig.getDiseqcMsgSender()) {
525 lnbLive.diseqcMsgs.push_back(msgName);
526 }
527 }
Amy Zhangc1789912021-03-30 13:44:43 -0700528 }
529
530 static void connectLnbRecord(LnbRecordHardwareConnections& lnbRecord) {
531 auto dataFlow = getDataFlowConfiguration();
Amy Zhang1d603672021-04-01 11:55:41 -0700532 if (dataFlow.hasLnbRecord()) {
533 lnbRecord.support = true;
534 } else {
Amy Zhang63f41752021-04-28 20:22:03 -0700535 lnbRecord.support = false;
Amy Zhangc1789912021-03-30 13:44:43 -0700536 return;
537 }
Amy Zhang1d603672021-04-01 11:55:41 -0700538 auto lnbRecordConfig = *dataFlow.getFirstLnbRecord();
539 lnbRecord.frontendId = lnbRecordConfig.getFrontendConnection();
540 lnbRecord.recordFilterId = lnbRecordConfig.getRecordFilterConnection();
541 lnbRecord.dvrRecordId = lnbRecordConfig.getDvrRecordConnection();
Amy Zhang78e3dad2021-04-01 19:25:21 -0700542 lnbRecord.lnbId = lnbRecordConfig.getLnbConnection();
543 if (lnbRecordConfig.hasDiseqcMsgSender()) {
544 for (auto msgName : lnbRecordConfig.getDiseqcMsgSender()) {
545 lnbRecord.diseqcMsgs.push_back(msgName);
546 }
547 }
548 }
549
550 static void connectTimeFilter(TimeFilterHardwareConnections& timeFilter) {
551 auto dataFlow = getDataFlowConfiguration();
552 if (dataFlow.hasTimeFilter()) {
553 timeFilter.support = true;
554 } else {
Amy Zhang63f41752021-04-28 20:22:03 -0700555 timeFilter.support = false;
Amy Zhang78e3dad2021-04-01 19:25:21 -0700556 return;
557 }
558 auto timeFilterConfig = *dataFlow.getFirstTimeFilter();
559 timeFilter.timeFilterId = timeFilterConfig.getTimeFilterConnection();
Amy Zhangc1789912021-03-30 13:44:43 -0700560 }
561
562 private:
563 static FrontendDvbtSettings readDvbtFrontendSettings(Frontend feConfig) {
Amy Zhang131d5302021-03-30 15:56:02 -0700564 ALOGW("[ConfigReader] fe type is dvbt");
Amy Zhangc1789912021-03-30 13:44:43 -0700565 FrontendDvbtSettings dvbtSettings{
566 .frequency = (uint32_t)feConfig.getFrequency(),
567 };
568 if (!feConfig.hasDvbtFrontendSettings_optional()) {
569 ALOGW("[ConfigReader] no more dvbt settings");
570 return dvbtSettings;
571 }
572 dvbtSettings.transmissionMode = static_cast<FrontendDvbtTransmissionMode>(
573 feConfig.getFirstDvbtFrontendSettings_optional()->getTransmissionMode());
574 dvbtSettings.bandwidth = static_cast<FrontendDvbtBandwidth>(
575 feConfig.getFirstDvbtFrontendSettings_optional()->getBandwidth());
Gareth Fenn8fa4cff2021-04-30 16:31:02 +0100576 dvbtSettings.constellation = static_cast<FrontendDvbtConstellation>(
577 feConfig.getFirstDvbtFrontendSettings_optional()->getConstellation());
578 dvbtSettings.hierarchy = static_cast<FrontendDvbtHierarchy>(
579 feConfig.getFirstDvbtFrontendSettings_optional()->getHierarchy());
580 dvbtSettings.hpCoderate = static_cast<FrontendDvbtCoderate>(
581 feConfig.getFirstDvbtFrontendSettings_optional()->getHpCoderate());
582 dvbtSettings.lpCoderate = static_cast<FrontendDvbtCoderate>(
583 feConfig.getFirstDvbtFrontendSettings_optional()->getLpCoderate());
584 dvbtSettings.guardInterval = static_cast<FrontendDvbtGuardInterval>(
585 feConfig.getFirstDvbtFrontendSettings_optional()->getGuardInterval());
Amy Zhangc1789912021-03-30 13:44:43 -0700586 dvbtSettings.isHighPriority =
587 feConfig.getFirstDvbtFrontendSettings_optional()->getIsHighPriority();
Gareth Fenn8fa4cff2021-04-30 16:31:02 +0100588 dvbtSettings.standard = static_cast<FrontendDvbtStandard>(
589 feConfig.getFirstDvbtFrontendSettings_optional()->getStandard());
590 dvbtSettings.isMiso = feConfig.getFirstDvbtFrontendSettings_optional()->getIsMiso();
591 dvbtSettings.plpMode = static_cast<FrontendDvbtPlpMode>(
592 feConfig.getFirstDvbtFrontendSettings_optional()->getPlpMode());
593 dvbtSettings.plpId = feConfig.getFirstDvbtFrontendSettings_optional()->getPlpId();
594 dvbtSettings.plpGroupId = feConfig.getFirstDvbtFrontendSettings_optional()->getPlpGroupId();
595
Amy Zhangc1789912021-03-30 13:44:43 -0700596 return dvbtSettings;
597 }
598
599 static FrontendDvbsSettings readDvbsFrontendSettings(Frontend feConfig) {
Amy Zhang131d5302021-03-30 15:56:02 -0700600 ALOGW("[ConfigReader] fe type is dvbs");
Amy Zhangc1789912021-03-30 13:44:43 -0700601 FrontendDvbsSettings dvbsSettings{
602 .frequency = (uint32_t)feConfig.getFrequency(),
603 };
604 if (!feConfig.hasDvbsFrontendSettings_optional()) {
605 ALOGW("[ConfigReader] no more dvbs settings");
606 return dvbsSettings;
607 }
608 dvbsSettings.symbolRate = static_cast<uint32_t>(
609 feConfig.getFirstDvbsFrontendSettings_optional()->getSymbolRate());
610 dvbsSettings.inputStreamId = static_cast<uint32_t>(
611 feConfig.getFirstDvbsFrontendSettings_optional()->getInputStreamId());
612 return dvbsSettings;
613 }
614
Amy Zhang1d603672021-04-01 11:55:41 -0700615 static bool readFilterTypeAndSettings(Filter filterConfig, DemuxFilterType& type,
616 DemuxFilterSettings& settings) {
617 auto mainType = filterConfig.getMainType();
618 auto subType = filterConfig.getSubType();
619 uint32_t pid = static_cast<uint32_t>(filterConfig.getPid());
620 switch (mainType) {
621 case FilterMainTypeEnum::TS: {
622 ALOGW("[ConfigReader] filter main type is ts");
623 type.mainType = DemuxFilterMainType::TS;
624 switch (subType) {
625 case FilterSubTypeEnum::UNDEFINED:
626 break;
627 case FilterSubTypeEnum::SECTION:
628 type.subType.tsFilterType(DemuxTsFilterType::SECTION);
629 settings.ts().filterSettings.section(
630 readSectionFilterSettings(filterConfig));
631 break;
632 case FilterSubTypeEnum::PES:
633 // TODO: b/182519645 support all the filter settings
634 /*settings.ts().filterSettings.pesData(
635 getPesFilterSettings(filterConfig));*/
636 type.subType.tsFilterType(DemuxTsFilterType::PES);
637 break;
638 case FilterSubTypeEnum::TS:
639 type.subType.tsFilterType(DemuxTsFilterType::TS);
640 settings.ts().filterSettings.noinit();
641 break;
642 case FilterSubTypeEnum::PCR:
643 type.subType.tsFilterType(DemuxTsFilterType::PCR);
644 settings.ts().filterSettings.noinit();
645 break;
646 case FilterSubTypeEnum::TEMI:
647 type.subType.tsFilterType(DemuxTsFilterType::TEMI);
648 settings.ts().filterSettings.noinit();
649 break;
650 case FilterSubTypeEnum::AUDIO:
651 type.subType.tsFilterType(DemuxTsFilterType::AUDIO);
652 settings.ts().filterSettings.av(readAvFilterSettings(filterConfig));
653 break;
654 case FilterSubTypeEnum::VIDEO:
655 type.subType.tsFilterType(DemuxTsFilterType::VIDEO);
656 settings.ts().filterSettings.av(readAvFilterSettings(filterConfig));
657 break;
658 case FilterSubTypeEnum::RECORD:
659 type.subType.tsFilterType(DemuxTsFilterType::RECORD);
660 settings.ts().filterSettings.record(readRecordFilterSettings(filterConfig));
661 break;
662 default:
663 ALOGW("[ConfigReader] ts subtype is not supported");
664 return false;
665 }
666 settings.ts().tpid = pid;
667 break;
668 }
669 case FilterMainTypeEnum::MMTP: {
670 ALOGW("[ConfigReader] filter main type is mmtp");
671 type.mainType = DemuxFilterMainType::MMTP;
672 switch (subType) {
673 case FilterSubTypeEnum::UNDEFINED:
674 break;
675 case FilterSubTypeEnum::SECTION:
676 type.subType.mmtpFilterType(DemuxMmtpFilterType::SECTION);
677 settings.mmtp().filterSettings.section(
678 readSectionFilterSettings(filterConfig));
679 break;
680 case FilterSubTypeEnum::PES:
681 type.subType.mmtpFilterType(DemuxMmtpFilterType::PES);
682 // TODO: b/182519645 support all the filter settings
683 /*settings.mmtp().filterSettings.pesData(
684 getPesFilterSettings(filterConfig));*/
685 break;
686 case FilterSubTypeEnum::MMTP:
687 type.subType.mmtpFilterType(DemuxMmtpFilterType::MMTP);
688 settings.mmtp().filterSettings.noinit();
689 break;
690 case FilterSubTypeEnum::AUDIO:
691 type.subType.mmtpFilterType(DemuxMmtpFilterType::AUDIO);
692 settings.mmtp().filterSettings.av(readAvFilterSettings(filterConfig));
693 break;
694 case FilterSubTypeEnum::VIDEO:
695 settings.mmtp().filterSettings.av(readAvFilterSettings(filterConfig));
696 break;
697 case FilterSubTypeEnum::RECORD:
698 type.subType.mmtpFilterType(DemuxMmtpFilterType::RECORD);
699 settings.mmtp().filterSettings.record(
700 readRecordFilterSettings(filterConfig));
701 break;
702 case FilterSubTypeEnum::DOWNLOAD:
703 type.subType.mmtpFilterType(DemuxMmtpFilterType::DOWNLOAD);
704 // TODO: b/182519645 support all the filter settings
705 /*settings.mmtp().filterSettings.download(
706 getDownloadFilterSettings(filterConfig));*/
707 break;
708 default:
709 ALOGW("[ConfigReader] mmtp subtype is not supported");
710 return false;
711 }
712 settings.mmtp().mmtpPid = pid;
713 break;
714 }
715 default:
716 // TODO: b/182519645 support all the filter configs
717 ALOGW("[ConfigReader] filter main type is not supported in dynamic config");
718 return false;
719 }
720 return true;
721 }
722
723 static DemuxFilterSectionSettings readSectionFilterSettings(Filter filterConfig) {
724 DemuxFilterSectionSettings settings;
725 if (!filterConfig.hasSectionFilterSettings_optional()) {
726 return settings;
727 }
728 auto section = filterConfig.getFirstSectionFilterSettings_optional();
729 settings.isCheckCrc = section->getIsCheckCrc();
730 settings.isRepeat = section->getIsRepeat();
731 settings.isRaw = section->getIsRaw();
732 return settings;
733 }
734
735 static DemuxFilterAvSettings readAvFilterSettings(Filter filterConfig) {
736 DemuxFilterAvSettings settings;
737 if (!filterConfig.hasAvFilterSettings_optional()) {
738 return settings;
739 }
740 auto av = filterConfig.getFirstAvFilterSettings_optional();
741 settings.isPassthrough = av->getIsPassthrough();
742 return settings;
743 }
744
745 static DemuxFilterRecordSettings readRecordFilterSettings(Filter filterConfig) {
746 DemuxFilterRecordSettings settings;
747 if (!filterConfig.hasRecordFilterSettings_optional()) {
748 return settings;
749 }
750 auto record = filterConfig.getFirstRecordFilterSettings_optional();
751 settings.tsIndexMask = static_cast<uint32_t>(record->getTsIndexMask());
752 settings.scIndexType = static_cast<DemuxRecordScIndexType>(record->getScIndexType());
753 return settings;
754 }
755
Amy Zhang131d5302021-03-30 15:56:02 -0700756 static PlaybackSettings readPlaybackSettings(Dvr dvrConfig) {
757 ALOGW("[ConfigReader] dvr type is playback");
758 PlaybackSettings playbackSettings{
759 .statusMask = static_cast<uint8_t>(dvrConfig.getStatusMask()),
760 .lowThreshold = static_cast<uint32_t>(dvrConfig.getLowThreshold()),
761 .highThreshold = static_cast<uint32_t>(dvrConfig.getHighThreshold()),
762 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
763 .packetSize = static_cast<uint8_t>(dvrConfig.getPacketSize()),
764 };
765 return playbackSettings;
766 }
767
768 static RecordSettings readRecordSettings(Dvr dvrConfig) {
769 ALOGW("[ConfigReader] dvr type is record");
770 RecordSettings recordSettings{
771 .statusMask = static_cast<uint8_t>(dvrConfig.getStatusMask()),
772 .lowThreshold = static_cast<uint32_t>(dvrConfig.getLowThreshold()),
773 .highThreshold = static_cast<uint32_t>(dvrConfig.getHighThreshold()),
774 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
775 .packetSize = static_cast<uint8_t>(dvrConfig.getPacketSize()),
776 };
777 return recordSettings;
778 }
779
Amy Zhangc1789912021-03-30 13:44:43 -0700780 static TunerConfiguration getTunerConfig() { return *read(configFilePath.c_str()); }
781
782 static HardwareConfiguration getHardwareConfig() {
783 return *getTunerConfig().getFirstHardwareConfiguration();
784 }
785
786 static DataFlowConfiguration getDataFlowConfiguration() {
787 return *getTunerConfig().getFirstDataFlowConfiguration();
788 }
789};