blob: d049b07232adeba92aa792374850e3c73415f34c [file] [log] [blame]
Amy Zhange6915052021-03-30 13:44:43 -07001/*
2 * Copyright 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <android-base/logging.h>
18#include <android/hardware/tv/tuner/1.0/types.h>
19#include <android_media_tuner_testing_configuration_V1_0.h>
20#include <android_media_tuner_testing_configuration_V1_0_enums.h>
21#include <binder/MemoryDealer.h>
22#include <hidl/HidlSupport.h>
23#include <hidl/HidlTransportSupport.h>
24#include <hidl/Status.h>
25#include <hidlmemory/FrameworkUtils.h>
26
27using namespace std;
28using namespace android::media::tuner::testing::configuration::V1_0;
29
30using android::hardware::tv::tuner::V1_0::DataFormat;
31using android::hardware::tv::tuner::V1_0::DemuxAlpFilterType;
Amy Zhang2ea2fe22021-04-01 11:55:41 -070032using android::hardware::tv::tuner::V1_0::DemuxFilterAvSettings;
Amy Zhange6915052021-03-30 13:44:43 -070033using android::hardware::tv::tuner::V1_0::DemuxFilterEvent;
34using android::hardware::tv::tuner::V1_0::DemuxFilterMainType;
Amy Zhang2ea2fe22021-04-01 11:55:41 -070035using android::hardware::tv::tuner::V1_0::DemuxFilterRecordSettings;
36using android::hardware::tv::tuner::V1_0::DemuxFilterSectionSettings;
Amy Zhange6915052021-03-30 13:44:43 -070037using android::hardware::tv::tuner::V1_0::DemuxFilterSettings;
38using android::hardware::tv::tuner::V1_0::DemuxFilterType;
Amy Zhang06fa69e2021-04-09 09:56:25 -070039using android::hardware::tv::tuner::V1_0::DemuxIpAddress;
40using android::hardware::tv::tuner::V1_0::DemuxIpFilterSettings;
Amy Zhange6915052021-03-30 13:44:43 -070041using android::hardware::tv::tuner::V1_0::DemuxIpFilterType;
42using android::hardware::tv::tuner::V1_0::DemuxMmtpFilterType;
43using android::hardware::tv::tuner::V1_0::DemuxRecordScIndexType;
44using android::hardware::tv::tuner::V1_0::DemuxTlvFilterType;
45using android::hardware::tv::tuner::V1_0::DemuxTpid;
46using android::hardware::tv::tuner::V1_0::DemuxTsFilterType;
47using android::hardware::tv::tuner::V1_0::DvrSettings;
48using android::hardware::tv::tuner::V1_0::DvrType;
49using android::hardware::tv::tuner::V1_0::FrontendDvbsSettings;
50using android::hardware::tv::tuner::V1_0::FrontendDvbtBandwidth;
51using android::hardware::tv::tuner::V1_0::FrontendDvbtCoderate;
52using android::hardware::tv::tuner::V1_0::FrontendDvbtConstellation;
53using android::hardware::tv::tuner::V1_0::FrontendDvbtGuardInterval;
54using android::hardware::tv::tuner::V1_0::FrontendDvbtHierarchy;
Henry Fang0d591fd2021-05-13 17:30:32 -070055using android::hardware::tv::tuner::V1_0::FrontendDvbtPlpMode;
Amy Zhange6915052021-03-30 13:44:43 -070056using android::hardware::tv::tuner::V1_0::FrontendDvbtSettings;
57using android::hardware::tv::tuner::V1_0::FrontendDvbtStandard;
58using android::hardware::tv::tuner::V1_0::FrontendDvbtTransmissionMode;
59using android::hardware::tv::tuner::V1_0::FrontendSettings;
60using android::hardware::tv::tuner::V1_0::FrontendStatus;
61using android::hardware::tv::tuner::V1_0::FrontendStatusType;
62using android::hardware::tv::tuner::V1_0::FrontendType;
63using android::hardware::tv::tuner::V1_0::LnbPosition;
64using android::hardware::tv::tuner::V1_0::LnbTone;
65using android::hardware::tv::tuner::V1_0::LnbVoltage;
66using android::hardware::tv::tuner::V1_0::PlaybackSettings;
67using android::hardware::tv::tuner::V1_0::RecordSettings;
68
Amy Zhang2ea2fe22021-04-01 11:55:41 -070069const string emptyHardwareId = "";
Amy Zhange6915052021-03-30 13:44:43 -070070
Amy Zhang06fa69e2021-04-09 09:56:25 -070071static string mConfigFilePath;
72
Amy Zhang32b6f9e2021-04-02 15:01:17 -070073#define PROVISION_STR \
74 "{ " \
75 " \"id\": 21140844, " \
76 " \"name\": \"Test Title\", " \
77 " \"lowercase_organization_name\": \"Android\", " \
78 " \"asset_key\": { " \
79 " \"encryption_key\": \"nezAr3CHFrmBR9R8Tedotw==\" " \
80 " }, " \
81 " \"cas_type\": 1, " \
82 " \"track_types\": [ ] " \
83 "} "
84
Amy Zhange6915052021-03-30 13:44:43 -070085struct FrontendConfig {
86 bool isSoftwareFe;
87 FrontendType type;
88 FrontendSettings settings;
89 vector<FrontendStatusType> tuneStatusTypes;
90 vector<FrontendStatus> expectTuneStatuses;
91};
92
Amy Zhang2ea2fe22021-04-01 11:55:41 -070093struct FilterConfig {
94 uint32_t bufferSize;
95 DemuxFilterType type;
96 DemuxFilterSettings settings;
97 bool getMqDesc;
98
99 bool operator<(const FilterConfig& /*c*/) const { return false; }
100};
101
Amy Zhange50f08d2021-03-30 15:56:02 -0700102struct DvrConfig {
103 DvrType type;
104 uint32_t bufferSize;
105 DvrSettings settings;
106 string playbackInputFile;
107};
108
Amy Zhangc0e9a112021-04-01 19:25:21 -0700109struct LnbConfig {
110 string name;
111 LnbVoltage voltage;
112 LnbTone tone;
113 LnbPosition position;
114};
115
116struct TimeFilterConfig {
117 uint64_t timeStamp;
118};
119
Amy Zhang32b6f9e2021-04-02 15:01:17 -0700120struct DescramblerConfig {
121 uint32_t casSystemId;
122 string provisionStr;
123 vector<uint8_t> hidlPvtData;
124};
125
Amy Zhange6915052021-03-30 13:44:43 -0700126struct LiveBroadcastHardwareConnections {
Amy Zhang160a72c2021-04-24 21:15:26 -0700127 bool hasFrontendConnection;
Amy Zhange6915052021-03-30 13:44:43 -0700128 string frontendId;
Amy Zhange50f08d2021-03-30 15:56:02 -0700129 string dvrSoftwareFeId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700130 string audioFilterId;
Amy Zhange6915052021-03-30 13:44:43 -0700131 string videoFilterId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700132 string sectionFilterId;
Amy Zhang06fa69e2021-04-09 09:56:25 -0700133 string ipFilterId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700134 string pcrFilterId;
135 /* list string of extra filters; */
Amy Zhange6915052021-03-30 13:44:43 -0700136};
137
138struct ScanHardwareConnections {
Amy Zhang160a72c2021-04-24 21:15:26 -0700139 bool hasFrontendConnection;
Amy Zhange6915052021-03-30 13:44:43 -0700140 string frontendId;
141};
142
Amy Zhange50f08d2021-03-30 15:56:02 -0700143struct DvrPlaybackHardwareConnections {
144 bool support;
145 string frontendId;
146 string dvrId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700147 string audioFilterId;
Amy Zhange50f08d2021-03-30 15:56:02 -0700148 string videoFilterId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700149 string sectionFilterId;
150 /* list string of extra filters; */
Amy Zhange50f08d2021-03-30 15:56:02 -0700151};
152
Amy Zhange6915052021-03-30 13:44:43 -0700153struct DvrRecordHardwareConnections {
154 bool support;
Amy Zhang160a72c2021-04-24 21:15:26 -0700155 bool hasFrontendConnection;
Amy Zhange6915052021-03-30 13:44:43 -0700156 string frontendId;
Amy Zhange50f08d2021-03-30 15:56:02 -0700157 string dvrRecordId;
158 string dvrSoftwareFeId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700159 string recordFilterId;
Amy Zhang160a72c2021-04-24 21:15:26 -0700160 string dvrSourceId;
Amy Zhange6915052021-03-30 13:44:43 -0700161};
162
163struct DescramblingHardwareConnections {
164 bool support;
Amy Zhang160a72c2021-04-24 21:15:26 -0700165 bool hasFrontendConnection;
Amy Zhange6915052021-03-30 13:44:43 -0700166 string frontendId;
Amy Zhange50f08d2021-03-30 15:56:02 -0700167 string dvrSoftwareFeId;
Amy Zhange6915052021-03-30 13:44:43 -0700168 string audioFilterId;
169 string videoFilterId;
Amy Zhang32b6f9e2021-04-02 15:01:17 -0700170 string descramblerId;
Amy Zhang160a72c2021-04-24 21:15:26 -0700171 string dvrSourceId;
Amy Zhang32b6f9e2021-04-02 15:01:17 -0700172 /* list string of extra filters; */
Amy Zhange6915052021-03-30 13:44:43 -0700173};
174
175struct LnbLiveHardwareConnections {
176 bool support;
177 string frontendId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700178 string audioFilterId;
Amy Zhange6915052021-03-30 13:44:43 -0700179 string videoFilterId;
Amy Zhangc0e9a112021-04-01 19:25:21 -0700180 string lnbId;
181 vector<string> diseqcMsgs;
182 /* list string of extra filters; */
Amy Zhange6915052021-03-30 13:44:43 -0700183};
184
185struct LnbRecordHardwareConnections {
186 bool support;
187 string frontendId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700188 string dvrRecordId;
189 string recordFilterId;
Amy Zhangc0e9a112021-04-01 19:25:21 -0700190 string lnbId;
191 vector<string> diseqcMsgs;
192 /* list string of extra filters; */
193};
194
195struct TimeFilterHardwareConnections {
196 bool support;
197 string timeFilterId;
Amy Zhange6915052021-03-30 13:44:43 -0700198};
199
Amy Zhang06fa69e2021-04-09 09:56:25 -0700200struct TunerTestingConfigReader1_0 {
Amy Zhange6915052021-03-30 13:44:43 -0700201 public:
Amy Zhang06fa69e2021-04-09 09:56:25 -0700202 static void setConfigFilePath(string path) { mConfigFilePath = path; }
203
Amy Zhange6915052021-03-30 13:44:43 -0700204 static bool checkConfigFileExists() {
Amy Zhang06fa69e2021-04-09 09:56:25 -0700205 auto res = read(mConfigFilePath.c_str());
Amy Zhange6915052021-03-30 13:44:43 -0700206 if (res == nullopt) {
Amy Zhang06fa69e2021-04-09 09:56:25 -0700207 ALOGW("[ConfigReader] Couldn't read %s."
Amy Zhange6915052021-03-30 13:44:43 -0700208 "Please check tuner_testing_dynamic_configuration.xsd"
Amy Zhang06fa69e2021-04-09 09:56:25 -0700209 "and sample_tuner_vts_config.xml for more details on how to config Tune VTS.",
210 mConfigFilePath.c_str());
Amy Zhange6915052021-03-30 13:44:43 -0700211 }
212 return (res != nullopt);
213 }
214
215 static void readFrontendConfig1_0(map<string, FrontendConfig>& frontendMap) {
216 auto hardwareConfig = getHardwareConfig();
217 if (hardwareConfig.hasFrontends()) {
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700218 // TODO: b/182519645 complete the tune status config
Amy Zhange6915052021-03-30 13:44:43 -0700219 vector<FrontendStatusType> types;
220 types.push_back(FrontendStatusType::DEMOD_LOCK);
221 FrontendStatus status;
222 status.isDemodLocked(true);
223 vector<FrontendStatus> statuses;
224 statuses.push_back(status);
225
226 auto frontends = *hardwareConfig.getFirstFrontends();
227 for (auto feConfig : frontends.getFrontend()) {
228 string id = feConfig.getId();
229 if (id.compare(string("FE_DEFAULT")) == 0) {
230 // overrid default
231 frontendMap.erase(string("FE_DEFAULT"));
232 }
233 FrontendType type;
234 switch (feConfig.getType()) {
235 case FrontendTypeEnum::UNDEFINED:
236 type = FrontendType::UNDEFINED;
237 break;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700238 // TODO: b/182519645 finish all other frontend settings
Amy Zhange6915052021-03-30 13:44:43 -0700239 case FrontendTypeEnum::ANALOG:
240 type = FrontendType::ANALOG;
241 break;
242 case FrontendTypeEnum::ATSC:
243 type = FrontendType::ATSC;
244 break;
245 case FrontendTypeEnum::ATSC3:
246 type = FrontendType::ATSC3;
247 break;
248 case FrontendTypeEnum::DVBC:
249 type = FrontendType::DVBC;
250 break;
251 case FrontendTypeEnum::DVBS:
252 type = FrontendType::DVBS;
253 frontendMap[id].settings.dvbs(readDvbsFrontendSettings(feConfig));
254 break;
255 case FrontendTypeEnum::DVBT: {
256 type = FrontendType::DVBT;
257 frontendMap[id].settings.dvbt(readDvbtFrontendSettings(feConfig));
258 break;
259 }
260 case FrontendTypeEnum::ISDBS:
261 type = FrontendType::ISDBS;
262 break;
263 case FrontendTypeEnum::ISDBS3:
264 type = FrontendType::ISDBS3;
265 break;
266 case FrontendTypeEnum::ISDBT:
267 type = FrontendType::ISDBT;
268 break;
269 case FrontendTypeEnum::DTMB:
270 // dtmb will be handled in readFrontendConfig1_1;
271 continue;
272 case FrontendTypeEnum::UNKNOWN:
273 ALOGW("[ConfigReader] invalid frontend type");
274 return;
275 }
276 frontendMap[id].type = type;
277 frontendMap[id].isSoftwareFe = feConfig.getIsSoftwareFrontend();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700278 // TODO: b/182519645 complete the tune status config
Amy Zhange6915052021-03-30 13:44:43 -0700279 frontendMap[id].tuneStatusTypes = types;
280 frontendMap[id].expectTuneStatuses = statuses;
281 }
282 }
283 }
284
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700285 static void readFilterConfig1_0(map<string, FilterConfig>& filterMap) {
286 auto hardwareConfig = getHardwareConfig();
287 if (hardwareConfig.hasFilters()) {
288 auto filters = *hardwareConfig.getFirstFilters();
289 for (auto filterConfig : filters.getFilter()) {
290 string id = filterConfig.getId();
291 if (id.compare(string("FILTER_AUDIO_DEFAULT")) == 0) {
292 // overrid default
293 filterMap.erase(string("FILTER_AUDIO_DEFAULT"));
294 }
295 if (id.compare(string("FILTER_VIDEO_DEFAULT")) == 0) {
296 // overrid default
297 filterMap.erase(string("FILTER_VIDEO_DEFAULT"));
298 }
299
300 DemuxFilterType type;
301 DemuxFilterSettings settings;
302 if (!readFilterTypeAndSettings(filterConfig, type, settings)) {
303 ALOGW("[ConfigReader] invalid filter type");
304 return;
305 }
306 filterMap[id].type = type;
307 filterMap[id].bufferSize = filterConfig.getBufferSize();
308 filterMap[id].getMqDesc = filterConfig.getUseFMQ();
309 filterMap[id].settings = settings;
310 }
311 }
312 }
313
Amy Zhange50f08d2021-03-30 15:56:02 -0700314 static void readDvrConfig1_0(map<string, DvrConfig>& dvrMap) {
315 auto hardwareConfig = getHardwareConfig();
316 if (hardwareConfig.hasDvrs()) {
317 auto dvrs = *hardwareConfig.getFirstDvrs();
318 for (auto dvrConfig : dvrs.getDvr()) {
319 string id = dvrConfig.getId();
320 DvrType type;
321 switch (dvrConfig.getType()) {
322 case DvrTypeEnum::PLAYBACK:
323 type = DvrType::PLAYBACK;
324 dvrMap[id].settings.playback(readPlaybackSettings(dvrConfig));
325 break;
326 case DvrTypeEnum::RECORD:
327 type = DvrType::RECORD;
328 dvrMap[id].settings.record(readRecordSettings(dvrConfig));
329 break;
330 case DvrTypeEnum::UNKNOWN:
331 ALOGW("[ConfigReader] invalid DVR type");
332 return;
333 }
334 dvrMap[id].type = type;
335 dvrMap[id].bufferSize = static_cast<uint32_t>(dvrConfig.getBufferSize());
336 if (dvrConfig.hasInputFilePath()) {
337 dvrMap[id].playbackInputFile = dvrConfig.getInputFilePath();
338 }
339 }
340 }
341 }
342
Amy Zhangc0e9a112021-04-01 19:25:21 -0700343 static void readLnbConfig1_0(map<string, LnbConfig>& lnbMap) {
344 auto hardwareConfig = getHardwareConfig();
345 if (hardwareConfig.hasLnbs()) {
346 auto lnbs = *hardwareConfig.getFirstLnbs();
347 for (auto lnbConfig : lnbs.getLnb()) {
348 string id = lnbConfig.getId();
349 if (lnbConfig.hasName()) {
350 lnbMap[id].name = lnbConfig.getName();
351 } else {
352 lnbMap[id].name = emptyHardwareId;
353 }
354 lnbMap[id].voltage = static_cast<LnbVoltage>(lnbConfig.getVoltage());
355 lnbMap[id].tone = static_cast<LnbTone>(lnbConfig.getTone());
356 lnbMap[id].position = static_cast<LnbPosition>(lnbConfig.getPosition());
357 }
358 }
359 }
360
Amy Zhang32b6f9e2021-04-02 15:01:17 -0700361 static void readDescramblerConfig1_0(map<string, DescramblerConfig>& descramblerMap) {
362 auto hardwareConfig = getHardwareConfig();
363 if (hardwareConfig.hasDescramblers()) {
364 auto descramblers = *hardwareConfig.getFirstDescramblers();
365 for (auto descramblerConfig : descramblers.getDescrambler()) {
366 string id = descramblerConfig.getId();
367 descramblerMap[id].casSystemId =
368 static_cast<uint32_t>(descramblerConfig.getCasSystemId());
369 if (descramblerConfig.hasProvisionStr()) {
370 descramblerMap[id].provisionStr = descramblerConfig.getProvisionStr();
371 } else {
372 descramblerMap[id].provisionStr = PROVISION_STR;
373 }
374 if (descramblerConfig.hasSesstionPrivatData()) {
375 auto privateData = descramblerConfig.getSesstionPrivatData();
376 int size = privateData.size();
377 descramblerMap[id].hidlPvtData.resize(size);
378 memcpy(descramblerMap[id].hidlPvtData.data(), privateData.data(), size);
379 } else {
380 descramblerMap[id].hidlPvtData.resize(256);
381 }
382 }
383 }
384 }
385
Amy Zhangc0e9a112021-04-01 19:25:21 -0700386 static void readDiseqcMessages(map<string, vector<uint8_t>>& diseqcMsgMap) {
387 auto hardwareConfig = getHardwareConfig();
388 if (hardwareConfig.hasDiseqcMessages()) {
389 auto msgs = *hardwareConfig.getFirstDiseqcMessages();
390 for (auto msgConfig : msgs.getDiseqcMessage()) {
391 string name = msgConfig.getMsgName();
392 for (uint8_t atom : msgConfig.getMsgBody()) {
393 diseqcMsgMap[name].push_back(atom);
394 }
395 }
396 }
397 }
398
399 static void readTimeFilterConfig1_0(map<string, TimeFilterConfig>& timeFilterMap) {
400 auto hardwareConfig = getHardwareConfig();
401 if (hardwareConfig.hasTimeFilters()) {
402 auto timeFilters = *hardwareConfig.getFirstTimeFilters();
403 for (auto timeFilterConfig : timeFilters.getTimeFilter()) {
404 string id = timeFilterConfig.getId();
405 timeFilterMap[id].timeStamp =
406 static_cast<uint64_t>(timeFilterConfig.getTimeStamp());
407 }
408 }
409 }
410
Amy Zhange6915052021-03-30 13:44:43 -0700411 static void connectLiveBroadcast(LiveBroadcastHardwareConnections& live) {
Amy Zhang160a72c2021-04-24 21:15:26 -0700412 auto dataFlow = getDataFlowConfiguration();
413 if (dataFlow.hasClearLiveBroadcast()) {
414 live.hasFrontendConnection = true;
415 } else {
416 live.hasFrontendConnection = false;
417 return;
418 }
419 auto liveConfig = *dataFlow.getFirstClearLiveBroadcast();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700420 live.frontendId = liveConfig.getFrontendConnection();
421
422 live.audioFilterId = liveConfig.getAudioFilterConnection();
423 live.videoFilterId = liveConfig.getVideoFilterConnection();
424 if (liveConfig.hasPcrFilterConnection()) {
425 live.pcrFilterId = liveConfig.getPcrFilterConnection();
426 } else {
427 live.pcrFilterId = emptyHardwareId;
428 }
429 if (liveConfig.hasSectionFilterConnection()) {
430 live.sectionFilterId = liveConfig.getSectionFilterConnection();
431 } else {
432 live.sectionFilterId = emptyHardwareId;
433 }
434 if (liveConfig.hasDvrSoftwareFeConnection()) {
435 live.dvrSoftwareFeId = liveConfig.getDvrSoftwareFeConnection();
Amy Zhange50f08d2021-03-30 15:56:02 -0700436 }
Amy Zhang06fa69e2021-04-09 09:56:25 -0700437 if (liveConfig.hasIpFilterConnection()) {
438 live.ipFilterId = liveConfig.getIpFilterConnection();
439 } else {
440 live.ipFilterId = emptyHardwareId;
441 }
Amy Zhange6915052021-03-30 13:44:43 -0700442 }
443
444 static void connectScan(ScanHardwareConnections& scan) {
Amy Zhang160a72c2021-04-24 21:15:26 -0700445 auto dataFlow = getDataFlowConfiguration();
446 if (dataFlow.hasScan()) {
447 scan.hasFrontendConnection = true;
448 } else {
449 scan.hasFrontendConnection = false;
450 return;
451 }
452 auto scanConfig = *dataFlow.getFirstScan();
453 scan.frontendId = scanConfig.getFrontendConnection();
Amy Zhange6915052021-03-30 13:44:43 -0700454 }
455
Amy Zhange50f08d2021-03-30 15:56:02 -0700456 static void connectDvrPlayback(DvrPlaybackHardwareConnections& playback) {
457 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700458 if (dataFlow.hasDvrPlayback()) {
459 playback.support = true;
460 } else {
Amy Zhang160a72c2021-04-24 21:15:26 -0700461 playback.support = false;
Amy Zhange50f08d2021-03-30 15:56:02 -0700462 return;
463 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700464 auto playbackConfig = *dataFlow.getFirstDvrPlayback();
465 playback.dvrId = playbackConfig.getDvrConnection();
466 playback.audioFilterId = playbackConfig.getAudioFilterConnection();
467 playback.videoFilterId = playbackConfig.getVideoFilterConnection();
468 if (playbackConfig.hasSectionFilterConnection()) {
469 playback.sectionFilterId = playbackConfig.getSectionFilterConnection();
470 } else {
471 playback.sectionFilterId = emptyHardwareId;
472 }
Amy Zhange50f08d2021-03-30 15:56:02 -0700473 }
474
Amy Zhange6915052021-03-30 13:44:43 -0700475 static void connectDvrRecord(DvrRecordHardwareConnections& record) {
476 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700477 if (dataFlow.hasDvrRecord()) {
478 record.support = true;
479 } else {
Amy Zhang160a72c2021-04-24 21:15:26 -0700480 record.support = false;
Amy Zhange6915052021-03-30 13:44:43 -0700481 return;
482 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700483 auto recordConfig = *dataFlow.getFirstDvrRecord();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700484 record.recordFilterId = recordConfig.getRecordFilterConnection();
485 record.dvrRecordId = recordConfig.getDvrRecordConnection();
486 if (recordConfig.hasDvrSoftwareFeConnection()) {
487 record.dvrSoftwareFeId = recordConfig.getDvrSoftwareFeConnection();
Amy Zhange50f08d2021-03-30 15:56:02 -0700488 }
Amy Zhang160a72c2021-04-24 21:15:26 -0700489 if (recordConfig.getHasFrontendConnection()) {
490 record.hasFrontendConnection = true;
491 record.dvrSourceId = emptyHardwareId;
Henry Fang3e1a1d32021-05-04 13:54:47 -0700492 record.frontendId = recordConfig.getFrontendConnection();
Amy Zhang160a72c2021-04-24 21:15:26 -0700493 } else {
494 record.hasFrontendConnection = false;
495 record.dvrSourceId = recordConfig.getDvrSourceConnection();
496 }
Amy Zhange6915052021-03-30 13:44:43 -0700497 }
498
499 static void connectDescrambling(DescramblingHardwareConnections& descrambling) {
500 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700501 if (dataFlow.hasDescrambling()) {
502 descrambling.support = true;
503 } else {
Amy Zhang160a72c2021-04-24 21:15:26 -0700504 descrambling.support = false;
Amy Zhange6915052021-03-30 13:44:43 -0700505 return;
506 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700507 auto descConfig = *dataFlow.getFirstDescrambling();
Amy Zhang32b6f9e2021-04-02 15:01:17 -0700508 descrambling.descramblerId = descConfig.getDescramblerConnection();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700509 descrambling.audioFilterId = descConfig.getAudioFilterConnection();
510 descrambling.videoFilterId = descConfig.getVideoFilterConnection();
511 if (descConfig.hasDvrSoftwareFeConnection()) {
512 descrambling.dvrSoftwareFeId = descConfig.getDvrSoftwareFeConnection();
Amy Zhange50f08d2021-03-30 15:56:02 -0700513 }
Amy Zhang160a72c2021-04-24 21:15:26 -0700514 if (descConfig.getHasFrontendConnection()) {
515 descrambling.hasFrontendConnection = true;
516 descrambling.dvrSourceId = emptyHardwareId;
Henry Fang3e1a1d32021-05-04 13:54:47 -0700517 descrambling.frontendId = descConfig.getFrontendConnection();
Amy Zhang160a72c2021-04-24 21:15:26 -0700518 } else {
519 descrambling.hasFrontendConnection = false;
520 descrambling.dvrSourceId = descConfig.getDvrSourceConnection();
521 }
Amy Zhange6915052021-03-30 13:44:43 -0700522 }
523
524 static void connectLnbLive(LnbLiveHardwareConnections& lnbLive) {
525 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700526 if (dataFlow.hasLnbLive()) {
527 lnbLive.support = true;
528 } else {
Amy Zhang160a72c2021-04-24 21:15:26 -0700529 lnbLive.support = false;
Amy Zhange6915052021-03-30 13:44:43 -0700530 return;
531 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700532 auto lnbLiveConfig = *dataFlow.getFirstLnbLive();
533 lnbLive.frontendId = lnbLiveConfig.getFrontendConnection();
534 lnbLive.audioFilterId = lnbLiveConfig.getAudioFilterConnection();
535 lnbLive.videoFilterId = lnbLiveConfig.getVideoFilterConnection();
Amy Zhangc0e9a112021-04-01 19:25:21 -0700536 lnbLive.lnbId = lnbLiveConfig.getLnbConnection();
537 if (lnbLiveConfig.hasDiseqcMsgSender()) {
538 for (auto msgName : lnbLiveConfig.getDiseqcMsgSender()) {
539 lnbLive.diseqcMsgs.push_back(msgName);
540 }
541 }
Amy Zhange6915052021-03-30 13:44:43 -0700542 }
543
544 static void connectLnbRecord(LnbRecordHardwareConnections& lnbRecord) {
545 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700546 if (dataFlow.hasLnbRecord()) {
547 lnbRecord.support = true;
548 } else {
Amy Zhang160a72c2021-04-24 21:15:26 -0700549 lnbRecord.support = false;
Amy Zhange6915052021-03-30 13:44:43 -0700550 return;
551 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700552 auto lnbRecordConfig = *dataFlow.getFirstLnbRecord();
553 lnbRecord.frontendId = lnbRecordConfig.getFrontendConnection();
554 lnbRecord.recordFilterId = lnbRecordConfig.getRecordFilterConnection();
555 lnbRecord.dvrRecordId = lnbRecordConfig.getDvrRecordConnection();
Amy Zhangc0e9a112021-04-01 19:25:21 -0700556 lnbRecord.lnbId = lnbRecordConfig.getLnbConnection();
557 if (lnbRecordConfig.hasDiseqcMsgSender()) {
558 for (auto msgName : lnbRecordConfig.getDiseqcMsgSender()) {
559 lnbRecord.diseqcMsgs.push_back(msgName);
560 }
561 }
562 }
563
564 static void connectTimeFilter(TimeFilterHardwareConnections& timeFilter) {
565 auto dataFlow = getDataFlowConfiguration();
566 if (dataFlow.hasTimeFilter()) {
567 timeFilter.support = true;
568 } else {
Amy Zhang160a72c2021-04-24 21:15:26 -0700569 timeFilter.support = false;
Amy Zhangc0e9a112021-04-01 19:25:21 -0700570 return;
571 }
572 auto timeFilterConfig = *dataFlow.getFirstTimeFilter();
573 timeFilter.timeFilterId = timeFilterConfig.getTimeFilterConnection();
Amy Zhange6915052021-03-30 13:44:43 -0700574 }
575
Amy Zhang06fa69e2021-04-09 09:56:25 -0700576 static HardwareConfiguration getHardwareConfig() {
577 return *getTunerConfig().getFirstHardwareConfiguration();
578 }
579
Amy Zhange6915052021-03-30 13:44:43 -0700580 private:
581 static FrontendDvbtSettings readDvbtFrontendSettings(Frontend feConfig) {
Amy Zhange50f08d2021-03-30 15:56:02 -0700582 ALOGW("[ConfigReader] fe type is dvbt");
Amy Zhange6915052021-03-30 13:44:43 -0700583 FrontendDvbtSettings dvbtSettings{
584 .frequency = (uint32_t)feConfig.getFrequency(),
585 };
586 if (!feConfig.hasDvbtFrontendSettings_optional()) {
587 ALOGW("[ConfigReader] no more dvbt settings");
588 return dvbtSettings;
589 }
Amy Zhang06fa69e2021-04-09 09:56:25 -0700590 auto dvbt = feConfig.getFirstDvbtFrontendSettings_optional();
591 uint32_t trans = static_cast<uint32_t>(dvbt->getTransmissionMode());
592 if (trans <= (uint32_t)FrontendDvbtTransmissionMode::MODE_32K) {
593 dvbtSettings.transmissionMode = static_cast<FrontendDvbtTransmissionMode>(trans);
594 }
595 dvbtSettings.bandwidth = static_cast<FrontendDvbtBandwidth>(dvbt->getBandwidth());
596 dvbtSettings.isHighPriority = dvbt->getIsHighPriority();
Henry Fang0d591fd2021-05-13 17:30:32 -0700597 dvbtSettings.hierarchy = static_cast<FrontendDvbtHierarchy>(dvbt->getHierarchy());
598 dvbtSettings.hpCoderate = static_cast<FrontendDvbtCoderate>(dvbt->getHpCoderate());
599 dvbtSettings.lpCoderate = static_cast<FrontendDvbtCoderate>(dvbt->getLpCoderate());
600 dvbtSettings.guardInterval =
601 static_cast<FrontendDvbtGuardInterval>(dvbt->getGuardInterval());
602 dvbtSettings.standard = static_cast<FrontendDvbtStandard>(dvbt->getStandard());
603 dvbtSettings.isMiso = dvbt->getIsMiso();
604 dvbtSettings.plpMode = static_cast<FrontendDvbtPlpMode>(dvbt->getPlpMode());
605 dvbtSettings.plpId = dvbt->getPlpId();
606 dvbtSettings.plpGroupId = dvbt->getPlpGroupId();
Amy Zhang06fa69e2021-04-09 09:56:25 -0700607 if (dvbt->hasConstellation()) {
608 dvbtSettings.constellation =
609 static_cast<FrontendDvbtConstellation>(dvbt->getConstellation());
610 }
Amy Zhange6915052021-03-30 13:44:43 -0700611 return dvbtSettings;
612 }
613
614 static FrontendDvbsSettings readDvbsFrontendSettings(Frontend feConfig) {
Amy Zhange50f08d2021-03-30 15:56:02 -0700615 ALOGW("[ConfigReader] fe type is dvbs");
Amy Zhange6915052021-03-30 13:44:43 -0700616 FrontendDvbsSettings dvbsSettings{
617 .frequency = (uint32_t)feConfig.getFrequency(),
618 };
619 if (!feConfig.hasDvbsFrontendSettings_optional()) {
620 ALOGW("[ConfigReader] no more dvbs settings");
621 return dvbsSettings;
622 }
623 dvbsSettings.symbolRate = static_cast<uint32_t>(
624 feConfig.getFirstDvbsFrontendSettings_optional()->getSymbolRate());
625 dvbsSettings.inputStreamId = static_cast<uint32_t>(
626 feConfig.getFirstDvbsFrontendSettings_optional()->getInputStreamId());
627 return dvbsSettings;
628 }
629
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700630 static bool readFilterTypeAndSettings(Filter filterConfig, DemuxFilterType& type,
631 DemuxFilterSettings& settings) {
632 auto mainType = filterConfig.getMainType();
633 auto subType = filterConfig.getSubType();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700634 switch (mainType) {
635 case FilterMainTypeEnum::TS: {
636 ALOGW("[ConfigReader] filter main type is ts");
637 type.mainType = DemuxFilterMainType::TS;
638 switch (subType) {
639 case FilterSubTypeEnum::UNDEFINED:
Amy Zhang06fa69e2021-04-09 09:56:25 -0700640 type.subType.tsFilterType(DemuxTsFilterType::UNDEFINED);
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700641 break;
642 case FilterSubTypeEnum::SECTION:
643 type.subType.tsFilterType(DemuxTsFilterType::SECTION);
644 settings.ts().filterSettings.section(
645 readSectionFilterSettings(filterConfig));
646 break;
647 case FilterSubTypeEnum::PES:
648 // TODO: b/182519645 support all the filter settings
649 /*settings.ts().filterSettings.pesData(
650 getPesFilterSettings(filterConfig));*/
651 type.subType.tsFilterType(DemuxTsFilterType::PES);
652 break;
653 case FilterSubTypeEnum::TS:
654 type.subType.tsFilterType(DemuxTsFilterType::TS);
655 settings.ts().filterSettings.noinit();
656 break;
657 case FilterSubTypeEnum::PCR:
658 type.subType.tsFilterType(DemuxTsFilterType::PCR);
659 settings.ts().filterSettings.noinit();
660 break;
661 case FilterSubTypeEnum::TEMI:
662 type.subType.tsFilterType(DemuxTsFilterType::TEMI);
663 settings.ts().filterSettings.noinit();
664 break;
665 case FilterSubTypeEnum::AUDIO:
666 type.subType.tsFilterType(DemuxTsFilterType::AUDIO);
667 settings.ts().filterSettings.av(readAvFilterSettings(filterConfig));
668 break;
669 case FilterSubTypeEnum::VIDEO:
670 type.subType.tsFilterType(DemuxTsFilterType::VIDEO);
671 settings.ts().filterSettings.av(readAvFilterSettings(filterConfig));
672 break;
673 case FilterSubTypeEnum::RECORD:
674 type.subType.tsFilterType(DemuxTsFilterType::RECORD);
675 settings.ts().filterSettings.record(readRecordFilterSettings(filterConfig));
676 break;
677 default:
678 ALOGW("[ConfigReader] ts subtype is not supported");
679 return false;
680 }
Amy Zhang06fa69e2021-04-09 09:56:25 -0700681 if (filterConfig.hasPid()) {
682 settings.ts().tpid = static_cast<uint32_t>(filterConfig.getPid());
683 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700684 break;
685 }
686 case FilterMainTypeEnum::MMTP: {
687 ALOGW("[ConfigReader] filter main type is mmtp");
688 type.mainType = DemuxFilterMainType::MMTP;
689 switch (subType) {
690 case FilterSubTypeEnum::UNDEFINED:
Amy Zhang06fa69e2021-04-09 09:56:25 -0700691 type.subType.mmtpFilterType(DemuxMmtpFilterType::UNDEFINED);
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700692 break;
693 case FilterSubTypeEnum::SECTION:
694 type.subType.mmtpFilterType(DemuxMmtpFilterType::SECTION);
695 settings.mmtp().filterSettings.section(
696 readSectionFilterSettings(filterConfig));
697 break;
698 case FilterSubTypeEnum::PES:
699 type.subType.mmtpFilterType(DemuxMmtpFilterType::PES);
700 // TODO: b/182519645 support all the filter settings
701 /*settings.mmtp().filterSettings.pesData(
702 getPesFilterSettings(filterConfig));*/
703 break;
704 case FilterSubTypeEnum::MMTP:
705 type.subType.mmtpFilterType(DemuxMmtpFilterType::MMTP);
706 settings.mmtp().filterSettings.noinit();
707 break;
708 case FilterSubTypeEnum::AUDIO:
709 type.subType.mmtpFilterType(DemuxMmtpFilterType::AUDIO);
710 settings.mmtp().filterSettings.av(readAvFilterSettings(filterConfig));
711 break;
712 case FilterSubTypeEnum::VIDEO:
713 settings.mmtp().filterSettings.av(readAvFilterSettings(filterConfig));
714 break;
715 case FilterSubTypeEnum::RECORD:
716 type.subType.mmtpFilterType(DemuxMmtpFilterType::RECORD);
717 settings.mmtp().filterSettings.record(
718 readRecordFilterSettings(filterConfig));
719 break;
720 case FilterSubTypeEnum::DOWNLOAD:
721 type.subType.mmtpFilterType(DemuxMmtpFilterType::DOWNLOAD);
722 // TODO: b/182519645 support all the filter settings
723 /*settings.mmtp().filterSettings.download(
724 getDownloadFilterSettings(filterConfig));*/
725 break;
726 default:
727 ALOGW("[ConfigReader] mmtp subtype is not supported");
728 return false;
729 }
Amy Zhang06fa69e2021-04-09 09:56:25 -0700730 if (filterConfig.hasPid()) {
731 settings.mmtp().mmtpPid = static_cast<uint32_t>(filterConfig.getPid());
732 }
733 break;
734 }
735 case FilterMainTypeEnum::IP: {
736 ALOGW("[ConfigReader] filter main type is ip");
737 type.mainType = DemuxFilterMainType::IP;
738 switch (subType) {
739 case FilterSubTypeEnum::UNDEFINED:
740 type.subType.ipFilterType(DemuxIpFilterType::UNDEFINED);
741 break;
742 case FilterSubTypeEnum::SECTION:
743 type.subType.ipFilterType(DemuxIpFilterType::SECTION);
744 settings.ip().filterSettings.section(
745 readSectionFilterSettings(filterConfig));
746 break;
747 case FilterSubTypeEnum::NTP:
748 type.subType.ipFilterType(DemuxIpFilterType::NTP);
749 settings.ip().filterSettings.noinit();
750 break;
751 case FilterSubTypeEnum::IP: {
752 DemuxIpFilterSettings ip{
753 .ipAddr = readIpAddress(filterConfig),
754 };
755 ip.filterSettings.bPassthrough(readPassthroughSettings(filterConfig));
756 settings.ip(ip);
757 break;
758 }
759 case FilterSubTypeEnum::IP_PAYLOAD:
760 type.subType.ipFilterType(DemuxIpFilterType::IP_PAYLOAD);
761 settings.ip().filterSettings.noinit();
762 break;
763 case FilterSubTypeEnum::PAYLOAD_THROUGH:
764 type.subType.ipFilterType(DemuxIpFilterType::PAYLOAD_THROUGH);
765 settings.ip().filterSettings.noinit();
766 break;
767 default:
768 ALOGW("[ConfigReader] mmtp subtype is not supported");
769 return false;
770 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700771 break;
772 }
773 default:
774 // TODO: b/182519645 support all the filter configs
775 ALOGW("[ConfigReader] filter main type is not supported in dynamic config");
776 return false;
777 }
778 return true;
779 }
780
Amy Zhang06fa69e2021-04-09 09:56:25 -0700781 static DemuxIpAddress readIpAddress(Filter filterConfig) {
782 DemuxIpAddress ipAddress;
783 if (!filterConfig.hasIpFilterConfig_optional()) {
784 return ipAddress;
785 }
786 auto ipFilterConfig = filterConfig.getFirstIpFilterConfig_optional();
787 if (ipFilterConfig->hasSrcPort()) {
788 ipAddress.srcPort = ipFilterConfig->getSrcPort();
789 }
790 if (ipFilterConfig->hasDestPort()) {
791 ipAddress.dstPort = ipFilterConfig->getDestPort();
792 }
793 if (ipFilterConfig->getFirstSrcIpAddress()->getIsIpV4()) {
794 memcpy(ipAddress.srcIpAddress.v4().data(),
795 ipFilterConfig->getFirstSrcIpAddress()->getIp().data(), 4);
796 } else {
797 memcpy(ipAddress.srcIpAddress.v6().data(),
798 ipFilterConfig->getFirstSrcIpAddress()->getIp().data(), 6);
799 }
800 if (ipFilterConfig->getFirstDestIpAddress()->getIsIpV4()) {
801 memcpy(ipAddress.dstIpAddress.v4().data(),
802 ipFilterConfig->getFirstDestIpAddress()->getIp().data(), 4);
803 } else {
804 memcpy(ipAddress.dstIpAddress.v6().data(),
805 ipFilterConfig->getFirstDestIpAddress()->getIp().data(), 6);
806 }
807 return ipAddress;
808 }
809
810 static bool readPassthroughSettings(Filter filterConfig) {
811 if (!filterConfig.hasIpFilterConfig_optional()) {
812 return false;
813 }
814 auto ipFilterConfig = filterConfig.getFirstIpFilterConfig_optional();
815 if (ipFilterConfig->hasDataPassthrough()) {
816 return ipFilterConfig->getDataPassthrough();
817 }
818 return false;
819 }
820
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700821 static DemuxFilterSectionSettings readSectionFilterSettings(Filter filterConfig) {
822 DemuxFilterSectionSettings settings;
823 if (!filterConfig.hasSectionFilterSettings_optional()) {
824 return settings;
825 }
826 auto section = filterConfig.getFirstSectionFilterSettings_optional();
827 settings.isCheckCrc = section->getIsCheckCrc();
828 settings.isRepeat = section->getIsRepeat();
829 settings.isRaw = section->getIsRaw();
830 return settings;
831 }
832
833 static DemuxFilterAvSettings readAvFilterSettings(Filter filterConfig) {
834 DemuxFilterAvSettings settings;
835 if (!filterConfig.hasAvFilterSettings_optional()) {
836 return settings;
837 }
838 auto av = filterConfig.getFirstAvFilterSettings_optional();
839 settings.isPassthrough = av->getIsPassthrough();
840 return settings;
841 }
842
843 static DemuxFilterRecordSettings readRecordFilterSettings(Filter filterConfig) {
844 DemuxFilterRecordSettings settings;
845 if (!filterConfig.hasRecordFilterSettings_optional()) {
846 return settings;
847 }
848 auto record = filterConfig.getFirstRecordFilterSettings_optional();
849 settings.tsIndexMask = static_cast<uint32_t>(record->getTsIndexMask());
850 settings.scIndexType = static_cast<DemuxRecordScIndexType>(record->getScIndexType());
851 return settings;
852 }
853
Amy Zhange50f08d2021-03-30 15:56:02 -0700854 static PlaybackSettings readPlaybackSettings(Dvr dvrConfig) {
855 ALOGW("[ConfigReader] dvr type is playback");
856 PlaybackSettings playbackSettings{
857 .statusMask = static_cast<uint8_t>(dvrConfig.getStatusMask()),
858 .lowThreshold = static_cast<uint32_t>(dvrConfig.getLowThreshold()),
859 .highThreshold = static_cast<uint32_t>(dvrConfig.getHighThreshold()),
860 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
861 .packetSize = static_cast<uint8_t>(dvrConfig.getPacketSize()),
862 };
863 return playbackSettings;
864 }
865
866 static RecordSettings readRecordSettings(Dvr dvrConfig) {
867 ALOGW("[ConfigReader] dvr type is record");
868 RecordSettings recordSettings{
869 .statusMask = static_cast<uint8_t>(dvrConfig.getStatusMask()),
870 .lowThreshold = static_cast<uint32_t>(dvrConfig.getLowThreshold()),
871 .highThreshold = static_cast<uint32_t>(dvrConfig.getHighThreshold()),
872 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
873 .packetSize = static_cast<uint8_t>(dvrConfig.getPacketSize()),
874 };
875 return recordSettings;
876 }
877
Amy Zhang06fa69e2021-04-09 09:56:25 -0700878 static TunerConfiguration getTunerConfig() { return *read(mConfigFilePath.c_str()); }
Amy Zhange6915052021-03-30 13:44:43 -0700879
880 static DataFlowConfiguration getDataFlowConfiguration() {
881 return *getTunerConfig().getFirstDataFlowConfiguration();
882 }
883};