xref: /aosp_15_r20/hardware/interfaces/tv/tuner/config/TunerTestingConfigReaderV1_0.h (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright 2021 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker  *
4*4d7e907cSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker  *
8*4d7e907cSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker  *
10*4d7e907cSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker  * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker  */
16*4d7e907cSAndroid Build Coastguard Worker 
17*4d7e907cSAndroid Build Coastguard Worker #include <android-base/logging.h>
18*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/tv/tuner/1.0/types.h>
19*4d7e907cSAndroid Build Coastguard Worker #include <android_media_tuner_testing_configuration_V1_0.h>
20*4d7e907cSAndroid Build Coastguard Worker #include <android_media_tuner_testing_configuration_V1_0_enums.h>
21*4d7e907cSAndroid Build Coastguard Worker #include <binder/MemoryDealer.h>
22*4d7e907cSAndroid Build Coastguard Worker #include <hidl/HidlSupport.h>
23*4d7e907cSAndroid Build Coastguard Worker #include <hidl/HidlTransportSupport.h>
24*4d7e907cSAndroid Build Coastguard Worker #include <hidl/Status.h>
25*4d7e907cSAndroid Build Coastguard Worker #include <hidlmemory/FrameworkUtils.h>
26*4d7e907cSAndroid Build Coastguard Worker 
27*4d7e907cSAndroid Build Coastguard Worker using namespace std;
28*4d7e907cSAndroid Build Coastguard Worker using namespace android::media::tuner::testing::configuration::V1_0;
29*4d7e907cSAndroid Build Coastguard Worker 
30*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::DataFormat;
31*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::DemuxAlpFilterType;
32*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::DemuxFilterAvSettings;
33*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::DemuxFilterEvent;
34*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::DemuxFilterMainType;
35*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::DemuxFilterRecordSettings;
36*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::DemuxFilterSectionSettings;
37*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::DemuxFilterSettings;
38*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::DemuxFilterType;
39*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::DemuxIpAddress;
40*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::DemuxIpFilterSettings;
41*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::DemuxIpFilterType;
42*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::DemuxMmtpFilterType;
43*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::DemuxRecordScIndexType;
44*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::DemuxTlvFilterType;
45*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::DemuxTpid;
46*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::DemuxTsFilterType;
47*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::DvrSettings;
48*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::DvrType;
49*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::FrontendDvbsSettings;
50*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::FrontendDvbtBandwidth;
51*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::FrontendDvbtCoderate;
52*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::FrontendDvbtConstellation;
53*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::FrontendDvbtGuardInterval;
54*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::FrontendDvbtHierarchy;
55*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::FrontendDvbtPlpMode;
56*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::FrontendDvbtSettings;
57*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::FrontendDvbtStandard;
58*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::FrontendDvbtTransmissionMode;
59*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::FrontendSettings;
60*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::FrontendStatus;
61*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::FrontendStatusType;
62*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::FrontendType;
63*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::LnbPosition;
64*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::LnbTone;
65*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::LnbVoltage;
66*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::PlaybackSettings;
67*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::RecordSettings;
68*4d7e907cSAndroid Build Coastguard Worker using android::hardware::tv::tuner::V1_0::FrontendAtscSettings;
69*4d7e907cSAndroid Build Coastguard Worker 
70*4d7e907cSAndroid Build Coastguard Worker const string emptyHardwareId = "";
71*4d7e907cSAndroid Build Coastguard Worker 
72*4d7e907cSAndroid Build Coastguard Worker static string mConfigFilePath;
73*4d7e907cSAndroid Build Coastguard Worker 
74*4d7e907cSAndroid Build Coastguard Worker #define PROVISION_STR                                      \
75*4d7e907cSAndroid Build Coastguard Worker     "{                                                   " \
76*4d7e907cSAndroid Build Coastguard Worker     "  \"id\": 21140844,                                 " \
77*4d7e907cSAndroid Build Coastguard Worker     "  \"name\": \"Test Title\",                         " \
78*4d7e907cSAndroid Build Coastguard Worker     "  \"lowercase_organization_name\": \"Android\",     " \
79*4d7e907cSAndroid Build Coastguard Worker     "  \"asset_key\": {                                  " \
80*4d7e907cSAndroid Build Coastguard Worker     "  \"encryption_key\": \"nezAr3CHFrmBR9R8Tedotw==\"  " \
81*4d7e907cSAndroid Build Coastguard Worker     "  },                                                " \
82*4d7e907cSAndroid Build Coastguard Worker     "  \"cas_type\": 1,                                  " \
83*4d7e907cSAndroid Build Coastguard Worker     "  \"track_types\": [ ]                              " \
84*4d7e907cSAndroid Build Coastguard Worker     "}                                                   "
85*4d7e907cSAndroid Build Coastguard Worker 
86*4d7e907cSAndroid Build Coastguard Worker struct FrontendConfig {
87*4d7e907cSAndroid Build Coastguard Worker     bool isSoftwareFe;
88*4d7e907cSAndroid Build Coastguard Worker     FrontendType type;
89*4d7e907cSAndroid Build Coastguard Worker     FrontendSettings settings;
90*4d7e907cSAndroid Build Coastguard Worker     vector<FrontendStatusType> tuneStatusTypes;
91*4d7e907cSAndroid Build Coastguard Worker     vector<FrontendStatus> expectTuneStatuses;
92*4d7e907cSAndroid Build Coastguard Worker };
93*4d7e907cSAndroid Build Coastguard Worker 
94*4d7e907cSAndroid Build Coastguard Worker struct FilterConfig {
95*4d7e907cSAndroid Build Coastguard Worker     uint32_t bufferSize;
96*4d7e907cSAndroid Build Coastguard Worker     DemuxFilterType type;
97*4d7e907cSAndroid Build Coastguard Worker     DemuxFilterSettings settings;
98*4d7e907cSAndroid Build Coastguard Worker     bool getMqDesc;
99*4d7e907cSAndroid Build Coastguard Worker 
100*4d7e907cSAndroid Build Coastguard Worker     bool operator<(const FilterConfig& /*c*/) const { return false; }
101*4d7e907cSAndroid Build Coastguard Worker };
102*4d7e907cSAndroid Build Coastguard Worker 
103*4d7e907cSAndroid Build Coastguard Worker struct DvrConfig {
104*4d7e907cSAndroid Build Coastguard Worker     DvrType type;
105*4d7e907cSAndroid Build Coastguard Worker     uint32_t bufferSize;
106*4d7e907cSAndroid Build Coastguard Worker     DvrSettings settings;
107*4d7e907cSAndroid Build Coastguard Worker     string playbackInputFile;
108*4d7e907cSAndroid Build Coastguard Worker };
109*4d7e907cSAndroid Build Coastguard Worker 
110*4d7e907cSAndroid Build Coastguard Worker struct LnbConfig {
111*4d7e907cSAndroid Build Coastguard Worker     string name;
112*4d7e907cSAndroid Build Coastguard Worker     LnbVoltage voltage;
113*4d7e907cSAndroid Build Coastguard Worker     LnbTone tone;
114*4d7e907cSAndroid Build Coastguard Worker     LnbPosition position;
115*4d7e907cSAndroid Build Coastguard Worker };
116*4d7e907cSAndroid Build Coastguard Worker 
117*4d7e907cSAndroid Build Coastguard Worker struct TimeFilterConfig {
118*4d7e907cSAndroid Build Coastguard Worker     uint64_t timeStamp;
119*4d7e907cSAndroid Build Coastguard Worker };
120*4d7e907cSAndroid Build Coastguard Worker 
121*4d7e907cSAndroid Build Coastguard Worker struct DescramblerConfig {
122*4d7e907cSAndroid Build Coastguard Worker     uint32_t casSystemId;
123*4d7e907cSAndroid Build Coastguard Worker     string provisionStr;
124*4d7e907cSAndroid Build Coastguard Worker     vector<uint8_t> hidlPvtData;
125*4d7e907cSAndroid Build Coastguard Worker };
126*4d7e907cSAndroid Build Coastguard Worker 
127*4d7e907cSAndroid Build Coastguard Worker struct LiveBroadcastHardwareConnections {
128*4d7e907cSAndroid Build Coastguard Worker     bool hasFrontendConnection;
129*4d7e907cSAndroid Build Coastguard Worker     string frontendId;
130*4d7e907cSAndroid Build Coastguard Worker     string dvrSoftwareFeId;
131*4d7e907cSAndroid Build Coastguard Worker     string audioFilterId;
132*4d7e907cSAndroid Build Coastguard Worker     string videoFilterId;
133*4d7e907cSAndroid Build Coastguard Worker     string sectionFilterId;
134*4d7e907cSAndroid Build Coastguard Worker     string ipFilterId;
135*4d7e907cSAndroid Build Coastguard Worker     string pcrFilterId;
136*4d7e907cSAndroid Build Coastguard Worker     /* list string of extra filters; */
137*4d7e907cSAndroid Build Coastguard Worker };
138*4d7e907cSAndroid Build Coastguard Worker 
139*4d7e907cSAndroid Build Coastguard Worker struct ScanHardwareConnections {
140*4d7e907cSAndroid Build Coastguard Worker     bool hasFrontendConnection;
141*4d7e907cSAndroid Build Coastguard Worker     string frontendId;
142*4d7e907cSAndroid Build Coastguard Worker };
143*4d7e907cSAndroid Build Coastguard Worker 
144*4d7e907cSAndroid Build Coastguard Worker struct DvrPlaybackHardwareConnections {
145*4d7e907cSAndroid Build Coastguard Worker     bool support;
146*4d7e907cSAndroid Build Coastguard Worker     string frontendId;
147*4d7e907cSAndroid Build Coastguard Worker     string dvrId;
148*4d7e907cSAndroid Build Coastguard Worker     string audioFilterId;
149*4d7e907cSAndroid Build Coastguard Worker     string videoFilterId;
150*4d7e907cSAndroid Build Coastguard Worker     string sectionFilterId;
151*4d7e907cSAndroid Build Coastguard Worker     /* list string of extra filters; */
152*4d7e907cSAndroid Build Coastguard Worker };
153*4d7e907cSAndroid Build Coastguard Worker 
154*4d7e907cSAndroid Build Coastguard Worker struct DvrRecordHardwareConnections {
155*4d7e907cSAndroid Build Coastguard Worker     bool support;
156*4d7e907cSAndroid Build Coastguard Worker     bool hasFrontendConnection;
157*4d7e907cSAndroid Build Coastguard Worker     string frontendId;
158*4d7e907cSAndroid Build Coastguard Worker     string dvrRecordId;
159*4d7e907cSAndroid Build Coastguard Worker     string dvrSoftwareFeId;
160*4d7e907cSAndroid Build Coastguard Worker     string recordFilterId;
161*4d7e907cSAndroid Build Coastguard Worker     string dvrSourceId;
162*4d7e907cSAndroid Build Coastguard Worker };
163*4d7e907cSAndroid Build Coastguard Worker 
164*4d7e907cSAndroid Build Coastguard Worker struct DescramblingHardwareConnections {
165*4d7e907cSAndroid Build Coastguard Worker     bool support;
166*4d7e907cSAndroid Build Coastguard Worker     bool hasFrontendConnection;
167*4d7e907cSAndroid Build Coastguard Worker     string frontendId;
168*4d7e907cSAndroid Build Coastguard Worker     string dvrSoftwareFeId;
169*4d7e907cSAndroid Build Coastguard Worker     string audioFilterId;
170*4d7e907cSAndroid Build Coastguard Worker     string videoFilterId;
171*4d7e907cSAndroid Build Coastguard Worker     string descramblerId;
172*4d7e907cSAndroid Build Coastguard Worker     string dvrSourceId;
173*4d7e907cSAndroid Build Coastguard Worker     /* list string of extra filters; */
174*4d7e907cSAndroid Build Coastguard Worker };
175*4d7e907cSAndroid Build Coastguard Worker 
176*4d7e907cSAndroid Build Coastguard Worker struct LnbLiveHardwareConnections {
177*4d7e907cSAndroid Build Coastguard Worker     bool support;
178*4d7e907cSAndroid Build Coastguard Worker     string frontendId;
179*4d7e907cSAndroid Build Coastguard Worker     string audioFilterId;
180*4d7e907cSAndroid Build Coastguard Worker     string videoFilterId;
181*4d7e907cSAndroid Build Coastguard Worker     string lnbId;
182*4d7e907cSAndroid Build Coastguard Worker     vector<string> diseqcMsgs;
183*4d7e907cSAndroid Build Coastguard Worker     /* list string of extra filters; */
184*4d7e907cSAndroid Build Coastguard Worker };
185*4d7e907cSAndroid Build Coastguard Worker 
186*4d7e907cSAndroid Build Coastguard Worker struct LnbRecordHardwareConnections {
187*4d7e907cSAndroid Build Coastguard Worker     bool support;
188*4d7e907cSAndroid Build Coastguard Worker     string frontendId;
189*4d7e907cSAndroid Build Coastguard Worker     string dvrRecordId;
190*4d7e907cSAndroid Build Coastguard Worker     string recordFilterId;
191*4d7e907cSAndroid Build Coastguard Worker     string lnbId;
192*4d7e907cSAndroid Build Coastguard Worker     vector<string> diseqcMsgs;
193*4d7e907cSAndroid Build Coastguard Worker     /* list string of extra filters; */
194*4d7e907cSAndroid Build Coastguard Worker };
195*4d7e907cSAndroid Build Coastguard Worker 
196*4d7e907cSAndroid Build Coastguard Worker struct TimeFilterHardwareConnections {
197*4d7e907cSAndroid Build Coastguard Worker     bool support;
198*4d7e907cSAndroid Build Coastguard Worker     string timeFilterId;
199*4d7e907cSAndroid Build Coastguard Worker };
200*4d7e907cSAndroid Build Coastguard Worker 
201*4d7e907cSAndroid Build Coastguard Worker struct TunerTestingConfigReader1_0 {
202*4d7e907cSAndroid Build Coastguard Worker   public:
setConfigFilePathTunerTestingConfigReader1_0203*4d7e907cSAndroid Build Coastguard Worker     static void setConfigFilePath(string path) { mConfigFilePath = path; }
204*4d7e907cSAndroid Build Coastguard Worker 
checkConfigFileExistsTunerTestingConfigReader1_0205*4d7e907cSAndroid Build Coastguard Worker     static bool checkConfigFileExists() {
206*4d7e907cSAndroid Build Coastguard Worker         auto res = read(mConfigFilePath.c_str());
207*4d7e907cSAndroid Build Coastguard Worker         if (res == nullopt) {
208*4d7e907cSAndroid Build Coastguard Worker             ALOGW("[ConfigReader] Couldn't read %s."
209*4d7e907cSAndroid Build Coastguard Worker                   "Please check tuner_testing_dynamic_configuration.xsd"
210*4d7e907cSAndroid Build Coastguard Worker                   "and sample_tuner_vts_config.xml for more details on how to config Tune VTS.",
211*4d7e907cSAndroid Build Coastguard Worker                   mConfigFilePath.c_str());
212*4d7e907cSAndroid Build Coastguard Worker         }
213*4d7e907cSAndroid Build Coastguard Worker         return (res != nullopt);
214*4d7e907cSAndroid Build Coastguard Worker     }
215*4d7e907cSAndroid Build Coastguard Worker 
readFrontendConfig1_0TunerTestingConfigReader1_0216*4d7e907cSAndroid Build Coastguard Worker     static void readFrontendConfig1_0(map<string, FrontendConfig>& frontendMap) {
217*4d7e907cSAndroid Build Coastguard Worker         auto hardwareConfig = getHardwareConfig();
218*4d7e907cSAndroid Build Coastguard Worker         if (hardwareConfig.hasFrontends()) {
219*4d7e907cSAndroid Build Coastguard Worker             // TODO: b/182519645 complete the tune status config
220*4d7e907cSAndroid Build Coastguard Worker             vector<FrontendStatusType> types;
221*4d7e907cSAndroid Build Coastguard Worker             types.push_back(FrontendStatusType::DEMOD_LOCK);
222*4d7e907cSAndroid Build Coastguard Worker             FrontendStatus status;
223*4d7e907cSAndroid Build Coastguard Worker             status.isDemodLocked(true);
224*4d7e907cSAndroid Build Coastguard Worker             vector<FrontendStatus> statuses;
225*4d7e907cSAndroid Build Coastguard Worker             statuses.push_back(status);
226*4d7e907cSAndroid Build Coastguard Worker 
227*4d7e907cSAndroid Build Coastguard Worker             auto frontends = *hardwareConfig.getFirstFrontends();
228*4d7e907cSAndroid Build Coastguard Worker             for (auto feConfig : frontends.getFrontend()) {
229*4d7e907cSAndroid Build Coastguard Worker                 string id = feConfig.getId();
230*4d7e907cSAndroid Build Coastguard Worker                 if (id.compare(string("FE_DEFAULT")) == 0) {
231*4d7e907cSAndroid Build Coastguard Worker                     // overrid default
232*4d7e907cSAndroid Build Coastguard Worker                     frontendMap.erase(string("FE_DEFAULT"));
233*4d7e907cSAndroid Build Coastguard Worker                 }
234*4d7e907cSAndroid Build Coastguard Worker                 FrontendType type;
235*4d7e907cSAndroid Build Coastguard Worker                 switch (feConfig.getType()) {
236*4d7e907cSAndroid Build Coastguard Worker                     case FrontendTypeEnum::UNDEFINED:
237*4d7e907cSAndroid Build Coastguard Worker                         type = FrontendType::UNDEFINED;
238*4d7e907cSAndroid Build Coastguard Worker                         break;
239*4d7e907cSAndroid Build Coastguard Worker                     // TODO: b/182519645 finish all other frontend settings
240*4d7e907cSAndroid Build Coastguard Worker                     case FrontendTypeEnum::ANALOG:
241*4d7e907cSAndroid Build Coastguard Worker                         type = FrontendType::ANALOG;
242*4d7e907cSAndroid Build Coastguard Worker                         break;
243*4d7e907cSAndroid Build Coastguard Worker                     case FrontendTypeEnum::ATSC:
244*4d7e907cSAndroid Build Coastguard Worker                         type = FrontendType::ATSC;
245*4d7e907cSAndroid Build Coastguard Worker                         frontendMap[id].settings.atsc(readAtscFrontendSettings(feConfig));
246*4d7e907cSAndroid Build Coastguard Worker                         break;
247*4d7e907cSAndroid Build Coastguard Worker                     case FrontendTypeEnum::ATSC3:
248*4d7e907cSAndroid Build Coastguard Worker                         type = FrontendType::ATSC3;
249*4d7e907cSAndroid Build Coastguard Worker                         break;
250*4d7e907cSAndroid Build Coastguard Worker                     case FrontendTypeEnum::DVBC:
251*4d7e907cSAndroid Build Coastguard Worker                         type = FrontendType::DVBC;
252*4d7e907cSAndroid Build Coastguard Worker                         break;
253*4d7e907cSAndroid Build Coastguard Worker                     case FrontendTypeEnum::DVBS:
254*4d7e907cSAndroid Build Coastguard Worker                         type = FrontendType::DVBS;
255*4d7e907cSAndroid Build Coastguard Worker                         frontendMap[id].settings.dvbs(readDvbsFrontendSettings(feConfig));
256*4d7e907cSAndroid Build Coastguard Worker                         break;
257*4d7e907cSAndroid Build Coastguard Worker                     case FrontendTypeEnum::DVBT: {
258*4d7e907cSAndroid Build Coastguard Worker                         type = FrontendType::DVBT;
259*4d7e907cSAndroid Build Coastguard Worker                         frontendMap[id].settings.dvbt(readDvbtFrontendSettings(feConfig));
260*4d7e907cSAndroid Build Coastguard Worker                         break;
261*4d7e907cSAndroid Build Coastguard Worker                     }
262*4d7e907cSAndroid Build Coastguard Worker                     case FrontendTypeEnum::ISDBS:
263*4d7e907cSAndroid Build Coastguard Worker                         type = FrontendType::ISDBS;
264*4d7e907cSAndroid Build Coastguard Worker                         break;
265*4d7e907cSAndroid Build Coastguard Worker                     case FrontendTypeEnum::ISDBS3:
266*4d7e907cSAndroid Build Coastguard Worker                         type = FrontendType::ISDBS3;
267*4d7e907cSAndroid Build Coastguard Worker                         break;
268*4d7e907cSAndroid Build Coastguard Worker                     case FrontendTypeEnum::ISDBT:
269*4d7e907cSAndroid Build Coastguard Worker                         type = FrontendType::ISDBT;
270*4d7e907cSAndroid Build Coastguard Worker                         break;
271*4d7e907cSAndroid Build Coastguard Worker                     case FrontendTypeEnum::DTMB:
272*4d7e907cSAndroid Build Coastguard Worker                         // dtmb will be handled in readFrontendConfig1_1;
273*4d7e907cSAndroid Build Coastguard Worker                         continue;
274*4d7e907cSAndroid Build Coastguard Worker                     case FrontendTypeEnum::UNKNOWN:
275*4d7e907cSAndroid Build Coastguard Worker                         ALOGW("[ConfigReader] invalid frontend type");
276*4d7e907cSAndroid Build Coastguard Worker                         return;
277*4d7e907cSAndroid Build Coastguard Worker                 }
278*4d7e907cSAndroid Build Coastguard Worker                 frontendMap[id].type = type;
279*4d7e907cSAndroid Build Coastguard Worker                 frontendMap[id].isSoftwareFe = feConfig.getIsSoftwareFrontend();
280*4d7e907cSAndroid Build Coastguard Worker                 // TODO: b/182519645 complete the tune status config
281*4d7e907cSAndroid Build Coastguard Worker                 frontendMap[id].tuneStatusTypes = types;
282*4d7e907cSAndroid Build Coastguard Worker                 frontendMap[id].expectTuneStatuses = statuses;
283*4d7e907cSAndroid Build Coastguard Worker             }
284*4d7e907cSAndroid Build Coastguard Worker         }
285*4d7e907cSAndroid Build Coastguard Worker     }
286*4d7e907cSAndroid Build Coastguard Worker 
readFilterConfig1_0TunerTestingConfigReader1_0287*4d7e907cSAndroid Build Coastguard Worker     static void readFilterConfig1_0(map<string, FilterConfig>& filterMap) {
288*4d7e907cSAndroid Build Coastguard Worker         auto hardwareConfig = getHardwareConfig();
289*4d7e907cSAndroid Build Coastguard Worker         if (hardwareConfig.hasFilters()) {
290*4d7e907cSAndroid Build Coastguard Worker             auto filters = *hardwareConfig.getFirstFilters();
291*4d7e907cSAndroid Build Coastguard Worker             for (auto filterConfig : filters.getFilter()) {
292*4d7e907cSAndroid Build Coastguard Worker                 string id = filterConfig.getId();
293*4d7e907cSAndroid Build Coastguard Worker                 if (id.compare(string("FILTER_AUDIO_DEFAULT")) == 0) {
294*4d7e907cSAndroid Build Coastguard Worker                     // overrid default
295*4d7e907cSAndroid Build Coastguard Worker                     filterMap.erase(string("FILTER_AUDIO_DEFAULT"));
296*4d7e907cSAndroid Build Coastguard Worker                 }
297*4d7e907cSAndroid Build Coastguard Worker                 if (id.compare(string("FILTER_VIDEO_DEFAULT")) == 0) {
298*4d7e907cSAndroid Build Coastguard Worker                     // overrid default
299*4d7e907cSAndroid Build Coastguard Worker                     filterMap.erase(string("FILTER_VIDEO_DEFAULT"));
300*4d7e907cSAndroid Build Coastguard Worker                 }
301*4d7e907cSAndroid Build Coastguard Worker 
302*4d7e907cSAndroid Build Coastguard Worker                 DemuxFilterType type;
303*4d7e907cSAndroid Build Coastguard Worker                 DemuxFilterSettings settings;
304*4d7e907cSAndroid Build Coastguard Worker                 if (!readFilterTypeAndSettings(filterConfig, type, settings)) {
305*4d7e907cSAndroid Build Coastguard Worker                     ALOGW("[ConfigReader] invalid filter type");
306*4d7e907cSAndroid Build Coastguard Worker                     return;
307*4d7e907cSAndroid Build Coastguard Worker                 }
308*4d7e907cSAndroid Build Coastguard Worker                 filterMap[id].type = type;
309*4d7e907cSAndroid Build Coastguard Worker                 filterMap[id].bufferSize = filterConfig.getBufferSize();
310*4d7e907cSAndroid Build Coastguard Worker                 filterMap[id].getMqDesc = filterConfig.getUseFMQ();
311*4d7e907cSAndroid Build Coastguard Worker                 filterMap[id].settings = settings;
312*4d7e907cSAndroid Build Coastguard Worker             }
313*4d7e907cSAndroid Build Coastguard Worker         }
314*4d7e907cSAndroid Build Coastguard Worker     }
315*4d7e907cSAndroid Build Coastguard Worker 
readDvrConfig1_0TunerTestingConfigReader1_0316*4d7e907cSAndroid Build Coastguard Worker     static void readDvrConfig1_0(map<string, DvrConfig>& dvrMap) {
317*4d7e907cSAndroid Build Coastguard Worker         auto hardwareConfig = getHardwareConfig();
318*4d7e907cSAndroid Build Coastguard Worker         if (hardwareConfig.hasDvrs()) {
319*4d7e907cSAndroid Build Coastguard Worker             auto dvrs = *hardwareConfig.getFirstDvrs();
320*4d7e907cSAndroid Build Coastguard Worker             for (auto dvrConfig : dvrs.getDvr()) {
321*4d7e907cSAndroid Build Coastguard Worker                 string id = dvrConfig.getId();
322*4d7e907cSAndroid Build Coastguard Worker                 DvrType type;
323*4d7e907cSAndroid Build Coastguard Worker                 switch (dvrConfig.getType()) {
324*4d7e907cSAndroid Build Coastguard Worker                     case DvrTypeEnum::PLAYBACK:
325*4d7e907cSAndroid Build Coastguard Worker                         type = DvrType::PLAYBACK;
326*4d7e907cSAndroid Build Coastguard Worker                         dvrMap[id].settings.playback(readPlaybackSettings(dvrConfig));
327*4d7e907cSAndroid Build Coastguard Worker                         break;
328*4d7e907cSAndroid Build Coastguard Worker                     case DvrTypeEnum::RECORD:
329*4d7e907cSAndroid Build Coastguard Worker                         type = DvrType::RECORD;
330*4d7e907cSAndroid Build Coastguard Worker                         dvrMap[id].settings.record(readRecordSettings(dvrConfig));
331*4d7e907cSAndroid Build Coastguard Worker                         break;
332*4d7e907cSAndroid Build Coastguard Worker                     case DvrTypeEnum::UNKNOWN:
333*4d7e907cSAndroid Build Coastguard Worker                         ALOGW("[ConfigReader] invalid DVR type");
334*4d7e907cSAndroid Build Coastguard Worker                         return;
335*4d7e907cSAndroid Build Coastguard Worker                 }
336*4d7e907cSAndroid Build Coastguard Worker                 dvrMap[id].type = type;
337*4d7e907cSAndroid Build Coastguard Worker                 dvrMap[id].bufferSize = static_cast<uint32_t>(dvrConfig.getBufferSize());
338*4d7e907cSAndroid Build Coastguard Worker                 if (dvrConfig.hasInputFilePath()) {
339*4d7e907cSAndroid Build Coastguard Worker                     dvrMap[id].playbackInputFile = dvrConfig.getInputFilePath();
340*4d7e907cSAndroid Build Coastguard Worker                 }
341*4d7e907cSAndroid Build Coastguard Worker             }
342*4d7e907cSAndroid Build Coastguard Worker         }
343*4d7e907cSAndroid Build Coastguard Worker     }
344*4d7e907cSAndroid Build Coastguard Worker 
readLnbConfig1_0TunerTestingConfigReader1_0345*4d7e907cSAndroid Build Coastguard Worker     static void readLnbConfig1_0(map<string, LnbConfig>& lnbMap) {
346*4d7e907cSAndroid Build Coastguard Worker         auto hardwareConfig = getHardwareConfig();
347*4d7e907cSAndroid Build Coastguard Worker         if (hardwareConfig.hasLnbs()) {
348*4d7e907cSAndroid Build Coastguard Worker             auto lnbs = *hardwareConfig.getFirstLnbs();
349*4d7e907cSAndroid Build Coastguard Worker             for (auto lnbConfig : lnbs.getLnb()) {
350*4d7e907cSAndroid Build Coastguard Worker                 string id = lnbConfig.getId();
351*4d7e907cSAndroid Build Coastguard Worker                 if (lnbConfig.hasName()) {
352*4d7e907cSAndroid Build Coastguard Worker                     lnbMap[id].name = lnbConfig.getName();
353*4d7e907cSAndroid Build Coastguard Worker                 } else {
354*4d7e907cSAndroid Build Coastguard Worker                     lnbMap[id].name = emptyHardwareId;
355*4d7e907cSAndroid Build Coastguard Worker                 }
356*4d7e907cSAndroid Build Coastguard Worker                 lnbMap[id].voltage = static_cast<LnbVoltage>(lnbConfig.getVoltage());
357*4d7e907cSAndroid Build Coastguard Worker                 lnbMap[id].tone = static_cast<LnbTone>(lnbConfig.getTone());
358*4d7e907cSAndroid Build Coastguard Worker                 lnbMap[id].position = static_cast<LnbPosition>(lnbConfig.getPosition());
359*4d7e907cSAndroid Build Coastguard Worker             }
360*4d7e907cSAndroid Build Coastguard Worker         }
361*4d7e907cSAndroid Build Coastguard Worker     }
362*4d7e907cSAndroid Build Coastguard Worker 
readDescramblerConfig1_0TunerTestingConfigReader1_0363*4d7e907cSAndroid Build Coastguard Worker     static void readDescramblerConfig1_0(map<string, DescramblerConfig>& descramblerMap) {
364*4d7e907cSAndroid Build Coastguard Worker         auto hardwareConfig = getHardwareConfig();
365*4d7e907cSAndroid Build Coastguard Worker         if (hardwareConfig.hasDescramblers()) {
366*4d7e907cSAndroid Build Coastguard Worker             auto descramblers = *hardwareConfig.getFirstDescramblers();
367*4d7e907cSAndroid Build Coastguard Worker             for (auto descramblerConfig : descramblers.getDescrambler()) {
368*4d7e907cSAndroid Build Coastguard Worker                 string id = descramblerConfig.getId();
369*4d7e907cSAndroid Build Coastguard Worker                 descramblerMap[id].casSystemId =
370*4d7e907cSAndroid Build Coastguard Worker                         static_cast<uint32_t>(descramblerConfig.getCasSystemId());
371*4d7e907cSAndroid Build Coastguard Worker                 if (descramblerConfig.hasProvisionStr()) {
372*4d7e907cSAndroid Build Coastguard Worker                     descramblerMap[id].provisionStr = descramblerConfig.getProvisionStr();
373*4d7e907cSAndroid Build Coastguard Worker                 } else {
374*4d7e907cSAndroid Build Coastguard Worker                     descramblerMap[id].provisionStr = PROVISION_STR;
375*4d7e907cSAndroid Build Coastguard Worker                 }
376*4d7e907cSAndroid Build Coastguard Worker                 if (descramblerConfig.hasSesstionPrivatData()) {
377*4d7e907cSAndroid Build Coastguard Worker                     auto privateData = descramblerConfig.getSesstionPrivatData();
378*4d7e907cSAndroid Build Coastguard Worker                     int size = privateData.size();
379*4d7e907cSAndroid Build Coastguard Worker                     descramblerMap[id].hidlPvtData.resize(size);
380*4d7e907cSAndroid Build Coastguard Worker                     memcpy(descramblerMap[id].hidlPvtData.data(), privateData.data(), size);
381*4d7e907cSAndroid Build Coastguard Worker                 } else {
382*4d7e907cSAndroid Build Coastguard Worker                     descramblerMap[id].hidlPvtData.resize(256);
383*4d7e907cSAndroid Build Coastguard Worker                 }
384*4d7e907cSAndroid Build Coastguard Worker             }
385*4d7e907cSAndroid Build Coastguard Worker         }
386*4d7e907cSAndroid Build Coastguard Worker     }
387*4d7e907cSAndroid Build Coastguard Worker 
readDiseqcMessagesTunerTestingConfigReader1_0388*4d7e907cSAndroid Build Coastguard Worker     static void readDiseqcMessages(map<string, vector<uint8_t>>& diseqcMsgMap) {
389*4d7e907cSAndroid Build Coastguard Worker         auto hardwareConfig = getHardwareConfig();
390*4d7e907cSAndroid Build Coastguard Worker         if (hardwareConfig.hasDiseqcMessages()) {
391*4d7e907cSAndroid Build Coastguard Worker             auto msgs = *hardwareConfig.getFirstDiseqcMessages();
392*4d7e907cSAndroid Build Coastguard Worker             for (auto msgConfig : msgs.getDiseqcMessage()) {
393*4d7e907cSAndroid Build Coastguard Worker                 string name = msgConfig.getMsgName();
394*4d7e907cSAndroid Build Coastguard Worker                 for (uint8_t atom : msgConfig.getMsgBody()) {
395*4d7e907cSAndroid Build Coastguard Worker                     diseqcMsgMap[name].push_back(atom);
396*4d7e907cSAndroid Build Coastguard Worker                 }
397*4d7e907cSAndroid Build Coastguard Worker             }
398*4d7e907cSAndroid Build Coastguard Worker         }
399*4d7e907cSAndroid Build Coastguard Worker     }
400*4d7e907cSAndroid Build Coastguard Worker 
readTimeFilterConfig1_0TunerTestingConfigReader1_0401*4d7e907cSAndroid Build Coastguard Worker     static void readTimeFilterConfig1_0(map<string, TimeFilterConfig>& timeFilterMap) {
402*4d7e907cSAndroid Build Coastguard Worker         auto hardwareConfig = getHardwareConfig();
403*4d7e907cSAndroid Build Coastguard Worker         if (hardwareConfig.hasTimeFilters()) {
404*4d7e907cSAndroid Build Coastguard Worker             auto timeFilters = *hardwareConfig.getFirstTimeFilters();
405*4d7e907cSAndroid Build Coastguard Worker             for (auto timeFilterConfig : timeFilters.getTimeFilter()) {
406*4d7e907cSAndroid Build Coastguard Worker                 string id = timeFilterConfig.getId();
407*4d7e907cSAndroid Build Coastguard Worker                 timeFilterMap[id].timeStamp =
408*4d7e907cSAndroid Build Coastguard Worker                         static_cast<uint64_t>(timeFilterConfig.getTimeStamp());
409*4d7e907cSAndroid Build Coastguard Worker             }
410*4d7e907cSAndroid Build Coastguard Worker         }
411*4d7e907cSAndroid Build Coastguard Worker     }
412*4d7e907cSAndroid Build Coastguard Worker 
connectLiveBroadcastTunerTestingConfigReader1_0413*4d7e907cSAndroid Build Coastguard Worker     static void connectLiveBroadcast(LiveBroadcastHardwareConnections& live) {
414*4d7e907cSAndroid Build Coastguard Worker         auto dataFlow = getDataFlowConfiguration();
415*4d7e907cSAndroid Build Coastguard Worker         if (dataFlow.hasClearLiveBroadcast()) {
416*4d7e907cSAndroid Build Coastguard Worker             live.hasFrontendConnection = true;
417*4d7e907cSAndroid Build Coastguard Worker         } else {
418*4d7e907cSAndroid Build Coastguard Worker             live.hasFrontendConnection = false;
419*4d7e907cSAndroid Build Coastguard Worker             return;
420*4d7e907cSAndroid Build Coastguard Worker         }
421*4d7e907cSAndroid Build Coastguard Worker         auto liveConfig = *dataFlow.getFirstClearLiveBroadcast();
422*4d7e907cSAndroid Build Coastguard Worker         live.frontendId = liveConfig.getFrontendConnection();
423*4d7e907cSAndroid Build Coastguard Worker 
424*4d7e907cSAndroid Build Coastguard Worker         live.audioFilterId = liveConfig.getAudioFilterConnection();
425*4d7e907cSAndroid Build Coastguard Worker         live.videoFilterId = liveConfig.getVideoFilterConnection();
426*4d7e907cSAndroid Build Coastguard Worker         if (liveConfig.hasPcrFilterConnection()) {
427*4d7e907cSAndroid Build Coastguard Worker             live.pcrFilterId = liveConfig.getPcrFilterConnection();
428*4d7e907cSAndroid Build Coastguard Worker         } else {
429*4d7e907cSAndroid Build Coastguard Worker             live.pcrFilterId = emptyHardwareId;
430*4d7e907cSAndroid Build Coastguard Worker         }
431*4d7e907cSAndroid Build Coastguard Worker         if (liveConfig.hasSectionFilterConnection()) {
432*4d7e907cSAndroid Build Coastguard Worker             live.sectionFilterId = liveConfig.getSectionFilterConnection();
433*4d7e907cSAndroid Build Coastguard Worker         } else {
434*4d7e907cSAndroid Build Coastguard Worker             live.sectionFilterId = emptyHardwareId;
435*4d7e907cSAndroid Build Coastguard Worker         }
436*4d7e907cSAndroid Build Coastguard Worker         if (liveConfig.hasDvrSoftwareFeConnection()) {
437*4d7e907cSAndroid Build Coastguard Worker             live.dvrSoftwareFeId = liveConfig.getDvrSoftwareFeConnection();
438*4d7e907cSAndroid Build Coastguard Worker         }
439*4d7e907cSAndroid Build Coastguard Worker         if (liveConfig.hasIpFilterConnection()) {
440*4d7e907cSAndroid Build Coastguard Worker             live.ipFilterId = liveConfig.getIpFilterConnection();
441*4d7e907cSAndroid Build Coastguard Worker         } else {
442*4d7e907cSAndroid Build Coastguard Worker             live.ipFilterId = emptyHardwareId;
443*4d7e907cSAndroid Build Coastguard Worker         }
444*4d7e907cSAndroid Build Coastguard Worker     }
445*4d7e907cSAndroid Build Coastguard Worker 
connectScanTunerTestingConfigReader1_0446*4d7e907cSAndroid Build Coastguard Worker     static void connectScan(ScanHardwareConnections& scan) {
447*4d7e907cSAndroid Build Coastguard Worker         auto dataFlow = getDataFlowConfiguration();
448*4d7e907cSAndroid Build Coastguard Worker         if (dataFlow.hasScan()) {
449*4d7e907cSAndroid Build Coastguard Worker             scan.hasFrontendConnection = true;
450*4d7e907cSAndroid Build Coastguard Worker         } else {
451*4d7e907cSAndroid Build Coastguard Worker             scan.hasFrontendConnection = false;
452*4d7e907cSAndroid Build Coastguard Worker             return;
453*4d7e907cSAndroid Build Coastguard Worker         }
454*4d7e907cSAndroid Build Coastguard Worker         auto scanConfig = *dataFlow.getFirstScan();
455*4d7e907cSAndroid Build Coastguard Worker         scan.frontendId = scanConfig.getFrontendConnection();
456*4d7e907cSAndroid Build Coastguard Worker     }
457*4d7e907cSAndroid Build Coastguard Worker 
connectDvrPlaybackTunerTestingConfigReader1_0458*4d7e907cSAndroid Build Coastguard Worker     static void connectDvrPlayback(DvrPlaybackHardwareConnections& playback) {
459*4d7e907cSAndroid Build Coastguard Worker         auto dataFlow = getDataFlowConfiguration();
460*4d7e907cSAndroid Build Coastguard Worker         if (dataFlow.hasDvrPlayback()) {
461*4d7e907cSAndroid Build Coastguard Worker             playback.support = true;
462*4d7e907cSAndroid Build Coastguard Worker         } else {
463*4d7e907cSAndroid Build Coastguard Worker             playback.support = false;
464*4d7e907cSAndroid Build Coastguard Worker             return;
465*4d7e907cSAndroid Build Coastguard Worker         }
466*4d7e907cSAndroid Build Coastguard Worker         auto playbackConfig = *dataFlow.getFirstDvrPlayback();
467*4d7e907cSAndroid Build Coastguard Worker         playback.dvrId = playbackConfig.getDvrConnection();
468*4d7e907cSAndroid Build Coastguard Worker         playback.audioFilterId = playbackConfig.getAudioFilterConnection();
469*4d7e907cSAndroid Build Coastguard Worker         playback.videoFilterId = playbackConfig.getVideoFilterConnection();
470*4d7e907cSAndroid Build Coastguard Worker         if (playbackConfig.hasSectionFilterConnection()) {
471*4d7e907cSAndroid Build Coastguard Worker             playback.sectionFilterId = playbackConfig.getSectionFilterConnection();
472*4d7e907cSAndroid Build Coastguard Worker         } else {
473*4d7e907cSAndroid Build Coastguard Worker             playback.sectionFilterId = emptyHardwareId;
474*4d7e907cSAndroid Build Coastguard Worker         }
475*4d7e907cSAndroid Build Coastguard Worker     }
476*4d7e907cSAndroid Build Coastguard Worker 
connectDvrRecordTunerTestingConfigReader1_0477*4d7e907cSAndroid Build Coastguard Worker     static void connectDvrRecord(DvrRecordHardwareConnections& record) {
478*4d7e907cSAndroid Build Coastguard Worker         auto dataFlow = getDataFlowConfiguration();
479*4d7e907cSAndroid Build Coastguard Worker         if (dataFlow.hasDvrRecord()) {
480*4d7e907cSAndroid Build Coastguard Worker             record.support = true;
481*4d7e907cSAndroid Build Coastguard Worker         } else {
482*4d7e907cSAndroid Build Coastguard Worker             record.support = false;
483*4d7e907cSAndroid Build Coastguard Worker             return;
484*4d7e907cSAndroid Build Coastguard Worker         }
485*4d7e907cSAndroid Build Coastguard Worker         auto recordConfig = *dataFlow.getFirstDvrRecord();
486*4d7e907cSAndroid Build Coastguard Worker         record.recordFilterId = recordConfig.getRecordFilterConnection();
487*4d7e907cSAndroid Build Coastguard Worker         record.dvrRecordId = recordConfig.getDvrRecordConnection();
488*4d7e907cSAndroid Build Coastguard Worker         if (recordConfig.hasDvrSoftwareFeConnection()) {
489*4d7e907cSAndroid Build Coastguard Worker             record.dvrSoftwareFeId = recordConfig.getDvrSoftwareFeConnection();
490*4d7e907cSAndroid Build Coastguard Worker         }
491*4d7e907cSAndroid Build Coastguard Worker         if (recordConfig.getHasFrontendConnection()) {
492*4d7e907cSAndroid Build Coastguard Worker             record.hasFrontendConnection = true;
493*4d7e907cSAndroid Build Coastguard Worker             record.dvrSourceId = emptyHardwareId;
494*4d7e907cSAndroid Build Coastguard Worker             record.frontendId = recordConfig.getFrontendConnection();
495*4d7e907cSAndroid Build Coastguard Worker         } else {
496*4d7e907cSAndroid Build Coastguard Worker             record.hasFrontendConnection = false;
497*4d7e907cSAndroid Build Coastguard Worker             record.dvrSourceId = recordConfig.getDvrSourceConnection();
498*4d7e907cSAndroid Build Coastguard Worker         }
499*4d7e907cSAndroid Build Coastguard Worker     }
500*4d7e907cSAndroid Build Coastguard Worker 
connectDescramblingTunerTestingConfigReader1_0501*4d7e907cSAndroid Build Coastguard Worker     static void connectDescrambling(DescramblingHardwareConnections& descrambling) {
502*4d7e907cSAndroid Build Coastguard Worker         auto dataFlow = getDataFlowConfiguration();
503*4d7e907cSAndroid Build Coastguard Worker         if (dataFlow.hasDescrambling()) {
504*4d7e907cSAndroid Build Coastguard Worker             descrambling.support = true;
505*4d7e907cSAndroid Build Coastguard Worker         } else {
506*4d7e907cSAndroid Build Coastguard Worker             descrambling.support = false;
507*4d7e907cSAndroid Build Coastguard Worker             return;
508*4d7e907cSAndroid Build Coastguard Worker         }
509*4d7e907cSAndroid Build Coastguard Worker         auto descConfig = *dataFlow.getFirstDescrambling();
510*4d7e907cSAndroid Build Coastguard Worker         descrambling.descramblerId = descConfig.getDescramblerConnection();
511*4d7e907cSAndroid Build Coastguard Worker         descrambling.audioFilterId = descConfig.getAudioFilterConnection();
512*4d7e907cSAndroid Build Coastguard Worker         descrambling.videoFilterId = descConfig.getVideoFilterConnection();
513*4d7e907cSAndroid Build Coastguard Worker         if (descConfig.hasDvrSoftwareFeConnection()) {
514*4d7e907cSAndroid Build Coastguard Worker             descrambling.dvrSoftwareFeId = descConfig.getDvrSoftwareFeConnection();
515*4d7e907cSAndroid Build Coastguard Worker         }
516*4d7e907cSAndroid Build Coastguard Worker         if (descConfig.getHasFrontendConnection()) {
517*4d7e907cSAndroid Build Coastguard Worker             descrambling.hasFrontendConnection = true;
518*4d7e907cSAndroid Build Coastguard Worker             descrambling.dvrSourceId = emptyHardwareId;
519*4d7e907cSAndroid Build Coastguard Worker             descrambling.frontendId = descConfig.getFrontendConnection();
520*4d7e907cSAndroid Build Coastguard Worker         } else {
521*4d7e907cSAndroid Build Coastguard Worker             descrambling.hasFrontendConnection = false;
522*4d7e907cSAndroid Build Coastguard Worker             descrambling.dvrSourceId = descConfig.getDvrSourceConnection();
523*4d7e907cSAndroid Build Coastguard Worker         }
524*4d7e907cSAndroid Build Coastguard Worker     }
525*4d7e907cSAndroid Build Coastguard Worker 
connectLnbLiveTunerTestingConfigReader1_0526*4d7e907cSAndroid Build Coastguard Worker     static void connectLnbLive(LnbLiveHardwareConnections& lnbLive) {
527*4d7e907cSAndroid Build Coastguard Worker         auto dataFlow = getDataFlowConfiguration();
528*4d7e907cSAndroid Build Coastguard Worker         if (dataFlow.hasLnbLive()) {
529*4d7e907cSAndroid Build Coastguard Worker             lnbLive.support = true;
530*4d7e907cSAndroid Build Coastguard Worker         } else {
531*4d7e907cSAndroid Build Coastguard Worker             lnbLive.support = false;
532*4d7e907cSAndroid Build Coastguard Worker             return;
533*4d7e907cSAndroid Build Coastguard Worker         }
534*4d7e907cSAndroid Build Coastguard Worker         auto lnbLiveConfig = *dataFlow.getFirstLnbLive();
535*4d7e907cSAndroid Build Coastguard Worker         lnbLive.frontendId = lnbLiveConfig.getFrontendConnection();
536*4d7e907cSAndroid Build Coastguard Worker         lnbLive.audioFilterId = lnbLiveConfig.getAudioFilterConnection();
537*4d7e907cSAndroid Build Coastguard Worker         lnbLive.videoFilterId = lnbLiveConfig.getVideoFilterConnection();
538*4d7e907cSAndroid Build Coastguard Worker         lnbLive.lnbId = lnbLiveConfig.getLnbConnection();
539*4d7e907cSAndroid Build Coastguard Worker         if (lnbLiveConfig.hasDiseqcMsgSender()) {
540*4d7e907cSAndroid Build Coastguard Worker             for (auto msgName : lnbLiveConfig.getDiseqcMsgSender()) {
541*4d7e907cSAndroid Build Coastguard Worker                 lnbLive.diseqcMsgs.push_back(msgName);
542*4d7e907cSAndroid Build Coastguard Worker             }
543*4d7e907cSAndroid Build Coastguard Worker         }
544*4d7e907cSAndroid Build Coastguard Worker     }
545*4d7e907cSAndroid Build Coastguard Worker 
connectLnbRecordTunerTestingConfigReader1_0546*4d7e907cSAndroid Build Coastguard Worker     static void connectLnbRecord(LnbRecordHardwareConnections& lnbRecord) {
547*4d7e907cSAndroid Build Coastguard Worker         auto dataFlow = getDataFlowConfiguration();
548*4d7e907cSAndroid Build Coastguard Worker         if (dataFlow.hasLnbRecord()) {
549*4d7e907cSAndroid Build Coastguard Worker             lnbRecord.support = true;
550*4d7e907cSAndroid Build Coastguard Worker         } else {
551*4d7e907cSAndroid Build Coastguard Worker             lnbRecord.support = false;
552*4d7e907cSAndroid Build Coastguard Worker             return;
553*4d7e907cSAndroid Build Coastguard Worker         }
554*4d7e907cSAndroid Build Coastguard Worker         auto lnbRecordConfig = *dataFlow.getFirstLnbRecord();
555*4d7e907cSAndroid Build Coastguard Worker         lnbRecord.frontendId = lnbRecordConfig.getFrontendConnection();
556*4d7e907cSAndroid Build Coastguard Worker         lnbRecord.recordFilterId = lnbRecordConfig.getRecordFilterConnection();
557*4d7e907cSAndroid Build Coastguard Worker         lnbRecord.dvrRecordId = lnbRecordConfig.getDvrRecordConnection();
558*4d7e907cSAndroid Build Coastguard Worker         lnbRecord.lnbId = lnbRecordConfig.getLnbConnection();
559*4d7e907cSAndroid Build Coastguard Worker         if (lnbRecordConfig.hasDiseqcMsgSender()) {
560*4d7e907cSAndroid Build Coastguard Worker             for (auto msgName : lnbRecordConfig.getDiseqcMsgSender()) {
561*4d7e907cSAndroid Build Coastguard Worker                 lnbRecord.diseqcMsgs.push_back(msgName);
562*4d7e907cSAndroid Build Coastguard Worker             }
563*4d7e907cSAndroid Build Coastguard Worker         }
564*4d7e907cSAndroid Build Coastguard Worker     }
565*4d7e907cSAndroid Build Coastguard Worker 
connectTimeFilterTunerTestingConfigReader1_0566*4d7e907cSAndroid Build Coastguard Worker     static void connectTimeFilter(TimeFilterHardwareConnections& timeFilter) {
567*4d7e907cSAndroid Build Coastguard Worker         auto dataFlow = getDataFlowConfiguration();
568*4d7e907cSAndroid Build Coastguard Worker         if (dataFlow.hasTimeFilter()) {
569*4d7e907cSAndroid Build Coastguard Worker             timeFilter.support = true;
570*4d7e907cSAndroid Build Coastguard Worker         } else {
571*4d7e907cSAndroid Build Coastguard Worker             timeFilter.support = false;
572*4d7e907cSAndroid Build Coastguard Worker             return;
573*4d7e907cSAndroid Build Coastguard Worker         }
574*4d7e907cSAndroid Build Coastguard Worker         auto timeFilterConfig = *dataFlow.getFirstTimeFilter();
575*4d7e907cSAndroid Build Coastguard Worker         timeFilter.timeFilterId = timeFilterConfig.getTimeFilterConnection();
576*4d7e907cSAndroid Build Coastguard Worker     }
577*4d7e907cSAndroid Build Coastguard Worker 
getHardwareConfigTunerTestingConfigReader1_0578*4d7e907cSAndroid Build Coastguard Worker     static HardwareConfiguration getHardwareConfig() {
579*4d7e907cSAndroid Build Coastguard Worker         return *getTunerConfig().getFirstHardwareConfiguration();
580*4d7e907cSAndroid Build Coastguard Worker     }
581*4d7e907cSAndroid Build Coastguard Worker 
582*4d7e907cSAndroid Build Coastguard Worker   private:
readDvbtFrontendSettingsTunerTestingConfigReader1_0583*4d7e907cSAndroid Build Coastguard Worker     static FrontendDvbtSettings readDvbtFrontendSettings(Frontend feConfig) {
584*4d7e907cSAndroid Build Coastguard Worker         ALOGW("[ConfigReader] fe type is dvbt");
585*4d7e907cSAndroid Build Coastguard Worker         FrontendDvbtSettings dvbtSettings{
586*4d7e907cSAndroid Build Coastguard Worker                 .frequency = (uint32_t)feConfig.getFrequency(),
587*4d7e907cSAndroid Build Coastguard Worker         };
588*4d7e907cSAndroid Build Coastguard Worker         if (!feConfig.hasDvbtFrontendSettings_optional()) {
589*4d7e907cSAndroid Build Coastguard Worker             ALOGW("[ConfigReader] no more dvbt settings");
590*4d7e907cSAndroid Build Coastguard Worker             return dvbtSettings;
591*4d7e907cSAndroid Build Coastguard Worker         }
592*4d7e907cSAndroid Build Coastguard Worker         auto dvbt = feConfig.getFirstDvbtFrontendSettings_optional();
593*4d7e907cSAndroid Build Coastguard Worker         uint32_t trans = static_cast<uint32_t>(dvbt->getTransmissionMode());
594*4d7e907cSAndroid Build Coastguard Worker         if (trans <= (uint32_t)FrontendDvbtTransmissionMode::MODE_32K) {
595*4d7e907cSAndroid Build Coastguard Worker             dvbtSettings.transmissionMode = static_cast<FrontendDvbtTransmissionMode>(trans);
596*4d7e907cSAndroid Build Coastguard Worker         }
597*4d7e907cSAndroid Build Coastguard Worker         dvbtSettings.bandwidth = static_cast<FrontendDvbtBandwidth>(dvbt->getBandwidth());
598*4d7e907cSAndroid Build Coastguard Worker         dvbtSettings.isHighPriority = dvbt->getIsHighPriority();
599*4d7e907cSAndroid Build Coastguard Worker         dvbtSettings.hierarchy = static_cast<FrontendDvbtHierarchy>(dvbt->getHierarchy());
600*4d7e907cSAndroid Build Coastguard Worker         dvbtSettings.hpCoderate = static_cast<FrontendDvbtCoderate>(dvbt->getHpCoderate());
601*4d7e907cSAndroid Build Coastguard Worker         dvbtSettings.lpCoderate = static_cast<FrontendDvbtCoderate>(dvbt->getLpCoderate());
602*4d7e907cSAndroid Build Coastguard Worker         dvbtSettings.guardInterval =
603*4d7e907cSAndroid Build Coastguard Worker                 static_cast<FrontendDvbtGuardInterval>(dvbt->getGuardInterval());
604*4d7e907cSAndroid Build Coastguard Worker         dvbtSettings.standard = static_cast<FrontendDvbtStandard>(dvbt->getStandard());
605*4d7e907cSAndroid Build Coastguard Worker         dvbtSettings.isMiso = dvbt->getIsMiso();
606*4d7e907cSAndroid Build Coastguard Worker         dvbtSettings.plpMode = static_cast<FrontendDvbtPlpMode>(dvbt->getPlpMode());
607*4d7e907cSAndroid Build Coastguard Worker         dvbtSettings.plpId = dvbt->getPlpId();
608*4d7e907cSAndroid Build Coastguard Worker         dvbtSettings.plpGroupId = dvbt->getPlpGroupId();
609*4d7e907cSAndroid Build Coastguard Worker         if (dvbt->hasConstellation()) {
610*4d7e907cSAndroid Build Coastguard Worker             dvbtSettings.constellation =
611*4d7e907cSAndroid Build Coastguard Worker                     static_cast<FrontendDvbtConstellation>(dvbt->getConstellation());
612*4d7e907cSAndroid Build Coastguard Worker         }
613*4d7e907cSAndroid Build Coastguard Worker         return dvbtSettings;
614*4d7e907cSAndroid Build Coastguard Worker     }
615*4d7e907cSAndroid Build Coastguard Worker 
readDvbsFrontendSettingsTunerTestingConfigReader1_0616*4d7e907cSAndroid Build Coastguard Worker     static FrontendDvbsSettings readDvbsFrontendSettings(Frontend feConfig) {
617*4d7e907cSAndroid Build Coastguard Worker         ALOGW("[ConfigReader] fe type is dvbs");
618*4d7e907cSAndroid Build Coastguard Worker         FrontendDvbsSettings dvbsSettings{
619*4d7e907cSAndroid Build Coastguard Worker                 .frequency = (uint32_t)feConfig.getFrequency(),
620*4d7e907cSAndroid Build Coastguard Worker         };
621*4d7e907cSAndroid Build Coastguard Worker         if (!feConfig.hasDvbsFrontendSettings_optional()) {
622*4d7e907cSAndroid Build Coastguard Worker             ALOGW("[ConfigReader] no more dvbs settings");
623*4d7e907cSAndroid Build Coastguard Worker             return dvbsSettings;
624*4d7e907cSAndroid Build Coastguard Worker         }
625*4d7e907cSAndroid Build Coastguard Worker         dvbsSettings.symbolRate = static_cast<uint32_t>(
626*4d7e907cSAndroid Build Coastguard Worker                 feConfig.getFirstDvbsFrontendSettings_optional()->getSymbolRate());
627*4d7e907cSAndroid Build Coastguard Worker         dvbsSettings.inputStreamId = static_cast<uint32_t>(
628*4d7e907cSAndroid Build Coastguard Worker                 feConfig.getFirstDvbsFrontendSettings_optional()->getInputStreamId());
629*4d7e907cSAndroid Build Coastguard Worker         return dvbsSettings;
630*4d7e907cSAndroid Build Coastguard Worker     }
631*4d7e907cSAndroid Build Coastguard Worker 
readAtscFrontendSettingsTunerTestingConfigReader1_0632*4d7e907cSAndroid Build Coastguard Worker     static FrontendAtscSettings readAtscFrontendSettings(Frontend feConfig) {
633*4d7e907cSAndroid Build Coastguard Worker         FrontendAtscSettings atscSettings{
634*4d7e907cSAndroid Build Coastguard Worker             .frequency = (uint32_t)feConfig.getFrequency(),
635*4d7e907cSAndroid Build Coastguard Worker         };
636*4d7e907cSAndroid Build Coastguard Worker         return atscSettings;
637*4d7e907cSAndroid Build Coastguard Worker     }
638*4d7e907cSAndroid Build Coastguard Worker 
readFilterTypeAndSettingsTunerTestingConfigReader1_0639*4d7e907cSAndroid Build Coastguard Worker     static bool readFilterTypeAndSettings(Filter filterConfig, DemuxFilterType& type,
640*4d7e907cSAndroid Build Coastguard Worker                                           DemuxFilterSettings& settings) {
641*4d7e907cSAndroid Build Coastguard Worker         auto mainType = filterConfig.getMainType();
642*4d7e907cSAndroid Build Coastguard Worker         auto subType = filterConfig.getSubType();
643*4d7e907cSAndroid Build Coastguard Worker         switch (mainType) {
644*4d7e907cSAndroid Build Coastguard Worker             case FilterMainTypeEnum::TS: {
645*4d7e907cSAndroid Build Coastguard Worker                 ALOGW("[ConfigReader] filter main type is ts");
646*4d7e907cSAndroid Build Coastguard Worker                 type.mainType = DemuxFilterMainType::TS;
647*4d7e907cSAndroid Build Coastguard Worker                 switch (subType) {
648*4d7e907cSAndroid Build Coastguard Worker                     case FilterSubTypeEnum::UNDEFINED:
649*4d7e907cSAndroid Build Coastguard Worker                         type.subType.tsFilterType(DemuxTsFilterType::UNDEFINED);
650*4d7e907cSAndroid Build Coastguard Worker                         break;
651*4d7e907cSAndroid Build Coastguard Worker                     case FilterSubTypeEnum::SECTION:
652*4d7e907cSAndroid Build Coastguard Worker                         type.subType.tsFilterType(DemuxTsFilterType::SECTION);
653*4d7e907cSAndroid Build Coastguard Worker                         settings.ts().filterSettings.section(
654*4d7e907cSAndroid Build Coastguard Worker                                 readSectionFilterSettings(filterConfig));
655*4d7e907cSAndroid Build Coastguard Worker                         break;
656*4d7e907cSAndroid Build Coastguard Worker                     case FilterSubTypeEnum::PES:
657*4d7e907cSAndroid Build Coastguard Worker                         // TODO: b/182519645 support all the filter settings
658*4d7e907cSAndroid Build Coastguard Worker                         /*settings.ts().filterSettings.pesData(
659*4d7e907cSAndroid Build Coastguard Worker                                 getPesFilterSettings(filterConfig));*/
660*4d7e907cSAndroid Build Coastguard Worker                         type.subType.tsFilterType(DemuxTsFilterType::PES);
661*4d7e907cSAndroid Build Coastguard Worker                         break;
662*4d7e907cSAndroid Build Coastguard Worker                     case FilterSubTypeEnum::TS:
663*4d7e907cSAndroid Build Coastguard Worker                         type.subType.tsFilterType(DemuxTsFilterType::TS);
664*4d7e907cSAndroid Build Coastguard Worker                         settings.ts().filterSettings.noinit();
665*4d7e907cSAndroid Build Coastguard Worker                         break;
666*4d7e907cSAndroid Build Coastguard Worker                     case FilterSubTypeEnum::PCR:
667*4d7e907cSAndroid Build Coastguard Worker                         type.subType.tsFilterType(DemuxTsFilterType::PCR);
668*4d7e907cSAndroid Build Coastguard Worker                         settings.ts().filterSettings.noinit();
669*4d7e907cSAndroid Build Coastguard Worker                         break;
670*4d7e907cSAndroid Build Coastguard Worker                     case FilterSubTypeEnum::TEMI:
671*4d7e907cSAndroid Build Coastguard Worker                         type.subType.tsFilterType(DemuxTsFilterType::TEMI);
672*4d7e907cSAndroid Build Coastguard Worker                         settings.ts().filterSettings.noinit();
673*4d7e907cSAndroid Build Coastguard Worker                         break;
674*4d7e907cSAndroid Build Coastguard Worker                     case FilterSubTypeEnum::AUDIO:
675*4d7e907cSAndroid Build Coastguard Worker                         type.subType.tsFilterType(DemuxTsFilterType::AUDIO);
676*4d7e907cSAndroid Build Coastguard Worker                         settings.ts().filterSettings.av(readAvFilterSettings(filterConfig));
677*4d7e907cSAndroid Build Coastguard Worker                         break;
678*4d7e907cSAndroid Build Coastguard Worker                     case FilterSubTypeEnum::VIDEO:
679*4d7e907cSAndroid Build Coastguard Worker                         type.subType.tsFilterType(DemuxTsFilterType::VIDEO);
680*4d7e907cSAndroid Build Coastguard Worker                         settings.ts().filterSettings.av(readAvFilterSettings(filterConfig));
681*4d7e907cSAndroid Build Coastguard Worker                         break;
682*4d7e907cSAndroid Build Coastguard Worker                     case FilterSubTypeEnum::RECORD:
683*4d7e907cSAndroid Build Coastguard Worker                         type.subType.tsFilterType(DemuxTsFilterType::RECORD);
684*4d7e907cSAndroid Build Coastguard Worker                         settings.ts().filterSettings.record(readRecordFilterSettings(filterConfig));
685*4d7e907cSAndroid Build Coastguard Worker                         break;
686*4d7e907cSAndroid Build Coastguard Worker                     default:
687*4d7e907cSAndroid Build Coastguard Worker                         ALOGW("[ConfigReader] ts subtype is not supported");
688*4d7e907cSAndroid Build Coastguard Worker                         return false;
689*4d7e907cSAndroid Build Coastguard Worker                 }
690*4d7e907cSAndroid Build Coastguard Worker                 if (filterConfig.hasPid()) {
691*4d7e907cSAndroid Build Coastguard Worker                     settings.ts().tpid = static_cast<uint32_t>(filterConfig.getPid());
692*4d7e907cSAndroid Build Coastguard Worker                 }
693*4d7e907cSAndroid Build Coastguard Worker                 break;
694*4d7e907cSAndroid Build Coastguard Worker             }
695*4d7e907cSAndroid Build Coastguard Worker             case FilterMainTypeEnum::MMTP: {
696*4d7e907cSAndroid Build Coastguard Worker                 ALOGW("[ConfigReader] filter main type is mmtp");
697*4d7e907cSAndroid Build Coastguard Worker                 type.mainType = DemuxFilterMainType::MMTP;
698*4d7e907cSAndroid Build Coastguard Worker                 switch (subType) {
699*4d7e907cSAndroid Build Coastguard Worker                     case FilterSubTypeEnum::UNDEFINED:
700*4d7e907cSAndroid Build Coastguard Worker                         type.subType.mmtpFilterType(DemuxMmtpFilterType::UNDEFINED);
701*4d7e907cSAndroid Build Coastguard Worker                         break;
702*4d7e907cSAndroid Build Coastguard Worker                     case FilterSubTypeEnum::SECTION:
703*4d7e907cSAndroid Build Coastguard Worker                         type.subType.mmtpFilterType(DemuxMmtpFilterType::SECTION);
704*4d7e907cSAndroid Build Coastguard Worker                         settings.mmtp().filterSettings.section(
705*4d7e907cSAndroid Build Coastguard Worker                                 readSectionFilterSettings(filterConfig));
706*4d7e907cSAndroid Build Coastguard Worker                         break;
707*4d7e907cSAndroid Build Coastguard Worker                     case FilterSubTypeEnum::PES:
708*4d7e907cSAndroid Build Coastguard Worker                         type.subType.mmtpFilterType(DemuxMmtpFilterType::PES);
709*4d7e907cSAndroid Build Coastguard Worker                         // TODO: b/182519645 support all the filter settings
710*4d7e907cSAndroid Build Coastguard Worker                         /*settings.mmtp().filterSettings.pesData(
711*4d7e907cSAndroid Build Coastguard Worker                                 getPesFilterSettings(filterConfig));*/
712*4d7e907cSAndroid Build Coastguard Worker                         break;
713*4d7e907cSAndroid Build Coastguard Worker                     case FilterSubTypeEnum::MMTP:
714*4d7e907cSAndroid Build Coastguard Worker                         type.subType.mmtpFilterType(DemuxMmtpFilterType::MMTP);
715*4d7e907cSAndroid Build Coastguard Worker                         settings.mmtp().filterSettings.noinit();
716*4d7e907cSAndroid Build Coastguard Worker                         break;
717*4d7e907cSAndroid Build Coastguard Worker                     case FilterSubTypeEnum::AUDIO:
718*4d7e907cSAndroid Build Coastguard Worker                         type.subType.mmtpFilterType(DemuxMmtpFilterType::AUDIO);
719*4d7e907cSAndroid Build Coastguard Worker                         settings.mmtp().filterSettings.av(readAvFilterSettings(filterConfig));
720*4d7e907cSAndroid Build Coastguard Worker                         break;
721*4d7e907cSAndroid Build Coastguard Worker                     case FilterSubTypeEnum::VIDEO:
722*4d7e907cSAndroid Build Coastguard Worker                         settings.mmtp().filterSettings.av(readAvFilterSettings(filterConfig));
723*4d7e907cSAndroid Build Coastguard Worker                         break;
724*4d7e907cSAndroid Build Coastguard Worker                     case FilterSubTypeEnum::RECORD:
725*4d7e907cSAndroid Build Coastguard Worker                         type.subType.mmtpFilterType(DemuxMmtpFilterType::RECORD);
726*4d7e907cSAndroid Build Coastguard Worker                         settings.mmtp().filterSettings.record(
727*4d7e907cSAndroid Build Coastguard Worker                                 readRecordFilterSettings(filterConfig));
728*4d7e907cSAndroid Build Coastguard Worker                         break;
729*4d7e907cSAndroid Build Coastguard Worker                     case FilterSubTypeEnum::DOWNLOAD:
730*4d7e907cSAndroid Build Coastguard Worker                         type.subType.mmtpFilterType(DemuxMmtpFilterType::DOWNLOAD);
731*4d7e907cSAndroid Build Coastguard Worker                         // TODO: b/182519645 support all the filter settings
732*4d7e907cSAndroid Build Coastguard Worker                         /*settings.mmtp().filterSettings.download(
733*4d7e907cSAndroid Build Coastguard Worker                                 getDownloadFilterSettings(filterConfig));*/
734*4d7e907cSAndroid Build Coastguard Worker                         break;
735*4d7e907cSAndroid Build Coastguard Worker                     default:
736*4d7e907cSAndroid Build Coastguard Worker                         ALOGW("[ConfigReader] mmtp subtype is not supported");
737*4d7e907cSAndroid Build Coastguard Worker                         return false;
738*4d7e907cSAndroid Build Coastguard Worker                 }
739*4d7e907cSAndroid Build Coastguard Worker                 if (filterConfig.hasPid()) {
740*4d7e907cSAndroid Build Coastguard Worker                     settings.mmtp().mmtpPid = static_cast<uint32_t>(filterConfig.getPid());
741*4d7e907cSAndroid Build Coastguard Worker                 }
742*4d7e907cSAndroid Build Coastguard Worker                 break;
743*4d7e907cSAndroid Build Coastguard Worker             }
744*4d7e907cSAndroid Build Coastguard Worker             case FilterMainTypeEnum::IP: {
745*4d7e907cSAndroid Build Coastguard Worker                 ALOGW("[ConfigReader] filter main type is ip");
746*4d7e907cSAndroid Build Coastguard Worker                 type.mainType = DemuxFilterMainType::IP;
747*4d7e907cSAndroid Build Coastguard Worker                 switch (subType) {
748*4d7e907cSAndroid Build Coastguard Worker                     case FilterSubTypeEnum::UNDEFINED:
749*4d7e907cSAndroid Build Coastguard Worker                         type.subType.ipFilterType(DemuxIpFilterType::UNDEFINED);
750*4d7e907cSAndroid Build Coastguard Worker                         break;
751*4d7e907cSAndroid Build Coastguard Worker                     case FilterSubTypeEnum::SECTION:
752*4d7e907cSAndroid Build Coastguard Worker                         type.subType.ipFilterType(DemuxIpFilterType::SECTION);
753*4d7e907cSAndroid Build Coastguard Worker                         settings.ip().filterSettings.section(
754*4d7e907cSAndroid Build Coastguard Worker                                 readSectionFilterSettings(filterConfig));
755*4d7e907cSAndroid Build Coastguard Worker                         break;
756*4d7e907cSAndroid Build Coastguard Worker                     case FilterSubTypeEnum::NTP:
757*4d7e907cSAndroid Build Coastguard Worker                         type.subType.ipFilterType(DemuxIpFilterType::NTP);
758*4d7e907cSAndroid Build Coastguard Worker                         settings.ip().filterSettings.noinit();
759*4d7e907cSAndroid Build Coastguard Worker                         break;
760*4d7e907cSAndroid Build Coastguard Worker                     case FilterSubTypeEnum::IP: {
761*4d7e907cSAndroid Build Coastguard Worker                         DemuxIpFilterSettings ip{
762*4d7e907cSAndroid Build Coastguard Worker                                 .ipAddr = readIpAddress(filterConfig),
763*4d7e907cSAndroid Build Coastguard Worker                         };
764*4d7e907cSAndroid Build Coastguard Worker                         ip.filterSettings.bPassthrough(readPassthroughSettings(filterConfig));
765*4d7e907cSAndroid Build Coastguard Worker                         settings.ip(ip);
766*4d7e907cSAndroid Build Coastguard Worker                         break;
767*4d7e907cSAndroid Build Coastguard Worker                     }
768*4d7e907cSAndroid Build Coastguard Worker                     case FilterSubTypeEnum::IP_PAYLOAD:
769*4d7e907cSAndroid Build Coastguard Worker                         type.subType.ipFilterType(DemuxIpFilterType::IP_PAYLOAD);
770*4d7e907cSAndroid Build Coastguard Worker                         settings.ip().filterSettings.noinit();
771*4d7e907cSAndroid Build Coastguard Worker                         break;
772*4d7e907cSAndroid Build Coastguard Worker                     case FilterSubTypeEnum::PAYLOAD_THROUGH:
773*4d7e907cSAndroid Build Coastguard Worker                         type.subType.ipFilterType(DemuxIpFilterType::PAYLOAD_THROUGH);
774*4d7e907cSAndroid Build Coastguard Worker                         settings.ip().filterSettings.noinit();
775*4d7e907cSAndroid Build Coastguard Worker                         break;
776*4d7e907cSAndroid Build Coastguard Worker                     default:
777*4d7e907cSAndroid Build Coastguard Worker                         ALOGW("[ConfigReader] mmtp subtype is not supported");
778*4d7e907cSAndroid Build Coastguard Worker                         return false;
779*4d7e907cSAndroid Build Coastguard Worker                 }
780*4d7e907cSAndroid Build Coastguard Worker                 break;
781*4d7e907cSAndroid Build Coastguard Worker             }
782*4d7e907cSAndroid Build Coastguard Worker             default:
783*4d7e907cSAndroid Build Coastguard Worker                 // TODO: b/182519645 support all the filter configs
784*4d7e907cSAndroid Build Coastguard Worker                 ALOGW("[ConfigReader] filter main type is not supported in dynamic config");
785*4d7e907cSAndroid Build Coastguard Worker                 return false;
786*4d7e907cSAndroid Build Coastguard Worker         }
787*4d7e907cSAndroid Build Coastguard Worker         return true;
788*4d7e907cSAndroid Build Coastguard Worker     }
789*4d7e907cSAndroid Build Coastguard Worker 
readIpAddressTunerTestingConfigReader1_0790*4d7e907cSAndroid Build Coastguard Worker     static DemuxIpAddress readIpAddress(Filter filterConfig) {
791*4d7e907cSAndroid Build Coastguard Worker         DemuxIpAddress ipAddress;
792*4d7e907cSAndroid Build Coastguard Worker         if (!filterConfig.hasIpFilterConfig_optional()) {
793*4d7e907cSAndroid Build Coastguard Worker             return ipAddress;
794*4d7e907cSAndroid Build Coastguard Worker         }
795*4d7e907cSAndroid Build Coastguard Worker         auto ipFilterConfig = filterConfig.getFirstIpFilterConfig_optional();
796*4d7e907cSAndroid Build Coastguard Worker         if (ipFilterConfig->hasSrcPort()) {
797*4d7e907cSAndroid Build Coastguard Worker             ipAddress.srcPort = ipFilterConfig->getSrcPort();
798*4d7e907cSAndroid Build Coastguard Worker         }
799*4d7e907cSAndroid Build Coastguard Worker         if (ipFilterConfig->hasDestPort()) {
800*4d7e907cSAndroid Build Coastguard Worker             ipAddress.dstPort = ipFilterConfig->getDestPort();
801*4d7e907cSAndroid Build Coastguard Worker         }
802*4d7e907cSAndroid Build Coastguard Worker         if (ipFilterConfig->getFirstSrcIpAddress()->getIsIpV4()) {
803*4d7e907cSAndroid Build Coastguard Worker             memcpy(ipAddress.srcIpAddress.v4().data(),
804*4d7e907cSAndroid Build Coastguard Worker                    ipFilterConfig->getFirstSrcIpAddress()->getIp().data(), 4);
805*4d7e907cSAndroid Build Coastguard Worker         } else {
806*4d7e907cSAndroid Build Coastguard Worker             memcpy(ipAddress.srcIpAddress.v6().data(),
807*4d7e907cSAndroid Build Coastguard Worker                    ipFilterConfig->getFirstSrcIpAddress()->getIp().data(), 6);
808*4d7e907cSAndroid Build Coastguard Worker         }
809*4d7e907cSAndroid Build Coastguard Worker         if (ipFilterConfig->getFirstDestIpAddress()->getIsIpV4()) {
810*4d7e907cSAndroid Build Coastguard Worker             memcpy(ipAddress.dstIpAddress.v4().data(),
811*4d7e907cSAndroid Build Coastguard Worker                    ipFilterConfig->getFirstDestIpAddress()->getIp().data(), 4);
812*4d7e907cSAndroid Build Coastguard Worker         } else {
813*4d7e907cSAndroid Build Coastguard Worker             memcpy(ipAddress.dstIpAddress.v6().data(),
814*4d7e907cSAndroid Build Coastguard Worker                    ipFilterConfig->getFirstDestIpAddress()->getIp().data(), 6);
815*4d7e907cSAndroid Build Coastguard Worker         }
816*4d7e907cSAndroid Build Coastguard Worker         return ipAddress;
817*4d7e907cSAndroid Build Coastguard Worker     }
818*4d7e907cSAndroid Build Coastguard Worker 
readPassthroughSettingsTunerTestingConfigReader1_0819*4d7e907cSAndroid Build Coastguard Worker     static bool readPassthroughSettings(Filter filterConfig) {
820*4d7e907cSAndroid Build Coastguard Worker         if (!filterConfig.hasIpFilterConfig_optional()) {
821*4d7e907cSAndroid Build Coastguard Worker             return false;
822*4d7e907cSAndroid Build Coastguard Worker         }
823*4d7e907cSAndroid Build Coastguard Worker         auto ipFilterConfig = filterConfig.getFirstIpFilterConfig_optional();
824*4d7e907cSAndroid Build Coastguard Worker         if (ipFilterConfig->hasDataPassthrough()) {
825*4d7e907cSAndroid Build Coastguard Worker             return ipFilterConfig->getDataPassthrough();
826*4d7e907cSAndroid Build Coastguard Worker         }
827*4d7e907cSAndroid Build Coastguard Worker         return false;
828*4d7e907cSAndroid Build Coastguard Worker     }
829*4d7e907cSAndroid Build Coastguard Worker 
readSectionFilterSettingsTunerTestingConfigReader1_0830*4d7e907cSAndroid Build Coastguard Worker     static DemuxFilterSectionSettings readSectionFilterSettings(Filter filterConfig) {
831*4d7e907cSAndroid Build Coastguard Worker         DemuxFilterSectionSettings settings;
832*4d7e907cSAndroid Build Coastguard Worker         if (!filterConfig.hasSectionFilterSettings_optional()) {
833*4d7e907cSAndroid Build Coastguard Worker             return settings;
834*4d7e907cSAndroid Build Coastguard Worker         }
835*4d7e907cSAndroid Build Coastguard Worker         auto section = filterConfig.getFirstSectionFilterSettings_optional();
836*4d7e907cSAndroid Build Coastguard Worker         settings.isCheckCrc = section->getIsCheckCrc();
837*4d7e907cSAndroid Build Coastguard Worker         settings.isRepeat = section->getIsRepeat();
838*4d7e907cSAndroid Build Coastguard Worker         settings.isRaw = section->getIsRaw();
839*4d7e907cSAndroid Build Coastguard Worker         return settings;
840*4d7e907cSAndroid Build Coastguard Worker     }
841*4d7e907cSAndroid Build Coastguard Worker 
readAvFilterSettingsTunerTestingConfigReader1_0842*4d7e907cSAndroid Build Coastguard Worker     static DemuxFilterAvSettings readAvFilterSettings(Filter filterConfig) {
843*4d7e907cSAndroid Build Coastguard Worker         DemuxFilterAvSettings settings;
844*4d7e907cSAndroid Build Coastguard Worker         if (!filterConfig.hasAvFilterSettings_optional()) {
845*4d7e907cSAndroid Build Coastguard Worker             return settings;
846*4d7e907cSAndroid Build Coastguard Worker         }
847*4d7e907cSAndroid Build Coastguard Worker         auto av = filterConfig.getFirstAvFilterSettings_optional();
848*4d7e907cSAndroid Build Coastguard Worker         settings.isPassthrough = av->getIsPassthrough();
849*4d7e907cSAndroid Build Coastguard Worker         return settings;
850*4d7e907cSAndroid Build Coastguard Worker     }
851*4d7e907cSAndroid Build Coastguard Worker 
readRecordFilterSettingsTunerTestingConfigReader1_0852*4d7e907cSAndroid Build Coastguard Worker     static DemuxFilterRecordSettings readRecordFilterSettings(Filter filterConfig) {
853*4d7e907cSAndroid Build Coastguard Worker         DemuxFilterRecordSettings settings;
854*4d7e907cSAndroid Build Coastguard Worker         if (!filterConfig.hasRecordFilterSettings_optional()) {
855*4d7e907cSAndroid Build Coastguard Worker             return settings;
856*4d7e907cSAndroid Build Coastguard Worker         }
857*4d7e907cSAndroid Build Coastguard Worker         auto record = filterConfig.getFirstRecordFilterSettings_optional();
858*4d7e907cSAndroid Build Coastguard Worker         settings.tsIndexMask = static_cast<uint32_t>(record->getTsIndexMask());
859*4d7e907cSAndroid Build Coastguard Worker         settings.scIndexType = static_cast<DemuxRecordScIndexType>(record->getScIndexType());
860*4d7e907cSAndroid Build Coastguard Worker         return settings;
861*4d7e907cSAndroid Build Coastguard Worker     }
862*4d7e907cSAndroid Build Coastguard Worker 
readPlaybackSettingsTunerTestingConfigReader1_0863*4d7e907cSAndroid Build Coastguard Worker     static PlaybackSettings readPlaybackSettings(Dvr dvrConfig) {
864*4d7e907cSAndroid Build Coastguard Worker         ALOGW("[ConfigReader] dvr type is playback");
865*4d7e907cSAndroid Build Coastguard Worker         PlaybackSettings playbackSettings{
866*4d7e907cSAndroid Build Coastguard Worker                 .statusMask = static_cast<uint8_t>(dvrConfig.getStatusMask()),
867*4d7e907cSAndroid Build Coastguard Worker                 .lowThreshold = static_cast<uint32_t>(dvrConfig.getLowThreshold()),
868*4d7e907cSAndroid Build Coastguard Worker                 .highThreshold = static_cast<uint32_t>(dvrConfig.getHighThreshold()),
869*4d7e907cSAndroid Build Coastguard Worker                 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
870*4d7e907cSAndroid Build Coastguard Worker                 .packetSize = static_cast<uint8_t>(dvrConfig.getPacketSize()),
871*4d7e907cSAndroid Build Coastguard Worker         };
872*4d7e907cSAndroid Build Coastguard Worker         return playbackSettings;
873*4d7e907cSAndroid Build Coastguard Worker     }
874*4d7e907cSAndroid Build Coastguard Worker 
readRecordSettingsTunerTestingConfigReader1_0875*4d7e907cSAndroid Build Coastguard Worker     static RecordSettings readRecordSettings(Dvr dvrConfig) {
876*4d7e907cSAndroid Build Coastguard Worker         ALOGW("[ConfigReader] dvr type is record");
877*4d7e907cSAndroid Build Coastguard Worker         RecordSettings recordSettings{
878*4d7e907cSAndroid Build Coastguard Worker                 .statusMask = static_cast<uint8_t>(dvrConfig.getStatusMask()),
879*4d7e907cSAndroid Build Coastguard Worker                 .lowThreshold = static_cast<uint32_t>(dvrConfig.getLowThreshold()),
880*4d7e907cSAndroid Build Coastguard Worker                 .highThreshold = static_cast<uint32_t>(dvrConfig.getHighThreshold()),
881*4d7e907cSAndroid Build Coastguard Worker                 .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()),
882*4d7e907cSAndroid Build Coastguard Worker                 .packetSize = static_cast<uint8_t>(dvrConfig.getPacketSize()),
883*4d7e907cSAndroid Build Coastguard Worker         };
884*4d7e907cSAndroid Build Coastguard Worker         return recordSettings;
885*4d7e907cSAndroid Build Coastguard Worker     }
886*4d7e907cSAndroid Build Coastguard Worker 
getTunerConfigTunerTestingConfigReader1_0887*4d7e907cSAndroid Build Coastguard Worker     static TunerConfiguration getTunerConfig() { return *read(mConfigFilePath.c_str()); }
888*4d7e907cSAndroid Build Coastguard Worker 
getDataFlowConfigurationTunerTestingConfigReader1_0889*4d7e907cSAndroid Build Coastguard Worker     static DataFlowConfiguration getDataFlowConfiguration() {
890*4d7e907cSAndroid Build Coastguard Worker         return *getTunerConfig().getFirstDataFlowConfiguration();
891*4d7e907cSAndroid Build Coastguard Worker     }
892*4d7e907cSAndroid Build Coastguard Worker };
893