blob: bc35ac4128d359e328e9673d237813a72d438093 [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
69struct FrontendConfig {
70 bool isSoftwareFe;
71 FrontendType type;
72 FrontendSettings settings;
73 vector<FrontendStatusType> tuneStatusTypes;
74 vector<FrontendStatus> expectTuneStatuses;
75};
76
Amy Zhang2ea2fe22021-04-01 11:55:41 -070077struct FilterConfig {
78 uint32_t bufferSize;
79 DemuxFilterType type;
80 DemuxFilterSettings settings;
81 bool getMqDesc;
82
83 bool operator<(const FilterConfig& /*c*/) const { return false; }
84};
85
Amy Zhange50f08d2021-03-30 15:56:02 -070086struct DvrConfig {
87 DvrType type;
88 uint32_t bufferSize;
89 DvrSettings settings;
90 string playbackInputFile;
91};
92
Amy Zhangc0e9a112021-04-01 19:25:21 -070093struct LnbConfig {
94 string name;
95 LnbVoltage voltage;
96 LnbTone tone;
97 LnbPosition position;
98};
99
100struct TimeFilterConfig {
101 uint64_t timeStamp;
102};
103
Amy Zhange6915052021-03-30 13:44:43 -0700104struct LiveBroadcastHardwareConnections {
105 string frontendId;
Amy Zhange50f08d2021-03-30 15:56:02 -0700106 string dvrSoftwareFeId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700107 string audioFilterId;
Amy Zhange6915052021-03-30 13:44:43 -0700108 string videoFilterId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700109 string sectionFilterId;
110 string pcrFilterId;
111 /* list string of extra filters; */
Amy Zhange6915052021-03-30 13:44:43 -0700112};
113
114struct ScanHardwareConnections {
115 string frontendId;
116};
117
Amy Zhange50f08d2021-03-30 15:56:02 -0700118struct DvrPlaybackHardwareConnections {
119 bool support;
120 string frontendId;
121 string dvrId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700122 string audioFilterId;
Amy Zhange50f08d2021-03-30 15:56:02 -0700123 string videoFilterId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700124 string sectionFilterId;
125 /* list string of extra filters; */
Amy Zhange50f08d2021-03-30 15:56:02 -0700126};
127
Amy Zhange6915052021-03-30 13:44:43 -0700128struct DvrRecordHardwareConnections {
129 bool support;
130 string frontendId;
Amy Zhange50f08d2021-03-30 15:56:02 -0700131 string dvrRecordId;
132 string dvrSoftwareFeId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700133 string recordFilterId;
Amy Zhange6915052021-03-30 13:44:43 -0700134};
135
136struct DescramblingHardwareConnections {
137 bool support;
138 string frontendId;
Amy Zhange50f08d2021-03-30 15:56:02 -0700139 string dvrSoftwareFeId;
Amy Zhange6915052021-03-30 13:44:43 -0700140 string audioFilterId;
141 string videoFilterId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700142 /* string descramblerId;
Amy Zhange6915052021-03-30 13:44:43 -0700143 list string of extra filters; */
144};
145
146struct LnbLiveHardwareConnections {
147 bool support;
148 string frontendId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700149 string audioFilterId;
Amy Zhange6915052021-03-30 13:44:43 -0700150 string videoFilterId;
Amy Zhangc0e9a112021-04-01 19:25:21 -0700151 string lnbId;
152 vector<string> diseqcMsgs;
153 /* list string of extra filters; */
Amy Zhange6915052021-03-30 13:44:43 -0700154};
155
156struct LnbRecordHardwareConnections {
157 bool support;
158 string frontendId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700159 string dvrRecordId;
160 string recordFilterId;
Amy Zhangc0e9a112021-04-01 19:25:21 -0700161 string lnbId;
162 vector<string> diseqcMsgs;
163 /* list string of extra filters; */
164};
165
166struct TimeFilterHardwareConnections {
167 bool support;
168 string timeFilterId;
Amy Zhange6915052021-03-30 13:44:43 -0700169};
170
171struct TunerTestingConfigReader {
172 public:
173 static bool checkConfigFileExists() {
174 auto res = read(configFilePath.c_str());
175 if (res == nullopt) {
176 ALOGW("[ConfigReader] Couldn't read /vendor/etc/tuner_vts_config.xml."
177 "Please check tuner_testing_dynamic_configuration.xsd"
178 "and sample_tuner_vts_config.xml for more details on how to config Tune VTS.");
179 }
180 return (res != nullopt);
181 }
182
183 static void readFrontendConfig1_0(map<string, FrontendConfig>& frontendMap) {
184 auto hardwareConfig = getHardwareConfig();
185 if (hardwareConfig.hasFrontends()) {
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700186 // TODO: b/182519645 complete the tune status config
Amy Zhange6915052021-03-30 13:44:43 -0700187 vector<FrontendStatusType> types;
188 types.push_back(FrontendStatusType::DEMOD_LOCK);
189 FrontendStatus status;
190 status.isDemodLocked(true);
191 vector<FrontendStatus> statuses;
192 statuses.push_back(status);
193
194 auto frontends = *hardwareConfig.getFirstFrontends();
195 for (auto feConfig : frontends.getFrontend()) {
196 string id = feConfig.getId();
197 if (id.compare(string("FE_DEFAULT")) == 0) {
198 // overrid default
199 frontendMap.erase(string("FE_DEFAULT"));
200 }
201 FrontendType type;
202 switch (feConfig.getType()) {
203 case FrontendTypeEnum::UNDEFINED:
204 type = FrontendType::UNDEFINED;
205 break;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700206 // TODO: b/182519645 finish all other frontend settings
Amy Zhange6915052021-03-30 13:44:43 -0700207 case FrontendTypeEnum::ANALOG:
208 type = FrontendType::ANALOG;
209 break;
210 case FrontendTypeEnum::ATSC:
211 type = FrontendType::ATSC;
212 break;
213 case FrontendTypeEnum::ATSC3:
214 type = FrontendType::ATSC3;
215 break;
216 case FrontendTypeEnum::DVBC:
217 type = FrontendType::DVBC;
218 break;
219 case FrontendTypeEnum::DVBS:
220 type = FrontendType::DVBS;
221 frontendMap[id].settings.dvbs(readDvbsFrontendSettings(feConfig));
222 break;
223 case FrontendTypeEnum::DVBT: {
224 type = FrontendType::DVBT;
225 frontendMap[id].settings.dvbt(readDvbtFrontendSettings(feConfig));
226 break;
227 }
228 case FrontendTypeEnum::ISDBS:
229 type = FrontendType::ISDBS;
230 break;
231 case FrontendTypeEnum::ISDBS3:
232 type = FrontendType::ISDBS3;
233 break;
234 case FrontendTypeEnum::ISDBT:
235 type = FrontendType::ISDBT;
236 break;
237 case FrontendTypeEnum::DTMB:
238 // dtmb will be handled in readFrontendConfig1_1;
239 continue;
240 case FrontendTypeEnum::UNKNOWN:
241 ALOGW("[ConfigReader] invalid frontend type");
242 return;
243 }
244 frontendMap[id].type = type;
245 frontendMap[id].isSoftwareFe = feConfig.getIsSoftwareFrontend();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700246 // TODO: b/182519645 complete the tune status config
Amy Zhange6915052021-03-30 13:44:43 -0700247 frontendMap[id].tuneStatusTypes = types;
248 frontendMap[id].expectTuneStatuses = statuses;
249 }
250 }
251 }
252
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700253 static void readFilterConfig1_0(map<string, FilterConfig>& filterMap) {
254 auto hardwareConfig = getHardwareConfig();
255 if (hardwareConfig.hasFilters()) {
256 auto filters = *hardwareConfig.getFirstFilters();
257 for (auto filterConfig : filters.getFilter()) {
258 string id = filterConfig.getId();
259 if (id.compare(string("FILTER_AUDIO_DEFAULT")) == 0) {
260 // overrid default
261 filterMap.erase(string("FILTER_AUDIO_DEFAULT"));
262 }
263 if (id.compare(string("FILTER_VIDEO_DEFAULT")) == 0) {
264 // overrid default
265 filterMap.erase(string("FILTER_VIDEO_DEFAULT"));
266 }
267
268 DemuxFilterType type;
269 DemuxFilterSettings settings;
270 if (!readFilterTypeAndSettings(filterConfig, type, settings)) {
271 ALOGW("[ConfigReader] invalid filter type");
272 return;
273 }
274 filterMap[id].type = type;
275 filterMap[id].bufferSize = filterConfig.getBufferSize();
276 filterMap[id].getMqDesc = filterConfig.getUseFMQ();
277 filterMap[id].settings = settings;
278 }
279 }
280 }
281
Amy Zhange50f08d2021-03-30 15:56:02 -0700282 static void readDvrConfig1_0(map<string, DvrConfig>& dvrMap) {
283 auto hardwareConfig = getHardwareConfig();
284 if (hardwareConfig.hasDvrs()) {
285 auto dvrs = *hardwareConfig.getFirstDvrs();
286 for (auto dvrConfig : dvrs.getDvr()) {
287 string id = dvrConfig.getId();
288 DvrType type;
289 switch (dvrConfig.getType()) {
290 case DvrTypeEnum::PLAYBACK:
291 type = DvrType::PLAYBACK;
292 dvrMap[id].settings.playback(readPlaybackSettings(dvrConfig));
293 break;
294 case DvrTypeEnum::RECORD:
295 type = DvrType::RECORD;
296 dvrMap[id].settings.record(readRecordSettings(dvrConfig));
297 break;
298 case DvrTypeEnum::UNKNOWN:
299 ALOGW("[ConfigReader] invalid DVR type");
300 return;
301 }
302 dvrMap[id].type = type;
303 dvrMap[id].bufferSize = static_cast<uint32_t>(dvrConfig.getBufferSize());
304 if (dvrConfig.hasInputFilePath()) {
305 dvrMap[id].playbackInputFile = dvrConfig.getInputFilePath();
306 }
307 }
308 }
309 }
310
Amy Zhangc0e9a112021-04-01 19:25:21 -0700311 static void readLnbConfig1_0(map<string, LnbConfig>& lnbMap) {
312 auto hardwareConfig = getHardwareConfig();
313 if (hardwareConfig.hasLnbs()) {
314 auto lnbs = *hardwareConfig.getFirstLnbs();
315 for (auto lnbConfig : lnbs.getLnb()) {
316 string id = lnbConfig.getId();
317 if (lnbConfig.hasName()) {
318 lnbMap[id].name = lnbConfig.getName();
319 } else {
320 lnbMap[id].name = emptyHardwareId;
321 }
322 lnbMap[id].voltage = static_cast<LnbVoltage>(lnbConfig.getVoltage());
323 lnbMap[id].tone = static_cast<LnbTone>(lnbConfig.getTone());
324 lnbMap[id].position = static_cast<LnbPosition>(lnbConfig.getPosition());
325 }
326 }
327 }
328
329 static void readDiseqcMessages(map<string, vector<uint8_t>>& diseqcMsgMap) {
330 auto hardwareConfig = getHardwareConfig();
331 if (hardwareConfig.hasDiseqcMessages()) {
332 auto msgs = *hardwareConfig.getFirstDiseqcMessages();
333 for (auto msgConfig : msgs.getDiseqcMessage()) {
334 string name = msgConfig.getMsgName();
335 for (uint8_t atom : msgConfig.getMsgBody()) {
336 diseqcMsgMap[name].push_back(atom);
337 }
338 }
339 }
340 }
341
342 static void readTimeFilterConfig1_0(map<string, TimeFilterConfig>& timeFilterMap) {
343 auto hardwareConfig = getHardwareConfig();
344 if (hardwareConfig.hasTimeFilters()) {
345 auto timeFilters = *hardwareConfig.getFirstTimeFilters();
346 for (auto timeFilterConfig : timeFilters.getTimeFilter()) {
347 string id = timeFilterConfig.getId();
348 timeFilterMap[id].timeStamp =
349 static_cast<uint64_t>(timeFilterConfig.getTimeStamp());
350 }
351 }
352 }
353
Amy Zhange6915052021-03-30 13:44:43 -0700354 static void connectLiveBroadcast(LiveBroadcastHardwareConnections& live) {
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700355 auto liveConfig = *getDataFlowConfiguration().getFirstClearLiveBroadcast();
356 live.frontendId = liveConfig.getFrontendConnection();
357
358 live.audioFilterId = liveConfig.getAudioFilterConnection();
359 live.videoFilterId = liveConfig.getVideoFilterConnection();
360 if (liveConfig.hasPcrFilterConnection()) {
361 live.pcrFilterId = liveConfig.getPcrFilterConnection();
362 } else {
363 live.pcrFilterId = emptyHardwareId;
364 }
365 if (liveConfig.hasSectionFilterConnection()) {
366 live.sectionFilterId = liveConfig.getSectionFilterConnection();
367 } else {
368 live.sectionFilterId = emptyHardwareId;
369 }
370 if (liveConfig.hasDvrSoftwareFeConnection()) {
371 live.dvrSoftwareFeId = liveConfig.getDvrSoftwareFeConnection();
Amy Zhange50f08d2021-03-30 15:56:02 -0700372 }
Amy Zhange6915052021-03-30 13:44:43 -0700373 }
374
375 static void connectScan(ScanHardwareConnections& scan) {
376 auto scanConfig = getDataFlowConfiguration().getFirstScan();
377 scan.frontendId = scanConfig->getFrontendConnection();
378 }
379
Amy Zhange50f08d2021-03-30 15:56:02 -0700380 static void connectDvrPlayback(DvrPlaybackHardwareConnections& playback) {
381 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700382 if (dataFlow.hasDvrPlayback()) {
383 playback.support = true;
384 } else {
Amy Zhange50f08d2021-03-30 15:56:02 -0700385 return;
386 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700387 auto playbackConfig = *dataFlow.getFirstDvrPlayback();
388 playback.dvrId = playbackConfig.getDvrConnection();
389 playback.audioFilterId = playbackConfig.getAudioFilterConnection();
390 playback.videoFilterId = playbackConfig.getVideoFilterConnection();
391 if (playbackConfig.hasSectionFilterConnection()) {
392 playback.sectionFilterId = playbackConfig.getSectionFilterConnection();
393 } else {
394 playback.sectionFilterId = emptyHardwareId;
395 }
Amy Zhange50f08d2021-03-30 15:56:02 -0700396 }
397
Amy Zhange6915052021-03-30 13:44:43 -0700398 static void connectDvrRecord(DvrRecordHardwareConnections& record) {
399 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700400 if (dataFlow.hasDvrRecord()) {
401 record.support = true;
402 } else {
Amy Zhange6915052021-03-30 13:44:43 -0700403 return;
404 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700405 auto recordConfig = *dataFlow.getFirstDvrRecord();
406 record.frontendId = recordConfig.getFrontendConnection();
407 record.recordFilterId = recordConfig.getRecordFilterConnection();
408 record.dvrRecordId = recordConfig.getDvrRecordConnection();
409 if (recordConfig.hasDvrSoftwareFeConnection()) {
410 record.dvrSoftwareFeId = recordConfig.getDvrSoftwareFeConnection();
Amy Zhange50f08d2021-03-30 15:56:02 -0700411 }
Amy Zhange6915052021-03-30 13:44:43 -0700412 }
413
414 static void connectDescrambling(DescramblingHardwareConnections& descrambling) {
415 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700416 if (dataFlow.hasDescrambling()) {
417 descrambling.support = true;
418 } else {
Amy Zhange6915052021-03-30 13:44:43 -0700419 return;
420 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700421 auto descConfig = *dataFlow.getFirstDescrambling();
422 descrambling.frontendId = descConfig.getFrontendConnection();
423 descrambling.audioFilterId = descConfig.getAudioFilterConnection();
424 descrambling.videoFilterId = descConfig.getVideoFilterConnection();
425 if (descConfig.hasDvrSoftwareFeConnection()) {
426 descrambling.dvrSoftwareFeId = descConfig.getDvrSoftwareFeConnection();
Amy Zhange50f08d2021-03-30 15:56:02 -0700427 }
Amy Zhange6915052021-03-30 13:44:43 -0700428 }
429
430 static void connectLnbLive(LnbLiveHardwareConnections& lnbLive) {
431 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700432 if (dataFlow.hasLnbLive()) {
433 lnbLive.support = true;
434 } else {
Amy Zhange6915052021-03-30 13:44:43 -0700435 return;
436 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700437 auto lnbLiveConfig = *dataFlow.getFirstLnbLive();
438 lnbLive.frontendId = lnbLiveConfig.getFrontendConnection();
439 lnbLive.audioFilterId = lnbLiveConfig.getAudioFilterConnection();
440 lnbLive.videoFilterId = lnbLiveConfig.getVideoFilterConnection();
Amy Zhangc0e9a112021-04-01 19:25:21 -0700441 lnbLive.lnbId = lnbLiveConfig.getLnbConnection();
442 if (lnbLiveConfig.hasDiseqcMsgSender()) {
443 for (auto msgName : lnbLiveConfig.getDiseqcMsgSender()) {
444 lnbLive.diseqcMsgs.push_back(msgName);
445 }
446 }
Amy Zhange6915052021-03-30 13:44:43 -0700447 }
448
449 static void connectLnbRecord(LnbRecordHardwareConnections& lnbRecord) {
450 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700451 if (dataFlow.hasLnbRecord()) {
452 lnbRecord.support = true;
453 } else {
Amy Zhange6915052021-03-30 13:44:43 -0700454 return;
455 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700456 auto lnbRecordConfig = *dataFlow.getFirstLnbRecord();
457 lnbRecord.frontendId = lnbRecordConfig.getFrontendConnection();
458 lnbRecord.recordFilterId = lnbRecordConfig.getRecordFilterConnection();
459 lnbRecord.dvrRecordId = lnbRecordConfig.getDvrRecordConnection();
Amy Zhangc0e9a112021-04-01 19:25:21 -0700460 lnbRecord.lnbId = lnbRecordConfig.getLnbConnection();
461 if (lnbRecordConfig.hasDiseqcMsgSender()) {
462 for (auto msgName : lnbRecordConfig.getDiseqcMsgSender()) {
463 lnbRecord.diseqcMsgs.push_back(msgName);
464 }
465 }
466 }
467
468 static void connectTimeFilter(TimeFilterHardwareConnections& timeFilter) {
469 auto dataFlow = getDataFlowConfiguration();
470 if (dataFlow.hasTimeFilter()) {
471 timeFilter.support = true;
472 } else {
473 return;
474 }
475 auto timeFilterConfig = *dataFlow.getFirstTimeFilter();
476 timeFilter.timeFilterId = timeFilterConfig.getTimeFilterConnection();
Amy Zhange6915052021-03-30 13:44:43 -0700477 }
478
479 private:
480 static FrontendDvbtSettings readDvbtFrontendSettings(Frontend feConfig) {
Amy Zhange50f08d2021-03-30 15:56:02 -0700481 ALOGW("[ConfigReader] fe type is dvbt");
Amy Zhange6915052021-03-30 13:44:43 -0700482 FrontendDvbtSettings dvbtSettings{
483 .frequency = (uint32_t)feConfig.getFrequency(),
484 };
485 if (!feConfig.hasDvbtFrontendSettings_optional()) {
486 ALOGW("[ConfigReader] no more dvbt settings");
487 return dvbtSettings;
488 }
489 dvbtSettings.transmissionMode = static_cast<FrontendDvbtTransmissionMode>(
490 feConfig.getFirstDvbtFrontendSettings_optional()->getTransmissionMode());
491 dvbtSettings.bandwidth = static_cast<FrontendDvbtBandwidth>(
492 feConfig.getFirstDvbtFrontendSettings_optional()->getBandwidth());
493 dvbtSettings.isHighPriority =
494 feConfig.getFirstDvbtFrontendSettings_optional()->getIsHighPriority();
495 return dvbtSettings;
496 }
497
498 static FrontendDvbsSettings readDvbsFrontendSettings(Frontend feConfig) {
Amy Zhange50f08d2021-03-30 15:56:02 -0700499 ALOGW("[ConfigReader] fe type is dvbs");
Amy Zhange6915052021-03-30 13:44:43 -0700500 FrontendDvbsSettings dvbsSettings{
501 .frequency = (uint32_t)feConfig.getFrequency(),
502 };
503 if (!feConfig.hasDvbsFrontendSettings_optional()) {
504 ALOGW("[ConfigReader] no more dvbs settings");
505 return dvbsSettings;
506 }
507 dvbsSettings.symbolRate = static_cast<uint32_t>(
508 feConfig.getFirstDvbsFrontendSettings_optional()->getSymbolRate());
509 dvbsSettings.inputStreamId = static_cast<uint32_t>(
510 feConfig.getFirstDvbsFrontendSettings_optional()->getInputStreamId());
511 return dvbsSettings;
512 }
513
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700514 static bool readFilterTypeAndSettings(Filter filterConfig, DemuxFilterType& type,
515 DemuxFilterSettings& settings) {
516 auto mainType = filterConfig.getMainType();
517 auto subType = filterConfig.getSubType();
518 uint32_t pid = static_cast<uint32_t>(filterConfig.getPid());
519 switch (mainType) {
520 case FilterMainTypeEnum::TS: {
521 ALOGW("[ConfigReader] filter main type is ts");
522 type.mainType = DemuxFilterMainType::TS;
523 switch (subType) {
524 case FilterSubTypeEnum::UNDEFINED:
525 break;
526 case FilterSubTypeEnum::SECTION:
527 type.subType.tsFilterType(DemuxTsFilterType::SECTION);
528 settings.ts().filterSettings.section(
529 readSectionFilterSettings(filterConfig));
530 break;
531 case FilterSubTypeEnum::PES:
532 // TODO: b/182519645 support all the filter settings
533 /*settings.ts().filterSettings.pesData(
534 getPesFilterSettings(filterConfig));*/
535 type.subType.tsFilterType(DemuxTsFilterType::PES);
536 break;
537 case FilterSubTypeEnum::TS:
538 type.subType.tsFilterType(DemuxTsFilterType::TS);
539 settings.ts().filterSettings.noinit();
540 break;
541 case FilterSubTypeEnum::PCR:
542 type.subType.tsFilterType(DemuxTsFilterType::PCR);
543 settings.ts().filterSettings.noinit();
544 break;
545 case FilterSubTypeEnum::TEMI:
546 type.subType.tsFilterType(DemuxTsFilterType::TEMI);
547 settings.ts().filterSettings.noinit();
548 break;
549 case FilterSubTypeEnum::AUDIO:
550 type.subType.tsFilterType(DemuxTsFilterType::AUDIO);
551 settings.ts().filterSettings.av(readAvFilterSettings(filterConfig));
552 break;
553 case FilterSubTypeEnum::VIDEO:
554 type.subType.tsFilterType(DemuxTsFilterType::VIDEO);
555 settings.ts().filterSettings.av(readAvFilterSettings(filterConfig));
556 break;
557 case FilterSubTypeEnum::RECORD:
558 type.subType.tsFilterType(DemuxTsFilterType::RECORD);
559 settings.ts().filterSettings.record(readRecordFilterSettings(filterConfig));
560 break;
561 default:
562 ALOGW("[ConfigReader] ts subtype is not supported");
563 return false;
564 }
565 settings.ts().tpid = pid;
566 break;
567 }
568 case FilterMainTypeEnum::MMTP: {
569 ALOGW("[ConfigReader] filter main type is mmtp");
570 type.mainType = DemuxFilterMainType::MMTP;
571 switch (subType) {
572 case FilterSubTypeEnum::UNDEFINED:
573 break;
574 case FilterSubTypeEnum::SECTION:
575 type.subType.mmtpFilterType(DemuxMmtpFilterType::SECTION);
576 settings.mmtp().filterSettings.section(
577 readSectionFilterSettings(filterConfig));
578 break;
579 case FilterSubTypeEnum::PES:
580 type.subType.mmtpFilterType(DemuxMmtpFilterType::PES);
581 // TODO: b/182519645 support all the filter settings
582 /*settings.mmtp().filterSettings.pesData(
583 getPesFilterSettings(filterConfig));*/
584 break;
585 case FilterSubTypeEnum::MMTP:
586 type.subType.mmtpFilterType(DemuxMmtpFilterType::MMTP);
587 settings.mmtp().filterSettings.noinit();
588 break;
589 case FilterSubTypeEnum::AUDIO:
590 type.subType.mmtpFilterType(DemuxMmtpFilterType::AUDIO);
591 settings.mmtp().filterSettings.av(readAvFilterSettings(filterConfig));
592 break;
593 case FilterSubTypeEnum::VIDEO:
594 settings.mmtp().filterSettings.av(readAvFilterSettings(filterConfig));
595 break;
596 case FilterSubTypeEnum::RECORD:
597 type.subType.mmtpFilterType(DemuxMmtpFilterType::RECORD);
598 settings.mmtp().filterSettings.record(
599 readRecordFilterSettings(filterConfig));
600 break;
601 case FilterSubTypeEnum::DOWNLOAD:
602 type.subType.mmtpFilterType(DemuxMmtpFilterType::DOWNLOAD);
603 // TODO: b/182519645 support all the filter settings
604 /*settings.mmtp().filterSettings.download(
605 getDownloadFilterSettings(filterConfig));*/
606 break;
607 default:
608 ALOGW("[ConfigReader] mmtp subtype is not supported");
609 return false;
610 }
611 settings.mmtp().mmtpPid = pid;
612 break;
613 }
614 default:
615 // TODO: b/182519645 support all the filter configs
616 ALOGW("[ConfigReader] filter main type is not supported in dynamic config");
617 return false;
618 }
619 return true;
620 }
621
622 static DemuxFilterSectionSettings readSectionFilterSettings(Filter filterConfig) {
623 DemuxFilterSectionSettings settings;
624 if (!filterConfig.hasSectionFilterSettings_optional()) {
625 return settings;
626 }
627 auto section = filterConfig.getFirstSectionFilterSettings_optional();
628 settings.isCheckCrc = section->getIsCheckCrc();
629 settings.isRepeat = section->getIsRepeat();
630 settings.isRaw = section->getIsRaw();
631 return settings;
632 }
633
634 static DemuxFilterAvSettings readAvFilterSettings(Filter filterConfig) {
635 DemuxFilterAvSettings settings;
636 if (!filterConfig.hasAvFilterSettings_optional()) {
637 return settings;
638 }
639 auto av = filterConfig.getFirstAvFilterSettings_optional();
640 settings.isPassthrough = av->getIsPassthrough();
641 return settings;
642 }
643
644 static DemuxFilterRecordSettings readRecordFilterSettings(Filter filterConfig) {
645 DemuxFilterRecordSettings settings;
646 if (!filterConfig.hasRecordFilterSettings_optional()) {
647 return settings;
648 }
649 auto record = filterConfig.getFirstRecordFilterSettings_optional();
650 settings.tsIndexMask = static_cast<uint32_t>(record->getTsIndexMask());
651 settings.scIndexType = static_cast<DemuxRecordScIndexType>(record->getScIndexType());
652 return settings;
653 }
654
Amy Zhange50f08d2021-03-30 15:56:02 -0700655 static PlaybackSettings readPlaybackSettings(Dvr dvrConfig) {
656 ALOGW("[ConfigReader] dvr type is playback");
657 PlaybackSettings playbackSettings{
658 .statusMask = static_cast<uint8_t>(dvrConfig.getStatusMask()),
659 .lowThreshold = static_cast<uint32_t>(dvrConfig.getLowThreshold()),
660 .highThreshold = static_cast<uint32_t>(dvrConfig.getHighThreshold()),
661 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
662 .packetSize = static_cast<uint8_t>(dvrConfig.getPacketSize()),
663 };
664 return playbackSettings;
665 }
666
667 static RecordSettings readRecordSettings(Dvr dvrConfig) {
668 ALOGW("[ConfigReader] dvr type is record");
669 RecordSettings recordSettings{
670 .statusMask = static_cast<uint8_t>(dvrConfig.getStatusMask()),
671 .lowThreshold = static_cast<uint32_t>(dvrConfig.getLowThreshold()),
672 .highThreshold = static_cast<uint32_t>(dvrConfig.getHighThreshold()),
673 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
674 .packetSize = static_cast<uint8_t>(dvrConfig.getPacketSize()),
675 };
676 return recordSettings;
677 }
678
Amy Zhange6915052021-03-30 13:44:43 -0700679 static TunerConfiguration getTunerConfig() { return *read(configFilePath.c_str()); }
680
681 static HardwareConfiguration getHardwareConfig() {
682 return *getTunerConfig().getFirstHardwareConfiguration();
683 }
684
685 static DataFlowConfiguration getDataFlowConfiguration() {
686 return *getTunerConfig().getFirstDataFlowConfiguration();
687 }
688};