blob: a150797e7871e1d8f857354ea25877d7297738ce [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#pragma once
18
19#include <android-base/logging.h>
20#include <android_media_tuner_testing_configuration_V1_0.h>
21#include <android_media_tuner_testing_configuration_V1_0_enums.h>
22
23#include <aidl/android/hardware/tv/tuner/DataFormat.h>
24#include <aidl/android/hardware/tv/tuner/DemuxAlpFilterType.h>
25#include <aidl/android/hardware/tv/tuner/DemuxFilterAvSettings.h>
26#include <aidl/android/hardware/tv/tuner/DemuxFilterEvent.h>
27#include <aidl/android/hardware/tv/tuner/DemuxFilterMainType.h>
28#include <aidl/android/hardware/tv/tuner/DemuxFilterRecordSettings.h>
29#include <aidl/android/hardware/tv/tuner/DemuxFilterSectionSettings.h>
30#include <aidl/android/hardware/tv/tuner/DemuxFilterSettings.h>
31#include <aidl/android/hardware/tv/tuner/DemuxFilterType.h>
32#include <aidl/android/hardware/tv/tuner/DemuxIpAddress.h>
33#include <aidl/android/hardware/tv/tuner/DemuxIpFilterSettings.h>
34#include <aidl/android/hardware/tv/tuner/DemuxIpFilterType.h>
35#include <aidl/android/hardware/tv/tuner/DemuxMmtpFilterType.h>
36#include <aidl/android/hardware/tv/tuner/DemuxRecordScIndexType.h>
37#include <aidl/android/hardware/tv/tuner/DemuxTlvFilterType.h>
38#include <aidl/android/hardware/tv/tuner/DemuxTsFilterType.h>
39#include <aidl/android/hardware/tv/tuner/DvrSettings.h>
40#include <aidl/android/hardware/tv/tuner/DvrType.h>
41#include <aidl/android/hardware/tv/tuner/FrontendDvbsSettings.h>
42#include <aidl/android/hardware/tv/tuner/FrontendDvbtBandwidth.h>
43#include <aidl/android/hardware/tv/tuner/FrontendDvbtCoderate.h>
44#include <aidl/android/hardware/tv/tuner/FrontendDvbtConstellation.h>
45#include <aidl/android/hardware/tv/tuner/FrontendDvbtGuardInterval.h>
46#include <aidl/android/hardware/tv/tuner/FrontendDvbtHierarchy.h>
47#include <aidl/android/hardware/tv/tuner/FrontendDvbtPlpMode.h>
48#include <aidl/android/hardware/tv/tuner/FrontendDvbtSettings.h>
49#include <aidl/android/hardware/tv/tuner/FrontendDvbtStandard.h>
50#include <aidl/android/hardware/tv/tuner/FrontendDvbtTransmissionMode.h>
51#include <aidl/android/hardware/tv/tuner/FrontendSettings.h>
52#include <aidl/android/hardware/tv/tuner/FrontendStatus.h>
53#include <aidl/android/hardware/tv/tuner/FrontendStatusType.h>
54#include <aidl/android/hardware/tv/tuner/FrontendType.h>
55#include <aidl/android/hardware/tv/tuner/LnbPosition.h>
56#include <aidl/android/hardware/tv/tuner/LnbTone.h>
57#include <aidl/android/hardware/tv/tuner/LnbVoltage.h>
58#include <aidl/android/hardware/tv/tuner/PlaybackSettings.h>
59#include <aidl/android/hardware/tv/tuner/RecordSettings.h>
60
61using namespace std;
62using namespace aidl::android::hardware::tv::tuner;
63using namespace android::media::tuner::testing::configuration::V1_0;
64
65const string emptyHardwareId = "";
66
67static string mConfigFilePath;
68
69#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
81struct FrontendConfig {
82 bool isSoftwareFe;
83 FrontendType type;
84 bool canConnectToCiCam;
85 int32_t ciCamId;
Hongguange106f472022-01-11 12:09:22 -080086 int32_t removePid;
Hongguang600a6ae2021-07-08 18:51:51 -070087 FrontendSettings settings;
88 vector<FrontendStatusType> tuneStatusTypes;
89 vector<FrontendStatus> expectTuneStatuses;
90};
91
92struct FilterConfig {
93 int32_t bufferSize;
94 DemuxFilterType type;
95 DemuxFilterSettings settings;
96 bool getMqDesc;
97 AvStreamType streamType;
98 int32_t ipCid;
99 int32_t monitorEventTypes;
Patrick Rohr1586d212021-11-23 00:40:56 +0100100 int timeDelayInMs = 0;
101 int dataDelayInBytes = 0;
Hongguang600a6ae2021-07-08 18:51:51 -0700102
103 bool operator<(const FilterConfig& /*c*/) const { return false; }
104};
105
106struct DvrConfig {
107 DvrType type;
108 int32_t bufferSize;
109 DvrSettings settings;
110 string playbackInputFile;
111};
112
113struct LnbConfig {
114 string name;
115 LnbVoltage voltage;
116 LnbTone tone;
117 LnbPosition position;
118};
119
120struct TimeFilterConfig {
121 int64_t timeStamp;
122};
123
124struct DescramblerConfig {
125 int32_t casSystemId;
126 string provisionStr;
127 vector<uint8_t> hidlPvtData;
128};
129
130struct LiveBroadcastHardwareConnections {
131 bool hasFrontendConnection;
132 string frontendId;
133 string dvrSoftwareFeId;
134 string audioFilterId;
135 string videoFilterId;
136 string sectionFilterId;
137 string ipFilterId;
138 string pcrFilterId;
139 /* list string of extra filters; */
140};
141
142struct ScanHardwareConnections {
143 bool hasFrontendConnection;
144 string frontendId;
145};
146
147struct DvrPlaybackHardwareConnections {
148 bool support;
149 string frontendId;
150 string dvrId;
151 string audioFilterId;
152 string videoFilterId;
153 string sectionFilterId;
154 /* list string of extra filters; */
155};
156
157struct DvrRecordHardwareConnections {
158 bool support;
159 bool hasFrontendConnection;
160 string frontendId;
161 string dvrRecordId;
162 string dvrSoftwareFeId;
163 string recordFilterId;
164 string dvrSourceId;
165};
166
167struct DescramblingHardwareConnections {
168 bool support;
169 bool hasFrontendConnection;
170 string frontendId;
171 string dvrSoftwareFeId;
172 string audioFilterId;
173 string videoFilterId;
174 string descramblerId;
175 string dvrSourceId;
176 /* list string of extra filters; */
177};
178
179struct LnbLiveHardwareConnections {
180 bool support;
181 string frontendId;
182 string audioFilterId;
183 string videoFilterId;
184 string lnbId;
185 vector<string> diseqcMsgs;
186 /* list string of extra filters; */
187};
188
189struct LnbRecordHardwareConnections {
190 bool support;
191 string frontendId;
192 string dvrRecordId;
193 string recordFilterId;
194 string lnbId;
195 vector<string> diseqcMsgs;
196 /* list string of extra filters; */
197};
198
199struct TimeFilterHardwareConnections {
200 bool support;
201 string timeFilterId;
202};
203
204struct TunerTestingConfigAidlReader1_0 {
205 public:
206 static void setConfigFilePath(string path) { mConfigFilePath = path; }
207
208 static bool checkConfigFileExists() {
209 auto res = read(mConfigFilePath.c_str());
210 if (res == nullopt) {
211 ALOGW("[ConfigReader] Couldn't read %s."
212 "Please check tuner_testing_dynamic_configuration.xsd"
213 "and sample_tuner_vts_config.xml for more details on how to config Tune VTS.",
214 mConfigFilePath.c_str());
215 }
216 return (res != nullopt);
217 }
218
219 static TunerConfiguration getTunerConfig() { return *read(mConfigFilePath.c_str()); }
220
221 static DataFlowConfiguration getDataFlowConfiguration() {
222 return *getTunerConfig().getFirstDataFlowConfiguration();
223 }
224
225 static HardwareConfiguration getHardwareConfig() {
226 return *getTunerConfig().getFirstHardwareConfiguration();
227 }
228
229 static void readFrontendConfig1_0(map<string, FrontendConfig>& frontendMap) {
230 auto hardwareConfig = getHardwareConfig();
231 if (hardwareConfig.hasFrontends()) {
232 // TODO: b/182519645 complete the tune status config
233 vector<FrontendStatusType> types;
234 vector<FrontendStatus> statuses;
235
236 types.push_back(FrontendStatusType::DEMOD_LOCK);
237 types.push_back(FrontendStatusType::UEC);
238 types.push_back(FrontendStatusType::IS_MISO);
239
240 FrontendStatus status;
241 status.set<FrontendStatus::Tag::isDemodLocked>(true);
242 statuses.push_back(status);
243 status.set<FrontendStatus::Tag::uec>(4);
244 statuses.push_back(status);
245 status.set<FrontendStatus::Tag::isMiso>(true);
246 statuses.push_back(status);
247
248 auto frontends = *hardwareConfig.getFirstFrontends();
249 for (auto feConfig : frontends.getFrontend()) {
250 string id = feConfig.getId();
251 if (id.compare(string("FE_DEFAULT")) == 0) {
252 // overrid default
253 frontendMap.erase(string("FE_DEFAULT"));
254 }
255 FrontendType type;
256 switch (feConfig.getType()) {
257 case FrontendTypeEnum::UNDEFINED:
258 type = FrontendType::UNDEFINED;
259 break;
260 // TODO: b/182519645 finish all other frontend settings
261 case FrontendTypeEnum::ANALOG:
262 type = FrontendType::ANALOG;
263 break;
264 case FrontendTypeEnum::ATSC:
265 type = FrontendType::ATSC;
Frankie Lizcano3ad735d2022-06-24 19:20:54 +0000266 frontendMap[id].settings.set<
267 FrontendSettings::Tag::atsc>(
268 readAtscFrontendSettings(feConfig));
Hongguang600a6ae2021-07-08 18:51:51 -0700269 break;
270 case FrontendTypeEnum::ATSC3:
271 type = FrontendType::ATSC3;
272 break;
273 case FrontendTypeEnum::DVBC:
274 type = FrontendType::DVBC;
275 break;
276 case FrontendTypeEnum::DVBS:
277 type = FrontendType::DVBS;
278 frontendMap[id].settings.set<FrontendSettings::Tag::dvbs>(
279 readDvbsFrontendSettings(feConfig));
280 break;
281 case FrontendTypeEnum::DVBT: {
282 type = FrontendType::DVBT;
283 frontendMap[id].settings.set<FrontendSettings::Tag::dvbt>(
284 readDvbtFrontendSettings(feConfig));
285 break;
286 }
287 case FrontendTypeEnum::ISDBS:
288 type = FrontendType::ISDBS;
Frankie Lizcano01dca3d2022-06-29 18:22:02 +0000289 frontendMap[id].settings.set<FrontendSettings::Tag::isdbs>(
Frankie Lizcano452b0262022-06-27 22:00:33 +0000290 readIsdbsFrontendSettings(feConfig));
Hongguang600a6ae2021-07-08 18:51:51 -0700291 break;
292 case FrontendTypeEnum::ISDBS3:
293 type = FrontendType::ISDBS3;
294 break;
295 case FrontendTypeEnum::ISDBT:
296 type = FrontendType::ISDBT;
297 break;
298 case FrontendTypeEnum::DTMB:
299 type = FrontendType::DTMB;
300 break;
301 case FrontendTypeEnum::UNKNOWN:
302 ALOGW("[ConfigReader] invalid frontend type");
303 return;
304 default:
305 ALOGW("[ConfigReader] fe already handled in 1_0 reader.");
306 break;
307 }
308 frontendMap[id].type = type;
309 frontendMap[id].isSoftwareFe = feConfig.getIsSoftwareFrontend();
310 // TODO: b/182519645 complete the tune status config
311 frontendMap[id].tuneStatusTypes = types;
312 frontendMap[id].expectTuneStatuses = statuses;
Hongguange106f472022-01-11 12:09:22 -0800313 getCiCamInfo(feConfig, frontendMap[id].canConnectToCiCam, frontendMap[id].ciCamId,
314 frontendMap[id].removePid);
Hongguang600a6ae2021-07-08 18:51:51 -0700315 }
316 }
317 }
318
319 static void readFilterConfig1_0(map<string, FilterConfig>& filterMap) {
320 auto hardwareConfig = getHardwareConfig();
321 if (hardwareConfig.hasFilters()) {
322 auto filters = *hardwareConfig.getFirstFilters();
323 for (auto filterConfig : filters.getFilter()) {
324 string id = filterConfig.getId();
325 if (id.compare(string("FILTER_AUDIO_DEFAULT")) == 0) {
326 // overrid default
327 filterMap.erase(string("FILTER_AUDIO_DEFAULT"));
328 }
329 if (id.compare(string("FILTER_VIDEO_DEFAULT")) == 0) {
330 // overrid default
331 filterMap.erase(string("FILTER_VIDEO_DEFAULT"));
332 }
333
334 DemuxFilterType type;
335 DemuxFilterSettings settings;
336 if (!readFilterTypeAndSettings(filterConfig, type, settings)) {
337 ALOGW("[ConfigReader] invalid filter type");
338 return;
339 }
340 filterMap[id].type = type;
341 filterMap[id].bufferSize = filterConfig.getBufferSize();
342 filterMap[id].getMqDesc = filterConfig.getUseFMQ();
343 filterMap[id].settings = settings;
344
345 if (filterConfig.hasMonitorEventTypes()) {
Hongguang11da2cb2021-08-05 19:05:12 -0700346 filterMap[id].monitorEventTypes = (int32_t)filterConfig.getMonitorEventTypes();
Hongguang600a6ae2021-07-08 18:51:51 -0700347 }
Patrick Rohr1586d212021-11-23 00:40:56 +0100348 if (filterConfig.hasTimeDelayInMs()) {
349 filterMap[id].timeDelayInMs = filterConfig.getTimeDelayInMs();
350 }
351 if (filterConfig.hasDataDelayInBytes()) {
352 filterMap[id].dataDelayInBytes = filterConfig.getDataDelayInBytes();
353 }
Hongguang600a6ae2021-07-08 18:51:51 -0700354 if (filterConfig.hasAvFilterSettings_optional()) {
355 auto av = filterConfig.getFirstAvFilterSettings_optional();
356 if (av->hasAudioStreamType_optional()) {
357 filterMap[id].streamType.set<AvStreamType::Tag::audio>(
358 static_cast<AudioStreamType>(av->getAudioStreamType_optional()));
359 }
360 if (av->hasVideoStreamType_optional()) {
361 filterMap[id].streamType.set<AvStreamType::Tag::video>(
362 static_cast<VideoStreamType>(av->getVideoStreamType_optional()));
363 }
364 }
365 if (filterConfig.hasIpFilterConfig_optional()) {
366 auto ip = filterConfig.getFirstIpFilterConfig_optional();
367 if (ip->hasIpCid()) {
368 filterMap[id].ipCid = ip->getIpCid();
369 }
370 }
371 }
372 }
373 }
374
375 static void readDvrConfig1_0(map<string, DvrConfig>& dvrMap) {
376 auto hardwareConfig = getHardwareConfig();
377 if (hardwareConfig.hasDvrs()) {
378 auto dvrs = *hardwareConfig.getFirstDvrs();
379 for (auto dvrConfig : dvrs.getDvr()) {
380 string id = dvrConfig.getId();
381 DvrType type;
382 switch (dvrConfig.getType()) {
383 case DvrTypeEnum::PLAYBACK:
384 type = DvrType::PLAYBACK;
385 dvrMap[id].settings.set<DvrSettings::Tag::playback>(
386 readPlaybackSettings(dvrConfig));
387 break;
388 case DvrTypeEnum::RECORD:
389 type = DvrType::RECORD;
390 dvrMap[id].settings.set<DvrSettings::Tag::record>(
391 readRecordSettings(dvrConfig));
392 break;
393 case DvrTypeEnum::UNKNOWN:
394 ALOGW("[ConfigReader] invalid DVR type");
395 return;
396 }
397 dvrMap[id].type = type;
Hongguang11da2cb2021-08-05 19:05:12 -0700398 dvrMap[id].bufferSize = static_cast<int32_t>(dvrConfig.getBufferSize());
Hongguang600a6ae2021-07-08 18:51:51 -0700399 if (dvrConfig.hasInputFilePath()) {
400 dvrMap[id].playbackInputFile = dvrConfig.getInputFilePath();
401 }
402 }
403 }
404 }
405
406 static void readLnbConfig1_0(map<string, LnbConfig>& lnbMap) {
407 auto hardwareConfig = getHardwareConfig();
408 if (hardwareConfig.hasLnbs()) {
409 auto lnbs = *hardwareConfig.getFirstLnbs();
410 for (auto lnbConfig : lnbs.getLnb()) {
411 string id = lnbConfig.getId();
412 if (lnbConfig.hasName()) {
413 lnbMap[id].name = lnbConfig.getName();
414 } else {
415 lnbMap[id].name = emptyHardwareId;
416 }
417 lnbMap[id].voltage = static_cast<LnbVoltage>(lnbConfig.getVoltage());
418 lnbMap[id].tone = static_cast<LnbTone>(lnbConfig.getTone());
419 lnbMap[id].position = static_cast<LnbPosition>(lnbConfig.getPosition());
420 }
421 }
422 }
423
424 static void readDescramblerConfig1_0(map<string, DescramblerConfig>& descramblerMap) {
425 auto hardwareConfig = getHardwareConfig();
426 if (hardwareConfig.hasDescramblers()) {
427 auto descramblers = *hardwareConfig.getFirstDescramblers();
428 for (auto descramblerConfig : descramblers.getDescrambler()) {
429 string id = descramblerConfig.getId();
430 descramblerMap[id].casSystemId =
Hongguang11da2cb2021-08-05 19:05:12 -0700431 static_cast<int32_t>(descramblerConfig.getCasSystemId());
Hongguang600a6ae2021-07-08 18:51:51 -0700432 if (descramblerConfig.hasProvisionStr()) {
433 descramblerMap[id].provisionStr = descramblerConfig.getProvisionStr();
434 } else {
435 descramblerMap[id].provisionStr = PROVISION_STR;
436 }
437 if (descramblerConfig.hasSesstionPrivatData()) {
438 auto privateData = descramblerConfig.getSesstionPrivatData();
439 int size = privateData.size();
440 descramblerMap[id].hidlPvtData.resize(size);
441 memcpy(descramblerMap[id].hidlPvtData.data(), privateData.data(), size);
442 } else {
443 descramblerMap[id].hidlPvtData.resize(256);
444 }
445 }
446 }
447 }
448
449 static void readDiseqcMessages(map<string, vector<uint8_t>>& diseqcMsgMap) {
450 auto hardwareConfig = getHardwareConfig();
451 if (hardwareConfig.hasDiseqcMessages()) {
452 auto msgs = *hardwareConfig.getFirstDiseqcMessages();
453 for (auto msgConfig : msgs.getDiseqcMessage()) {
454 string name = msgConfig.getMsgName();
455 for (uint8_t atom : msgConfig.getMsgBody()) {
456 diseqcMsgMap[name].push_back(atom);
457 }
458 }
459 }
460 }
461
462 static void readTimeFilterConfig1_0(map<string, TimeFilterConfig>& timeFilterMap) {
463 auto hardwareConfig = getHardwareConfig();
464 if (hardwareConfig.hasTimeFilters()) {
465 auto timeFilters = *hardwareConfig.getFirstTimeFilters();
466 for (auto timeFilterConfig : timeFilters.getTimeFilter()) {
467 string id = timeFilterConfig.getId();
Hongguang11da2cb2021-08-05 19:05:12 -0700468 timeFilterMap[id].timeStamp = static_cast<int64_t>(timeFilterConfig.getTimeStamp());
Hongguang600a6ae2021-07-08 18:51:51 -0700469 }
470 }
471 }
472
473 static void connectLiveBroadcast(LiveBroadcastHardwareConnections& live) {
474 auto dataFlow = getDataFlowConfiguration();
475 if (dataFlow.hasClearLiveBroadcast()) {
476 live.hasFrontendConnection = true;
477 } else {
478 live.hasFrontendConnection = false;
479 return;
480 }
481 auto liveConfig = *dataFlow.getFirstClearLiveBroadcast();
482 live.frontendId = liveConfig.getFrontendConnection();
483
484 live.audioFilterId = liveConfig.getAudioFilterConnection();
485 live.videoFilterId = liveConfig.getVideoFilterConnection();
486 if (liveConfig.hasPcrFilterConnection()) {
487 live.pcrFilterId = liveConfig.getPcrFilterConnection();
488 } else {
489 live.pcrFilterId = emptyHardwareId;
490 }
491 if (liveConfig.hasSectionFilterConnection()) {
492 live.sectionFilterId = liveConfig.getSectionFilterConnection();
493 } else {
494 live.sectionFilterId = emptyHardwareId;
495 }
496 if (liveConfig.hasDvrSoftwareFeConnection()) {
497 live.dvrSoftwareFeId = liveConfig.getDvrSoftwareFeConnection();
498 }
499 if (liveConfig.hasIpFilterConnection()) {
500 live.ipFilterId = liveConfig.getIpFilterConnection();
501 } else {
502 live.ipFilterId = emptyHardwareId;
503 }
504 }
505
506 static void connectScan(ScanHardwareConnections& scan) {
507 auto dataFlow = getDataFlowConfiguration();
508 if (dataFlow.hasScan()) {
509 scan.hasFrontendConnection = true;
510 } else {
511 scan.hasFrontendConnection = false;
512 return;
513 }
514 auto scanConfig = *dataFlow.getFirstScan();
515 scan.frontendId = scanConfig.getFrontendConnection();
516 }
517
518 static void connectDvrPlayback(DvrPlaybackHardwareConnections& playback) {
519 auto dataFlow = getDataFlowConfiguration();
520 if (dataFlow.hasDvrPlayback()) {
521 playback.support = true;
522 } else {
523 playback.support = false;
524 return;
525 }
526 auto playbackConfig = *dataFlow.getFirstDvrPlayback();
527 playback.dvrId = playbackConfig.getDvrConnection();
528 playback.audioFilterId = playbackConfig.getAudioFilterConnection();
529 playback.videoFilterId = playbackConfig.getVideoFilterConnection();
530 if (playbackConfig.hasSectionFilterConnection()) {
531 playback.sectionFilterId = playbackConfig.getSectionFilterConnection();
532 } else {
533 playback.sectionFilterId = emptyHardwareId;
534 }
535 }
536
537 static void connectDvrRecord(DvrRecordHardwareConnections& record) {
538 auto dataFlow = getDataFlowConfiguration();
539 if (dataFlow.hasDvrRecord()) {
540 record.support = true;
541 } else {
542 record.support = false;
543 return;
544 }
545 auto recordConfig = *dataFlow.getFirstDvrRecord();
546 record.recordFilterId = recordConfig.getRecordFilterConnection();
547 record.dvrRecordId = recordConfig.getDvrRecordConnection();
548 if (recordConfig.hasDvrSoftwareFeConnection()) {
549 record.dvrSoftwareFeId = recordConfig.getDvrSoftwareFeConnection();
550 }
551 if (recordConfig.getHasFrontendConnection()) {
552 record.hasFrontendConnection = true;
553 record.dvrSourceId = emptyHardwareId;
554 record.frontendId = recordConfig.getFrontendConnection();
555 } else {
556 record.hasFrontendConnection = false;
557 record.dvrSourceId = recordConfig.getDvrSourceConnection();
558 }
559 }
560
561 static void connectDescrambling(DescramblingHardwareConnections& descrambling) {
562 auto dataFlow = getDataFlowConfiguration();
563 if (dataFlow.hasDescrambling()) {
564 descrambling.support = true;
565 } else {
566 descrambling.support = false;
567 return;
568 }
569 auto descConfig = *dataFlow.getFirstDescrambling();
570 descrambling.descramblerId = descConfig.getDescramblerConnection();
571 descrambling.audioFilterId = descConfig.getAudioFilterConnection();
572 descrambling.videoFilterId = descConfig.getVideoFilterConnection();
573 if (descConfig.hasDvrSoftwareFeConnection()) {
574 descrambling.dvrSoftwareFeId = descConfig.getDvrSoftwareFeConnection();
575 }
576 if (descConfig.getHasFrontendConnection()) {
577 descrambling.hasFrontendConnection = true;
578 descrambling.dvrSourceId = emptyHardwareId;
579 descrambling.frontendId = descConfig.getFrontendConnection();
580 } else {
581 descrambling.hasFrontendConnection = false;
582 descrambling.dvrSourceId = descConfig.getDvrSourceConnection();
583 }
584 }
585
586 static void connectLnbLive(LnbLiveHardwareConnections& lnbLive) {
587 auto dataFlow = getDataFlowConfiguration();
588 if (dataFlow.hasLnbLive()) {
589 lnbLive.support = true;
590 } else {
591 lnbLive.support = false;
592 return;
593 }
594 auto lnbLiveConfig = *dataFlow.getFirstLnbLive();
595 lnbLive.frontendId = lnbLiveConfig.getFrontendConnection();
596 lnbLive.audioFilterId = lnbLiveConfig.getAudioFilterConnection();
597 lnbLive.videoFilterId = lnbLiveConfig.getVideoFilterConnection();
598 lnbLive.lnbId = lnbLiveConfig.getLnbConnection();
599 if (lnbLiveConfig.hasDiseqcMsgSender()) {
600 for (auto msgName : lnbLiveConfig.getDiseqcMsgSender()) {
601 lnbLive.diseqcMsgs.push_back(msgName);
602 }
603 }
604 }
605
606 static void connectLnbRecord(LnbRecordHardwareConnections& lnbRecord) {
607 auto dataFlow = getDataFlowConfiguration();
608 if (dataFlow.hasLnbRecord()) {
609 lnbRecord.support = true;
610 } else {
611 lnbRecord.support = false;
612 return;
613 }
614 auto lnbRecordConfig = *dataFlow.getFirstLnbRecord();
615 lnbRecord.frontendId = lnbRecordConfig.getFrontendConnection();
616 lnbRecord.recordFilterId = lnbRecordConfig.getRecordFilterConnection();
617 lnbRecord.dvrRecordId = lnbRecordConfig.getDvrRecordConnection();
618 lnbRecord.lnbId = lnbRecordConfig.getLnbConnection();
619 if (lnbRecordConfig.hasDiseqcMsgSender()) {
620 for (auto msgName : lnbRecordConfig.getDiseqcMsgSender()) {
621 lnbRecord.diseqcMsgs.push_back(msgName);
622 }
623 }
624 }
625
626 static void connectTimeFilter(TimeFilterHardwareConnections& timeFilter) {
627 auto dataFlow = getDataFlowConfiguration();
628 if (dataFlow.hasTimeFilter()) {
629 timeFilter.support = true;
630 } else {
631 timeFilter.support = false;
632 return;
633 }
634 auto timeFilterConfig = *dataFlow.getFirstTimeFilter();
635 timeFilter.timeFilterId = timeFilterConfig.getTimeFilterConnection();
636 }
637
638 private:
639 static FrontendDvbtSettings readDvbtFrontendSettings(Frontend feConfig) {
640 ALOGW("[ConfigReader] fe type is dvbt");
641 FrontendDvbtSettings dvbtSettings{
Hongguang11da2cb2021-08-05 19:05:12 -0700642 .frequency = (int64_t)feConfig.getFrequency(),
Hongguang600a6ae2021-07-08 18:51:51 -0700643 };
Hongguang11da2cb2021-08-05 19:05:12 -0700644 if (feConfig.hasEndFrequency()) {
645 dvbtSettings.endFrequency = (int64_t)feConfig.getEndFrequency();
646 }
Hongguang600a6ae2021-07-08 18:51:51 -0700647 if (!feConfig.hasDvbtFrontendSettings_optional()) {
648 ALOGW("[ConfigReader] no more dvbt settings");
649 return dvbtSettings;
650 }
651 auto dvbt = feConfig.getFirstDvbtFrontendSettings_optional();
Hongguang11da2cb2021-08-05 19:05:12 -0700652 int32_t trans = static_cast<int32_t>(dvbt->getTransmissionMode());
Hongguang600a6ae2021-07-08 18:51:51 -0700653 dvbtSettings.transmissionMode = static_cast<FrontendDvbtTransmissionMode>(trans);
654 dvbtSettings.bandwidth = static_cast<FrontendDvbtBandwidth>(dvbt->getBandwidth());
655 dvbtSettings.isHighPriority = dvbt->getIsHighPriority();
656 dvbtSettings.hierarchy = static_cast<FrontendDvbtHierarchy>(dvbt->getHierarchy());
657 dvbtSettings.hpCoderate = static_cast<FrontendDvbtCoderate>(dvbt->getHpCoderate());
658 dvbtSettings.lpCoderate = static_cast<FrontendDvbtCoderate>(dvbt->getLpCoderate());
659 dvbtSettings.guardInterval =
660 static_cast<FrontendDvbtGuardInterval>(dvbt->getGuardInterval());
661 dvbtSettings.standard = static_cast<FrontendDvbtStandard>(dvbt->getStandard());
662 dvbtSettings.isMiso = dvbt->getIsMiso();
663 dvbtSettings.plpMode = static_cast<FrontendDvbtPlpMode>(dvbt->getPlpMode());
664 dvbtSettings.plpId = dvbt->getPlpId();
665 dvbtSettings.plpGroupId = dvbt->getPlpGroupId();
666 if (dvbt->hasConstellation()) {
667 dvbtSettings.constellation =
668 static_cast<FrontendDvbtConstellation>(dvbt->getConstellation());
669 }
670 return dvbtSettings;
671 }
672
673 static FrontendDvbsSettings readDvbsFrontendSettings(Frontend feConfig) {
674 ALOGW("[ConfigReader] fe type is dvbs");
675 FrontendDvbsSettings dvbsSettings{
Hongguang11da2cb2021-08-05 19:05:12 -0700676 .frequency = (int64_t)feConfig.getFrequency(),
Hongguang600a6ae2021-07-08 18:51:51 -0700677 };
Hongguang11da2cb2021-08-05 19:05:12 -0700678 if (feConfig.hasEndFrequency()) {
679 dvbsSettings.endFrequency = (int64_t)feConfig.getEndFrequency();
680 }
Hongguang600a6ae2021-07-08 18:51:51 -0700681 if (!feConfig.hasDvbsFrontendSettings_optional()) {
682 ALOGW("[ConfigReader] no more dvbs settings");
683 return dvbsSettings;
684 }
Hongguang11da2cb2021-08-05 19:05:12 -0700685 dvbsSettings.symbolRate = static_cast<int32_t>(
Hongguang600a6ae2021-07-08 18:51:51 -0700686 feConfig.getFirstDvbsFrontendSettings_optional()->getSymbolRate());
Hongguang11da2cb2021-08-05 19:05:12 -0700687 dvbsSettings.inputStreamId = static_cast<int32_t>(
Hongguang600a6ae2021-07-08 18:51:51 -0700688 feConfig.getFirstDvbsFrontendSettings_optional()->getInputStreamId());
689 auto dvbs = feConfig.getFirstDvbsFrontendSettings_optional();
690 if (dvbs->hasScanType()) {
691 dvbsSettings.scanType = static_cast<FrontendDvbsScanType>(dvbs->getScanType());
692 }
693 if (dvbs->hasIsDiseqcRxMessage()) {
694 dvbsSettings.isDiseqcRxMessage = dvbs->getIsDiseqcRxMessage();
695 }
696 return dvbsSettings;
697 }
698
Frankie Lizcano3ad735d2022-06-24 19:20:54 +0000699 static FrontendAtscSettings readAtscFrontendSettings(Frontend& feConfig) {
Frankie Lizcano01dca3d2022-06-29 18:22:02 +0000700 ALOGW("[ConfigReader] fe type is atsc");
701 FrontendAtscSettings atscSettings{
702 .frequency = (int64_t)feConfig.getFrequency(),
703 };
704 if (feConfig.hasEndFrequency()) {
705 atscSettings.endFrequency = (int64_t)feConfig.getEndFrequency();
706 }
707 if (!feConfig.hasAtscFrontendSettings_optional()) {
708 ALOGW("[ConfigReader] no more atsc settings");
709 return atscSettings;
710 }
711 auto atsc = feConfig.getFirstAtscFrontendSettings_optional();
712 atscSettings.inversion = static_cast<FrontendSpectralInversion>(atsc->getInversion());
713 atscSettings.modulation = static_cast<FrontendAtscModulation>(atsc->getModulation());
Frankie Lizcano3ad735d2022-06-24 19:20:54 +0000714 return atscSettings;
Frankie Lizcano452b0262022-06-27 22:00:33 +0000715 }
716
Frankie Lizcano01dca3d2022-06-29 18:22:02 +0000717 static FrontendIsdbsSettings readIsdbsFrontendSettings(Frontend& feConfig) {
718 ALOGW("[ConfigReader] fe type is isdbs");
719 FrontendIsdbsSettings isdbsSettings{.frequency = (int64_t)feConfig.getFrequency()};
720 if (feConfig.hasEndFrequency()) {
Frankie Lizcano452b0262022-06-27 22:00:33 +0000721 isdbsSettings.endFrequency = (int64_t)feConfig.getEndFrequency();
Frankie Lizcano01dca3d2022-06-29 18:22:02 +0000722 }
723 if (!feConfig.hasIsdbsFrontendSettings_optional()) {
Frankie Lizcano452b0262022-06-27 22:00:33 +0000724 ALOGW("[ConfigReader] no more isdbs settings");
725 return isdbsSettings;
Frankie Lizcano01dca3d2022-06-29 18:22:02 +0000726 }
727 auto isdbs = feConfig.getFirstIsdbsFrontendSettings_optional();
728 isdbsSettings.streamId = (int32_t)isdbs->getStreamId();
729 isdbsSettings.symbolRate = (int32_t)isdbs->getSymbolRate();
730 isdbsSettings.modulation = static_cast<FrontendIsdbsModulation>(isdbs->getModulation());
731 isdbsSettings.coderate = static_cast<FrontendIsdbsCoderate>(isdbs->getCoderate());
732 isdbsSettings.rolloff = static_cast<FrontendIsdbsRolloff>(isdbs->getRolloff());
733 isdbsSettings.streamIdType =
734 static_cast<FrontendIsdbsStreamIdType>(isdbs->getStreamIdType());
735 return isdbsSettings;
Frankie Lizcano3ad735d2022-06-24 19:20:54 +0000736 }
737
Hongguang600a6ae2021-07-08 18:51:51 -0700738 static bool readFilterTypeAndSettings(Filter filterConfig, DemuxFilterType& type,
739 DemuxFilterSettings& settings) {
740 auto mainType = filterConfig.getMainType();
741 auto subType = filterConfig.getSubType();
742
743 switch (mainType) {
744 case FilterMainTypeEnum::TS: {
745 ALOGW("[ConfigReader] filter main type is ts");
746 type.mainType = DemuxFilterMainType::TS;
747 DemuxTsFilterSettings ts;
748 bool isTsSet = false;
749 switch (subType) {
750 case FilterSubTypeEnum::UNDEFINED:
Hongguangce1e30d2021-08-02 21:55:44 -0700751 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700752 DemuxTsFilterType::UNDEFINED);
753 break;
754 case FilterSubTypeEnum::SECTION:
Hongguangce1e30d2021-08-02 21:55:44 -0700755 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700756 DemuxTsFilterType::SECTION);
757 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::section>(
758 readSectionFilterSettings(filterConfig));
759 isTsSet = true;
760 break;
761 case FilterSubTypeEnum::PES:
762 // TODO: b/182519645 support all the filter settings
Hongguangce1e30d2021-08-02 21:55:44 -0700763 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700764 DemuxTsFilterType::PES);
765 break;
766 case FilterSubTypeEnum::TS:
Hongguangce1e30d2021-08-02 21:55:44 -0700767 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700768 DemuxTsFilterType::TS);
769 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::noinit>(
770 true);
771 isTsSet = true;
772 break;
773 case FilterSubTypeEnum::PCR:
Hongguangce1e30d2021-08-02 21:55:44 -0700774 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700775 DemuxTsFilterType::PCR);
776 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::noinit>(
777 true);
778 isTsSet = true;
779 break;
780 case FilterSubTypeEnum::TEMI:
Hongguangce1e30d2021-08-02 21:55:44 -0700781 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700782 DemuxTsFilterType::TEMI);
783 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::noinit>(
784 true);
785 isTsSet = true;
786 break;
787 case FilterSubTypeEnum::AUDIO:
Hongguangce1e30d2021-08-02 21:55:44 -0700788 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700789 DemuxTsFilterType::AUDIO);
790 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::av>(
791 readAvFilterSettings(filterConfig));
792 isTsSet = true;
793 break;
794 case FilterSubTypeEnum::VIDEO:
Hongguangce1e30d2021-08-02 21:55:44 -0700795 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700796 DemuxTsFilterType::VIDEO);
797 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::av>(
798 readAvFilterSettings(filterConfig));
799 isTsSet = true;
800 break;
801 case FilterSubTypeEnum::RECORD:
Hongguangce1e30d2021-08-02 21:55:44 -0700802 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700803 DemuxTsFilterType::RECORD);
804 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::record>(
805 readRecordFilterSettings(filterConfig));
806 isTsSet = true;
807 break;
808 default:
809 ALOGW("[ConfigReader] ts subtype is not supported");
810 return false;
811 }
812 if (filterConfig.hasPid()) {
813 ts.tpid = static_cast<int32_t>(filterConfig.getPid());
814 isTsSet = true;
815 }
816 if (isTsSet) {
817 settings.set<DemuxFilterSettings::Tag::ts>(ts);
818 }
819 break;
820 }
821 case FilterMainTypeEnum::MMTP: {
822 ALOGW("[ConfigReader] filter main type is mmtp");
823 type.mainType = DemuxFilterMainType::MMTP;
824 DemuxMmtpFilterSettings mmtp;
825 bool isMmtpSet = false;
826 switch (subType) {
827 case FilterSubTypeEnum::UNDEFINED:
Hongguangce1e30d2021-08-02 21:55:44 -0700828 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700829 DemuxMmtpFilterType::UNDEFINED);
830 break;
831 case FilterSubTypeEnum::SECTION:
Hongguangce1e30d2021-08-02 21:55:44 -0700832 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700833 DemuxMmtpFilterType::SECTION);
834 mmtp.filterSettings
835 .set<DemuxMmtpFilterSettingsFilterSettings::Tag::section>(
836 readSectionFilterSettings(filterConfig));
837 isMmtpSet = true;
838 break;
839 case FilterSubTypeEnum::PES:
Hongguangce1e30d2021-08-02 21:55:44 -0700840 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700841 DemuxMmtpFilterType::PES);
842 // TODO: b/182519645 support all the filter settings
843 break;
844 case FilterSubTypeEnum::MMTP:
Hongguangce1e30d2021-08-02 21:55:44 -0700845 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700846 DemuxMmtpFilterType::MMTP);
847 mmtp.filterSettings.set<DemuxMmtpFilterSettingsFilterSettings::Tag::noinit>(
848 true);
849 isMmtpSet = true;
850 break;
851 case FilterSubTypeEnum::AUDIO:
Hongguangce1e30d2021-08-02 21:55:44 -0700852 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700853 DemuxMmtpFilterType::AUDIO);
854 mmtp.filterSettings.set<DemuxMmtpFilterSettingsFilterSettings::Tag::av>(
855 readAvFilterSettings(filterConfig));
856 isMmtpSet = true;
857 break;
858 case FilterSubTypeEnum::VIDEO:
Hongguangce1e30d2021-08-02 21:55:44 -0700859 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700860 DemuxMmtpFilterType::VIDEO);
861 mmtp.filterSettings.set<DemuxMmtpFilterSettingsFilterSettings::Tag::av>(
862 readAvFilterSettings(filterConfig));
863 isMmtpSet = true;
864 break;
865 case FilterSubTypeEnum::RECORD:
Hongguangce1e30d2021-08-02 21:55:44 -0700866 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700867 DemuxMmtpFilterType::RECORD);
868 mmtp.filterSettings.set<DemuxMmtpFilterSettingsFilterSettings::Tag::record>(
869 readRecordFilterSettings(filterConfig));
870 isMmtpSet = true;
871 break;
872 case FilterSubTypeEnum::DOWNLOAD:
Hongguangce1e30d2021-08-02 21:55:44 -0700873 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700874 DemuxMmtpFilterType::DOWNLOAD);
875 // TODO: b/182519645 support all the filter settings
876 break;
877 default:
878 ALOGW("[ConfigReader] mmtp subtype is not supported");
879 return false;
880 }
881 if (filterConfig.hasPid()) {
882 mmtp.mmtpPid = static_cast<int32_t>(filterConfig.getPid());
883 isMmtpSet = true;
884 }
885 if (isMmtpSet) {
886 settings.set<DemuxFilterSettings::Tag::mmtp>(mmtp);
887 }
888 break;
889 }
890 case FilterMainTypeEnum::IP: {
891 ALOGW("[ConfigReader] filter main type is ip");
892 type.mainType = DemuxFilterMainType::IP;
893 DemuxIpFilterSettings ip;
894 switch (subType) {
895 case FilterSubTypeEnum::UNDEFINED:
Hongguangce1e30d2021-08-02 21:55:44 -0700896 type.subType.set<DemuxFilterSubType::Tag::ipFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700897 DemuxIpFilterType::UNDEFINED);
898 break;
899 case FilterSubTypeEnum::SECTION:
Hongguangce1e30d2021-08-02 21:55:44 -0700900 type.subType.set<DemuxFilterSubType::Tag::ipFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700901 DemuxIpFilterType::SECTION);
902 ip.filterSettings.set<DemuxIpFilterSettingsFilterSettings::Tag::section>(
903 readSectionFilterSettings(filterConfig));
904 settings.set<DemuxFilterSettings::Tag::ip>(ip);
905 break;
906 case FilterSubTypeEnum::NTP:
Hongguangce1e30d2021-08-02 21:55:44 -0700907 type.subType.set<DemuxFilterSubType::Tag::ipFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700908 DemuxIpFilterType::NTP);
909 ip.filterSettings.set<DemuxIpFilterSettingsFilterSettings::Tag::noinit>(
910 true);
911 settings.set<DemuxFilterSettings::Tag::ip>(ip);
912 break;
913 case FilterSubTypeEnum::IP: {
Gareth Fenn9a808452022-03-31 08:40:00 +0100914 type.subType.set<DemuxFilterSubType::Tag::ipFilterType>(
915 DemuxIpFilterType::IP);
Hongguang600a6ae2021-07-08 18:51:51 -0700916 ip.ipAddr = readIpAddress(filterConfig),
917 ip.filterSettings
918 .set<DemuxIpFilterSettingsFilterSettings::Tag::bPassthrough>(
919 readPassthroughSettings(filterConfig));
920 settings.set<DemuxFilterSettings::Tag::ip>(ip);
921 break;
922 }
923 case FilterSubTypeEnum::IP_PAYLOAD:
Hongguangce1e30d2021-08-02 21:55:44 -0700924 type.subType.set<DemuxFilterSubType::Tag::ipFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700925 DemuxIpFilterType::IP_PAYLOAD);
926 ip.filterSettings.set<DemuxIpFilterSettingsFilterSettings::Tag::noinit>(
927 true);
928 settings.set<DemuxFilterSettings::Tag::ip>(ip);
929 break;
930 case FilterSubTypeEnum::PAYLOAD_THROUGH:
Hongguangce1e30d2021-08-02 21:55:44 -0700931 type.subType.set<DemuxFilterSubType::Tag::ipFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700932 DemuxIpFilterType::PAYLOAD_THROUGH);
933 ip.filterSettings.set<DemuxIpFilterSettingsFilterSettings::Tag::noinit>(
934 true);
935 settings.set<DemuxFilterSettings::Tag::ip>(ip);
936 break;
937 default:
938 ALOGW("[ConfigReader] mmtp subtype is not supported");
939 return false;
940 }
941 break;
942 }
943 default:
944 // TODO: b/182519645 support all the filter configs
945 ALOGW("[ConfigReader] filter main type is not supported in dynamic config");
946 return false;
947 }
948 return true;
949 }
950
951 static DemuxIpAddress readIpAddress(Filter filterConfig) {
952 DemuxIpAddress ipAddress;
953 vector<uint8_t> data;
954 if (!filterConfig.hasIpFilterConfig_optional()) {
955 return ipAddress;
956 }
957 auto ipFilterConfig = filterConfig.getFirstIpFilterConfig_optional();
958 if (ipFilterConfig->hasSrcPort()) {
959 ipAddress.srcPort = ipFilterConfig->getSrcPort();
960 }
961 if (ipFilterConfig->hasDestPort()) {
962 ipAddress.dstPort = ipFilterConfig->getDestPort();
963 }
964 if (ipFilterConfig->getFirstSrcIpAddress()->getIsIpV4()) {
965 data.resize(4);
966 memcpy(data.data(), ipFilterConfig->getFirstSrcIpAddress()->getIp().data(), 4);
967 ipAddress.srcIpAddress.set<DemuxIpAddressIpAddress::Tag::v4>(data);
968 } else {
969 data.resize(6);
970 memcpy(data.data(), ipFilterConfig->getFirstSrcIpAddress()->getIp().data(), 6);
971 ipAddress.srcIpAddress.set<DemuxIpAddressIpAddress::Tag::v6>(data);
972 }
973 if (ipFilterConfig->getFirstDestIpAddress()->getIsIpV4()) {
974 data.resize(4);
975 memcpy(data.data(), ipFilterConfig->getFirstDestIpAddress()->getIp().data(), 4);
976 ipAddress.dstIpAddress.set<DemuxIpAddressIpAddress::Tag::v4>(data);
977 } else {
978 data.resize(6);
979 memcpy(data.data(), ipFilterConfig->getFirstDestIpAddress()->getIp().data(), 6);
980 ipAddress.dstIpAddress.set<DemuxIpAddressIpAddress::Tag::v6>(data);
981 }
982 return ipAddress;
983 }
984
985 static bool readPassthroughSettings(Filter filterConfig) {
986 if (!filterConfig.hasIpFilterConfig_optional()) {
987 return false;
988 }
989 auto ipFilterConfig = filterConfig.getFirstIpFilterConfig_optional();
990 if (ipFilterConfig->hasDataPassthrough()) {
991 return ipFilterConfig->getDataPassthrough();
992 }
993 return false;
994 }
995
996 static DemuxFilterSectionSettings readSectionFilterSettings(Filter filterConfig) {
997 DemuxFilterSectionSettings settings;
998 if (!filterConfig.hasSectionFilterSettings_optional()) {
999 return settings;
1000 }
1001 auto section = filterConfig.getFirstSectionFilterSettings_optional();
1002 settings.isCheckCrc = section->getIsCheckCrc();
1003 settings.isRepeat = section->getIsRepeat();
1004 settings.isRaw = section->getIsRaw();
Hongguang494ba662022-01-05 22:08:10 -08001005 settings.bitWidthOfLengthField = section->getBitWidthOfLengthField();
Hongguang600a6ae2021-07-08 18:51:51 -07001006 return settings;
1007 }
1008
1009 static DemuxFilterAvSettings readAvFilterSettings(Filter filterConfig) {
1010 DemuxFilterAvSettings settings;
1011 if (!filterConfig.hasAvFilterSettings_optional()) {
1012 return settings;
1013 }
1014 auto av = filterConfig.getFirstAvFilterSettings_optional();
1015 settings.isPassthrough = av->getIsPassthrough();
Hongguang16dacc12021-11-01 15:51:52 -07001016 settings.isSecureMemory = av->getIsSecureMemory();
Hongguang600a6ae2021-07-08 18:51:51 -07001017 return settings;
1018 }
1019
1020 static DemuxFilterRecordSettings readRecordFilterSettings(Filter filterConfig) {
1021 DemuxFilterRecordSettings settings;
1022 if (!filterConfig.hasRecordFilterSettings_optional()) {
1023 return settings;
1024 }
1025 auto record = filterConfig.getFirstRecordFilterSettings_optional();
1026 settings.tsIndexMask = record->getTsIndexMask();
1027 settings.scIndexType = static_cast<DemuxRecordScIndexType>(record->getScIndexType());
1028 return settings;
1029 }
1030
1031 static PlaybackSettings readPlaybackSettings(Dvr dvrConfig) {
1032 ALOGW("[ConfigReader] dvr type is playback");
1033 PlaybackSettings playbackSettings{
Hongguang11da2cb2021-08-05 19:05:12 -07001034 .statusMask = static_cast<int8_t>(dvrConfig.getStatusMask()),
1035 .lowThreshold = static_cast<int64_t>(dvrConfig.getLowThreshold()),
1036 .highThreshold = static_cast<int64_t>(dvrConfig.getHighThreshold()),
Hongguang600a6ae2021-07-08 18:51:51 -07001037 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
Hongguang11da2cb2021-08-05 19:05:12 -07001038 .packetSize = static_cast<int64_t>(dvrConfig.getPacketSize()),
Hongguang600a6ae2021-07-08 18:51:51 -07001039 };
1040 return playbackSettings;
1041 }
1042
1043 static RecordSettings readRecordSettings(Dvr dvrConfig) {
1044 ALOGW("[ConfigReader] dvr type is record");
1045 RecordSettings recordSettings{
Hongguang11da2cb2021-08-05 19:05:12 -07001046 .statusMask = static_cast<int8_t>(dvrConfig.getStatusMask()),
1047 .lowThreshold = static_cast<int64_t>(dvrConfig.getLowThreshold()),
1048 .highThreshold = static_cast<int64_t>(dvrConfig.getHighThreshold()),
Hongguang600a6ae2021-07-08 18:51:51 -07001049 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
Hongguang11da2cb2021-08-05 19:05:12 -07001050 .packetSize = static_cast<int64_t>(dvrConfig.getPacketSize()),
Hongguang600a6ae2021-07-08 18:51:51 -07001051 };
1052 return recordSettings;
1053 }
1054
Hongguange106f472022-01-11 12:09:22 -08001055 static void getCiCamInfo(Frontend feConfig, bool& canConnectToCiCam, int32_t& ciCamId,
1056 int32_t& removePid) {
Hongguang600a6ae2021-07-08 18:51:51 -07001057 if (!feConfig.hasConnectToCicamId()) {
1058 canConnectToCiCam = false;
1059 ciCamId = -1;
Hongguange106f472022-01-11 12:09:22 -08001060 removePid = -1;
Gareth Fenn53ae3832021-10-15 17:19:00 +01001061 return;
Hongguang600a6ae2021-07-08 18:51:51 -07001062 }
1063 canConnectToCiCam = true;
1064 ciCamId = static_cast<int32_t>(feConfig.getConnectToCicamId());
Hongguange106f472022-01-11 12:09:22 -08001065 removePid = static_cast<int32_t>(feConfig.getRemoveOutputPid());
Hongguang600a6ae2021-07-08 18:51:51 -07001066 }
1067};