blob: 9624e273f2b85d633d158ee520b8b1f5a10fe496 [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
Amy Zhangfb1b4962021-02-18 19:34:52 -080052TunerService::TunerService() {
53 ::ndk::SpAIBinder binder(AServiceManager_waitForService("tv_tuner_resource_mgr"));
54 mTunerResourceManager = ITunerResourceManager::fromBinder(binder);
55 updateTunerResources();
56}
57
shubang23aa3ac2020-09-07 18:56:28 -070058TunerService::~TunerService() {}
59
Amy Zhangb1baabb2021-02-08 19:54:28 -080060binder_status_t TunerService::instantiate() {
Amy Zhanga046eee2021-01-12 14:44:58 -080061 shared_ptr<TunerService> service =
shubang23aa3ac2020-09-07 18:56:28 -070062 ::ndk::SharedRefBase::make<TunerService>();
Amy Zhangb1baabb2021-02-08 19:54:28 -080063 return AServiceManager_addService(service->asBinder().get(), getServiceName());
shubang6d266262020-10-09 00:15:04 -070064}
65
Amy Zhang5af84142021-02-04 18:36:54 -080066bool TunerService::hasITuner() {
67 ALOGD("hasITuner");
shubang6d266262020-10-09 00:15:04 -070068 if (mTuner != nullptr) {
69 return true;
70 }
Amy Zhang0f04c452020-10-30 13:36:44 -070071 mTuner = ITuner::getService();
72 if (mTuner == nullptr) {
shubang6d266262020-10-09 00:15:04 -070073 ALOGE("Failed to get ITuner service");
74 return false;
Amy Zhang0f04c452020-10-30 13:36:44 -070075 }
Amy Zhangb1baabb2021-02-08 19:54:28 -080076 mTunerVersion = TUNER_HAL_VERSION_1_0;
77 mTuner_1_1 = ::android::hardware::tv::tuner::V1_1::ITuner::castFrom(mTuner);
78 if (mTuner_1_1 != nullptr) {
79 mTunerVersion = TUNER_HAL_VERSION_1_1;
80 } else {
81 ALOGE("Failed to get ITuner_1_1 service");
82 }
shubang6d266262020-10-09 00:15:04 -070083 return true;
84}
85
Amy Zhang5af84142021-02-04 18:36:54 -080086bool TunerService::hasITuner_1_1() {
87 ALOGD("hasITuner_1_1");
Amy Zhangb1baabb2021-02-08 19:54:28 -080088 hasITuner();
89 return (mTunerVersion == TUNER_HAL_VERSION_1_1);
Amy Zhang5af84142021-02-04 18:36:54 -080090}
91
shubangae56a2e2021-01-21 07:29:55 -080092Status TunerService::openDemux(
93 int /* demuxHandle */, std::shared_ptr<ITunerDemux>* _aidl_return) {
shubang6d266262020-10-09 00:15:04 -070094 ALOGD("openDemux");
Amy Zhang5af84142021-02-04 18:36:54 -080095 if (!hasITuner()) {
shubangae56a2e2021-01-21 07:29:55 -080096 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::NOT_INITIALIZED));
shubang6d266262020-10-09 00:15:04 -070097 }
shubang6d266262020-10-09 00:15:04 -070098 Result res;
99 uint32_t id;
shubangae56a2e2021-01-21 07:29:55 -0800100 sp<IDemux> demuxSp = nullptr;
Amy Zhangce2cb402021-01-21 12:50:47 -0800101 shared_ptr<ITunerDemux> tunerDemux = nullptr;
shubang6d266262020-10-09 00:15:04 -0700102 mTuner->openDemux([&](Result r, uint32_t demuxId, const sp<IDemux>& demux) {
103 demuxSp = demux;
104 id = demuxId;
105 res = r;
106 ALOGD("open demux, id = %d", demuxId);
107 });
108 if (res == Result::SUCCESS) {
Amy Zhangce2cb402021-01-21 12:50:47 -0800109 tunerDemux = ::ndk::SharedRefBase::make<TunerDemux>(demuxSp, id);
110 *_aidl_return = tunerDemux->ref<ITunerDemux>();
shubangae56a2e2021-01-21 07:29:55 -0800111 return Status::ok();
shubang6d266262020-10-09 00:15:04 -0700112 }
113
Amy Zhang07428dc2021-02-04 15:58:02 -0800114 ALOGW("open demux failed, res = %d", res);
115 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
116}
117
118Status TunerService::getDemuxCaps(TunerDemuxCapabilities* _aidl_return) {
119 ALOGD("getDemuxCaps");
Amy Zhang5af84142021-02-04 18:36:54 -0800120 if (!hasITuner()) {
Amy Zhang07428dc2021-02-04 15:58:02 -0800121 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::NOT_INITIALIZED));
122 }
123 Result res;
124 DemuxCapabilities caps;
125 mTuner->getDemuxCaps([&](Result r, const DemuxCapabilities& demuxCaps) {
126 caps = demuxCaps;
127 res = r;
128 });
129 if (res == Result::SUCCESS) {
130 *_aidl_return = getAidlDemuxCaps(caps);
131 return Status::ok();
132 }
133
134 ALOGW("Get demux caps failed, res = %d", res);
shubangae56a2e2021-01-21 07:29:55 -0800135 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
shubang6d266262020-10-09 00:15:04 -0700136}
137
Amy Zhangce2cb402021-01-21 12:50:47 -0800138Status TunerService::getFrontendIds(vector<int32_t>* ids) {
Amy Zhang5af84142021-02-04 18:36:54 -0800139 if (!hasITuner()) {
Amy Zhanga046eee2021-01-12 14:44:58 -0800140 return Status::fromServiceSpecificError(
shubang6d266262020-10-09 00:15:04 -0700141 static_cast<int32_t>(Result::NOT_INITIALIZED));
shubang23aa3ac2020-09-07 18:56:28 -0700142 }
143 hidl_vec<FrontendId> feIds;
Amy Zhangce2cb402021-01-21 12:50:47 -0800144 Result res = getHidlFrontendIds(feIds);
shubang23aa3ac2020-09-07 18:56:28 -0700145 if (res != Result::SUCCESS) {
Amy Zhanga046eee2021-01-12 14:44:58 -0800146 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
shubang23aa3ac2020-09-07 18:56:28 -0700147 }
148 ids->resize(feIds.size());
Amy Zhanga046eee2021-01-12 14:44:58 -0800149 copy(feIds.begin(), feIds.end(), ids->begin());
shubang23aa3ac2020-09-07 18:56:28 -0700150
Amy Zhang0f04c452020-10-30 13:36:44 -0700151 return Status::ok();
shubang23aa3ac2020-09-07 18:56:28 -0700152}
153
Amy Zhang5af84142021-02-04 18:36:54 -0800154Status TunerService::getFrontendInfo(int32_t id, TunerFrontendInfo* _aidl_return) {
155 if (!hasITuner()) {
Amy Zhang0f04c452020-10-30 13:36:44 -0700156 ALOGE("ITuner service is not init.");
157 return ::ndk::ScopedAStatus::fromServiceSpecificError(
158 static_cast<int32_t>(Result::UNAVAILABLE));
Amy Zhang70de35a2020-10-12 20:13:16 -0700159 }
160
Amy Zhang70de35a2020-10-12 20:13:16 -0700161 FrontendInfo info;
Amy Zhang5af84142021-02-04 18:36:54 -0800162 Result res = getHidlFrontendInfo(id, info);
Amy Zhang70de35a2020-10-12 20:13:16 -0700163 if (res != Result::SUCCESS) {
Amy Zhang0f04c452020-10-30 13:36:44 -0700164 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
Amy Zhang70de35a2020-10-12 20:13:16 -0700165 }
166
Amy Zhang1d28bbb2021-01-13 18:11:15 -0800167 TunerFrontendInfo tunerInfo = convertToAidlFrontendInfo(info);
Amy Zhang70de35a2020-10-12 20:13:16 -0700168 *_aidl_return = tunerInfo;
Amy Zhang0f04c452020-10-30 13:36:44 -0700169 return Status::ok();
170}
171
Amy Zhang5af84142021-02-04 18:36:54 -0800172Status TunerService::getFrontendDtmbCapabilities(
173 int32_t id, TunerFrontendDtmbCapabilities* _aidl_return) {
174 if (!hasITuner_1_1()) {
175 ALOGE("ITuner_1_1 service is not init.");
176 return ::ndk::ScopedAStatus::fromServiceSpecificError(
177 static_cast<int32_t>(Result::UNAVAILABLE));
178 }
179
180 Result res;
181 FrontendDtmbCapabilities dtmbCaps;
182 mTuner_1_1->getFrontendDtmbCapabilities(id,
183 [&](Result r, const FrontendDtmbCapabilities& caps) {
184 dtmbCaps = caps;
185 res = r;
186 });
187 if (res != Result::SUCCESS) {
188 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
189 }
190
191 TunerFrontendDtmbCapabilities aidlDtmbCaps{
192 .transmissionModeCap = (int)dtmbCaps.transmissionModeCap,
193 .bandwidthCap = (int)dtmbCaps.bandwidthCap,
194 .modulationCap = (int)dtmbCaps.modulationCap,
195 .codeRateCap = (int)dtmbCaps.codeRateCap,
196 .guardIntervalCap = (int)dtmbCaps.guardIntervalCap,
197 .interleaveModeCap = (int)dtmbCaps.interleaveModeCap,
198 };
199
200 *_aidl_return = aidlDtmbCaps;
201 return Status::ok();
202}
203
Amy Zhang0f04c452020-10-30 13:36:44 -0700204Status TunerService::openFrontend(
Amy Zhanga046eee2021-01-12 14:44:58 -0800205 int32_t frontendHandle, shared_ptr<ITunerFrontend>* _aidl_return) {
Amy Zhang5af84142021-02-04 18:36:54 -0800206 if (!hasITuner()) {
Amy Zhang0f04c452020-10-30 13:36:44 -0700207 ALOGE("ITuner service is not init.");
Amy Zhanga046eee2021-01-12 14:44:58 -0800208 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
Amy Zhang0f04c452020-10-30 13:36:44 -0700209 }
210
Amy Zhanga046eee2021-01-12 14:44:58 -0800211 Result status;
212 sp<IFrontend> frontend;
213 int id = getResourceIdFromHandle(frontendHandle, FRONTEND);
214 mTuner->openFrontendById(id, [&](Result result, const sp<IFrontend>& fe) {
215 frontend = fe;
216 status = result;
217 });
218 if (status != Result::SUCCESS) {
219 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
220 }
221 *_aidl_return = ::ndk::SharedRefBase::make<TunerFrontend>(frontend, id);
222 return Status::ok();
223}
224
Amy Zhanga046eee2021-01-12 14:44:58 -0800225Status TunerService::openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return) {
Amy Zhang5af84142021-02-04 18:36:54 -0800226 if (!hasITuner()) {
Amy Zhangce2cb402021-01-21 12:50:47 -0800227 ALOGD("get ITuner failed");
Amy Zhanga046eee2021-01-12 14:44:58 -0800228 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
229 }
230
231 Result status;
232 sp<ILnb> lnb;
233 int id = getResourceIdFromHandle(lnbHandle, LNB);
234 mTuner->openLnbById(id, [&](Result result, const sp<ILnb>& lnbSp){
235 lnb = lnbSp;
236 status = result;
237 });
238 if (status != Result::SUCCESS) {
239 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
240 }
241
242 *_aidl_return = ::ndk::SharedRefBase::make<TunerLnb>(lnb, id);
243 return Status::ok();
244}
245
246Status TunerService::openLnbByName(const string& lnbName, shared_ptr<ITunerLnb>* _aidl_return) {
Amy Zhang5af84142021-02-04 18:36:54 -0800247 if (!hasITuner()) {
Amy Zhangce2cb402021-01-21 12:50:47 -0800248 ALOGE("get ITuner failed");
Amy Zhanga046eee2021-01-12 14:44:58 -0800249 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
250 }
251
252 int lnbId;
253 Result status;
254 sp<ILnb> lnb;
255 mTuner->openLnbByName(lnbName, [&](Result r, LnbId id, const sp<ILnb>& lnbSp) {
256 status = r;
257 lnb = lnbSp;
258 lnbId = (int)id;
259 });
260 if (status != Result::SUCCESS) {
261 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
262 }
263
264 *_aidl_return = ::ndk::SharedRefBase::make<TunerLnb>(lnb, lnbId);
Amy Zhang0f04c452020-10-30 13:36:44 -0700265 return Status::ok();
Amy Zhang70de35a2020-10-12 20:13:16 -0700266}
267
Amy Zhangb2989b52021-02-05 12:27:25 -0800268Status TunerService::openDescrambler(int32_t /*descramblerHandle*/,
269 std::shared_ptr<ITunerDescrambler>* _aidl_return) {
Amy Zhang5af84142021-02-04 18:36:54 -0800270 if (!hasITuner()) {
Amy Zhangb2989b52021-02-05 12:27:25 -0800271 ALOGD("get ITuner failed");
272 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
273 }
274
275 Result status;
276 sp<IDescrambler> descrambler;
277 //int id = getResourceIdFromHandle(descramblerHandle, DESCRAMBLER);
278 mTuner->openDescrambler([&](Result r, const sp<IDescrambler>& descramblerSp) {
279 status = r;
280 descrambler = descramblerSp;
281 });
282 if (status != Result::SUCCESS) {
283 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
284 }
285
286 *_aidl_return = ::ndk::SharedRefBase::make<TunerDescrambler>(descrambler);
287 return Status::ok();
288}
289
Amy Zhangfb1b4962021-02-18 19:34:52 -0800290void TunerService::updateTunerResources() {
291 if (!hasITuner() || mTunerResourceManager == NULL) {
292 ALOGE("Failed to updateTunerResources");
293 return;
Amy Zhangce2cb402021-01-21 12:50:47 -0800294 }
295
Amy Zhangce2cb402021-01-21 12:50:47 -0800296 updateFrontendResources();
297 updateLnbResources();
298 // TODO: update Demux, Descrambler.
Amy Zhangce2cb402021-01-21 12:50:47 -0800299}
300
Amy Zhangb1baabb2021-02-08 19:54:28 -0800301Status TunerService::getTunerHalVersion(int* _aidl_return) {
302 hasITuner();
303 *_aidl_return = mTunerVersion;
304 return Status::ok();
305}
306
Amy Zhangce2cb402021-01-21 12:50:47 -0800307void TunerService::updateFrontendResources() {
308 hidl_vec<FrontendId> ids;
309 Result res = getHidlFrontendIds(ids);
310 if (res != Result::SUCCESS) {
311 return;
312 }
313 vector<TunerFrontendInfo> infos;
314 for (int i = 0; i < ids.size(); i++) {
315 FrontendInfo frontendInfo;
316 Result res = getHidlFrontendInfo((int)ids[i], frontendInfo);
317 if (res != Result::SUCCESS) {
318 continue;
319 }
320 TunerFrontendInfo tunerFrontendInfo{
321 .handle = getResourceHandleFromId((int)ids[i], FRONTEND),
322 .type = static_cast<int>(frontendInfo.type),
323 .exclusiveGroupId = static_cast<int>(frontendInfo.exclusiveGroupId),
324 };
325 infos.push_back(tunerFrontendInfo);
326 }
327 mTunerResourceManager->setFrontendInfoList(infos);
328}
329
330void TunerService::updateLnbResources() {
331 vector<int> handles = getLnbHandles();
332 if (handles.size() == 0) {
333 return;
334 }
335 mTunerResourceManager->setLnbInfoList(handles);
336}
337
338vector<int> TunerService::getLnbHandles() {
339 vector<int> lnbHandles;
340 if (mTuner != NULL) {
341 Result res;
342 vector<LnbId> lnbIds;
343 mTuner->getLnbIds([&](Result r, const hardware::hidl_vec<LnbId>& ids) {
344 lnbIds = ids;
345 res = r;
346 });
347 if (res != Result::SUCCESS || lnbIds.size() == 0) {
348 } else {
349 for (int i = 0; i < lnbIds.size(); i++) {
350 lnbHandles.push_back(getResourceHandleFromId((int)lnbIds[i], LNB));
351 }
352 }
353 }
354
355 return lnbHandles;
356}
357
358Result TunerService::getHidlFrontendIds(hidl_vec<FrontendId>& ids) {
359 if (mTuner == NULL) {
360 return Result::NOT_INITIALIZED;
361 }
362 Result res;
363 mTuner->getFrontendIds([&](Result r, const hidl_vec<FrontendId>& frontendIds) {
364 ids = frontendIds;
365 res = r;
366 });
367 return res;
368}
369
370Result TunerService::getHidlFrontendInfo(int id, FrontendInfo& info) {
371 if (mTuner == NULL) {
372 return Result::NOT_INITIALIZED;
373 }
374 Result res;
375 mTuner->getFrontendInfo(id, [&](Result r, const FrontendInfo& feInfo) {
376 info = feInfo;
377 res = r;
378 });
379 return res;
380}
381
Amy Zhang07428dc2021-02-04 15:58:02 -0800382TunerDemuxCapabilities TunerService::getAidlDemuxCaps(DemuxCapabilities caps) {
383 TunerDemuxCapabilities aidlCaps{
384 .numDemux = (int)caps.numDemux,
385 .numRecord = (int)caps.numRecord,
386 .numPlayback = (int)caps.numPlayback,
387 .numTsFilter = (int)caps.numTsFilter,
388 .numSectionFilter = (int)caps.numSectionFilter,
389 .numAudioFilter = (int)caps.numAudioFilter,
390 .numVideoFilter = (int)caps.numVideoFilter,
391 .numPesFilter = (int)caps.numPesFilter,
392 .numPcrFilter = (int)caps.numPcrFilter,
393 .numBytesInSectionFilter = (int)caps.numBytesInSectionFilter,
394 .filterCaps = (int)caps.filterCaps,
395 .bTimeFilter = caps.bTimeFilter,
396 };
397 aidlCaps.linkCaps.resize(caps.linkCaps.size());
398 copy(caps.linkCaps.begin(), caps.linkCaps.end(), aidlCaps.linkCaps.begin());
399 return aidlCaps;
400}
401
Amy Zhang1d28bbb2021-01-13 18:11:15 -0800402TunerFrontendInfo TunerService::convertToAidlFrontendInfo(FrontendInfo halInfo) {
403 TunerFrontendInfo info{
Amy Zhang70de35a2020-10-12 20:13:16 -0700404 .type = (int)halInfo.type,
405 .minFrequency = (int)halInfo.minFrequency,
406 .maxFrequency = (int)halInfo.maxFrequency,
407 .minSymbolRate = (int)halInfo.minSymbolRate,
408 .maxSymbolRate = (int)halInfo.maxSymbolRate,
409 .acquireRange = (int)halInfo.acquireRange,
410 .exclusiveGroupId = (int)halInfo.exclusiveGroupId,
411 };
412 for (int i = 0; i < halInfo.statusCaps.size(); i++) {
413 info.statusCaps.push_back((int)halInfo.statusCaps[i]);
414 }
415
416 TunerFrontendCapabilities caps;
417 switch (halInfo.type) {
418 case FrontendType::ANALOG: {
419 TunerFrontendAnalogCapabilities analogCaps{
420 .typeCap = (int)halInfo.frontendCaps.analogCaps().typeCap,
421 .sifStandardCap = (int)halInfo.frontendCaps.analogCaps().sifStandardCap,
422 };
423 caps.set<TunerFrontendCapabilities::analogCaps>(analogCaps);
424 break;
425 }
426 case FrontendType::ATSC: {
427 TunerFrontendAtscCapabilities atscCaps{
428 .modulationCap = (int)halInfo.frontendCaps.atscCaps().modulationCap,
429 };
430 caps.set<TunerFrontendCapabilities::atscCaps>(atscCaps);
431 break;
432 }
433 case FrontendType::ATSC3: {
434 TunerFrontendAtsc3Capabilities atsc3Caps{
435 .bandwidthCap = (int)halInfo.frontendCaps.atsc3Caps().bandwidthCap,
436 .modulationCap = (int)halInfo.frontendCaps.atsc3Caps().modulationCap,
437 .timeInterleaveModeCap =
438 (int)halInfo.frontendCaps.atsc3Caps().timeInterleaveModeCap,
439 .codeRateCap = (int)halInfo.frontendCaps.atsc3Caps().codeRateCap,
440 .demodOutputFormatCap = (int)halInfo.frontendCaps.atsc3Caps().demodOutputFormatCap,
441 .fecCap = (int)halInfo.frontendCaps.atsc3Caps().fecCap,
442 };
443 caps.set<TunerFrontendCapabilities::atsc3Caps>(atsc3Caps);
444 break;
445 }
446 case FrontendType::DVBC: {
447 TunerFrontendCableCapabilities cableCaps{
448 .modulationCap = (int)halInfo.frontendCaps.dvbcCaps().modulationCap,
Amy Zhang5af84142021-02-04 18:36:54 -0800449 .codeRateCap = (int64_t)halInfo.frontendCaps.dvbcCaps().fecCap,
Amy Zhang70de35a2020-10-12 20:13:16 -0700450 .annexCap = (int)halInfo.frontendCaps.dvbcCaps().annexCap,
451 };
452 caps.set<TunerFrontendCapabilities::cableCaps>(cableCaps);
453 break;
454 }
455 case FrontendType::DVBS: {
456 TunerFrontendDvbsCapabilities dvbsCaps{
457 .modulationCap = (int)halInfo.frontendCaps.dvbsCaps().modulationCap,
458 .codeRateCap = (long)halInfo.frontendCaps.dvbsCaps().innerfecCap,
459 .standard = (int)halInfo.frontendCaps.dvbsCaps().standard,
460 };
461 caps.set<TunerFrontendCapabilities::dvbsCaps>(dvbsCaps);
462 break;
463 }
464 case FrontendType::DVBT: {
465 TunerFrontendDvbtCapabilities dvbtCaps{
466 .transmissionModeCap = (int)halInfo.frontendCaps.dvbtCaps().transmissionModeCap,
467 .bandwidthCap = (int)halInfo.frontendCaps.dvbtCaps().bandwidthCap,
468 .constellationCap = (int)halInfo.frontendCaps.dvbtCaps().constellationCap,
469 .codeRateCap = (int)halInfo.frontendCaps.dvbtCaps().coderateCap,
470 .hierarchyCap = (int)halInfo.frontendCaps.dvbtCaps().hierarchyCap,
471 .guardIntervalCap = (int)halInfo.frontendCaps.dvbtCaps().guardIntervalCap,
472 .isT2Supported = (bool)halInfo.frontendCaps.dvbtCaps().isT2Supported,
473 .isMisoSupported = (bool)halInfo.frontendCaps.dvbtCaps().isMisoSupported,
474 };
475 caps.set<TunerFrontendCapabilities::dvbtCaps>(dvbtCaps);
476 break;
477 }
478 case FrontendType::ISDBS: {
479 TunerFrontendIsdbsCapabilities isdbsCaps{
480 .modulationCap = (int)halInfo.frontendCaps.isdbsCaps().modulationCap,
481 .codeRateCap = (int)halInfo.frontendCaps.isdbsCaps().coderateCap,
482 };
483 caps.set<TunerFrontendCapabilities::isdbsCaps>(isdbsCaps);
484 break;
485 }
486 case FrontendType::ISDBS3: {
487 TunerFrontendIsdbs3Capabilities isdbs3Caps{
488 .modulationCap = (int)halInfo.frontendCaps.isdbs3Caps().modulationCap,
489 .codeRateCap = (int)halInfo.frontendCaps.isdbs3Caps().coderateCap,
490 };
491 caps.set<TunerFrontendCapabilities::isdbs3Caps>(isdbs3Caps);
492 break;
493 }
494 case FrontendType::ISDBT: {
495 TunerFrontendIsdbtCapabilities isdbtCaps{
496 .modeCap = (int)halInfo.frontendCaps.isdbtCaps().modeCap,
497 .bandwidthCap = (int)halInfo.frontendCaps.isdbtCaps().bandwidthCap,
498 .modulationCap = (int)halInfo.frontendCaps.isdbtCaps().modulationCap,
499 .codeRateCap = (int)halInfo.frontendCaps.isdbtCaps().coderateCap,
500 .guardIntervalCap = (int)halInfo.frontendCaps.isdbtCaps().guardIntervalCap,
501 };
502 caps.set<TunerFrontendCapabilities::isdbtCaps>(isdbtCaps);
503 break;
504 }
505 default:
506 break;
507 }
508
509 info.caps = caps;
510 return info;
511}
shubang23aa3ac2020-09-07 18:56:28 -0700512} // namespace android