blob: f7f72b038e95a0f7178506e30f06014244eafa63 [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;
55using android::hardware::tv::tuner::V1_0::FrontendDvbtSettings;
56using android::hardware::tv::tuner::V1_0::FrontendDvbtStandard;
57using android::hardware::tv::tuner::V1_0::FrontendDvbtTransmissionMode;
58using android::hardware::tv::tuner::V1_0::FrontendSettings;
59using android::hardware::tv::tuner::V1_0::FrontendStatus;
60using android::hardware::tv::tuner::V1_0::FrontendStatusType;
61using android::hardware::tv::tuner::V1_0::FrontendType;
62using android::hardware::tv::tuner::V1_0::LnbPosition;
63using android::hardware::tv::tuner::V1_0::LnbTone;
64using android::hardware::tv::tuner::V1_0::LnbVoltage;
65using android::hardware::tv::tuner::V1_0::PlaybackSettings;
66using android::hardware::tv::tuner::V1_0::RecordSettings;
67
Amy Zhang2ea2fe22021-04-01 11:55:41 -070068const string emptyHardwareId = "";
Amy Zhange6915052021-03-30 13:44:43 -070069
Amy Zhang06fa69e2021-04-09 09:56:25 -070070static string mConfigFilePath;
71
Amy Zhang32b6f9e2021-04-02 15:01:17 -070072#define PROVISION_STR \
73 "{ " \
74 " \"id\": 21140844, " \
75 " \"name\": \"Test Title\", " \
76 " \"lowercase_organization_name\": \"Android\", " \
77 " \"asset_key\": { " \
78 " \"encryption_key\": \"nezAr3CHFrmBR9R8Tedotw==\" " \
79 " }, " \
80 " \"cas_type\": 1, " \
81 " \"track_types\": [ ] " \
82 "} "
83
Amy Zhange6915052021-03-30 13:44:43 -070084struct FrontendConfig {
85 bool isSoftwareFe;
86 FrontendType type;
87 FrontendSettings settings;
88 vector<FrontendStatusType> tuneStatusTypes;
89 vector<FrontendStatus> expectTuneStatuses;
90};
91
Amy Zhang2ea2fe22021-04-01 11:55:41 -070092struct FilterConfig {
93 uint32_t bufferSize;
94 DemuxFilterType type;
95 DemuxFilterSettings settings;
96 bool getMqDesc;
97
98 bool operator<(const FilterConfig& /*c*/) const { return false; }
99};
100
Amy Zhange50f08d2021-03-30 15:56:02 -0700101struct DvrConfig {
102 DvrType type;
103 uint32_t bufferSize;
104 DvrSettings settings;
105 string playbackInputFile;
106};
107
Amy Zhangc0e9a112021-04-01 19:25:21 -0700108struct LnbConfig {
109 string name;
110 LnbVoltage voltage;
111 LnbTone tone;
112 LnbPosition position;
113};
114
115struct TimeFilterConfig {
116 uint64_t timeStamp;
117};
118
Amy Zhang32b6f9e2021-04-02 15:01:17 -0700119struct DescramblerConfig {
120 uint32_t casSystemId;
121 string provisionStr;
122 vector<uint8_t> hidlPvtData;
123};
124
Amy Zhange6915052021-03-30 13:44:43 -0700125struct LiveBroadcastHardwareConnections {
Amy Zhang160a72c2021-04-24 21:15:26 -0700126 bool hasFrontendConnection;
Amy Zhange6915052021-03-30 13:44:43 -0700127 string frontendId;
Amy Zhange50f08d2021-03-30 15:56:02 -0700128 string dvrSoftwareFeId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700129 string audioFilterId;
Amy Zhange6915052021-03-30 13:44:43 -0700130 string videoFilterId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700131 string sectionFilterId;
Amy Zhang06fa69e2021-04-09 09:56:25 -0700132 string ipFilterId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700133 string pcrFilterId;
134 /* list string of extra filters; */
Amy Zhange6915052021-03-30 13:44:43 -0700135};
136
137struct ScanHardwareConnections {
Amy Zhang160a72c2021-04-24 21:15:26 -0700138 bool hasFrontendConnection;
Amy Zhange6915052021-03-30 13:44:43 -0700139 string frontendId;
140};
141
Amy Zhange50f08d2021-03-30 15:56:02 -0700142struct DvrPlaybackHardwareConnections {
143 bool support;
144 string frontendId;
145 string dvrId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700146 string audioFilterId;
Amy Zhange50f08d2021-03-30 15:56:02 -0700147 string videoFilterId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700148 string sectionFilterId;
149 /* list string of extra filters; */
Amy Zhange50f08d2021-03-30 15:56:02 -0700150};
151
Amy Zhange6915052021-03-30 13:44:43 -0700152struct DvrRecordHardwareConnections {
153 bool support;
Amy Zhang160a72c2021-04-24 21:15:26 -0700154 bool hasFrontendConnection;
Amy Zhange6915052021-03-30 13:44:43 -0700155 string frontendId;
Amy Zhange50f08d2021-03-30 15:56:02 -0700156 string dvrRecordId;
157 string dvrSoftwareFeId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700158 string recordFilterId;
Amy Zhang160a72c2021-04-24 21:15:26 -0700159 string dvrSourceId;
Amy Zhange6915052021-03-30 13:44:43 -0700160};
161
162struct DescramblingHardwareConnections {
163 bool support;
Amy Zhang160a72c2021-04-24 21:15:26 -0700164 bool hasFrontendConnection;
Amy Zhange6915052021-03-30 13:44:43 -0700165 string frontendId;
Amy Zhange50f08d2021-03-30 15:56:02 -0700166 string dvrSoftwareFeId;
Amy Zhange6915052021-03-30 13:44:43 -0700167 string audioFilterId;
168 string videoFilterId;
Amy Zhang32b6f9e2021-04-02 15:01:17 -0700169 string descramblerId;
Amy Zhang160a72c2021-04-24 21:15:26 -0700170 string dvrSourceId;
Amy Zhang32b6f9e2021-04-02 15:01:17 -0700171 /* list string of extra filters; */
Amy Zhange6915052021-03-30 13:44:43 -0700172};
173
174struct LnbLiveHardwareConnections {
175 bool support;
176 string frontendId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700177 string audioFilterId;
Amy Zhange6915052021-03-30 13:44:43 -0700178 string videoFilterId;
Amy Zhangc0e9a112021-04-01 19:25:21 -0700179 string lnbId;
180 vector<string> diseqcMsgs;
181 /* list string of extra filters; */
Amy Zhange6915052021-03-30 13:44:43 -0700182};
183
184struct LnbRecordHardwareConnections {
185 bool support;
186 string frontendId;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700187 string dvrRecordId;
188 string recordFilterId;
Amy Zhangc0e9a112021-04-01 19:25:21 -0700189 string lnbId;
190 vector<string> diseqcMsgs;
191 /* list string of extra filters; */
192};
193
194struct TimeFilterHardwareConnections {
195 bool support;
196 string timeFilterId;
Amy Zhange6915052021-03-30 13:44:43 -0700197};
198
Amy Zhang06fa69e2021-04-09 09:56:25 -0700199struct TunerTestingConfigReader1_0 {
Amy Zhange6915052021-03-30 13:44:43 -0700200 public:
Amy Zhang06fa69e2021-04-09 09:56:25 -0700201 static void setConfigFilePath(string path) { mConfigFilePath = path; }
202
Amy Zhange6915052021-03-30 13:44:43 -0700203 static bool checkConfigFileExists() {
Amy Zhang06fa69e2021-04-09 09:56:25 -0700204 auto res = read(mConfigFilePath.c_str());
Amy Zhange6915052021-03-30 13:44:43 -0700205 if (res == nullopt) {
Amy Zhang06fa69e2021-04-09 09:56:25 -0700206 ALOGW("[ConfigReader] Couldn't read %s."
Amy Zhange6915052021-03-30 13:44:43 -0700207 "Please check tuner_testing_dynamic_configuration.xsd"
Amy Zhang06fa69e2021-04-09 09:56:25 -0700208 "and sample_tuner_vts_config.xml for more details on how to config Tune VTS.",
209 mConfigFilePath.c_str());
Amy Zhange6915052021-03-30 13:44:43 -0700210 }
211 return (res != nullopt);
212 }
213
214 static void readFrontendConfig1_0(map<string, FrontendConfig>& frontendMap) {
215 auto hardwareConfig = getHardwareConfig();
216 if (hardwareConfig.hasFrontends()) {
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700217 // TODO: b/182519645 complete the tune status config
Amy Zhange6915052021-03-30 13:44:43 -0700218 vector<FrontendStatusType> types;
219 types.push_back(FrontendStatusType::DEMOD_LOCK);
220 FrontendStatus status;
221 status.isDemodLocked(true);
222 vector<FrontendStatus> statuses;
223 statuses.push_back(status);
224
225 auto frontends = *hardwareConfig.getFirstFrontends();
226 for (auto feConfig : frontends.getFrontend()) {
227 string id = feConfig.getId();
228 if (id.compare(string("FE_DEFAULT")) == 0) {
229 // overrid default
230 frontendMap.erase(string("FE_DEFAULT"));
231 }
232 FrontendType type;
233 switch (feConfig.getType()) {
234 case FrontendTypeEnum::UNDEFINED:
235 type = FrontendType::UNDEFINED;
236 break;
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700237 // TODO: b/182519645 finish all other frontend settings
Amy Zhange6915052021-03-30 13:44:43 -0700238 case FrontendTypeEnum::ANALOG:
239 type = FrontendType::ANALOG;
240 break;
241 case FrontendTypeEnum::ATSC:
242 type = FrontendType::ATSC;
243 break;
244 case FrontendTypeEnum::ATSC3:
245 type = FrontendType::ATSC3;
246 break;
247 case FrontendTypeEnum::DVBC:
248 type = FrontendType::DVBC;
249 break;
250 case FrontendTypeEnum::DVBS:
251 type = FrontendType::DVBS;
252 frontendMap[id].settings.dvbs(readDvbsFrontendSettings(feConfig));
253 break;
254 case FrontendTypeEnum::DVBT: {
255 type = FrontendType::DVBT;
256 frontendMap[id].settings.dvbt(readDvbtFrontendSettings(feConfig));
257 break;
258 }
259 case FrontendTypeEnum::ISDBS:
260 type = FrontendType::ISDBS;
261 break;
262 case FrontendTypeEnum::ISDBS3:
263 type = FrontendType::ISDBS3;
264 break;
265 case FrontendTypeEnum::ISDBT:
266 type = FrontendType::ISDBT;
267 break;
268 case FrontendTypeEnum::DTMB:
269 // dtmb will be handled in readFrontendConfig1_1;
270 continue;
271 case FrontendTypeEnum::UNKNOWN:
272 ALOGW("[ConfigReader] invalid frontend type");
273 return;
274 }
275 frontendMap[id].type = type;
276 frontendMap[id].isSoftwareFe = feConfig.getIsSoftwareFrontend();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700277 // TODO: b/182519645 complete the tune status config
Amy Zhange6915052021-03-30 13:44:43 -0700278 frontendMap[id].tuneStatusTypes = types;
279 frontendMap[id].expectTuneStatuses = statuses;
280 }
281 }
282 }
283
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700284 static void readFilterConfig1_0(map<string, FilterConfig>& filterMap) {
285 auto hardwareConfig = getHardwareConfig();
286 if (hardwareConfig.hasFilters()) {
287 auto filters = *hardwareConfig.getFirstFilters();
288 for (auto filterConfig : filters.getFilter()) {
289 string id = filterConfig.getId();
290 if (id.compare(string("FILTER_AUDIO_DEFAULT")) == 0) {
291 // overrid default
292 filterMap.erase(string("FILTER_AUDIO_DEFAULT"));
293 }
294 if (id.compare(string("FILTER_VIDEO_DEFAULT")) == 0) {
295 // overrid default
296 filterMap.erase(string("FILTER_VIDEO_DEFAULT"));
297 }
298
299 DemuxFilterType type;
300 DemuxFilterSettings settings;
301 if (!readFilterTypeAndSettings(filterConfig, type, settings)) {
302 ALOGW("[ConfigReader] invalid filter type");
303 return;
304 }
305 filterMap[id].type = type;
306 filterMap[id].bufferSize = filterConfig.getBufferSize();
307 filterMap[id].getMqDesc = filterConfig.getUseFMQ();
308 filterMap[id].settings = settings;
309 }
310 }
311 }
312
Amy Zhange50f08d2021-03-30 15:56:02 -0700313 static void readDvrConfig1_0(map<string, DvrConfig>& dvrMap) {
314 auto hardwareConfig = getHardwareConfig();
315 if (hardwareConfig.hasDvrs()) {
316 auto dvrs = *hardwareConfig.getFirstDvrs();
317 for (auto dvrConfig : dvrs.getDvr()) {
318 string id = dvrConfig.getId();
319 DvrType type;
320 switch (dvrConfig.getType()) {
321 case DvrTypeEnum::PLAYBACK:
322 type = DvrType::PLAYBACK;
323 dvrMap[id].settings.playback(readPlaybackSettings(dvrConfig));
324 break;
325 case DvrTypeEnum::RECORD:
326 type = DvrType::RECORD;
327 dvrMap[id].settings.record(readRecordSettings(dvrConfig));
328 break;
329 case DvrTypeEnum::UNKNOWN:
330 ALOGW("[ConfigReader] invalid DVR type");
331 return;
332 }
333 dvrMap[id].type = type;
334 dvrMap[id].bufferSize = static_cast<uint32_t>(dvrConfig.getBufferSize());
335 if (dvrConfig.hasInputFilePath()) {
336 dvrMap[id].playbackInputFile = dvrConfig.getInputFilePath();
337 }
338 }
339 }
340 }
341
Amy Zhangc0e9a112021-04-01 19:25:21 -0700342 static void readLnbConfig1_0(map<string, LnbConfig>& lnbMap) {
343 auto hardwareConfig = getHardwareConfig();
344 if (hardwareConfig.hasLnbs()) {
345 auto lnbs = *hardwareConfig.getFirstLnbs();
346 for (auto lnbConfig : lnbs.getLnb()) {
347 string id = lnbConfig.getId();
348 if (lnbConfig.hasName()) {
349 lnbMap[id].name = lnbConfig.getName();
350 } else {
351 lnbMap[id].name = emptyHardwareId;
352 }
353 lnbMap[id].voltage = static_cast<LnbVoltage>(lnbConfig.getVoltage());
354 lnbMap[id].tone = static_cast<LnbTone>(lnbConfig.getTone());
355 lnbMap[id].position = static_cast<LnbPosition>(lnbConfig.getPosition());
356 }
357 }
358 }
359
Amy Zhang32b6f9e2021-04-02 15:01:17 -0700360 static void readDescramblerConfig1_0(map<string, DescramblerConfig>& descramblerMap) {
361 auto hardwareConfig = getHardwareConfig();
362 if (hardwareConfig.hasDescramblers()) {
363 auto descramblers = *hardwareConfig.getFirstDescramblers();
364 for (auto descramblerConfig : descramblers.getDescrambler()) {
365 string id = descramblerConfig.getId();
366 descramblerMap[id].casSystemId =
367 static_cast<uint32_t>(descramblerConfig.getCasSystemId());
368 if (descramblerConfig.hasProvisionStr()) {
369 descramblerMap[id].provisionStr = descramblerConfig.getProvisionStr();
370 } else {
371 descramblerMap[id].provisionStr = PROVISION_STR;
372 }
373 if (descramblerConfig.hasSesstionPrivatData()) {
374 auto privateData = descramblerConfig.getSesstionPrivatData();
375 int size = privateData.size();
376 descramblerMap[id].hidlPvtData.resize(size);
377 memcpy(descramblerMap[id].hidlPvtData.data(), privateData.data(), size);
378 } else {
379 descramblerMap[id].hidlPvtData.resize(256);
380 }
381 }
382 }
383 }
384
Amy Zhangc0e9a112021-04-01 19:25:21 -0700385 static void readDiseqcMessages(map<string, vector<uint8_t>>& diseqcMsgMap) {
386 auto hardwareConfig = getHardwareConfig();
387 if (hardwareConfig.hasDiseqcMessages()) {
388 auto msgs = *hardwareConfig.getFirstDiseqcMessages();
389 for (auto msgConfig : msgs.getDiseqcMessage()) {
390 string name = msgConfig.getMsgName();
391 for (uint8_t atom : msgConfig.getMsgBody()) {
392 diseqcMsgMap[name].push_back(atom);
393 }
394 }
395 }
396 }
397
398 static void readTimeFilterConfig1_0(map<string, TimeFilterConfig>& timeFilterMap) {
399 auto hardwareConfig = getHardwareConfig();
400 if (hardwareConfig.hasTimeFilters()) {
401 auto timeFilters = *hardwareConfig.getFirstTimeFilters();
402 for (auto timeFilterConfig : timeFilters.getTimeFilter()) {
403 string id = timeFilterConfig.getId();
404 timeFilterMap[id].timeStamp =
405 static_cast<uint64_t>(timeFilterConfig.getTimeStamp());
406 }
407 }
408 }
409
Amy Zhange6915052021-03-30 13:44:43 -0700410 static void connectLiveBroadcast(LiveBroadcastHardwareConnections& live) {
Amy Zhang160a72c2021-04-24 21:15:26 -0700411 auto dataFlow = getDataFlowConfiguration();
412 if (dataFlow.hasClearLiveBroadcast()) {
413 live.hasFrontendConnection = true;
414 } else {
415 live.hasFrontendConnection = false;
416 return;
417 }
418 auto liveConfig = *dataFlow.getFirstClearLiveBroadcast();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700419 live.frontendId = liveConfig.getFrontendConnection();
420
421 live.audioFilterId = liveConfig.getAudioFilterConnection();
422 live.videoFilterId = liveConfig.getVideoFilterConnection();
423 if (liveConfig.hasPcrFilterConnection()) {
424 live.pcrFilterId = liveConfig.getPcrFilterConnection();
425 } else {
426 live.pcrFilterId = emptyHardwareId;
427 }
428 if (liveConfig.hasSectionFilterConnection()) {
429 live.sectionFilterId = liveConfig.getSectionFilterConnection();
430 } else {
431 live.sectionFilterId = emptyHardwareId;
432 }
433 if (liveConfig.hasDvrSoftwareFeConnection()) {
434 live.dvrSoftwareFeId = liveConfig.getDvrSoftwareFeConnection();
Amy Zhange50f08d2021-03-30 15:56:02 -0700435 }
Amy Zhang06fa69e2021-04-09 09:56:25 -0700436 if (liveConfig.hasIpFilterConnection()) {
437 live.ipFilterId = liveConfig.getIpFilterConnection();
438 } else {
439 live.ipFilterId = emptyHardwareId;
440 }
Amy Zhange6915052021-03-30 13:44:43 -0700441 }
442
443 static void connectScan(ScanHardwareConnections& scan) {
Amy Zhang160a72c2021-04-24 21:15:26 -0700444 auto dataFlow = getDataFlowConfiguration();
445 if (dataFlow.hasScan()) {
446 scan.hasFrontendConnection = true;
447 } else {
448 scan.hasFrontendConnection = false;
449 return;
450 }
451 auto scanConfig = *dataFlow.getFirstScan();
452 scan.frontendId = scanConfig.getFrontendConnection();
Amy Zhange6915052021-03-30 13:44:43 -0700453 }
454
Amy Zhange50f08d2021-03-30 15:56:02 -0700455 static void connectDvrPlayback(DvrPlaybackHardwareConnections& playback) {
456 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700457 if (dataFlow.hasDvrPlayback()) {
458 playback.support = true;
459 } else {
Amy Zhang160a72c2021-04-24 21:15:26 -0700460 playback.support = false;
Amy Zhange50f08d2021-03-30 15:56:02 -0700461 return;
462 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700463 auto playbackConfig = *dataFlow.getFirstDvrPlayback();
464 playback.dvrId = playbackConfig.getDvrConnection();
465 playback.audioFilterId = playbackConfig.getAudioFilterConnection();
466 playback.videoFilterId = playbackConfig.getVideoFilterConnection();
467 if (playbackConfig.hasSectionFilterConnection()) {
468 playback.sectionFilterId = playbackConfig.getSectionFilterConnection();
469 } else {
470 playback.sectionFilterId = emptyHardwareId;
471 }
Amy Zhange50f08d2021-03-30 15:56:02 -0700472 }
473
Amy Zhange6915052021-03-30 13:44:43 -0700474 static void connectDvrRecord(DvrRecordHardwareConnections& record) {
475 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700476 if (dataFlow.hasDvrRecord()) {
477 record.support = true;
478 } else {
Amy Zhang160a72c2021-04-24 21:15:26 -0700479 record.support = false;
Amy Zhange6915052021-03-30 13:44:43 -0700480 return;
481 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700482 auto recordConfig = *dataFlow.getFirstDvrRecord();
483 record.frontendId = recordConfig.getFrontendConnection();
484 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;
492 } else {
493 record.hasFrontendConnection = false;
494 record.dvrSourceId = recordConfig.getDvrSourceConnection();
495 }
Amy Zhange6915052021-03-30 13:44:43 -0700496 }
497
498 static void connectDescrambling(DescramblingHardwareConnections& descrambling) {
499 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700500 if (dataFlow.hasDescrambling()) {
501 descrambling.support = true;
502 } else {
Amy Zhang160a72c2021-04-24 21:15:26 -0700503 descrambling.support = false;
Amy Zhange6915052021-03-30 13:44:43 -0700504 return;
505 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700506 auto descConfig = *dataFlow.getFirstDescrambling();
507 descrambling.frontendId = descConfig.getFrontendConnection();
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;
517 } else {
518 descrambling.hasFrontendConnection = false;
519 descrambling.dvrSourceId = descConfig.getDvrSourceConnection();
520 }
Amy Zhange6915052021-03-30 13:44:43 -0700521 }
522
523 static void connectLnbLive(LnbLiveHardwareConnections& lnbLive) {
524 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700525 if (dataFlow.hasLnbLive()) {
526 lnbLive.support = true;
527 } else {
Amy Zhang160a72c2021-04-24 21:15:26 -0700528 lnbLive.support = false;
Amy Zhange6915052021-03-30 13:44:43 -0700529 return;
530 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700531 auto lnbLiveConfig = *dataFlow.getFirstLnbLive();
532 lnbLive.frontendId = lnbLiveConfig.getFrontendConnection();
533 lnbLive.audioFilterId = lnbLiveConfig.getAudioFilterConnection();
534 lnbLive.videoFilterId = lnbLiveConfig.getVideoFilterConnection();
Amy Zhangc0e9a112021-04-01 19:25:21 -0700535 lnbLive.lnbId = lnbLiveConfig.getLnbConnection();
536 if (lnbLiveConfig.hasDiseqcMsgSender()) {
537 for (auto msgName : lnbLiveConfig.getDiseqcMsgSender()) {
538 lnbLive.diseqcMsgs.push_back(msgName);
539 }
540 }
Amy Zhange6915052021-03-30 13:44:43 -0700541 }
542
543 static void connectLnbRecord(LnbRecordHardwareConnections& lnbRecord) {
544 auto dataFlow = getDataFlowConfiguration();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700545 if (dataFlow.hasLnbRecord()) {
546 lnbRecord.support = true;
547 } else {
Amy Zhang160a72c2021-04-24 21:15:26 -0700548 lnbRecord.support = false;
Amy Zhange6915052021-03-30 13:44:43 -0700549 return;
550 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700551 auto lnbRecordConfig = *dataFlow.getFirstLnbRecord();
552 lnbRecord.frontendId = lnbRecordConfig.getFrontendConnection();
553 lnbRecord.recordFilterId = lnbRecordConfig.getRecordFilterConnection();
554 lnbRecord.dvrRecordId = lnbRecordConfig.getDvrRecordConnection();
Amy Zhangc0e9a112021-04-01 19:25:21 -0700555 lnbRecord.lnbId = lnbRecordConfig.getLnbConnection();
556 if (lnbRecordConfig.hasDiseqcMsgSender()) {
557 for (auto msgName : lnbRecordConfig.getDiseqcMsgSender()) {
558 lnbRecord.diseqcMsgs.push_back(msgName);
559 }
560 }
561 }
562
563 static void connectTimeFilter(TimeFilterHardwareConnections& timeFilter) {
564 auto dataFlow = getDataFlowConfiguration();
565 if (dataFlow.hasTimeFilter()) {
566 timeFilter.support = true;
567 } else {
Amy Zhang160a72c2021-04-24 21:15:26 -0700568 timeFilter.support = false;
Amy Zhangc0e9a112021-04-01 19:25:21 -0700569 return;
570 }
571 auto timeFilterConfig = *dataFlow.getFirstTimeFilter();
572 timeFilter.timeFilterId = timeFilterConfig.getTimeFilterConnection();
Amy Zhange6915052021-03-30 13:44:43 -0700573 }
574
Amy Zhang06fa69e2021-04-09 09:56:25 -0700575 static HardwareConfiguration getHardwareConfig() {
576 return *getTunerConfig().getFirstHardwareConfiguration();
577 }
578
Amy Zhange6915052021-03-30 13:44:43 -0700579 private:
580 static FrontendDvbtSettings readDvbtFrontendSettings(Frontend feConfig) {
Amy Zhange50f08d2021-03-30 15:56:02 -0700581 ALOGW("[ConfigReader] fe type is dvbt");
Amy Zhange6915052021-03-30 13:44:43 -0700582 FrontendDvbtSettings dvbtSettings{
583 .frequency = (uint32_t)feConfig.getFrequency(),
584 };
585 if (!feConfig.hasDvbtFrontendSettings_optional()) {
586 ALOGW("[ConfigReader] no more dvbt settings");
587 return dvbtSettings;
588 }
Amy Zhang06fa69e2021-04-09 09:56:25 -0700589 auto dvbt = feConfig.getFirstDvbtFrontendSettings_optional();
590 uint32_t trans = static_cast<uint32_t>(dvbt->getTransmissionMode());
591 if (trans <= (uint32_t)FrontendDvbtTransmissionMode::MODE_32K) {
592 dvbtSettings.transmissionMode = static_cast<FrontendDvbtTransmissionMode>(trans);
593 }
594 dvbtSettings.bandwidth = static_cast<FrontendDvbtBandwidth>(dvbt->getBandwidth());
595 dvbtSettings.isHighPriority = dvbt->getIsHighPriority();
596 if (dvbt->hasConstellation()) {
597 dvbtSettings.constellation =
598 static_cast<FrontendDvbtConstellation>(dvbt->getConstellation());
599 }
Amy Zhange6915052021-03-30 13:44:43 -0700600 return dvbtSettings;
601 }
602
603 static FrontendDvbsSettings readDvbsFrontendSettings(Frontend feConfig) {
Amy Zhange50f08d2021-03-30 15:56:02 -0700604 ALOGW("[ConfigReader] fe type is dvbs");
Amy Zhange6915052021-03-30 13:44:43 -0700605 FrontendDvbsSettings dvbsSettings{
606 .frequency = (uint32_t)feConfig.getFrequency(),
607 };
608 if (!feConfig.hasDvbsFrontendSettings_optional()) {
609 ALOGW("[ConfigReader] no more dvbs settings");
610 return dvbsSettings;
611 }
612 dvbsSettings.symbolRate = static_cast<uint32_t>(
613 feConfig.getFirstDvbsFrontendSettings_optional()->getSymbolRate());
614 dvbsSettings.inputStreamId = static_cast<uint32_t>(
615 feConfig.getFirstDvbsFrontendSettings_optional()->getInputStreamId());
616 return dvbsSettings;
617 }
618
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700619 static bool readFilterTypeAndSettings(Filter filterConfig, DemuxFilterType& type,
620 DemuxFilterSettings& settings) {
621 auto mainType = filterConfig.getMainType();
622 auto subType = filterConfig.getSubType();
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700623 switch (mainType) {
624 case FilterMainTypeEnum::TS: {
625 ALOGW("[ConfigReader] filter main type is ts");
626 type.mainType = DemuxFilterMainType::TS;
627 switch (subType) {
628 case FilterSubTypeEnum::UNDEFINED:
Amy Zhang06fa69e2021-04-09 09:56:25 -0700629 type.subType.tsFilterType(DemuxTsFilterType::UNDEFINED);
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700630 break;
631 case FilterSubTypeEnum::SECTION:
632 type.subType.tsFilterType(DemuxTsFilterType::SECTION);
633 settings.ts().filterSettings.section(
634 readSectionFilterSettings(filterConfig));
635 break;
636 case FilterSubTypeEnum::PES:
637 // TODO: b/182519645 support all the filter settings
638 /*settings.ts().filterSettings.pesData(
639 getPesFilterSettings(filterConfig));*/
640 type.subType.tsFilterType(DemuxTsFilterType::PES);
641 break;
642 case FilterSubTypeEnum::TS:
643 type.subType.tsFilterType(DemuxTsFilterType::TS);
644 settings.ts().filterSettings.noinit();
645 break;
646 case FilterSubTypeEnum::PCR:
647 type.subType.tsFilterType(DemuxTsFilterType::PCR);
648 settings.ts().filterSettings.noinit();
649 break;
650 case FilterSubTypeEnum::TEMI:
651 type.subType.tsFilterType(DemuxTsFilterType::TEMI);
652 settings.ts().filterSettings.noinit();
653 break;
654 case FilterSubTypeEnum::AUDIO:
655 type.subType.tsFilterType(DemuxTsFilterType::AUDIO);
656 settings.ts().filterSettings.av(readAvFilterSettings(filterConfig));
657 break;
658 case FilterSubTypeEnum::VIDEO:
659 type.subType.tsFilterType(DemuxTsFilterType::VIDEO);
660 settings.ts().filterSettings.av(readAvFilterSettings(filterConfig));
661 break;
662 case FilterSubTypeEnum::RECORD:
663 type.subType.tsFilterType(DemuxTsFilterType::RECORD);
664 settings.ts().filterSettings.record(readRecordFilterSettings(filterConfig));
665 break;
666 default:
667 ALOGW("[ConfigReader] ts subtype is not supported");
668 return false;
669 }
Amy Zhang06fa69e2021-04-09 09:56:25 -0700670 if (filterConfig.hasPid()) {
671 settings.ts().tpid = static_cast<uint32_t>(filterConfig.getPid());
672 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700673 break;
674 }
675 case FilterMainTypeEnum::MMTP: {
676 ALOGW("[ConfigReader] filter main type is mmtp");
677 type.mainType = DemuxFilterMainType::MMTP;
678 switch (subType) {
679 case FilterSubTypeEnum::UNDEFINED:
Amy Zhang06fa69e2021-04-09 09:56:25 -0700680 type.subType.mmtpFilterType(DemuxMmtpFilterType::UNDEFINED);
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700681 break;
682 case FilterSubTypeEnum::SECTION:
683 type.subType.mmtpFilterType(DemuxMmtpFilterType::SECTION);
684 settings.mmtp().filterSettings.section(
685 readSectionFilterSettings(filterConfig));
686 break;
687 case FilterSubTypeEnum::PES:
688 type.subType.mmtpFilterType(DemuxMmtpFilterType::PES);
689 // TODO: b/182519645 support all the filter settings
690 /*settings.mmtp().filterSettings.pesData(
691 getPesFilterSettings(filterConfig));*/
692 break;
693 case FilterSubTypeEnum::MMTP:
694 type.subType.mmtpFilterType(DemuxMmtpFilterType::MMTP);
695 settings.mmtp().filterSettings.noinit();
696 break;
697 case FilterSubTypeEnum::AUDIO:
698 type.subType.mmtpFilterType(DemuxMmtpFilterType::AUDIO);
699 settings.mmtp().filterSettings.av(readAvFilterSettings(filterConfig));
700 break;
701 case FilterSubTypeEnum::VIDEO:
702 settings.mmtp().filterSettings.av(readAvFilterSettings(filterConfig));
703 break;
704 case FilterSubTypeEnum::RECORD:
705 type.subType.mmtpFilterType(DemuxMmtpFilterType::RECORD);
706 settings.mmtp().filterSettings.record(
707 readRecordFilterSettings(filterConfig));
708 break;
709 case FilterSubTypeEnum::DOWNLOAD:
710 type.subType.mmtpFilterType(DemuxMmtpFilterType::DOWNLOAD);
711 // TODO: b/182519645 support all the filter settings
712 /*settings.mmtp().filterSettings.download(
713 getDownloadFilterSettings(filterConfig));*/
714 break;
715 default:
716 ALOGW("[ConfigReader] mmtp subtype is not supported");
717 return false;
718 }
Amy Zhang06fa69e2021-04-09 09:56:25 -0700719 if (filterConfig.hasPid()) {
720 settings.mmtp().mmtpPid = static_cast<uint32_t>(filterConfig.getPid());
721 }
722 break;
723 }
724 case FilterMainTypeEnum::IP: {
725 ALOGW("[ConfigReader] filter main type is ip");
726 type.mainType = DemuxFilterMainType::IP;
727 switch (subType) {
728 case FilterSubTypeEnum::UNDEFINED:
729 type.subType.ipFilterType(DemuxIpFilterType::UNDEFINED);
730 break;
731 case FilterSubTypeEnum::SECTION:
732 type.subType.ipFilterType(DemuxIpFilterType::SECTION);
733 settings.ip().filterSettings.section(
734 readSectionFilterSettings(filterConfig));
735 break;
736 case FilterSubTypeEnum::NTP:
737 type.subType.ipFilterType(DemuxIpFilterType::NTP);
738 settings.ip().filterSettings.noinit();
739 break;
740 case FilterSubTypeEnum::IP: {
741 DemuxIpFilterSettings ip{
742 .ipAddr = readIpAddress(filterConfig),
743 };
744 ip.filterSettings.bPassthrough(readPassthroughSettings(filterConfig));
745 settings.ip(ip);
746 break;
747 }
748 case FilterSubTypeEnum::IP_PAYLOAD:
749 type.subType.ipFilterType(DemuxIpFilterType::IP_PAYLOAD);
750 settings.ip().filterSettings.noinit();
751 break;
752 case FilterSubTypeEnum::PAYLOAD_THROUGH:
753 type.subType.ipFilterType(DemuxIpFilterType::PAYLOAD_THROUGH);
754 settings.ip().filterSettings.noinit();
755 break;
756 default:
757 ALOGW("[ConfigReader] mmtp subtype is not supported");
758 return false;
759 }
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700760 break;
761 }
762 default:
763 // TODO: b/182519645 support all the filter configs
764 ALOGW("[ConfigReader] filter main type is not supported in dynamic config");
765 return false;
766 }
767 return true;
768 }
769
Amy Zhang06fa69e2021-04-09 09:56:25 -0700770 static DemuxIpAddress readIpAddress(Filter filterConfig) {
771 DemuxIpAddress ipAddress;
772 if (!filterConfig.hasIpFilterConfig_optional()) {
773 return ipAddress;
774 }
775 auto ipFilterConfig = filterConfig.getFirstIpFilterConfig_optional();
776 if (ipFilterConfig->hasSrcPort()) {
777 ipAddress.srcPort = ipFilterConfig->getSrcPort();
778 }
779 if (ipFilterConfig->hasDestPort()) {
780 ipAddress.dstPort = ipFilterConfig->getDestPort();
781 }
782 if (ipFilterConfig->getFirstSrcIpAddress()->getIsIpV4()) {
783 memcpy(ipAddress.srcIpAddress.v4().data(),
784 ipFilterConfig->getFirstSrcIpAddress()->getIp().data(), 4);
785 } else {
786 memcpy(ipAddress.srcIpAddress.v6().data(),
787 ipFilterConfig->getFirstSrcIpAddress()->getIp().data(), 6);
788 }
789 if (ipFilterConfig->getFirstDestIpAddress()->getIsIpV4()) {
790 memcpy(ipAddress.dstIpAddress.v4().data(),
791 ipFilterConfig->getFirstDestIpAddress()->getIp().data(), 4);
792 } else {
793 memcpy(ipAddress.dstIpAddress.v6().data(),
794 ipFilterConfig->getFirstDestIpAddress()->getIp().data(), 6);
795 }
796 return ipAddress;
797 }
798
799 static bool readPassthroughSettings(Filter filterConfig) {
800 if (!filterConfig.hasIpFilterConfig_optional()) {
801 return false;
802 }
803 auto ipFilterConfig = filterConfig.getFirstIpFilterConfig_optional();
804 if (ipFilterConfig->hasDataPassthrough()) {
805 return ipFilterConfig->getDataPassthrough();
806 }
807 return false;
808 }
809
Amy Zhang2ea2fe22021-04-01 11:55:41 -0700810 static DemuxFilterSectionSettings readSectionFilterSettings(Filter filterConfig) {
811 DemuxFilterSectionSettings settings;
812 if (!filterConfig.hasSectionFilterSettings_optional()) {
813 return settings;
814 }
815 auto section = filterConfig.getFirstSectionFilterSettings_optional();
816 settings.isCheckCrc = section->getIsCheckCrc();
817 settings.isRepeat = section->getIsRepeat();
818 settings.isRaw = section->getIsRaw();
819 return settings;
820 }
821
822 static DemuxFilterAvSettings readAvFilterSettings(Filter filterConfig) {
823 DemuxFilterAvSettings settings;
824 if (!filterConfig.hasAvFilterSettings_optional()) {
825 return settings;
826 }
827 auto av = filterConfig.getFirstAvFilterSettings_optional();
828 settings.isPassthrough = av->getIsPassthrough();
829 return settings;
830 }
831
832 static DemuxFilterRecordSettings readRecordFilterSettings(Filter filterConfig) {
833 DemuxFilterRecordSettings settings;
834 if (!filterConfig.hasRecordFilterSettings_optional()) {
835 return settings;
836 }
837 auto record = filterConfig.getFirstRecordFilterSettings_optional();
838 settings.tsIndexMask = static_cast<uint32_t>(record->getTsIndexMask());
839 settings.scIndexType = static_cast<DemuxRecordScIndexType>(record->getScIndexType());
840 return settings;
841 }
842
Amy Zhange50f08d2021-03-30 15:56:02 -0700843 static PlaybackSettings readPlaybackSettings(Dvr dvrConfig) {
844 ALOGW("[ConfigReader] dvr type is playback");
845 PlaybackSettings playbackSettings{
846 .statusMask = static_cast<uint8_t>(dvrConfig.getStatusMask()),
847 .lowThreshold = static_cast<uint32_t>(dvrConfig.getLowThreshold()),
848 .highThreshold = static_cast<uint32_t>(dvrConfig.getHighThreshold()),
849 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
850 .packetSize = static_cast<uint8_t>(dvrConfig.getPacketSize()),
851 };
852 return playbackSettings;
853 }
854
855 static RecordSettings readRecordSettings(Dvr dvrConfig) {
856 ALOGW("[ConfigReader] dvr type is record");
857 RecordSettings recordSettings{
858 .statusMask = static_cast<uint8_t>(dvrConfig.getStatusMask()),
859 .lowThreshold = static_cast<uint32_t>(dvrConfig.getLowThreshold()),
860 .highThreshold = static_cast<uint32_t>(dvrConfig.getHighThreshold()),
861 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
862 .packetSize = static_cast<uint8_t>(dvrConfig.getPacketSize()),
863 };
864 return recordSettings;
865 }
866
Amy Zhang06fa69e2021-04-09 09:56:25 -0700867 static TunerConfiguration getTunerConfig() { return *read(mConfigFilePath.c_str()); }
Amy Zhange6915052021-03-30 13:44:43 -0700868
869 static DataFlowConfiguration getDataFlowConfiguration() {
870 return *getTunerConfig().getFirstDataFlowConfiguration();
871 }
872};