blob: b80fd8526003281bc573ddb0ee29963cbcfbf6da [file] [log] [blame]
shubang23aa3ac2020-09-07 18:56:28 -07001/**
2 * Copyright (c) 2020, 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#define LOG_TAG "TunerService"
18
19#include <android/binder_manager.h>
20#include <utils/Log.h>
21#include "TunerService.h"
Amy Zhanga046eee2021-01-12 14:44:58 -080022#include "TunerFrontend.h"
23#include "TunerLnb.h"
shubangae56a2e2021-01-21 07:29:55 -080024#include "TunerDemux.h"
Amy Zhangb2989b52021-02-05 12:27:25 -080025#include "TunerDescrambler.h"
shubang23aa3ac2020-09-07 18:56:28 -070026
Amy Zhang70de35a2020-10-12 20:13:16 -070027using ::aidl::android::media::tv::tuner::TunerFrontendAnalogCapabilities;
28using ::aidl::android::media::tv::tuner::TunerFrontendAtsc3Capabilities;
29using ::aidl::android::media::tv::tuner::TunerFrontendAtscCapabilities;
30using ::aidl::android::media::tv::tuner::TunerFrontendCableCapabilities;
31using ::aidl::android::media::tv::tuner::TunerFrontendCapabilities;
32using ::aidl::android::media::tv::tuner::TunerFrontendDvbsCapabilities;
33using ::aidl::android::media::tv::tuner::TunerFrontendDvbtCapabilities;
34using ::aidl::android::media::tv::tuner::TunerFrontendIsdbs3Capabilities;
35using ::aidl::android::media::tv::tuner::TunerFrontendIsdbsCapabilities;
36using ::aidl::android::media::tv::tuner::TunerFrontendIsdbtCapabilities;
shubang6d266262020-10-09 00:15:04 -070037using ::android::hardware::tv::tuner::V1_0::DemuxFilterAvSettings;
38using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType;
39using ::android::hardware::tv::tuner::V1_0::DemuxFilterSettings;
40using ::android::hardware::tv::tuner::V1_0::DemuxFilterType;
41using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterType;
shubang23aa3ac2020-09-07 18:56:28 -070042using ::android::hardware::tv::tuner::V1_0::FrontendId;
Amy Zhang70de35a2020-10-12 20:13:16 -070043using ::android::hardware::tv::tuner::V1_0::FrontendType;
Amy Zhanga046eee2021-01-12 14:44:58 -080044using ::android::hardware::tv::tuner::V1_0::IFrontend;
45using ::android::hardware::tv::tuner::V1_0::ILnb;
46using ::android::hardware::tv::tuner::V1_0::LnbId;
shubang23aa3ac2020-09-07 18:56:28 -070047using ::android::hardware::tv::tuner::V1_0::Result;
Amy Zhang5af84142021-02-04 18:36:54 -080048using ::android::hardware::tv::tuner::V1_1::FrontendDtmbCapabilities;
shubang23aa3ac2020-09-07 18:56:28 -070049
50namespace android {
51
shubang23aa3ac2020-09-07 18:56:28 -070052TunerService::TunerService() {}
53TunerService::~TunerService() {}
54
Amy Zhangb1baabb2021-02-08 19:54:28 -080055binder_status_t TunerService::instantiate() {
Amy Zhanga046eee2021-01-12 14:44:58 -080056 shared_ptr<TunerService> service =
shubang23aa3ac2020-09-07 18:56:28 -070057 ::ndk::SharedRefBase::make<TunerService>();
Amy Zhangb1baabb2021-02-08 19:54:28 -080058 return AServiceManager_addService(service->asBinder().get(), getServiceName());
shubang6d266262020-10-09 00:15:04 -070059}
60
Amy Zhang5af84142021-02-04 18:36:54 -080061bool TunerService::hasITuner() {
62 ALOGD("hasITuner");
shubang6d266262020-10-09 00:15:04 -070063 if (mTuner != nullptr) {
64 return true;
65 }
Amy Zhang0f04c452020-10-30 13:36:44 -070066 mTuner = ITuner::getService();
67 if (mTuner == nullptr) {
shubang6d266262020-10-09 00:15:04 -070068 ALOGE("Failed to get ITuner service");
69 return false;
Amy Zhang0f04c452020-10-30 13:36:44 -070070 }
Amy Zhangb1baabb2021-02-08 19:54:28 -080071 mTunerVersion = TUNER_HAL_VERSION_1_0;
72 mTuner_1_1 = ::android::hardware::tv::tuner::V1_1::ITuner::castFrom(mTuner);
73 if (mTuner_1_1 != nullptr) {
74 mTunerVersion = TUNER_HAL_VERSION_1_1;
75 } else {
76 ALOGE("Failed to get ITuner_1_1 service");
77 }
shubang6d266262020-10-09 00:15:04 -070078 return true;
79}
80
Amy Zhang5af84142021-02-04 18:36:54 -080081bool TunerService::hasITuner_1_1() {
82 ALOGD("hasITuner_1_1");
Amy Zhangb1baabb2021-02-08 19:54:28 -080083 hasITuner();
84 return (mTunerVersion == TUNER_HAL_VERSION_1_1);
Amy Zhang5af84142021-02-04 18:36:54 -080085}
86
shubangae56a2e2021-01-21 07:29:55 -080087Status TunerService::openDemux(
88 int /* demuxHandle */, std::shared_ptr<ITunerDemux>* _aidl_return) {
shubang6d266262020-10-09 00:15:04 -070089 ALOGD("openDemux");
Amy Zhang5af84142021-02-04 18:36:54 -080090 if (!hasITuner()) {
shubangae56a2e2021-01-21 07:29:55 -080091 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::NOT_INITIALIZED));
shubang6d266262020-10-09 00:15:04 -070092 }
shubang6d266262020-10-09 00:15:04 -070093 Result res;
94 uint32_t id;
shubangae56a2e2021-01-21 07:29:55 -080095 sp<IDemux> demuxSp = nullptr;
Amy Zhangce2cb402021-01-21 12:50:47 -080096 shared_ptr<ITunerDemux> tunerDemux = nullptr;
shubang6d266262020-10-09 00:15:04 -070097 mTuner->openDemux([&](Result r, uint32_t demuxId, const sp<IDemux>& demux) {
98 demuxSp = demux;
99 id = demuxId;
100 res = r;
101 ALOGD("open demux, id = %d", demuxId);
102 });
103 if (res == Result::SUCCESS) {
Amy Zhangce2cb402021-01-21 12:50:47 -0800104 tunerDemux = ::ndk::SharedRefBase::make<TunerDemux>(demuxSp, id);
105 *_aidl_return = tunerDemux->ref<ITunerDemux>();
shubangae56a2e2021-01-21 07:29:55 -0800106 return Status::ok();
shubang6d266262020-10-09 00:15:04 -0700107 }
108
Amy Zhang07428dc2021-02-04 15:58:02 -0800109 ALOGW("open demux failed, res = %d", res);
110 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
111}
112
113Status TunerService::getDemuxCaps(TunerDemuxCapabilities* _aidl_return) {
114 ALOGD("getDemuxCaps");
Amy Zhang5af84142021-02-04 18:36:54 -0800115 if (!hasITuner()) {
Amy Zhang07428dc2021-02-04 15:58:02 -0800116 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::NOT_INITIALIZED));
117 }
118 Result res;
119 DemuxCapabilities caps;
120 mTuner->getDemuxCaps([&](Result r, const DemuxCapabilities& demuxCaps) {
121 caps = demuxCaps;
122 res = r;
123 });
124 if (res == Result::SUCCESS) {
125 *_aidl_return = getAidlDemuxCaps(caps);
126 return Status::ok();
127 }
128
129 ALOGW("Get demux caps failed, res = %d", res);
shubangae56a2e2021-01-21 07:29:55 -0800130 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
shubang6d266262020-10-09 00:15:04 -0700131}
132
Amy Zhangce2cb402021-01-21 12:50:47 -0800133Status TunerService::getFrontendIds(vector<int32_t>* ids) {
Amy Zhang5af84142021-02-04 18:36:54 -0800134 if (!hasITuner()) {
Amy Zhanga046eee2021-01-12 14:44:58 -0800135 return Status::fromServiceSpecificError(
shubang6d266262020-10-09 00:15:04 -0700136 static_cast<int32_t>(Result::NOT_INITIALIZED));
shubang23aa3ac2020-09-07 18:56:28 -0700137 }
138 hidl_vec<FrontendId> feIds;
Amy Zhangce2cb402021-01-21 12:50:47 -0800139 Result res = getHidlFrontendIds(feIds);
shubang23aa3ac2020-09-07 18:56:28 -0700140 if (res != Result::SUCCESS) {
Amy Zhanga046eee2021-01-12 14:44:58 -0800141 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
shubang23aa3ac2020-09-07 18:56:28 -0700142 }
143 ids->resize(feIds.size());
Amy Zhanga046eee2021-01-12 14:44:58 -0800144 copy(feIds.begin(), feIds.end(), ids->begin());
shubang23aa3ac2020-09-07 18:56:28 -0700145
Amy Zhang0f04c452020-10-30 13:36:44 -0700146 return Status::ok();
shubang23aa3ac2020-09-07 18:56:28 -0700147}
148
Amy Zhang5af84142021-02-04 18:36:54 -0800149Status TunerService::getFrontendInfo(int32_t id, TunerFrontendInfo* _aidl_return) {
150 if (!hasITuner()) {
Amy Zhang0f04c452020-10-30 13:36:44 -0700151 ALOGE("ITuner service is not init.");
152 return ::ndk::ScopedAStatus::fromServiceSpecificError(
153 static_cast<int32_t>(Result::UNAVAILABLE));
Amy Zhang70de35a2020-10-12 20:13:16 -0700154 }
155
Amy Zhang70de35a2020-10-12 20:13:16 -0700156 FrontendInfo info;
Amy Zhang5af84142021-02-04 18:36:54 -0800157 Result res = getHidlFrontendInfo(id, info);
Amy Zhang70de35a2020-10-12 20:13:16 -0700158 if (res != Result::SUCCESS) {
Amy Zhang0f04c452020-10-30 13:36:44 -0700159 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
Amy Zhang70de35a2020-10-12 20:13:16 -0700160 }
161
Amy Zhang1d28bbb2021-01-13 18:11:15 -0800162 TunerFrontendInfo tunerInfo = convertToAidlFrontendInfo(info);
Amy Zhang70de35a2020-10-12 20:13:16 -0700163 *_aidl_return = tunerInfo;
Amy Zhang0f04c452020-10-30 13:36:44 -0700164 return Status::ok();
165}
166
Amy Zhang5af84142021-02-04 18:36:54 -0800167Status TunerService::getFrontendDtmbCapabilities(
168 int32_t id, TunerFrontendDtmbCapabilities* _aidl_return) {
169 if (!hasITuner_1_1()) {
170 ALOGE("ITuner_1_1 service is not init.");
171 return ::ndk::ScopedAStatus::fromServiceSpecificError(
172 static_cast<int32_t>(Result::UNAVAILABLE));
173 }
174
175 Result res;
176 FrontendDtmbCapabilities dtmbCaps;
177 mTuner_1_1->getFrontendDtmbCapabilities(id,
178 [&](Result r, const FrontendDtmbCapabilities& caps) {
179 dtmbCaps = caps;
180 res = r;
181 });
182 if (res != Result::SUCCESS) {
183 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
184 }
185
186 TunerFrontendDtmbCapabilities aidlDtmbCaps{
187 .transmissionModeCap = (int)dtmbCaps.transmissionModeCap,
188 .bandwidthCap = (int)dtmbCaps.bandwidthCap,
189 .modulationCap = (int)dtmbCaps.modulationCap,
190 .codeRateCap = (int)dtmbCaps.codeRateCap,
191 .guardIntervalCap = (int)dtmbCaps.guardIntervalCap,
192 .interleaveModeCap = (int)dtmbCaps.interleaveModeCap,
193 };
194
195 *_aidl_return = aidlDtmbCaps;
196 return Status::ok();
197}
198
Amy Zhang0f04c452020-10-30 13:36:44 -0700199Status TunerService::openFrontend(
Amy Zhanga046eee2021-01-12 14:44:58 -0800200 int32_t frontendHandle, shared_ptr<ITunerFrontend>* _aidl_return) {
Amy Zhang5af84142021-02-04 18:36:54 -0800201 if (!hasITuner()) {
Amy Zhang0f04c452020-10-30 13:36:44 -0700202 ALOGE("ITuner service is not init.");
Amy Zhanga046eee2021-01-12 14:44:58 -0800203 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
Amy Zhang0f04c452020-10-30 13:36:44 -0700204 }
205
Amy Zhanga046eee2021-01-12 14:44:58 -0800206 Result status;
207 sp<IFrontend> frontend;
208 int id = getResourceIdFromHandle(frontendHandle, FRONTEND);
209 mTuner->openFrontendById(id, [&](Result result, const sp<IFrontend>& fe) {
210 frontend = fe;
211 status = result;
212 });
213 if (status != Result::SUCCESS) {
214 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
215 }
216 *_aidl_return = ::ndk::SharedRefBase::make<TunerFrontend>(frontend, id);
217 return Status::ok();
218}
219
Amy Zhanga046eee2021-01-12 14:44:58 -0800220Status TunerService::openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return) {
Amy Zhang5af84142021-02-04 18:36:54 -0800221 if (!hasITuner()) {
Amy Zhangce2cb402021-01-21 12:50:47 -0800222 ALOGD("get ITuner failed");
Amy Zhanga046eee2021-01-12 14:44:58 -0800223 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
224 }
225
226 Result status;
227 sp<ILnb> lnb;
228 int id = getResourceIdFromHandle(lnbHandle, LNB);
229 mTuner->openLnbById(id, [&](Result result, const sp<ILnb>& lnbSp){
230 lnb = lnbSp;
231 status = result;
232 });
233 if (status != Result::SUCCESS) {
234 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
235 }
236
237 *_aidl_return = ::ndk::SharedRefBase::make<TunerLnb>(lnb, id);
238 return Status::ok();
239}
240
241Status TunerService::openLnbByName(const string& lnbName, shared_ptr<ITunerLnb>* _aidl_return) {
Amy Zhang5af84142021-02-04 18:36:54 -0800242 if (!hasITuner()) {
Amy Zhangce2cb402021-01-21 12:50:47 -0800243 ALOGE("get ITuner failed");
Amy Zhanga046eee2021-01-12 14:44:58 -0800244 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
245 }
246
247 int lnbId;
248 Result status;
249 sp<ILnb> lnb;
250 mTuner->openLnbByName(lnbName, [&](Result r, LnbId id, const sp<ILnb>& lnbSp) {
251 status = r;
252 lnb = lnbSp;
253 lnbId = (int)id;
254 });
255 if (status != Result::SUCCESS) {
256 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
257 }
258
259 *_aidl_return = ::ndk::SharedRefBase::make<TunerLnb>(lnb, lnbId);
Amy Zhang0f04c452020-10-30 13:36:44 -0700260 return Status::ok();
Amy Zhang70de35a2020-10-12 20:13:16 -0700261}
262
Amy Zhangb2989b52021-02-05 12:27:25 -0800263Status TunerService::openDescrambler(int32_t /*descramblerHandle*/,
264 std::shared_ptr<ITunerDescrambler>* _aidl_return) {
Amy Zhang5af84142021-02-04 18:36:54 -0800265 if (!hasITuner()) {
Amy Zhangb2989b52021-02-05 12:27:25 -0800266 ALOGD("get ITuner failed");
267 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
268 }
269
270 Result status;
271 sp<IDescrambler> descrambler;
272 //int id = getResourceIdFromHandle(descramblerHandle, DESCRAMBLER);
273 mTuner->openDescrambler([&](Result r, const sp<IDescrambler>& descramblerSp) {
274 status = r;
275 descrambler = descramblerSp;
276 });
277 if (status != Result::SUCCESS) {
278 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
279 }
280
281 *_aidl_return = ::ndk::SharedRefBase::make<TunerDescrambler>(descrambler);
282 return Status::ok();
283}
284
Amy Zhangce2cb402021-01-21 12:50:47 -0800285Status TunerService::updateTunerResources() {
Amy Zhang5af84142021-02-04 18:36:54 -0800286 if (!hasITuner()) {
Amy Zhangce2cb402021-01-21 12:50:47 -0800287 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
288 }
289
290 // Connect with Tuner Resource Manager.
291 ::ndk::SpAIBinder binder(AServiceManager_getService("tv_tuner_resource_mgr"));
292 mTunerResourceManager = ITunerResourceManager::fromBinder(binder);
293
294 updateFrontendResources();
295 updateLnbResources();
296 // TODO: update Demux, Descrambler.
297 return Status::ok();
298}
299
Amy Zhangb1baabb2021-02-08 19:54:28 -0800300Status TunerService::getTunerHalVersion(int* _aidl_return) {
301 hasITuner();
302 *_aidl_return = mTunerVersion;
303 return Status::ok();
304}
305
Amy Zhangce2cb402021-01-21 12:50:47 -0800306void TunerService::updateFrontendResources() {
307 hidl_vec<FrontendId> ids;
308 Result res = getHidlFrontendIds(ids);
309 if (res != Result::SUCCESS) {
310 return;
311 }
312 vector<TunerFrontendInfo> infos;
313 for (int i = 0; i < ids.size(); i++) {
314 FrontendInfo frontendInfo;
315 Result res = getHidlFrontendInfo((int)ids[i], frontendInfo);
316 if (res != Result::SUCCESS) {
317 continue;
318 }
319 TunerFrontendInfo tunerFrontendInfo{
320 .handle = getResourceHandleFromId((int)ids[i], FRONTEND),
321 .type = static_cast<int>(frontendInfo.type),
322 .exclusiveGroupId = static_cast<int>(frontendInfo.exclusiveGroupId),
323 };
324 infos.push_back(tunerFrontendInfo);
325 }
326 mTunerResourceManager->setFrontendInfoList(infos);
327}
328
329void TunerService::updateLnbResources() {
330 vector<int> handles = getLnbHandles();
331 if (handles.size() == 0) {
332 return;
333 }
334 mTunerResourceManager->setLnbInfoList(handles);
335}
336
337vector<int> TunerService::getLnbHandles() {
338 vector<int> lnbHandles;
339 if (mTuner != NULL) {
340 Result res;
341 vector<LnbId> lnbIds;
342 mTuner->getLnbIds([&](Result r, const hardware::hidl_vec<LnbId>& ids) {
343 lnbIds = ids;
344 res = r;
345 });
346 if (res != Result::SUCCESS || lnbIds.size() == 0) {
347 } else {
348 for (int i = 0; i < lnbIds.size(); i++) {
349 lnbHandles.push_back(getResourceHandleFromId((int)lnbIds[i], LNB));
350 }
351 }
352 }
353
354 return lnbHandles;
355}
356
357Result TunerService::getHidlFrontendIds(hidl_vec<FrontendId>& ids) {
358 if (mTuner == NULL) {
359 return Result::NOT_INITIALIZED;
360 }
361 Result res;
362 mTuner->getFrontendIds([&](Result r, const hidl_vec<FrontendId>& frontendIds) {
363 ids = frontendIds;
364 res = r;
365 });
366 return res;
367}
368
369Result TunerService::getHidlFrontendInfo(int id, FrontendInfo& info) {
370 if (mTuner == NULL) {
371 return Result::NOT_INITIALIZED;
372 }
373 Result res;
374 mTuner->getFrontendInfo(id, [&](Result r, const FrontendInfo& feInfo) {
375 info = feInfo;
376 res = r;
377 });
378 return res;
379}
380
Amy Zhang07428dc2021-02-04 15:58:02 -0800381TunerDemuxCapabilities TunerService::getAidlDemuxCaps(DemuxCapabilities caps) {
382 TunerDemuxCapabilities aidlCaps{
383 .numDemux = (int)caps.numDemux,
384 .numRecord = (int)caps.numRecord,
385 .numPlayback = (int)caps.numPlayback,
386 .numTsFilter = (int)caps.numTsFilter,
387 .numSectionFilter = (int)caps.numSectionFilter,
388 .numAudioFilter = (int)caps.numAudioFilter,
389 .numVideoFilter = (int)caps.numVideoFilter,
390 .numPesFilter = (int)caps.numPesFilter,
391 .numPcrFilter = (int)caps.numPcrFilter,
392 .numBytesInSectionFilter = (int)caps.numBytesInSectionFilter,
393 .filterCaps = (int)caps.filterCaps,
394 .bTimeFilter = caps.bTimeFilter,
395 };
396 aidlCaps.linkCaps.resize(caps.linkCaps.size());
397 copy(caps.linkCaps.begin(), caps.linkCaps.end(), aidlCaps.linkCaps.begin());
398 return aidlCaps;
399}
400
Amy Zhang1d28bbb2021-01-13 18:11:15 -0800401TunerFrontendInfo TunerService::convertToAidlFrontendInfo(FrontendInfo halInfo) {
402 TunerFrontendInfo info{
Amy Zhang70de35a2020-10-12 20:13:16 -0700403 .type = (int)halInfo.type,
404 .minFrequency = (int)halInfo.minFrequency,
405 .maxFrequency = (int)halInfo.maxFrequency,
406 .minSymbolRate = (int)halInfo.minSymbolRate,
407 .maxSymbolRate = (int)halInfo.maxSymbolRate,
408 .acquireRange = (int)halInfo.acquireRange,
409 .exclusiveGroupId = (int)halInfo.exclusiveGroupId,
410 };
411 for (int i = 0; i < halInfo.statusCaps.size(); i++) {
412 info.statusCaps.push_back((int)halInfo.statusCaps[i]);
413 }
414
415 TunerFrontendCapabilities caps;
416 switch (halInfo.type) {
417 case FrontendType::ANALOG: {
418 TunerFrontendAnalogCapabilities analogCaps{
419 .typeCap = (int)halInfo.frontendCaps.analogCaps().typeCap,
420 .sifStandardCap = (int)halInfo.frontendCaps.analogCaps().sifStandardCap,
421 };
422 caps.set<TunerFrontendCapabilities::analogCaps>(analogCaps);
423 break;
424 }
425 case FrontendType::ATSC: {
426 TunerFrontendAtscCapabilities atscCaps{
427 .modulationCap = (int)halInfo.frontendCaps.atscCaps().modulationCap,
428 };
429 caps.set<TunerFrontendCapabilities::atscCaps>(atscCaps);
430 break;
431 }
432 case FrontendType::ATSC3: {
433 TunerFrontendAtsc3Capabilities atsc3Caps{
434 .bandwidthCap = (int)halInfo.frontendCaps.atsc3Caps().bandwidthCap,
435 .modulationCap = (int)halInfo.frontendCaps.atsc3Caps().modulationCap,
436 .timeInterleaveModeCap =
437 (int)halInfo.frontendCaps.atsc3Caps().timeInterleaveModeCap,
438 .codeRateCap = (int)halInfo.frontendCaps.atsc3Caps().codeRateCap,
439 .demodOutputFormatCap = (int)halInfo.frontendCaps.atsc3Caps().demodOutputFormatCap,
440 .fecCap = (int)halInfo.frontendCaps.atsc3Caps().fecCap,
441 };
442 caps.set<TunerFrontendCapabilities::atsc3Caps>(atsc3Caps);
443 break;
444 }
445 case FrontendType::DVBC: {
446 TunerFrontendCableCapabilities cableCaps{
447 .modulationCap = (int)halInfo.frontendCaps.dvbcCaps().modulationCap,
Amy Zhang5af84142021-02-04 18:36:54 -0800448 .codeRateCap = (int64_t)halInfo.frontendCaps.dvbcCaps().fecCap,
Amy Zhang70de35a2020-10-12 20:13:16 -0700449 .annexCap = (int)halInfo.frontendCaps.dvbcCaps().annexCap,
450 };
451 caps.set<TunerFrontendCapabilities::cableCaps>(cableCaps);
452 break;
453 }
454 case FrontendType::DVBS: {
455 TunerFrontendDvbsCapabilities dvbsCaps{
456 .modulationCap = (int)halInfo.frontendCaps.dvbsCaps().modulationCap,
457 .codeRateCap = (long)halInfo.frontendCaps.dvbsCaps().innerfecCap,
458 .standard = (int)halInfo.frontendCaps.dvbsCaps().standard,
459 };
460 caps.set<TunerFrontendCapabilities::dvbsCaps>(dvbsCaps);
461 break;
462 }
463 case FrontendType::DVBT: {
464 TunerFrontendDvbtCapabilities dvbtCaps{
465 .transmissionModeCap = (int)halInfo.frontendCaps.dvbtCaps().transmissionModeCap,
466 .bandwidthCap = (int)halInfo.frontendCaps.dvbtCaps().bandwidthCap,
467 .constellationCap = (int)halInfo.frontendCaps.dvbtCaps().constellationCap,
468 .codeRateCap = (int)halInfo.frontendCaps.dvbtCaps().coderateCap,
469 .hierarchyCap = (int)halInfo.frontendCaps.dvbtCaps().hierarchyCap,
470 .guardIntervalCap = (int)halInfo.frontendCaps.dvbtCaps().guardIntervalCap,
471 .isT2Supported = (bool)halInfo.frontendCaps.dvbtCaps().isT2Supported,
472 .isMisoSupported = (bool)halInfo.frontendCaps.dvbtCaps().isMisoSupported,
473 };
474 caps.set<TunerFrontendCapabilities::dvbtCaps>(dvbtCaps);
475 break;
476 }
477 case FrontendType::ISDBS: {
478 TunerFrontendIsdbsCapabilities isdbsCaps{
479 .modulationCap = (int)halInfo.frontendCaps.isdbsCaps().modulationCap,
480 .codeRateCap = (int)halInfo.frontendCaps.isdbsCaps().coderateCap,
481 };
482 caps.set<TunerFrontendCapabilities::isdbsCaps>(isdbsCaps);
483 break;
484 }
485 case FrontendType::ISDBS3: {
486 TunerFrontendIsdbs3Capabilities isdbs3Caps{
487 .modulationCap = (int)halInfo.frontendCaps.isdbs3Caps().modulationCap,
488 .codeRateCap = (int)halInfo.frontendCaps.isdbs3Caps().coderateCap,
489 };
490 caps.set<TunerFrontendCapabilities::isdbs3Caps>(isdbs3Caps);
491 break;
492 }
493 case FrontendType::ISDBT: {
494 TunerFrontendIsdbtCapabilities isdbtCaps{
495 .modeCap = (int)halInfo.frontendCaps.isdbtCaps().modeCap,
496 .bandwidthCap = (int)halInfo.frontendCaps.isdbtCaps().bandwidthCap,
497 .modulationCap = (int)halInfo.frontendCaps.isdbtCaps().modulationCap,
498 .codeRateCap = (int)halInfo.frontendCaps.isdbtCaps().coderateCap,
499 .guardIntervalCap = (int)halInfo.frontendCaps.isdbtCaps().guardIntervalCap,
500 };
501 caps.set<TunerFrontendCapabilities::isdbtCaps>(isdbtCaps);
502 break;
503 }
504 default:
505 break;
506 }
507
508 info.caps = caps;
509 return info;
510}
shubang23aa3ac2020-09-07 18:56:28 -0700511} // namespace android