blob: 90499c414cb1e5ae7a36fdd99e88286b41c6ad48 [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;
39using android::hardware::tv::tuner::V1_0::DemuxIpFilterType;
40using android::hardware::tv::tuner::V1_0::DemuxMmtpFilterType;
41using android::hardware::tv::tuner::V1_0::DemuxRecordScIndexType;
42using android::hardware::tv::tuner::V1_0::DemuxTlvFilterType;
43using android::hardware::tv::tuner::V1_0::DemuxTpid;
44using android::hardware::tv::tuner::V1_0::DemuxTsFilterType;
45using android::hardware::tv::tuner::V1_0::DvrSettings;
46using android::hardware::tv::tuner::V1_0::DvrType;
47using android::hardware::tv::tuner::V1_0::FrontendDvbsSettings;
48using android::hardware::tv::tuner::V1_0::FrontendDvbtBandwidth;
49using android::hardware::tv::tuner::V1_0::FrontendDvbtCoderate;
50using android::hardware::tv::tuner::V1_0::FrontendDvbtConstellation;
51using android::hardware::tv::tuner::V1_0::FrontendDvbtGuardInterval;
52using android::hardware::tv::tuner::V1_0::FrontendDvbtHierarchy;
53using android::hardware::tv::tuner::V1_0::FrontendDvbtSettings;
54using android::hardware::tv::tuner::V1_0::FrontendDvbtStandard;
55using android::hardware::tv::tuner::V1_0::FrontendDvbtTransmissionMode;
56using android::hardware::tv::tuner::V1_0::FrontendSettings;
57using android::hardware::tv::tuner::V1_0::FrontendStatus;
58using android::hardware::tv::tuner::V1_0::FrontendStatusType;
59using android::hardware::tv::tuner::V1_0::FrontendType;
60using android::hardware::tv::tuner::V1_0::LnbPosition;
61using android::hardware::tv::tuner::V1_0::LnbTone;
62using android::hardware::tv::tuner::V1_0::LnbVoltage;
63using android::hardware::tv::tuner::V1_0::PlaybackSettings;
64using android::hardware::tv::tuner::V1_0::RecordSettings;
65
66const string configFilePath = "/vendor/etc/tuner_vts_config.xml";
Amy Zhang2ea2fe22021-04-01 11:55:41 -070067const string emptyHardwareId = "";
Amy Zhange6915052021-03-30 13:44:43 -070068
Amy Zhang32b6f9e2021-04-02 15:01:17 -070069#define PROVISION_STR \
70 "{ " \
71 " \"id\": 21140844, " \
72 " \"name\": \"Test Title\", " \
73 " \"lowercase_organization_name\": \"Android\", " \
74 " \"asset_key\": { " \
75 " \"encryption_key\": \"nezAr3CHFrmBR9R8Tedotw==\" " \
76 " }, " \
77 " \"cas_type\": 1, " \
78 " \"track_types\": [ ] " \
79 "} "
80
Amy Zhange6915052021-03-30 13:44:43 -070081struct FrontendConfig {
82 bool isSoftwareFe;
83 FrontendType type;
84 FrontendSettings settings;
85 vector<FrontendStatusType> tuneStatusTypes;
86 vector<FrontendStatus> expectTuneStatuses;
87};
88
Amy Zhang2ea2fe22021-04-01 11:55:41 -070089struct FilterConfig {
90 uint32_t bufferSize;
91 DemuxFilterType type;
92 DemuxFilterSettings settings;
93 bool getMqDesc;
94
95 bool operator<(const FilterConfig& /*c*/) const { return false; }
96};
97
Amy Zhange50f08d2021-03-30 15:56:02 -070098struct DvrConfig {
99 DvrType type;
100 uint32_t bufferSize;
101 DvrSettings settings;
102 string playbackInputFile;
103};
104
Amy Zhangc0e9a112021-04-01 19:25:21 -0700105struct LnbConfig {
106 string name;
107 LnbVoltage voltage;
108 LnbTone tone;
109 LnbPosition position;
110};
111
112struct TimeFilterConfig {
113 uint64_t timeStamp;
114};
115
Amy Zhang32b6f9e2021-04-02 15:01:17 -0700116struct DescramblerConfig {
117 uint32_t casSystemId;
118 string provisionStr;
119 vector<uint8_t> hidlPvtData;
120};
121
Amy Zhange6915052021-03-30 13:44:43 -0700122struct LiveBroadcastHardwareConnections {
123 string frontendId;
Amy Zhange50f08d2021-03-30 15:56:02 -0700124 string dvrSoftwareFeId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700125 string audioFilterId;
Amy Zhange6915052021-03-30 13:44:43 -0700126 string videoFilterId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700127 string sectionFilterId;
128 string pcrFilterId;
129 /* list string of extra filters; */
Amy Zhange6915052021-03-30 13:44:43 -0700130};
131
132struct ScanHardwareConnections {
133 string frontendId;
134};
135
Amy Zhange50f08d2021-03-30 15:56:02 -0700136struct DvrPlaybackHardwareConnections {
137 bool support;
138 string frontendId;
139 string dvrId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700140 string audioFilterId;
Amy Zhange50f08d2021-03-30 15:56:02 -0700141 string videoFilterId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700142 string sectionFilterId;
143 /* list string of extra filters; */
Amy Zhange50f08d2021-03-30 15:56:02 -0700144};
145
Amy Zhange6915052021-03-30 13:44:43 -0700146struct DvrRecordHardwareConnections {
147 bool support;
148 string frontendId;
Amy Zhange50f08d2021-03-30 15:56:02 -0700149 string dvrRecordId;
150 string dvrSoftwareFeId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700151 string recordFilterId;
Amy Zhange6915052021-03-30 13:44:43 -0700152};
153
154struct DescramblingHardwareConnections {
155 bool support;
156 string frontendId;
Amy Zhange50f08d2021-03-30 15:56:02 -0700157 string dvrSoftwareFeId;
Amy Zhange6915052021-03-30 13:44:43 -0700158 string audioFilterId;
159 string videoFilterId;
Amy Zhang32b6f9e2021-04-02 15:01:17 -0700160 string descramblerId;
161 /* list string of extra filters; */
Amy Zhange6915052021-03-30 13:44:43 -0700162};
163
164struct LnbLiveHardwareConnections {
165 bool support;
166 string frontendId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700167 string audioFilterId;
Amy Zhange6915052021-03-30 13:44:43 -0700168 string videoFilterId;
Amy Zhangc0e9a112021-04-01 19:25:21 -0700169 string lnbId;
170 vector<string> diseqcMsgs;
171 /* list string of extra filters; */
Amy Zhange6915052021-03-30 13:44:43 -0700172};
173
174struct LnbRecordHardwareConnections {
175 bool support;
176 string frontendId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700177 string dvrRecordId;
178 string recordFilterId;
Amy Zhangc0e9a112021-04-01 19:25:21 -0700179 string lnbId;
180 vector<string> diseqcMsgs;
181 /* list string of extra filters; */
182};
183
184struct TimeFilterHardwareConnections {
185 bool support;
186 string timeFilterId;
Amy Zhange6915052021-03-30 13:44:43 -0700187};
188
189struct TunerTestingConfigReader {
190 public:
191 static bool checkConfigFileExists() {
192 auto res = read(configFilePath.c_str());
193 if (res == nullopt) {
194 ALOGW("[ConfigReader] Couldn't read /vendor/etc/tuner_vts_config.xml."
195 "Please check tuner_testing_dynamic_configuration.xsd"
196 "and sample_tuner_vts_config.xml for more details on how to config Tune VTS.");
197 }
198 return (res != nullopt);
199 }
200
201 static void readFrontendConfig1_0(map<string, FrontendConfig>& frontendMap) {
202 auto hardwareConfig = getHardwareConfig();
203 if (hardwareConfig.hasFrontends()) {
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700204 // TODO: b/182519645 complete the tune status config
Amy Zhange6915052021-03-30 13:44:43 -0700205 vector<FrontendStatusType> types;
206 types.push_back(FrontendStatusType::DEMOD_LOCK);
207 FrontendStatus status;
208 status.isDemodLocked(true);
209 vector<FrontendStatus> statuses;
210 statuses.push_back(status);
211
212 auto frontends = *hardwareConfig.getFirstFrontends();
213 for (auto feConfig : frontends.getFrontend()) {
214 string id = feConfig.getId();
215 if (id.compare(string("FE_DEFAULT")) == 0) {
216 // overrid default
217 frontendMap.erase(string("FE_DEFAULT"));
218 }
219 FrontendType type;
220 switch (feConfig.getType()) {
221 case FrontendTypeEnum::UNDEFINED:
222 type = FrontendType::UNDEFINED;
223 break;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700224 // TODO: b/182519645 finish all other frontend settings
Amy Zhange6915052021-03-30 13:44:43 -0700225 case FrontendTypeEnum::ANALOG:
226 type = FrontendType::ANALOG;
227 break;
228 case FrontendTypeEnum::ATSC:
229 type = FrontendType::ATSC;
230 break;
231 case FrontendTypeEnum::ATSC3:
232 type = FrontendType::ATSC3;
233 break;
234 case FrontendTypeEnum::DVBC:
235 type = FrontendType::DVBC;
236 break;
237 case FrontendTypeEnum::DVBS:
238 type = FrontendType::DVBS;
239 frontendMap[id].settings.dvbs(readDvbsFrontendSettings(feConfig));
240 break;
241 case FrontendTypeEnum::DVBT: {
242 type = FrontendType::DVBT;
243 frontendMap[id].settings.dvbt(readDvbtFrontendSettings(feConfig));
244 break;
245 }
246 case FrontendTypeEnum::ISDBS:
247 type = FrontendType::ISDBS;
248 break;
249 case FrontendTypeEnum::ISDBS3:
250 type = FrontendType::ISDBS3;
251 break;
252 case FrontendTypeEnum::ISDBT:
253 type = FrontendType::ISDBT;
254 break;
255 case FrontendTypeEnum::DTMB:
256 // dtmb will be handled in readFrontendConfig1_1;
257 continue;
258 case FrontendTypeEnum::UNKNOWN:
259 ALOGW("[ConfigReader] invalid frontend type");
260 return;
261 }
262 frontendMap[id].type = type;
263 frontendMap[id].isSoftwareFe = feConfig.getIsSoftwareFrontend();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700264 // TODO: b/182519645 complete the tune status config
Amy Zhange6915052021-03-30 13:44:43 -0700265 frontendMap[id].tuneStatusTypes = types;
266 frontendMap[id].expectTuneStatuses = statuses;
267 }
268 }
269 }
270
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700271 static void readFilterConfig1_0(map<string, FilterConfig>& filterMap) {
272 auto hardwareConfig = getHardwareConfig();
273 if (hardwareConfig.hasFilters()) {
274 auto filters = *hardwareConfig.getFirstFilters();
275 for (auto filterConfig : filters.getFilter()) {
276 string id = filterConfig.getId();
277 if (id.compare(string("FILTER_AUDIO_DEFAULT")) == 0) {
278 // overrid default
279 filterMap.erase(string("FILTER_AUDIO_DEFAULT"));
280 }
281 if (id.compare(string("FILTER_VIDEO_DEFAULT")) == 0) {
282 // overrid default
283 filterMap.erase(string("FILTER_VIDEO_DEFAULT"));
284 }
285
286 DemuxFilterType type;
287 DemuxFilterSettings settings;
288 if (!readFilterTypeAndSettings(filterConfig, type, settings)) {
289 ALOGW("[ConfigReader] invalid filter type");
290 return;
291 }
292 filterMap[id].type = type;
293 filterMap[id].bufferSize = filterConfig.getBufferSize();
294 filterMap[id].getMqDesc = filterConfig.getUseFMQ();
295 filterMap[id].settings = settings;
296 }
297 }
298 }
299
Amy Zhange50f08d2021-03-30 15:56:02 -0700300 static void readDvrConfig1_0(map<string, DvrConfig>& dvrMap) {
301 auto hardwareConfig = getHardwareConfig();
302 if (hardwareConfig.hasDvrs()) {
303 auto dvrs = *hardwareConfig.getFirstDvrs();
304 for (auto dvrConfig : dvrs.getDvr()) {
305 string id = dvrConfig.getId();
306 DvrType type;
307 switch (dvrConfig.getType()) {
308 case DvrTypeEnum::PLAYBACK:
309 type = DvrType::PLAYBACK;
310 dvrMap[id].settings.playback(readPlaybackSettings(dvrConfig));
311 break;
312 case DvrTypeEnum::RECORD:
313 type = DvrType::RECORD;
314 dvrMap[id].settings.record(readRecordSettings(dvrConfig));
315 break;
316 case DvrTypeEnum::UNKNOWN:
317 ALOGW("[ConfigReader] invalid DVR type");
318 return;
319 }
320 dvrMap[id].type = type;
321 dvrMap[id].bufferSize = static_cast<uint32_t>(dvrConfig.getBufferSize());
322 if (dvrConfig.hasInputFilePath()) {
323 dvrMap[id].playbackInputFile = dvrConfig.getInputFilePath();
324 }
325 }
326 }
327 }
328
Amy Zhangc0e9a112021-04-01 19:25:21 -0700329 static void readLnbConfig1_0(map<string, LnbConfig>& lnbMap) {
330 auto hardwareConfig = getHardwareConfig();
331 if (hardwareConfig.hasLnbs()) {
332 auto lnbs = *hardwareConfig.getFirstLnbs();
333 for (auto lnbConfig : lnbs.getLnb()) {
334 string id = lnbConfig.getId();
335 if (lnbConfig.hasName()) {
336 lnbMap[id].name = lnbConfig.getName();
337 } else {
338 lnbMap[id].name = emptyHardwareId;
339 }
340 lnbMap[id].voltage = static_cast<LnbVoltage>(lnbConfig.getVoltage());
341 lnbMap[id].tone = static_cast<LnbTone>(lnbConfig.getTone());
342 lnbMap[id].position = static_cast<LnbPosition>(lnbConfig.getPosition());
343 }
344 }
345 }
346
Amy Zhang32b6f9e2021-04-02 15:01:17 -0700347 static void readDescramblerConfig1_0(map<string, DescramblerConfig>& descramblerMap) {
348 auto hardwareConfig = getHardwareConfig();
349 if (hardwareConfig.hasDescramblers()) {
350 auto descramblers = *hardwareConfig.getFirstDescramblers();
351 for (auto descramblerConfig : descramblers.getDescrambler()) {
352 string id = descramblerConfig.getId();
353 descramblerMap[id].casSystemId =
354 static_cast<uint32_t>(descramblerConfig.getCasSystemId());
355 if (descramblerConfig.hasProvisionStr()) {
356 descramblerMap[id].provisionStr = descramblerConfig.getProvisionStr();
357 } else {
358 descramblerMap[id].provisionStr = PROVISION_STR;
359 }
360 if (descramblerConfig.hasSesstionPrivatData()) {
361 auto privateData = descramblerConfig.getSesstionPrivatData();
362 int size = privateData.size();
363 descramblerMap[id].hidlPvtData.resize(size);
364 memcpy(descramblerMap[id].hidlPvtData.data(), privateData.data(), size);
365 } else {
366 descramblerMap[id].hidlPvtData.resize(256);
367 }
368 }
369 }
370 }
371
Amy Zhangc0e9a112021-04-01 19:25:21 -0700372 static void readDiseqcMessages(map<string, vector<uint8_t>>& diseqcMsgMap) {
373 auto hardwareConfig = getHardwareConfig();
374 if (hardwareConfig.hasDiseqcMessages()) {
375 auto msgs = *hardwareConfig.getFirstDiseqcMessages();
376 for (auto msgConfig : msgs.getDiseqcMessage()) {
377 string name = msgConfig.getMsgName();
378 for (uint8_t atom : msgConfig.getMsgBody()) {
379 diseqcMsgMap[name].push_back(atom);
380 }
381 }
382 }
383 }
384
385 static void readTimeFilterConfig1_0(map<string, TimeFilterConfig>& timeFilterMap) {
386 auto hardwareConfig = getHardwareConfig();
387 if (hardwareConfig.hasTimeFilters()) {
388 auto timeFilters = *hardwareConfig.getFirstTimeFilters();
389 for (auto timeFilterConfig : timeFilters.getTimeFilter()) {
390 string id = timeFilterConfig.getId();
391 timeFilterMap[id].timeStamp =
392 static_cast<uint64_t>(timeFilterConfig.getTimeStamp());
393 }
394 }
395 }
396
Amy Zhange6915052021-03-30 13:44:43 -0700397 static void connectLiveBroadcast(LiveBroadcastHardwareConnections& live) {
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700398 auto liveConfig = *getDataFlowConfiguration().getFirstClearLiveBroadcast();
399 live.frontendId = liveConfig.getFrontendConnection();
400
401 live.audioFilterId = liveConfig.getAudioFilterConnection();
402 live.videoFilterId = liveConfig.getVideoFilterConnection();
403 if (liveConfig.hasPcrFilterConnection()) {
404 live.pcrFilterId = liveConfig.getPcrFilterConnection();
405 } else {
406 live.pcrFilterId = emptyHardwareId;
407 }
408 if (liveConfig.hasSectionFilterConnection()) {
409 live.sectionFilterId = liveConfig.getSectionFilterConnection();
410 } else {
411 live.sectionFilterId = emptyHardwareId;
412 }
413 if (liveConfig.hasDvrSoftwareFeConnection()) {
414 live.dvrSoftwareFeId = liveConfig.getDvrSoftwareFeConnection();
Amy Zhange50f08d2021-03-30 15:56:02 -0700415 }
Amy Zhange6915052021-03-30 13:44:43 -0700416 }
417
418 static void connectScan(ScanHardwareConnections& scan) {
419 auto scanConfig = getDataFlowConfiguration().getFirstScan();
420 scan.frontendId = scanConfig->getFrontendConnection();
421 }
422
Amy Zhange50f08d2021-03-30 15:56:02 -0700423 static void connectDvrPlayback(DvrPlaybackHardwareConnections& playback) {
424 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700425 if (dataFlow.hasDvrPlayback()) {
426 playback.support = true;
427 } else {
Amy Zhange50f08d2021-03-30 15:56:02 -0700428 return;
429 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700430 auto playbackConfig = *dataFlow.getFirstDvrPlayback();
431 playback.dvrId = playbackConfig.getDvrConnection();
432 playback.audioFilterId = playbackConfig.getAudioFilterConnection();
433 playback.videoFilterId = playbackConfig.getVideoFilterConnection();
434 if (playbackConfig.hasSectionFilterConnection()) {
435 playback.sectionFilterId = playbackConfig.getSectionFilterConnection();
436 } else {
437 playback.sectionFilterId = emptyHardwareId;
438 }
Amy Zhange50f08d2021-03-30 15:56:02 -0700439 }
440
Amy Zhange6915052021-03-30 13:44:43 -0700441 static void connectDvrRecord(DvrRecordHardwareConnections& record) {
442 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700443 if (dataFlow.hasDvrRecord()) {
444 record.support = true;
445 } else {
Amy Zhange6915052021-03-30 13:44:43 -0700446 return;
447 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700448 auto recordConfig = *dataFlow.getFirstDvrRecord();
449 record.frontendId = recordConfig.getFrontendConnection();
450 record.recordFilterId = recordConfig.getRecordFilterConnection();
451 record.dvrRecordId = recordConfig.getDvrRecordConnection();
452 if (recordConfig.hasDvrSoftwareFeConnection()) {
453 record.dvrSoftwareFeId = recordConfig.getDvrSoftwareFeConnection();
Amy Zhange50f08d2021-03-30 15:56:02 -0700454 }
Amy Zhange6915052021-03-30 13:44:43 -0700455 }
456
457 static void connectDescrambling(DescramblingHardwareConnections& descrambling) {
458 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700459 if (dataFlow.hasDescrambling()) {
460 descrambling.support = true;
461 } else {
Amy Zhange6915052021-03-30 13:44:43 -0700462 return;
463 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700464 auto descConfig = *dataFlow.getFirstDescrambling();
465 descrambling.frontendId = descConfig.getFrontendConnection();
Amy Zhang32b6f9e2021-04-02 15:01:17 -0700466 descrambling.descramblerId = descConfig.getDescramblerConnection();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700467 descrambling.audioFilterId = descConfig.getAudioFilterConnection();
468 descrambling.videoFilterId = descConfig.getVideoFilterConnection();
469 if (descConfig.hasDvrSoftwareFeConnection()) {
470 descrambling.dvrSoftwareFeId = descConfig.getDvrSoftwareFeConnection();
Amy Zhange50f08d2021-03-30 15:56:02 -0700471 }
Amy Zhange6915052021-03-30 13:44:43 -0700472 }
473
474 static void connectLnbLive(LnbLiveHardwareConnections& lnbLive) {
475 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700476 if (dataFlow.hasLnbLive()) {
477 lnbLive.support = true;
478 } else {
Amy Zhange6915052021-03-30 13:44:43 -0700479 return;
480 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700481 auto lnbLiveConfig = *dataFlow.getFirstLnbLive();
482 lnbLive.frontendId = lnbLiveConfig.getFrontendConnection();
483 lnbLive.audioFilterId = lnbLiveConfig.getAudioFilterConnection();
484 lnbLive.videoFilterId = lnbLiveConfig.getVideoFilterConnection();
Amy Zhangc0e9a112021-04-01 19:25:21 -0700485 lnbLive.lnbId = lnbLiveConfig.getLnbConnection();
486 if (lnbLiveConfig.hasDiseqcMsgSender()) {
487 for (auto msgName : lnbLiveConfig.getDiseqcMsgSender()) {
488 lnbLive.diseqcMsgs.push_back(msgName);
489 }
490 }
Amy Zhange6915052021-03-30 13:44:43 -0700491 }
492
493 static void connectLnbRecord(LnbRecordHardwareConnections& lnbRecord) {
494 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700495 if (dataFlow.hasLnbRecord()) {
496 lnbRecord.support = true;
497 } else {
Amy Zhange6915052021-03-30 13:44:43 -0700498 return;
499 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700500 auto lnbRecordConfig = *dataFlow.getFirstLnbRecord();
501 lnbRecord.frontendId = lnbRecordConfig.getFrontendConnection();
502 lnbRecord.recordFilterId = lnbRecordConfig.getRecordFilterConnection();
503 lnbRecord.dvrRecordId = lnbRecordConfig.getDvrRecordConnection();
Amy Zhangc0e9a112021-04-01 19:25:21 -0700504 lnbRecord.lnbId = lnbRecordConfig.getLnbConnection();
505 if (lnbRecordConfig.hasDiseqcMsgSender()) {
506 for (auto msgName : lnbRecordConfig.getDiseqcMsgSender()) {
507 lnbRecord.diseqcMsgs.push_back(msgName);
508 }
509 }
510 }
511
512 static void connectTimeFilter(TimeFilterHardwareConnections& timeFilter) {
513 auto dataFlow = getDataFlowConfiguration();
514 if (dataFlow.hasTimeFilter()) {
515 timeFilter.support = true;
516 } else {
517 return;
518 }
519 auto timeFilterConfig = *dataFlow.getFirstTimeFilter();
520 timeFilter.timeFilterId = timeFilterConfig.getTimeFilterConnection();
Amy Zhange6915052021-03-30 13:44:43 -0700521 }
522
523 private:
524 static FrontendDvbtSettings readDvbtFrontendSettings(Frontend feConfig) {
Amy Zhange50f08d2021-03-30 15:56:02 -0700525 ALOGW("[ConfigReader] fe type is dvbt");
Amy Zhange6915052021-03-30 13:44:43 -0700526 FrontendDvbtSettings dvbtSettings{
527 .frequency = (uint32_t)feConfig.getFrequency(),
528 };
529 if (!feConfig.hasDvbtFrontendSettings_optional()) {
530 ALOGW("[ConfigReader] no more dvbt settings");
531 return dvbtSettings;
532 }
533 dvbtSettings.transmissionMode = static_cast<FrontendDvbtTransmissionMode>(
534 feConfig.getFirstDvbtFrontendSettings_optional()->getTransmissionMode());
535 dvbtSettings.bandwidth = static_cast<FrontendDvbtBandwidth>(
536 feConfig.getFirstDvbtFrontendSettings_optional()->getBandwidth());
537 dvbtSettings.isHighPriority =
538 feConfig.getFirstDvbtFrontendSettings_optional()->getIsHighPriority();
539 return dvbtSettings;
540 }
541
542 static FrontendDvbsSettings readDvbsFrontendSettings(Frontend feConfig) {
Amy Zhange50f08d2021-03-30 15:56:02 -0700543 ALOGW("[ConfigReader] fe type is dvbs");
Amy Zhange6915052021-03-30 13:44:43 -0700544 FrontendDvbsSettings dvbsSettings{
545 .frequency = (uint32_t)feConfig.getFrequency(),
546 };
547 if (!feConfig.hasDvbsFrontendSettings_optional()) {
548 ALOGW("[ConfigReader] no more dvbs settings");
549 return dvbsSettings;
550 }
551 dvbsSettings.symbolRate = static_cast<uint32_t>(
552 feConfig.getFirstDvbsFrontendSettings_optional()->getSymbolRate());
553 dvbsSettings.inputStreamId = static_cast<uint32_t>(
554 feConfig.getFirstDvbsFrontendSettings_optional()->getInputStreamId());
555 return dvbsSettings;
556 }
557
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700558 static bool readFilterTypeAndSettings(Filter filterConfig, DemuxFilterType& type,
559 DemuxFilterSettings& settings) {
560 auto mainType = filterConfig.getMainType();
561 auto subType = filterConfig.getSubType();
562 uint32_t pid = static_cast<uint32_t>(filterConfig.getPid());
563 switch (mainType) {
564 case FilterMainTypeEnum::TS: {
565 ALOGW("[ConfigReader] filter main type is ts");
566 type.mainType = DemuxFilterMainType::TS;
567 switch (subType) {
568 case FilterSubTypeEnum::UNDEFINED:
569 break;
570 case FilterSubTypeEnum::SECTION:
571 type.subType.tsFilterType(DemuxTsFilterType::SECTION);
572 settings.ts().filterSettings.section(
573 readSectionFilterSettings(filterConfig));
574 break;
575 case FilterSubTypeEnum::PES:
576 // TODO: b/182519645 support all the filter settings
577 /*settings.ts().filterSettings.pesData(
578 getPesFilterSettings(filterConfig));*/
579 type.subType.tsFilterType(DemuxTsFilterType::PES);
580 break;
581 case FilterSubTypeEnum::TS:
582 type.subType.tsFilterType(DemuxTsFilterType::TS);
583 settings.ts().filterSettings.noinit();
584 break;
585 case FilterSubTypeEnum::PCR:
586 type.subType.tsFilterType(DemuxTsFilterType::PCR);
587 settings.ts().filterSettings.noinit();
588 break;
589 case FilterSubTypeEnum::TEMI:
590 type.subType.tsFilterType(DemuxTsFilterType::TEMI);
591 settings.ts().filterSettings.noinit();
592 break;
593 case FilterSubTypeEnum::AUDIO:
594 type.subType.tsFilterType(DemuxTsFilterType::AUDIO);
595 settings.ts().filterSettings.av(readAvFilterSettings(filterConfig));
596 break;
597 case FilterSubTypeEnum::VIDEO:
598 type.subType.tsFilterType(DemuxTsFilterType::VIDEO);
599 settings.ts().filterSettings.av(readAvFilterSettings(filterConfig));
600 break;
601 case FilterSubTypeEnum::RECORD:
602 type.subType.tsFilterType(DemuxTsFilterType::RECORD);
603 settings.ts().filterSettings.record(readRecordFilterSettings(filterConfig));
604 break;
605 default:
606 ALOGW("[ConfigReader] ts subtype is not supported");
607 return false;
608 }
609 settings.ts().tpid = pid;
610 break;
611 }
612 case FilterMainTypeEnum::MMTP: {
613 ALOGW("[ConfigReader] filter main type is mmtp");
614 type.mainType = DemuxFilterMainType::MMTP;
615 switch (subType) {
616 case FilterSubTypeEnum::UNDEFINED:
617 break;
618 case FilterSubTypeEnum::SECTION:
619 type.subType.mmtpFilterType(DemuxMmtpFilterType::SECTION);
620 settings.mmtp().filterSettings.section(
621 readSectionFilterSettings(filterConfig));
622 break;
623 case FilterSubTypeEnum::PES:
624 type.subType.mmtpFilterType(DemuxMmtpFilterType::PES);
625 // TODO: b/182519645 support all the filter settings
626 /*settings.mmtp().filterSettings.pesData(
627 getPesFilterSettings(filterConfig));*/
628 break;
629 case FilterSubTypeEnum::MMTP:
630 type.subType.mmtpFilterType(DemuxMmtpFilterType::MMTP);
631 settings.mmtp().filterSettings.noinit();
632 break;
633 case FilterSubTypeEnum::AUDIO:
634 type.subType.mmtpFilterType(DemuxMmtpFilterType::AUDIO);
635 settings.mmtp().filterSettings.av(readAvFilterSettings(filterConfig));
636 break;
637 case FilterSubTypeEnum::VIDEO:
638 settings.mmtp().filterSettings.av(readAvFilterSettings(filterConfig));
639 break;
640 case FilterSubTypeEnum::RECORD:
641 type.subType.mmtpFilterType(DemuxMmtpFilterType::RECORD);
642 settings.mmtp().filterSettings.record(
643 readRecordFilterSettings(filterConfig));
644 break;
645 case FilterSubTypeEnum::DOWNLOAD:
646 type.subType.mmtpFilterType(DemuxMmtpFilterType::DOWNLOAD);
647 // TODO: b/182519645 support all the filter settings
648 /*settings.mmtp().filterSettings.download(
649 getDownloadFilterSettings(filterConfig));*/
650 break;
651 default:
652 ALOGW("[ConfigReader] mmtp subtype is not supported");
653 return false;
654 }
655 settings.mmtp().mmtpPid = pid;
656 break;
657 }
658 default:
659 // TODO: b/182519645 support all the filter configs
660 ALOGW("[ConfigReader] filter main type is not supported in dynamic config");
661 return false;
662 }
663 return true;
664 }
665
666 static DemuxFilterSectionSettings readSectionFilterSettings(Filter filterConfig) {
667 DemuxFilterSectionSettings settings;
668 if (!filterConfig.hasSectionFilterSettings_optional()) {
669 return settings;
670 }
671 auto section = filterConfig.getFirstSectionFilterSettings_optional();
672 settings.isCheckCrc = section->getIsCheckCrc();
673 settings.isRepeat = section->getIsRepeat();
674 settings.isRaw = section->getIsRaw();
675 return settings;
676 }
677
678 static DemuxFilterAvSettings readAvFilterSettings(Filter filterConfig) {
679 DemuxFilterAvSettings settings;
680 if (!filterConfig.hasAvFilterSettings_optional()) {
681 return settings;
682 }
683 auto av = filterConfig.getFirstAvFilterSettings_optional();
684 settings.isPassthrough = av->getIsPassthrough();
685 return settings;
686 }
687
688 static DemuxFilterRecordSettings readRecordFilterSettings(Filter filterConfig) {
689 DemuxFilterRecordSettings settings;
690 if (!filterConfig.hasRecordFilterSettings_optional()) {
691 return settings;
692 }
693 auto record = filterConfig.getFirstRecordFilterSettings_optional();
694 settings.tsIndexMask = static_cast<uint32_t>(record->getTsIndexMask());
695 settings.scIndexType = static_cast<DemuxRecordScIndexType>(record->getScIndexType());
696 return settings;
697 }
698
Amy Zhange50f08d2021-03-30 15:56:02 -0700699 static PlaybackSettings readPlaybackSettings(Dvr dvrConfig) {
700 ALOGW("[ConfigReader] dvr type is playback");
701 PlaybackSettings playbackSettings{
702 .statusMask = static_cast<uint8_t>(dvrConfig.getStatusMask()),
703 .lowThreshold = static_cast<uint32_t>(dvrConfig.getLowThreshold()),
704 .highThreshold = static_cast<uint32_t>(dvrConfig.getHighThreshold()),
705 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
706 .packetSize = static_cast<uint8_t>(dvrConfig.getPacketSize()),
707 };
708 return playbackSettings;
709 }
710
711 static RecordSettings readRecordSettings(Dvr dvrConfig) {
712 ALOGW("[ConfigReader] dvr type is record");
713 RecordSettings recordSettings{
714 .statusMask = static_cast<uint8_t>(dvrConfig.getStatusMask()),
715 .lowThreshold = static_cast<uint32_t>(dvrConfig.getLowThreshold()),
716 .highThreshold = static_cast<uint32_t>(dvrConfig.getHighThreshold()),
717 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
718 .packetSize = static_cast<uint8_t>(dvrConfig.getPacketSize()),
719 };
720 return recordSettings;
721 }
722
Amy Zhange6915052021-03-30 13:44:43 -0700723 static TunerConfiguration getTunerConfig() { return *read(configFilePath.c_str()); }
724
725 static HardwareConfiguration getHardwareConfig() {
726 return *getTunerConfig().getFirstHardwareConfiguration();
727 }
728
729 static DataFlowConfiguration getDataFlowConfiguration() {
730 return *getTunerConfig().getFirstDataFlowConfiguration();
731 }
732};