blob: 9ee509c6c19c1f3f7c01754ee43321c1ed3549fc [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 Zhange6915052021-03-30 13:44:43 -070093struct LiveBroadcastHardwareConnections {
94 string frontendId;
Amy Zhange50f08d2021-03-30 15:56:02 -070095 string dvrSoftwareFeId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -070096 string audioFilterId;
Amy Zhange6915052021-03-30 13:44:43 -070097 string videoFilterId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -070098 string sectionFilterId;
99 string pcrFilterId;
100 /* list string of extra filters; */
Amy Zhange6915052021-03-30 13:44:43 -0700101};
102
103struct ScanHardwareConnections {
104 string frontendId;
105};
106
Amy Zhange50f08d2021-03-30 15:56:02 -0700107struct DvrPlaybackHardwareConnections {
108 bool support;
109 string frontendId;
110 string dvrId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700111 string audioFilterId;
Amy Zhange50f08d2021-03-30 15:56:02 -0700112 string videoFilterId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700113 string sectionFilterId;
114 /* list string of extra filters; */
Amy Zhange50f08d2021-03-30 15:56:02 -0700115};
116
Amy Zhange6915052021-03-30 13:44:43 -0700117struct DvrRecordHardwareConnections {
118 bool support;
119 string frontendId;
Amy Zhange50f08d2021-03-30 15:56:02 -0700120 string dvrRecordId;
121 string dvrSoftwareFeId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700122 string recordFilterId;
Amy Zhange6915052021-03-30 13:44:43 -0700123};
124
125struct DescramblingHardwareConnections {
126 bool support;
127 string frontendId;
Amy Zhange50f08d2021-03-30 15:56:02 -0700128 string dvrSoftwareFeId;
Amy Zhange6915052021-03-30 13:44:43 -0700129 string audioFilterId;
130 string videoFilterId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700131 /* string descramblerId;
Amy Zhange6915052021-03-30 13:44:43 -0700132 list string of extra filters; */
133};
134
135struct LnbLiveHardwareConnections {
136 bool support;
137 string frontendId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700138 string audioFilterId;
Amy Zhange6915052021-03-30 13:44:43 -0700139 string videoFilterId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700140 /* list string of extra filters;
Amy Zhange6915052021-03-30 13:44:43 -0700141 string lnbId; */
142};
143
144struct LnbRecordHardwareConnections {
145 bool support;
146 string frontendId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700147 string dvrRecordId;
148 string recordFilterId;
149 /* list string of extra filters;
Amy Zhange6915052021-03-30 13:44:43 -0700150 string lnbId; */
151};
152
153struct TunerTestingConfigReader {
154 public:
155 static bool checkConfigFileExists() {
156 auto res = read(configFilePath.c_str());
157 if (res == nullopt) {
158 ALOGW("[ConfigReader] Couldn't read /vendor/etc/tuner_vts_config.xml."
159 "Please check tuner_testing_dynamic_configuration.xsd"
160 "and sample_tuner_vts_config.xml for more details on how to config Tune VTS.");
161 }
162 return (res != nullopt);
163 }
164
165 static void readFrontendConfig1_0(map<string, FrontendConfig>& frontendMap) {
166 auto hardwareConfig = getHardwareConfig();
167 if (hardwareConfig.hasFrontends()) {
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700168 // TODO: b/182519645 complete the tune status config
Amy Zhange6915052021-03-30 13:44:43 -0700169 vector<FrontendStatusType> types;
170 types.push_back(FrontendStatusType::DEMOD_LOCK);
171 FrontendStatus status;
172 status.isDemodLocked(true);
173 vector<FrontendStatus> statuses;
174 statuses.push_back(status);
175
176 auto frontends = *hardwareConfig.getFirstFrontends();
177 for (auto feConfig : frontends.getFrontend()) {
178 string id = feConfig.getId();
179 if (id.compare(string("FE_DEFAULT")) == 0) {
180 // overrid default
181 frontendMap.erase(string("FE_DEFAULT"));
182 }
183 FrontendType type;
184 switch (feConfig.getType()) {
185 case FrontendTypeEnum::UNDEFINED:
186 type = FrontendType::UNDEFINED;
187 break;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700188 // TODO: b/182519645 finish all other frontend settings
Amy Zhange6915052021-03-30 13:44:43 -0700189 case FrontendTypeEnum::ANALOG:
190 type = FrontendType::ANALOG;
191 break;
192 case FrontendTypeEnum::ATSC:
193 type = FrontendType::ATSC;
194 break;
195 case FrontendTypeEnum::ATSC3:
196 type = FrontendType::ATSC3;
197 break;
198 case FrontendTypeEnum::DVBC:
199 type = FrontendType::DVBC;
200 break;
201 case FrontendTypeEnum::DVBS:
202 type = FrontendType::DVBS;
203 frontendMap[id].settings.dvbs(readDvbsFrontendSettings(feConfig));
204 break;
205 case FrontendTypeEnum::DVBT: {
206 type = FrontendType::DVBT;
207 frontendMap[id].settings.dvbt(readDvbtFrontendSettings(feConfig));
208 break;
209 }
210 case FrontendTypeEnum::ISDBS:
211 type = FrontendType::ISDBS;
212 break;
213 case FrontendTypeEnum::ISDBS3:
214 type = FrontendType::ISDBS3;
215 break;
216 case FrontendTypeEnum::ISDBT:
217 type = FrontendType::ISDBT;
218 break;
219 case FrontendTypeEnum::DTMB:
220 // dtmb will be handled in readFrontendConfig1_1;
221 continue;
222 case FrontendTypeEnum::UNKNOWN:
223 ALOGW("[ConfigReader] invalid frontend type");
224 return;
225 }
226 frontendMap[id].type = type;
227 frontendMap[id].isSoftwareFe = feConfig.getIsSoftwareFrontend();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700228 // TODO: b/182519645 complete the tune status config
Amy Zhange6915052021-03-30 13:44:43 -0700229 frontendMap[id].tuneStatusTypes = types;
230 frontendMap[id].expectTuneStatuses = statuses;
231 }
232 }
233 }
234
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700235 static void readFilterConfig1_0(map<string, FilterConfig>& filterMap) {
236 auto hardwareConfig = getHardwareConfig();
237 if (hardwareConfig.hasFilters()) {
238 auto filters = *hardwareConfig.getFirstFilters();
239 for (auto filterConfig : filters.getFilter()) {
240 string id = filterConfig.getId();
241 if (id.compare(string("FILTER_AUDIO_DEFAULT")) == 0) {
242 // overrid default
243 filterMap.erase(string("FILTER_AUDIO_DEFAULT"));
244 }
245 if (id.compare(string("FILTER_VIDEO_DEFAULT")) == 0) {
246 // overrid default
247 filterMap.erase(string("FILTER_VIDEO_DEFAULT"));
248 }
249
250 DemuxFilterType type;
251 DemuxFilterSettings settings;
252 if (!readFilterTypeAndSettings(filterConfig, type, settings)) {
253 ALOGW("[ConfigReader] invalid filter type");
254 return;
255 }
256 filterMap[id].type = type;
257 filterMap[id].bufferSize = filterConfig.getBufferSize();
258 filterMap[id].getMqDesc = filterConfig.getUseFMQ();
259 filterMap[id].settings = settings;
260 }
261 }
262 }
263
Amy Zhange50f08d2021-03-30 15:56:02 -0700264 static void readDvrConfig1_0(map<string, DvrConfig>& dvrMap) {
265 auto hardwareConfig = getHardwareConfig();
266 if (hardwareConfig.hasDvrs()) {
267 auto dvrs = *hardwareConfig.getFirstDvrs();
268 for (auto dvrConfig : dvrs.getDvr()) {
269 string id = dvrConfig.getId();
270 DvrType type;
271 switch (dvrConfig.getType()) {
272 case DvrTypeEnum::PLAYBACK:
273 type = DvrType::PLAYBACK;
274 dvrMap[id].settings.playback(readPlaybackSettings(dvrConfig));
275 break;
276 case DvrTypeEnum::RECORD:
277 type = DvrType::RECORD;
278 dvrMap[id].settings.record(readRecordSettings(dvrConfig));
279 break;
280 case DvrTypeEnum::UNKNOWN:
281 ALOGW("[ConfigReader] invalid DVR type");
282 return;
283 }
284 dvrMap[id].type = type;
285 dvrMap[id].bufferSize = static_cast<uint32_t>(dvrConfig.getBufferSize());
286 if (dvrConfig.hasInputFilePath()) {
287 dvrMap[id].playbackInputFile = dvrConfig.getInputFilePath();
288 }
289 }
290 }
291 }
292
Amy Zhange6915052021-03-30 13:44:43 -0700293 static void connectLiveBroadcast(LiveBroadcastHardwareConnections& live) {
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700294 auto liveConfig = *getDataFlowConfiguration().getFirstClearLiveBroadcast();
295 live.frontendId = liveConfig.getFrontendConnection();
296
297 live.audioFilterId = liveConfig.getAudioFilterConnection();
298 live.videoFilterId = liveConfig.getVideoFilterConnection();
299 if (liveConfig.hasPcrFilterConnection()) {
300 live.pcrFilterId = liveConfig.getPcrFilterConnection();
301 } else {
302 live.pcrFilterId = emptyHardwareId;
303 }
304 if (liveConfig.hasSectionFilterConnection()) {
305 live.sectionFilterId = liveConfig.getSectionFilterConnection();
306 } else {
307 live.sectionFilterId = emptyHardwareId;
308 }
309 if (liveConfig.hasDvrSoftwareFeConnection()) {
310 live.dvrSoftwareFeId = liveConfig.getDvrSoftwareFeConnection();
Amy Zhange50f08d2021-03-30 15:56:02 -0700311 }
Amy Zhange6915052021-03-30 13:44:43 -0700312 }
313
314 static void connectScan(ScanHardwareConnections& scan) {
315 auto scanConfig = getDataFlowConfiguration().getFirstScan();
316 scan.frontendId = scanConfig->getFrontendConnection();
317 }
318
Amy Zhange50f08d2021-03-30 15:56:02 -0700319 static void connectDvrPlayback(DvrPlaybackHardwareConnections& playback) {
320 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700321 if (dataFlow.hasDvrPlayback()) {
322 playback.support = true;
323 } else {
Amy Zhange50f08d2021-03-30 15:56:02 -0700324 return;
325 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700326 auto playbackConfig = *dataFlow.getFirstDvrPlayback();
327 playback.dvrId = playbackConfig.getDvrConnection();
328 playback.audioFilterId = playbackConfig.getAudioFilterConnection();
329 playback.videoFilterId = playbackConfig.getVideoFilterConnection();
330 if (playbackConfig.hasSectionFilterConnection()) {
331 playback.sectionFilterId = playbackConfig.getSectionFilterConnection();
332 } else {
333 playback.sectionFilterId = emptyHardwareId;
334 }
Amy Zhange50f08d2021-03-30 15:56:02 -0700335 }
336
Amy Zhange6915052021-03-30 13:44:43 -0700337 static void connectDvrRecord(DvrRecordHardwareConnections& record) {
338 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700339 if (dataFlow.hasDvrRecord()) {
340 record.support = true;
341 } else {
Amy Zhange6915052021-03-30 13:44:43 -0700342 return;
343 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700344 auto recordConfig = *dataFlow.getFirstDvrRecord();
345 record.frontendId = recordConfig.getFrontendConnection();
346 record.recordFilterId = recordConfig.getRecordFilterConnection();
347 record.dvrRecordId = recordConfig.getDvrRecordConnection();
348 if (recordConfig.hasDvrSoftwareFeConnection()) {
349 record.dvrSoftwareFeId = recordConfig.getDvrSoftwareFeConnection();
Amy Zhange50f08d2021-03-30 15:56:02 -0700350 }
Amy Zhange6915052021-03-30 13:44:43 -0700351 }
352
353 static void connectDescrambling(DescramblingHardwareConnections& descrambling) {
354 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700355 if (dataFlow.hasDescrambling()) {
356 descrambling.support = true;
357 } else {
Amy Zhange6915052021-03-30 13:44:43 -0700358 return;
359 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700360 auto descConfig = *dataFlow.getFirstDescrambling();
361 descrambling.frontendId = descConfig.getFrontendConnection();
362 descrambling.audioFilterId = descConfig.getAudioFilterConnection();
363 descrambling.videoFilterId = descConfig.getVideoFilterConnection();
364 if (descConfig.hasDvrSoftwareFeConnection()) {
365 descrambling.dvrSoftwareFeId = descConfig.getDvrSoftwareFeConnection();
Amy Zhange50f08d2021-03-30 15:56:02 -0700366 }
Amy Zhange6915052021-03-30 13:44:43 -0700367 }
368
369 static void connectLnbLive(LnbLiveHardwareConnections& lnbLive) {
370 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700371 if (dataFlow.hasLnbLive()) {
372 lnbLive.support = true;
373 } else {
Amy Zhange6915052021-03-30 13:44:43 -0700374 return;
375 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700376 auto lnbLiveConfig = *dataFlow.getFirstLnbLive();
377 lnbLive.frontendId = lnbLiveConfig.getFrontendConnection();
378 lnbLive.audioFilterId = lnbLiveConfig.getAudioFilterConnection();
379 lnbLive.videoFilterId = lnbLiveConfig.getVideoFilterConnection();
Amy Zhange6915052021-03-30 13:44:43 -0700380 }
381
382 static void connectLnbRecord(LnbRecordHardwareConnections& lnbRecord) {
383 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700384 if (dataFlow.hasLnbRecord()) {
385 lnbRecord.support = true;
386 } else {
Amy Zhange6915052021-03-30 13:44:43 -0700387 return;
388 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700389 auto lnbRecordConfig = *dataFlow.getFirstLnbRecord();
390 lnbRecord.frontendId = lnbRecordConfig.getFrontendConnection();
391 lnbRecord.recordFilterId = lnbRecordConfig.getRecordFilterConnection();
392 lnbRecord.dvrRecordId = lnbRecordConfig.getDvrRecordConnection();
Amy Zhange6915052021-03-30 13:44:43 -0700393 }
394
395 private:
396 static FrontendDvbtSettings readDvbtFrontendSettings(Frontend feConfig) {
Amy Zhange50f08d2021-03-30 15:56:02 -0700397 ALOGW("[ConfigReader] fe type is dvbt");
Amy Zhange6915052021-03-30 13:44:43 -0700398 FrontendDvbtSettings dvbtSettings{
399 .frequency = (uint32_t)feConfig.getFrequency(),
400 };
401 if (!feConfig.hasDvbtFrontendSettings_optional()) {
402 ALOGW("[ConfigReader] no more dvbt settings");
403 return dvbtSettings;
404 }
405 dvbtSettings.transmissionMode = static_cast<FrontendDvbtTransmissionMode>(
406 feConfig.getFirstDvbtFrontendSettings_optional()->getTransmissionMode());
407 dvbtSettings.bandwidth = static_cast<FrontendDvbtBandwidth>(
408 feConfig.getFirstDvbtFrontendSettings_optional()->getBandwidth());
409 dvbtSettings.isHighPriority =
410 feConfig.getFirstDvbtFrontendSettings_optional()->getIsHighPriority();
411 return dvbtSettings;
412 }
413
414 static FrontendDvbsSettings readDvbsFrontendSettings(Frontend feConfig) {
Amy Zhange50f08d2021-03-30 15:56:02 -0700415 ALOGW("[ConfigReader] fe type is dvbs");
Amy Zhange6915052021-03-30 13:44:43 -0700416 FrontendDvbsSettings dvbsSettings{
417 .frequency = (uint32_t)feConfig.getFrequency(),
418 };
419 if (!feConfig.hasDvbsFrontendSettings_optional()) {
420 ALOGW("[ConfigReader] no more dvbs settings");
421 return dvbsSettings;
422 }
423 dvbsSettings.symbolRate = static_cast<uint32_t>(
424 feConfig.getFirstDvbsFrontendSettings_optional()->getSymbolRate());
425 dvbsSettings.inputStreamId = static_cast<uint32_t>(
426 feConfig.getFirstDvbsFrontendSettings_optional()->getInputStreamId());
427 return dvbsSettings;
428 }
429
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700430 static bool readFilterTypeAndSettings(Filter filterConfig, DemuxFilterType& type,
431 DemuxFilterSettings& settings) {
432 auto mainType = filterConfig.getMainType();
433 auto subType = filterConfig.getSubType();
434 uint32_t pid = static_cast<uint32_t>(filterConfig.getPid());
435 switch (mainType) {
436 case FilterMainTypeEnum::TS: {
437 ALOGW("[ConfigReader] filter main type is ts");
438 type.mainType = DemuxFilterMainType::TS;
439 switch (subType) {
440 case FilterSubTypeEnum::UNDEFINED:
441 break;
442 case FilterSubTypeEnum::SECTION:
443 type.subType.tsFilterType(DemuxTsFilterType::SECTION);
444 settings.ts().filterSettings.section(
445 readSectionFilterSettings(filterConfig));
446 break;
447 case FilterSubTypeEnum::PES:
448 // TODO: b/182519645 support all the filter settings
449 /*settings.ts().filterSettings.pesData(
450 getPesFilterSettings(filterConfig));*/
451 type.subType.tsFilterType(DemuxTsFilterType::PES);
452 break;
453 case FilterSubTypeEnum::TS:
454 type.subType.tsFilterType(DemuxTsFilterType::TS);
455 settings.ts().filterSettings.noinit();
456 break;
457 case FilterSubTypeEnum::PCR:
458 type.subType.tsFilterType(DemuxTsFilterType::PCR);
459 settings.ts().filterSettings.noinit();
460 break;
461 case FilterSubTypeEnum::TEMI:
462 type.subType.tsFilterType(DemuxTsFilterType::TEMI);
463 settings.ts().filterSettings.noinit();
464 break;
465 case FilterSubTypeEnum::AUDIO:
466 type.subType.tsFilterType(DemuxTsFilterType::AUDIO);
467 settings.ts().filterSettings.av(readAvFilterSettings(filterConfig));
468 break;
469 case FilterSubTypeEnum::VIDEO:
470 type.subType.tsFilterType(DemuxTsFilterType::VIDEO);
471 settings.ts().filterSettings.av(readAvFilterSettings(filterConfig));
472 break;
473 case FilterSubTypeEnum::RECORD:
474 type.subType.tsFilterType(DemuxTsFilterType::RECORD);
475 settings.ts().filterSettings.record(readRecordFilterSettings(filterConfig));
476 break;
477 default:
478 ALOGW("[ConfigReader] ts subtype is not supported");
479 return false;
480 }
481 settings.ts().tpid = pid;
482 break;
483 }
484 case FilterMainTypeEnum::MMTP: {
485 ALOGW("[ConfigReader] filter main type is mmtp");
486 type.mainType = DemuxFilterMainType::MMTP;
487 switch (subType) {
488 case FilterSubTypeEnum::UNDEFINED:
489 break;
490 case FilterSubTypeEnum::SECTION:
491 type.subType.mmtpFilterType(DemuxMmtpFilterType::SECTION);
492 settings.mmtp().filterSettings.section(
493 readSectionFilterSettings(filterConfig));
494 break;
495 case FilterSubTypeEnum::PES:
496 type.subType.mmtpFilterType(DemuxMmtpFilterType::PES);
497 // TODO: b/182519645 support all the filter settings
498 /*settings.mmtp().filterSettings.pesData(
499 getPesFilterSettings(filterConfig));*/
500 break;
501 case FilterSubTypeEnum::MMTP:
502 type.subType.mmtpFilterType(DemuxMmtpFilterType::MMTP);
503 settings.mmtp().filterSettings.noinit();
504 break;
505 case FilterSubTypeEnum::AUDIO:
506 type.subType.mmtpFilterType(DemuxMmtpFilterType::AUDIO);
507 settings.mmtp().filterSettings.av(readAvFilterSettings(filterConfig));
508 break;
509 case FilterSubTypeEnum::VIDEO:
510 settings.mmtp().filterSettings.av(readAvFilterSettings(filterConfig));
511 break;
512 case FilterSubTypeEnum::RECORD:
513 type.subType.mmtpFilterType(DemuxMmtpFilterType::RECORD);
514 settings.mmtp().filterSettings.record(
515 readRecordFilterSettings(filterConfig));
516 break;
517 case FilterSubTypeEnum::DOWNLOAD:
518 type.subType.mmtpFilterType(DemuxMmtpFilterType::DOWNLOAD);
519 // TODO: b/182519645 support all the filter settings
520 /*settings.mmtp().filterSettings.download(
521 getDownloadFilterSettings(filterConfig));*/
522 break;
523 default:
524 ALOGW("[ConfigReader] mmtp subtype is not supported");
525 return false;
526 }
527 settings.mmtp().mmtpPid = pid;
528 break;
529 }
530 default:
531 // TODO: b/182519645 support all the filter configs
532 ALOGW("[ConfigReader] filter main type is not supported in dynamic config");
533 return false;
534 }
535 return true;
536 }
537
538 static DemuxFilterSectionSettings readSectionFilterSettings(Filter filterConfig) {
539 DemuxFilterSectionSettings settings;
540 if (!filterConfig.hasSectionFilterSettings_optional()) {
541 return settings;
542 }
543 auto section = filterConfig.getFirstSectionFilterSettings_optional();
544 settings.isCheckCrc = section->getIsCheckCrc();
545 settings.isRepeat = section->getIsRepeat();
546 settings.isRaw = section->getIsRaw();
547 return settings;
548 }
549
550 static DemuxFilterAvSettings readAvFilterSettings(Filter filterConfig) {
551 DemuxFilterAvSettings settings;
552 if (!filterConfig.hasAvFilterSettings_optional()) {
553 return settings;
554 }
555 auto av = filterConfig.getFirstAvFilterSettings_optional();
556 settings.isPassthrough = av->getIsPassthrough();
557 return settings;
558 }
559
560 static DemuxFilterRecordSettings readRecordFilterSettings(Filter filterConfig) {
561 DemuxFilterRecordSettings settings;
562 if (!filterConfig.hasRecordFilterSettings_optional()) {
563 return settings;
564 }
565 auto record = filterConfig.getFirstRecordFilterSettings_optional();
566 settings.tsIndexMask = static_cast<uint32_t>(record->getTsIndexMask());
567 settings.scIndexType = static_cast<DemuxRecordScIndexType>(record->getScIndexType());
568 return settings;
569 }
570
Amy Zhange50f08d2021-03-30 15:56:02 -0700571 static PlaybackSettings readPlaybackSettings(Dvr dvrConfig) {
572 ALOGW("[ConfigReader] dvr type is playback");
573 PlaybackSettings playbackSettings{
574 .statusMask = static_cast<uint8_t>(dvrConfig.getStatusMask()),
575 .lowThreshold = static_cast<uint32_t>(dvrConfig.getLowThreshold()),
576 .highThreshold = static_cast<uint32_t>(dvrConfig.getHighThreshold()),
577 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
578 .packetSize = static_cast<uint8_t>(dvrConfig.getPacketSize()),
579 };
580 return playbackSettings;
581 }
582
583 static RecordSettings readRecordSettings(Dvr dvrConfig) {
584 ALOGW("[ConfigReader] dvr type is record");
585 RecordSettings recordSettings{
586 .statusMask = static_cast<uint8_t>(dvrConfig.getStatusMask()),
587 .lowThreshold = static_cast<uint32_t>(dvrConfig.getLowThreshold()),
588 .highThreshold = static_cast<uint32_t>(dvrConfig.getHighThreshold()),
589 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
590 .packetSize = static_cast<uint8_t>(dvrConfig.getPacketSize()),
591 };
592 return recordSettings;
593 }
594
Amy Zhange6915052021-03-30 13:44:43 -0700595 static TunerConfiguration getTunerConfig() { return *read(configFilePath.c_str()); }
596
597 static HardwareConfiguration getHardwareConfig() {
598 return *getTunerConfig().getFirstHardwareConfiguration();
599 }
600
601 static DataFlowConfiguration getDataFlowConfiguration() {
602 return *getTunerConfig().getFirstDataFlowConfiguration();
603 }
604};