blob: 77e1c40e62e4e6754e60c4442fba418012ac8c31 [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>
Amy Zhangc5eb8272021-03-01 16:19:39 -080020#include <android/content/pm/IPackageManagerNative.h>
21#include <binder/IServiceManager.h>
shubang23aa3ac2020-09-07 18:56:28 -070022#include <utils/Log.h>
23#include "TunerService.h"
Amy Zhanga046eee2021-01-12 14:44:58 -080024#include "TunerFrontend.h"
25#include "TunerLnb.h"
shubangae56a2e2021-01-21 07:29:55 -080026#include "TunerDemux.h"
Amy Zhangb2989b52021-02-05 12:27:25 -080027#include "TunerDescrambler.h"
shubang23aa3ac2020-09-07 18:56:28 -070028
Amy Zhang70de35a2020-10-12 20:13:16 -070029using ::aidl::android::media::tv::tuner::TunerFrontendAnalogCapabilities;
30using ::aidl::android::media::tv::tuner::TunerFrontendAtsc3Capabilities;
31using ::aidl::android::media::tv::tuner::TunerFrontendAtscCapabilities;
32using ::aidl::android::media::tv::tuner::TunerFrontendCableCapabilities;
33using ::aidl::android::media::tv::tuner::TunerFrontendCapabilities;
34using ::aidl::android::media::tv::tuner::TunerFrontendDvbsCapabilities;
35using ::aidl::android::media::tv::tuner::TunerFrontendDvbtCapabilities;
36using ::aidl::android::media::tv::tuner::TunerFrontendIsdbs3Capabilities;
37using ::aidl::android::media::tv::tuner::TunerFrontendIsdbsCapabilities;
38using ::aidl::android::media::tv::tuner::TunerFrontendIsdbtCapabilities;
shubang6d266262020-10-09 00:15:04 -070039using ::android::hardware::tv::tuner::V1_0::DemuxFilterAvSettings;
40using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType;
41using ::android::hardware::tv::tuner::V1_0::DemuxFilterSettings;
42using ::android::hardware::tv::tuner::V1_0::DemuxFilterType;
43using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterType;
shubang23aa3ac2020-09-07 18:56:28 -070044using ::android::hardware::tv::tuner::V1_0::FrontendId;
Amy Zhang70de35a2020-10-12 20:13:16 -070045using ::android::hardware::tv::tuner::V1_0::FrontendType;
Amy Zhanga046eee2021-01-12 14:44:58 -080046using ::android::hardware::tv::tuner::V1_0::IFrontend;
47using ::android::hardware::tv::tuner::V1_0::ILnb;
48using ::android::hardware::tv::tuner::V1_0::LnbId;
shubang23aa3ac2020-09-07 18:56:28 -070049using ::android::hardware::tv::tuner::V1_0::Result;
Amy Zhang5af84142021-02-04 18:36:54 -080050using ::android::hardware::tv::tuner::V1_1::FrontendDtmbCapabilities;
shubang23aa3ac2020-09-07 18:56:28 -070051
52namespace android {
53
Amy Zhangfb1b4962021-02-18 19:34:52 -080054TunerService::TunerService() {
Amy Zhangc5eb8272021-03-01 16:19:39 -080055 sp<IServiceManager> serviceMgr = defaultServiceManager();
56 sp<content::pm::IPackageManagerNative> packageMgr;
57 if (serviceMgr.get() == nullptr) {
58 ALOGE("%s: Cannot find service manager", __func__);
59 return;
60 } else {
61 sp<IBinder> binder = serviceMgr->waitForService(String16("package_native"));
62 packageMgr = interface_cast<content::pm::IPackageManagerNative>(binder);
63 }
64
65 bool hasFeature = false;
66 if (packageMgr != nullptr) {
67 binder::Status status = packageMgr->hasSystemFeature(FEATURE_TUNER, 0, &hasFeature);
68 if (!status.isOk()) {
69 ALOGE("%s: hasSystemFeature failed: %s",
70 __func__, status.exceptionMessage().c_str());
71 return;
72 }
73 if (!hasFeature) {
74 ALOGD("Current device does not support tuner feaure.");
75 return;
76 }
77 } else {
78 ALOGD("%s: Cannot find package manager.", __func__);
79 return;
80 }
81
Amy Zhangfb1b4962021-02-18 19:34:52 -080082 ::ndk::SpAIBinder binder(AServiceManager_waitForService("tv_tuner_resource_mgr"));
83 mTunerResourceManager = ITunerResourceManager::fromBinder(binder);
84 updateTunerResources();
85}
86
shubang23aa3ac2020-09-07 18:56:28 -070087TunerService::~TunerService() {}
88
Amy Zhangb1baabb2021-02-08 19:54:28 -080089binder_status_t TunerService::instantiate() {
Amy Zhanga046eee2021-01-12 14:44:58 -080090 shared_ptr<TunerService> service =
shubang23aa3ac2020-09-07 18:56:28 -070091 ::ndk::SharedRefBase::make<TunerService>();
Amy Zhangb1baabb2021-02-08 19:54:28 -080092 return AServiceManager_addService(service->asBinder().get(), getServiceName());
shubang6d266262020-10-09 00:15:04 -070093}
94
Amy Zhang5af84142021-02-04 18:36:54 -080095bool TunerService::hasITuner() {
96 ALOGD("hasITuner");
shubang6d266262020-10-09 00:15:04 -070097 if (mTuner != nullptr) {
98 return true;
99 }
Amy Zhang0f04c452020-10-30 13:36:44 -0700100 mTuner = ITuner::getService();
101 if (mTuner == nullptr) {
shubang6d266262020-10-09 00:15:04 -0700102 ALOGE("Failed to get ITuner service");
103 return false;
Amy Zhang0f04c452020-10-30 13:36:44 -0700104 }
Amy Zhangb1baabb2021-02-08 19:54:28 -0800105 mTunerVersion = TUNER_HAL_VERSION_1_0;
106 mTuner_1_1 = ::android::hardware::tv::tuner::V1_1::ITuner::castFrom(mTuner);
107 if (mTuner_1_1 != nullptr) {
108 mTunerVersion = TUNER_HAL_VERSION_1_1;
109 } else {
110 ALOGE("Failed to get ITuner_1_1 service");
111 }
shubang6d266262020-10-09 00:15:04 -0700112 return true;
113}
114
Amy Zhang5af84142021-02-04 18:36:54 -0800115bool TunerService::hasITuner_1_1() {
116 ALOGD("hasITuner_1_1");
Amy Zhangb1baabb2021-02-08 19:54:28 -0800117 hasITuner();
118 return (mTunerVersion == TUNER_HAL_VERSION_1_1);
Amy Zhang5af84142021-02-04 18:36:54 -0800119}
120
shubangae56a2e2021-01-21 07:29:55 -0800121Status TunerService::openDemux(
122 int /* demuxHandle */, std::shared_ptr<ITunerDemux>* _aidl_return) {
shubang6d266262020-10-09 00:15:04 -0700123 ALOGD("openDemux");
Amy Zhang5af84142021-02-04 18:36:54 -0800124 if (!hasITuner()) {
shubangae56a2e2021-01-21 07:29:55 -0800125 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::NOT_INITIALIZED));
shubang6d266262020-10-09 00:15:04 -0700126 }
shubang6d266262020-10-09 00:15:04 -0700127 Result res;
128 uint32_t id;
shubangae56a2e2021-01-21 07:29:55 -0800129 sp<IDemux> demuxSp = nullptr;
Amy Zhangce2cb402021-01-21 12:50:47 -0800130 shared_ptr<ITunerDemux> tunerDemux = nullptr;
shubang6d266262020-10-09 00:15:04 -0700131 mTuner->openDemux([&](Result r, uint32_t demuxId, const sp<IDemux>& demux) {
132 demuxSp = demux;
133 id = demuxId;
134 res = r;
135 ALOGD("open demux, id = %d", demuxId);
136 });
137 if (res == Result::SUCCESS) {
Amy Zhangce2cb402021-01-21 12:50:47 -0800138 tunerDemux = ::ndk::SharedRefBase::make<TunerDemux>(demuxSp, id);
139 *_aidl_return = tunerDemux->ref<ITunerDemux>();
shubangae56a2e2021-01-21 07:29:55 -0800140 return Status::ok();
shubang6d266262020-10-09 00:15:04 -0700141 }
142
Amy Zhang07428dc2021-02-04 15:58:02 -0800143 ALOGW("open demux failed, res = %d", res);
144 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
145}
146
147Status TunerService::getDemuxCaps(TunerDemuxCapabilities* _aidl_return) {
148 ALOGD("getDemuxCaps");
Amy Zhang5af84142021-02-04 18:36:54 -0800149 if (!hasITuner()) {
Amy Zhang07428dc2021-02-04 15:58:02 -0800150 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::NOT_INITIALIZED));
151 }
152 Result res;
153 DemuxCapabilities caps;
154 mTuner->getDemuxCaps([&](Result r, const DemuxCapabilities& demuxCaps) {
155 caps = demuxCaps;
156 res = r;
157 });
158 if (res == Result::SUCCESS) {
159 *_aidl_return = getAidlDemuxCaps(caps);
160 return Status::ok();
161 }
162
163 ALOGW("Get demux caps failed, res = %d", res);
shubangae56a2e2021-01-21 07:29:55 -0800164 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
shubang6d266262020-10-09 00:15:04 -0700165}
166
Amy Zhangce2cb402021-01-21 12:50:47 -0800167Status TunerService::getFrontendIds(vector<int32_t>* ids) {
Amy Zhang5af84142021-02-04 18:36:54 -0800168 if (!hasITuner()) {
Amy Zhanga046eee2021-01-12 14:44:58 -0800169 return Status::fromServiceSpecificError(
shubang6d266262020-10-09 00:15:04 -0700170 static_cast<int32_t>(Result::NOT_INITIALIZED));
shubang23aa3ac2020-09-07 18:56:28 -0700171 }
172 hidl_vec<FrontendId> feIds;
Amy Zhangce2cb402021-01-21 12:50:47 -0800173 Result res = getHidlFrontendIds(feIds);
shubang23aa3ac2020-09-07 18:56:28 -0700174 if (res != Result::SUCCESS) {
Amy Zhanga046eee2021-01-12 14:44:58 -0800175 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
shubang23aa3ac2020-09-07 18:56:28 -0700176 }
177 ids->resize(feIds.size());
Amy Zhanga046eee2021-01-12 14:44:58 -0800178 copy(feIds.begin(), feIds.end(), ids->begin());
shubang23aa3ac2020-09-07 18:56:28 -0700179
Amy Zhang0f04c452020-10-30 13:36:44 -0700180 return Status::ok();
shubang23aa3ac2020-09-07 18:56:28 -0700181}
182
Amy Zhang5af84142021-02-04 18:36:54 -0800183Status TunerService::getFrontendInfo(int32_t id, TunerFrontendInfo* _aidl_return) {
184 if (!hasITuner()) {
Amy Zhang0f04c452020-10-30 13:36:44 -0700185 ALOGE("ITuner service is not init.");
186 return ::ndk::ScopedAStatus::fromServiceSpecificError(
187 static_cast<int32_t>(Result::UNAVAILABLE));
Amy Zhang70de35a2020-10-12 20:13:16 -0700188 }
189
Amy Zhang70de35a2020-10-12 20:13:16 -0700190 FrontendInfo info;
Amy Zhang5af84142021-02-04 18:36:54 -0800191 Result res = getHidlFrontendInfo(id, info);
Amy Zhang70de35a2020-10-12 20:13:16 -0700192 if (res != Result::SUCCESS) {
Amy Zhang0f04c452020-10-30 13:36:44 -0700193 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
Amy Zhang70de35a2020-10-12 20:13:16 -0700194 }
195
Amy Zhang1d28bbb2021-01-13 18:11:15 -0800196 TunerFrontendInfo tunerInfo = convertToAidlFrontendInfo(info);
Amy Zhang70de35a2020-10-12 20:13:16 -0700197 *_aidl_return = tunerInfo;
Amy Zhang0f04c452020-10-30 13:36:44 -0700198 return Status::ok();
199}
200
Amy Zhang5af84142021-02-04 18:36:54 -0800201Status TunerService::getFrontendDtmbCapabilities(
202 int32_t id, TunerFrontendDtmbCapabilities* _aidl_return) {
203 if (!hasITuner_1_1()) {
204 ALOGE("ITuner_1_1 service is not init.");
205 return ::ndk::ScopedAStatus::fromServiceSpecificError(
206 static_cast<int32_t>(Result::UNAVAILABLE));
207 }
208
209 Result res;
210 FrontendDtmbCapabilities dtmbCaps;
211 mTuner_1_1->getFrontendDtmbCapabilities(id,
212 [&](Result r, const FrontendDtmbCapabilities& caps) {
213 dtmbCaps = caps;
214 res = r;
215 });
216 if (res != Result::SUCCESS) {
217 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
218 }
219
220 TunerFrontendDtmbCapabilities aidlDtmbCaps{
221 .transmissionModeCap = (int)dtmbCaps.transmissionModeCap,
222 .bandwidthCap = (int)dtmbCaps.bandwidthCap,
223 .modulationCap = (int)dtmbCaps.modulationCap,
224 .codeRateCap = (int)dtmbCaps.codeRateCap,
225 .guardIntervalCap = (int)dtmbCaps.guardIntervalCap,
226 .interleaveModeCap = (int)dtmbCaps.interleaveModeCap,
227 };
228
229 *_aidl_return = aidlDtmbCaps;
230 return Status::ok();
231}
232
Amy Zhang0f04c452020-10-30 13:36:44 -0700233Status TunerService::openFrontend(
Amy Zhanga046eee2021-01-12 14:44:58 -0800234 int32_t frontendHandle, shared_ptr<ITunerFrontend>* _aidl_return) {
Amy Zhang5af84142021-02-04 18:36:54 -0800235 if (!hasITuner()) {
Amy Zhang0f04c452020-10-30 13:36:44 -0700236 ALOGE("ITuner service is not init.");
Amy Zhanga046eee2021-01-12 14:44:58 -0800237 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
Amy Zhang0f04c452020-10-30 13:36:44 -0700238 }
239
Amy Zhanga046eee2021-01-12 14:44:58 -0800240 Result status;
241 sp<IFrontend> frontend;
242 int id = getResourceIdFromHandle(frontendHandle, FRONTEND);
243 mTuner->openFrontendById(id, [&](Result result, const sp<IFrontend>& fe) {
244 frontend = fe;
245 status = result;
246 });
247 if (status != Result::SUCCESS) {
248 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
249 }
250 *_aidl_return = ::ndk::SharedRefBase::make<TunerFrontend>(frontend, id);
251 return Status::ok();
252}
253
Amy Zhanga046eee2021-01-12 14:44:58 -0800254Status TunerService::openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return) {
Amy Zhang5af84142021-02-04 18:36:54 -0800255 if (!hasITuner()) {
Amy Zhangce2cb402021-01-21 12:50:47 -0800256 ALOGD("get ITuner failed");
Amy Zhanga046eee2021-01-12 14:44:58 -0800257 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
258 }
259
260 Result status;
261 sp<ILnb> lnb;
262 int id = getResourceIdFromHandle(lnbHandle, LNB);
263 mTuner->openLnbById(id, [&](Result result, const sp<ILnb>& lnbSp){
264 lnb = lnbSp;
265 status = result;
266 });
267 if (status != Result::SUCCESS) {
268 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
269 }
270
271 *_aidl_return = ::ndk::SharedRefBase::make<TunerLnb>(lnb, id);
272 return Status::ok();
273}
274
275Status TunerService::openLnbByName(const string& lnbName, shared_ptr<ITunerLnb>* _aidl_return) {
Amy Zhang5af84142021-02-04 18:36:54 -0800276 if (!hasITuner()) {
Amy Zhangce2cb402021-01-21 12:50:47 -0800277 ALOGE("get ITuner failed");
Amy Zhanga046eee2021-01-12 14:44:58 -0800278 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
279 }
280
281 int lnbId;
282 Result status;
283 sp<ILnb> lnb;
284 mTuner->openLnbByName(lnbName, [&](Result r, LnbId id, const sp<ILnb>& lnbSp) {
285 status = r;
286 lnb = lnbSp;
287 lnbId = (int)id;
288 });
289 if (status != Result::SUCCESS) {
290 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
291 }
292
293 *_aidl_return = ::ndk::SharedRefBase::make<TunerLnb>(lnb, lnbId);
Amy Zhang0f04c452020-10-30 13:36:44 -0700294 return Status::ok();
Amy Zhang70de35a2020-10-12 20:13:16 -0700295}
296
Amy Zhangb2989b52021-02-05 12:27:25 -0800297Status TunerService::openDescrambler(int32_t /*descramblerHandle*/,
298 std::shared_ptr<ITunerDescrambler>* _aidl_return) {
Amy Zhang5af84142021-02-04 18:36:54 -0800299 if (!hasITuner()) {
Amy Zhangb2989b52021-02-05 12:27:25 -0800300 ALOGD("get ITuner failed");
301 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
302 }
303
304 Result status;
305 sp<IDescrambler> descrambler;
306 //int id = getResourceIdFromHandle(descramblerHandle, DESCRAMBLER);
307 mTuner->openDescrambler([&](Result r, const sp<IDescrambler>& descramblerSp) {
308 status = r;
309 descrambler = descramblerSp;
310 });
311 if (status != Result::SUCCESS) {
312 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
313 }
314
315 *_aidl_return = ::ndk::SharedRefBase::make<TunerDescrambler>(descrambler);
316 return Status::ok();
317}
318
Amy Zhangfb1b4962021-02-18 19:34:52 -0800319void TunerService::updateTunerResources() {
320 if (!hasITuner() || mTunerResourceManager == NULL) {
321 ALOGE("Failed to updateTunerResources");
322 return;
Amy Zhangce2cb402021-01-21 12:50:47 -0800323 }
324
Amy Zhangce2cb402021-01-21 12:50:47 -0800325 updateFrontendResources();
326 updateLnbResources();
327 // TODO: update Demux, Descrambler.
Amy Zhangce2cb402021-01-21 12:50:47 -0800328}
329
Amy Zhangb1baabb2021-02-08 19:54:28 -0800330Status TunerService::getTunerHalVersion(int* _aidl_return) {
331 hasITuner();
332 *_aidl_return = mTunerVersion;
333 return Status::ok();
334}
335
Amy Zhangce2cb402021-01-21 12:50:47 -0800336void TunerService::updateFrontendResources() {
337 hidl_vec<FrontendId> ids;
338 Result res = getHidlFrontendIds(ids);
339 if (res != Result::SUCCESS) {
340 return;
341 }
342 vector<TunerFrontendInfo> infos;
343 for (int i = 0; i < ids.size(); i++) {
344 FrontendInfo frontendInfo;
345 Result res = getHidlFrontendInfo((int)ids[i], frontendInfo);
346 if (res != Result::SUCCESS) {
347 continue;
348 }
349 TunerFrontendInfo tunerFrontendInfo{
350 .handle = getResourceHandleFromId((int)ids[i], FRONTEND),
351 .type = static_cast<int>(frontendInfo.type),
352 .exclusiveGroupId = static_cast<int>(frontendInfo.exclusiveGroupId),
353 };
354 infos.push_back(tunerFrontendInfo);
355 }
356 mTunerResourceManager->setFrontendInfoList(infos);
357}
358
359void TunerService::updateLnbResources() {
360 vector<int> handles = getLnbHandles();
361 if (handles.size() == 0) {
362 return;
363 }
364 mTunerResourceManager->setLnbInfoList(handles);
365}
366
367vector<int> TunerService::getLnbHandles() {
368 vector<int> lnbHandles;
369 if (mTuner != NULL) {
370 Result res;
371 vector<LnbId> lnbIds;
372 mTuner->getLnbIds([&](Result r, const hardware::hidl_vec<LnbId>& ids) {
373 lnbIds = ids;
374 res = r;
375 });
376 if (res != Result::SUCCESS || lnbIds.size() == 0) {
377 } else {
378 for (int i = 0; i < lnbIds.size(); i++) {
379 lnbHandles.push_back(getResourceHandleFromId((int)lnbIds[i], LNB));
380 }
381 }
382 }
383
384 return lnbHandles;
385}
386
387Result TunerService::getHidlFrontendIds(hidl_vec<FrontendId>& ids) {
388 if (mTuner == NULL) {
389 return Result::NOT_INITIALIZED;
390 }
391 Result res;
392 mTuner->getFrontendIds([&](Result r, const hidl_vec<FrontendId>& frontendIds) {
393 ids = frontendIds;
394 res = r;
395 });
396 return res;
397}
398
399Result TunerService::getHidlFrontendInfo(int id, FrontendInfo& info) {
400 if (mTuner == NULL) {
401 return Result::NOT_INITIALIZED;
402 }
403 Result res;
404 mTuner->getFrontendInfo(id, [&](Result r, const FrontendInfo& feInfo) {
405 info = feInfo;
406 res = r;
407 });
408 return res;
409}
410
Amy Zhang07428dc2021-02-04 15:58:02 -0800411TunerDemuxCapabilities TunerService::getAidlDemuxCaps(DemuxCapabilities caps) {
412 TunerDemuxCapabilities aidlCaps{
413 .numDemux = (int)caps.numDemux,
414 .numRecord = (int)caps.numRecord,
415 .numPlayback = (int)caps.numPlayback,
416 .numTsFilter = (int)caps.numTsFilter,
417 .numSectionFilter = (int)caps.numSectionFilter,
418 .numAudioFilter = (int)caps.numAudioFilter,
419 .numVideoFilter = (int)caps.numVideoFilter,
420 .numPesFilter = (int)caps.numPesFilter,
421 .numPcrFilter = (int)caps.numPcrFilter,
422 .numBytesInSectionFilter = (int)caps.numBytesInSectionFilter,
423 .filterCaps = (int)caps.filterCaps,
424 .bTimeFilter = caps.bTimeFilter,
425 };
426 aidlCaps.linkCaps.resize(caps.linkCaps.size());
427 copy(caps.linkCaps.begin(), caps.linkCaps.end(), aidlCaps.linkCaps.begin());
428 return aidlCaps;
429}
430
Amy Zhang1d28bbb2021-01-13 18:11:15 -0800431TunerFrontendInfo TunerService::convertToAidlFrontendInfo(FrontendInfo halInfo) {
432 TunerFrontendInfo info{
Amy Zhang70de35a2020-10-12 20:13:16 -0700433 .type = (int)halInfo.type,
434 .minFrequency = (int)halInfo.minFrequency,
435 .maxFrequency = (int)halInfo.maxFrequency,
436 .minSymbolRate = (int)halInfo.minSymbolRate,
437 .maxSymbolRate = (int)halInfo.maxSymbolRate,
438 .acquireRange = (int)halInfo.acquireRange,
439 .exclusiveGroupId = (int)halInfo.exclusiveGroupId,
440 };
441 for (int i = 0; i < halInfo.statusCaps.size(); i++) {
442 info.statusCaps.push_back((int)halInfo.statusCaps[i]);
443 }
444
445 TunerFrontendCapabilities caps;
446 switch (halInfo.type) {
447 case FrontendType::ANALOG: {
448 TunerFrontendAnalogCapabilities analogCaps{
449 .typeCap = (int)halInfo.frontendCaps.analogCaps().typeCap,
450 .sifStandardCap = (int)halInfo.frontendCaps.analogCaps().sifStandardCap,
451 };
452 caps.set<TunerFrontendCapabilities::analogCaps>(analogCaps);
453 break;
454 }
455 case FrontendType::ATSC: {
456 TunerFrontendAtscCapabilities atscCaps{
457 .modulationCap = (int)halInfo.frontendCaps.atscCaps().modulationCap,
458 };
459 caps.set<TunerFrontendCapabilities::atscCaps>(atscCaps);
460 break;
461 }
462 case FrontendType::ATSC3: {
463 TunerFrontendAtsc3Capabilities atsc3Caps{
464 .bandwidthCap = (int)halInfo.frontendCaps.atsc3Caps().bandwidthCap,
465 .modulationCap = (int)halInfo.frontendCaps.atsc3Caps().modulationCap,
466 .timeInterleaveModeCap =
467 (int)halInfo.frontendCaps.atsc3Caps().timeInterleaveModeCap,
468 .codeRateCap = (int)halInfo.frontendCaps.atsc3Caps().codeRateCap,
469 .demodOutputFormatCap = (int)halInfo.frontendCaps.atsc3Caps().demodOutputFormatCap,
470 .fecCap = (int)halInfo.frontendCaps.atsc3Caps().fecCap,
471 };
472 caps.set<TunerFrontendCapabilities::atsc3Caps>(atsc3Caps);
473 break;
474 }
475 case FrontendType::DVBC: {
476 TunerFrontendCableCapabilities cableCaps{
477 .modulationCap = (int)halInfo.frontendCaps.dvbcCaps().modulationCap,
Amy Zhang5af84142021-02-04 18:36:54 -0800478 .codeRateCap = (int64_t)halInfo.frontendCaps.dvbcCaps().fecCap,
Amy Zhang70de35a2020-10-12 20:13:16 -0700479 .annexCap = (int)halInfo.frontendCaps.dvbcCaps().annexCap,
480 };
481 caps.set<TunerFrontendCapabilities::cableCaps>(cableCaps);
482 break;
483 }
484 case FrontendType::DVBS: {
485 TunerFrontendDvbsCapabilities dvbsCaps{
486 .modulationCap = (int)halInfo.frontendCaps.dvbsCaps().modulationCap,
487 .codeRateCap = (long)halInfo.frontendCaps.dvbsCaps().innerfecCap,
488 .standard = (int)halInfo.frontendCaps.dvbsCaps().standard,
489 };
490 caps.set<TunerFrontendCapabilities::dvbsCaps>(dvbsCaps);
491 break;
492 }
493 case FrontendType::DVBT: {
494 TunerFrontendDvbtCapabilities dvbtCaps{
495 .transmissionModeCap = (int)halInfo.frontendCaps.dvbtCaps().transmissionModeCap,
496 .bandwidthCap = (int)halInfo.frontendCaps.dvbtCaps().bandwidthCap,
497 .constellationCap = (int)halInfo.frontendCaps.dvbtCaps().constellationCap,
498 .codeRateCap = (int)halInfo.frontendCaps.dvbtCaps().coderateCap,
499 .hierarchyCap = (int)halInfo.frontendCaps.dvbtCaps().hierarchyCap,
500 .guardIntervalCap = (int)halInfo.frontendCaps.dvbtCaps().guardIntervalCap,
501 .isT2Supported = (bool)halInfo.frontendCaps.dvbtCaps().isT2Supported,
502 .isMisoSupported = (bool)halInfo.frontendCaps.dvbtCaps().isMisoSupported,
503 };
504 caps.set<TunerFrontendCapabilities::dvbtCaps>(dvbtCaps);
505 break;
506 }
507 case FrontendType::ISDBS: {
508 TunerFrontendIsdbsCapabilities isdbsCaps{
509 .modulationCap = (int)halInfo.frontendCaps.isdbsCaps().modulationCap,
510 .codeRateCap = (int)halInfo.frontendCaps.isdbsCaps().coderateCap,
511 };
512 caps.set<TunerFrontendCapabilities::isdbsCaps>(isdbsCaps);
513 break;
514 }
515 case FrontendType::ISDBS3: {
516 TunerFrontendIsdbs3Capabilities isdbs3Caps{
517 .modulationCap = (int)halInfo.frontendCaps.isdbs3Caps().modulationCap,
518 .codeRateCap = (int)halInfo.frontendCaps.isdbs3Caps().coderateCap,
519 };
520 caps.set<TunerFrontendCapabilities::isdbs3Caps>(isdbs3Caps);
521 break;
522 }
523 case FrontendType::ISDBT: {
524 TunerFrontendIsdbtCapabilities isdbtCaps{
525 .modeCap = (int)halInfo.frontendCaps.isdbtCaps().modeCap,
526 .bandwidthCap = (int)halInfo.frontendCaps.isdbtCaps().bandwidthCap,
527 .modulationCap = (int)halInfo.frontendCaps.isdbtCaps().modulationCap,
528 .codeRateCap = (int)halInfo.frontendCaps.isdbtCaps().coderateCap,
529 .guardIntervalCap = (int)halInfo.frontendCaps.isdbtCaps().guardIntervalCap,
530 };
531 caps.set<TunerFrontendCapabilities::isdbtCaps>(isdbtCaps);
532 break;
533 }
534 default:
535 break;
536 }
537
538 info.caps = caps;
539 return info;
540}
shubang23aa3ac2020-09-07 18:56:28 -0700541} // namespace android