blob: 3991267ebad94f05950349e4debe2cc1907c2771 [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;
Frankie Lizcano50461932022-06-28 21:36:26 +0000149 bool hasExtraFilters = false;
Hongguang600a6ae2021-07-08 18:51:51 -0700150 string frontendId;
151 string dvrId;
152 string audioFilterId;
153 string videoFilterId;
154 string sectionFilterId;
Frankie Lizcano50461932022-06-28 21:36:26 +0000155 vector<string> extraFilters;
Hongguang600a6ae2021-07-08 18:51:51 -0700156};
157
158struct DvrRecordHardwareConnections {
159 bool support;
160 bool hasFrontendConnection;
161 string frontendId;
162 string dvrRecordId;
163 string dvrSoftwareFeId;
164 string recordFilterId;
165 string dvrSourceId;
166};
167
168struct DescramblingHardwareConnections {
169 bool support;
170 bool hasFrontendConnection;
171 string frontendId;
172 string dvrSoftwareFeId;
173 string audioFilterId;
174 string videoFilterId;
175 string descramblerId;
176 string dvrSourceId;
Frankie Lizcanof5352122022-06-29 22:10:16 +0000177 vector<string> extraFilters;
Hongguang600a6ae2021-07-08 18:51:51 -0700178};
179
180struct LnbLiveHardwareConnections {
181 bool support;
182 string frontendId;
183 string audioFilterId;
184 string videoFilterId;
185 string lnbId;
186 vector<string> diseqcMsgs;
Frankie Lizcano647d5aa2022-06-30 20:49:31 +0000187 vector<string> extraFilters;
Hongguang600a6ae2021-07-08 18:51:51 -0700188};
189
190struct LnbRecordHardwareConnections {
191 bool support;
192 string frontendId;
193 string dvrRecordId;
194 string recordFilterId;
195 string lnbId;
196 vector<string> diseqcMsgs;
Frankie Lizcano647d5aa2022-06-30 20:49:31 +0000197 vector<string> extraFilters;
Hongguang600a6ae2021-07-08 18:51:51 -0700198};
199
200struct TimeFilterHardwareConnections {
201 bool support;
202 string timeFilterId;
203};
204
205struct TunerTestingConfigAidlReader1_0 {
206 public:
207 static void setConfigFilePath(string path) { mConfigFilePath = path; }
208
209 static bool checkConfigFileExists() {
210 auto res = read(mConfigFilePath.c_str());
211 if (res == nullopt) {
212 ALOGW("[ConfigReader] Couldn't read %s."
213 "Please check tuner_testing_dynamic_configuration.xsd"
214 "and sample_tuner_vts_config.xml for more details on how to config Tune VTS.",
215 mConfigFilePath.c_str());
216 }
217 return (res != nullopt);
218 }
219
220 static TunerConfiguration getTunerConfig() { return *read(mConfigFilePath.c_str()); }
221
222 static DataFlowConfiguration getDataFlowConfiguration() {
223 return *getTunerConfig().getFirstDataFlowConfiguration();
224 }
225
226 static HardwareConfiguration getHardwareConfig() {
227 return *getTunerConfig().getFirstHardwareConfiguration();
228 }
229
230 static void readFrontendConfig1_0(map<string, FrontendConfig>& frontendMap) {
231 auto hardwareConfig = getHardwareConfig();
232 if (hardwareConfig.hasFrontends()) {
233 // TODO: b/182519645 complete the tune status config
234 vector<FrontendStatusType> types;
235 vector<FrontendStatus> statuses;
236
237 types.push_back(FrontendStatusType::DEMOD_LOCK);
238 types.push_back(FrontendStatusType::UEC);
239 types.push_back(FrontendStatusType::IS_MISO);
240
241 FrontendStatus status;
242 status.set<FrontendStatus::Tag::isDemodLocked>(true);
243 statuses.push_back(status);
244 status.set<FrontendStatus::Tag::uec>(4);
245 statuses.push_back(status);
246 status.set<FrontendStatus::Tag::isMiso>(true);
247 statuses.push_back(status);
248
249 auto frontends = *hardwareConfig.getFirstFrontends();
250 for (auto feConfig : frontends.getFrontend()) {
251 string id = feConfig.getId();
252 if (id.compare(string("FE_DEFAULT")) == 0) {
253 // overrid default
254 frontendMap.erase(string("FE_DEFAULT"));
255 }
256 FrontendType type;
257 switch (feConfig.getType()) {
258 case FrontendTypeEnum::UNDEFINED:
259 type = FrontendType::UNDEFINED;
260 break;
261 // TODO: b/182519645 finish all other frontend settings
262 case FrontendTypeEnum::ANALOG:
263 type = FrontendType::ANALOG;
264 break;
265 case FrontendTypeEnum::ATSC:
266 type = FrontendType::ATSC;
Frankie Lizcano3ad735d2022-06-24 19:20:54 +0000267 frontendMap[id].settings.set<
268 FrontendSettings::Tag::atsc>(
269 readAtscFrontendSettings(feConfig));
Hongguang600a6ae2021-07-08 18:51:51 -0700270 break;
271 case FrontendTypeEnum::ATSC3:
272 type = FrontendType::ATSC3;
273 break;
274 case FrontendTypeEnum::DVBC:
275 type = FrontendType::DVBC;
276 break;
277 case FrontendTypeEnum::DVBS:
278 type = FrontendType::DVBS;
279 frontendMap[id].settings.set<FrontendSettings::Tag::dvbs>(
280 readDvbsFrontendSettings(feConfig));
281 break;
282 case FrontendTypeEnum::DVBT: {
283 type = FrontendType::DVBT;
284 frontendMap[id].settings.set<FrontendSettings::Tag::dvbt>(
285 readDvbtFrontendSettings(feConfig));
286 break;
287 }
288 case FrontendTypeEnum::ISDBS:
289 type = FrontendType::ISDBS;
Frankie Lizcano452b0262022-06-27 22:00:33 +0000290 frontendMap[id].settings.set<
291 FrontendSettings::Tag::isdbs>(
292 readIsdbsFrontendSettings(feConfig));
Hongguang600a6ae2021-07-08 18:51:51 -0700293 break;
294 case FrontendTypeEnum::ISDBS3:
295 type = FrontendType::ISDBS3;
296 break;
297 case FrontendTypeEnum::ISDBT:
298 type = FrontendType::ISDBT;
299 break;
300 case FrontendTypeEnum::DTMB:
301 type = FrontendType::DTMB;
302 break;
303 case FrontendTypeEnum::UNKNOWN:
304 ALOGW("[ConfigReader] invalid frontend type");
305 return;
306 default:
307 ALOGW("[ConfigReader] fe already handled in 1_0 reader.");
308 break;
309 }
310 frontendMap[id].type = type;
311 frontendMap[id].isSoftwareFe = feConfig.getIsSoftwareFrontend();
312 // TODO: b/182519645 complete the tune status config
313 frontendMap[id].tuneStatusTypes = types;
314 frontendMap[id].expectTuneStatuses = statuses;
Hongguange106f472022-01-11 12:09:22 -0800315 getCiCamInfo(feConfig, frontendMap[id].canConnectToCiCam, frontendMap[id].ciCamId,
316 frontendMap[id].removePid);
Hongguang600a6ae2021-07-08 18:51:51 -0700317 }
318 }
319 }
320
321 static void readFilterConfig1_0(map<string, FilterConfig>& filterMap) {
322 auto hardwareConfig = getHardwareConfig();
323 if (hardwareConfig.hasFilters()) {
324 auto filters = *hardwareConfig.getFirstFilters();
325 for (auto filterConfig : filters.getFilter()) {
326 string id = filterConfig.getId();
327 if (id.compare(string("FILTER_AUDIO_DEFAULT")) == 0) {
328 // overrid default
329 filterMap.erase(string("FILTER_AUDIO_DEFAULT"));
330 }
331 if (id.compare(string("FILTER_VIDEO_DEFAULT")) == 0) {
332 // overrid default
333 filterMap.erase(string("FILTER_VIDEO_DEFAULT"));
334 }
335
336 DemuxFilterType type;
337 DemuxFilterSettings settings;
338 if (!readFilterTypeAndSettings(filterConfig, type, settings)) {
339 ALOGW("[ConfigReader] invalid filter type");
340 return;
341 }
342 filterMap[id].type = type;
343 filterMap[id].bufferSize = filterConfig.getBufferSize();
344 filterMap[id].getMqDesc = filterConfig.getUseFMQ();
345 filterMap[id].settings = settings;
346
347 if (filterConfig.hasMonitorEventTypes()) {
Hongguang11da2cb2021-08-05 19:05:12 -0700348 filterMap[id].monitorEventTypes = (int32_t)filterConfig.getMonitorEventTypes();
Hongguang600a6ae2021-07-08 18:51:51 -0700349 }
Patrick Rohr1586d212021-11-23 00:40:56 +0100350 if (filterConfig.hasTimeDelayInMs()) {
351 filterMap[id].timeDelayInMs = filterConfig.getTimeDelayInMs();
352 }
353 if (filterConfig.hasDataDelayInBytes()) {
354 filterMap[id].dataDelayInBytes = filterConfig.getDataDelayInBytes();
355 }
Hongguang600a6ae2021-07-08 18:51:51 -0700356 if (filterConfig.hasAvFilterSettings_optional()) {
357 auto av = filterConfig.getFirstAvFilterSettings_optional();
358 if (av->hasAudioStreamType_optional()) {
359 filterMap[id].streamType.set<AvStreamType::Tag::audio>(
360 static_cast<AudioStreamType>(av->getAudioStreamType_optional()));
361 }
362 if (av->hasVideoStreamType_optional()) {
363 filterMap[id].streamType.set<AvStreamType::Tag::video>(
364 static_cast<VideoStreamType>(av->getVideoStreamType_optional()));
365 }
366 }
367 if (filterConfig.hasIpFilterConfig_optional()) {
368 auto ip = filterConfig.getFirstIpFilterConfig_optional();
369 if (ip->hasIpCid()) {
370 filterMap[id].ipCid = ip->getIpCid();
371 }
372 }
373 }
374 }
375 }
376
377 static void readDvrConfig1_0(map<string, DvrConfig>& dvrMap) {
378 auto hardwareConfig = getHardwareConfig();
379 if (hardwareConfig.hasDvrs()) {
380 auto dvrs = *hardwareConfig.getFirstDvrs();
381 for (auto dvrConfig : dvrs.getDvr()) {
382 string id = dvrConfig.getId();
383 DvrType type;
384 switch (dvrConfig.getType()) {
385 case DvrTypeEnum::PLAYBACK:
386 type = DvrType::PLAYBACK;
387 dvrMap[id].settings.set<DvrSettings::Tag::playback>(
388 readPlaybackSettings(dvrConfig));
389 break;
390 case DvrTypeEnum::RECORD:
391 type = DvrType::RECORD;
392 dvrMap[id].settings.set<DvrSettings::Tag::record>(
393 readRecordSettings(dvrConfig));
394 break;
395 case DvrTypeEnum::UNKNOWN:
396 ALOGW("[ConfigReader] invalid DVR type");
397 return;
398 }
399 dvrMap[id].type = type;
Hongguang11da2cb2021-08-05 19:05:12 -0700400 dvrMap[id].bufferSize = static_cast<int32_t>(dvrConfig.getBufferSize());
Hongguang600a6ae2021-07-08 18:51:51 -0700401 if (dvrConfig.hasInputFilePath()) {
402 dvrMap[id].playbackInputFile = dvrConfig.getInputFilePath();
403 }
404 }
405 }
406 }
407
408 static void readLnbConfig1_0(map<string, LnbConfig>& lnbMap) {
409 auto hardwareConfig = getHardwareConfig();
410 if (hardwareConfig.hasLnbs()) {
411 auto lnbs = *hardwareConfig.getFirstLnbs();
412 for (auto lnbConfig : lnbs.getLnb()) {
413 string id = lnbConfig.getId();
414 if (lnbConfig.hasName()) {
415 lnbMap[id].name = lnbConfig.getName();
416 } else {
417 lnbMap[id].name = emptyHardwareId;
418 }
419 lnbMap[id].voltage = static_cast<LnbVoltage>(lnbConfig.getVoltage());
420 lnbMap[id].tone = static_cast<LnbTone>(lnbConfig.getTone());
421 lnbMap[id].position = static_cast<LnbPosition>(lnbConfig.getPosition());
422 }
423 }
424 }
425
426 static void readDescramblerConfig1_0(map<string, DescramblerConfig>& descramblerMap) {
427 auto hardwareConfig = getHardwareConfig();
428 if (hardwareConfig.hasDescramblers()) {
429 auto descramblers = *hardwareConfig.getFirstDescramblers();
430 for (auto descramblerConfig : descramblers.getDescrambler()) {
431 string id = descramblerConfig.getId();
432 descramblerMap[id].casSystemId =
Hongguang11da2cb2021-08-05 19:05:12 -0700433 static_cast<int32_t>(descramblerConfig.getCasSystemId());
Hongguang600a6ae2021-07-08 18:51:51 -0700434 if (descramblerConfig.hasProvisionStr()) {
435 descramblerMap[id].provisionStr = descramblerConfig.getProvisionStr();
436 } else {
437 descramblerMap[id].provisionStr = PROVISION_STR;
438 }
439 if (descramblerConfig.hasSesstionPrivatData()) {
440 auto privateData = descramblerConfig.getSesstionPrivatData();
441 int size = privateData.size();
442 descramblerMap[id].hidlPvtData.resize(size);
443 memcpy(descramblerMap[id].hidlPvtData.data(), privateData.data(), size);
444 } else {
445 descramblerMap[id].hidlPvtData.resize(256);
446 }
447 }
448 }
449 }
450
451 static void readDiseqcMessages(map<string, vector<uint8_t>>& diseqcMsgMap) {
452 auto hardwareConfig = getHardwareConfig();
453 if (hardwareConfig.hasDiseqcMessages()) {
454 auto msgs = *hardwareConfig.getFirstDiseqcMessages();
455 for (auto msgConfig : msgs.getDiseqcMessage()) {
456 string name = msgConfig.getMsgName();
457 for (uint8_t atom : msgConfig.getMsgBody()) {
458 diseqcMsgMap[name].push_back(atom);
459 }
460 }
461 }
462 }
463
464 static void readTimeFilterConfig1_0(map<string, TimeFilterConfig>& timeFilterMap) {
465 auto hardwareConfig = getHardwareConfig();
466 if (hardwareConfig.hasTimeFilters()) {
467 auto timeFilters = *hardwareConfig.getFirstTimeFilters();
468 for (auto timeFilterConfig : timeFilters.getTimeFilter()) {
469 string id = timeFilterConfig.getId();
Hongguang11da2cb2021-08-05 19:05:12 -0700470 timeFilterMap[id].timeStamp = static_cast<int64_t>(timeFilterConfig.getTimeStamp());
Hongguang600a6ae2021-07-08 18:51:51 -0700471 }
472 }
473 }
474
475 static void connectLiveBroadcast(LiveBroadcastHardwareConnections& live) {
476 auto dataFlow = getDataFlowConfiguration();
477 if (dataFlow.hasClearLiveBroadcast()) {
478 live.hasFrontendConnection = true;
479 } else {
480 live.hasFrontendConnection = false;
481 return;
482 }
483 auto liveConfig = *dataFlow.getFirstClearLiveBroadcast();
484 live.frontendId = liveConfig.getFrontendConnection();
485
486 live.audioFilterId = liveConfig.getAudioFilterConnection();
487 live.videoFilterId = liveConfig.getVideoFilterConnection();
488 if (liveConfig.hasPcrFilterConnection()) {
489 live.pcrFilterId = liveConfig.getPcrFilterConnection();
490 } else {
491 live.pcrFilterId = emptyHardwareId;
492 }
493 if (liveConfig.hasSectionFilterConnection()) {
494 live.sectionFilterId = liveConfig.getSectionFilterConnection();
495 } else {
496 live.sectionFilterId = emptyHardwareId;
497 }
498 if (liveConfig.hasDvrSoftwareFeConnection()) {
499 live.dvrSoftwareFeId = liveConfig.getDvrSoftwareFeConnection();
500 }
501 if (liveConfig.hasIpFilterConnection()) {
502 live.ipFilterId = liveConfig.getIpFilterConnection();
503 } else {
504 live.ipFilterId = emptyHardwareId;
505 }
506 }
507
508 static void connectScan(ScanHardwareConnections& scan) {
509 auto dataFlow = getDataFlowConfiguration();
510 if (dataFlow.hasScan()) {
511 scan.hasFrontendConnection = true;
512 } else {
513 scan.hasFrontendConnection = false;
514 return;
515 }
516 auto scanConfig = *dataFlow.getFirstScan();
517 scan.frontendId = scanConfig.getFrontendConnection();
518 }
519
520 static void connectDvrPlayback(DvrPlaybackHardwareConnections& playback) {
521 auto dataFlow = getDataFlowConfiguration();
522 if (dataFlow.hasDvrPlayback()) {
523 playback.support = true;
524 } else {
525 playback.support = false;
526 return;
527 }
528 auto playbackConfig = *dataFlow.getFirstDvrPlayback();
529 playback.dvrId = playbackConfig.getDvrConnection();
530 playback.audioFilterId = playbackConfig.getAudioFilterConnection();
531 playback.videoFilterId = playbackConfig.getVideoFilterConnection();
532 if (playbackConfig.hasSectionFilterConnection()) {
533 playback.sectionFilterId = playbackConfig.getSectionFilterConnection();
534 } else {
535 playback.sectionFilterId = emptyHardwareId;
536 }
Frankie Lizcano50461932022-06-28 21:36:26 +0000537 if (playbackConfig.hasOptionalFilters() && !playback.hasExtraFilters) {
538 auto optionalFilters = playbackConfig.getFirstOptionalFilters()->getOptionalFilter();
539 for (size_t i = 0; i < optionalFilters.size(); ++i) {
540 playback.extraFilters.push_back(optionalFilters[i].getFilterId());
541 }
542 playback.hasExtraFilters = true;
543 }
Hongguang600a6ae2021-07-08 18:51:51 -0700544 }
545
546 static void connectDvrRecord(DvrRecordHardwareConnections& record) {
547 auto dataFlow = getDataFlowConfiguration();
548 if (dataFlow.hasDvrRecord()) {
549 record.support = true;
550 } else {
551 record.support = false;
552 return;
553 }
554 auto recordConfig = *dataFlow.getFirstDvrRecord();
555 record.recordFilterId = recordConfig.getRecordFilterConnection();
556 record.dvrRecordId = recordConfig.getDvrRecordConnection();
557 if (recordConfig.hasDvrSoftwareFeConnection()) {
558 record.dvrSoftwareFeId = recordConfig.getDvrSoftwareFeConnection();
559 }
560 if (recordConfig.getHasFrontendConnection()) {
561 record.hasFrontendConnection = true;
562 record.dvrSourceId = emptyHardwareId;
563 record.frontendId = recordConfig.getFrontendConnection();
564 } else {
565 record.hasFrontendConnection = false;
566 record.dvrSourceId = recordConfig.getDvrSourceConnection();
567 }
568 }
569
570 static void connectDescrambling(DescramblingHardwareConnections& descrambling) {
571 auto dataFlow = getDataFlowConfiguration();
572 if (dataFlow.hasDescrambling()) {
573 descrambling.support = true;
574 } else {
575 descrambling.support = false;
576 return;
577 }
578 auto descConfig = *dataFlow.getFirstDescrambling();
579 descrambling.descramblerId = descConfig.getDescramblerConnection();
580 descrambling.audioFilterId = descConfig.getAudioFilterConnection();
581 descrambling.videoFilterId = descConfig.getVideoFilterConnection();
582 if (descConfig.hasDvrSoftwareFeConnection()) {
583 descrambling.dvrSoftwareFeId = descConfig.getDvrSoftwareFeConnection();
584 }
585 if (descConfig.getHasFrontendConnection()) {
586 descrambling.hasFrontendConnection = true;
587 descrambling.dvrSourceId = emptyHardwareId;
588 descrambling.frontendId = descConfig.getFrontendConnection();
589 } else {
590 descrambling.hasFrontendConnection = false;
591 descrambling.dvrSourceId = descConfig.getDvrSourceConnection();
592 }
Frankie Lizcanof5352122022-06-29 22:10:16 +0000593 if (descConfig.hasOptionalFilters()) {
594 auto optionalFilters = descConfig.getOptionalFilters();
595 descrambling.extraFilters = optionalFilters;
596 }
Hongguang600a6ae2021-07-08 18:51:51 -0700597 }
598
599 static void connectLnbLive(LnbLiveHardwareConnections& lnbLive) {
600 auto dataFlow = getDataFlowConfiguration();
601 if (dataFlow.hasLnbLive()) {
602 lnbLive.support = true;
603 } else {
604 lnbLive.support = false;
605 return;
606 }
607 auto lnbLiveConfig = *dataFlow.getFirstLnbLive();
608 lnbLive.frontendId = lnbLiveConfig.getFrontendConnection();
609 lnbLive.audioFilterId = lnbLiveConfig.getAudioFilterConnection();
610 lnbLive.videoFilterId = lnbLiveConfig.getVideoFilterConnection();
611 lnbLive.lnbId = lnbLiveConfig.getLnbConnection();
612 if (lnbLiveConfig.hasDiseqcMsgSender()) {
613 for (auto msgName : lnbLiveConfig.getDiseqcMsgSender()) {
614 lnbLive.diseqcMsgs.push_back(msgName);
615 }
616 }
Frankie Lizcano647d5aa2022-06-30 20:49:31 +0000617 if (lnbLiveConfig.hasOptionalFilters()) {
618 auto optionalFilters = lnbLiveConfig.getOptionalFilters();
619 lnbLive.extraFilters = optionalFilters;
620 }
Hongguang600a6ae2021-07-08 18:51:51 -0700621 }
622
623 static void connectLnbRecord(LnbRecordHardwareConnections& lnbRecord) {
624 auto dataFlow = getDataFlowConfiguration();
625 if (dataFlow.hasLnbRecord()) {
626 lnbRecord.support = true;
627 } else {
628 lnbRecord.support = false;
629 return;
630 }
631 auto lnbRecordConfig = *dataFlow.getFirstLnbRecord();
632 lnbRecord.frontendId = lnbRecordConfig.getFrontendConnection();
633 lnbRecord.recordFilterId = lnbRecordConfig.getRecordFilterConnection();
634 lnbRecord.dvrRecordId = lnbRecordConfig.getDvrRecordConnection();
635 lnbRecord.lnbId = lnbRecordConfig.getLnbConnection();
636 if (lnbRecordConfig.hasDiseqcMsgSender()) {
637 for (auto msgName : lnbRecordConfig.getDiseqcMsgSender()) {
638 lnbRecord.diseqcMsgs.push_back(msgName);
639 }
640 }
Frankie Lizcano647d5aa2022-06-30 20:49:31 +0000641 if (lnbRecordConfig.hasOptionalFilters()) {
642 auto optionalFilters = lnbRecordConfig.getOptionalFilters();
643 lnbRecord.extraFilters = optionalFilters;
644 }
Hongguang600a6ae2021-07-08 18:51:51 -0700645 }
646
647 static void connectTimeFilter(TimeFilterHardwareConnections& timeFilter) {
648 auto dataFlow = getDataFlowConfiguration();
649 if (dataFlow.hasTimeFilter()) {
650 timeFilter.support = true;
651 } else {
652 timeFilter.support = false;
653 return;
654 }
655 auto timeFilterConfig = *dataFlow.getFirstTimeFilter();
656 timeFilter.timeFilterId = timeFilterConfig.getTimeFilterConnection();
657 }
658
659 private:
660 static FrontendDvbtSettings readDvbtFrontendSettings(Frontend feConfig) {
661 ALOGW("[ConfigReader] fe type is dvbt");
662 FrontendDvbtSettings dvbtSettings{
Hongguang11da2cb2021-08-05 19:05:12 -0700663 .frequency = (int64_t)feConfig.getFrequency(),
Hongguang600a6ae2021-07-08 18:51:51 -0700664 };
Hongguang11da2cb2021-08-05 19:05:12 -0700665 if (feConfig.hasEndFrequency()) {
666 dvbtSettings.endFrequency = (int64_t)feConfig.getEndFrequency();
667 }
Hongguang600a6ae2021-07-08 18:51:51 -0700668 if (!feConfig.hasDvbtFrontendSettings_optional()) {
669 ALOGW("[ConfigReader] no more dvbt settings");
670 return dvbtSettings;
671 }
672 auto dvbt = feConfig.getFirstDvbtFrontendSettings_optional();
Hongguang11da2cb2021-08-05 19:05:12 -0700673 int32_t trans = static_cast<int32_t>(dvbt->getTransmissionMode());
Hongguang600a6ae2021-07-08 18:51:51 -0700674 dvbtSettings.transmissionMode = static_cast<FrontendDvbtTransmissionMode>(trans);
675 dvbtSettings.bandwidth = static_cast<FrontendDvbtBandwidth>(dvbt->getBandwidth());
676 dvbtSettings.isHighPriority = dvbt->getIsHighPriority();
677 dvbtSettings.hierarchy = static_cast<FrontendDvbtHierarchy>(dvbt->getHierarchy());
678 dvbtSettings.hpCoderate = static_cast<FrontendDvbtCoderate>(dvbt->getHpCoderate());
679 dvbtSettings.lpCoderate = static_cast<FrontendDvbtCoderate>(dvbt->getLpCoderate());
680 dvbtSettings.guardInterval =
681 static_cast<FrontendDvbtGuardInterval>(dvbt->getGuardInterval());
682 dvbtSettings.standard = static_cast<FrontendDvbtStandard>(dvbt->getStandard());
683 dvbtSettings.isMiso = dvbt->getIsMiso();
684 dvbtSettings.plpMode = static_cast<FrontendDvbtPlpMode>(dvbt->getPlpMode());
685 dvbtSettings.plpId = dvbt->getPlpId();
686 dvbtSettings.plpGroupId = dvbt->getPlpGroupId();
687 if (dvbt->hasConstellation()) {
688 dvbtSettings.constellation =
689 static_cast<FrontendDvbtConstellation>(dvbt->getConstellation());
690 }
691 return dvbtSettings;
692 }
693
694 static FrontendDvbsSettings readDvbsFrontendSettings(Frontend feConfig) {
695 ALOGW("[ConfigReader] fe type is dvbs");
696 FrontendDvbsSettings dvbsSettings{
Hongguang11da2cb2021-08-05 19:05:12 -0700697 .frequency = (int64_t)feConfig.getFrequency(),
Hongguang600a6ae2021-07-08 18:51:51 -0700698 };
Hongguang11da2cb2021-08-05 19:05:12 -0700699 if (feConfig.hasEndFrequency()) {
700 dvbsSettings.endFrequency = (int64_t)feConfig.getEndFrequency();
701 }
Hongguang600a6ae2021-07-08 18:51:51 -0700702 if (!feConfig.hasDvbsFrontendSettings_optional()) {
703 ALOGW("[ConfigReader] no more dvbs settings");
704 return dvbsSettings;
705 }
Hongguang11da2cb2021-08-05 19:05:12 -0700706 dvbsSettings.symbolRate = static_cast<int32_t>(
Hongguang600a6ae2021-07-08 18:51:51 -0700707 feConfig.getFirstDvbsFrontendSettings_optional()->getSymbolRate());
Hongguang11da2cb2021-08-05 19:05:12 -0700708 dvbsSettings.inputStreamId = static_cast<int32_t>(
Hongguang600a6ae2021-07-08 18:51:51 -0700709 feConfig.getFirstDvbsFrontendSettings_optional()->getInputStreamId());
710 auto dvbs = feConfig.getFirstDvbsFrontendSettings_optional();
711 if (dvbs->hasScanType()) {
712 dvbsSettings.scanType = static_cast<FrontendDvbsScanType>(dvbs->getScanType());
713 }
714 if (dvbs->hasIsDiseqcRxMessage()) {
715 dvbsSettings.isDiseqcRxMessage = dvbs->getIsDiseqcRxMessage();
716 }
717 return dvbsSettings;
718 }
719
Frankie Lizcano3ad735d2022-06-24 19:20:54 +0000720 static FrontendAtscSettings readAtscFrontendSettings(Frontend& feConfig) {
Frankie Lizcano452b0262022-06-27 22:00:33 +0000721 ALOGW("[ConfigReader] fe type is atsc");
722 FrontendAtscSettings atscSettings{
723 .frequency = (int64_t) feConfig.getFrequency(),
724 };
725 if (feConfig.hasEndFrequency()) {
726 atscSettings.endFrequency = (int64_t) feConfig.getEndFrequency();
727 }
728 if (!feConfig.hasAtscFrontendSettings_optional()) {
729 ALOGW("[ConfigReader] no more atsc settings");
Frankie Lizcano3ad735d2022-06-24 19:20:54 +0000730 return atscSettings;
Frankie Lizcano452b0262022-06-27 22:00:33 +0000731 }
732 auto atsc = feConfig.getFirstAtscFrontendSettings_optional();
733 atscSettings.inversion = static_cast<FrontendSpectralInversion>(
734 atsc->getInversion());
735 atscSettings.modulation = static_cast<FrontendAtscModulation>(
736 atsc->getModulation());
737 return atscSettings;
738 }
739
740 static FrontendIsdbsSettings readIsdbsFrontendSettings(Frontend &feConfig) {
741 ALOGW("[ConfigReader] fe type is isdbs");
742 FrontendIsdbsSettings isdbsSettings{
743 .frequency = (int64_t)feConfig.getFrequency()
744 };
745 if (feConfig.hasEndFrequency()) {
746 isdbsSettings.endFrequency = (int64_t)feConfig.getEndFrequency();
747 }
748 if (!feConfig.hasIsdbsFrontendSettings_optional()) {
749 ALOGW("[ConfigReader] no more isdbs settings");
750 return isdbsSettings;
751 }
752 auto isdbs = feConfig.getFirstIsdbsFrontendSettings_optional();
753 isdbsSettings.streamId = (int32_t)isdbs->getStreamId();
754 isdbsSettings.symbolRate = (int32_t)isdbs->getSymbolRate();
755 isdbsSettings.modulation = static_cast<FrontendIsdbsModulation>(
756 isdbs->getModulation());
757 isdbsSettings.coderate = static_cast<FrontendIsdbsCoderate>(
758 isdbs->getCoderate());
759 isdbsSettings.rolloff = static_cast<FrontendIsdbsRolloff>(
760 isdbs->getRolloff());
761 isdbsSettings.streamIdType = static_cast<FrontendIsdbsStreamIdType>(
762 isdbs->getStreamIdType());
763 return isdbsSettings;
Frankie Lizcano3ad735d2022-06-24 19:20:54 +0000764 }
765
Hongguang600a6ae2021-07-08 18:51:51 -0700766 static bool readFilterTypeAndSettings(Filter filterConfig, DemuxFilterType& type,
767 DemuxFilterSettings& settings) {
768 auto mainType = filterConfig.getMainType();
769 auto subType = filterConfig.getSubType();
770
771 switch (mainType) {
772 case FilterMainTypeEnum::TS: {
773 ALOGW("[ConfigReader] filter main type is ts");
774 type.mainType = DemuxFilterMainType::TS;
775 DemuxTsFilterSettings ts;
776 bool isTsSet = false;
777 switch (subType) {
778 case FilterSubTypeEnum::UNDEFINED:
Hongguangce1e30d2021-08-02 21:55:44 -0700779 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700780 DemuxTsFilterType::UNDEFINED);
781 break;
782 case FilterSubTypeEnum::SECTION:
Hongguangce1e30d2021-08-02 21:55:44 -0700783 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700784 DemuxTsFilterType::SECTION);
785 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::section>(
786 readSectionFilterSettings(filterConfig));
787 isTsSet = true;
788 break;
789 case FilterSubTypeEnum::PES:
790 // TODO: b/182519645 support all the filter settings
Hongguangce1e30d2021-08-02 21:55:44 -0700791 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700792 DemuxTsFilterType::PES);
793 break;
794 case FilterSubTypeEnum::TS:
Hongguangce1e30d2021-08-02 21:55:44 -0700795 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700796 DemuxTsFilterType::TS);
797 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::noinit>(
798 true);
799 isTsSet = true;
800 break;
801 case FilterSubTypeEnum::PCR:
Hongguangce1e30d2021-08-02 21:55:44 -0700802 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700803 DemuxTsFilterType::PCR);
804 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::noinit>(
805 true);
806 isTsSet = true;
807 break;
808 case FilterSubTypeEnum::TEMI:
Hongguangce1e30d2021-08-02 21:55:44 -0700809 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700810 DemuxTsFilterType::TEMI);
811 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::noinit>(
812 true);
813 isTsSet = true;
814 break;
815 case FilterSubTypeEnum::AUDIO:
Hongguangce1e30d2021-08-02 21:55:44 -0700816 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700817 DemuxTsFilterType::AUDIO);
818 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::av>(
819 readAvFilterSettings(filterConfig));
820 isTsSet = true;
821 break;
822 case FilterSubTypeEnum::VIDEO:
Hongguangce1e30d2021-08-02 21:55:44 -0700823 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700824 DemuxTsFilterType::VIDEO);
825 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::av>(
826 readAvFilterSettings(filterConfig));
827 isTsSet = true;
828 break;
829 case FilterSubTypeEnum::RECORD:
Hongguangce1e30d2021-08-02 21:55:44 -0700830 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700831 DemuxTsFilterType::RECORD);
832 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::record>(
833 readRecordFilterSettings(filterConfig));
834 isTsSet = true;
835 break;
836 default:
837 ALOGW("[ConfigReader] ts subtype is not supported");
838 return false;
839 }
840 if (filterConfig.hasPid()) {
841 ts.tpid = static_cast<int32_t>(filterConfig.getPid());
842 isTsSet = true;
843 }
844 if (isTsSet) {
845 settings.set<DemuxFilterSettings::Tag::ts>(ts);
846 }
847 break;
848 }
849 case FilterMainTypeEnum::MMTP: {
850 ALOGW("[ConfigReader] filter main type is mmtp");
851 type.mainType = DemuxFilterMainType::MMTP;
852 DemuxMmtpFilterSettings mmtp;
853 bool isMmtpSet = false;
854 switch (subType) {
855 case FilterSubTypeEnum::UNDEFINED:
Hongguangce1e30d2021-08-02 21:55:44 -0700856 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700857 DemuxMmtpFilterType::UNDEFINED);
858 break;
859 case FilterSubTypeEnum::SECTION:
Hongguangce1e30d2021-08-02 21:55:44 -0700860 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700861 DemuxMmtpFilterType::SECTION);
862 mmtp.filterSettings
863 .set<DemuxMmtpFilterSettingsFilterSettings::Tag::section>(
864 readSectionFilterSettings(filterConfig));
865 isMmtpSet = true;
866 break;
867 case FilterSubTypeEnum::PES:
Hongguangce1e30d2021-08-02 21:55:44 -0700868 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700869 DemuxMmtpFilterType::PES);
870 // TODO: b/182519645 support all the filter settings
871 break;
872 case FilterSubTypeEnum::MMTP:
Hongguangce1e30d2021-08-02 21:55:44 -0700873 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700874 DemuxMmtpFilterType::MMTP);
875 mmtp.filterSettings.set<DemuxMmtpFilterSettingsFilterSettings::Tag::noinit>(
876 true);
877 isMmtpSet = true;
878 break;
879 case FilterSubTypeEnum::AUDIO:
Hongguangce1e30d2021-08-02 21:55:44 -0700880 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700881 DemuxMmtpFilterType::AUDIO);
882 mmtp.filterSettings.set<DemuxMmtpFilterSettingsFilterSettings::Tag::av>(
883 readAvFilterSettings(filterConfig));
884 isMmtpSet = true;
885 break;
886 case FilterSubTypeEnum::VIDEO:
Hongguangce1e30d2021-08-02 21:55:44 -0700887 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700888 DemuxMmtpFilterType::VIDEO);
889 mmtp.filterSettings.set<DemuxMmtpFilterSettingsFilterSettings::Tag::av>(
890 readAvFilterSettings(filterConfig));
891 isMmtpSet = true;
892 break;
893 case FilterSubTypeEnum::RECORD:
Hongguangce1e30d2021-08-02 21:55:44 -0700894 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700895 DemuxMmtpFilterType::RECORD);
896 mmtp.filterSettings.set<DemuxMmtpFilterSettingsFilterSettings::Tag::record>(
897 readRecordFilterSettings(filterConfig));
898 isMmtpSet = true;
899 break;
900 case FilterSubTypeEnum::DOWNLOAD:
Hongguangce1e30d2021-08-02 21:55:44 -0700901 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700902 DemuxMmtpFilterType::DOWNLOAD);
903 // TODO: b/182519645 support all the filter settings
904 break;
905 default:
906 ALOGW("[ConfigReader] mmtp subtype is not supported");
907 return false;
908 }
909 if (filterConfig.hasPid()) {
910 mmtp.mmtpPid = static_cast<int32_t>(filterConfig.getPid());
911 isMmtpSet = true;
912 }
913 if (isMmtpSet) {
914 settings.set<DemuxFilterSettings::Tag::mmtp>(mmtp);
915 }
916 break;
917 }
918 case FilterMainTypeEnum::IP: {
919 ALOGW("[ConfigReader] filter main type is ip");
920 type.mainType = DemuxFilterMainType::IP;
921 DemuxIpFilterSettings ip;
922 switch (subType) {
923 case FilterSubTypeEnum::UNDEFINED:
Hongguangce1e30d2021-08-02 21:55:44 -0700924 type.subType.set<DemuxFilterSubType::Tag::ipFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700925 DemuxIpFilterType::UNDEFINED);
926 break;
927 case FilterSubTypeEnum::SECTION:
Hongguangce1e30d2021-08-02 21:55:44 -0700928 type.subType.set<DemuxFilterSubType::Tag::ipFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700929 DemuxIpFilterType::SECTION);
930 ip.filterSettings.set<DemuxIpFilterSettingsFilterSettings::Tag::section>(
931 readSectionFilterSettings(filterConfig));
932 settings.set<DemuxFilterSettings::Tag::ip>(ip);
933 break;
934 case FilterSubTypeEnum::NTP:
Hongguangce1e30d2021-08-02 21:55:44 -0700935 type.subType.set<DemuxFilterSubType::Tag::ipFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700936 DemuxIpFilterType::NTP);
937 ip.filterSettings.set<DemuxIpFilterSettingsFilterSettings::Tag::noinit>(
938 true);
939 settings.set<DemuxFilterSettings::Tag::ip>(ip);
940 break;
941 case FilterSubTypeEnum::IP: {
Gareth Fenn9a808452022-03-31 08:40:00 +0100942 type.subType.set<DemuxFilterSubType::Tag::ipFilterType>(
943 DemuxIpFilterType::IP);
Hongguang600a6ae2021-07-08 18:51:51 -0700944 ip.ipAddr = readIpAddress(filterConfig),
945 ip.filterSettings
946 .set<DemuxIpFilterSettingsFilterSettings::Tag::bPassthrough>(
947 readPassthroughSettings(filterConfig));
948 settings.set<DemuxFilterSettings::Tag::ip>(ip);
949 break;
950 }
951 case FilterSubTypeEnum::IP_PAYLOAD:
Hongguangce1e30d2021-08-02 21:55:44 -0700952 type.subType.set<DemuxFilterSubType::Tag::ipFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700953 DemuxIpFilterType::IP_PAYLOAD);
954 ip.filterSettings.set<DemuxIpFilterSettingsFilterSettings::Tag::noinit>(
955 true);
956 settings.set<DemuxFilterSettings::Tag::ip>(ip);
957 break;
958 case FilterSubTypeEnum::PAYLOAD_THROUGH:
Hongguangce1e30d2021-08-02 21:55:44 -0700959 type.subType.set<DemuxFilterSubType::Tag::ipFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700960 DemuxIpFilterType::PAYLOAD_THROUGH);
961 ip.filterSettings.set<DemuxIpFilterSettingsFilterSettings::Tag::noinit>(
962 true);
963 settings.set<DemuxFilterSettings::Tag::ip>(ip);
964 break;
965 default:
966 ALOGW("[ConfigReader] mmtp subtype is not supported");
967 return false;
968 }
969 break;
970 }
971 default:
972 // TODO: b/182519645 support all the filter configs
973 ALOGW("[ConfigReader] filter main type is not supported in dynamic config");
974 return false;
975 }
976 return true;
977 }
978
979 static DemuxIpAddress readIpAddress(Filter filterConfig) {
980 DemuxIpAddress ipAddress;
981 vector<uint8_t> data;
982 if (!filterConfig.hasIpFilterConfig_optional()) {
983 return ipAddress;
984 }
985 auto ipFilterConfig = filterConfig.getFirstIpFilterConfig_optional();
986 if (ipFilterConfig->hasSrcPort()) {
987 ipAddress.srcPort = ipFilterConfig->getSrcPort();
988 }
989 if (ipFilterConfig->hasDestPort()) {
990 ipAddress.dstPort = ipFilterConfig->getDestPort();
991 }
992 if (ipFilterConfig->getFirstSrcIpAddress()->getIsIpV4()) {
993 data.resize(4);
994 memcpy(data.data(), ipFilterConfig->getFirstSrcIpAddress()->getIp().data(), 4);
995 ipAddress.srcIpAddress.set<DemuxIpAddressIpAddress::Tag::v4>(data);
996 } else {
997 data.resize(6);
998 memcpy(data.data(), ipFilterConfig->getFirstSrcIpAddress()->getIp().data(), 6);
999 ipAddress.srcIpAddress.set<DemuxIpAddressIpAddress::Tag::v6>(data);
1000 }
1001 if (ipFilterConfig->getFirstDestIpAddress()->getIsIpV4()) {
1002 data.resize(4);
1003 memcpy(data.data(), ipFilterConfig->getFirstDestIpAddress()->getIp().data(), 4);
1004 ipAddress.dstIpAddress.set<DemuxIpAddressIpAddress::Tag::v4>(data);
1005 } else {
1006 data.resize(6);
1007 memcpy(data.data(), ipFilterConfig->getFirstDestIpAddress()->getIp().data(), 6);
1008 ipAddress.dstIpAddress.set<DemuxIpAddressIpAddress::Tag::v6>(data);
1009 }
1010 return ipAddress;
1011 }
1012
1013 static bool readPassthroughSettings(Filter filterConfig) {
1014 if (!filterConfig.hasIpFilterConfig_optional()) {
1015 return false;
1016 }
1017 auto ipFilterConfig = filterConfig.getFirstIpFilterConfig_optional();
1018 if (ipFilterConfig->hasDataPassthrough()) {
1019 return ipFilterConfig->getDataPassthrough();
1020 }
1021 return false;
1022 }
1023
1024 static DemuxFilterSectionSettings readSectionFilterSettings(Filter filterConfig) {
1025 DemuxFilterSectionSettings settings;
1026 if (!filterConfig.hasSectionFilterSettings_optional()) {
1027 return settings;
1028 }
1029 auto section = filterConfig.getFirstSectionFilterSettings_optional();
1030 settings.isCheckCrc = section->getIsCheckCrc();
1031 settings.isRepeat = section->getIsRepeat();
1032 settings.isRaw = section->getIsRaw();
Hongguang494ba662022-01-05 22:08:10 -08001033 settings.bitWidthOfLengthField = section->getBitWidthOfLengthField();
Hongguang600a6ae2021-07-08 18:51:51 -07001034 return settings;
1035 }
1036
1037 static DemuxFilterAvSettings readAvFilterSettings(Filter filterConfig) {
1038 DemuxFilterAvSettings settings;
1039 if (!filterConfig.hasAvFilterSettings_optional()) {
1040 return settings;
1041 }
1042 auto av = filterConfig.getFirstAvFilterSettings_optional();
1043 settings.isPassthrough = av->getIsPassthrough();
Hongguang16dacc12021-11-01 15:51:52 -07001044 settings.isSecureMemory = av->getIsSecureMemory();
Hongguang600a6ae2021-07-08 18:51:51 -07001045 return settings;
1046 }
1047
1048 static DemuxFilterRecordSettings readRecordFilterSettings(Filter filterConfig) {
1049 DemuxFilterRecordSettings settings;
1050 if (!filterConfig.hasRecordFilterSettings_optional()) {
1051 return settings;
1052 }
1053 auto record = filterConfig.getFirstRecordFilterSettings_optional();
1054 settings.tsIndexMask = record->getTsIndexMask();
1055 settings.scIndexType = static_cast<DemuxRecordScIndexType>(record->getScIndexType());
1056 return settings;
1057 }
1058
1059 static PlaybackSettings readPlaybackSettings(Dvr dvrConfig) {
1060 ALOGW("[ConfigReader] dvr type is playback");
1061 PlaybackSettings playbackSettings{
Hongguang11da2cb2021-08-05 19:05:12 -07001062 .statusMask = static_cast<int8_t>(dvrConfig.getStatusMask()),
1063 .lowThreshold = static_cast<int64_t>(dvrConfig.getLowThreshold()),
1064 .highThreshold = static_cast<int64_t>(dvrConfig.getHighThreshold()),
Hongguang600a6ae2021-07-08 18:51:51 -07001065 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
Hongguang11da2cb2021-08-05 19:05:12 -07001066 .packetSize = static_cast<int64_t>(dvrConfig.getPacketSize()),
Hongguang600a6ae2021-07-08 18:51:51 -07001067 };
1068 return playbackSettings;
1069 }
1070
1071 static RecordSettings readRecordSettings(Dvr dvrConfig) {
1072 ALOGW("[ConfigReader] dvr type is record");
1073 RecordSettings recordSettings{
Hongguang11da2cb2021-08-05 19:05:12 -07001074 .statusMask = static_cast<int8_t>(dvrConfig.getStatusMask()),
1075 .lowThreshold = static_cast<int64_t>(dvrConfig.getLowThreshold()),
1076 .highThreshold = static_cast<int64_t>(dvrConfig.getHighThreshold()),
Hongguang600a6ae2021-07-08 18:51:51 -07001077 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
Hongguang11da2cb2021-08-05 19:05:12 -07001078 .packetSize = static_cast<int64_t>(dvrConfig.getPacketSize()),
Hongguang600a6ae2021-07-08 18:51:51 -07001079 };
1080 return recordSettings;
1081 }
1082
Hongguange106f472022-01-11 12:09:22 -08001083 static void getCiCamInfo(Frontend feConfig, bool& canConnectToCiCam, int32_t& ciCamId,
1084 int32_t& removePid) {
Hongguang600a6ae2021-07-08 18:51:51 -07001085 if (!feConfig.hasConnectToCicamId()) {
1086 canConnectToCiCam = false;
1087 ciCamId = -1;
Hongguange106f472022-01-11 12:09:22 -08001088 removePid = -1;
Gareth Fenn53ae3832021-10-15 17:19:00 +01001089 return;
Hongguang600a6ae2021-07-08 18:51:51 -07001090 }
1091 canConnectToCiCam = true;
1092 ciCamId = static_cast<int32_t>(feConfig.getConnectToCicamId());
Hongguange106f472022-01-11 12:09:22 -08001093 removePid = static_cast<int32_t>(feConfig.getRemoveOutputPid());
Hongguang600a6ae2021-07-08 18:51:51 -07001094 }
1095};