blob: 7971fd244b585b7acb208be8fa6799ea0f8349cf [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;
53using android::hardware::tv::tuner::V1_0::FrontendDvbtSettings;
54using android::hardware::tv::tuner::V1_0::FrontendDvbtStandard;
55using android::hardware::tv::tuner::V1_0::FrontendDvbtTransmissionMode;
56using android::hardware::tv::tuner::V1_0::FrontendSettings;
57using android::hardware::tv::tuner::V1_0::FrontendStatus;
58using android::hardware::tv::tuner::V1_0::FrontendStatusType;
59using android::hardware::tv::tuner::V1_0::FrontendType;
60using android::hardware::tv::tuner::V1_0::LnbPosition;
61using android::hardware::tv::tuner::V1_0::LnbTone;
62using android::hardware::tv::tuner::V1_0::LnbVoltage;
63using android::hardware::tv::tuner::V1_0::PlaybackSettings;
64using android::hardware::tv::tuner::V1_0::RecordSettings;
65
66const string configFilePath = "/vendor/etc/tuner_vts_config.xml";
Amy Zhang1d603672021-04-01 11:55:41 -070067const string emptyHardwareId = "";
Amy Zhangc1789912021-03-30 13:44:43 -070068
Amy Zhangf36edfc2021-04-02 15:01:17 -070069#define PROVISION_STR \
70 "{ " \
71 " \"id\": 21140844, " \
72 " \"name\": \"Test Title\", " \
73 " \"lowercase_organization_name\": \"Android\", " \
74 " \"asset_key\": { " \
75 " \"encryption_key\": \"nezAr3CHFrmBR9R8Tedotw==\" " \
76 " }, " \
77 " \"cas_type\": 1, " \
78 " \"track_types\": [ ] " \
79 "} "
80
Amy Zhangc1789912021-03-30 13:44:43 -070081struct FrontendConfig {
82 bool isSoftwareFe;
83 FrontendType type;
84 FrontendSettings settings;
85 vector<FrontendStatusType> tuneStatusTypes;
86 vector<FrontendStatus> expectTuneStatuses;
87};
88
Amy Zhang1d603672021-04-01 11:55:41 -070089struct FilterConfig {
90 uint32_t bufferSize;
91 DemuxFilterType type;
92 DemuxFilterSettings settings;
93 bool getMqDesc;
94
95 bool operator<(const FilterConfig& /*c*/) const { return false; }
96};
97
Amy Zhang131d5302021-03-30 15:56:02 -070098struct DvrConfig {
99 DvrType type;
100 uint32_t bufferSize;
101 DvrSettings settings;
102 string playbackInputFile;
103};
104
Amy Zhang78e3dad2021-04-01 19:25:21 -0700105struct LnbConfig {
106 string name;
107 LnbVoltage voltage;
108 LnbTone tone;
109 LnbPosition position;
110};
111
112struct TimeFilterConfig {
113 uint64_t timeStamp;
114};
115
Amy Zhangf36edfc2021-04-02 15:01:17 -0700116struct DescramblerConfig {
117 uint32_t casSystemId;
118 string provisionStr;
119 vector<uint8_t> hidlPvtData;
120};
121
Amy Zhangc1789912021-03-30 13:44:43 -0700122struct LiveBroadcastHardwareConnections {
Amy Zhang63f41752021-04-28 20:22:03 -0700123 bool hasFrontendConnection;
Amy Zhangc1789912021-03-30 13:44:43 -0700124 string frontendId;
Amy Zhang131d5302021-03-30 15:56:02 -0700125 string dvrSoftwareFeId;
Amy Zhang1d603672021-04-01 11:55:41 -0700126 string audioFilterId;
Amy Zhangc1789912021-03-30 13:44:43 -0700127 string videoFilterId;
Amy Zhang1d603672021-04-01 11:55:41 -0700128 string sectionFilterId;
129 string pcrFilterId;
130 /* list string of extra filters; */
Amy Zhangc1789912021-03-30 13:44:43 -0700131};
132
133struct ScanHardwareConnections {
Amy Zhang63f41752021-04-28 20:22:03 -0700134 bool hasFrontendConnection;
Amy Zhangc1789912021-03-30 13:44:43 -0700135 string frontendId;
136};
137
Amy Zhang131d5302021-03-30 15:56:02 -0700138struct DvrPlaybackHardwareConnections {
139 bool support;
140 string frontendId;
141 string dvrId;
Amy Zhang1d603672021-04-01 11:55:41 -0700142 string audioFilterId;
Amy Zhang131d5302021-03-30 15:56:02 -0700143 string videoFilterId;
Amy Zhang1d603672021-04-01 11:55:41 -0700144 string sectionFilterId;
145 /* list string of extra filters; */
Amy Zhang131d5302021-03-30 15:56:02 -0700146};
147
Amy Zhangc1789912021-03-30 13:44:43 -0700148struct DvrRecordHardwareConnections {
149 bool support;
Amy Zhang63f41752021-04-28 20:22:03 -0700150 bool hasFrontendConnection;
Amy Zhangc1789912021-03-30 13:44:43 -0700151 string frontendId;
Amy Zhang131d5302021-03-30 15:56:02 -0700152 string dvrRecordId;
153 string dvrSoftwareFeId;
Amy Zhang1d603672021-04-01 11:55:41 -0700154 string recordFilterId;
Amy Zhang63f41752021-04-28 20:22:03 -0700155 string dvrSourceId;
Amy Zhangc1789912021-03-30 13:44:43 -0700156};
157
158struct DescramblingHardwareConnections {
159 bool support;
Amy Zhang63f41752021-04-28 20:22:03 -0700160 bool hasFrontendConnection;
Amy Zhangc1789912021-03-30 13:44:43 -0700161 string frontendId;
Amy Zhang131d5302021-03-30 15:56:02 -0700162 string dvrSoftwareFeId;
Amy Zhangc1789912021-03-30 13:44:43 -0700163 string audioFilterId;
164 string videoFilterId;
Amy Zhangf36edfc2021-04-02 15:01:17 -0700165 string descramblerId;
Amy Zhang63f41752021-04-28 20:22:03 -0700166 string dvrSourceId;
Amy Zhangf36edfc2021-04-02 15:01:17 -0700167 /* list string of extra filters; */
Amy Zhangc1789912021-03-30 13:44:43 -0700168};
169
170struct LnbLiveHardwareConnections {
171 bool support;
172 string frontendId;
Amy Zhang1d603672021-04-01 11:55:41 -0700173 string audioFilterId;
Amy Zhangc1789912021-03-30 13:44:43 -0700174 string videoFilterId;
Amy Zhang78e3dad2021-04-01 19:25:21 -0700175 string lnbId;
176 vector<string> diseqcMsgs;
177 /* list string of extra filters; */
Amy Zhangc1789912021-03-30 13:44:43 -0700178};
179
180struct LnbRecordHardwareConnections {
181 bool support;
182 string frontendId;
Amy Zhang1d603672021-04-01 11:55:41 -0700183 string dvrRecordId;
184 string recordFilterId;
Amy Zhang78e3dad2021-04-01 19:25:21 -0700185 string lnbId;
186 vector<string> diseqcMsgs;
187 /* list string of extra filters; */
188};
189
190struct TimeFilterHardwareConnections {
191 bool support;
192 string timeFilterId;
Amy Zhangc1789912021-03-30 13:44:43 -0700193};
194
195struct TunerTestingConfigReader {
196 public:
197 static bool checkConfigFileExists() {
198 auto res = read(configFilePath.c_str());
199 if (res == nullopt) {
200 ALOGW("[ConfigReader] Couldn't read /vendor/etc/tuner_vts_config.xml."
201 "Please check tuner_testing_dynamic_configuration.xsd"
202 "and sample_tuner_vts_config.xml for more details on how to config Tune VTS.");
203 }
204 return (res != nullopt);
205 }
206
207 static void readFrontendConfig1_0(map<string, FrontendConfig>& frontendMap) {
208 auto hardwareConfig = getHardwareConfig();
209 if (hardwareConfig.hasFrontends()) {
Amy Zhang1d603672021-04-01 11:55:41 -0700210 // TODO: b/182519645 complete the tune status config
Amy Zhangc1789912021-03-30 13:44:43 -0700211 vector<FrontendStatusType> types;
212 types.push_back(FrontendStatusType::DEMOD_LOCK);
213 FrontendStatus status;
214 status.isDemodLocked(true);
215 vector<FrontendStatus> statuses;
216 statuses.push_back(status);
217
218 auto frontends = *hardwareConfig.getFirstFrontends();
219 for (auto feConfig : frontends.getFrontend()) {
220 string id = feConfig.getId();
221 if (id.compare(string("FE_DEFAULT")) == 0) {
222 // overrid default
223 frontendMap.erase(string("FE_DEFAULT"));
224 }
225 FrontendType type;
226 switch (feConfig.getType()) {
227 case FrontendTypeEnum::UNDEFINED:
228 type = FrontendType::UNDEFINED;
229 break;
Amy Zhang1d603672021-04-01 11:55:41 -0700230 // TODO: b/182519645 finish all other frontend settings
Amy Zhangc1789912021-03-30 13:44:43 -0700231 case FrontendTypeEnum::ANALOG:
232 type = FrontendType::ANALOG;
233 break;
234 case FrontendTypeEnum::ATSC:
235 type = FrontendType::ATSC;
236 break;
237 case FrontendTypeEnum::ATSC3:
238 type = FrontendType::ATSC3;
239 break;
240 case FrontendTypeEnum::DVBC:
241 type = FrontendType::DVBC;
242 break;
243 case FrontendTypeEnum::DVBS:
244 type = FrontendType::DVBS;
245 frontendMap[id].settings.dvbs(readDvbsFrontendSettings(feConfig));
246 break;
247 case FrontendTypeEnum::DVBT: {
248 type = FrontendType::DVBT;
249 frontendMap[id].settings.dvbt(readDvbtFrontendSettings(feConfig));
250 break;
251 }
252 case FrontendTypeEnum::ISDBS:
253 type = FrontendType::ISDBS;
254 break;
255 case FrontendTypeEnum::ISDBS3:
256 type = FrontendType::ISDBS3;
257 break;
258 case FrontendTypeEnum::ISDBT:
259 type = FrontendType::ISDBT;
260 break;
261 case FrontendTypeEnum::DTMB:
262 // dtmb will be handled in readFrontendConfig1_1;
263 continue;
264 case FrontendTypeEnum::UNKNOWN:
265 ALOGW("[ConfigReader] invalid frontend type");
266 return;
267 }
268 frontendMap[id].type = type;
269 frontendMap[id].isSoftwareFe = feConfig.getIsSoftwareFrontend();
Amy Zhang1d603672021-04-01 11:55:41 -0700270 // TODO: b/182519645 complete the tune status config
Amy Zhangc1789912021-03-30 13:44:43 -0700271 frontendMap[id].tuneStatusTypes = types;
272 frontendMap[id].expectTuneStatuses = statuses;
273 }
274 }
275 }
276
Amy Zhang1d603672021-04-01 11:55:41 -0700277 static void readFilterConfig1_0(map<string, FilterConfig>& filterMap) {
278 auto hardwareConfig = getHardwareConfig();
279 if (hardwareConfig.hasFilters()) {
280 auto filters = *hardwareConfig.getFirstFilters();
281 for (auto filterConfig : filters.getFilter()) {
282 string id = filterConfig.getId();
283 if (id.compare(string("FILTER_AUDIO_DEFAULT")) == 0) {
284 // overrid default
285 filterMap.erase(string("FILTER_AUDIO_DEFAULT"));
286 }
287 if (id.compare(string("FILTER_VIDEO_DEFAULT")) == 0) {
288 // overrid default
289 filterMap.erase(string("FILTER_VIDEO_DEFAULT"));
290 }
291
292 DemuxFilterType type;
293 DemuxFilterSettings settings;
294 if (!readFilterTypeAndSettings(filterConfig, type, settings)) {
295 ALOGW("[ConfigReader] invalid filter type");
296 return;
297 }
298 filterMap[id].type = type;
299 filterMap[id].bufferSize = filterConfig.getBufferSize();
300 filterMap[id].getMqDesc = filterConfig.getUseFMQ();
301 filterMap[id].settings = settings;
302 }
303 }
304 }
305
Amy Zhang131d5302021-03-30 15:56:02 -0700306 static void readDvrConfig1_0(map<string, DvrConfig>& dvrMap) {
307 auto hardwareConfig = getHardwareConfig();
308 if (hardwareConfig.hasDvrs()) {
309 auto dvrs = *hardwareConfig.getFirstDvrs();
310 for (auto dvrConfig : dvrs.getDvr()) {
311 string id = dvrConfig.getId();
312 DvrType type;
313 switch (dvrConfig.getType()) {
314 case DvrTypeEnum::PLAYBACK:
315 type = DvrType::PLAYBACK;
316 dvrMap[id].settings.playback(readPlaybackSettings(dvrConfig));
317 break;
318 case DvrTypeEnum::RECORD:
319 type = DvrType::RECORD;
320 dvrMap[id].settings.record(readRecordSettings(dvrConfig));
321 break;
322 case DvrTypeEnum::UNKNOWN:
323 ALOGW("[ConfigReader] invalid DVR type");
324 return;
325 }
326 dvrMap[id].type = type;
327 dvrMap[id].bufferSize = static_cast<uint32_t>(dvrConfig.getBufferSize());
328 if (dvrConfig.hasInputFilePath()) {
329 dvrMap[id].playbackInputFile = dvrConfig.getInputFilePath();
330 }
331 }
332 }
333 }
334
Amy Zhang78e3dad2021-04-01 19:25:21 -0700335 static void readLnbConfig1_0(map<string, LnbConfig>& lnbMap) {
336 auto hardwareConfig = getHardwareConfig();
337 if (hardwareConfig.hasLnbs()) {
338 auto lnbs = *hardwareConfig.getFirstLnbs();
339 for (auto lnbConfig : lnbs.getLnb()) {
340 string id = lnbConfig.getId();
341 if (lnbConfig.hasName()) {
342 lnbMap[id].name = lnbConfig.getName();
343 } else {
344 lnbMap[id].name = emptyHardwareId;
345 }
346 lnbMap[id].voltage = static_cast<LnbVoltage>(lnbConfig.getVoltage());
347 lnbMap[id].tone = static_cast<LnbTone>(lnbConfig.getTone());
348 lnbMap[id].position = static_cast<LnbPosition>(lnbConfig.getPosition());
349 }
350 }
351 }
352
Amy Zhangf36edfc2021-04-02 15:01:17 -0700353 static void readDescramblerConfig1_0(map<string, DescramblerConfig>& descramblerMap) {
354 auto hardwareConfig = getHardwareConfig();
355 if (hardwareConfig.hasDescramblers()) {
356 auto descramblers = *hardwareConfig.getFirstDescramblers();
357 for (auto descramblerConfig : descramblers.getDescrambler()) {
358 string id = descramblerConfig.getId();
359 descramblerMap[id].casSystemId =
360 static_cast<uint32_t>(descramblerConfig.getCasSystemId());
361 if (descramblerConfig.hasProvisionStr()) {
362 descramblerMap[id].provisionStr = descramblerConfig.getProvisionStr();
363 } else {
364 descramblerMap[id].provisionStr = PROVISION_STR;
365 }
366 if (descramblerConfig.hasSesstionPrivatData()) {
367 auto privateData = descramblerConfig.getSesstionPrivatData();
368 int size = privateData.size();
369 descramblerMap[id].hidlPvtData.resize(size);
370 memcpy(descramblerMap[id].hidlPvtData.data(), privateData.data(), size);
371 } else {
372 descramblerMap[id].hidlPvtData.resize(256);
373 }
374 }
375 }
376 }
377
Amy Zhang78e3dad2021-04-01 19:25:21 -0700378 static void readDiseqcMessages(map<string, vector<uint8_t>>& diseqcMsgMap) {
379 auto hardwareConfig = getHardwareConfig();
380 if (hardwareConfig.hasDiseqcMessages()) {
381 auto msgs = *hardwareConfig.getFirstDiseqcMessages();
382 for (auto msgConfig : msgs.getDiseqcMessage()) {
383 string name = msgConfig.getMsgName();
384 for (uint8_t atom : msgConfig.getMsgBody()) {
385 diseqcMsgMap[name].push_back(atom);
386 }
387 }
388 }
389 }
390
391 static void readTimeFilterConfig1_0(map<string, TimeFilterConfig>& timeFilterMap) {
392 auto hardwareConfig = getHardwareConfig();
393 if (hardwareConfig.hasTimeFilters()) {
394 auto timeFilters = *hardwareConfig.getFirstTimeFilters();
395 for (auto timeFilterConfig : timeFilters.getTimeFilter()) {
396 string id = timeFilterConfig.getId();
397 timeFilterMap[id].timeStamp =
398 static_cast<uint64_t>(timeFilterConfig.getTimeStamp());
399 }
400 }
401 }
402
Amy Zhangc1789912021-03-30 13:44:43 -0700403 static void connectLiveBroadcast(LiveBroadcastHardwareConnections& live) {
Amy Zhang63f41752021-04-28 20:22:03 -0700404 auto dataFlow = getDataFlowConfiguration();
405 if (dataFlow.hasClearLiveBroadcast()) {
406 live.hasFrontendConnection = true;
407 } else {
408 live.hasFrontendConnection = false;
409 return;
410 }
411 auto liveConfig = *dataFlow.getFirstClearLiveBroadcast();
Amy Zhang1d603672021-04-01 11:55:41 -0700412 live.frontendId = liveConfig.getFrontendConnection();
413
414 live.audioFilterId = liveConfig.getAudioFilterConnection();
415 live.videoFilterId = liveConfig.getVideoFilterConnection();
416 if (liveConfig.hasPcrFilterConnection()) {
417 live.pcrFilterId = liveConfig.getPcrFilterConnection();
418 } else {
419 live.pcrFilterId = emptyHardwareId;
420 }
421 if (liveConfig.hasSectionFilterConnection()) {
422 live.sectionFilterId = liveConfig.getSectionFilterConnection();
423 } else {
424 live.sectionFilterId = emptyHardwareId;
425 }
426 if (liveConfig.hasDvrSoftwareFeConnection()) {
427 live.dvrSoftwareFeId = liveConfig.getDvrSoftwareFeConnection();
Amy Zhang131d5302021-03-30 15:56:02 -0700428 }
Amy Zhangc1789912021-03-30 13:44:43 -0700429 }
430
431 static void connectScan(ScanHardwareConnections& scan) {
Amy Zhang63f41752021-04-28 20:22:03 -0700432 auto dataFlow = getDataFlowConfiguration();
433 if (dataFlow.hasScan()) {
434 scan.hasFrontendConnection = true;
435 } else {
436 scan.hasFrontendConnection = false;
437 return;
438 }
439 auto scanConfig = *dataFlow.getFirstScan();
440 scan.frontendId = scanConfig.getFrontendConnection();
Amy Zhangc1789912021-03-30 13:44:43 -0700441 }
442
Amy Zhang131d5302021-03-30 15:56:02 -0700443 static void connectDvrPlayback(DvrPlaybackHardwareConnections& playback) {
444 auto dataFlow = getDataFlowConfiguration();
Amy Zhang1d603672021-04-01 11:55:41 -0700445 if (dataFlow.hasDvrPlayback()) {
446 playback.support = true;
447 } else {
Amy Zhang63f41752021-04-28 20:22:03 -0700448 playback.support = false;
Amy Zhang131d5302021-03-30 15:56:02 -0700449 return;
450 }
Amy Zhang1d603672021-04-01 11:55:41 -0700451 auto playbackConfig = *dataFlow.getFirstDvrPlayback();
452 playback.dvrId = playbackConfig.getDvrConnection();
453 playback.audioFilterId = playbackConfig.getAudioFilterConnection();
454 playback.videoFilterId = playbackConfig.getVideoFilterConnection();
455 if (playbackConfig.hasSectionFilterConnection()) {
456 playback.sectionFilterId = playbackConfig.getSectionFilterConnection();
457 } else {
458 playback.sectionFilterId = emptyHardwareId;
459 }
Amy Zhang131d5302021-03-30 15:56:02 -0700460 }
461
Amy Zhangc1789912021-03-30 13:44:43 -0700462 static void connectDvrRecord(DvrRecordHardwareConnections& record) {
463 auto dataFlow = getDataFlowConfiguration();
Amy Zhang1d603672021-04-01 11:55:41 -0700464 if (dataFlow.hasDvrRecord()) {
465 record.support = true;
466 } else {
Amy Zhang63f41752021-04-28 20:22:03 -0700467 record.support = false;
Amy Zhangc1789912021-03-30 13:44:43 -0700468 return;
469 }
Amy Zhang1d603672021-04-01 11:55:41 -0700470 auto recordConfig = *dataFlow.getFirstDvrRecord();
471 record.frontendId = recordConfig.getFrontendConnection();
472 record.recordFilterId = recordConfig.getRecordFilterConnection();
473 record.dvrRecordId = recordConfig.getDvrRecordConnection();
474 if (recordConfig.hasDvrSoftwareFeConnection()) {
475 record.dvrSoftwareFeId = recordConfig.getDvrSoftwareFeConnection();
Amy Zhang131d5302021-03-30 15:56:02 -0700476 }
Amy Zhang63f41752021-04-28 20:22:03 -0700477 if (recordConfig.getHasFrontendConnection()) {
478 record.hasFrontendConnection = true;
479 record.dvrSourceId = emptyHardwareId;
480 } else {
481 record.hasFrontendConnection = false;
482 record.dvrSourceId = recordConfig.getDvrSourceConnection();
483 }
Amy Zhangc1789912021-03-30 13:44:43 -0700484 }
485
486 static void connectDescrambling(DescramblingHardwareConnections& descrambling) {
487 auto dataFlow = getDataFlowConfiguration();
Amy Zhang1d603672021-04-01 11:55:41 -0700488 if (dataFlow.hasDescrambling()) {
489 descrambling.support = true;
490 } else {
Amy Zhang63f41752021-04-28 20:22:03 -0700491 descrambling.support = false;
Amy Zhangc1789912021-03-30 13:44:43 -0700492 return;
493 }
Amy Zhang1d603672021-04-01 11:55:41 -0700494 auto descConfig = *dataFlow.getFirstDescrambling();
495 descrambling.frontendId = descConfig.getFrontendConnection();
Amy Zhangf36edfc2021-04-02 15:01:17 -0700496 descrambling.descramblerId = descConfig.getDescramblerConnection();
Amy Zhang1d603672021-04-01 11:55:41 -0700497 descrambling.audioFilterId = descConfig.getAudioFilterConnection();
498 descrambling.videoFilterId = descConfig.getVideoFilterConnection();
499 if (descConfig.hasDvrSoftwareFeConnection()) {
500 descrambling.dvrSoftwareFeId = descConfig.getDvrSoftwareFeConnection();
Amy Zhang131d5302021-03-30 15:56:02 -0700501 }
Amy Zhang63f41752021-04-28 20:22:03 -0700502 if (descConfig.getHasFrontendConnection()) {
503 descrambling.hasFrontendConnection = true;
504 descrambling.dvrSourceId = emptyHardwareId;
505 } else {
506 descrambling.hasFrontendConnection = false;
507 descrambling.dvrSourceId = descConfig.getDvrSourceConnection();
508 }
Amy Zhangc1789912021-03-30 13:44:43 -0700509 }
510
511 static void connectLnbLive(LnbLiveHardwareConnections& lnbLive) {
512 auto dataFlow = getDataFlowConfiguration();
Amy Zhang1d603672021-04-01 11:55:41 -0700513 if (dataFlow.hasLnbLive()) {
514 lnbLive.support = true;
515 } else {
Amy Zhang63f41752021-04-28 20:22:03 -0700516 lnbLive.support = false;
Amy Zhangc1789912021-03-30 13:44:43 -0700517 return;
518 }
Amy Zhang1d603672021-04-01 11:55:41 -0700519 auto lnbLiveConfig = *dataFlow.getFirstLnbLive();
520 lnbLive.frontendId = lnbLiveConfig.getFrontendConnection();
521 lnbLive.audioFilterId = lnbLiveConfig.getAudioFilterConnection();
522 lnbLive.videoFilterId = lnbLiveConfig.getVideoFilterConnection();
Amy Zhang78e3dad2021-04-01 19:25:21 -0700523 lnbLive.lnbId = lnbLiveConfig.getLnbConnection();
524 if (lnbLiveConfig.hasDiseqcMsgSender()) {
525 for (auto msgName : lnbLiveConfig.getDiseqcMsgSender()) {
526 lnbLive.diseqcMsgs.push_back(msgName);
527 }
528 }
Amy Zhangc1789912021-03-30 13:44:43 -0700529 }
530
531 static void connectLnbRecord(LnbRecordHardwareConnections& lnbRecord) {
532 auto dataFlow = getDataFlowConfiguration();
Amy Zhang1d603672021-04-01 11:55:41 -0700533 if (dataFlow.hasLnbRecord()) {
534 lnbRecord.support = true;
535 } else {
Amy Zhang63f41752021-04-28 20:22:03 -0700536 lnbRecord.support = false;
Amy Zhangc1789912021-03-30 13:44:43 -0700537 return;
538 }
Amy Zhang1d603672021-04-01 11:55:41 -0700539 auto lnbRecordConfig = *dataFlow.getFirstLnbRecord();
540 lnbRecord.frontendId = lnbRecordConfig.getFrontendConnection();
541 lnbRecord.recordFilterId = lnbRecordConfig.getRecordFilterConnection();
542 lnbRecord.dvrRecordId = lnbRecordConfig.getDvrRecordConnection();
Amy Zhang78e3dad2021-04-01 19:25:21 -0700543 lnbRecord.lnbId = lnbRecordConfig.getLnbConnection();
544 if (lnbRecordConfig.hasDiseqcMsgSender()) {
545 for (auto msgName : lnbRecordConfig.getDiseqcMsgSender()) {
546 lnbRecord.diseqcMsgs.push_back(msgName);
547 }
548 }
549 }
550
551 static void connectTimeFilter(TimeFilterHardwareConnections& timeFilter) {
552 auto dataFlow = getDataFlowConfiguration();
553 if (dataFlow.hasTimeFilter()) {
554 timeFilter.support = true;
555 } else {
Amy Zhang63f41752021-04-28 20:22:03 -0700556 timeFilter.support = false;
Amy Zhang78e3dad2021-04-01 19:25:21 -0700557 return;
558 }
559 auto timeFilterConfig = *dataFlow.getFirstTimeFilter();
560 timeFilter.timeFilterId = timeFilterConfig.getTimeFilterConnection();
Amy Zhangc1789912021-03-30 13:44:43 -0700561 }
562
563 private:
564 static FrontendDvbtSettings readDvbtFrontendSettings(Frontend feConfig) {
Amy Zhang131d5302021-03-30 15:56:02 -0700565 ALOGW("[ConfigReader] fe type is dvbt");
Amy Zhangc1789912021-03-30 13:44:43 -0700566 FrontendDvbtSettings dvbtSettings{
567 .frequency = (uint32_t)feConfig.getFrequency(),
568 };
569 if (!feConfig.hasDvbtFrontendSettings_optional()) {
570 ALOGW("[ConfigReader] no more dvbt settings");
571 return dvbtSettings;
572 }
573 dvbtSettings.transmissionMode = static_cast<FrontendDvbtTransmissionMode>(
574 feConfig.getFirstDvbtFrontendSettings_optional()->getTransmissionMode());
575 dvbtSettings.bandwidth = static_cast<FrontendDvbtBandwidth>(
576 feConfig.getFirstDvbtFrontendSettings_optional()->getBandwidth());
577 dvbtSettings.isHighPriority =
578 feConfig.getFirstDvbtFrontendSettings_optional()->getIsHighPriority();
579 return dvbtSettings;
580 }
581
582 static FrontendDvbsSettings readDvbsFrontendSettings(Frontend feConfig) {
Amy Zhang131d5302021-03-30 15:56:02 -0700583 ALOGW("[ConfigReader] fe type is dvbs");
Amy Zhangc1789912021-03-30 13:44:43 -0700584 FrontendDvbsSettings dvbsSettings{
585 .frequency = (uint32_t)feConfig.getFrequency(),
586 };
587 if (!feConfig.hasDvbsFrontendSettings_optional()) {
588 ALOGW("[ConfigReader] no more dvbs settings");
589 return dvbsSettings;
590 }
591 dvbsSettings.symbolRate = static_cast<uint32_t>(
592 feConfig.getFirstDvbsFrontendSettings_optional()->getSymbolRate());
593 dvbsSettings.inputStreamId = static_cast<uint32_t>(
594 feConfig.getFirstDvbsFrontendSettings_optional()->getInputStreamId());
595 return dvbsSettings;
596 }
597
Amy Zhang1d603672021-04-01 11:55:41 -0700598 static bool readFilterTypeAndSettings(Filter filterConfig, DemuxFilterType& type,
599 DemuxFilterSettings& settings) {
600 auto mainType = filterConfig.getMainType();
601 auto subType = filterConfig.getSubType();
602 uint32_t pid = static_cast<uint32_t>(filterConfig.getPid());
603 switch (mainType) {
604 case FilterMainTypeEnum::TS: {
605 ALOGW("[ConfigReader] filter main type is ts");
606 type.mainType = DemuxFilterMainType::TS;
607 switch (subType) {
608 case FilterSubTypeEnum::UNDEFINED:
609 break;
610 case FilterSubTypeEnum::SECTION:
611 type.subType.tsFilterType(DemuxTsFilterType::SECTION);
612 settings.ts().filterSettings.section(
613 readSectionFilterSettings(filterConfig));
614 break;
615 case FilterSubTypeEnum::PES:
616 // TODO: b/182519645 support all the filter settings
617 /*settings.ts().filterSettings.pesData(
618 getPesFilterSettings(filterConfig));*/
619 type.subType.tsFilterType(DemuxTsFilterType::PES);
620 break;
621 case FilterSubTypeEnum::TS:
622 type.subType.tsFilterType(DemuxTsFilterType::TS);
623 settings.ts().filterSettings.noinit();
624 break;
625 case FilterSubTypeEnum::PCR:
626 type.subType.tsFilterType(DemuxTsFilterType::PCR);
627 settings.ts().filterSettings.noinit();
628 break;
629 case FilterSubTypeEnum::TEMI:
630 type.subType.tsFilterType(DemuxTsFilterType::TEMI);
631 settings.ts().filterSettings.noinit();
632 break;
633 case FilterSubTypeEnum::AUDIO:
634 type.subType.tsFilterType(DemuxTsFilterType::AUDIO);
635 settings.ts().filterSettings.av(readAvFilterSettings(filterConfig));
636 break;
637 case FilterSubTypeEnum::VIDEO:
638 type.subType.tsFilterType(DemuxTsFilterType::VIDEO);
639 settings.ts().filterSettings.av(readAvFilterSettings(filterConfig));
640 break;
641 case FilterSubTypeEnum::RECORD:
642 type.subType.tsFilterType(DemuxTsFilterType::RECORD);
643 settings.ts().filterSettings.record(readRecordFilterSettings(filterConfig));
644 break;
645 default:
646 ALOGW("[ConfigReader] ts subtype is not supported");
647 return false;
648 }
649 settings.ts().tpid = pid;
650 break;
651 }
652 case FilterMainTypeEnum::MMTP: {
653 ALOGW("[ConfigReader] filter main type is mmtp");
654 type.mainType = DemuxFilterMainType::MMTP;
655 switch (subType) {
656 case FilterSubTypeEnum::UNDEFINED:
657 break;
658 case FilterSubTypeEnum::SECTION:
659 type.subType.mmtpFilterType(DemuxMmtpFilterType::SECTION);
660 settings.mmtp().filterSettings.section(
661 readSectionFilterSettings(filterConfig));
662 break;
663 case FilterSubTypeEnum::PES:
664 type.subType.mmtpFilterType(DemuxMmtpFilterType::PES);
665 // TODO: b/182519645 support all the filter settings
666 /*settings.mmtp().filterSettings.pesData(
667 getPesFilterSettings(filterConfig));*/
668 break;
669 case FilterSubTypeEnum::MMTP:
670 type.subType.mmtpFilterType(DemuxMmtpFilterType::MMTP);
671 settings.mmtp().filterSettings.noinit();
672 break;
673 case FilterSubTypeEnum::AUDIO:
674 type.subType.mmtpFilterType(DemuxMmtpFilterType::AUDIO);
675 settings.mmtp().filterSettings.av(readAvFilterSettings(filterConfig));
676 break;
677 case FilterSubTypeEnum::VIDEO:
678 settings.mmtp().filterSettings.av(readAvFilterSettings(filterConfig));
679 break;
680 case FilterSubTypeEnum::RECORD:
681 type.subType.mmtpFilterType(DemuxMmtpFilterType::RECORD);
682 settings.mmtp().filterSettings.record(
683 readRecordFilterSettings(filterConfig));
684 break;
685 case FilterSubTypeEnum::DOWNLOAD:
686 type.subType.mmtpFilterType(DemuxMmtpFilterType::DOWNLOAD);
687 // TODO: b/182519645 support all the filter settings
688 /*settings.mmtp().filterSettings.download(
689 getDownloadFilterSettings(filterConfig));*/
690 break;
691 default:
692 ALOGW("[ConfigReader] mmtp subtype is not supported");
693 return false;
694 }
695 settings.mmtp().mmtpPid = pid;
696 break;
697 }
698 default:
699 // TODO: b/182519645 support all the filter configs
700 ALOGW("[ConfigReader] filter main type is not supported in dynamic config");
701 return false;
702 }
703 return true;
704 }
705
706 static DemuxFilterSectionSettings readSectionFilterSettings(Filter filterConfig) {
707 DemuxFilterSectionSettings settings;
708 if (!filterConfig.hasSectionFilterSettings_optional()) {
709 return settings;
710 }
711 auto section = filterConfig.getFirstSectionFilterSettings_optional();
712 settings.isCheckCrc = section->getIsCheckCrc();
713 settings.isRepeat = section->getIsRepeat();
714 settings.isRaw = section->getIsRaw();
715 return settings;
716 }
717
718 static DemuxFilterAvSettings readAvFilterSettings(Filter filterConfig) {
719 DemuxFilterAvSettings settings;
720 if (!filterConfig.hasAvFilterSettings_optional()) {
721 return settings;
722 }
723 auto av = filterConfig.getFirstAvFilterSettings_optional();
724 settings.isPassthrough = av->getIsPassthrough();
725 return settings;
726 }
727
728 static DemuxFilterRecordSettings readRecordFilterSettings(Filter filterConfig) {
729 DemuxFilterRecordSettings settings;
730 if (!filterConfig.hasRecordFilterSettings_optional()) {
731 return settings;
732 }
733 auto record = filterConfig.getFirstRecordFilterSettings_optional();
734 settings.tsIndexMask = static_cast<uint32_t>(record->getTsIndexMask());
735 settings.scIndexType = static_cast<DemuxRecordScIndexType>(record->getScIndexType());
736 return settings;
737 }
738
Amy Zhang131d5302021-03-30 15:56:02 -0700739 static PlaybackSettings readPlaybackSettings(Dvr dvrConfig) {
740 ALOGW("[ConfigReader] dvr type is playback");
741 PlaybackSettings playbackSettings{
742 .statusMask = static_cast<uint8_t>(dvrConfig.getStatusMask()),
743 .lowThreshold = static_cast<uint32_t>(dvrConfig.getLowThreshold()),
744 .highThreshold = static_cast<uint32_t>(dvrConfig.getHighThreshold()),
745 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
746 .packetSize = static_cast<uint8_t>(dvrConfig.getPacketSize()),
747 };
748 return playbackSettings;
749 }
750
751 static RecordSettings readRecordSettings(Dvr dvrConfig) {
752 ALOGW("[ConfigReader] dvr type is record");
753 RecordSettings recordSettings{
754 .statusMask = static_cast<uint8_t>(dvrConfig.getStatusMask()),
755 .lowThreshold = static_cast<uint32_t>(dvrConfig.getLowThreshold()),
756 .highThreshold = static_cast<uint32_t>(dvrConfig.getHighThreshold()),
757 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
758 .packetSize = static_cast<uint8_t>(dvrConfig.getPacketSize()),
759 };
760 return recordSettings;
761 }
762
Amy Zhangc1789912021-03-30 13:44:43 -0700763 static TunerConfiguration getTunerConfig() { return *read(configFilePath.c_str()); }
764
765 static HardwareConfiguration getHardwareConfig() {
766 return *getTunerConfig().getFirstHardwareConfiguration();
767 }
768
769 static DataFlowConfiguration getDataFlowConfiguration() {
770 return *getTunerConfig().getFirstDataFlowConfiguration();
771 }
772};