blob: 31f07553d17795fa823b89a5cf6313c9bc8fc14a [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;
76
Hongguang600a6ae2021-07-08 18:51:51 -070077const string emptyHardwareId = "";
78
79static string mConfigFilePath;
80
Frankie Lizcano5b29f502022-07-06 22:09:42 +000081static vector<string> playbackDvrIds;
82static vector<string> recordDvrIds;
83static vector<string> audioFilterIds;
84static vector<string> videoFilterIds;
85static vector<string> recordFilterIds;
Frankie Lizcanoa53f5542022-07-07 17:32:06 +000086static vector<string> sectionFilterIds;
Frankie Lizcano1e283b32022-07-08 21:07:42 +000087static vector<string> frontendIds;
88static vector<string> lnbIds;
89static vector<string> diseqcMsgs;
Frankie Lizcano5b29f502022-07-06 22:09:42 +000090
Hongguang600a6ae2021-07-08 18:51:51 -070091#define PROVISION_STR \
92 "{ " \
93 " \"id\": 21140844, " \
94 " \"name\": \"Test Title\", " \
95 " \"lowercase_organization_name\": \"Android\", " \
96 " \"asset_key\": { " \
97 " \"encryption_key\": \"nezAr3CHFrmBR9R8Tedotw==\" " \
98 " }, " \
99 " \"cas_type\": 1, " \
100 " \"track_types\": [ ] " \
101 "} "
102
103struct FrontendConfig {
104 bool isSoftwareFe;
105 FrontendType type;
106 bool canConnectToCiCam;
107 int32_t ciCamId;
Hongguange106f472022-01-11 12:09:22 -0800108 int32_t removePid;
Hongguang600a6ae2021-07-08 18:51:51 -0700109 FrontendSettings settings;
110 vector<FrontendStatusType> tuneStatusTypes;
111 vector<FrontendStatus> expectTuneStatuses;
112};
113
114struct FilterConfig {
115 int32_t bufferSize;
116 DemuxFilterType type;
117 DemuxFilterSettings settings;
118 bool getMqDesc;
119 AvStreamType streamType;
120 int32_t ipCid;
121 int32_t monitorEventTypes;
Patrick Rohr1586d212021-11-23 00:40:56 +0100122 int timeDelayInMs = 0;
123 int dataDelayInBytes = 0;
Hongguang600a6ae2021-07-08 18:51:51 -0700124
125 bool operator<(const FilterConfig& /*c*/) const { return false; }
126};
127
128struct DvrConfig {
129 DvrType type;
130 int32_t bufferSize;
131 DvrSettings settings;
132 string playbackInputFile;
133};
134
135struct LnbConfig {
136 string name;
137 LnbVoltage voltage;
138 LnbTone tone;
139 LnbPosition position;
140};
141
142struct TimeFilterConfig {
143 int64_t timeStamp;
144};
145
146struct DescramblerConfig {
147 int32_t casSystemId;
148 string provisionStr;
149 vector<uint8_t> hidlPvtData;
150};
151
152struct LiveBroadcastHardwareConnections {
153 bool hasFrontendConnection;
154 string frontendId;
155 string dvrSoftwareFeId;
156 string audioFilterId;
157 string videoFilterId;
158 string sectionFilterId;
159 string ipFilterId;
160 string pcrFilterId;
161 /* list string of extra filters; */
162};
163
164struct ScanHardwareConnections {
165 bool hasFrontendConnection;
166 string frontendId;
167};
168
169struct DvrPlaybackHardwareConnections {
170 bool support;
Frankie Lizcano50461932022-06-28 21:36:26 +0000171 bool hasExtraFilters = false;
Hongguang600a6ae2021-07-08 18:51:51 -0700172 string frontendId;
173 string dvrId;
174 string audioFilterId;
175 string videoFilterId;
176 string sectionFilterId;
Frankie Lizcano50461932022-06-28 21:36:26 +0000177 vector<string> extraFilters;
Hongguang600a6ae2021-07-08 18:51:51 -0700178};
179
180struct DvrRecordHardwareConnections {
181 bool support;
182 bool hasFrontendConnection;
183 string frontendId;
184 string dvrRecordId;
185 string dvrSoftwareFeId;
186 string recordFilterId;
187 string dvrSourceId;
188};
189
190struct DescramblingHardwareConnections {
191 bool support;
192 bool hasFrontendConnection;
193 string frontendId;
194 string dvrSoftwareFeId;
195 string audioFilterId;
196 string videoFilterId;
197 string descramblerId;
198 string dvrSourceId;
Frankie Lizcanof5352122022-06-29 22:10:16 +0000199 vector<string> extraFilters;
Hongguang600a6ae2021-07-08 18:51:51 -0700200};
201
202struct LnbLiveHardwareConnections {
203 bool support;
204 string frontendId;
205 string audioFilterId;
206 string videoFilterId;
207 string lnbId;
208 vector<string> diseqcMsgs;
Frankie Lizcano647d5aa2022-06-30 20:49:31 +0000209 vector<string> extraFilters;
Hongguang600a6ae2021-07-08 18:51:51 -0700210};
211
212struct LnbRecordHardwareConnections {
213 bool support;
214 string frontendId;
215 string dvrRecordId;
216 string recordFilterId;
217 string lnbId;
218 vector<string> diseqcMsgs;
Frankie Lizcano647d5aa2022-06-30 20:49:31 +0000219 vector<string> extraFilters;
Hongguang600a6ae2021-07-08 18:51:51 -0700220};
221
222struct TimeFilterHardwareConnections {
223 bool support;
224 string timeFilterId;
225};
226
227struct TunerTestingConfigAidlReader1_0 {
228 public:
229 static void setConfigFilePath(string path) { mConfigFilePath = path; }
230
231 static bool checkConfigFileExists() {
232 auto res = read(mConfigFilePath.c_str());
233 if (res == nullopt) {
234 ALOGW("[ConfigReader] Couldn't read %s."
235 "Please check tuner_testing_dynamic_configuration.xsd"
236 "and sample_tuner_vts_config.xml for more details on how to config Tune VTS.",
237 mConfigFilePath.c_str());
238 }
239 return (res != nullopt);
240 }
241
242 static TunerConfiguration getTunerConfig() { return *read(mConfigFilePath.c_str()); }
243
244 static DataFlowConfiguration getDataFlowConfiguration() {
245 return *getTunerConfig().getFirstDataFlowConfiguration();
246 }
247
248 static HardwareConfiguration getHardwareConfig() {
249 return *getTunerConfig().getFirstHardwareConfiguration();
250 }
251
252 static void readFrontendConfig1_0(map<string, FrontendConfig>& frontendMap) {
253 auto hardwareConfig = getHardwareConfig();
254 if (hardwareConfig.hasFrontends()) {
255 // TODO: b/182519645 complete the tune status config
256 vector<FrontendStatusType> types;
257 vector<FrontendStatus> statuses;
258
259 types.push_back(FrontendStatusType::DEMOD_LOCK);
260 types.push_back(FrontendStatusType::UEC);
261 types.push_back(FrontendStatusType::IS_MISO);
262
263 FrontendStatus status;
264 status.set<FrontendStatus::Tag::isDemodLocked>(true);
265 statuses.push_back(status);
266 status.set<FrontendStatus::Tag::uec>(4);
267 statuses.push_back(status);
268 status.set<FrontendStatus::Tag::isMiso>(true);
269 statuses.push_back(status);
270
271 auto frontends = *hardwareConfig.getFirstFrontends();
272 for (auto feConfig : frontends.getFrontend()) {
273 string id = feConfig.getId();
Frankie Lizcano1e283b32022-07-08 21:07:42 +0000274 frontendIds.push_back(id);
Hongguang600a6ae2021-07-08 18:51:51 -0700275 if (id.compare(string("FE_DEFAULT")) == 0) {
276 // overrid default
277 frontendMap.erase(string("FE_DEFAULT"));
278 }
279 FrontendType type;
280 switch (feConfig.getType()) {
281 case FrontendTypeEnum::UNDEFINED:
282 type = FrontendType::UNDEFINED;
283 break;
284 // TODO: b/182519645 finish all other frontend settings
285 case FrontendTypeEnum::ANALOG:
286 type = FrontendType::ANALOG;
287 break;
288 case FrontendTypeEnum::ATSC:
289 type = FrontendType::ATSC;
Frankie Lizcano3ad735d2022-06-24 19:20:54 +0000290 frontendMap[id].settings.set<
291 FrontendSettings::Tag::atsc>(
292 readAtscFrontendSettings(feConfig));
Hongguang600a6ae2021-07-08 18:51:51 -0700293 break;
294 case FrontendTypeEnum::ATSC3:
295 type = FrontendType::ATSC3;
296 break;
297 case FrontendTypeEnum::DVBC:
298 type = FrontendType::DVBC;
299 break;
300 case FrontendTypeEnum::DVBS:
301 type = FrontendType::DVBS;
302 frontendMap[id].settings.set<FrontendSettings::Tag::dvbs>(
303 readDvbsFrontendSettings(feConfig));
304 break;
305 case FrontendTypeEnum::DVBT: {
306 type = FrontendType::DVBT;
307 frontendMap[id].settings.set<FrontendSettings::Tag::dvbt>(
308 readDvbtFrontendSettings(feConfig));
309 break;
310 }
311 case FrontendTypeEnum::ISDBS:
312 type = FrontendType::ISDBS;
Frankie Lizcano01dca3d2022-06-29 18:22:02 +0000313 frontendMap[id].settings.set<FrontendSettings::Tag::isdbs>(
Frankie Lizcano452b0262022-06-27 22:00:33 +0000314 readIsdbsFrontendSettings(feConfig));
Hongguang600a6ae2021-07-08 18:51:51 -0700315 break;
316 case FrontendTypeEnum::ISDBS3:
317 type = FrontendType::ISDBS3;
318 break;
319 case FrontendTypeEnum::ISDBT:
320 type = FrontendType::ISDBT;
Frankie Lizcanoaee8c9e2022-06-24 21:28:00 +0000321 frontendMap[id].settings.set<FrontendSettings::Tag::isdbt>(
322 readIsdbtFrontendSettings(feConfig));
Hongguang600a6ae2021-07-08 18:51:51 -0700323 break;
324 case FrontendTypeEnum::DTMB:
325 type = FrontendType::DTMB;
326 break;
327 case FrontendTypeEnum::UNKNOWN:
328 ALOGW("[ConfigReader] invalid frontend type");
329 return;
330 default:
331 ALOGW("[ConfigReader] fe already handled in 1_0 reader.");
332 break;
333 }
334 frontendMap[id].type = type;
335 frontendMap[id].isSoftwareFe = feConfig.getIsSoftwareFrontend();
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000336 if (frontendMap[id].isSoftwareFe) {
337 hasSwFe = true;
338 } else {
339 hasHwFe = true;
340 }
Hongguang600a6ae2021-07-08 18:51:51 -0700341 // TODO: b/182519645 complete the tune status config
342 frontendMap[id].tuneStatusTypes = types;
343 frontendMap[id].expectTuneStatuses = statuses;
Hongguange106f472022-01-11 12:09:22 -0800344 getCiCamInfo(feConfig, frontendMap[id].canConnectToCiCam, frontendMap[id].ciCamId,
345 frontendMap[id].removePid);
Hongguang600a6ae2021-07-08 18:51:51 -0700346 }
347 }
348 }
349
350 static void readFilterConfig1_0(map<string, FilterConfig>& filterMap) {
351 auto hardwareConfig = getHardwareConfig();
352 if (hardwareConfig.hasFilters()) {
353 auto filters = *hardwareConfig.getFirstFilters();
354 for (auto filterConfig : filters.getFilter()) {
355 string id = filterConfig.getId();
356 if (id.compare(string("FILTER_AUDIO_DEFAULT")) == 0) {
357 // overrid default
358 filterMap.erase(string("FILTER_AUDIO_DEFAULT"));
359 }
360 if (id.compare(string("FILTER_VIDEO_DEFAULT")) == 0) {
361 // overrid default
362 filterMap.erase(string("FILTER_VIDEO_DEFAULT"));
363 }
364
365 DemuxFilterType type;
366 DemuxFilterSettings settings;
367 if (!readFilterTypeAndSettings(filterConfig, type, settings)) {
368 ALOGW("[ConfigReader] invalid filter type");
369 return;
370 }
371 filterMap[id].type = type;
372 filterMap[id].bufferSize = filterConfig.getBufferSize();
373 filterMap[id].getMqDesc = filterConfig.getUseFMQ();
374 filterMap[id].settings = settings;
375
376 if (filterConfig.hasMonitorEventTypes()) {
Hongguang11da2cb2021-08-05 19:05:12 -0700377 filterMap[id].monitorEventTypes = (int32_t)filterConfig.getMonitorEventTypes();
Hongguang600a6ae2021-07-08 18:51:51 -0700378 }
Patrick Rohr1586d212021-11-23 00:40:56 +0100379 if (filterConfig.hasTimeDelayInMs()) {
380 filterMap[id].timeDelayInMs = filterConfig.getTimeDelayInMs();
381 }
382 if (filterConfig.hasDataDelayInBytes()) {
383 filterMap[id].dataDelayInBytes = filterConfig.getDataDelayInBytes();
384 }
Hongguang600a6ae2021-07-08 18:51:51 -0700385 if (filterConfig.hasAvFilterSettings_optional()) {
386 auto av = filterConfig.getFirstAvFilterSettings_optional();
387 if (av->hasAudioStreamType_optional()) {
388 filterMap[id].streamType.set<AvStreamType::Tag::audio>(
389 static_cast<AudioStreamType>(av->getAudioStreamType_optional()));
390 }
391 if (av->hasVideoStreamType_optional()) {
392 filterMap[id].streamType.set<AvStreamType::Tag::video>(
393 static_cast<VideoStreamType>(av->getVideoStreamType_optional()));
394 }
395 }
396 if (filterConfig.hasIpFilterConfig_optional()) {
397 auto ip = filterConfig.getFirstIpFilterConfig_optional();
398 if (ip->hasIpCid()) {
399 filterMap[id].ipCid = ip->getIpCid();
400 }
401 }
402 }
403 }
404 }
405
406 static void readDvrConfig1_0(map<string, DvrConfig>& dvrMap) {
407 auto hardwareConfig = getHardwareConfig();
408 if (hardwareConfig.hasDvrs()) {
409 auto dvrs = *hardwareConfig.getFirstDvrs();
410 for (auto dvrConfig : dvrs.getDvr()) {
411 string id = dvrConfig.getId();
412 DvrType type;
413 switch (dvrConfig.getType()) {
414 case DvrTypeEnum::PLAYBACK:
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000415 playbackDvrIds.push_back(id);
Hongguang600a6ae2021-07-08 18:51:51 -0700416 type = DvrType::PLAYBACK;
417 dvrMap[id].settings.set<DvrSettings::Tag::playback>(
418 readPlaybackSettings(dvrConfig));
419 break;
420 case DvrTypeEnum::RECORD:
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000421 recordDvrIds.push_back(id);
Hongguang600a6ae2021-07-08 18:51:51 -0700422 type = DvrType::RECORD;
423 dvrMap[id].settings.set<DvrSettings::Tag::record>(
424 readRecordSettings(dvrConfig));
425 break;
426 case DvrTypeEnum::UNKNOWN:
427 ALOGW("[ConfigReader] invalid DVR type");
428 return;
429 }
430 dvrMap[id].type = type;
Hongguang11da2cb2021-08-05 19:05:12 -0700431 dvrMap[id].bufferSize = static_cast<int32_t>(dvrConfig.getBufferSize());
Hongguang600a6ae2021-07-08 18:51:51 -0700432 if (dvrConfig.hasInputFilePath()) {
433 dvrMap[id].playbackInputFile = dvrConfig.getInputFilePath();
434 }
435 }
436 }
437 }
438
439 static void readLnbConfig1_0(map<string, LnbConfig>& lnbMap) {
440 auto hardwareConfig = getHardwareConfig();
441 if (hardwareConfig.hasLnbs()) {
442 auto lnbs = *hardwareConfig.getFirstLnbs();
443 for (auto lnbConfig : lnbs.getLnb()) {
444 string id = lnbConfig.getId();
Frankie Lizcano1e283b32022-07-08 21:07:42 +0000445 lnbIds.push_back(id);
Hongguang600a6ae2021-07-08 18:51:51 -0700446 if (lnbConfig.hasName()) {
447 lnbMap[id].name = lnbConfig.getName();
448 } else {
449 lnbMap[id].name = emptyHardwareId;
450 }
451 lnbMap[id].voltage = static_cast<LnbVoltage>(lnbConfig.getVoltage());
452 lnbMap[id].tone = static_cast<LnbTone>(lnbConfig.getTone());
453 lnbMap[id].position = static_cast<LnbPosition>(lnbConfig.getPosition());
454 }
455 }
456 }
457
458 static void readDescramblerConfig1_0(map<string, DescramblerConfig>& descramblerMap) {
459 auto hardwareConfig = getHardwareConfig();
460 if (hardwareConfig.hasDescramblers()) {
461 auto descramblers = *hardwareConfig.getFirstDescramblers();
462 for (auto descramblerConfig : descramblers.getDescrambler()) {
463 string id = descramblerConfig.getId();
464 descramblerMap[id].casSystemId =
Hongguang11da2cb2021-08-05 19:05:12 -0700465 static_cast<int32_t>(descramblerConfig.getCasSystemId());
Hongguang600a6ae2021-07-08 18:51:51 -0700466 if (descramblerConfig.hasProvisionStr()) {
467 descramblerMap[id].provisionStr = descramblerConfig.getProvisionStr();
468 } else {
469 descramblerMap[id].provisionStr = PROVISION_STR;
470 }
471 if (descramblerConfig.hasSesstionPrivatData()) {
472 auto privateData = descramblerConfig.getSesstionPrivatData();
473 int size = privateData.size();
474 descramblerMap[id].hidlPvtData.resize(size);
475 memcpy(descramblerMap[id].hidlPvtData.data(), privateData.data(), size);
476 } else {
477 descramblerMap[id].hidlPvtData.resize(256);
478 }
479 }
480 }
481 }
482
483 static void readDiseqcMessages(map<string, vector<uint8_t>>& diseqcMsgMap) {
484 auto hardwareConfig = getHardwareConfig();
485 if (hardwareConfig.hasDiseqcMessages()) {
486 auto msgs = *hardwareConfig.getFirstDiseqcMessages();
487 for (auto msgConfig : msgs.getDiseqcMessage()) {
488 string name = msgConfig.getMsgName();
Frankie Lizcano1e283b32022-07-08 21:07:42 +0000489 diseqcMsgs.push_back(name);
Hongguang600a6ae2021-07-08 18:51:51 -0700490 for (uint8_t atom : msgConfig.getMsgBody()) {
491 diseqcMsgMap[name].push_back(atom);
492 }
493 }
494 }
495 }
496
497 static void readTimeFilterConfig1_0(map<string, TimeFilterConfig>& timeFilterMap) {
498 auto hardwareConfig = getHardwareConfig();
499 if (hardwareConfig.hasTimeFilters()) {
500 auto timeFilters = *hardwareConfig.getFirstTimeFilters();
501 for (auto timeFilterConfig : timeFilters.getTimeFilter()) {
502 string id = timeFilterConfig.getId();
Hongguang11da2cb2021-08-05 19:05:12 -0700503 timeFilterMap[id].timeStamp = static_cast<int64_t>(timeFilterConfig.getTimeStamp());
Hongguang600a6ae2021-07-08 18:51:51 -0700504 }
505 }
506 }
507
508 static void connectLiveBroadcast(LiveBroadcastHardwareConnections& live) {
509 auto dataFlow = getDataFlowConfiguration();
510 if (dataFlow.hasClearLiveBroadcast()) {
511 live.hasFrontendConnection = true;
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000512 configuredLive = true;
Hongguang600a6ae2021-07-08 18:51:51 -0700513 } else {
514 live.hasFrontendConnection = false;
515 return;
516 }
517 auto liveConfig = *dataFlow.getFirstClearLiveBroadcast();
518 live.frontendId = liveConfig.getFrontendConnection();
519
520 live.audioFilterId = liveConfig.getAudioFilterConnection();
521 live.videoFilterId = liveConfig.getVideoFilterConnection();
522 if (liveConfig.hasPcrFilterConnection()) {
523 live.pcrFilterId = liveConfig.getPcrFilterConnection();
524 } else {
525 live.pcrFilterId = emptyHardwareId;
526 }
527 if (liveConfig.hasSectionFilterConnection()) {
528 live.sectionFilterId = liveConfig.getSectionFilterConnection();
529 } else {
530 live.sectionFilterId = emptyHardwareId;
531 }
532 if (liveConfig.hasDvrSoftwareFeConnection()) {
533 live.dvrSoftwareFeId = liveConfig.getDvrSoftwareFeConnection();
534 }
535 if (liveConfig.hasIpFilterConnection()) {
536 live.ipFilterId = liveConfig.getIpFilterConnection();
537 } else {
538 live.ipFilterId = emptyHardwareId;
539 }
540 }
541
542 static void connectScan(ScanHardwareConnections& scan) {
543 auto dataFlow = getDataFlowConfiguration();
544 if (dataFlow.hasScan()) {
545 scan.hasFrontendConnection = true;
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000546 configuredScan = true;
Hongguang600a6ae2021-07-08 18:51:51 -0700547 } else {
548 scan.hasFrontendConnection = false;
549 return;
550 }
551 auto scanConfig = *dataFlow.getFirstScan();
552 scan.frontendId = scanConfig.getFrontendConnection();
553 }
554
555 static void connectDvrPlayback(DvrPlaybackHardwareConnections& playback) {
556 auto dataFlow = getDataFlowConfiguration();
557 if (dataFlow.hasDvrPlayback()) {
558 playback.support = true;
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000559 configuredPlayback = true;
Hongguang600a6ae2021-07-08 18:51:51 -0700560 } else {
561 playback.support = false;
562 return;
563 }
564 auto playbackConfig = *dataFlow.getFirstDvrPlayback();
565 playback.dvrId = playbackConfig.getDvrConnection();
566 playback.audioFilterId = playbackConfig.getAudioFilterConnection();
567 playback.videoFilterId = playbackConfig.getVideoFilterConnection();
568 if (playbackConfig.hasSectionFilterConnection()) {
569 playback.sectionFilterId = playbackConfig.getSectionFilterConnection();
570 } else {
571 playback.sectionFilterId = emptyHardwareId;
572 }
Frankie Lizcano50461932022-06-28 21:36:26 +0000573 if (playbackConfig.hasOptionalFilters() && !playback.hasExtraFilters) {
574 auto optionalFilters = playbackConfig.getFirstOptionalFilters()->getOptionalFilter();
575 for (size_t i = 0; i < optionalFilters.size(); ++i) {
576 playback.extraFilters.push_back(optionalFilters[i].getFilterId());
577 }
578 playback.hasExtraFilters = true;
579 }
Hongguang600a6ae2021-07-08 18:51:51 -0700580 }
581
582 static void connectDvrRecord(DvrRecordHardwareConnections& record) {
583 auto dataFlow = getDataFlowConfiguration();
584 if (dataFlow.hasDvrRecord()) {
585 record.support = true;
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000586 configuredRecord = true;
Hongguang600a6ae2021-07-08 18:51:51 -0700587 } else {
588 record.support = false;
589 return;
590 }
591 auto recordConfig = *dataFlow.getFirstDvrRecord();
592 record.recordFilterId = recordConfig.getRecordFilterConnection();
593 record.dvrRecordId = recordConfig.getDvrRecordConnection();
594 if (recordConfig.hasDvrSoftwareFeConnection()) {
595 record.dvrSoftwareFeId = recordConfig.getDvrSoftwareFeConnection();
596 }
597 if (recordConfig.getHasFrontendConnection()) {
598 record.hasFrontendConnection = true;
599 record.dvrSourceId = emptyHardwareId;
600 record.frontendId = recordConfig.getFrontendConnection();
601 } else {
602 record.hasFrontendConnection = false;
603 record.dvrSourceId = recordConfig.getDvrSourceConnection();
604 }
605 }
606
607 static void connectDescrambling(DescramblingHardwareConnections& descrambling) {
608 auto dataFlow = getDataFlowConfiguration();
609 if (dataFlow.hasDescrambling()) {
610 descrambling.support = true;
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000611 configuredDescrambling = true;
Hongguang600a6ae2021-07-08 18:51:51 -0700612 } else {
613 descrambling.support = false;
614 return;
615 }
616 auto descConfig = *dataFlow.getFirstDescrambling();
617 descrambling.descramblerId = descConfig.getDescramblerConnection();
618 descrambling.audioFilterId = descConfig.getAudioFilterConnection();
619 descrambling.videoFilterId = descConfig.getVideoFilterConnection();
620 if (descConfig.hasDvrSoftwareFeConnection()) {
621 descrambling.dvrSoftwareFeId = descConfig.getDvrSoftwareFeConnection();
622 }
623 if (descConfig.getHasFrontendConnection()) {
624 descrambling.hasFrontendConnection = true;
625 descrambling.dvrSourceId = emptyHardwareId;
626 descrambling.frontendId = descConfig.getFrontendConnection();
627 } else {
628 descrambling.hasFrontendConnection = false;
629 descrambling.dvrSourceId = descConfig.getDvrSourceConnection();
630 }
Frankie Lizcanof5352122022-06-29 22:10:16 +0000631 if (descConfig.hasOptionalFilters()) {
632 auto optionalFilters = descConfig.getOptionalFilters();
633 descrambling.extraFilters = optionalFilters;
634 }
Hongguang600a6ae2021-07-08 18:51:51 -0700635 }
636
637 static void connectLnbLive(LnbLiveHardwareConnections& lnbLive) {
638 auto dataFlow = getDataFlowConfiguration();
639 if (dataFlow.hasLnbLive()) {
640 lnbLive.support = true;
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000641 configuredLnbLive = true;
Hongguang600a6ae2021-07-08 18:51:51 -0700642 } else {
643 lnbLive.support = false;
644 return;
645 }
646 auto lnbLiveConfig = *dataFlow.getFirstLnbLive();
647 lnbLive.frontendId = lnbLiveConfig.getFrontendConnection();
648 lnbLive.audioFilterId = lnbLiveConfig.getAudioFilterConnection();
649 lnbLive.videoFilterId = lnbLiveConfig.getVideoFilterConnection();
650 lnbLive.lnbId = lnbLiveConfig.getLnbConnection();
651 if (lnbLiveConfig.hasDiseqcMsgSender()) {
652 for (auto msgName : lnbLiveConfig.getDiseqcMsgSender()) {
653 lnbLive.diseqcMsgs.push_back(msgName);
654 }
655 }
Frankie Lizcano647d5aa2022-06-30 20:49:31 +0000656 if (lnbLiveConfig.hasOptionalFilters()) {
657 auto optionalFilters = lnbLiveConfig.getOptionalFilters();
658 lnbLive.extraFilters = optionalFilters;
659 }
Hongguang600a6ae2021-07-08 18:51:51 -0700660 }
661
662 static void connectLnbRecord(LnbRecordHardwareConnections& lnbRecord) {
663 auto dataFlow = getDataFlowConfiguration();
664 if (dataFlow.hasLnbRecord()) {
665 lnbRecord.support = true;
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000666 configuredLnbRecord = true;
Hongguang600a6ae2021-07-08 18:51:51 -0700667 } else {
668 lnbRecord.support = false;
669 return;
670 }
671 auto lnbRecordConfig = *dataFlow.getFirstLnbRecord();
672 lnbRecord.frontendId = lnbRecordConfig.getFrontendConnection();
673 lnbRecord.recordFilterId = lnbRecordConfig.getRecordFilterConnection();
674 lnbRecord.dvrRecordId = lnbRecordConfig.getDvrRecordConnection();
675 lnbRecord.lnbId = lnbRecordConfig.getLnbConnection();
676 if (lnbRecordConfig.hasDiseqcMsgSender()) {
677 for (auto msgName : lnbRecordConfig.getDiseqcMsgSender()) {
678 lnbRecord.diseqcMsgs.push_back(msgName);
679 }
680 }
Frankie Lizcano647d5aa2022-06-30 20:49:31 +0000681 if (lnbRecordConfig.hasOptionalFilters()) {
682 auto optionalFilters = lnbRecordConfig.getOptionalFilters();
683 lnbRecord.extraFilters = optionalFilters;
684 }
Hongguang600a6ae2021-07-08 18:51:51 -0700685 }
686
687 static void connectTimeFilter(TimeFilterHardwareConnections& timeFilter) {
688 auto dataFlow = getDataFlowConfiguration();
689 if (dataFlow.hasTimeFilter()) {
690 timeFilter.support = true;
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000691 configuredTimeFilter = true;
Hongguang600a6ae2021-07-08 18:51:51 -0700692 } else {
693 timeFilter.support = false;
694 return;
695 }
696 auto timeFilterConfig = *dataFlow.getFirstTimeFilter();
697 timeFilter.timeFilterId = timeFilterConfig.getTimeFilterConnection();
698 }
699
700 private:
701 static FrontendDvbtSettings readDvbtFrontendSettings(Frontend feConfig) {
702 ALOGW("[ConfigReader] fe type is dvbt");
703 FrontendDvbtSettings dvbtSettings{
Hongguang11da2cb2021-08-05 19:05:12 -0700704 .frequency = (int64_t)feConfig.getFrequency(),
Hongguang600a6ae2021-07-08 18:51:51 -0700705 };
Hongguang11da2cb2021-08-05 19:05:12 -0700706 if (feConfig.hasEndFrequency()) {
707 dvbtSettings.endFrequency = (int64_t)feConfig.getEndFrequency();
708 }
Hongguang600a6ae2021-07-08 18:51:51 -0700709 if (!feConfig.hasDvbtFrontendSettings_optional()) {
710 ALOGW("[ConfigReader] no more dvbt settings");
711 return dvbtSettings;
712 }
713 auto dvbt = feConfig.getFirstDvbtFrontendSettings_optional();
Hongguang11da2cb2021-08-05 19:05:12 -0700714 int32_t trans = static_cast<int32_t>(dvbt->getTransmissionMode());
Hongguang600a6ae2021-07-08 18:51:51 -0700715 dvbtSettings.transmissionMode = static_cast<FrontendDvbtTransmissionMode>(trans);
716 dvbtSettings.bandwidth = static_cast<FrontendDvbtBandwidth>(dvbt->getBandwidth());
717 dvbtSettings.isHighPriority = dvbt->getIsHighPriority();
718 dvbtSettings.hierarchy = static_cast<FrontendDvbtHierarchy>(dvbt->getHierarchy());
719 dvbtSettings.hpCoderate = static_cast<FrontendDvbtCoderate>(dvbt->getHpCoderate());
720 dvbtSettings.lpCoderate = static_cast<FrontendDvbtCoderate>(dvbt->getLpCoderate());
721 dvbtSettings.guardInterval =
722 static_cast<FrontendDvbtGuardInterval>(dvbt->getGuardInterval());
723 dvbtSettings.standard = static_cast<FrontendDvbtStandard>(dvbt->getStandard());
724 dvbtSettings.isMiso = dvbt->getIsMiso();
725 dvbtSettings.plpMode = static_cast<FrontendDvbtPlpMode>(dvbt->getPlpMode());
726 dvbtSettings.plpId = dvbt->getPlpId();
727 dvbtSettings.plpGroupId = dvbt->getPlpGroupId();
728 if (dvbt->hasConstellation()) {
729 dvbtSettings.constellation =
730 static_cast<FrontendDvbtConstellation>(dvbt->getConstellation());
731 }
732 return dvbtSettings;
733 }
734
735 static FrontendDvbsSettings readDvbsFrontendSettings(Frontend feConfig) {
736 ALOGW("[ConfigReader] fe type is dvbs");
737 FrontendDvbsSettings dvbsSettings{
Hongguang11da2cb2021-08-05 19:05:12 -0700738 .frequency = (int64_t)feConfig.getFrequency(),
Hongguang600a6ae2021-07-08 18:51:51 -0700739 };
Hongguang11da2cb2021-08-05 19:05:12 -0700740 if (feConfig.hasEndFrequency()) {
741 dvbsSettings.endFrequency = (int64_t)feConfig.getEndFrequency();
742 }
Hongguang600a6ae2021-07-08 18:51:51 -0700743 if (!feConfig.hasDvbsFrontendSettings_optional()) {
744 ALOGW("[ConfigReader] no more dvbs settings");
745 return dvbsSettings;
746 }
Hongguang11da2cb2021-08-05 19:05:12 -0700747 dvbsSettings.symbolRate = static_cast<int32_t>(
Hongguang600a6ae2021-07-08 18:51:51 -0700748 feConfig.getFirstDvbsFrontendSettings_optional()->getSymbolRate());
Hongguang11da2cb2021-08-05 19:05:12 -0700749 dvbsSettings.inputStreamId = static_cast<int32_t>(
Hongguang600a6ae2021-07-08 18:51:51 -0700750 feConfig.getFirstDvbsFrontendSettings_optional()->getInputStreamId());
751 auto dvbs = feConfig.getFirstDvbsFrontendSettings_optional();
752 if (dvbs->hasScanType()) {
753 dvbsSettings.scanType = static_cast<FrontendDvbsScanType>(dvbs->getScanType());
754 }
755 if (dvbs->hasIsDiseqcRxMessage()) {
756 dvbsSettings.isDiseqcRxMessage = dvbs->getIsDiseqcRxMessage();
757 }
758 return dvbsSettings;
759 }
760
Frankie Lizcano3ad735d2022-06-24 19:20:54 +0000761 static FrontendAtscSettings readAtscFrontendSettings(Frontend& feConfig) {
Frankie Lizcano01dca3d2022-06-29 18:22:02 +0000762 ALOGW("[ConfigReader] fe type is atsc");
763 FrontendAtscSettings atscSettings{
764 .frequency = (int64_t)feConfig.getFrequency(),
765 };
766 if (feConfig.hasEndFrequency()) {
767 atscSettings.endFrequency = (int64_t)feConfig.getEndFrequency();
768 }
769 if (!feConfig.hasAtscFrontendSettings_optional()) {
770 ALOGW("[ConfigReader] no more atsc settings");
771 return atscSettings;
772 }
773 auto atsc = feConfig.getFirstAtscFrontendSettings_optional();
774 atscSettings.inversion = static_cast<FrontendSpectralInversion>(atsc->getInversion());
775 atscSettings.modulation = static_cast<FrontendAtscModulation>(atsc->getModulation());
Frankie Lizcano3ad735d2022-06-24 19:20:54 +0000776 return atscSettings;
Frankie Lizcano452b0262022-06-27 22:00:33 +0000777 }
778
Frankie Lizcano01dca3d2022-06-29 18:22:02 +0000779 static FrontendIsdbsSettings readIsdbsFrontendSettings(Frontend& feConfig) {
780 ALOGW("[ConfigReader] fe type is isdbs");
781 FrontendIsdbsSettings isdbsSettings{.frequency = (int64_t)feConfig.getFrequency()};
782 if (feConfig.hasEndFrequency()) {
Frankie Lizcano452b0262022-06-27 22:00:33 +0000783 isdbsSettings.endFrequency = (int64_t)feConfig.getEndFrequency();
Frankie Lizcano01dca3d2022-06-29 18:22:02 +0000784 }
785 if (!feConfig.hasIsdbsFrontendSettings_optional()) {
Frankie Lizcano452b0262022-06-27 22:00:33 +0000786 ALOGW("[ConfigReader] no more isdbs settings");
787 return isdbsSettings;
Frankie Lizcano01dca3d2022-06-29 18:22:02 +0000788 }
789 auto isdbs = feConfig.getFirstIsdbsFrontendSettings_optional();
790 isdbsSettings.streamId = (int32_t)isdbs->getStreamId();
791 isdbsSettings.symbolRate = (int32_t)isdbs->getSymbolRate();
792 isdbsSettings.modulation = static_cast<FrontendIsdbsModulation>(isdbs->getModulation());
793 isdbsSettings.coderate = static_cast<FrontendIsdbsCoderate>(isdbs->getCoderate());
794 isdbsSettings.rolloff = static_cast<FrontendIsdbsRolloff>(isdbs->getRolloff());
795 isdbsSettings.streamIdType =
796 static_cast<FrontendIsdbsStreamIdType>(isdbs->getStreamIdType());
797 return isdbsSettings;
Frankie Lizcano3ad735d2022-06-24 19:20:54 +0000798 }
799
Frankie Lizcanoaee8c9e2022-06-24 21:28:00 +0000800 static FrontendIsdbtSettings readIsdbtFrontendSettings(Frontend& feConfig) {
801 ALOGW("[ConfigReader] fe type is isdbt");
802 FrontendIsdbtSettings isdbtSettings{
803 .frequency = (int64_t)feConfig.getFrequency(),
804 };
805 if (feConfig.hasEndFrequency()) {
806 isdbtSettings.endFrequency = (int64_t)feConfig.getEndFrequency();
807 }
808 if (!feConfig.hasIsdbtFrontendSettings_optional()) {
809 ALOGW("[ConfigReader] no more isdbt settings");
810 return isdbtSettings;
811 }
812 auto isdbt = feConfig.getFirstIsdbtFrontendSettings_optional();
813 isdbtSettings.inversion = static_cast<FrontendSpectralInversion>(isdbt->getInversion());
814 isdbtSettings.bandwidth = static_cast<FrontendIsdbtBandwidth>(isdbt->getBandwidth());
815 isdbtSettings.mode = static_cast<FrontendIsdbtMode>(isdbt->getMode());
816 isdbtSettings.guardInterval =
817 static_cast<FrontendIsdbtGuardInterval>(isdbt->getGuardInterval());
818 isdbtSettings.serviceAreaId = (int32_t)isdbt->getServiceAreaId();
819 isdbtSettings.partialReceptionFlag =
820 static_cast<FrontendIsdbtPartialReceptionFlag>(isdbt->getPartialReceptionFlag());
821 if (!isdbt->hasFrontendIsdbtLayerSettings()) {
822 ALOGW("[ConfigReader] no isdbt layer settings");
823 return isdbtSettings;
824 }
825 auto layerSettings = isdbt->getFirstFrontendIsdbtLayerSettings();
826 ::aidl::android::hardware::tv::tuner::FrontendIsdbtLayerSettings mLayerSettings;
827 mLayerSettings.modulation =
828 static_cast<FrontendIsdbtModulation>(layerSettings->getModulation());
829 mLayerSettings.coderate = static_cast<FrontendIsdbtCoderate>(layerSettings->getCoderate());
830 mLayerSettings.timeInterleave =
831 static_cast<FrontendIsdbtTimeInterleaveMode>(layerSettings->getTimeInterleave());
832 mLayerSettings.numOfSegment = (int32_t)layerSettings->getNumOfSegment();
833 isdbtSettings.layerSettings.push_back(mLayerSettings);
834 return isdbtSettings;
835 }
836
Hongguang600a6ae2021-07-08 18:51:51 -0700837 static bool readFilterTypeAndSettings(Filter filterConfig, DemuxFilterType& type,
838 DemuxFilterSettings& settings) {
839 auto mainType = filterConfig.getMainType();
840 auto subType = filterConfig.getSubType();
841
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000842 if (subType == FilterSubTypeEnum::AUDIO) {
843 audioFilterIds.push_back(filterConfig.getId());
844 } else if (subType == FilterSubTypeEnum::VIDEO) {
845 videoFilterIds.push_back(filterConfig.getId());
846 } else if (subType == FilterSubTypeEnum::RECORD) {
847 recordFilterIds.push_back(filterConfig.getId());
Frankie Lizcanoa53f5542022-07-07 17:32:06 +0000848 } else if (subType == FilterSubTypeEnum::SECTION) {
849 sectionFilterIds.push_back(filterConfig.getId());
Frankie Lizcano5b29f502022-07-06 22:09:42 +0000850 }
851
Hongguang600a6ae2021-07-08 18:51:51 -0700852 switch (mainType) {
853 case FilterMainTypeEnum::TS: {
854 ALOGW("[ConfigReader] filter main type is ts");
855 type.mainType = DemuxFilterMainType::TS;
856 DemuxTsFilterSettings ts;
857 bool isTsSet = false;
858 switch (subType) {
859 case FilterSubTypeEnum::UNDEFINED:
Hongguangce1e30d2021-08-02 21:55:44 -0700860 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700861 DemuxTsFilterType::UNDEFINED);
862 break;
863 case FilterSubTypeEnum::SECTION:
Hongguangce1e30d2021-08-02 21:55:44 -0700864 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700865 DemuxTsFilterType::SECTION);
866 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::section>(
867 readSectionFilterSettings(filterConfig));
868 isTsSet = true;
869 break;
870 case FilterSubTypeEnum::PES:
871 // TODO: b/182519645 support all the filter settings
Hongguangce1e30d2021-08-02 21:55:44 -0700872 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700873 DemuxTsFilterType::PES);
874 break;
875 case FilterSubTypeEnum::TS:
Hongguangce1e30d2021-08-02 21:55:44 -0700876 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700877 DemuxTsFilterType::TS);
878 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::noinit>(
879 true);
880 isTsSet = true;
881 break;
882 case FilterSubTypeEnum::PCR:
Hongguangce1e30d2021-08-02 21:55:44 -0700883 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700884 DemuxTsFilterType::PCR);
885 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::noinit>(
886 true);
887 isTsSet = true;
888 break;
889 case FilterSubTypeEnum::TEMI:
Hongguangce1e30d2021-08-02 21:55:44 -0700890 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700891 DemuxTsFilterType::TEMI);
892 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::noinit>(
893 true);
894 isTsSet = true;
895 break;
896 case FilterSubTypeEnum::AUDIO:
Hongguangce1e30d2021-08-02 21:55:44 -0700897 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700898 DemuxTsFilterType::AUDIO);
899 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::av>(
900 readAvFilterSettings(filterConfig));
901 isTsSet = true;
902 break;
903 case FilterSubTypeEnum::VIDEO:
Hongguangce1e30d2021-08-02 21:55:44 -0700904 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700905 DemuxTsFilterType::VIDEO);
906 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::av>(
907 readAvFilterSettings(filterConfig));
908 isTsSet = true;
909 break;
910 case FilterSubTypeEnum::RECORD:
Hongguangce1e30d2021-08-02 21:55:44 -0700911 type.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700912 DemuxTsFilterType::RECORD);
913 ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::record>(
914 readRecordFilterSettings(filterConfig));
915 isTsSet = true;
916 break;
917 default:
918 ALOGW("[ConfigReader] ts subtype is not supported");
919 return false;
920 }
921 if (filterConfig.hasPid()) {
922 ts.tpid = static_cast<int32_t>(filterConfig.getPid());
923 isTsSet = true;
924 }
925 if (isTsSet) {
926 settings.set<DemuxFilterSettings::Tag::ts>(ts);
927 }
928 break;
929 }
930 case FilterMainTypeEnum::MMTP: {
931 ALOGW("[ConfigReader] filter main type is mmtp");
932 type.mainType = DemuxFilterMainType::MMTP;
933 DemuxMmtpFilterSettings mmtp;
934 bool isMmtpSet = false;
935 switch (subType) {
936 case FilterSubTypeEnum::UNDEFINED:
Hongguangce1e30d2021-08-02 21:55:44 -0700937 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700938 DemuxMmtpFilterType::UNDEFINED);
939 break;
940 case FilterSubTypeEnum::SECTION:
Hongguangce1e30d2021-08-02 21:55:44 -0700941 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700942 DemuxMmtpFilterType::SECTION);
943 mmtp.filterSettings
944 .set<DemuxMmtpFilterSettingsFilterSettings::Tag::section>(
945 readSectionFilterSettings(filterConfig));
946 isMmtpSet = true;
947 break;
948 case FilterSubTypeEnum::PES:
Hongguangce1e30d2021-08-02 21:55:44 -0700949 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700950 DemuxMmtpFilterType::PES);
951 // TODO: b/182519645 support all the filter settings
952 break;
953 case FilterSubTypeEnum::MMTP:
Hongguangce1e30d2021-08-02 21:55:44 -0700954 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700955 DemuxMmtpFilterType::MMTP);
956 mmtp.filterSettings.set<DemuxMmtpFilterSettingsFilterSettings::Tag::noinit>(
957 true);
958 isMmtpSet = true;
959 break;
960 case FilterSubTypeEnum::AUDIO:
Hongguangce1e30d2021-08-02 21:55:44 -0700961 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700962 DemuxMmtpFilterType::AUDIO);
963 mmtp.filterSettings.set<DemuxMmtpFilterSettingsFilterSettings::Tag::av>(
964 readAvFilterSettings(filterConfig));
965 isMmtpSet = true;
966 break;
967 case FilterSubTypeEnum::VIDEO:
Hongguangce1e30d2021-08-02 21:55:44 -0700968 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700969 DemuxMmtpFilterType::VIDEO);
970 mmtp.filterSettings.set<DemuxMmtpFilterSettingsFilterSettings::Tag::av>(
971 readAvFilterSettings(filterConfig));
972 isMmtpSet = true;
973 break;
974 case FilterSubTypeEnum::RECORD:
Hongguangce1e30d2021-08-02 21:55:44 -0700975 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700976 DemuxMmtpFilterType::RECORD);
977 mmtp.filterSettings.set<DemuxMmtpFilterSettingsFilterSettings::Tag::record>(
978 readRecordFilterSettings(filterConfig));
979 isMmtpSet = true;
980 break;
981 case FilterSubTypeEnum::DOWNLOAD:
Hongguangce1e30d2021-08-02 21:55:44 -0700982 type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -0700983 DemuxMmtpFilterType::DOWNLOAD);
984 // TODO: b/182519645 support all the filter settings
985 break;
986 default:
987 ALOGW("[ConfigReader] mmtp subtype is not supported");
988 return false;
989 }
990 if (filterConfig.hasPid()) {
991 mmtp.mmtpPid = static_cast<int32_t>(filterConfig.getPid());
992 isMmtpSet = true;
993 }
994 if (isMmtpSet) {
995 settings.set<DemuxFilterSettings::Tag::mmtp>(mmtp);
996 }
997 break;
998 }
999 case FilterMainTypeEnum::IP: {
1000 ALOGW("[ConfigReader] filter main type is ip");
1001 type.mainType = DemuxFilterMainType::IP;
1002 DemuxIpFilterSettings ip;
1003 switch (subType) {
1004 case FilterSubTypeEnum::UNDEFINED:
Hongguangce1e30d2021-08-02 21:55:44 -07001005 type.subType.set<DemuxFilterSubType::Tag::ipFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -07001006 DemuxIpFilterType::UNDEFINED);
1007 break;
1008 case FilterSubTypeEnum::SECTION:
Hongguangce1e30d2021-08-02 21:55:44 -07001009 type.subType.set<DemuxFilterSubType::Tag::ipFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -07001010 DemuxIpFilterType::SECTION);
1011 ip.filterSettings.set<DemuxIpFilterSettingsFilterSettings::Tag::section>(
1012 readSectionFilterSettings(filterConfig));
1013 settings.set<DemuxFilterSettings::Tag::ip>(ip);
1014 break;
1015 case FilterSubTypeEnum::NTP:
Hongguangce1e30d2021-08-02 21:55:44 -07001016 type.subType.set<DemuxFilterSubType::Tag::ipFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -07001017 DemuxIpFilterType::NTP);
1018 ip.filterSettings.set<DemuxIpFilterSettingsFilterSettings::Tag::noinit>(
1019 true);
1020 settings.set<DemuxFilterSettings::Tag::ip>(ip);
1021 break;
1022 case FilterSubTypeEnum::IP: {
Gareth Fenn9a808452022-03-31 08:40:00 +01001023 type.subType.set<DemuxFilterSubType::Tag::ipFilterType>(
1024 DemuxIpFilterType::IP);
Hongguang600a6ae2021-07-08 18:51:51 -07001025 ip.ipAddr = readIpAddress(filterConfig),
1026 ip.filterSettings
1027 .set<DemuxIpFilterSettingsFilterSettings::Tag::bPassthrough>(
1028 readPassthroughSettings(filterConfig));
1029 settings.set<DemuxFilterSettings::Tag::ip>(ip);
1030 break;
1031 }
1032 case FilterSubTypeEnum::IP_PAYLOAD:
Hongguangce1e30d2021-08-02 21:55:44 -07001033 type.subType.set<DemuxFilterSubType::Tag::ipFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -07001034 DemuxIpFilterType::IP_PAYLOAD);
1035 ip.filterSettings.set<DemuxIpFilterSettingsFilterSettings::Tag::noinit>(
1036 true);
1037 settings.set<DemuxFilterSettings::Tag::ip>(ip);
1038 break;
1039 case FilterSubTypeEnum::PAYLOAD_THROUGH:
Hongguangce1e30d2021-08-02 21:55:44 -07001040 type.subType.set<DemuxFilterSubType::Tag::ipFilterType>(
Hongguang600a6ae2021-07-08 18:51:51 -07001041 DemuxIpFilterType::PAYLOAD_THROUGH);
1042 ip.filterSettings.set<DemuxIpFilterSettingsFilterSettings::Tag::noinit>(
1043 true);
1044 settings.set<DemuxFilterSettings::Tag::ip>(ip);
1045 break;
1046 default:
1047 ALOGW("[ConfigReader] mmtp subtype is not supported");
1048 return false;
1049 }
1050 break;
1051 }
1052 default:
1053 // TODO: b/182519645 support all the filter configs
1054 ALOGW("[ConfigReader] filter main type is not supported in dynamic config");
1055 return false;
1056 }
1057 return true;
1058 }
1059
1060 static DemuxIpAddress readIpAddress(Filter filterConfig) {
1061 DemuxIpAddress ipAddress;
1062 vector<uint8_t> data;
1063 if (!filterConfig.hasIpFilterConfig_optional()) {
1064 return ipAddress;
1065 }
1066 auto ipFilterConfig = filterConfig.getFirstIpFilterConfig_optional();
1067 if (ipFilterConfig->hasSrcPort()) {
1068 ipAddress.srcPort = ipFilterConfig->getSrcPort();
1069 }
1070 if (ipFilterConfig->hasDestPort()) {
1071 ipAddress.dstPort = ipFilterConfig->getDestPort();
1072 }
1073 if (ipFilterConfig->getFirstSrcIpAddress()->getIsIpV4()) {
1074 data.resize(4);
1075 memcpy(data.data(), ipFilterConfig->getFirstSrcIpAddress()->getIp().data(), 4);
1076 ipAddress.srcIpAddress.set<DemuxIpAddressIpAddress::Tag::v4>(data);
1077 } else {
1078 data.resize(6);
1079 memcpy(data.data(), ipFilterConfig->getFirstSrcIpAddress()->getIp().data(), 6);
1080 ipAddress.srcIpAddress.set<DemuxIpAddressIpAddress::Tag::v6>(data);
1081 }
1082 if (ipFilterConfig->getFirstDestIpAddress()->getIsIpV4()) {
1083 data.resize(4);
1084 memcpy(data.data(), ipFilterConfig->getFirstDestIpAddress()->getIp().data(), 4);
1085 ipAddress.dstIpAddress.set<DemuxIpAddressIpAddress::Tag::v4>(data);
1086 } else {
1087 data.resize(6);
1088 memcpy(data.data(), ipFilterConfig->getFirstDestIpAddress()->getIp().data(), 6);
1089 ipAddress.dstIpAddress.set<DemuxIpAddressIpAddress::Tag::v6>(data);
1090 }
1091 return ipAddress;
1092 }
1093
1094 static bool readPassthroughSettings(Filter filterConfig) {
1095 if (!filterConfig.hasIpFilterConfig_optional()) {
1096 return false;
1097 }
1098 auto ipFilterConfig = filterConfig.getFirstIpFilterConfig_optional();
1099 if (ipFilterConfig->hasDataPassthrough()) {
1100 return ipFilterConfig->getDataPassthrough();
1101 }
1102 return false;
1103 }
1104
1105 static DemuxFilterSectionSettings readSectionFilterSettings(Filter filterConfig) {
1106 DemuxFilterSectionSettings settings;
1107 if (!filterConfig.hasSectionFilterSettings_optional()) {
1108 return settings;
1109 }
1110 auto section = filterConfig.getFirstSectionFilterSettings_optional();
1111 settings.isCheckCrc = section->getIsCheckCrc();
1112 settings.isRepeat = section->getIsRepeat();
1113 settings.isRaw = section->getIsRaw();
Hongguang494ba662022-01-05 22:08:10 -08001114 settings.bitWidthOfLengthField = section->getBitWidthOfLengthField();
Hongguang600a6ae2021-07-08 18:51:51 -07001115 return settings;
1116 }
1117
1118 static DemuxFilterAvSettings readAvFilterSettings(Filter filterConfig) {
1119 DemuxFilterAvSettings settings;
1120 if (!filterConfig.hasAvFilterSettings_optional()) {
1121 return settings;
1122 }
1123 auto av = filterConfig.getFirstAvFilterSettings_optional();
1124 settings.isPassthrough = av->getIsPassthrough();
Hongguang16dacc12021-11-01 15:51:52 -07001125 settings.isSecureMemory = av->getIsSecureMemory();
Hongguang600a6ae2021-07-08 18:51:51 -07001126 return settings;
1127 }
1128
1129 static DemuxFilterRecordSettings readRecordFilterSettings(Filter filterConfig) {
1130 DemuxFilterRecordSettings settings;
1131 if (!filterConfig.hasRecordFilterSettings_optional()) {
1132 return settings;
1133 }
1134 auto record = filterConfig.getFirstRecordFilterSettings_optional();
1135 settings.tsIndexMask = record->getTsIndexMask();
1136 settings.scIndexType = static_cast<DemuxRecordScIndexType>(record->getScIndexType());
1137 return settings;
1138 }
1139
1140 static PlaybackSettings readPlaybackSettings(Dvr dvrConfig) {
1141 ALOGW("[ConfigReader] dvr type is playback");
1142 PlaybackSettings playbackSettings{
Hongguang11da2cb2021-08-05 19:05:12 -07001143 .statusMask = static_cast<int8_t>(dvrConfig.getStatusMask()),
1144 .lowThreshold = static_cast<int64_t>(dvrConfig.getLowThreshold()),
1145 .highThreshold = static_cast<int64_t>(dvrConfig.getHighThreshold()),
Hongguang600a6ae2021-07-08 18:51:51 -07001146 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
Hongguang11da2cb2021-08-05 19:05:12 -07001147 .packetSize = static_cast<int64_t>(dvrConfig.getPacketSize()),
Hongguang600a6ae2021-07-08 18:51:51 -07001148 };
1149 return playbackSettings;
1150 }
1151
1152 static RecordSettings readRecordSettings(Dvr dvrConfig) {
1153 ALOGW("[ConfigReader] dvr type is record");
1154 RecordSettings recordSettings{
Hongguang11da2cb2021-08-05 19:05:12 -07001155 .statusMask = static_cast<int8_t>(dvrConfig.getStatusMask()),
1156 .lowThreshold = static_cast<int64_t>(dvrConfig.getLowThreshold()),
1157 .highThreshold = static_cast<int64_t>(dvrConfig.getHighThreshold()),
Hongguang600a6ae2021-07-08 18:51:51 -07001158 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
Hongguang11da2cb2021-08-05 19:05:12 -07001159 .packetSize = static_cast<int64_t>(dvrConfig.getPacketSize()),
Hongguang600a6ae2021-07-08 18:51:51 -07001160 };
1161 return recordSettings;
1162 }
1163
Hongguange106f472022-01-11 12:09:22 -08001164 static void getCiCamInfo(Frontend feConfig, bool& canConnectToCiCam, int32_t& ciCamId,
1165 int32_t& removePid) {
Hongguang600a6ae2021-07-08 18:51:51 -07001166 if (!feConfig.hasConnectToCicamId()) {
1167 canConnectToCiCam = false;
1168 ciCamId = -1;
Hongguange106f472022-01-11 12:09:22 -08001169 removePid = -1;
Gareth Fenn53ae3832021-10-15 17:19:00 +01001170 return;
Hongguang600a6ae2021-07-08 18:51:51 -07001171 }
1172 canConnectToCiCam = true;
1173 ciCamId = static_cast<int32_t>(feConfig.getConnectToCicamId());
Hongguange106f472022-01-11 12:09:22 -08001174 removePid = static_cast<int32_t>(feConfig.getRemoveOutputPid());
Hongguang600a6ae2021-07-08 18:51:51 -07001175 }
1176};