blob: 43761884919ec65e05f346ce110fd4364bb18a97 [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"
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;
48
49namespace android {
50
shubang23aa3ac2020-09-07 18:56:28 -070051TunerService::TunerService() {}
52TunerService::~TunerService() {}
53
54void TunerService::instantiate() {
Amy Zhanga046eee2021-01-12 14:44:58 -080055 shared_ptr<TunerService> service =
shubang23aa3ac2020-09-07 18:56:28 -070056 ::ndk::SharedRefBase::make<TunerService>();
57 AServiceManager_addService(service->asBinder().get(), getServiceName());
shubang6d266262020-10-09 00:15:04 -070058}
59
shubang6d266262020-10-09 00:15:04 -070060bool TunerService::getITuner() {
61 ALOGD("getITuner");
62 if (mTuner != nullptr) {
63 return true;
64 }
Amy Zhang0f04c452020-10-30 13:36:44 -070065 mTuner = ITuner::getService();
66 if (mTuner == nullptr) {
shubang6d266262020-10-09 00:15:04 -070067 ALOGE("Failed to get ITuner service");
68 return false;
Amy Zhang0f04c452020-10-30 13:36:44 -070069 }
shubang6d266262020-10-09 00:15:04 -070070 return true;
71}
72
shubangae56a2e2021-01-21 07:29:55 -080073Status TunerService::openDemux(
74 int /* demuxHandle */, std::shared_ptr<ITunerDemux>* _aidl_return) {
shubang6d266262020-10-09 00:15:04 -070075 ALOGD("openDemux");
76 if (!getITuner()) {
shubangae56a2e2021-01-21 07:29:55 -080077 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::NOT_INITIALIZED));
shubang6d266262020-10-09 00:15:04 -070078 }
shubang6d266262020-10-09 00:15:04 -070079 Result res;
80 uint32_t id;
shubangae56a2e2021-01-21 07:29:55 -080081 sp<IDemux> demuxSp = nullptr;
Amy Zhangce2cb402021-01-21 12:50:47 -080082 shared_ptr<ITunerDemux> tunerDemux = nullptr;
shubang6d266262020-10-09 00:15:04 -070083 mTuner->openDemux([&](Result r, uint32_t demuxId, const sp<IDemux>& demux) {
84 demuxSp = demux;
85 id = demuxId;
86 res = r;
87 ALOGD("open demux, id = %d", demuxId);
88 });
89 if (res == Result::SUCCESS) {
Amy Zhangce2cb402021-01-21 12:50:47 -080090 tunerDemux = ::ndk::SharedRefBase::make<TunerDemux>(demuxSp, id);
91 *_aidl_return = tunerDemux->ref<ITunerDemux>();
shubangae56a2e2021-01-21 07:29:55 -080092 return Status::ok();
shubang6d266262020-10-09 00:15:04 -070093 }
94
Amy Zhang07428dc2021-02-04 15:58:02 -080095 ALOGW("open demux failed, res = %d", res);
96 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
97}
98
99Status TunerService::getDemuxCaps(TunerDemuxCapabilities* _aidl_return) {
100 ALOGD("getDemuxCaps");
101 if (!getITuner()) {
102 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::NOT_INITIALIZED));
103 }
104 Result res;
105 DemuxCapabilities caps;
106 mTuner->getDemuxCaps([&](Result r, const DemuxCapabilities& demuxCaps) {
107 caps = demuxCaps;
108 res = r;
109 });
110 if (res == Result::SUCCESS) {
111 *_aidl_return = getAidlDemuxCaps(caps);
112 return Status::ok();
113 }
114
115 ALOGW("Get demux caps failed, res = %d", res);
shubangae56a2e2021-01-21 07:29:55 -0800116 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
shubang6d266262020-10-09 00:15:04 -0700117}
118
119Result TunerService::configFilter() {
120 ALOGD("configFilter");
121 if (mFilter == NULL) {
122 ALOGD("Failed to configure filter: filter not found");
123 return Result::NOT_INITIALIZED;
124 }
125 DemuxFilterSettings filterSettings;
126 DemuxTsFilterSettings tsFilterSettings {
127 .tpid = 256,
128 };
129 DemuxFilterAvSettings filterAvSettings {
130 .isPassthrough = false,
131 };
132 tsFilterSettings.filterSettings.av(filterAvSettings);
133 filterSettings.ts(tsFilterSettings);
134 Result res = mFilter->configure(filterSettings);
135
136 if (res != Result::SUCCESS) {
137 ALOGD("config filter failed, res = %d", res);
138 return res;
139 }
140
141 Result getQueueDescResult = Result::UNKNOWN_ERROR;
142 mFilter->getQueueDesc(
143 [&](Result r, const MQDescriptorSync<uint8_t>& desc) {
144 mFilterMQDesc = desc;
145 getQueueDescResult = r;
146 ALOGD("getFilterQueueDesc");
147 });
148 if (getQueueDescResult == Result::SUCCESS) {
149 unsafeHidlToAidlMQDescriptor<uint8_t, int8_t, SynchronizedReadWrite>(
150 mFilterMQDesc, &mAidlMQDesc);
Amy Zhanga046eee2021-01-12 14:44:58 -0800151 mAidlMq = new (nothrow) AidlMessageQueue(mAidlMQDesc);
shubang6d266262020-10-09 00:15:04 -0700152 EventFlag::createEventFlag(mAidlMq->getEventFlagWord(), &mEventFlag);
153 } else {
154 ALOGD("get MQDesc failed, res = %d", getQueueDescResult);
155 }
156 return getQueueDescResult;
shubang23aa3ac2020-09-07 18:56:28 -0700157}
158
Amy Zhangce2cb402021-01-21 12:50:47 -0800159Status TunerService::getFrontendIds(vector<int32_t>* ids) {
shubang6d266262020-10-09 00:15:04 -0700160 if (!getITuner()) {
Amy Zhanga046eee2021-01-12 14:44:58 -0800161 return Status::fromServiceSpecificError(
shubang6d266262020-10-09 00:15:04 -0700162 static_cast<int32_t>(Result::NOT_INITIALIZED));
shubang23aa3ac2020-09-07 18:56:28 -0700163 }
164 hidl_vec<FrontendId> feIds;
Amy Zhangce2cb402021-01-21 12:50:47 -0800165 Result res = getHidlFrontendIds(feIds);
shubang23aa3ac2020-09-07 18:56:28 -0700166 if (res != Result::SUCCESS) {
Amy Zhanga046eee2021-01-12 14:44:58 -0800167 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
shubang23aa3ac2020-09-07 18:56:28 -0700168 }
169 ids->resize(feIds.size());
Amy Zhanga046eee2021-01-12 14:44:58 -0800170 copy(feIds.begin(), feIds.end(), ids->begin());
shubang23aa3ac2020-09-07 18:56:28 -0700171
Amy Zhang0f04c452020-10-30 13:36:44 -0700172 return Status::ok();
shubang23aa3ac2020-09-07 18:56:28 -0700173}
174
Amy Zhang70de35a2020-10-12 20:13:16 -0700175Status TunerService::getFrontendInfo(
Amy Zhang1d28bbb2021-01-13 18:11:15 -0800176 int32_t frontendHandle, TunerFrontendInfo* _aidl_return) {
Amy Zhang70de35a2020-10-12 20:13:16 -0700177 if (mTuner == nullptr) {
Amy Zhang0f04c452020-10-30 13:36:44 -0700178 ALOGE("ITuner service is not init.");
179 return ::ndk::ScopedAStatus::fromServiceSpecificError(
180 static_cast<int32_t>(Result::UNAVAILABLE));
Amy Zhang70de35a2020-10-12 20:13:16 -0700181 }
182
Amy Zhang70de35a2020-10-12 20:13:16 -0700183 FrontendInfo info;
Amy Zhanga046eee2021-01-12 14:44:58 -0800184 int feId = getResourceIdFromHandle(frontendHandle, FRONTEND);
Amy Zhangce2cb402021-01-21 12:50:47 -0800185 Result res = getHidlFrontendInfo(feId, info);
Amy Zhang70de35a2020-10-12 20:13:16 -0700186 if (res != Result::SUCCESS) {
Amy Zhang0f04c452020-10-30 13:36:44 -0700187 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
Amy Zhang70de35a2020-10-12 20:13:16 -0700188 }
189
Amy Zhang1d28bbb2021-01-13 18:11:15 -0800190 TunerFrontendInfo tunerInfo = convertToAidlFrontendInfo(info);
Amy Zhang70de35a2020-10-12 20:13:16 -0700191 *_aidl_return = tunerInfo;
Amy Zhang0f04c452020-10-30 13:36:44 -0700192 return Status::ok();
193}
194
195Status TunerService::openFrontend(
Amy Zhanga046eee2021-01-12 14:44:58 -0800196 int32_t frontendHandle, shared_ptr<ITunerFrontend>* _aidl_return) {
Amy Zhang0f04c452020-10-30 13:36:44 -0700197 if (mTuner == nullptr) {
198 ALOGE("ITuner service is not init.");
Amy Zhanga046eee2021-01-12 14:44:58 -0800199 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
Amy Zhang0f04c452020-10-30 13:36:44 -0700200 }
201
Amy Zhanga046eee2021-01-12 14:44:58 -0800202 Result status;
203 sp<IFrontend> frontend;
204 int id = getResourceIdFromHandle(frontendHandle, FRONTEND);
205 mTuner->openFrontendById(id, [&](Result result, const sp<IFrontend>& fe) {
206 frontend = fe;
207 status = result;
208 });
209 if (status != Result::SUCCESS) {
210 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
211 }
212 *_aidl_return = ::ndk::SharedRefBase::make<TunerFrontend>(frontend, id);
213 return Status::ok();
214}
215
216Status TunerService::getFmqSyncReadWrite(
217 MQDescriptor<int8_t, SynchronizedReadWrite>* mqDesc, bool* _aidl_return) {
218 ALOGD("getFmqSyncReadWrite");
219 // TODO: put the following methods AIDL, and should be called from clients.
Amy Zhanga046eee2021-01-12 14:44:58 -0800220 configFilter();
221 mFilter->start();
222 if (mqDesc == nullptr) {
223 ALOGD("getFmqSyncReadWrite null MQDescriptor.");
224 *_aidl_return = false;
225 } else {
226 ALOGD("getFmqSyncReadWrite true");
227 *_aidl_return = true;
228 *mqDesc = move(mAidlMQDesc);
229 }
230 return ndk::ScopedAStatus::ok();
231}
232
233Status TunerService::openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return) {
Amy Zhangce2cb402021-01-21 12:50:47 -0800234 if (!getITuner()) {
235 ALOGD("get ITuner failed");
Amy Zhanga046eee2021-01-12 14:44:58 -0800236 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
237 }
238
239 Result status;
240 sp<ILnb> lnb;
241 int id = getResourceIdFromHandle(lnbHandle, LNB);
242 mTuner->openLnbById(id, [&](Result result, const sp<ILnb>& lnbSp){
243 lnb = lnbSp;
244 status = result;
245 });
246 if (status != Result::SUCCESS) {
247 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
248 }
249
250 *_aidl_return = ::ndk::SharedRefBase::make<TunerLnb>(lnb, id);
251 return Status::ok();
252}
253
254Status TunerService::openLnbByName(const string& lnbName, shared_ptr<ITunerLnb>* _aidl_return) {
Amy Zhangce2cb402021-01-21 12:50:47 -0800255 if (!getITuner()) {
256 ALOGE("get ITuner failed");
Amy Zhanga046eee2021-01-12 14:44:58 -0800257 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
258 }
259
260 int lnbId;
261 Result status;
262 sp<ILnb> lnb;
263 mTuner->openLnbByName(lnbName, [&](Result r, LnbId id, const sp<ILnb>& lnbSp) {
264 status = r;
265 lnb = lnbSp;
266 lnbId = (int)id;
267 });
268 if (status != Result::SUCCESS) {
269 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
270 }
271
272 *_aidl_return = ::ndk::SharedRefBase::make<TunerLnb>(lnb, lnbId);
Amy Zhang0f04c452020-10-30 13:36:44 -0700273 return Status::ok();
Amy Zhang70de35a2020-10-12 20:13:16 -0700274}
275
Amy Zhangce2cb402021-01-21 12:50:47 -0800276Status TunerService::updateTunerResources() {
277 if (!getITuner()) {
278 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
279 }
280
281 // Connect with Tuner Resource Manager.
282 ::ndk::SpAIBinder binder(AServiceManager_getService("tv_tuner_resource_mgr"));
283 mTunerResourceManager = ITunerResourceManager::fromBinder(binder);
284
285 updateFrontendResources();
286 updateLnbResources();
287 // TODO: update Demux, Descrambler.
288 return Status::ok();
289}
290
291void TunerService::updateFrontendResources() {
292 hidl_vec<FrontendId> ids;
293 Result res = getHidlFrontendIds(ids);
294 if (res != Result::SUCCESS) {
295 return;
296 }
297 vector<TunerFrontendInfo> infos;
298 for (int i = 0; i < ids.size(); i++) {
299 FrontendInfo frontendInfo;
300 Result res = getHidlFrontendInfo((int)ids[i], frontendInfo);
301 if (res != Result::SUCCESS) {
302 continue;
303 }
304 TunerFrontendInfo tunerFrontendInfo{
305 .handle = getResourceHandleFromId((int)ids[i], FRONTEND),
306 .type = static_cast<int>(frontendInfo.type),
307 .exclusiveGroupId = static_cast<int>(frontendInfo.exclusiveGroupId),
308 };
309 infos.push_back(tunerFrontendInfo);
310 }
311 mTunerResourceManager->setFrontendInfoList(infos);
312}
313
314void TunerService::updateLnbResources() {
315 vector<int> handles = getLnbHandles();
316 if (handles.size() == 0) {
317 return;
318 }
319 mTunerResourceManager->setLnbInfoList(handles);
320}
321
322vector<int> TunerService::getLnbHandles() {
323 vector<int> lnbHandles;
324 if (mTuner != NULL) {
325 Result res;
326 vector<LnbId> lnbIds;
327 mTuner->getLnbIds([&](Result r, const hardware::hidl_vec<LnbId>& ids) {
328 lnbIds = ids;
329 res = r;
330 });
331 if (res != Result::SUCCESS || lnbIds.size() == 0) {
332 } else {
333 for (int i = 0; i < lnbIds.size(); i++) {
334 lnbHandles.push_back(getResourceHandleFromId((int)lnbIds[i], LNB));
335 }
336 }
337 }
338
339 return lnbHandles;
340}
341
342Result TunerService::getHidlFrontendIds(hidl_vec<FrontendId>& ids) {
343 if (mTuner == NULL) {
344 return Result::NOT_INITIALIZED;
345 }
346 Result res;
347 mTuner->getFrontendIds([&](Result r, const hidl_vec<FrontendId>& frontendIds) {
348 ids = frontendIds;
349 res = r;
350 });
351 return res;
352}
353
354Result TunerService::getHidlFrontendInfo(int id, FrontendInfo& info) {
355 if (mTuner == NULL) {
356 return Result::NOT_INITIALIZED;
357 }
358 Result res;
359 mTuner->getFrontendInfo(id, [&](Result r, const FrontendInfo& feInfo) {
360 info = feInfo;
361 res = r;
362 });
363 return res;
364}
365
Amy Zhang07428dc2021-02-04 15:58:02 -0800366TunerDemuxCapabilities TunerService::getAidlDemuxCaps(DemuxCapabilities caps) {
367 TunerDemuxCapabilities aidlCaps{
368 .numDemux = (int)caps.numDemux,
369 .numRecord = (int)caps.numRecord,
370 .numPlayback = (int)caps.numPlayback,
371 .numTsFilter = (int)caps.numTsFilter,
372 .numSectionFilter = (int)caps.numSectionFilter,
373 .numAudioFilter = (int)caps.numAudioFilter,
374 .numVideoFilter = (int)caps.numVideoFilter,
375 .numPesFilter = (int)caps.numPesFilter,
376 .numPcrFilter = (int)caps.numPcrFilter,
377 .numBytesInSectionFilter = (int)caps.numBytesInSectionFilter,
378 .filterCaps = (int)caps.filterCaps,
379 .bTimeFilter = caps.bTimeFilter,
380 };
381 aidlCaps.linkCaps.resize(caps.linkCaps.size());
382 copy(caps.linkCaps.begin(), caps.linkCaps.end(), aidlCaps.linkCaps.begin());
383 return aidlCaps;
384}
385
Amy Zhang1d28bbb2021-01-13 18:11:15 -0800386TunerFrontendInfo TunerService::convertToAidlFrontendInfo(FrontendInfo halInfo) {
387 TunerFrontendInfo info{
Amy Zhang70de35a2020-10-12 20:13:16 -0700388 .type = (int)halInfo.type,
389 .minFrequency = (int)halInfo.minFrequency,
390 .maxFrequency = (int)halInfo.maxFrequency,
391 .minSymbolRate = (int)halInfo.minSymbolRate,
392 .maxSymbolRate = (int)halInfo.maxSymbolRate,
393 .acquireRange = (int)halInfo.acquireRange,
394 .exclusiveGroupId = (int)halInfo.exclusiveGroupId,
395 };
396 for (int i = 0; i < halInfo.statusCaps.size(); i++) {
397 info.statusCaps.push_back((int)halInfo.statusCaps[i]);
398 }
399
400 TunerFrontendCapabilities caps;
401 switch (halInfo.type) {
402 case FrontendType::ANALOG: {
403 TunerFrontendAnalogCapabilities analogCaps{
404 .typeCap = (int)halInfo.frontendCaps.analogCaps().typeCap,
405 .sifStandardCap = (int)halInfo.frontendCaps.analogCaps().sifStandardCap,
406 };
407 caps.set<TunerFrontendCapabilities::analogCaps>(analogCaps);
408 break;
409 }
410 case FrontendType::ATSC: {
411 TunerFrontendAtscCapabilities atscCaps{
412 .modulationCap = (int)halInfo.frontendCaps.atscCaps().modulationCap,
413 };
414 caps.set<TunerFrontendCapabilities::atscCaps>(atscCaps);
415 break;
416 }
417 case FrontendType::ATSC3: {
418 TunerFrontendAtsc3Capabilities atsc3Caps{
419 .bandwidthCap = (int)halInfo.frontendCaps.atsc3Caps().bandwidthCap,
420 .modulationCap = (int)halInfo.frontendCaps.atsc3Caps().modulationCap,
421 .timeInterleaveModeCap =
422 (int)halInfo.frontendCaps.atsc3Caps().timeInterleaveModeCap,
423 .codeRateCap = (int)halInfo.frontendCaps.atsc3Caps().codeRateCap,
424 .demodOutputFormatCap = (int)halInfo.frontendCaps.atsc3Caps().demodOutputFormatCap,
425 .fecCap = (int)halInfo.frontendCaps.atsc3Caps().fecCap,
426 };
427 caps.set<TunerFrontendCapabilities::atsc3Caps>(atsc3Caps);
428 break;
429 }
430 case FrontendType::DVBC: {
431 TunerFrontendCableCapabilities cableCaps{
432 .modulationCap = (int)halInfo.frontendCaps.dvbcCaps().modulationCap,
433 .codeRateCap = (int)halInfo.frontendCaps.dvbcCaps().fecCap,
434 .annexCap = (int)halInfo.frontendCaps.dvbcCaps().annexCap,
435 };
436 caps.set<TunerFrontendCapabilities::cableCaps>(cableCaps);
437 break;
438 }
439 case FrontendType::DVBS: {
440 TunerFrontendDvbsCapabilities dvbsCaps{
441 .modulationCap = (int)halInfo.frontendCaps.dvbsCaps().modulationCap,
442 .codeRateCap = (long)halInfo.frontendCaps.dvbsCaps().innerfecCap,
443 .standard = (int)halInfo.frontendCaps.dvbsCaps().standard,
444 };
445 caps.set<TunerFrontendCapabilities::dvbsCaps>(dvbsCaps);
446 break;
447 }
448 case FrontendType::DVBT: {
449 TunerFrontendDvbtCapabilities dvbtCaps{
450 .transmissionModeCap = (int)halInfo.frontendCaps.dvbtCaps().transmissionModeCap,
451 .bandwidthCap = (int)halInfo.frontendCaps.dvbtCaps().bandwidthCap,
452 .constellationCap = (int)halInfo.frontendCaps.dvbtCaps().constellationCap,
453 .codeRateCap = (int)halInfo.frontendCaps.dvbtCaps().coderateCap,
454 .hierarchyCap = (int)halInfo.frontendCaps.dvbtCaps().hierarchyCap,
455 .guardIntervalCap = (int)halInfo.frontendCaps.dvbtCaps().guardIntervalCap,
456 .isT2Supported = (bool)halInfo.frontendCaps.dvbtCaps().isT2Supported,
457 .isMisoSupported = (bool)halInfo.frontendCaps.dvbtCaps().isMisoSupported,
458 };
459 caps.set<TunerFrontendCapabilities::dvbtCaps>(dvbtCaps);
460 break;
461 }
462 case FrontendType::ISDBS: {
463 TunerFrontendIsdbsCapabilities isdbsCaps{
464 .modulationCap = (int)halInfo.frontendCaps.isdbsCaps().modulationCap,
465 .codeRateCap = (int)halInfo.frontendCaps.isdbsCaps().coderateCap,
466 };
467 caps.set<TunerFrontendCapabilities::isdbsCaps>(isdbsCaps);
468 break;
469 }
470 case FrontendType::ISDBS3: {
471 TunerFrontendIsdbs3Capabilities isdbs3Caps{
472 .modulationCap = (int)halInfo.frontendCaps.isdbs3Caps().modulationCap,
473 .codeRateCap = (int)halInfo.frontendCaps.isdbs3Caps().coderateCap,
474 };
475 caps.set<TunerFrontendCapabilities::isdbs3Caps>(isdbs3Caps);
476 break;
477 }
478 case FrontendType::ISDBT: {
479 TunerFrontendIsdbtCapabilities isdbtCaps{
480 .modeCap = (int)halInfo.frontendCaps.isdbtCaps().modeCap,
481 .bandwidthCap = (int)halInfo.frontendCaps.isdbtCaps().bandwidthCap,
482 .modulationCap = (int)halInfo.frontendCaps.isdbtCaps().modulationCap,
483 .codeRateCap = (int)halInfo.frontendCaps.isdbtCaps().coderateCap,
484 .guardIntervalCap = (int)halInfo.frontendCaps.isdbtCaps().guardIntervalCap,
485 };
486 caps.set<TunerFrontendCapabilities::isdbtCaps>(isdbtCaps);
487 break;
488 }
489 default:
490 break;
491 }
492
493 info.caps = caps;
494 return info;
495}
shubang23aa3ac2020-09-07 18:56:28 -0700496} // namespace android