blob: b356039ef7055be86eea8d273409170ef30d63a4 [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>
Devin Moore95bd53d2021-01-21 14:03:40 -080020#include <fmq/ConvertMQDescriptors.h>
shubang23aa3ac2020-09-07 18:56:28 -070021#include <utils/Log.h>
22#include "TunerService.h"
Amy Zhanga046eee2021-01-12 14:44:58 -080023#include "TunerFrontend.h"
24#include "TunerLnb.h"
shubangae56a2e2021-01-21 07:29:55 -080025#include "TunerDemux.h"
Amy Zhangb2989b52021-02-05 12:27:25 -080026#include "TunerDescrambler.h"
shubang23aa3ac2020-09-07 18:56:28 -070027
Amy Zhang70de35a2020-10-12 20:13:16 -070028using ::aidl::android::media::tv::tuner::TunerFrontendAnalogCapabilities;
29using ::aidl::android::media::tv::tuner::TunerFrontendAtsc3Capabilities;
30using ::aidl::android::media::tv::tuner::TunerFrontendAtscCapabilities;
31using ::aidl::android::media::tv::tuner::TunerFrontendCableCapabilities;
32using ::aidl::android::media::tv::tuner::TunerFrontendCapabilities;
33using ::aidl::android::media::tv::tuner::TunerFrontendDvbsCapabilities;
34using ::aidl::android::media::tv::tuner::TunerFrontendDvbtCapabilities;
35using ::aidl::android::media::tv::tuner::TunerFrontendIsdbs3Capabilities;
36using ::aidl::android::media::tv::tuner::TunerFrontendIsdbsCapabilities;
37using ::aidl::android::media::tv::tuner::TunerFrontendIsdbtCapabilities;
shubang6d266262020-10-09 00:15:04 -070038using ::android::hardware::tv::tuner::V1_0::DemuxFilterAvSettings;
39using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType;
40using ::android::hardware::tv::tuner::V1_0::DemuxFilterSettings;
41using ::android::hardware::tv::tuner::V1_0::DemuxFilterType;
42using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterType;
shubang23aa3ac2020-09-07 18:56:28 -070043using ::android::hardware::tv::tuner::V1_0::FrontendId;
Amy Zhang70de35a2020-10-12 20:13:16 -070044using ::android::hardware::tv::tuner::V1_0::FrontendType;
Amy Zhanga046eee2021-01-12 14:44:58 -080045using ::android::hardware::tv::tuner::V1_0::IFrontend;
46using ::android::hardware::tv::tuner::V1_0::ILnb;
47using ::android::hardware::tv::tuner::V1_0::LnbId;
shubang23aa3ac2020-09-07 18:56:28 -070048using ::android::hardware::tv::tuner::V1_0::Result;
49
50namespace android {
51
shubang23aa3ac2020-09-07 18:56:28 -070052TunerService::TunerService() {}
53TunerService::~TunerService() {}
54
55void 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>();
58 AServiceManager_addService(service->asBinder().get(), getServiceName());
shubang6d266262020-10-09 00:15:04 -070059}
60
shubang6d266262020-10-09 00:15:04 -070061bool TunerService::getITuner() {
62 ALOGD("getITuner");
63 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 }
shubang6d266262020-10-09 00:15:04 -070071 return true;
72}
73
shubangae56a2e2021-01-21 07:29:55 -080074Status TunerService::openDemux(
75 int /* demuxHandle */, std::shared_ptr<ITunerDemux>* _aidl_return) {
shubang6d266262020-10-09 00:15:04 -070076 ALOGD("openDemux");
77 if (!getITuner()) {
shubangae56a2e2021-01-21 07:29:55 -080078 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::NOT_INITIALIZED));
shubang6d266262020-10-09 00:15:04 -070079 }
shubang6d266262020-10-09 00:15:04 -070080 Result res;
81 uint32_t id;
shubangae56a2e2021-01-21 07:29:55 -080082 sp<IDemux> demuxSp = nullptr;
Amy Zhangce2cb402021-01-21 12:50:47 -080083 shared_ptr<ITunerDemux> tunerDemux = nullptr;
shubang6d266262020-10-09 00:15:04 -070084 mTuner->openDemux([&](Result r, uint32_t demuxId, const sp<IDemux>& demux) {
85 demuxSp = demux;
86 id = demuxId;
87 res = r;
88 ALOGD("open demux, id = %d", demuxId);
89 });
90 if (res == Result::SUCCESS) {
Amy Zhangce2cb402021-01-21 12:50:47 -080091 tunerDemux = ::ndk::SharedRefBase::make<TunerDemux>(demuxSp, id);
92 *_aidl_return = tunerDemux->ref<ITunerDemux>();
shubangae56a2e2021-01-21 07:29:55 -080093 return Status::ok();
shubang6d266262020-10-09 00:15:04 -070094 }
95
Amy Zhang07428dc2021-02-04 15:58:02 -080096 ALOGW("open demux failed, res = %d", res);
97 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
98}
99
100Status TunerService::getDemuxCaps(TunerDemuxCapabilities* _aidl_return) {
101 ALOGD("getDemuxCaps");
102 if (!getITuner()) {
103 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::NOT_INITIALIZED));
104 }
105 Result res;
106 DemuxCapabilities caps;
107 mTuner->getDemuxCaps([&](Result r, const DemuxCapabilities& demuxCaps) {
108 caps = demuxCaps;
109 res = r;
110 });
111 if (res == Result::SUCCESS) {
112 *_aidl_return = getAidlDemuxCaps(caps);
113 return Status::ok();
114 }
115
116 ALOGW("Get demux caps failed, res = %d", res);
shubangae56a2e2021-01-21 07:29:55 -0800117 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
shubang6d266262020-10-09 00:15:04 -0700118}
119
120Result TunerService::configFilter() {
121 ALOGD("configFilter");
122 if (mFilter == NULL) {
123 ALOGD("Failed to configure filter: filter not found");
124 return Result::NOT_INITIALIZED;
125 }
126 DemuxFilterSettings filterSettings;
127 DemuxTsFilterSettings tsFilterSettings {
128 .tpid = 256,
129 };
130 DemuxFilterAvSettings filterAvSettings {
131 .isPassthrough = false,
132 };
133 tsFilterSettings.filterSettings.av(filterAvSettings);
134 filterSettings.ts(tsFilterSettings);
135 Result res = mFilter->configure(filterSettings);
136
137 if (res != Result::SUCCESS) {
138 ALOGD("config filter failed, res = %d", res);
139 return res;
140 }
141
142 Result getQueueDescResult = Result::UNKNOWN_ERROR;
143 mFilter->getQueueDesc(
144 [&](Result r, const MQDescriptorSync<uint8_t>& desc) {
145 mFilterMQDesc = desc;
146 getQueueDescResult = r;
147 ALOGD("getFilterQueueDesc");
148 });
149 if (getQueueDescResult == Result::SUCCESS) {
150 unsafeHidlToAidlMQDescriptor<uint8_t, int8_t, SynchronizedReadWrite>(
151 mFilterMQDesc, &mAidlMQDesc);
Amy Zhanga046eee2021-01-12 14:44:58 -0800152 mAidlMq = new (nothrow) AidlMessageQueue(mAidlMQDesc);
shubang6d266262020-10-09 00:15:04 -0700153 EventFlag::createEventFlag(mAidlMq->getEventFlagWord(), &mEventFlag);
154 } else {
155 ALOGD("get MQDesc failed, res = %d", getQueueDescResult);
156 }
157 return getQueueDescResult;
shubang23aa3ac2020-09-07 18:56:28 -0700158}
159
Amy Zhangce2cb402021-01-21 12:50:47 -0800160Status TunerService::getFrontendIds(vector<int32_t>* ids) {
shubang6d266262020-10-09 00:15:04 -0700161 if (!getITuner()) {
Amy Zhanga046eee2021-01-12 14:44:58 -0800162 return Status::fromServiceSpecificError(
shubang6d266262020-10-09 00:15:04 -0700163 static_cast<int32_t>(Result::NOT_INITIALIZED));
shubang23aa3ac2020-09-07 18:56:28 -0700164 }
165 hidl_vec<FrontendId> feIds;
Amy Zhangce2cb402021-01-21 12:50:47 -0800166 Result res = getHidlFrontendIds(feIds);
shubang23aa3ac2020-09-07 18:56:28 -0700167 if (res != Result::SUCCESS) {
Amy Zhanga046eee2021-01-12 14:44:58 -0800168 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
shubang23aa3ac2020-09-07 18:56:28 -0700169 }
170 ids->resize(feIds.size());
Amy Zhanga046eee2021-01-12 14:44:58 -0800171 copy(feIds.begin(), feIds.end(), ids->begin());
shubang23aa3ac2020-09-07 18:56:28 -0700172
Amy Zhang0f04c452020-10-30 13:36:44 -0700173 return Status::ok();
shubang23aa3ac2020-09-07 18:56:28 -0700174}
175
Amy Zhang70de35a2020-10-12 20:13:16 -0700176Status TunerService::getFrontendInfo(
Amy Zhang1d28bbb2021-01-13 18:11:15 -0800177 int32_t frontendHandle, TunerFrontendInfo* _aidl_return) {
Amy Zhang70de35a2020-10-12 20:13:16 -0700178 if (mTuner == nullptr) {
Amy Zhang0f04c452020-10-30 13:36:44 -0700179 ALOGE("ITuner service is not init.");
180 return ::ndk::ScopedAStatus::fromServiceSpecificError(
181 static_cast<int32_t>(Result::UNAVAILABLE));
Amy Zhang70de35a2020-10-12 20:13:16 -0700182 }
183
Amy Zhang70de35a2020-10-12 20:13:16 -0700184 FrontendInfo info;
Amy Zhanga046eee2021-01-12 14:44:58 -0800185 int feId = getResourceIdFromHandle(frontendHandle, FRONTEND);
Amy Zhangce2cb402021-01-21 12:50:47 -0800186 Result res = getHidlFrontendInfo(feId, info);
Amy Zhang70de35a2020-10-12 20:13:16 -0700187 if (res != Result::SUCCESS) {
Amy Zhang0f04c452020-10-30 13:36:44 -0700188 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
Amy Zhang70de35a2020-10-12 20:13:16 -0700189 }
190
Amy Zhang1d28bbb2021-01-13 18:11:15 -0800191 TunerFrontendInfo tunerInfo = convertToAidlFrontendInfo(info);
Amy Zhang70de35a2020-10-12 20:13:16 -0700192 *_aidl_return = tunerInfo;
Amy Zhang0f04c452020-10-30 13:36:44 -0700193 return Status::ok();
194}
195
196Status TunerService::openFrontend(
Amy Zhanga046eee2021-01-12 14:44:58 -0800197 int32_t frontendHandle, shared_ptr<ITunerFrontend>* _aidl_return) {
Amy Zhang0f04c452020-10-30 13:36:44 -0700198 if (mTuner == nullptr) {
199 ALOGE("ITuner service is not init.");
Amy Zhanga046eee2021-01-12 14:44:58 -0800200 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
Amy Zhang0f04c452020-10-30 13:36:44 -0700201 }
202
Amy Zhanga046eee2021-01-12 14:44:58 -0800203 Result status;
204 sp<IFrontend> frontend;
205 int id = getResourceIdFromHandle(frontendHandle, FRONTEND);
206 mTuner->openFrontendById(id, [&](Result result, const sp<IFrontend>& fe) {
207 frontend = fe;
208 status = result;
209 });
210 if (status != Result::SUCCESS) {
211 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
212 }
213 *_aidl_return = ::ndk::SharedRefBase::make<TunerFrontend>(frontend, id);
214 return Status::ok();
215}
216
217Status TunerService::getFmqSyncReadWrite(
218 MQDescriptor<int8_t, SynchronizedReadWrite>* mqDesc, bool* _aidl_return) {
219 ALOGD("getFmqSyncReadWrite");
220 // TODO: put the following methods AIDL, and should be called from clients.
Amy Zhanga046eee2021-01-12 14:44:58 -0800221 configFilter();
222 mFilter->start();
223 if (mqDesc == nullptr) {
224 ALOGD("getFmqSyncReadWrite null MQDescriptor.");
225 *_aidl_return = false;
226 } else {
227 ALOGD("getFmqSyncReadWrite true");
228 *_aidl_return = true;
229 *mqDesc = move(mAidlMQDesc);
230 }
231 return ndk::ScopedAStatus::ok();
232}
233
234Status TunerService::openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return) {
Amy Zhangce2cb402021-01-21 12:50:47 -0800235 if (!getITuner()) {
236 ALOGD("get ITuner failed");
Amy Zhanga046eee2021-01-12 14:44:58 -0800237 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
238 }
239
240 Result status;
241 sp<ILnb> lnb;
242 int id = getResourceIdFromHandle(lnbHandle, LNB);
243 mTuner->openLnbById(id, [&](Result result, const sp<ILnb>& lnbSp){
244 lnb = lnbSp;
245 status = result;
246 });
247 if (status != Result::SUCCESS) {
248 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
249 }
250
251 *_aidl_return = ::ndk::SharedRefBase::make<TunerLnb>(lnb, id);
252 return Status::ok();
253}
254
255Status TunerService::openLnbByName(const string& lnbName, shared_ptr<ITunerLnb>* _aidl_return) {
Amy Zhangce2cb402021-01-21 12:50:47 -0800256 if (!getITuner()) {
257 ALOGE("get ITuner failed");
Amy Zhanga046eee2021-01-12 14:44:58 -0800258 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
259 }
260
261 int lnbId;
262 Result status;
263 sp<ILnb> lnb;
264 mTuner->openLnbByName(lnbName, [&](Result r, LnbId id, const sp<ILnb>& lnbSp) {
265 status = r;
266 lnb = lnbSp;
267 lnbId = (int)id;
268 });
269 if (status != Result::SUCCESS) {
270 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
271 }
272
273 *_aidl_return = ::ndk::SharedRefBase::make<TunerLnb>(lnb, lnbId);
Amy Zhang0f04c452020-10-30 13:36:44 -0700274 return Status::ok();
Amy Zhang70de35a2020-10-12 20:13:16 -0700275}
276
Amy Zhangb2989b52021-02-05 12:27:25 -0800277Status TunerService::openDescrambler(int32_t /*descramblerHandle*/,
278 std::shared_ptr<ITunerDescrambler>* _aidl_return) {
279 if (!getITuner()) {
280 ALOGD("get ITuner failed");
281 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
282 }
283
284 Result status;
285 sp<IDescrambler> descrambler;
286 //int id = getResourceIdFromHandle(descramblerHandle, DESCRAMBLER);
287 mTuner->openDescrambler([&](Result r, const sp<IDescrambler>& descramblerSp) {
288 status = r;
289 descrambler = descramblerSp;
290 });
291 if (status != Result::SUCCESS) {
292 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
293 }
294
295 *_aidl_return = ::ndk::SharedRefBase::make<TunerDescrambler>(descrambler);
296 return Status::ok();
297}
298
Amy Zhangce2cb402021-01-21 12:50:47 -0800299Status TunerService::updateTunerResources() {
300 if (!getITuner()) {
301 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
302 }
303
304 // Connect with Tuner Resource Manager.
305 ::ndk::SpAIBinder binder(AServiceManager_getService("tv_tuner_resource_mgr"));
306 mTunerResourceManager = ITunerResourceManager::fromBinder(binder);
307
308 updateFrontendResources();
309 updateLnbResources();
310 // TODO: update Demux, Descrambler.
311 return Status::ok();
312}
313
314void TunerService::updateFrontendResources() {
315 hidl_vec<FrontendId> ids;
316 Result res = getHidlFrontendIds(ids);
317 if (res != Result::SUCCESS) {
318 return;
319 }
320 vector<TunerFrontendInfo> infos;
321 for (int i = 0; i < ids.size(); i++) {
322 FrontendInfo frontendInfo;
323 Result res = getHidlFrontendInfo((int)ids[i], frontendInfo);
324 if (res != Result::SUCCESS) {
325 continue;
326 }
327 TunerFrontendInfo tunerFrontendInfo{
328 .handle = getResourceHandleFromId((int)ids[i], FRONTEND),
329 .type = static_cast<int>(frontendInfo.type),
330 .exclusiveGroupId = static_cast<int>(frontendInfo.exclusiveGroupId),
331 };
332 infos.push_back(tunerFrontendInfo);
333 }
334 mTunerResourceManager->setFrontendInfoList(infos);
335}
336
337void TunerService::updateLnbResources() {
338 vector<int> handles = getLnbHandles();
339 if (handles.size() == 0) {
340 return;
341 }
342 mTunerResourceManager->setLnbInfoList(handles);
343}
344
345vector<int> TunerService::getLnbHandles() {
346 vector<int> lnbHandles;
347 if (mTuner != NULL) {
348 Result res;
349 vector<LnbId> lnbIds;
350 mTuner->getLnbIds([&](Result r, const hardware::hidl_vec<LnbId>& ids) {
351 lnbIds = ids;
352 res = r;
353 });
354 if (res != Result::SUCCESS || lnbIds.size() == 0) {
355 } else {
356 for (int i = 0; i < lnbIds.size(); i++) {
357 lnbHandles.push_back(getResourceHandleFromId((int)lnbIds[i], LNB));
358 }
359 }
360 }
361
362 return lnbHandles;
363}
364
365Result TunerService::getHidlFrontendIds(hidl_vec<FrontendId>& ids) {
366 if (mTuner == NULL) {
367 return Result::NOT_INITIALIZED;
368 }
369 Result res;
370 mTuner->getFrontendIds([&](Result r, const hidl_vec<FrontendId>& frontendIds) {
371 ids = frontendIds;
372 res = r;
373 });
374 return res;
375}
376
377Result TunerService::getHidlFrontendInfo(int id, FrontendInfo& info) {
378 if (mTuner == NULL) {
379 return Result::NOT_INITIALIZED;
380 }
381 Result res;
382 mTuner->getFrontendInfo(id, [&](Result r, const FrontendInfo& feInfo) {
383 info = feInfo;
384 res = r;
385 });
386 return res;
387}
388
Amy Zhang07428dc2021-02-04 15:58:02 -0800389TunerDemuxCapabilities TunerService::getAidlDemuxCaps(DemuxCapabilities caps) {
390 TunerDemuxCapabilities aidlCaps{
391 .numDemux = (int)caps.numDemux,
392 .numRecord = (int)caps.numRecord,
393 .numPlayback = (int)caps.numPlayback,
394 .numTsFilter = (int)caps.numTsFilter,
395 .numSectionFilter = (int)caps.numSectionFilter,
396 .numAudioFilter = (int)caps.numAudioFilter,
397 .numVideoFilter = (int)caps.numVideoFilter,
398 .numPesFilter = (int)caps.numPesFilter,
399 .numPcrFilter = (int)caps.numPcrFilter,
400 .numBytesInSectionFilter = (int)caps.numBytesInSectionFilter,
401 .filterCaps = (int)caps.filterCaps,
402 .bTimeFilter = caps.bTimeFilter,
403 };
404 aidlCaps.linkCaps.resize(caps.linkCaps.size());
405 copy(caps.linkCaps.begin(), caps.linkCaps.end(), aidlCaps.linkCaps.begin());
406 return aidlCaps;
407}
408
Amy Zhang1d28bbb2021-01-13 18:11:15 -0800409TunerFrontendInfo TunerService::convertToAidlFrontendInfo(FrontendInfo halInfo) {
410 TunerFrontendInfo info{
Amy Zhang70de35a2020-10-12 20:13:16 -0700411 .type = (int)halInfo.type,
412 .minFrequency = (int)halInfo.minFrequency,
413 .maxFrequency = (int)halInfo.maxFrequency,
414 .minSymbolRate = (int)halInfo.minSymbolRate,
415 .maxSymbolRate = (int)halInfo.maxSymbolRate,
416 .acquireRange = (int)halInfo.acquireRange,
417 .exclusiveGroupId = (int)halInfo.exclusiveGroupId,
418 };
419 for (int i = 0; i < halInfo.statusCaps.size(); i++) {
420 info.statusCaps.push_back((int)halInfo.statusCaps[i]);
421 }
422
423 TunerFrontendCapabilities caps;
424 switch (halInfo.type) {
425 case FrontendType::ANALOG: {
426 TunerFrontendAnalogCapabilities analogCaps{
427 .typeCap = (int)halInfo.frontendCaps.analogCaps().typeCap,
428 .sifStandardCap = (int)halInfo.frontendCaps.analogCaps().sifStandardCap,
429 };
430 caps.set<TunerFrontendCapabilities::analogCaps>(analogCaps);
431 break;
432 }
433 case FrontendType::ATSC: {
434 TunerFrontendAtscCapabilities atscCaps{
435 .modulationCap = (int)halInfo.frontendCaps.atscCaps().modulationCap,
436 };
437 caps.set<TunerFrontendCapabilities::atscCaps>(atscCaps);
438 break;
439 }
440 case FrontendType::ATSC3: {
441 TunerFrontendAtsc3Capabilities atsc3Caps{
442 .bandwidthCap = (int)halInfo.frontendCaps.atsc3Caps().bandwidthCap,
443 .modulationCap = (int)halInfo.frontendCaps.atsc3Caps().modulationCap,
444 .timeInterleaveModeCap =
445 (int)halInfo.frontendCaps.atsc3Caps().timeInterleaveModeCap,
446 .codeRateCap = (int)halInfo.frontendCaps.atsc3Caps().codeRateCap,
447 .demodOutputFormatCap = (int)halInfo.frontendCaps.atsc3Caps().demodOutputFormatCap,
448 .fecCap = (int)halInfo.frontendCaps.atsc3Caps().fecCap,
449 };
450 caps.set<TunerFrontendCapabilities::atsc3Caps>(atsc3Caps);
451 break;
452 }
453 case FrontendType::DVBC: {
454 TunerFrontendCableCapabilities cableCaps{
455 .modulationCap = (int)halInfo.frontendCaps.dvbcCaps().modulationCap,
456 .codeRateCap = (int)halInfo.frontendCaps.dvbcCaps().fecCap,
457 .annexCap = (int)halInfo.frontendCaps.dvbcCaps().annexCap,
458 };
459 caps.set<TunerFrontendCapabilities::cableCaps>(cableCaps);
460 break;
461 }
462 case FrontendType::DVBS: {
463 TunerFrontendDvbsCapabilities dvbsCaps{
464 .modulationCap = (int)halInfo.frontendCaps.dvbsCaps().modulationCap,
465 .codeRateCap = (long)halInfo.frontendCaps.dvbsCaps().innerfecCap,
466 .standard = (int)halInfo.frontendCaps.dvbsCaps().standard,
467 };
468 caps.set<TunerFrontendCapabilities::dvbsCaps>(dvbsCaps);
469 break;
470 }
471 case FrontendType::DVBT: {
472 TunerFrontendDvbtCapabilities dvbtCaps{
473 .transmissionModeCap = (int)halInfo.frontendCaps.dvbtCaps().transmissionModeCap,
474 .bandwidthCap = (int)halInfo.frontendCaps.dvbtCaps().bandwidthCap,
475 .constellationCap = (int)halInfo.frontendCaps.dvbtCaps().constellationCap,
476 .codeRateCap = (int)halInfo.frontendCaps.dvbtCaps().coderateCap,
477 .hierarchyCap = (int)halInfo.frontendCaps.dvbtCaps().hierarchyCap,
478 .guardIntervalCap = (int)halInfo.frontendCaps.dvbtCaps().guardIntervalCap,
479 .isT2Supported = (bool)halInfo.frontendCaps.dvbtCaps().isT2Supported,
480 .isMisoSupported = (bool)halInfo.frontendCaps.dvbtCaps().isMisoSupported,
481 };
482 caps.set<TunerFrontendCapabilities::dvbtCaps>(dvbtCaps);
483 break;
484 }
485 case FrontendType::ISDBS: {
486 TunerFrontendIsdbsCapabilities isdbsCaps{
487 .modulationCap = (int)halInfo.frontendCaps.isdbsCaps().modulationCap,
488 .codeRateCap = (int)halInfo.frontendCaps.isdbsCaps().coderateCap,
489 };
490 caps.set<TunerFrontendCapabilities::isdbsCaps>(isdbsCaps);
491 break;
492 }
493 case FrontendType::ISDBS3: {
494 TunerFrontendIsdbs3Capabilities isdbs3Caps{
495 .modulationCap = (int)halInfo.frontendCaps.isdbs3Caps().modulationCap,
496 .codeRateCap = (int)halInfo.frontendCaps.isdbs3Caps().coderateCap,
497 };
498 caps.set<TunerFrontendCapabilities::isdbs3Caps>(isdbs3Caps);
499 break;
500 }
501 case FrontendType::ISDBT: {
502 TunerFrontendIsdbtCapabilities isdbtCaps{
503 .modeCap = (int)halInfo.frontendCaps.isdbtCaps().modeCap,
504 .bandwidthCap = (int)halInfo.frontendCaps.isdbtCaps().bandwidthCap,
505 .modulationCap = (int)halInfo.frontendCaps.isdbtCaps().modulationCap,
506 .codeRateCap = (int)halInfo.frontendCaps.isdbtCaps().coderateCap,
507 .guardIntervalCap = (int)halInfo.frontendCaps.isdbtCaps().guardIntervalCap,
508 };
509 caps.set<TunerFrontendCapabilities::isdbtCaps>(isdbtCaps);
510 break;
511 }
512 default:
513 break;
514 }
515
516 info.caps = caps;
517 return info;
518}
shubang23aa3ac2020-09-07 18:56:28 -0700519} // namespace android