blob: cff4af11d8817021285de0174e99530fdc776814 [file] [log] [blame]
Amy Zhange6915052021-03-30 13:44:43 -07001/*
2 * Copyright 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <android-base/logging.h>
18#include <android/hardware/tv/tuner/1.0/types.h>
19#include <android_media_tuner_testing_configuration_V1_0.h>
20#include <android_media_tuner_testing_configuration_V1_0_enums.h>
21#include <binder/MemoryDealer.h>
22#include <hidl/HidlSupport.h>
23#include <hidl/HidlTransportSupport.h>
24#include <hidl/Status.h>
25#include <hidlmemory/FrameworkUtils.h>
26
27using namespace std;
28using namespace android::media::tuner::testing::configuration::V1_0;
29
30using android::hardware::tv::tuner::V1_0::DataFormat;
31using android::hardware::tv::tuner::V1_0::DemuxAlpFilterType;
Amy Zhang2ea2fe22021-04-01 11:55:41 -070032using android::hardware::tv::tuner::V1_0::DemuxFilterAvSettings;
Amy Zhange6915052021-03-30 13:44:43 -070033using android::hardware::tv::tuner::V1_0::DemuxFilterEvent;
34using android::hardware::tv::tuner::V1_0::DemuxFilterMainType;
Amy Zhang2ea2fe22021-04-01 11:55:41 -070035using android::hardware::tv::tuner::V1_0::DemuxFilterRecordSettings;
36using android::hardware::tv::tuner::V1_0::DemuxFilterSectionSettings;
Amy Zhange6915052021-03-30 13:44:43 -070037using android::hardware::tv::tuner::V1_0::DemuxFilterSettings;
38using android::hardware::tv::tuner::V1_0::DemuxFilterType;
Amy Zhang06fa69e2021-04-09 09:56:25 -070039using android::hardware::tv::tuner::V1_0::DemuxIpAddress;
40using android::hardware::tv::tuner::V1_0::DemuxIpFilterSettings;
Amy Zhange6915052021-03-30 13:44:43 -070041using android::hardware::tv::tuner::V1_0::DemuxIpFilterType;
42using android::hardware::tv::tuner::V1_0::DemuxMmtpFilterType;
43using android::hardware::tv::tuner::V1_0::DemuxRecordScIndexType;
44using android::hardware::tv::tuner::V1_0::DemuxTlvFilterType;
45using android::hardware::tv::tuner::V1_0::DemuxTpid;
46using android::hardware::tv::tuner::V1_0::DemuxTsFilterType;
47using android::hardware::tv::tuner::V1_0::DvrSettings;
48using android::hardware::tv::tuner::V1_0::DvrType;
49using android::hardware::tv::tuner::V1_0::FrontendDvbsSettings;
50using android::hardware::tv::tuner::V1_0::FrontendDvbtBandwidth;
51using android::hardware::tv::tuner::V1_0::FrontendDvbtCoderate;
52using android::hardware::tv::tuner::V1_0::FrontendDvbtConstellation;
53using android::hardware::tv::tuner::V1_0::FrontendDvbtGuardInterval;
54using android::hardware::tv::tuner::V1_0::FrontendDvbtHierarchy;
55using android::hardware::tv::tuner::V1_0::FrontendDvbtSettings;
56using android::hardware::tv::tuner::V1_0::FrontendDvbtStandard;
57using android::hardware::tv::tuner::V1_0::FrontendDvbtTransmissionMode;
58using android::hardware::tv::tuner::V1_0::FrontendSettings;
59using android::hardware::tv::tuner::V1_0::FrontendStatus;
60using android::hardware::tv::tuner::V1_0::FrontendStatusType;
61using android::hardware::tv::tuner::V1_0::FrontendType;
62using android::hardware::tv::tuner::V1_0::LnbPosition;
63using android::hardware::tv::tuner::V1_0::LnbTone;
64using android::hardware::tv::tuner::V1_0::LnbVoltage;
65using android::hardware::tv::tuner::V1_0::PlaybackSettings;
66using android::hardware::tv::tuner::V1_0::RecordSettings;
67
Amy Zhang2ea2fe22021-04-01 11:55:41 -070068const string emptyHardwareId = "";
Amy Zhange6915052021-03-30 13:44:43 -070069
Amy Zhang06fa69e2021-04-09 09:56:25 -070070static string mConfigFilePath;
71
Amy Zhang32b6f9e2021-04-02 15:01:17 -070072#define PROVISION_STR \
73 "{ " \
74 " \"id\": 21140844, " \
75 " \"name\": \"Test Title\", " \
76 " \"lowercase_organization_name\": \"Android\", " \
77 " \"asset_key\": { " \
78 " \"encryption_key\": \"nezAr3CHFrmBR9R8Tedotw==\" " \
79 " }, " \
80 " \"cas_type\": 1, " \
81 " \"track_types\": [ ] " \
82 "} "
83
Amy Zhange6915052021-03-30 13:44:43 -070084struct FrontendConfig {
85 bool isSoftwareFe;
86 FrontendType type;
87 FrontendSettings settings;
88 vector<FrontendStatusType> tuneStatusTypes;
89 vector<FrontendStatus> expectTuneStatuses;
90};
91
Amy Zhang2ea2fe22021-04-01 11:55:41 -070092struct FilterConfig {
93 uint32_t bufferSize;
94 DemuxFilterType type;
95 DemuxFilterSettings settings;
96 bool getMqDesc;
97
98 bool operator<(const FilterConfig& /*c*/) const { return false; }
99};
100
Amy Zhange50f08d2021-03-30 15:56:02 -0700101struct DvrConfig {
102 DvrType type;
103 uint32_t bufferSize;
104 DvrSettings settings;
105 string playbackInputFile;
106};
107
Amy Zhangc0e9a112021-04-01 19:25:21 -0700108struct LnbConfig {
109 string name;
110 LnbVoltage voltage;
111 LnbTone tone;
112 LnbPosition position;
113};
114
115struct TimeFilterConfig {
116 uint64_t timeStamp;
117};
118
Amy Zhang32b6f9e2021-04-02 15:01:17 -0700119struct DescramblerConfig {
120 uint32_t casSystemId;
121 string provisionStr;
122 vector<uint8_t> hidlPvtData;
123};
124
Amy Zhange6915052021-03-30 13:44:43 -0700125struct LiveBroadcastHardwareConnections {
126 string frontendId;
Amy Zhange50f08d2021-03-30 15:56:02 -0700127 string dvrSoftwareFeId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700128 string audioFilterId;
Amy Zhange6915052021-03-30 13:44:43 -0700129 string videoFilterId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700130 string sectionFilterId;
Amy Zhang06fa69e2021-04-09 09:56:25 -0700131 string ipFilterId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700132 string pcrFilterId;
133 /* list string of extra filters; */
Amy Zhange6915052021-03-30 13:44:43 -0700134};
135
136struct ScanHardwareConnections {
137 string frontendId;
138};
139
Amy Zhange50f08d2021-03-30 15:56:02 -0700140struct DvrPlaybackHardwareConnections {
141 bool support;
142 string frontendId;
143 string dvrId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700144 string audioFilterId;
Amy Zhange50f08d2021-03-30 15:56:02 -0700145 string videoFilterId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700146 string sectionFilterId;
147 /* list string of extra filters; */
Amy Zhange50f08d2021-03-30 15:56:02 -0700148};
149
Amy Zhange6915052021-03-30 13:44:43 -0700150struct DvrRecordHardwareConnections {
151 bool support;
152 string frontendId;
Amy Zhange50f08d2021-03-30 15:56:02 -0700153 string dvrRecordId;
154 string dvrSoftwareFeId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700155 string recordFilterId;
Amy Zhange6915052021-03-30 13:44:43 -0700156};
157
158struct DescramblingHardwareConnections {
159 bool support;
160 string frontendId;
Amy Zhange50f08d2021-03-30 15:56:02 -0700161 string dvrSoftwareFeId;
Amy Zhange6915052021-03-30 13:44:43 -0700162 string audioFilterId;
163 string videoFilterId;
Amy Zhang32b6f9e2021-04-02 15:01:17 -0700164 string descramblerId;
165 /* list string of extra filters; */
Amy Zhange6915052021-03-30 13:44:43 -0700166};
167
168struct LnbLiveHardwareConnections {
169 bool support;
170 string frontendId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700171 string audioFilterId;
Amy Zhange6915052021-03-30 13:44:43 -0700172 string videoFilterId;
Amy Zhangc0e9a112021-04-01 19:25:21 -0700173 string lnbId;
174 vector<string> diseqcMsgs;
175 /* list string of extra filters; */
Amy Zhange6915052021-03-30 13:44:43 -0700176};
177
178struct LnbRecordHardwareConnections {
179 bool support;
180 string frontendId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700181 string dvrRecordId;
182 string recordFilterId;
Amy Zhangc0e9a112021-04-01 19:25:21 -0700183 string lnbId;
184 vector<string> diseqcMsgs;
185 /* list string of extra filters; */
186};
187
188struct TimeFilterHardwareConnections {
189 bool support;
190 string timeFilterId;
Amy Zhange6915052021-03-30 13:44:43 -0700191};
192
Amy Zhang06fa69e2021-04-09 09:56:25 -0700193struct TunerTestingConfigReader1_0 {
Amy Zhange6915052021-03-30 13:44:43 -0700194 public:
Amy Zhang06fa69e2021-04-09 09:56:25 -0700195 static void setConfigFilePath(string path) { mConfigFilePath = path; }
196
Amy Zhange6915052021-03-30 13:44:43 -0700197 static bool checkConfigFileExists() {
Amy Zhang06fa69e2021-04-09 09:56:25 -0700198 auto res = read(mConfigFilePath.c_str());
Amy Zhange6915052021-03-30 13:44:43 -0700199 if (res == nullopt) {
Amy Zhang06fa69e2021-04-09 09:56:25 -0700200 ALOGW("[ConfigReader] Couldn't read %s."
Amy Zhange6915052021-03-30 13:44:43 -0700201 "Please check tuner_testing_dynamic_configuration.xsd"
Amy Zhang06fa69e2021-04-09 09:56:25 -0700202 "and sample_tuner_vts_config.xml for more details on how to config Tune VTS.",
203 mConfigFilePath.c_str());
Amy Zhange6915052021-03-30 13:44:43 -0700204 }
205 return (res != nullopt);
206 }
207
208 static void readFrontendConfig1_0(map<string, FrontendConfig>& frontendMap) {
209 auto hardwareConfig = getHardwareConfig();
210 if (hardwareConfig.hasFrontends()) {
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700211 // TODO: b/182519645 complete the tune status config
Amy Zhange6915052021-03-30 13:44:43 -0700212 vector<FrontendStatusType> types;
213 types.push_back(FrontendStatusType::DEMOD_LOCK);
214 FrontendStatus status;
215 status.isDemodLocked(true);
216 vector<FrontendStatus> statuses;
217 statuses.push_back(status);
218
219 auto frontends = *hardwareConfig.getFirstFrontends();
220 for (auto feConfig : frontends.getFrontend()) {
221 string id = feConfig.getId();
222 if (id.compare(string("FE_DEFAULT")) == 0) {
223 // overrid default
224 frontendMap.erase(string("FE_DEFAULT"));
225 }
226 FrontendType type;
227 switch (feConfig.getType()) {
228 case FrontendTypeEnum::UNDEFINED:
229 type = FrontendType::UNDEFINED;
230 break;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700231 // TODO: b/182519645 finish all other frontend settings
Amy Zhange6915052021-03-30 13:44:43 -0700232 case FrontendTypeEnum::ANALOG:
233 type = FrontendType::ANALOG;
234 break;
235 case FrontendTypeEnum::ATSC:
236 type = FrontendType::ATSC;
237 break;
238 case FrontendTypeEnum::ATSC3:
239 type = FrontendType::ATSC3;
240 break;
241 case FrontendTypeEnum::DVBC:
242 type = FrontendType::DVBC;
243 break;
244 case FrontendTypeEnum::DVBS:
245 type = FrontendType::DVBS;
246 frontendMap[id].settings.dvbs(readDvbsFrontendSettings(feConfig));
247 break;
248 case FrontendTypeEnum::DVBT: {
249 type = FrontendType::DVBT;
250 frontendMap[id].settings.dvbt(readDvbtFrontendSettings(feConfig));
251 break;
252 }
253 case FrontendTypeEnum::ISDBS:
254 type = FrontendType::ISDBS;
255 break;
256 case FrontendTypeEnum::ISDBS3:
257 type = FrontendType::ISDBS3;
258 break;
259 case FrontendTypeEnum::ISDBT:
260 type = FrontendType::ISDBT;
261 break;
262 case FrontendTypeEnum::DTMB:
263 // dtmb will be handled in readFrontendConfig1_1;
264 continue;
265 case FrontendTypeEnum::UNKNOWN:
266 ALOGW("[ConfigReader] invalid frontend type");
267 return;
268 }
269 frontendMap[id].type = type;
270 frontendMap[id].isSoftwareFe = feConfig.getIsSoftwareFrontend();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700271 // TODO: b/182519645 complete the tune status config
Amy Zhange6915052021-03-30 13:44:43 -0700272 frontendMap[id].tuneStatusTypes = types;
273 frontendMap[id].expectTuneStatuses = statuses;
274 }
275 }
276 }
277
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700278 static void readFilterConfig1_0(map<string, FilterConfig>& filterMap) {
279 auto hardwareConfig = getHardwareConfig();
280 if (hardwareConfig.hasFilters()) {
281 auto filters = *hardwareConfig.getFirstFilters();
282 for (auto filterConfig : filters.getFilter()) {
283 string id = filterConfig.getId();
284 if (id.compare(string("FILTER_AUDIO_DEFAULT")) == 0) {
285 // overrid default
286 filterMap.erase(string("FILTER_AUDIO_DEFAULT"));
287 }
288 if (id.compare(string("FILTER_VIDEO_DEFAULT")) == 0) {
289 // overrid default
290 filterMap.erase(string("FILTER_VIDEO_DEFAULT"));
291 }
292
293 DemuxFilterType type;
294 DemuxFilterSettings settings;
295 if (!readFilterTypeAndSettings(filterConfig, type, settings)) {
296 ALOGW("[ConfigReader] invalid filter type");
297 return;
298 }
299 filterMap[id].type = type;
300 filterMap[id].bufferSize = filterConfig.getBufferSize();
301 filterMap[id].getMqDesc = filterConfig.getUseFMQ();
302 filterMap[id].settings = settings;
303 }
304 }
305 }
306
Amy Zhange50f08d2021-03-30 15:56:02 -0700307 static void readDvrConfig1_0(map<string, DvrConfig>& dvrMap) {
308 auto hardwareConfig = getHardwareConfig();
309 if (hardwareConfig.hasDvrs()) {
310 auto dvrs = *hardwareConfig.getFirstDvrs();
311 for (auto dvrConfig : dvrs.getDvr()) {
312 string id = dvrConfig.getId();
313 DvrType type;
314 switch (dvrConfig.getType()) {
315 case DvrTypeEnum::PLAYBACK:
316 type = DvrType::PLAYBACK;
317 dvrMap[id].settings.playback(readPlaybackSettings(dvrConfig));
318 break;
319 case DvrTypeEnum::RECORD:
320 type = DvrType::RECORD;
321 dvrMap[id].settings.record(readRecordSettings(dvrConfig));
322 break;
323 case DvrTypeEnum::UNKNOWN:
324 ALOGW("[ConfigReader] invalid DVR type");
325 return;
326 }
327 dvrMap[id].type = type;
328 dvrMap[id].bufferSize = static_cast<uint32_t>(dvrConfig.getBufferSize());
329 if (dvrConfig.hasInputFilePath()) {
330 dvrMap[id].playbackInputFile = dvrConfig.getInputFilePath();
331 }
332 }
333 }
334 }
335
Amy Zhangc0e9a112021-04-01 19:25:21 -0700336 static void readLnbConfig1_0(map<string, LnbConfig>& lnbMap) {
337 auto hardwareConfig = getHardwareConfig();
338 if (hardwareConfig.hasLnbs()) {
339 auto lnbs = *hardwareConfig.getFirstLnbs();
340 for (auto lnbConfig : lnbs.getLnb()) {
341 string id = lnbConfig.getId();
342 if (lnbConfig.hasName()) {
343 lnbMap[id].name = lnbConfig.getName();
344 } else {
345 lnbMap[id].name = emptyHardwareId;
346 }
347 lnbMap[id].voltage = static_cast<LnbVoltage>(lnbConfig.getVoltage());
348 lnbMap[id].tone = static_cast<LnbTone>(lnbConfig.getTone());
349 lnbMap[id].position = static_cast<LnbPosition>(lnbConfig.getPosition());
350 }
351 }
352 }
353
Amy Zhang32b6f9e2021-04-02 15:01:17 -0700354 static void readDescramblerConfig1_0(map<string, DescramblerConfig>& descramblerMap) {
355 auto hardwareConfig = getHardwareConfig();
356 if (hardwareConfig.hasDescramblers()) {
357 auto descramblers = *hardwareConfig.getFirstDescramblers();
358 for (auto descramblerConfig : descramblers.getDescrambler()) {
359 string id = descramblerConfig.getId();
360 descramblerMap[id].casSystemId =
361 static_cast<uint32_t>(descramblerConfig.getCasSystemId());
362 if (descramblerConfig.hasProvisionStr()) {
363 descramblerMap[id].provisionStr = descramblerConfig.getProvisionStr();
364 } else {
365 descramblerMap[id].provisionStr = PROVISION_STR;
366 }
367 if (descramblerConfig.hasSesstionPrivatData()) {
368 auto privateData = descramblerConfig.getSesstionPrivatData();
369 int size = privateData.size();
370 descramblerMap[id].hidlPvtData.resize(size);
371 memcpy(descramblerMap[id].hidlPvtData.data(), privateData.data(), size);
372 } else {
373 descramblerMap[id].hidlPvtData.resize(256);
374 }
375 }
376 }
377 }
378
Amy Zhangc0e9a112021-04-01 19:25:21 -0700379 static void readDiseqcMessages(map<string, vector<uint8_t>>& diseqcMsgMap) {
380 auto hardwareConfig = getHardwareConfig();
381 if (hardwareConfig.hasDiseqcMessages()) {
382 auto msgs = *hardwareConfig.getFirstDiseqcMessages();
383 for (auto msgConfig : msgs.getDiseqcMessage()) {
384 string name = msgConfig.getMsgName();
385 for (uint8_t atom : msgConfig.getMsgBody()) {
386 diseqcMsgMap[name].push_back(atom);
387 }
388 }
389 }
390 }
391
392 static void readTimeFilterConfig1_0(map<string, TimeFilterConfig>& timeFilterMap) {
393 auto hardwareConfig = getHardwareConfig();
394 if (hardwareConfig.hasTimeFilters()) {
395 auto timeFilters = *hardwareConfig.getFirstTimeFilters();
396 for (auto timeFilterConfig : timeFilters.getTimeFilter()) {
397 string id = timeFilterConfig.getId();
398 timeFilterMap[id].timeStamp =
399 static_cast<uint64_t>(timeFilterConfig.getTimeStamp());
400 }
401 }
402 }
403
Amy Zhange6915052021-03-30 13:44:43 -0700404 static void connectLiveBroadcast(LiveBroadcastHardwareConnections& live) {
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700405 auto liveConfig = *getDataFlowConfiguration().getFirstClearLiveBroadcast();
406 live.frontendId = liveConfig.getFrontendConnection();
407
408 live.audioFilterId = liveConfig.getAudioFilterConnection();
409 live.videoFilterId = liveConfig.getVideoFilterConnection();
410 if (liveConfig.hasPcrFilterConnection()) {
411 live.pcrFilterId = liveConfig.getPcrFilterConnection();
412 } else {
413 live.pcrFilterId = emptyHardwareId;
414 }
415 if (liveConfig.hasSectionFilterConnection()) {
416 live.sectionFilterId = liveConfig.getSectionFilterConnection();
417 } else {
418 live.sectionFilterId = emptyHardwareId;
419 }
420 if (liveConfig.hasDvrSoftwareFeConnection()) {
421 live.dvrSoftwareFeId = liveConfig.getDvrSoftwareFeConnection();
Amy Zhange50f08d2021-03-30 15:56:02 -0700422 }
Amy Zhang06fa69e2021-04-09 09:56:25 -0700423 if (liveConfig.hasIpFilterConnection()) {
424 live.ipFilterId = liveConfig.getIpFilterConnection();
425 } else {
426 live.ipFilterId = emptyHardwareId;
427 }
Amy Zhange6915052021-03-30 13:44:43 -0700428 }
429
430 static void connectScan(ScanHardwareConnections& scan) {
431 auto scanConfig = getDataFlowConfiguration().getFirstScan();
432 scan.frontendId = scanConfig->getFrontendConnection();
433 }
434
Amy Zhange50f08d2021-03-30 15:56:02 -0700435 static void connectDvrPlayback(DvrPlaybackHardwareConnections& playback) {
436 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700437 if (dataFlow.hasDvrPlayback()) {
438 playback.support = true;
439 } else {
Amy Zhange50f08d2021-03-30 15:56:02 -0700440 return;
441 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700442 auto playbackConfig = *dataFlow.getFirstDvrPlayback();
443 playback.dvrId = playbackConfig.getDvrConnection();
444 playback.audioFilterId = playbackConfig.getAudioFilterConnection();
445 playback.videoFilterId = playbackConfig.getVideoFilterConnection();
446 if (playbackConfig.hasSectionFilterConnection()) {
447 playback.sectionFilterId = playbackConfig.getSectionFilterConnection();
448 } else {
449 playback.sectionFilterId = emptyHardwareId;
450 }
Amy Zhange50f08d2021-03-30 15:56:02 -0700451 }
452
Amy Zhange6915052021-03-30 13:44:43 -0700453 static void connectDvrRecord(DvrRecordHardwareConnections& record) {
454 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700455 if (dataFlow.hasDvrRecord()) {
456 record.support = true;
457 } else {
Amy Zhange6915052021-03-30 13:44:43 -0700458 return;
459 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700460 auto recordConfig = *dataFlow.getFirstDvrRecord();
461 record.frontendId = recordConfig.getFrontendConnection();
462 record.recordFilterId = recordConfig.getRecordFilterConnection();
463 record.dvrRecordId = recordConfig.getDvrRecordConnection();
464 if (recordConfig.hasDvrSoftwareFeConnection()) {
465 record.dvrSoftwareFeId = recordConfig.getDvrSoftwareFeConnection();
Amy Zhange50f08d2021-03-30 15:56:02 -0700466 }
Amy Zhange6915052021-03-30 13:44:43 -0700467 }
468
469 static void connectDescrambling(DescramblingHardwareConnections& descrambling) {
470 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700471 if (dataFlow.hasDescrambling()) {
472 descrambling.support = true;
473 } else {
Amy Zhange6915052021-03-30 13:44:43 -0700474 return;
475 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700476 auto descConfig = *dataFlow.getFirstDescrambling();
477 descrambling.frontendId = descConfig.getFrontendConnection();
Amy Zhang32b6f9e2021-04-02 15:01:17 -0700478 descrambling.descramblerId = descConfig.getDescramblerConnection();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700479 descrambling.audioFilterId = descConfig.getAudioFilterConnection();
480 descrambling.videoFilterId = descConfig.getVideoFilterConnection();
481 if (descConfig.hasDvrSoftwareFeConnection()) {
482 descrambling.dvrSoftwareFeId = descConfig.getDvrSoftwareFeConnection();
Amy Zhange50f08d2021-03-30 15:56:02 -0700483 }
Amy Zhange6915052021-03-30 13:44:43 -0700484 }
485
486 static void connectLnbLive(LnbLiveHardwareConnections& lnbLive) {
487 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700488 if (dataFlow.hasLnbLive()) {
489 lnbLive.support = true;
490 } else {
Amy Zhange6915052021-03-30 13:44:43 -0700491 return;
492 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700493 auto lnbLiveConfig = *dataFlow.getFirstLnbLive();
494 lnbLive.frontendId = lnbLiveConfig.getFrontendConnection();
495 lnbLive.audioFilterId = lnbLiveConfig.getAudioFilterConnection();
496 lnbLive.videoFilterId = lnbLiveConfig.getVideoFilterConnection();
Amy Zhangc0e9a112021-04-01 19:25:21 -0700497 lnbLive.lnbId = lnbLiveConfig.getLnbConnection();
498 if (lnbLiveConfig.hasDiseqcMsgSender()) {
499 for (auto msgName : lnbLiveConfig.getDiseqcMsgSender()) {
500 lnbLive.diseqcMsgs.push_back(msgName);
501 }
502 }
Amy Zhange6915052021-03-30 13:44:43 -0700503 }
504
505 static void connectLnbRecord(LnbRecordHardwareConnections& lnbRecord) {
506 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700507 if (dataFlow.hasLnbRecord()) {
508 lnbRecord.support = true;
509 } else {
Amy Zhange6915052021-03-30 13:44:43 -0700510 return;
511 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700512 auto lnbRecordConfig = *dataFlow.getFirstLnbRecord();
513 lnbRecord.frontendId = lnbRecordConfig.getFrontendConnection();
514 lnbRecord.recordFilterId = lnbRecordConfig.getRecordFilterConnection();
515 lnbRecord.dvrRecordId = lnbRecordConfig.getDvrRecordConnection();
Amy Zhangc0e9a112021-04-01 19:25:21 -0700516 lnbRecord.lnbId = lnbRecordConfig.getLnbConnection();
517 if (lnbRecordConfig.hasDiseqcMsgSender()) {
518 for (auto msgName : lnbRecordConfig.getDiseqcMsgSender()) {
519 lnbRecord.diseqcMsgs.push_back(msgName);
520 }
521 }
522 }
523
524 static void connectTimeFilter(TimeFilterHardwareConnections& timeFilter) {
525 auto dataFlow = getDataFlowConfiguration();
526 if (dataFlow.hasTimeFilter()) {
527 timeFilter.support = true;
528 } else {
529 return;
530 }
531 auto timeFilterConfig = *dataFlow.getFirstTimeFilter();
532 timeFilter.timeFilterId = timeFilterConfig.getTimeFilterConnection();
Amy Zhange6915052021-03-30 13:44:43 -0700533 }
534
Amy Zhang06fa69e2021-04-09 09:56:25 -0700535 static HardwareConfiguration getHardwareConfig() {
536 return *getTunerConfig().getFirstHardwareConfiguration();
537 }
538
Amy Zhange6915052021-03-30 13:44:43 -0700539 private:
540 static FrontendDvbtSettings readDvbtFrontendSettings(Frontend feConfig) {
Amy Zhange50f08d2021-03-30 15:56:02 -0700541 ALOGW("[ConfigReader] fe type is dvbt");
Amy Zhange6915052021-03-30 13:44:43 -0700542 FrontendDvbtSettings dvbtSettings{
543 .frequency = (uint32_t)feConfig.getFrequency(),
544 };
545 if (!feConfig.hasDvbtFrontendSettings_optional()) {
546 ALOGW("[ConfigReader] no more dvbt settings");
547 return dvbtSettings;
548 }
Amy Zhang06fa69e2021-04-09 09:56:25 -0700549 auto dvbt = feConfig.getFirstDvbtFrontendSettings_optional();
550 uint32_t trans = static_cast<uint32_t>(dvbt->getTransmissionMode());
551 if (trans <= (uint32_t)FrontendDvbtTransmissionMode::MODE_32K) {
552 dvbtSettings.transmissionMode = static_cast<FrontendDvbtTransmissionMode>(trans);
553 }
554 dvbtSettings.bandwidth = static_cast<FrontendDvbtBandwidth>(dvbt->getBandwidth());
555 dvbtSettings.isHighPriority = dvbt->getIsHighPriority();
556 if (dvbt->hasConstellation()) {
557 dvbtSettings.constellation =
558 static_cast<FrontendDvbtConstellation>(dvbt->getConstellation());
559 }
Amy Zhange6915052021-03-30 13:44:43 -0700560 return dvbtSettings;
561 }
562
563 static FrontendDvbsSettings readDvbsFrontendSettings(Frontend feConfig) {
Amy Zhange50f08d2021-03-30 15:56:02 -0700564 ALOGW("[ConfigReader] fe type is dvbs");
Amy Zhange6915052021-03-30 13:44:43 -0700565 FrontendDvbsSettings dvbsSettings{
566 .frequency = (uint32_t)feConfig.getFrequency(),
567 };
568 if (!feConfig.hasDvbsFrontendSettings_optional()) {
569 ALOGW("[ConfigReader] no more dvbs settings");
570 return dvbsSettings;
571 }
572 dvbsSettings.symbolRate = static_cast<uint32_t>(
573 feConfig.getFirstDvbsFrontendSettings_optional()->getSymbolRate());
574 dvbsSettings.inputStreamId = static_cast<uint32_t>(
575 feConfig.getFirstDvbsFrontendSettings_optional()->getInputStreamId());
576 return dvbsSettings;
577 }
578
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700579 static bool readFilterTypeAndSettings(Filter filterConfig, DemuxFilterType& type,
580 DemuxFilterSettings& settings) {
581 auto mainType = filterConfig.getMainType();
582 auto subType = filterConfig.getSubType();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700583 switch (mainType) {
584 case FilterMainTypeEnum::TS: {
585 ALOGW("[ConfigReader] filter main type is ts");
586 type.mainType = DemuxFilterMainType::TS;
587 switch (subType) {
588 case FilterSubTypeEnum::UNDEFINED:
Amy Zhang06fa69e2021-04-09 09:56:25 -0700589 type.subType.tsFilterType(DemuxTsFilterType::UNDEFINED);
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700590 break;
591 case FilterSubTypeEnum::SECTION:
592 type.subType.tsFilterType(DemuxTsFilterType::SECTION);
593 settings.ts().filterSettings.section(
594 readSectionFilterSettings(filterConfig));
595 break;
596 case FilterSubTypeEnum::PES:
597 // TODO: b/182519645 support all the filter settings
598 /*settings.ts().filterSettings.pesData(
599 getPesFilterSettings(filterConfig));*/
600 type.subType.tsFilterType(DemuxTsFilterType::PES);
601 break;
602 case FilterSubTypeEnum::TS:
603 type.subType.tsFilterType(DemuxTsFilterType::TS);
604 settings.ts().filterSettings.noinit();
605 break;
606 case FilterSubTypeEnum::PCR:
607 type.subType.tsFilterType(DemuxTsFilterType::PCR);
608 settings.ts().filterSettings.noinit();
609 break;
610 case FilterSubTypeEnum::TEMI:
611 type.subType.tsFilterType(DemuxTsFilterType::TEMI);
612 settings.ts().filterSettings.noinit();
613 break;
614 case FilterSubTypeEnum::AUDIO:
615 type.subType.tsFilterType(DemuxTsFilterType::AUDIO);
616 settings.ts().filterSettings.av(readAvFilterSettings(filterConfig));
617 break;
618 case FilterSubTypeEnum::VIDEO:
619 type.subType.tsFilterType(DemuxTsFilterType::VIDEO);
620 settings.ts().filterSettings.av(readAvFilterSettings(filterConfig));
621 break;
622 case FilterSubTypeEnum::RECORD:
623 type.subType.tsFilterType(DemuxTsFilterType::RECORD);
624 settings.ts().filterSettings.record(readRecordFilterSettings(filterConfig));
625 break;
626 default:
627 ALOGW("[ConfigReader] ts subtype is not supported");
628 return false;
629 }
Amy Zhang06fa69e2021-04-09 09:56:25 -0700630 if (filterConfig.hasPid()) {
631 settings.ts().tpid = static_cast<uint32_t>(filterConfig.getPid());
632 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700633 break;
634 }
635 case FilterMainTypeEnum::MMTP: {
636 ALOGW("[ConfigReader] filter main type is mmtp");
637 type.mainType = DemuxFilterMainType::MMTP;
638 switch (subType) {
639 case FilterSubTypeEnum::UNDEFINED:
Amy Zhang06fa69e2021-04-09 09:56:25 -0700640 type.subType.mmtpFilterType(DemuxMmtpFilterType::UNDEFINED);
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700641 break;
642 case FilterSubTypeEnum::SECTION:
643 type.subType.mmtpFilterType(DemuxMmtpFilterType::SECTION);
644 settings.mmtp().filterSettings.section(
645 readSectionFilterSettings(filterConfig));
646 break;
647 case FilterSubTypeEnum::PES:
648 type.subType.mmtpFilterType(DemuxMmtpFilterType::PES);
649 // TODO: b/182519645 support all the filter settings
650 /*settings.mmtp().filterSettings.pesData(
651 getPesFilterSettings(filterConfig));*/
652 break;
653 case FilterSubTypeEnum::MMTP:
654 type.subType.mmtpFilterType(DemuxMmtpFilterType::MMTP);
655 settings.mmtp().filterSettings.noinit();
656 break;
657 case FilterSubTypeEnum::AUDIO:
658 type.subType.mmtpFilterType(DemuxMmtpFilterType::AUDIO);
659 settings.mmtp().filterSettings.av(readAvFilterSettings(filterConfig));
660 break;
661 case FilterSubTypeEnum::VIDEO:
662 settings.mmtp().filterSettings.av(readAvFilterSettings(filterConfig));
663 break;
664 case FilterSubTypeEnum::RECORD:
665 type.subType.mmtpFilterType(DemuxMmtpFilterType::RECORD);
666 settings.mmtp().filterSettings.record(
667 readRecordFilterSettings(filterConfig));
668 break;
669 case FilterSubTypeEnum::DOWNLOAD:
670 type.subType.mmtpFilterType(DemuxMmtpFilterType::DOWNLOAD);
671 // TODO: b/182519645 support all the filter settings
672 /*settings.mmtp().filterSettings.download(
673 getDownloadFilterSettings(filterConfig));*/
674 break;
675 default:
676 ALOGW("[ConfigReader] mmtp subtype is not supported");
677 return false;
678 }
Amy Zhang06fa69e2021-04-09 09:56:25 -0700679 if (filterConfig.hasPid()) {
680 settings.mmtp().mmtpPid = static_cast<uint32_t>(filterConfig.getPid());
681 }
682 break;
683 }
684 case FilterMainTypeEnum::IP: {
685 ALOGW("[ConfigReader] filter main type is ip");
686 type.mainType = DemuxFilterMainType::IP;
687 switch (subType) {
688 case FilterSubTypeEnum::UNDEFINED:
689 type.subType.ipFilterType(DemuxIpFilterType::UNDEFINED);
690 break;
691 case FilterSubTypeEnum::SECTION:
692 type.subType.ipFilterType(DemuxIpFilterType::SECTION);
693 settings.ip().filterSettings.section(
694 readSectionFilterSettings(filterConfig));
695 break;
696 case FilterSubTypeEnum::NTP:
697 type.subType.ipFilterType(DemuxIpFilterType::NTP);
698 settings.ip().filterSettings.noinit();
699 break;
700 case FilterSubTypeEnum::IP: {
701 DemuxIpFilterSettings ip{
702 .ipAddr = readIpAddress(filterConfig),
703 };
704 ip.filterSettings.bPassthrough(readPassthroughSettings(filterConfig));
705 settings.ip(ip);
706 break;
707 }
708 case FilterSubTypeEnum::IP_PAYLOAD:
709 type.subType.ipFilterType(DemuxIpFilterType::IP_PAYLOAD);
710 settings.ip().filterSettings.noinit();
711 break;
712 case FilterSubTypeEnum::PAYLOAD_THROUGH:
713 type.subType.ipFilterType(DemuxIpFilterType::PAYLOAD_THROUGH);
714 settings.ip().filterSettings.noinit();
715 break;
716 default:
717 ALOGW("[ConfigReader] mmtp subtype is not supported");
718 return false;
719 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700720 break;
721 }
722 default:
723 // TODO: b/182519645 support all the filter configs
724 ALOGW("[ConfigReader] filter main type is not supported in dynamic config");
725 return false;
726 }
727 return true;
728 }
729
Amy Zhang06fa69e2021-04-09 09:56:25 -0700730 static DemuxIpAddress readIpAddress(Filter filterConfig) {
731 DemuxIpAddress ipAddress;
732 if (!filterConfig.hasIpFilterConfig_optional()) {
733 return ipAddress;
734 }
735 auto ipFilterConfig = filterConfig.getFirstIpFilterConfig_optional();
736 if (ipFilterConfig->hasSrcPort()) {
737 ipAddress.srcPort = ipFilterConfig->getSrcPort();
738 }
739 if (ipFilterConfig->hasDestPort()) {
740 ipAddress.dstPort = ipFilterConfig->getDestPort();
741 }
742 if (ipFilterConfig->getFirstSrcIpAddress()->getIsIpV4()) {
743 memcpy(ipAddress.srcIpAddress.v4().data(),
744 ipFilterConfig->getFirstSrcIpAddress()->getIp().data(), 4);
745 } else {
746 memcpy(ipAddress.srcIpAddress.v6().data(),
747 ipFilterConfig->getFirstSrcIpAddress()->getIp().data(), 6);
748 }
749 if (ipFilterConfig->getFirstDestIpAddress()->getIsIpV4()) {
750 memcpy(ipAddress.dstIpAddress.v4().data(),
751 ipFilterConfig->getFirstDestIpAddress()->getIp().data(), 4);
752 } else {
753 memcpy(ipAddress.dstIpAddress.v6().data(),
754 ipFilterConfig->getFirstDestIpAddress()->getIp().data(), 6);
755 }
756 return ipAddress;
757 }
758
759 static bool readPassthroughSettings(Filter filterConfig) {
760 if (!filterConfig.hasIpFilterConfig_optional()) {
761 return false;
762 }
763 auto ipFilterConfig = filterConfig.getFirstIpFilterConfig_optional();
764 if (ipFilterConfig->hasDataPassthrough()) {
765 return ipFilterConfig->getDataPassthrough();
766 }
767 return false;
768 }
769
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700770 static DemuxFilterSectionSettings readSectionFilterSettings(Filter filterConfig) {
771 DemuxFilterSectionSettings settings;
772 if (!filterConfig.hasSectionFilterSettings_optional()) {
773 return settings;
774 }
775 auto section = filterConfig.getFirstSectionFilterSettings_optional();
776 settings.isCheckCrc = section->getIsCheckCrc();
777 settings.isRepeat = section->getIsRepeat();
778 settings.isRaw = section->getIsRaw();
779 return settings;
780 }
781
782 static DemuxFilterAvSettings readAvFilterSettings(Filter filterConfig) {
783 DemuxFilterAvSettings settings;
784 if (!filterConfig.hasAvFilterSettings_optional()) {
785 return settings;
786 }
787 auto av = filterConfig.getFirstAvFilterSettings_optional();
788 settings.isPassthrough = av->getIsPassthrough();
789 return settings;
790 }
791
792 static DemuxFilterRecordSettings readRecordFilterSettings(Filter filterConfig) {
793 DemuxFilterRecordSettings settings;
794 if (!filterConfig.hasRecordFilterSettings_optional()) {
795 return settings;
796 }
797 auto record = filterConfig.getFirstRecordFilterSettings_optional();
798 settings.tsIndexMask = static_cast<uint32_t>(record->getTsIndexMask());
799 settings.scIndexType = static_cast<DemuxRecordScIndexType>(record->getScIndexType());
800 return settings;
801 }
802
Amy Zhange50f08d2021-03-30 15:56:02 -0700803 static PlaybackSettings readPlaybackSettings(Dvr dvrConfig) {
804 ALOGW("[ConfigReader] dvr type is playback");
805 PlaybackSettings playbackSettings{
806 .statusMask = static_cast<uint8_t>(dvrConfig.getStatusMask()),
807 .lowThreshold = static_cast<uint32_t>(dvrConfig.getLowThreshold()),
808 .highThreshold = static_cast<uint32_t>(dvrConfig.getHighThreshold()),
809 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
810 .packetSize = static_cast<uint8_t>(dvrConfig.getPacketSize()),
811 };
812 return playbackSettings;
813 }
814
815 static RecordSettings readRecordSettings(Dvr dvrConfig) {
816 ALOGW("[ConfigReader] dvr type is record");
817 RecordSettings recordSettings{
818 .statusMask = static_cast<uint8_t>(dvrConfig.getStatusMask()),
819 .lowThreshold = static_cast<uint32_t>(dvrConfig.getLowThreshold()),
820 .highThreshold = static_cast<uint32_t>(dvrConfig.getHighThreshold()),
821 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
822 .packetSize = static_cast<uint8_t>(dvrConfig.getPacketSize()),
823 };
824 return recordSettings;
825 }
826
Amy Zhang06fa69e2021-04-09 09:56:25 -0700827 static TunerConfiguration getTunerConfig() { return *read(mConfigFilePath.c_str()); }
Amy Zhange6915052021-03-30 13:44:43 -0700828
829 static DataFlowConfiguration getDataFlowConfiguration() {
830 return *getTunerConfig().getFirstDataFlowConfiguration();
831 }
832};