blob: e6aba2cff78b9b919975b2f7814922c65bfd5626 [file] [log] [blame]
Amy Zhangc1789912021-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 Zhang1d603672021-04-01 11:55:41 -070032using android::hardware::tv::tuner::V1_0::DemuxFilterAvSettings;
Amy Zhangc1789912021-03-30 13:44:43 -070033using android::hardware::tv::tuner::V1_0::DemuxFilterEvent;
34using android::hardware::tv::tuner::V1_0::DemuxFilterMainType;
Amy Zhang1d603672021-04-01 11:55:41 -070035using android::hardware::tv::tuner::V1_0::DemuxFilterRecordSettings;
36using android::hardware::tv::tuner::V1_0::DemuxFilterSectionSettings;
Amy Zhangc1789912021-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 Zhang1d603672021-04-01 11:55:41 -070067const string emptyHardwareId = "";
Amy Zhangc1789912021-03-30 13:44:43 -070068
Amy Zhangf36edfc2021-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 Zhangc1789912021-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 Zhang1d603672021-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 Zhang131d5302021-03-30 15:56:02 -070098struct DvrConfig {
99 DvrType type;
100 uint32_t bufferSize;
101 DvrSettings settings;
102 string playbackInputFile;
103};
104
Amy Zhang78e3dad2021-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 Zhangf36edfc2021-04-02 15:01:17 -0700116struct DescramblerConfig {
117 uint32_t casSystemId;
118 string provisionStr;
119 vector<uint8_t> hidlPvtData;
120};
121
Amy Zhangc1789912021-03-30 13:44:43 -0700122struct LiveBroadcastHardwareConnections {
Amy Zhang63f41752021-04-28 20:22:03 -0700123 bool hasFrontendConnection;
Amy Zhangc1789912021-03-30 13:44:43 -0700124 string frontendId;
Amy Zhang131d5302021-03-30 15:56:02 -0700125 string dvrSoftwareFeId;
Amy Zhang1d603672021-04-01 11:55:41 -0700126 string audioFilterId;
Amy Zhangc1789912021-03-30 13:44:43 -0700127 string videoFilterId;
Amy Zhang1d603672021-04-01 11:55:41 -0700128 string sectionFilterId;
129 string pcrFilterId;
130 /* list string of extra filters; */
Amy Zhangc1789912021-03-30 13:44:43 -0700131};
132
133struct ScanHardwareConnections {
Amy Zhang63f41752021-04-28 20:22:03 -0700134 bool hasFrontendConnection;
Amy Zhangc1789912021-03-30 13:44:43 -0700135 string frontendId;
136};
137
Amy Zhang131d5302021-03-30 15:56:02 -0700138struct DvrPlaybackHardwareConnections {
139 bool support;
140 string frontendId;
141 string dvrId;
Amy Zhang1d603672021-04-01 11:55:41 -0700142 string audioFilterId;
Amy Zhang131d5302021-03-30 15:56:02 -0700143 string videoFilterId;
Amy Zhang1d603672021-04-01 11:55:41 -0700144 string sectionFilterId;
145 /* list string of extra filters; */
Amy Zhang131d5302021-03-30 15:56:02 -0700146};
147
Amy Zhangc1789912021-03-30 13:44:43 -0700148struct DvrRecordHardwareConnections {
149 bool support;
Amy Zhang63f41752021-04-28 20:22:03 -0700150 bool hasFrontendConnection;
Amy Zhangc1789912021-03-30 13:44:43 -0700151 string frontendId;
Amy Zhang131d5302021-03-30 15:56:02 -0700152 string dvrRecordId;
153 string dvrSoftwareFeId;
Amy Zhang1d603672021-04-01 11:55:41 -0700154 string recordFilterId;
Amy Zhang63f41752021-04-28 20:22:03 -0700155 string dvrSourceId;
Amy Zhangc1789912021-03-30 13:44:43 -0700156};
157
158struct DescramblingHardwareConnections {
159 bool support;
Amy Zhang63f41752021-04-28 20:22:03 -0700160 bool hasFrontendConnection;
Amy Zhangc1789912021-03-30 13:44:43 -0700161 string frontendId;
Amy Zhang131d5302021-03-30 15:56:02 -0700162 string dvrSoftwareFeId;
Amy Zhangc1789912021-03-30 13:44:43 -0700163 string audioFilterId;
164 string videoFilterId;
Amy Zhangf36edfc2021-04-02 15:01:17 -0700165 string descramblerId;
Amy Zhang63f41752021-04-28 20:22:03 -0700166 string dvrSourceId;
Amy Zhangf36edfc2021-04-02 15:01:17 -0700167 /* list string of extra filters; */
Amy Zhangc1789912021-03-30 13:44:43 -0700168};
169
170struct LnbLiveHardwareConnections {
171 bool support;
172 string frontendId;
Amy Zhang1d603672021-04-01 11:55:41 -0700173 string audioFilterId;
Amy Zhangc1789912021-03-30 13:44:43 -0700174 string videoFilterId;
Amy Zhang78e3dad2021-04-01 19:25:21 -0700175 string lnbId;
176 vector<string> diseqcMsgs;
177 /* list string of extra filters; */
Amy Zhangc1789912021-03-30 13:44:43 -0700178};
179
180struct LnbRecordHardwareConnections {
181 bool support;
182 string frontendId;
Amy Zhang1d603672021-04-01 11:55:41 -0700183 string dvrRecordId;
184 string recordFilterId;
Amy Zhang78e3dad2021-04-01 19:25:21 -0700185 string lnbId;
186 vector<string> diseqcMsgs;
187 /* list string of extra filters; */
188};
189
190struct TimeFilterHardwareConnections {
191 bool support;
192 string timeFilterId;
Amy Zhangc1789912021-03-30 13:44:43 -0700193};
194
195struct TunerTestingConfigReader {
196 public:
197 static bool checkConfigFileExists() {
198 auto res = read(configFilePath.c_str());
199 if (res == nullopt) {
200 ALOGW("[ConfigReader] Couldn't read /vendor/etc/tuner_vts_config.xml."
201 "Please check tuner_testing_dynamic_configuration.xsd"
202 "and sample_tuner_vts_config.xml for more details on how to config Tune VTS.");
203 }
204 return (res != nullopt);
205 }
206
207 static void readFrontendConfig1_0(map<string, FrontendConfig>& frontendMap) {
208 auto hardwareConfig = getHardwareConfig();
209 if (hardwareConfig.hasFrontends()) {
Amy Zhang1d603672021-04-01 11:55:41 -0700210 // TODO: b/182519645 complete the tune status config
Amy Zhangc1789912021-03-30 13:44:43 -0700211 vector<FrontendStatusType> types;
212 types.push_back(FrontendStatusType::DEMOD_LOCK);
213 FrontendStatus status;
214 status.isDemodLocked(true);
215 vector<FrontendStatus> statuses;
216 statuses.push_back(status);
217
218 auto frontends = *hardwareConfig.getFirstFrontends();
219 for (auto feConfig : frontends.getFrontend()) {
220 string id = feConfig.getId();
221 if (id.compare(string("FE_DEFAULT")) == 0) {
222 // overrid default
223 frontendMap.erase(string("FE_DEFAULT"));
224 }
225 FrontendType type;
226 switch (feConfig.getType()) {
227 case FrontendTypeEnum::UNDEFINED:
228 type = FrontendType::UNDEFINED;
229 break;
Amy Zhang1d603672021-04-01 11:55:41 -0700230 // TODO: b/182519645 finish all other frontend settings
Amy Zhangc1789912021-03-30 13:44:43 -0700231 case FrontendTypeEnum::ANALOG:
232 type = FrontendType::ANALOG;
233 break;
234 case FrontendTypeEnum::ATSC:
235 type = FrontendType::ATSC;
236 break;
237 case FrontendTypeEnum::ATSC3:
238 type = FrontendType::ATSC3;
239 break;
240 case FrontendTypeEnum::DVBC:
241 type = FrontendType::DVBC;
242 break;
243 case FrontendTypeEnum::DVBS:
244 type = FrontendType::DVBS;
245 frontendMap[id].settings.dvbs(readDvbsFrontendSettings(feConfig));
246 break;
247 case FrontendTypeEnum::DVBT: {
248 type = FrontendType::DVBT;
249 frontendMap[id].settings.dvbt(readDvbtFrontendSettings(feConfig));
250 break;
251 }
252 case FrontendTypeEnum::ISDBS:
253 type = FrontendType::ISDBS;
254 break;
255 case FrontendTypeEnum::ISDBS3:
256 type = FrontendType::ISDBS3;
257 break;
258 case FrontendTypeEnum::ISDBT:
259 type = FrontendType::ISDBT;
260 break;
261 case FrontendTypeEnum::DTMB:
262 // dtmb will be handled in readFrontendConfig1_1;
263 continue;
264 case FrontendTypeEnum::UNKNOWN:
265 ALOGW("[ConfigReader] invalid frontend type");
266 return;
267 }
268 frontendMap[id].type = type;
269 frontendMap[id].isSoftwareFe = feConfig.getIsSoftwareFrontend();
Amy Zhang1d603672021-04-01 11:55:41 -0700270 // TODO: b/182519645 complete the tune status config
Amy Zhangc1789912021-03-30 13:44:43 -0700271 frontendMap[id].tuneStatusTypes = types;
272 frontendMap[id].expectTuneStatuses = statuses;
273 }
274 }
275 }
276
Amy Zhang1d603672021-04-01 11:55:41 -0700277 static void readFilterConfig1_0(map<string, FilterConfig>& filterMap) {
278 auto hardwareConfig = getHardwareConfig();
279 if (hardwareConfig.hasFilters()) {
280 auto filters = *hardwareConfig.getFirstFilters();
281 for (auto filterConfig : filters.getFilter()) {
282 string id = filterConfig.getId();
283 if (id.compare(string("FILTER_AUDIO_DEFAULT")) == 0) {
284 // overrid default
285 filterMap.erase(string("FILTER_AUDIO_DEFAULT"));
286 }
287 if (id.compare(string("FILTER_VIDEO_DEFAULT")) == 0) {
288 // overrid default
289 filterMap.erase(string("FILTER_VIDEO_DEFAULT"));
290 }
291
292 DemuxFilterType type;
293 DemuxFilterSettings settings;
294 if (!readFilterTypeAndSettings(filterConfig, type, settings)) {
295 ALOGW("[ConfigReader] invalid filter type");
296 return;
297 }
298 filterMap[id].type = type;
299 filterMap[id].bufferSize = filterConfig.getBufferSize();
300 filterMap[id].getMqDesc = filterConfig.getUseFMQ();
301 filterMap[id].settings = settings;
302 }
303 }
304 }
305
Amy Zhang131d5302021-03-30 15:56:02 -0700306 static void readDvrConfig1_0(map<string, DvrConfig>& dvrMap) {
307 auto hardwareConfig = getHardwareConfig();
308 if (hardwareConfig.hasDvrs()) {
309 auto dvrs = *hardwareConfig.getFirstDvrs();
310 for (auto dvrConfig : dvrs.getDvr()) {
311 string id = dvrConfig.getId();
312 DvrType type;
313 switch (dvrConfig.getType()) {
314 case DvrTypeEnum::PLAYBACK:
315 type = DvrType::PLAYBACK;
316 dvrMap[id].settings.playback(readPlaybackSettings(dvrConfig));
317 break;
318 case DvrTypeEnum::RECORD:
319 type = DvrType::RECORD;
320 dvrMap[id].settings.record(readRecordSettings(dvrConfig));
321 break;
322 case DvrTypeEnum::UNKNOWN:
323 ALOGW("[ConfigReader] invalid DVR type");
324 return;
325 }
326 dvrMap[id].type = type;
327 dvrMap[id].bufferSize = static_cast<uint32_t>(dvrConfig.getBufferSize());
328 if (dvrConfig.hasInputFilePath()) {
329 dvrMap[id].playbackInputFile = dvrConfig.getInputFilePath();
330 }
331 }
332 }
333 }
334
Amy Zhang78e3dad2021-04-01 19:25:21 -0700335 static void readLnbConfig1_0(map<string, LnbConfig>& lnbMap) {
336 auto hardwareConfig = getHardwareConfig();
337 if (hardwareConfig.hasLnbs()) {
338 auto lnbs = *hardwareConfig.getFirstLnbs();
339 for (auto lnbConfig : lnbs.getLnb()) {
340 string id = lnbConfig.getId();
341 if (lnbConfig.hasName()) {
342 lnbMap[id].name = lnbConfig.getName();
343 } else {
344 lnbMap[id].name = emptyHardwareId;
345 }
346 lnbMap[id].voltage = static_cast<LnbVoltage>(lnbConfig.getVoltage());
347 lnbMap[id].tone = static_cast<LnbTone>(lnbConfig.getTone());
348 lnbMap[id].position = static_cast<LnbPosition>(lnbConfig.getPosition());
349 }
350 }
351 }
352
Amy Zhangf36edfc2021-04-02 15:01:17 -0700353 static void readDescramblerConfig1_0(map<string, DescramblerConfig>& descramblerMap) {
354 auto hardwareConfig = getHardwareConfig();
355 if (hardwareConfig.hasDescramblers()) {
356 auto descramblers = *hardwareConfig.getFirstDescramblers();
357 for (auto descramblerConfig : descramblers.getDescrambler()) {
358 string id = descramblerConfig.getId();
359 descramblerMap[id].casSystemId =
360 static_cast<uint32_t>(descramblerConfig.getCasSystemId());
361 if (descramblerConfig.hasProvisionStr()) {
362 descramblerMap[id].provisionStr = descramblerConfig.getProvisionStr();
363 } else {
364 descramblerMap[id].provisionStr = PROVISION_STR;
365 }
366 if (descramblerConfig.hasSesstionPrivatData()) {
367 auto privateData = descramblerConfig.getSesstionPrivatData();
368 int size = privateData.size();
369 descramblerMap[id].hidlPvtData.resize(size);
370 memcpy(descramblerMap[id].hidlPvtData.data(), privateData.data(), size);
Amy Zhangf36edfc2021-04-02 15:01:17 -0700371 }
372 }
373 }
374 }
375
Amy Zhang78e3dad2021-04-01 19:25:21 -0700376 static void readDiseqcMessages(map<string, vector<uint8_t>>& diseqcMsgMap) {
377 auto hardwareConfig = getHardwareConfig();
378 if (hardwareConfig.hasDiseqcMessages()) {
379 auto msgs = *hardwareConfig.getFirstDiseqcMessages();
380 for (auto msgConfig : msgs.getDiseqcMessage()) {
381 string name = msgConfig.getMsgName();
382 for (uint8_t atom : msgConfig.getMsgBody()) {
383 diseqcMsgMap[name].push_back(atom);
384 }
385 }
386 }
387 }
388
389 static void readTimeFilterConfig1_0(map<string, TimeFilterConfig>& timeFilterMap) {
390 auto hardwareConfig = getHardwareConfig();
391 if (hardwareConfig.hasTimeFilters()) {
392 auto timeFilters = *hardwareConfig.getFirstTimeFilters();
393 for (auto timeFilterConfig : timeFilters.getTimeFilter()) {
394 string id = timeFilterConfig.getId();
395 timeFilterMap[id].timeStamp =
396 static_cast<uint64_t>(timeFilterConfig.getTimeStamp());
397 }
398 }
399 }
400
Amy Zhangc1789912021-03-30 13:44:43 -0700401 static void connectLiveBroadcast(LiveBroadcastHardwareConnections& live) {
Amy Zhang63f41752021-04-28 20:22:03 -0700402 auto dataFlow = getDataFlowConfiguration();
403 if (dataFlow.hasClearLiveBroadcast()) {
404 live.hasFrontendConnection = true;
405 } else {
406 live.hasFrontendConnection = false;
407 return;
408 }
409 auto liveConfig = *dataFlow.getFirstClearLiveBroadcast();
Amy Zhang1d603672021-04-01 11:55:41 -0700410 live.frontendId = liveConfig.getFrontendConnection();
411
412 live.audioFilterId = liveConfig.getAudioFilterConnection();
413 live.videoFilterId = liveConfig.getVideoFilterConnection();
414 if (liveConfig.hasPcrFilterConnection()) {
415 live.pcrFilterId = liveConfig.getPcrFilterConnection();
416 } else {
417 live.pcrFilterId = emptyHardwareId;
418 }
419 if (liveConfig.hasSectionFilterConnection()) {
420 live.sectionFilterId = liveConfig.getSectionFilterConnection();
421 } else {
422 live.sectionFilterId = emptyHardwareId;
423 }
424 if (liveConfig.hasDvrSoftwareFeConnection()) {
425 live.dvrSoftwareFeId = liveConfig.getDvrSoftwareFeConnection();
Amy Zhang131d5302021-03-30 15:56:02 -0700426 }
Amy Zhangc1789912021-03-30 13:44:43 -0700427 }
428
429 static void connectScan(ScanHardwareConnections& scan) {
Amy Zhang63f41752021-04-28 20:22:03 -0700430 auto dataFlow = getDataFlowConfiguration();
431 if (dataFlow.hasScan()) {
432 scan.hasFrontendConnection = true;
433 } else {
434 scan.hasFrontendConnection = false;
435 return;
436 }
437 auto scanConfig = *dataFlow.getFirstScan();
438 scan.frontendId = scanConfig.getFrontendConnection();
Amy Zhangc1789912021-03-30 13:44:43 -0700439 }
440
Amy Zhang131d5302021-03-30 15:56:02 -0700441 static void connectDvrPlayback(DvrPlaybackHardwareConnections& playback) {
442 auto dataFlow = getDataFlowConfiguration();
Amy Zhang1d603672021-04-01 11:55:41 -0700443 if (dataFlow.hasDvrPlayback()) {
444 playback.support = true;
445 } else {
Amy Zhang63f41752021-04-28 20:22:03 -0700446 playback.support = false;
Amy Zhang131d5302021-03-30 15:56:02 -0700447 return;
448 }
Amy Zhang1d603672021-04-01 11:55:41 -0700449 auto playbackConfig = *dataFlow.getFirstDvrPlayback();
450 playback.dvrId = playbackConfig.getDvrConnection();
451 playback.audioFilterId = playbackConfig.getAudioFilterConnection();
452 playback.videoFilterId = playbackConfig.getVideoFilterConnection();
453 if (playbackConfig.hasSectionFilterConnection()) {
454 playback.sectionFilterId = playbackConfig.getSectionFilterConnection();
455 } else {
456 playback.sectionFilterId = emptyHardwareId;
457 }
Amy Zhang131d5302021-03-30 15:56:02 -0700458 }
459
Amy Zhangc1789912021-03-30 13:44:43 -0700460 static void connectDvrRecord(DvrRecordHardwareConnections& record) {
461 auto dataFlow = getDataFlowConfiguration();
Amy Zhang1d603672021-04-01 11:55:41 -0700462 if (dataFlow.hasDvrRecord()) {
463 record.support = true;
464 } else {
Amy Zhang63f41752021-04-28 20:22:03 -0700465 record.support = false;
Amy Zhangc1789912021-03-30 13:44:43 -0700466 return;
467 }
Amy Zhang1d603672021-04-01 11:55:41 -0700468 auto recordConfig = *dataFlow.getFirstDvrRecord();
Amy Zhang1d603672021-04-01 11:55:41 -0700469 record.recordFilterId = recordConfig.getRecordFilterConnection();
470 record.dvrRecordId = recordConfig.getDvrRecordConnection();
471 if (recordConfig.hasDvrSoftwareFeConnection()) {
472 record.dvrSoftwareFeId = recordConfig.getDvrSoftwareFeConnection();
Amy Zhang131d5302021-03-30 15:56:02 -0700473 }
Amy Zhang63f41752021-04-28 20:22:03 -0700474 if (recordConfig.getHasFrontendConnection()) {
475 record.hasFrontendConnection = true;
476 record.dvrSourceId = emptyHardwareId;
Henry Fangdfb386f2021-05-10 09:06:32 -0700477 record.frontendId = recordConfig.getFrontendConnection();
Amy Zhang63f41752021-04-28 20:22:03 -0700478 } else {
479 record.hasFrontendConnection = false;
480 record.dvrSourceId = recordConfig.getDvrSourceConnection();
481 }
Amy Zhangc1789912021-03-30 13:44:43 -0700482 }
483
484 static void connectDescrambling(DescramblingHardwareConnections& descrambling) {
485 auto dataFlow = getDataFlowConfiguration();
Amy Zhang1d603672021-04-01 11:55:41 -0700486 if (dataFlow.hasDescrambling()) {
487 descrambling.support = true;
488 } else {
Amy Zhang63f41752021-04-28 20:22:03 -0700489 descrambling.support = false;
Amy Zhangc1789912021-03-30 13:44:43 -0700490 return;
491 }
Amy Zhang1d603672021-04-01 11:55:41 -0700492 auto descConfig = *dataFlow.getFirstDescrambling();
Amy Zhangf36edfc2021-04-02 15:01:17 -0700493 descrambling.descramblerId = descConfig.getDescramblerConnection();
Amy Zhang1d603672021-04-01 11:55:41 -0700494 descrambling.audioFilterId = descConfig.getAudioFilterConnection();
495 descrambling.videoFilterId = descConfig.getVideoFilterConnection();
496 if (descConfig.hasDvrSoftwareFeConnection()) {
497 descrambling.dvrSoftwareFeId = descConfig.getDvrSoftwareFeConnection();
Amy Zhang131d5302021-03-30 15:56:02 -0700498 }
Amy Zhang63f41752021-04-28 20:22:03 -0700499 if (descConfig.getHasFrontendConnection()) {
500 descrambling.hasFrontendConnection = true;
501 descrambling.dvrSourceId = emptyHardwareId;
Henry Fangdfb386f2021-05-10 09:06:32 -0700502 descrambling.frontendId = descConfig.getFrontendConnection();
Amy Zhang63f41752021-04-28 20:22:03 -0700503 } else {
504 descrambling.hasFrontendConnection = false;
505 descrambling.dvrSourceId = descConfig.getDvrSourceConnection();
506 }
Amy Zhangc1789912021-03-30 13:44:43 -0700507 }
508
509 static void connectLnbLive(LnbLiveHardwareConnections& lnbLive) {
510 auto dataFlow = getDataFlowConfiguration();
Amy Zhang1d603672021-04-01 11:55:41 -0700511 if (dataFlow.hasLnbLive()) {
512 lnbLive.support = true;
513 } else {
Amy Zhang63f41752021-04-28 20:22:03 -0700514 lnbLive.support = false;
Amy Zhangc1789912021-03-30 13:44:43 -0700515 return;
516 }
Amy Zhang1d603672021-04-01 11:55:41 -0700517 auto lnbLiveConfig = *dataFlow.getFirstLnbLive();
518 lnbLive.frontendId = lnbLiveConfig.getFrontendConnection();
519 lnbLive.audioFilterId = lnbLiveConfig.getAudioFilterConnection();
520 lnbLive.videoFilterId = lnbLiveConfig.getVideoFilterConnection();
Amy Zhang78e3dad2021-04-01 19:25:21 -0700521 lnbLive.lnbId = lnbLiveConfig.getLnbConnection();
522 if (lnbLiveConfig.hasDiseqcMsgSender()) {
523 for (auto msgName : lnbLiveConfig.getDiseqcMsgSender()) {
524 lnbLive.diseqcMsgs.push_back(msgName);
525 }
526 }
Amy Zhangc1789912021-03-30 13:44:43 -0700527 }
528
529 static void connectLnbRecord(LnbRecordHardwareConnections& lnbRecord) {
530 auto dataFlow = getDataFlowConfiguration();
Amy Zhang1d603672021-04-01 11:55:41 -0700531 if (dataFlow.hasLnbRecord()) {
532 lnbRecord.support = true;
533 } else {
Amy Zhang63f41752021-04-28 20:22:03 -0700534 lnbRecord.support = false;
Amy Zhangc1789912021-03-30 13:44:43 -0700535 return;
536 }
Amy Zhang1d603672021-04-01 11:55:41 -0700537 auto lnbRecordConfig = *dataFlow.getFirstLnbRecord();
538 lnbRecord.frontendId = lnbRecordConfig.getFrontendConnection();
539 lnbRecord.recordFilterId = lnbRecordConfig.getRecordFilterConnection();
540 lnbRecord.dvrRecordId = lnbRecordConfig.getDvrRecordConnection();
Amy Zhang78e3dad2021-04-01 19:25:21 -0700541 lnbRecord.lnbId = lnbRecordConfig.getLnbConnection();
542 if (lnbRecordConfig.hasDiseqcMsgSender()) {
543 for (auto msgName : lnbRecordConfig.getDiseqcMsgSender()) {
544 lnbRecord.diseqcMsgs.push_back(msgName);
545 }
546 }
547 }
548
549 static void connectTimeFilter(TimeFilterHardwareConnections& timeFilter) {
550 auto dataFlow = getDataFlowConfiguration();
551 if (dataFlow.hasTimeFilter()) {
552 timeFilter.support = true;
553 } else {
Amy Zhang63f41752021-04-28 20:22:03 -0700554 timeFilter.support = false;
Amy Zhang78e3dad2021-04-01 19:25:21 -0700555 return;
556 }
557 auto timeFilterConfig = *dataFlow.getFirstTimeFilter();
558 timeFilter.timeFilterId = timeFilterConfig.getTimeFilterConnection();
Amy Zhangc1789912021-03-30 13:44:43 -0700559 }
560
561 private:
562 static FrontendDvbtSettings readDvbtFrontendSettings(Frontend feConfig) {
Amy Zhang131d5302021-03-30 15:56:02 -0700563 ALOGW("[ConfigReader] fe type is dvbt");
Amy Zhangc1789912021-03-30 13:44:43 -0700564 FrontendDvbtSettings dvbtSettings{
565 .frequency = (uint32_t)feConfig.getFrequency(),
566 };
567 if (!feConfig.hasDvbtFrontendSettings_optional()) {
568 ALOGW("[ConfigReader] no more dvbt settings");
569 return dvbtSettings;
570 }
571 dvbtSettings.transmissionMode = static_cast<FrontendDvbtTransmissionMode>(
572 feConfig.getFirstDvbtFrontendSettings_optional()->getTransmissionMode());
573 dvbtSettings.bandwidth = static_cast<FrontendDvbtBandwidth>(
574 feConfig.getFirstDvbtFrontendSettings_optional()->getBandwidth());
575 dvbtSettings.isHighPriority =
576 feConfig.getFirstDvbtFrontendSettings_optional()->getIsHighPriority();
577 return dvbtSettings;
578 }
579
580 static FrontendDvbsSettings readDvbsFrontendSettings(Frontend feConfig) {
Amy Zhang131d5302021-03-30 15:56:02 -0700581 ALOGW("[ConfigReader] fe type is dvbs");
Amy Zhangc1789912021-03-30 13:44:43 -0700582 FrontendDvbsSettings dvbsSettings{
583 .frequency = (uint32_t)feConfig.getFrequency(),
584 };
585 if (!feConfig.hasDvbsFrontendSettings_optional()) {
586 ALOGW("[ConfigReader] no more dvbs settings");
587 return dvbsSettings;
588 }
589 dvbsSettings.symbolRate = static_cast<uint32_t>(
590 feConfig.getFirstDvbsFrontendSettings_optional()->getSymbolRate());
591 dvbsSettings.inputStreamId = static_cast<uint32_t>(
592 feConfig.getFirstDvbsFrontendSettings_optional()->getInputStreamId());
593 return dvbsSettings;
594 }
595
Amy Zhang1d603672021-04-01 11:55:41 -0700596 static bool readFilterTypeAndSettings(Filter filterConfig, DemuxFilterType& type,
597 DemuxFilterSettings& settings) {
598 auto mainType = filterConfig.getMainType();
599 auto subType = filterConfig.getSubType();
600 uint32_t pid = static_cast<uint32_t>(filterConfig.getPid());
601 switch (mainType) {
602 case FilterMainTypeEnum::TS: {
603 ALOGW("[ConfigReader] filter main type is ts");
604 type.mainType = DemuxFilterMainType::TS;
605 switch (subType) {
606 case FilterSubTypeEnum::UNDEFINED:
607 break;
608 case FilterSubTypeEnum::SECTION:
609 type.subType.tsFilterType(DemuxTsFilterType::SECTION);
610 settings.ts().filterSettings.section(
611 readSectionFilterSettings(filterConfig));
612 break;
613 case FilterSubTypeEnum::PES:
614 // TODO: b/182519645 support all the filter settings
615 /*settings.ts().filterSettings.pesData(
616 getPesFilterSettings(filterConfig));*/
617 type.subType.tsFilterType(DemuxTsFilterType::PES);
618 break;
619 case FilterSubTypeEnum::TS:
620 type.subType.tsFilterType(DemuxTsFilterType::TS);
621 settings.ts().filterSettings.noinit();
622 break;
623 case FilterSubTypeEnum::PCR:
624 type.subType.tsFilterType(DemuxTsFilterType::PCR);
625 settings.ts().filterSettings.noinit();
626 break;
627 case FilterSubTypeEnum::TEMI:
628 type.subType.tsFilterType(DemuxTsFilterType::TEMI);
629 settings.ts().filterSettings.noinit();
630 break;
631 case FilterSubTypeEnum::AUDIO:
632 type.subType.tsFilterType(DemuxTsFilterType::AUDIO);
633 settings.ts().filterSettings.av(readAvFilterSettings(filterConfig));
634 break;
635 case FilterSubTypeEnum::VIDEO:
636 type.subType.tsFilterType(DemuxTsFilterType::VIDEO);
637 settings.ts().filterSettings.av(readAvFilterSettings(filterConfig));
638 break;
639 case FilterSubTypeEnum::RECORD:
640 type.subType.tsFilterType(DemuxTsFilterType::RECORD);
641 settings.ts().filterSettings.record(readRecordFilterSettings(filterConfig));
642 break;
643 default:
644 ALOGW("[ConfigReader] ts subtype is not supported");
645 return false;
646 }
647 settings.ts().tpid = pid;
648 break;
649 }
650 case FilterMainTypeEnum::MMTP: {
651 ALOGW("[ConfigReader] filter main type is mmtp");
652 type.mainType = DemuxFilterMainType::MMTP;
653 switch (subType) {
654 case FilterSubTypeEnum::UNDEFINED:
655 break;
656 case FilterSubTypeEnum::SECTION:
657 type.subType.mmtpFilterType(DemuxMmtpFilterType::SECTION);
658 settings.mmtp().filterSettings.section(
659 readSectionFilterSettings(filterConfig));
660 break;
661 case FilterSubTypeEnum::PES:
662 type.subType.mmtpFilterType(DemuxMmtpFilterType::PES);
663 // TODO: b/182519645 support all the filter settings
664 /*settings.mmtp().filterSettings.pesData(
665 getPesFilterSettings(filterConfig));*/
666 break;
667 case FilterSubTypeEnum::MMTP:
668 type.subType.mmtpFilterType(DemuxMmtpFilterType::MMTP);
669 settings.mmtp().filterSettings.noinit();
670 break;
671 case FilterSubTypeEnum::AUDIO:
672 type.subType.mmtpFilterType(DemuxMmtpFilterType::AUDIO);
673 settings.mmtp().filterSettings.av(readAvFilterSettings(filterConfig));
674 break;
675 case FilterSubTypeEnum::VIDEO:
676 settings.mmtp().filterSettings.av(readAvFilterSettings(filterConfig));
677 break;
678 case FilterSubTypeEnum::RECORD:
679 type.subType.mmtpFilterType(DemuxMmtpFilterType::RECORD);
680 settings.mmtp().filterSettings.record(
681 readRecordFilterSettings(filterConfig));
682 break;
683 case FilterSubTypeEnum::DOWNLOAD:
684 type.subType.mmtpFilterType(DemuxMmtpFilterType::DOWNLOAD);
685 // TODO: b/182519645 support all the filter settings
686 /*settings.mmtp().filterSettings.download(
687 getDownloadFilterSettings(filterConfig));*/
688 break;
689 default:
690 ALOGW("[ConfigReader] mmtp subtype is not supported");
691 return false;
692 }
693 settings.mmtp().mmtpPid = pid;
694 break;
695 }
696 default:
697 // TODO: b/182519645 support all the filter configs
698 ALOGW("[ConfigReader] filter main type is not supported in dynamic config");
699 return false;
700 }
701 return true;
702 }
703
704 static DemuxFilterSectionSettings readSectionFilterSettings(Filter filterConfig) {
705 DemuxFilterSectionSettings settings;
706 if (!filterConfig.hasSectionFilterSettings_optional()) {
707 return settings;
708 }
709 auto section = filterConfig.getFirstSectionFilterSettings_optional();
710 settings.isCheckCrc = section->getIsCheckCrc();
711 settings.isRepeat = section->getIsRepeat();
712 settings.isRaw = section->getIsRaw();
713 return settings;
714 }
715
716 static DemuxFilterAvSettings readAvFilterSettings(Filter filterConfig) {
717 DemuxFilterAvSettings settings;
718 if (!filterConfig.hasAvFilterSettings_optional()) {
719 return settings;
720 }
721 auto av = filterConfig.getFirstAvFilterSettings_optional();
722 settings.isPassthrough = av->getIsPassthrough();
723 return settings;
724 }
725
726 static DemuxFilterRecordSettings readRecordFilterSettings(Filter filterConfig) {
727 DemuxFilterRecordSettings settings;
728 if (!filterConfig.hasRecordFilterSettings_optional()) {
729 return settings;
730 }
731 auto record = filterConfig.getFirstRecordFilterSettings_optional();
732 settings.tsIndexMask = static_cast<uint32_t>(record->getTsIndexMask());
733 settings.scIndexType = static_cast<DemuxRecordScIndexType>(record->getScIndexType());
734 return settings;
735 }
736
Amy Zhang131d5302021-03-30 15:56:02 -0700737 static PlaybackSettings readPlaybackSettings(Dvr dvrConfig) {
738 ALOGW("[ConfigReader] dvr type is playback");
739 PlaybackSettings playbackSettings{
740 .statusMask = static_cast<uint8_t>(dvrConfig.getStatusMask()),
741 .lowThreshold = static_cast<uint32_t>(dvrConfig.getLowThreshold()),
742 .highThreshold = static_cast<uint32_t>(dvrConfig.getHighThreshold()),
743 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
744 .packetSize = static_cast<uint8_t>(dvrConfig.getPacketSize()),
745 };
746 return playbackSettings;
747 }
748
749 static RecordSettings readRecordSettings(Dvr dvrConfig) {
750 ALOGW("[ConfigReader] dvr type is record");
751 RecordSettings recordSettings{
752 .statusMask = static_cast<uint8_t>(dvrConfig.getStatusMask()),
753 .lowThreshold = static_cast<uint32_t>(dvrConfig.getLowThreshold()),
754 .highThreshold = static_cast<uint32_t>(dvrConfig.getHighThreshold()),
755 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
756 .packetSize = static_cast<uint8_t>(dvrConfig.getPacketSize()),
757 };
758 return recordSettings;
759 }
760
Amy Zhangc1789912021-03-30 13:44:43 -0700761 static TunerConfiguration getTunerConfig() { return *read(configFilePath.c_str()); }
762
763 static HardwareConfiguration getHardwareConfig() {
764 return *getTunerConfig().getFirstHardwareConfiguration();
765 }
766
767 static DataFlowConfiguration getDataFlowConfiguration() {
768 return *getTunerConfig().getFirstDataFlowConfiguration();
769 }
770};