blob: 5ffb38ffcdbeaf11ad3f8c6b180473ddef1e751c [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
Frankie Lizcano5b29f502022-07-06 22:09:42 +000065static bool hasHwFe = false;
66static bool hasSwFe = false;
67static bool configFileRead = false;
68static bool configuredLive = false;
69static bool configuredScan = false;
70static bool configuredRecord = false;
71static bool configuredLnbLive = false;
72static bool configuredPlayback = false;
73static bool configuredLnbRecord = false;
74static bool configuredTimeFilter = false;
75static bool configuredDescrambling = false;
Frankie Lizcano523e5452022-07-27 22:21:16 +000076static bool configuredLnbDescrambling = false;
Frankie Lizcano5b29f502022-07-06 22:09:42 +000077
Hongguang600a6ae2021-07-08 18:51:51 -070078const string emptyHardwareId = "";
79
80static string mConfigFilePath;
81
Frankie Lizcano5b29f502022-07-06 22:09:42 +000082static vector<string> playbackDvrIds;
Frankie Lizcano8b87f252022-07-19 21:51:54 +000083static vector<string> ipFilterIds;
Frankie Lizcano5b29f502022-07-06 22:09:42 +000084static vector<string> recordDvrIds;
Frankie Lizcano8b87f252022-07-19 21:51:54 +000085static vector<string> pcrFilterIds;
Frankie Lizcano0c069532022-07-14 20:20:46 +000086static vector<string> timeFilterIds;
Frankie Lizcano5b29f502022-07-06 22:09:42 +000087static vector<string> audioFilterIds;
88static vector<string> videoFilterIds;
89static vector<string> recordFilterIds;
Frankie Lizcanoa53f5542022-07-07 17:32:06 +000090static vector<string> sectionFilterIds;
Frankie Lizcano1e283b32022-07-08 21:07:42 +000091static vector<string> frontendIds;
92static vector<string> lnbIds;
93static vector<string> diseqcMsgs;
Frankie Lizcanof4e07962022-07-13 20:54:34 +000094static vector<string> descramblerIds;
Frankie Lizcano5b29f502022-07-06 22:09:42 +000095
Hongguang600a6ae2021-07-08 18:51:51 -070096#define PROVISION_STR \
97 "{ " \
98 " \"id\": 21140844, " \
99 " \"name\": \"Test Title\", " \
100 " \"lowercase_organization_name\": \"Android\", " \
101 " \"asset_key\": { " \
102 " \"encryption_key\": \"nezAr3CHFrmBR9R8Tedotw==\" " \
103 " }, " \
104 " \"cas_type\": 1, " \
105 " \"track_types\": [ ] " \
106 "} "
107
108struct FrontendConfig {
109 bool isSoftwareFe;
110 FrontendType type;
111 bool canConnectToCiCam;
112 int32_t ciCamId;
Hongguange106f472022-01-11 12:09:22 -0800113 int32_t removePid;
Hongguang600a6ae2021-07-08 18:51:51 -0700114 FrontendSettings settings;
115 vector<FrontendStatusType> tuneStatusTypes;
116 vector<FrontendStatus> expectTuneStatuses;
Ray Chin58be11e2023-12-22 19:10:46 +0800117 bool supportBlindScan;
Hongguang600a6ae2021-07-08 18:51:51 -0700118};
119
120struct FilterConfig {
121 int32_t bufferSize;
122 DemuxFilterType type;
123 DemuxFilterSettings settings;
124 bool getMqDesc;
125 AvStreamType streamType;
126 int32_t ipCid;
127 int32_t monitorEventTypes;
Patrick Rohr1586d212021-11-23 00:40:56 +0100128 int timeDelayInMs = 0;
129 int dataDelayInBytes = 0;
Hongguang600a6ae2021-07-08 18:51:51 -0700130
131 bool operator<(const FilterConfig& /*c*/) const { return false; }
132};
133
134struct DvrConfig {
135 DvrType type;
136 int32_t bufferSize;
137 DvrSettings settings;
138 string playbackInputFile;
139};
140
141struct LnbConfig {
142 string name;
143 LnbVoltage voltage;
144 LnbTone tone;
145 LnbPosition position;
146};
147
148struct TimeFilterConfig {
149 int64_t timeStamp;
150};
151
152struct DescramblerConfig {
153 int32_t casSystemId;
154 string provisionStr;
155 vector<uint8_t> hidlPvtData;
156};
157
158struct LiveBroadcastHardwareConnections {
159 bool hasFrontendConnection;
160 string frontendId;
161 string dvrSoftwareFeId;
162 string audioFilterId;
163 string videoFilterId;
164 string sectionFilterId;
165 string ipFilterId;
166 string pcrFilterId;
167 /* list string of extra filters; */
Frankie Lizcanod2c09c42022-07-21 00:02:35 +0000168 vector<string> extraFilters;
Hongguang600a6ae2021-07-08 18:51:51 -0700169};
170
171struct ScanHardwareConnections {
172 bool hasFrontendConnection;
173 string frontendId;
174};
175
176struct DvrPlaybackHardwareConnections {
177 bool support;
Frankie Lizcano50461932022-06-28 21:36:26 +0000178 bool hasExtraFilters = false;
Hongguang600a6ae2021-07-08 18:51:51 -0700179 string frontendId;
180 string dvrId;
181 string audioFilterId;
182 string videoFilterId;
183 string sectionFilterId;
Frankie Lizcano50461932022-06-28 21:36:26 +0000184 vector<string> extraFilters;
Hongguang600a6ae2021-07-08 18:51:51 -0700185};
186
187struct DvrRecordHardwareConnections {
188 bool support;
189 bool hasFrontendConnection;
190 string frontendId;
191 string dvrRecordId;
192 string dvrSoftwareFeId;
193 string recordFilterId;
194 string dvrSourceId;
195};
196
197struct DescramblingHardwareConnections {
198 bool support;
199 bool hasFrontendConnection;
200 string frontendId;
201 string dvrSoftwareFeId;
202 string audioFilterId;
203 string videoFilterId;
204 string descramblerId;
205 string dvrSourceId;
Frankie Lizcanof5352122022-06-29 22:10:16 +0000206 vector<string> extraFilters;
Hongguang600a6ae2021-07-08 18:51:51 -0700207};
208
209struct LnbLiveHardwareConnections {
210 bool support;
211 string frontendId;
212 string audioFilterId;
213 string videoFilterId;
214 string lnbId;
215 vector<string> diseqcMsgs;
Frankie Lizcano647d5aa2022-06-30 20:49:31 +0000216 vector<string> extraFilters;
Hongguang600a6ae2021-07-08 18:51:51 -0700217};
218
219struct LnbRecordHardwareConnections {
220 bool support;
221 string frontendId;
222 string dvrRecordId;
223 string recordFilterId;
224 string lnbId;
225 vector<string> diseqcMsgs;
Frankie Lizcano647d5aa2022-06-30 20:49:31 +0000226 vector<string> extraFilters;
Hongguang600a6ae2021-07-08 18:51:51 -0700227};
228
229struct TimeFilterHardwareConnections {
230 bool support;
231 string timeFilterId;
232};
233
Frankie Lizcano523e5452022-07-27 22:21:16 +0000234struct LnbDescramblingHardwareConnections {
235 bool support;
236 string frontendId;
237 string audioFilterId;
238 string videoFilterId;
239 string lnbId;
240 string descramblerId;
241 vector<string> diseqcMsgs;
242};
243
Hongguang600a6ae2021-07-08 18:51:51 -0700244struct TunerTestingConfigAidlReader1_0 {
245 public:
246 static void setConfigFilePath(string path) { mConfigFilePath = path; }
247
248 static bool checkConfigFileExists() {
249 auto res = read(mConfigFilePath.c_str());
250 if (res == nullopt) {
251 ALOGW("[ConfigReader] Couldn't read %s."
252 "Please check tuner_testing_dynamic_configuration.xsd"
253 "and sample_tuner_vts_config.xml for more details on how to config Tune VTS.",
254 mConfigFilePath.c_str());
255 }
256 return (res != nullopt);
257 }
258
259 static TunerConfiguration getTunerConfig() { return *read(mConfigFilePath.c_str()); }
260
261 static DataFlowConfiguration getDataFlowConfiguration() {
262 return *getTunerConfig().getFirstDataFlowConfiguration();
263 }
264
265 static HardwareConfiguration getHardwareConfig() {
266 return *getTunerConfig().getFirstHardwareConfiguration();
267 }
268
269 static void readFrontendConfig1_0(map<string, FrontendConfig>& frontendMap) {
270 auto hardwareConfig = getHardwareConfig();
271 if (hardwareConfig.hasFrontends()) {
272 // TODO: b/182519645 complete the tune status config
273 vector<FrontendStatusType> types;
274 vector<FrontendStatus> statuses;
275
276 types.push_back(FrontendStatusType::DEMOD_LOCK);
277 types.push_back(FrontendStatusType::UEC);
278 types.push_back(FrontendStatusType::IS_MISO);
279
280 FrontendStatus status;
281 status.set<FrontendStatus::Tag::isDemodLocked>(true);
282 statuses.push_back(status);
283 status.set<FrontendStatus::Tag::uec>(4);
284 statuses.push_back(status);
285 status.set<FrontendStatus::Tag::isMiso>(true);
286 statuses.push_back(status);
287
288 auto frontends = *hardwareConfig.getFirstFrontends();
289 for (auto feConfig : frontends.getFrontend()) {
290 string id = feConfig.getId();
Frankie Lizcano1e283b32022-07-08 21:07:42 +0000291 frontendIds.push_back(id);
Hongguang600a6ae2021-07-08 18:51:51 -0700292 if (id.compare(string("FE_DEFAULT")) == 0) {
293 // overrid default
294 frontendMap.erase(string("FE_DEFAULT"));
295 }
296 FrontendType type;
297 switch (feConfig.getType()) {
298 case FrontendTypeEnum::UNDEFINED:
299 type = FrontendType::UNDEFINED;
300 break;
301 // TODO: b/182519645 finish all other frontend settings
302 case FrontendTypeEnum::ANALOG:
303 type = FrontendType::ANALOG;
304 break;
305 case FrontendTypeEnum::ATSC:
306 type = FrontendType::ATSC;
Frankie Lizcano3ad735d2022-06-24 19:20:54 +0000307 frontendMap[id].settings.set<
308 FrontendSettings::Tag::atsc>(
309 readAtscFrontendSettings(feConfig));
Hongguang600a6ae2021-07-08 18:51:51 -0700310 break;
311 case FrontendTypeEnum::ATSC3:
312 type = FrontendType::ATSC3;
313 break;
314 case FrontendTypeEnum::DVBC:
315 type = FrontendType::DVBC;
316 break;
317 case FrontendTypeEnum::DVBS:
318 type = FrontendType::DVBS;
319 frontendMap[id].settings.set<FrontendSettings::Tag::dvbs>(
320 readDvbsFrontendSettings(feConfig));
321 break;
322 case FrontendTypeEnum::DVBT: {
323 type = FrontendType::DVBT;
324 frontendMap[id].settings.set<FrontendSettings::Tag::dvbt>(
325 readDvbtFrontendSettings(feConfig));
326 break;
327 }
328 case FrontendTypeEnum::ISDBS:
329 type = FrontendType::ISDBS;
Frankie Lizcano01dca3d2022-06-29 18:22:02 +0000330 frontendMap[id].settings.set<FrontendSettings::Tag::isdbs>(
Frankie Lizcano452b0262022-06-27 22:00:33 +0000331 readIsdbsFrontendSettings(feConfig));
Hongguang600a6ae2021-07-08 18:51:51 -0700332 break;
333 case FrontendTypeEnum::ISDBS3:
334 type = FrontendType::ISDBS3;
335 break;
336 case FrontendTypeEnum::ISDBT:
337 type = FrontendType::ISDBT;
Frankie Lizcanoaee8c9e2022-06-24 21:28:00 +0000338 frontendMap[id].settings.set<FrontendSettings::Tag::isdbt>(
339 readIsdbtFrontendSettings(feConfig));
Hongguang600a6ae2021-07-08 18:51:51 -0700340 break;
341 case FrontendTypeEnum::DTMB:
342 type = FrontendType::DTMB;
343 break;
344 case FrontendTypeEnum::UNKNOWN:
345 ALOGW("[ConfigReader] invalid frontend type");
346 return;
347 default:
348 ALOGW("[ConfigReader] fe already handled in 1_0 reader.");
349 break;
350 }
351 frontendMap[id].type = type;
352 frontendMap[id].isSoftwareFe = feConfig.getIsSoftwareFrontend();
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000353 if (frontendMap[id].isSoftwareFe) {
354 hasSwFe = true;
355 } else {
356 hasHwFe = true;
357 }
Ray Chin58be11e2023-12-22 19:10:46 +0800358 if (feConfig.hasSupportBlindScan()) {
359 frontendMap[id].supportBlindScan = feConfig.getSupportBlindScan();
360 } else {
361 frontendMap[id].supportBlindScan = true;
362 }
Hongguang600a6ae2021-07-08 18:51:51 -0700363 // TODO: b/182519645 complete the tune status config
364 frontendMap[id].tuneStatusTypes = types;
365 frontendMap[id].expectTuneStatuses = statuses;
Hongguange106f472022-01-11 12:09:22 -0800366 getCiCamInfo(feConfig, frontendMap[id].canConnectToCiCam, frontendMap[id].ciCamId,
367 frontendMap[id].removePid);
Hongguang600a6ae2021-07-08 18:51:51 -0700368 }
369 }
370 }
371
372 static void readFilterConfig1_0(map<string, FilterConfig>& filterMap) {
373 auto hardwareConfig = getHardwareConfig();
374 if (hardwareConfig.hasFilters()) {
375 auto filters = *hardwareConfig.getFirstFilters();
376 for (auto filterConfig : filters.getFilter()) {
377 string id = filterConfig.getId();
378 if (id.compare(string("FILTER_AUDIO_DEFAULT")) == 0) {
379 // overrid default
380 filterMap.erase(string("FILTER_AUDIO_DEFAULT"));
381 }
382 if (id.compare(string("FILTER_VIDEO_DEFAULT")) == 0) {
383 // overrid default
384 filterMap.erase(string("FILTER_VIDEO_DEFAULT"));
385 }
386
387 DemuxFilterType type;
388 DemuxFilterSettings settings;
389 if (!readFilterTypeAndSettings(filterConfig, type, settings)) {
390 ALOGW("[ConfigReader] invalid filter type");
391 return;
392 }
393 filterMap[id].type = type;
394 filterMap[id].bufferSize = filterConfig.getBufferSize();
395 filterMap[id].getMqDesc = filterConfig.getUseFMQ();
396 filterMap[id].settings = settings;
397
398 if (filterConfig.hasMonitorEventTypes()) {
Hongguang11da2cb2021-08-05 19:05:12 -0700399 filterMap[id].monitorEventTypes = (int32_t)filterConfig.getMonitorEventTypes();
Hongguang600a6ae2021-07-08 18:51:51 -0700400 }
Patrick Rohr1586d212021-11-23 00:40:56 +0100401 if (filterConfig.hasTimeDelayInMs()) {
402 filterMap[id].timeDelayInMs = filterConfig.getTimeDelayInMs();
403 }
404 if (filterConfig.hasDataDelayInBytes()) {
405 filterMap[id].dataDelayInBytes = filterConfig.getDataDelayInBytes();
406 }
Hongguang600a6ae2021-07-08 18:51:51 -0700407 if (filterConfig.hasAvFilterSettings_optional()) {
408 auto av = filterConfig.getFirstAvFilterSettings_optional();
409 if (av->hasAudioStreamType_optional()) {
410 filterMap[id].streamType.set<AvStreamType::Tag::audio>(
411 static_cast<AudioStreamType>(av->getAudioStreamType_optional()));
412 }
413 if (av->hasVideoStreamType_optional()) {
414 filterMap[id].streamType.set<AvStreamType::Tag::video>(
415 static_cast<VideoStreamType>(av->getVideoStreamType_optional()));
416 }
417 }
418 if (filterConfig.hasIpFilterConfig_optional()) {
419 auto ip = filterConfig.getFirstIpFilterConfig_optional();
420 if (ip->hasIpCid()) {
421 filterMap[id].ipCid = ip->getIpCid();
422 }
423 }
424 }
425 }
426 }
427
428 static void readDvrConfig1_0(map<string, DvrConfig>& dvrMap) {
429 auto hardwareConfig = getHardwareConfig();
430 if (hardwareConfig.hasDvrs()) {
431 auto dvrs = *hardwareConfig.getFirstDvrs();
432 for (auto dvrConfig : dvrs.getDvr()) {
433 string id = dvrConfig.getId();
434 DvrType type;
435 switch (dvrConfig.getType()) {
436 case DvrTypeEnum::PLAYBACK:
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000437 playbackDvrIds.push_back(id);
Hongguang600a6ae2021-07-08 18:51:51 -0700438 type = DvrType::PLAYBACK;
439 dvrMap[id].settings.set<DvrSettings::Tag::playback>(
440 readPlaybackSettings(dvrConfig));
441 break;
442 case DvrTypeEnum::RECORD:
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000443 recordDvrIds.push_back(id);
Hongguang600a6ae2021-07-08 18:51:51 -0700444 type = DvrType::RECORD;
445 dvrMap[id].settings.set<DvrSettings::Tag::record>(
446 readRecordSettings(dvrConfig));
447 break;
448 case DvrTypeEnum::UNKNOWN:
449 ALOGW("[ConfigReader] invalid DVR type");
450 return;
451 }
452 dvrMap[id].type = type;
Hongguang11da2cb2021-08-05 19:05:12 -0700453 dvrMap[id].bufferSize = static_cast<int32_t>(dvrConfig.getBufferSize());
Hongguang600a6ae2021-07-08 18:51:51 -0700454 if (dvrConfig.hasInputFilePath()) {
455 dvrMap[id].playbackInputFile = dvrConfig.getInputFilePath();
456 }
457 }
458 }
459 }
460
461 static void readLnbConfig1_0(map<string, LnbConfig>& lnbMap) {
462 auto hardwareConfig = getHardwareConfig();
463 if (hardwareConfig.hasLnbs()) {
464 auto lnbs = *hardwareConfig.getFirstLnbs();
465 for (auto lnbConfig : lnbs.getLnb()) {
466 string id = lnbConfig.getId();
Frankie Lizcano1e283b32022-07-08 21:07:42 +0000467 lnbIds.push_back(id);
Hongguang600a6ae2021-07-08 18:51:51 -0700468 if (lnbConfig.hasName()) {
469 lnbMap[id].name = lnbConfig.getName();
470 } else {
471 lnbMap[id].name = emptyHardwareId;
472 }
473 lnbMap[id].voltage = static_cast<LnbVoltage>(lnbConfig.getVoltage());
474 lnbMap[id].tone = static_cast<LnbTone>(lnbConfig.getTone());
475 lnbMap[id].position = static_cast<LnbPosition>(lnbConfig.getPosition());
476 }
477 }
478 }
479
480 static void readDescramblerConfig1_0(map<string, DescramblerConfig>& descramblerMap) {
481 auto hardwareConfig = getHardwareConfig();
482 if (hardwareConfig.hasDescramblers()) {
483 auto descramblers = *hardwareConfig.getFirstDescramblers();
484 for (auto descramblerConfig : descramblers.getDescrambler()) {
485 string id = descramblerConfig.getId();
Frankie Lizcanof4e07962022-07-13 20:54:34 +0000486 descramblerIds.push_back(id);
Hongguang600a6ae2021-07-08 18:51:51 -0700487 descramblerMap[id].casSystemId =
Hongguang11da2cb2021-08-05 19:05:12 -0700488 static_cast<int32_t>(descramblerConfig.getCasSystemId());
Hongguang600a6ae2021-07-08 18:51:51 -0700489 if (descramblerConfig.hasProvisionStr()) {
490 descramblerMap[id].provisionStr = descramblerConfig.getProvisionStr();
491 } else {
492 descramblerMap[id].provisionStr = PROVISION_STR;
493 }
494 if (descramblerConfig.hasSesstionPrivatData()) {
495 auto privateData = descramblerConfig.getSesstionPrivatData();
496 int size = privateData.size();
497 descramblerMap[id].hidlPvtData.resize(size);
498 memcpy(descramblerMap[id].hidlPvtData.data(), privateData.data(), size);
499 } else {
500 descramblerMap[id].hidlPvtData.resize(256);
501 }
502 }
503 }
504 }
505
506 static void readDiseqcMessages(map<string, vector<uint8_t>>& diseqcMsgMap) {
507 auto hardwareConfig = getHardwareConfig();
508 if (hardwareConfig.hasDiseqcMessages()) {
509 auto msgs = *hardwareConfig.getFirstDiseqcMessages();
510 for (auto msgConfig : msgs.getDiseqcMessage()) {
511 string name = msgConfig.getMsgName();
Frankie Lizcano1e283b32022-07-08 21:07:42 +0000512 diseqcMsgs.push_back(name);
Hongguang600a6ae2021-07-08 18:51:51 -0700513 for (uint8_t atom : msgConfig.getMsgBody()) {
514 diseqcMsgMap[name].push_back(atom);
515 }
516 }
517 }
518 }
519
520 static void readTimeFilterConfig1_0(map<string, TimeFilterConfig>& timeFilterMap) {
521 auto hardwareConfig = getHardwareConfig();
522 if (hardwareConfig.hasTimeFilters()) {
523 auto timeFilters = *hardwareConfig.getFirstTimeFilters();
524 for (auto timeFilterConfig : timeFilters.getTimeFilter()) {
525 string id = timeFilterConfig.getId();
Frankie Lizcano0c069532022-07-14 20:20:46 +0000526 timeFilterIds.push_back(id);
Hongguang11da2cb2021-08-05 19:05:12 -0700527 timeFilterMap[id].timeStamp = static_cast<int64_t>(timeFilterConfig.getTimeStamp());
Hongguang600a6ae2021-07-08 18:51:51 -0700528 }
529 }
530 }
531
532 static void connectLiveBroadcast(LiveBroadcastHardwareConnections& live) {
533 auto dataFlow = getDataFlowConfiguration();
534 if (dataFlow.hasClearLiveBroadcast()) {
535 live.hasFrontendConnection = true;
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000536 configuredLive = true;
Hongguang600a6ae2021-07-08 18:51:51 -0700537 } else {
538 live.hasFrontendConnection = false;
539 return;
540 }
541 auto liveConfig = *dataFlow.getFirstClearLiveBroadcast();
542 live.frontendId = liveConfig.getFrontendConnection();
543
544 live.audioFilterId = liveConfig.getAudioFilterConnection();
545 live.videoFilterId = liveConfig.getVideoFilterConnection();
546 if (liveConfig.hasPcrFilterConnection()) {
547 live.pcrFilterId = liveConfig.getPcrFilterConnection();
548 } else {
549 live.pcrFilterId = emptyHardwareId;
550 }
551 if (liveConfig.hasSectionFilterConnection()) {
552 live.sectionFilterId = liveConfig.getSectionFilterConnection();
553 } else {
554 live.sectionFilterId = emptyHardwareId;
555 }
556 if (liveConfig.hasDvrSoftwareFeConnection()) {
557 live.dvrSoftwareFeId = liveConfig.getDvrSoftwareFeConnection();
558 }
559 if (liveConfig.hasIpFilterConnection()) {
560 live.ipFilterId = liveConfig.getIpFilterConnection();
561 } else {
562 live.ipFilterId = emptyHardwareId;
563 }
Frankie Lizcanod2c09c42022-07-21 00:02:35 +0000564 if (liveConfig.hasOptionalFilters()) {
565 auto optionalFilters = liveConfig.getOptionalFilters();
566 live.extraFilters = optionalFilters;
567 }
Hongguang600a6ae2021-07-08 18:51:51 -0700568 }
569
570 static void connectScan(ScanHardwareConnections& scan) {
571 auto dataFlow = getDataFlowConfiguration();
572 if (dataFlow.hasScan()) {
573 scan.hasFrontendConnection = true;
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000574 configuredScan = true;
Hongguang600a6ae2021-07-08 18:51:51 -0700575 } else {
576 scan.hasFrontendConnection = false;
577 return;
578 }
579 auto scanConfig = *dataFlow.getFirstScan();
580 scan.frontendId = scanConfig.getFrontendConnection();
581 }
582
583 static void connectDvrPlayback(DvrPlaybackHardwareConnections& playback) {
584 auto dataFlow = getDataFlowConfiguration();
585 if (dataFlow.hasDvrPlayback()) {
586 playback.support = true;
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000587 configuredPlayback = true;
Hongguang600a6ae2021-07-08 18:51:51 -0700588 } else {
589 playback.support = false;
590 return;
591 }
592 auto playbackConfig = *dataFlow.getFirstDvrPlayback();
593 playback.dvrId = playbackConfig.getDvrConnection();
594 playback.audioFilterId = playbackConfig.getAudioFilterConnection();
595 playback.videoFilterId = playbackConfig.getVideoFilterConnection();
596 if (playbackConfig.hasSectionFilterConnection()) {
597 playback.sectionFilterId = playbackConfig.getSectionFilterConnection();
598 } else {
599 playback.sectionFilterId = emptyHardwareId;
600 }
Frankie Lizcanod2c09c42022-07-21 00:02:35 +0000601 if (playbackConfig.hasOptionalFilters()) {
602 auto optionalFilters = playbackConfig.getOptionalFilters();
603 playback.extraFilters = optionalFilters;
Frankie Lizcano50461932022-06-28 21:36:26 +0000604 }
Hongguang600a6ae2021-07-08 18:51:51 -0700605 }
606
607 static void connectDvrRecord(DvrRecordHardwareConnections& record) {
608 auto dataFlow = getDataFlowConfiguration();
609 if (dataFlow.hasDvrRecord()) {
610 record.support = true;
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000611 configuredRecord = true;
Hongguang600a6ae2021-07-08 18:51:51 -0700612 } else {
613 record.support = false;
614 return;
615 }
616 auto recordConfig = *dataFlow.getFirstDvrRecord();
617 record.recordFilterId = recordConfig.getRecordFilterConnection();
618 record.dvrRecordId = recordConfig.getDvrRecordConnection();
619 if (recordConfig.hasDvrSoftwareFeConnection()) {
620 record.dvrSoftwareFeId = recordConfig.getDvrSoftwareFeConnection();
621 }
622 if (recordConfig.getHasFrontendConnection()) {
623 record.hasFrontendConnection = true;
624 record.dvrSourceId = emptyHardwareId;
625 record.frontendId = recordConfig.getFrontendConnection();
626 } else {
627 record.hasFrontendConnection = false;
628 record.dvrSourceId = recordConfig.getDvrSourceConnection();
629 }
630 }
631
632 static void connectDescrambling(DescramblingHardwareConnections& descrambling) {
633 auto dataFlow = getDataFlowConfiguration();
634 if (dataFlow.hasDescrambling()) {
635 descrambling.support = true;
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000636 configuredDescrambling = true;
Hongguang600a6ae2021-07-08 18:51:51 -0700637 } else {
638 descrambling.support = false;
639 return;
640 }
641 auto descConfig = *dataFlow.getFirstDescrambling();
642 descrambling.descramblerId = descConfig.getDescramblerConnection();
643 descrambling.audioFilterId = descConfig.getAudioFilterConnection();
644 descrambling.videoFilterId = descConfig.getVideoFilterConnection();
645 if (descConfig.hasDvrSoftwareFeConnection()) {
646 descrambling.dvrSoftwareFeId = descConfig.getDvrSoftwareFeConnection();
647 }
648 if (descConfig.getHasFrontendConnection()) {
649 descrambling.hasFrontendConnection = true;
650 descrambling.dvrSourceId = emptyHardwareId;
651 descrambling.frontendId = descConfig.getFrontendConnection();
652 } else {
653 descrambling.hasFrontendConnection = false;
654 descrambling.dvrSourceId = descConfig.getDvrSourceConnection();
655 }
Frankie Lizcanof5352122022-06-29 22:10:16 +0000656 if (descConfig.hasOptionalFilters()) {
657 auto optionalFilters = descConfig.getOptionalFilters();
658 descrambling.extraFilters = optionalFilters;
659 }
Hongguang600a6ae2021-07-08 18:51:51 -0700660 }
661
662 static void connectLnbLive(LnbLiveHardwareConnections& lnbLive) {
663 auto dataFlow = getDataFlowConfiguration();
664 if (dataFlow.hasLnbLive()) {
665 lnbLive.support = true;
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000666 configuredLnbLive = true;
Hongguang600a6ae2021-07-08 18:51:51 -0700667 } else {
668 lnbLive.support = false;
669 return;
670 }
671 auto lnbLiveConfig = *dataFlow.getFirstLnbLive();
672 lnbLive.frontendId = lnbLiveConfig.getFrontendConnection();
673 lnbLive.audioFilterId = lnbLiveConfig.getAudioFilterConnection();
674 lnbLive.videoFilterId = lnbLiveConfig.getVideoFilterConnection();
675 lnbLive.lnbId = lnbLiveConfig.getLnbConnection();
676 if (lnbLiveConfig.hasDiseqcMsgSender()) {
677 for (auto msgName : lnbLiveConfig.getDiseqcMsgSender()) {
678 lnbLive.diseqcMsgs.push_back(msgName);
679 }
680 }
Frankie Lizcano647d5aa2022-06-30 20:49:31 +0000681 if (lnbLiveConfig.hasOptionalFilters()) {
682 auto optionalFilters = lnbLiveConfig.getOptionalFilters();
683 lnbLive.extraFilters = optionalFilters;
684 }
Hongguang600a6ae2021-07-08 18:51:51 -0700685 }
686
687 static void connectLnbRecord(LnbRecordHardwareConnections& lnbRecord) {
688 auto dataFlow = getDataFlowConfiguration();
689 if (dataFlow.hasLnbRecord()) {
690 lnbRecord.support = true;
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000691 configuredLnbRecord = true;
Hongguang600a6ae2021-07-08 18:51:51 -0700692 } else {
693 lnbRecord.support = false;
694 return;
695 }
696 auto lnbRecordConfig = *dataFlow.getFirstLnbRecord();
697 lnbRecord.frontendId = lnbRecordConfig.getFrontendConnection();
698 lnbRecord.recordFilterId = lnbRecordConfig.getRecordFilterConnection();
699 lnbRecord.dvrRecordId = lnbRecordConfig.getDvrRecordConnection();
700 lnbRecord.lnbId = lnbRecordConfig.getLnbConnection();
701 if (lnbRecordConfig.hasDiseqcMsgSender()) {
702 for (auto msgName : lnbRecordConfig.getDiseqcMsgSender()) {
703 lnbRecord.diseqcMsgs.push_back(msgName);
704 }
705 }
Frankie Lizcano647d5aa2022-06-30 20:49:31 +0000706 if (lnbRecordConfig.hasOptionalFilters()) {
707 auto optionalFilters = lnbRecordConfig.getOptionalFilters();
708 lnbRecord.extraFilters = optionalFilters;
709 }
Hongguang600a6ae2021-07-08 18:51:51 -0700710 }
711
712 static void connectTimeFilter(TimeFilterHardwareConnections& timeFilter) {
713 auto dataFlow = getDataFlowConfiguration();
714 if (dataFlow.hasTimeFilter()) {
715 timeFilter.support = true;
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000716 configuredTimeFilter = true;
Hongguang600a6ae2021-07-08 18:51:51 -0700717 } else {
718 timeFilter.support = false;
719 return;
720 }
721 auto timeFilterConfig = *dataFlow.getFirstTimeFilter();
722 timeFilter.timeFilterId = timeFilterConfig.getTimeFilterConnection();
723 }
724
Frankie Lizcano523e5452022-07-27 22:21:16 +0000725 static void connectLnbDescrambling(LnbDescramblingHardwareConnections& lnbDescrambling) {
726 auto dataFlow = getDataFlowConfiguration();
727 if (dataFlow.hasLnbDescrambling()) {
728 lnbDescrambling.support = true;
729 configuredLnbDescrambling = true;
730 } else {
731 lnbDescrambling.support = false;
732 return;
733 }
734 auto lnbDescramblingConfig = *dataFlow.getFirstLnbDescrambling();
735 lnbDescrambling.frontendId = lnbDescramblingConfig.getFrontendConnection();
736 lnbDescrambling.audioFilterId = lnbDescramblingConfig.getAudioFilterConnection();
737 lnbDescrambling.videoFilterId = lnbDescramblingConfig.getVideoFilterConnection();
738 lnbDescrambling.lnbId = lnbDescramblingConfig.getLnbConnection();
739 lnbDescrambling.descramblerId = lnbDescramblingConfig.getDescramblerConnection();
740 if (lnbDescramblingConfig.hasDiseqcMsgSender()) {
741 for (auto& msgName : lnbDescramblingConfig.getDiseqcMsgSender()) {
742 lnbDescrambling.diseqcMsgs.push_back(msgName);
743 }
744 }
745 }
746
Hongguang600a6ae2021-07-08 18:51:51 -0700747 private:
748 static FrontendDvbtSettings readDvbtFrontendSettings(Frontend feConfig) {
749 ALOGW("[ConfigReader] fe type is dvbt");
750 FrontendDvbtSettings dvbtSettings{
Hongguang11da2cb2021-08-05 19:05:12 -0700751 .frequency = (int64_t)feConfig.getFrequency(),
Hongguang600a6ae2021-07-08 18:51:51 -0700752 };
Hongguang11da2cb2021-08-05 19:05:12 -0700753 if (feConfig.hasEndFrequency()) {
754 dvbtSettings.endFrequency = (int64_t)feConfig.getEndFrequency();
755 }
Hongguang600a6ae2021-07-08 18:51:51 -0700756 if (!feConfig.hasDvbtFrontendSettings_optional()) {
757 ALOGW("[ConfigReader] no more dvbt settings");
758 return dvbtSettings;
759 }
760 auto dvbt = feConfig.getFirstDvbtFrontendSettings_optional();
Hongguang11da2cb2021-08-05 19:05:12 -0700761 int32_t trans = static_cast<int32_t>(dvbt->getTransmissionMode());
Hongguang600a6ae2021-07-08 18:51:51 -0700762 dvbtSettings.transmissionMode = static_cast<FrontendDvbtTransmissionMode>(trans);
763 dvbtSettings.bandwidth = static_cast<FrontendDvbtBandwidth>(dvbt->getBandwidth());
764 dvbtSettings.isHighPriority = dvbt->getIsHighPriority();
765 dvbtSettings.hierarchy = static_cast<FrontendDvbtHierarchy>(dvbt->getHierarchy());
766 dvbtSettings.hpCoderate = static_cast<FrontendDvbtCoderate>(dvbt->getHpCoderate());
767 dvbtSettings.lpCoderate = static_cast<FrontendDvbtCoderate>(dvbt->getLpCoderate());
768 dvbtSettings.guardInterval =
769 static_cast<FrontendDvbtGuardInterval>(dvbt->getGuardInterval());
770 dvbtSettings.standard = static_cast<FrontendDvbtStandard>(dvbt->getStandard());
771 dvbtSettings.isMiso = dvbt->getIsMiso();
772 dvbtSettings.plpMode = static_cast<FrontendDvbtPlpMode>(dvbt->getPlpMode());
773 dvbtSettings.plpId = dvbt->getPlpId();
774 dvbtSettings.plpGroupId = dvbt->getPlpGroupId();
775 if (dvbt->hasConstellation()) {
776 dvbtSettings.constellation =
777 static_cast<FrontendDvbtConstellation>(dvbt->getConstellation());
778 }
779 return dvbtSettings;
780 }
781
782 static FrontendDvbsSettings readDvbsFrontendSettings(Frontend feConfig) {
783 ALOGW("[ConfigReader] fe type is dvbs");
784 FrontendDvbsSettings dvbsSettings{
Hongguang11da2cb2021-08-05 19:05:12 -0700785 .frequency = (int64_t)feConfig.getFrequency(),
Hongguang600a6ae2021-07-08 18:51:51 -0700786 };
Hongguang11da2cb2021-08-05 19:05:12 -0700787 if (feConfig.hasEndFrequency()) {
788 dvbsSettings.endFrequency = (int64_t)feConfig.getEndFrequency();
789 }
Hongguang600a6ae2021-07-08 18:51:51 -0700790 if (!feConfig.hasDvbsFrontendSettings_optional()) {
791 ALOGW("[ConfigReader] no more dvbs settings");
792 return dvbsSettings;
793 }
Hongguang600a6ae2021-07-08 18:51:51 -0700794 auto dvbs = feConfig.getFirstDvbsFrontendSettings_optional();
Frankie Lizcano42caff42022-07-22 20:30:46 +0000795 dvbsSettings.symbolRate = static_cast<int32_t>(dvbs->getSymbolRate());
796 dvbsSettings.inputStreamId = static_cast<int32_t>(dvbs->getInputStreamId());
797 dvbsSettings.scanType = static_cast<FrontendDvbsScanType>(dvbs->getScanType());
798 dvbsSettings.isDiseqcRxMessage = dvbs->getIsDiseqcRxMessage();
799 dvbsSettings.inversion = static_cast<FrontendSpectralInversion>(dvbs->getInversion());
800 dvbsSettings.modulation = static_cast<FrontendDvbsModulation>(dvbs->getModulation());
801 dvbsSettings.rolloff = static_cast<FrontendDvbsRolloff>(dvbs->getRolloff());
802 dvbsSettings.pilot = static_cast<FrontendDvbsPilot>(dvbs->getPilot());
803 dvbsSettings.standard = static_cast<FrontendDvbsStandard>(dvbs->getStandard());
804 dvbsSettings.vcmMode = static_cast<FrontendDvbsVcmMode>(dvbs->getVcmMode());
Hongguang600a6ae2021-07-08 18:51:51 -0700805 return dvbsSettings;
806 }
807
Frankie Lizcano3ad735d2022-06-24 19:20:54 +0000808 static FrontendAtscSettings readAtscFrontendSettings(Frontend& feConfig) {
Frankie Lizcano01dca3d2022-06-29 18:22:02 +0000809 ALOGW("[ConfigReader] fe type is atsc");
810 FrontendAtscSettings atscSettings{
811 .frequency = (int64_t)feConfig.getFrequency(),
812 };
813 if (feConfig.hasEndFrequency()) {
814 atscSettings.endFrequency = (int64_t)feConfig.getEndFrequency();
815 }
816 if (!feConfig.hasAtscFrontendSettings_optional()) {
817 ALOGW("[ConfigReader] no more atsc settings");
818 return atscSettings;
819 }
820 auto atsc = feConfig.getFirstAtscFrontendSettings_optional();
821 atscSettings.inversion = static_cast<FrontendSpectralInversion>(atsc->getInversion());
822 atscSettings.modulation = static_cast<FrontendAtscModulation>(atsc->getModulation());
Frankie Lizcano3ad735d2022-06-24 19:20:54 +0000823 return atscSettings;
Frankie Lizcano452b0262022-06-27 22:00:33 +0000824 }
825
Frankie Lizcano01dca3d2022-06-29 18:22:02 +0000826 static FrontendIsdbsSettings readIsdbsFrontendSettings(Frontend& feConfig) {
827 ALOGW("[ConfigReader] fe type is isdbs");
828 FrontendIsdbsSettings isdbsSettings{.frequency = (int64_t)feConfig.getFrequency()};
829 if (feConfig.hasEndFrequency()) {
Frankie Lizcano452b0262022-06-27 22:00:33 +0000830 isdbsSettings.endFrequency = (int64_t)feConfig.getEndFrequency();
Frankie Lizcano01dca3d2022-06-29 18:22:02 +0000831 }
832 if (!feConfig.hasIsdbsFrontendSettings_optional()) {
Frankie Lizcano452b0262022-06-27 22:00:33 +0000833 ALOGW("[ConfigReader] no more isdbs settings");
834 return isdbsSettings;
Frankie Lizcano01dca3d2022-06-29 18:22:02 +0000835 }
836 auto isdbs = feConfig.getFirstIsdbsFrontendSettings_optional();
837 isdbsSettings.streamId = (int32_t)isdbs->getStreamId();
838 isdbsSettings.symbolRate = (int32_t)isdbs->getSymbolRate();
839 isdbsSettings.modulation = static_cast<FrontendIsdbsModulation>(isdbs->getModulation());
840 isdbsSettings.coderate = static_cast<FrontendIsdbsCoderate>(isdbs->getCoderate());
841 isdbsSettings.rolloff = static_cast<FrontendIsdbsRolloff>(isdbs->getRolloff());
842 isdbsSettings.streamIdType =
843 static_cast<FrontendIsdbsStreamIdType>(isdbs->getStreamIdType());
844 return isdbsSettings;
Frankie Lizcano3ad735d2022-06-24 19:20:54 +0000845 }
846
Frankie Lizcanoaee8c9e2022-06-24 21:28:00 +0000847 static FrontendIsdbtSettings readIsdbtFrontendSettings(Frontend& feConfig) {
848 ALOGW("[ConfigReader] fe type is isdbt");
849 FrontendIsdbtSettings isdbtSettings{
850 .frequency = (int64_t)feConfig.getFrequency(),
851 };
852 if (feConfig.hasEndFrequency()) {
853 isdbtSettings.endFrequency = (int64_t)feConfig.getEndFrequency();
854 }
855 if (!feConfig.hasIsdbtFrontendSettings_optional()) {
856 ALOGW("[ConfigReader] no more isdbt settings");
857 return isdbtSettings;
858 }
859 auto isdbt = feConfig.getFirstIsdbtFrontendSettings_optional();
860 isdbtSettings.inversion = static_cast<FrontendSpectralInversion>(isdbt->getInversion());
861 isdbtSettings.bandwidth = static_cast<FrontendIsdbtBandwidth>(isdbt->getBandwidth());
862 isdbtSettings.mode = static_cast<FrontendIsdbtMode>(isdbt->getMode());
863 isdbtSettings.guardInterval =
864 static_cast<FrontendIsdbtGuardInterval>(isdbt->getGuardInterval());
865 isdbtSettings.serviceAreaId = (int32_t)isdbt->getServiceAreaId();
866 isdbtSettings.partialReceptionFlag =
867 static_cast<FrontendIsdbtPartialReceptionFlag>(isdbt->getPartialReceptionFlag());
868 if (!isdbt->hasFrontendIsdbtLayerSettings()) {
869 ALOGW("[ConfigReader] no isdbt layer settings");
870 return isdbtSettings;
871 }
872 auto layerSettings = isdbt->getFirstFrontendIsdbtLayerSettings();
873 ::aidl::android::hardware::tv::tuner::FrontendIsdbtLayerSettings mLayerSettings;
874 mLayerSettings.modulation =
875 static_cast<FrontendIsdbtModulation>(layerSettings->getModulation());
876 mLayerSettings.coderate = static_cast<FrontendIsdbtCoderate>(layerSettings->getCoderate());
877 mLayerSettings.timeInterleave =
878 static_cast<FrontendIsdbtTimeInterleaveMode>(layerSettings->getTimeInterleave());
879 mLayerSettings.numOfSegment = (int32_t)layerSettings->getNumOfSegment();
880 isdbtSettings.layerSettings.push_back(mLayerSettings);
881 return isdbtSettings;
882 }
883
Hongguang600a6ae2021-07-08 18:51:51 -0700884 static bool readFilterTypeAndSettings(Filter filterConfig, DemuxFilterType& type,
885 DemuxFilterSettings& settings) {
886 auto mainType = filterConfig.getMainType();
887 auto subType = filterConfig.getSubType();
888
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000889 if (subType == FilterSubTypeEnum::AUDIO) {
890 audioFilterIds.push_back(filterConfig.getId());
891 } else if (subType == FilterSubTypeEnum::VIDEO) {
892 videoFilterIds.push_back(filterConfig.getId());
893 } else if (subType == FilterSubTypeEnum::RECORD) {
894 recordFilterIds.push_back(filterConfig.getId());
Frankie Lizcanoa53f5542022-07-07 17:32:06 +0000895 } else if (subType == FilterSubTypeEnum::SECTION) {
896 sectionFilterIds.push_back(filterConfig.getId());
Frankie Lizcano8b87f252022-07-19 21:51:54 +0000897 } else if (subType == FilterSubTypeEnum::PCR) {
898 pcrFilterIds.push_back(filterConfig.getId());
899 } else if (subType == FilterSubTypeEnum::IP) {
900 ipFilterIds.push_back(filterConfig.getId());
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000901 }
902
Hongguang600a6ae2021-07-08 18:51:51 -0700903 switch (mainType) {
904 case FilterMainTypeEnum::TS: {
905 ALOGW("[ConfigReader] filter main type is ts");
906 type.mainType = DemuxFilterMainType::TS;
907 DemuxTsFilterSettings ts;
908 bool isTsSet = false;
909 switch (subType) {
910 case FilterSubTypeEnum::UNDEFINED:
Hongguangce1e30d2021-08-02 21:55:44 -0700911 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700912 DemuxTsFilterType::UNDEFINED);
913 break;
914 case FilterSubTypeEnum::SECTION:
Hongguangce1e30d2021-08-02 21:55:44 -0700915 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700916 DemuxTsFilterType::SECTION);
917 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::section>(
918 readSectionFilterSettings(filterConfig));
919 isTsSet = true;
920 break;
921 case FilterSubTypeEnum::PES:
922 // TODO: b/182519645 support all the filter settings
Hongguangce1e30d2021-08-02 21:55:44 -0700923 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700924 DemuxTsFilterType::PES);
925 break;
926 case FilterSubTypeEnum::TS:
Hongguangce1e30d2021-08-02 21:55:44 -0700927 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700928 DemuxTsFilterType::TS);
929 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::noinit>(
930 true);
931 isTsSet = true;
932 break;
933 case FilterSubTypeEnum::PCR:
Hongguangce1e30d2021-08-02 21:55:44 -0700934 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700935 DemuxTsFilterType::PCR);
936 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::noinit>(
937 true);
938 isTsSet = true;
939 break;
940 case FilterSubTypeEnum::TEMI:
Hongguangce1e30d2021-08-02 21:55:44 -0700941 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700942 DemuxTsFilterType::TEMI);
943 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::noinit>(
944 true);
945 isTsSet = true;
946 break;
947 case FilterSubTypeEnum::AUDIO:
Hongguangce1e30d2021-08-02 21:55:44 -0700948 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700949 DemuxTsFilterType::AUDIO);
950 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::av>(
951 readAvFilterSettings(filterConfig));
952 isTsSet = true;
953 break;
954 case FilterSubTypeEnum::VIDEO:
Hongguangce1e30d2021-08-02 21:55:44 -0700955 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700956 DemuxTsFilterType::VIDEO);
957 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::av>(
958 readAvFilterSettings(filterConfig));
959 isTsSet = true;
960 break;
961 case FilterSubTypeEnum::RECORD:
Hongguangce1e30d2021-08-02 21:55:44 -0700962 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700963 DemuxTsFilterType::RECORD);
964 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::record>(
965 readRecordFilterSettings(filterConfig));
966 isTsSet = true;
967 break;
968 default:
969 ALOGW("[ConfigReader] ts subtype is not supported");
970 return false;
971 }
972 if (filterConfig.hasPid()) {
973 ts.tpid = static_cast<int32_t>(filterConfig.getPid());
974 isTsSet = true;
975 }
976 if (isTsSet) {
977 settings.set<DemuxFilterSettings::Tag::ts>(ts);
978 }
979 break;
980 }
981 case FilterMainTypeEnum::MMTP: {
982 ALOGW("[ConfigReader] filter main type is mmtp");
983 type.mainType = DemuxFilterMainType::MMTP;
984 DemuxMmtpFilterSettings mmtp;
985 bool isMmtpSet = false;
986 switch (subType) {
987 case FilterSubTypeEnum::UNDEFINED:
Hongguangce1e30d2021-08-02 21:55:44 -0700988 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700989 DemuxMmtpFilterType::UNDEFINED);
990 break;
991 case FilterSubTypeEnum::SECTION:
Hongguangce1e30d2021-08-02 21:55:44 -0700992 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700993 DemuxMmtpFilterType::SECTION);
994 mmtp.filterSettings
995 .set<DemuxMmtpFilterSettingsFilterSettings::Tag::section>(
996 readSectionFilterSettings(filterConfig));
997 isMmtpSet = true;
998 break;
999 case FilterSubTypeEnum::PES:
Hongguangce1e30d2021-08-02 21:55:44 -07001000 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -07001001 DemuxMmtpFilterType::PES);
1002 // TODO: b/182519645 support all the filter settings
1003 break;
1004 case FilterSubTypeEnum::MMTP:
Hongguangce1e30d2021-08-02 21:55:44 -07001005 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -07001006 DemuxMmtpFilterType::MMTP);
1007 mmtp.filterSettings.set<DemuxMmtpFilterSettingsFilterSettings::Tag::noinit>(
1008 true);
1009 isMmtpSet = true;
1010 break;
1011 case FilterSubTypeEnum::AUDIO:
Hongguangce1e30d2021-08-02 21:55:44 -07001012 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -07001013 DemuxMmtpFilterType::AUDIO);
1014 mmtp.filterSettings.set<DemuxMmtpFilterSettingsFilterSettings::Tag::av>(
1015 readAvFilterSettings(filterConfig));
1016 isMmtpSet = true;
1017 break;
1018 case FilterSubTypeEnum::VIDEO:
Hongguangce1e30d2021-08-02 21:55:44 -07001019 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -07001020 DemuxMmtpFilterType::VIDEO);
1021 mmtp.filterSettings.set<DemuxMmtpFilterSettingsFilterSettings::Tag::av>(
1022 readAvFilterSettings(filterConfig));
1023 isMmtpSet = true;
1024 break;
1025 case FilterSubTypeEnum::RECORD:
Hongguangce1e30d2021-08-02 21:55:44 -07001026 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -07001027 DemuxMmtpFilterType::RECORD);
1028 mmtp.filterSettings.set<DemuxMmtpFilterSettingsFilterSettings::Tag::record>(
1029 readRecordFilterSettings(filterConfig));
1030 isMmtpSet = true;
1031 break;
1032 case FilterSubTypeEnum::DOWNLOAD:
Hongguangce1e30d2021-08-02 21:55:44 -07001033 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -07001034 DemuxMmtpFilterType::DOWNLOAD);
1035 // TODO: b/182519645 support all the filter settings
1036 break;
1037 default:
1038 ALOGW("[ConfigReader] mmtp subtype is not supported");
1039 return false;
1040 }
1041 if (filterConfig.hasPid()) {
1042 mmtp.mmtpPid = static_cast<int32_t>(filterConfig.getPid());
1043 isMmtpSet = true;
1044 }
1045 if (isMmtpSet) {
1046 settings.set<DemuxFilterSettings::Tag::mmtp>(mmtp);
1047 }
1048 break;
1049 }
1050 case FilterMainTypeEnum::IP: {
1051 ALOGW("[ConfigReader] filter main type is ip");
1052 type.mainType = DemuxFilterMainType::IP;
1053 DemuxIpFilterSettings ip;
1054 switch (subType) {
1055 case FilterSubTypeEnum::UNDEFINED:
Hongguangce1e30d2021-08-02 21:55:44 -07001056 type.subType.set<DemuxFilterSubType::Tag::ipFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -07001057 DemuxIpFilterType::UNDEFINED);
1058 break;
1059 case FilterSubTypeEnum::SECTION:
Hongguangce1e30d2021-08-02 21:55:44 -07001060 type.subType.set<DemuxFilterSubType::Tag::ipFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -07001061 DemuxIpFilterType::SECTION);
1062 ip.filterSettings.set<DemuxIpFilterSettingsFilterSettings::Tag::section>(
1063 readSectionFilterSettings(filterConfig));
1064 settings.set<DemuxFilterSettings::Tag::ip>(ip);
1065 break;
1066 case FilterSubTypeEnum::NTP:
Hongguangce1e30d2021-08-02 21:55:44 -07001067 type.subType.set<DemuxFilterSubType::Tag::ipFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -07001068 DemuxIpFilterType::NTP);
1069 ip.filterSettings.set<DemuxIpFilterSettingsFilterSettings::Tag::noinit>(
1070 true);
1071 settings.set<DemuxFilterSettings::Tag::ip>(ip);
1072 break;
1073 case FilterSubTypeEnum::IP: {
Gareth Fenn9a808452022-03-31 08:40:00 +01001074 type.subType.set<DemuxFilterSubType::Tag::ipFilterType>(
1075 DemuxIpFilterType::IP);
Hongguang600a6ae2021-07-08 18:51:51 -07001076 ip.ipAddr = readIpAddress(filterConfig),
1077 ip.filterSettings
1078 .set<DemuxIpFilterSettingsFilterSettings::Tag::bPassthrough>(
1079 readPassthroughSettings(filterConfig));
1080 settings.set<DemuxFilterSettings::Tag::ip>(ip);
1081 break;
1082 }
1083 case FilterSubTypeEnum::IP_PAYLOAD:
Hongguangce1e30d2021-08-02 21:55:44 -07001084 type.subType.set<DemuxFilterSubType::Tag::ipFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -07001085 DemuxIpFilterType::IP_PAYLOAD);
1086 ip.filterSettings.set<DemuxIpFilterSettingsFilterSettings::Tag::noinit>(
1087 true);
1088 settings.set<DemuxFilterSettings::Tag::ip>(ip);
1089 break;
1090 case FilterSubTypeEnum::PAYLOAD_THROUGH:
Hongguangce1e30d2021-08-02 21:55:44 -07001091 type.subType.set<DemuxFilterSubType::Tag::ipFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -07001092 DemuxIpFilterType::PAYLOAD_THROUGH);
1093 ip.filterSettings.set<DemuxIpFilterSettingsFilterSettings::Tag::noinit>(
1094 true);
1095 settings.set<DemuxFilterSettings::Tag::ip>(ip);
1096 break;
1097 default:
1098 ALOGW("[ConfigReader] mmtp subtype is not supported");
1099 return false;
1100 }
1101 break;
1102 }
1103 default:
1104 // TODO: b/182519645 support all the filter configs
1105 ALOGW("[ConfigReader] filter main type is not supported in dynamic config");
1106 return false;
1107 }
1108 return true;
1109 }
1110
1111 static DemuxIpAddress readIpAddress(Filter filterConfig) {
1112 DemuxIpAddress ipAddress;
1113 vector<uint8_t> data;
1114 if (!filterConfig.hasIpFilterConfig_optional()) {
1115 return ipAddress;
1116 }
1117 auto ipFilterConfig = filterConfig.getFirstIpFilterConfig_optional();
1118 if (ipFilterConfig->hasSrcPort()) {
1119 ipAddress.srcPort = ipFilterConfig->getSrcPort();
1120 }
1121 if (ipFilterConfig->hasDestPort()) {
1122 ipAddress.dstPort = ipFilterConfig->getDestPort();
1123 }
1124 if (ipFilterConfig->getFirstSrcIpAddress()->getIsIpV4()) {
1125 data.resize(4);
1126 memcpy(data.data(), ipFilterConfig->getFirstSrcIpAddress()->getIp().data(), 4);
1127 ipAddress.srcIpAddress.set<DemuxIpAddressIpAddress::Tag::v4>(data);
1128 } else {
1129 data.resize(6);
1130 memcpy(data.data(), ipFilterConfig->getFirstSrcIpAddress()->getIp().data(), 6);
1131 ipAddress.srcIpAddress.set<DemuxIpAddressIpAddress::Tag::v6>(data);
1132 }
1133 if (ipFilterConfig->getFirstDestIpAddress()->getIsIpV4()) {
1134 data.resize(4);
1135 memcpy(data.data(), ipFilterConfig->getFirstDestIpAddress()->getIp().data(), 4);
1136 ipAddress.dstIpAddress.set<DemuxIpAddressIpAddress::Tag::v4>(data);
1137 } else {
1138 data.resize(6);
1139 memcpy(data.data(), ipFilterConfig->getFirstDestIpAddress()->getIp().data(), 6);
1140 ipAddress.dstIpAddress.set<DemuxIpAddressIpAddress::Tag::v6>(data);
1141 }
1142 return ipAddress;
1143 }
1144
1145 static bool readPassthroughSettings(Filter filterConfig) {
1146 if (!filterConfig.hasIpFilterConfig_optional()) {
1147 return false;
1148 }
1149 auto ipFilterConfig = filterConfig.getFirstIpFilterConfig_optional();
1150 if (ipFilterConfig->hasDataPassthrough()) {
1151 return ipFilterConfig->getDataPassthrough();
1152 }
1153 return false;
1154 }
1155
1156 static DemuxFilterSectionSettings readSectionFilterSettings(Filter filterConfig) {
1157 DemuxFilterSectionSettings settings;
1158 if (!filterConfig.hasSectionFilterSettings_optional()) {
1159 return settings;
1160 }
1161 auto section = filterConfig.getFirstSectionFilterSettings_optional();
1162 settings.isCheckCrc = section->getIsCheckCrc();
1163 settings.isRepeat = section->getIsRepeat();
1164 settings.isRaw = section->getIsRaw();
Hongguang494ba662022-01-05 22:08:10 -08001165 settings.bitWidthOfLengthField = section->getBitWidthOfLengthField();
Hongguang600a6ae2021-07-08 18:51:51 -07001166 return settings;
1167 }
1168
1169 static DemuxFilterAvSettings readAvFilterSettings(Filter filterConfig) {
1170 DemuxFilterAvSettings settings;
1171 if (!filterConfig.hasAvFilterSettings_optional()) {
1172 return settings;
1173 }
1174 auto av = filterConfig.getFirstAvFilterSettings_optional();
1175 settings.isPassthrough = av->getIsPassthrough();
Hongguang16dacc12021-11-01 15:51:52 -07001176 settings.isSecureMemory = av->getIsSecureMemory();
Hongguang600a6ae2021-07-08 18:51:51 -07001177 return settings;
1178 }
1179
1180 static DemuxFilterRecordSettings readRecordFilterSettings(Filter filterConfig) {
1181 DemuxFilterRecordSettings settings;
1182 if (!filterConfig.hasRecordFilterSettings_optional()) {
1183 return settings;
1184 }
1185 auto record = filterConfig.getFirstRecordFilterSettings_optional();
1186 settings.tsIndexMask = record->getTsIndexMask();
1187 settings.scIndexType = static_cast<DemuxRecordScIndexType>(record->getScIndexType());
1188 return settings;
1189 }
1190
1191 static PlaybackSettings readPlaybackSettings(Dvr dvrConfig) {
1192 ALOGW("[ConfigReader] dvr type is playback");
1193 PlaybackSettings playbackSettings{
Hongguang11da2cb2021-08-05 19:05:12 -07001194 .statusMask = static_cast<int8_t>(dvrConfig.getStatusMask()),
1195 .lowThreshold = static_cast<int64_t>(dvrConfig.getLowThreshold()),
1196 .highThreshold = static_cast<int64_t>(dvrConfig.getHighThreshold()),
Hongguang600a6ae2021-07-08 18:51:51 -07001197 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
Hongguang11da2cb2021-08-05 19:05:12 -07001198 .packetSize = static_cast<int64_t>(dvrConfig.getPacketSize()),
Hongguang600a6ae2021-07-08 18:51:51 -07001199 };
1200 return playbackSettings;
1201 }
1202
1203 static RecordSettings readRecordSettings(Dvr dvrConfig) {
1204 ALOGW("[ConfigReader] dvr type is record");
1205 RecordSettings recordSettings{
Hongguang11da2cb2021-08-05 19:05:12 -07001206 .statusMask = static_cast<int8_t>(dvrConfig.getStatusMask()),
1207 .lowThreshold = static_cast<int64_t>(dvrConfig.getLowThreshold()),
1208 .highThreshold = static_cast<int64_t>(dvrConfig.getHighThreshold()),
Hongguang600a6ae2021-07-08 18:51:51 -07001209 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
Hongguang11da2cb2021-08-05 19:05:12 -07001210 .packetSize = static_cast<int64_t>(dvrConfig.getPacketSize()),
Hongguang600a6ae2021-07-08 18:51:51 -07001211 };
1212 return recordSettings;
1213 }
1214
Hongguange106f472022-01-11 12:09:22 -08001215 static void getCiCamInfo(Frontend feConfig, bool& canConnectToCiCam, int32_t& ciCamId,
1216 int32_t& removePid) {
Hongguang600a6ae2021-07-08 18:51:51 -07001217 if (!feConfig.hasConnectToCicamId()) {
1218 canConnectToCiCam = false;
1219 ciCamId = -1;
Hongguange106f472022-01-11 12:09:22 -08001220 removePid = -1;
Gareth Fenn53ae3832021-10-15 17:19:00 +01001221 return;
Hongguang600a6ae2021-07-08 18:51:51 -07001222 }
1223 canConnectToCiCam = true;
1224 ciCamId = static_cast<int32_t>(feConfig.getConnectToCicamId());
Hongguange106f472022-01-11 12:09:22 -08001225 removePid = static_cast<int32_t>(feConfig.getRemoveOutputPid());
Hongguang600a6ae2021-07-08 18:51:51 -07001226 }
1227};