blob: aa033166ef5f4f2b07acf7220aac26a39cbf2734 [file] [log] [blame]
Hongguang093c5f32021-08-09 19:46:34 -07001/**
2 * Copyright (c) 2021, 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_NDEBUG 0
18#define LOG_TAG "TunerHidlService"
19
20#include "TunerHidlService.h"
21
Hongguang15758a82021-10-29 13:32:07 -070022#include <aidl/android/hardware/tv/tuner/FrontendIsdbtTimeInterleaveMode.h>
Hongguang093c5f32021-08-09 19:46:34 -070023#include <aidl/android/hardware/tv/tuner/Result.h>
24#include <android/binder_manager.h>
Hongguang34a479e2021-10-04 16:14:47 -070025#include <binder/IPCThreadState.h>
26#include <binder/PermissionCache.h>
Hongguang5eef5142022-08-09 20:26:42 -070027#include <cutils/properties.h>
Hongguang093c5f32021-08-09 19:46:34 -070028#include <utils/Log.h>
29
30#include "TunerHelper.h"
31#include "TunerHidlDemux.h"
32#include "TunerHidlDescrambler.h"
33#include "TunerHidlFrontend.h"
34#include "TunerHidlLnb.h"
35
36using ::aidl::android::hardware::tv::tuner::FrontendAnalogCapabilities;
37using ::aidl::android::hardware::tv::tuner::FrontendAtsc3Capabilities;
38using ::aidl::android::hardware::tv::tuner::FrontendAtscCapabilities;
39using ::aidl::android::hardware::tv::tuner::FrontendCapabilities;
40using ::aidl::android::hardware::tv::tuner::FrontendDtmbCapabilities;
41using ::aidl::android::hardware::tv::tuner::FrontendDvbcCapabilities;
42using ::aidl::android::hardware::tv::tuner::FrontendDvbsCapabilities;
43using ::aidl::android::hardware::tv::tuner::FrontendDvbtCapabilities;
44using ::aidl::android::hardware::tv::tuner::FrontendIsdbs3Capabilities;
45using ::aidl::android::hardware::tv::tuner::FrontendIsdbsCapabilities;
46using ::aidl::android::hardware::tv::tuner::FrontendIsdbtCapabilities;
Hongguang15758a82021-10-29 13:32:07 -070047using ::aidl::android::hardware::tv::tuner::FrontendIsdbtTimeInterleaveMode;
Hongguang093c5f32021-08-09 19:46:34 -070048using ::aidl::android::hardware::tv::tuner::FrontendType;
49using ::aidl::android::hardware::tv::tuner::Result;
Hongguang34a479e2021-10-04 16:14:47 -070050using ::android::IPCThreadState;
51using ::android::PermissionCache;
Hongguang093c5f32021-08-09 19:46:34 -070052using ::android::hardware::hidl_vec;
53
54using HidlFrontendId = ::android::hardware::tv::tuner::V1_0::FrontendId;
55using HidlLnbId = ::android::hardware::tv::tuner::V1_0::LnbId;
56using HidlFrontendType = ::android::hardware::tv::tuner::V1_1::FrontendType;
57
58using namespace std;
59
60namespace aidl {
61namespace android {
62namespace media {
63namespace tv {
64namespace tuner {
65
66TunerHidlService::TunerHidlService() {
Hongguang093c5f32021-08-09 19:46:34 -070067 mTuner = HidlITuner::getService();
Hongguang5eef5142022-08-09 20:26:42 -070068 ALOGE_IF(mTuner == nullptr, "Failed to get ITuner service");
Hongguang093c5f32021-08-09 19:46:34 -070069 mTunerVersion = TUNER_HAL_VERSION_1_0;
70
71 mTuner_1_1 = ::android::hardware::tv::tuner::V1_1::ITuner::castFrom(mTuner);
72 if (mTuner_1_1 != nullptr) {
73 mTunerVersion = TUNER_HAL_VERSION_1_1;
74 } else {
75 ALOGD("Failed to get ITuner_1_1 service");
76 }
77
Hongguang5eef5142022-08-09 20:26:42 -070078 // Register tuner resources to TRM.
79 updateTunerResources();
Hongguang093c5f32021-08-09 19:46:34 -070080}
81
Hongguang5eef5142022-08-09 20:26:42 -070082TunerHidlService::~TunerHidlService() {
83 mOpenedFrontends.clear();
84 mLnaStatus = -1;
85 mTuner = nullptr;
86 mTuner_1_1 = nullptr;
87}
88
89binder_status_t TunerHidlService::instantiate() {
90 if (HidlITuner::getService() == nullptr) {
91 ALOGD("Failed to get ITuner HIDL HAL");
92 return STATUS_NAME_NOT_FOUND;
93 }
94
95 shared_ptr<TunerHidlService> tunerService = ::ndk::SharedRefBase::make<TunerHidlService>();
96 bool lazyHal = property_get_bool("ro.tuner.lazyhal", false);
97 if (lazyHal) {
98 return AServiceManager_registerLazyService(tunerService->asBinder().get(),
99 getServiceName());
100 }
101 return AServiceManager_addService(tunerService->asBinder().get(), getServiceName());
Hongguang093c5f32021-08-09 19:46:34 -0700102}
103
104::ndk::ScopedAStatus TunerHidlService::openDemux(int32_t /* in_demuxHandle */,
105 shared_ptr<ITunerDemux>* _aidl_return) {
106 ALOGV("openDemux");
Hongguang093c5f32021-08-09 19:46:34 -0700107 HidlResult res;
108 uint32_t id;
109 sp<IDemux> demuxSp = nullptr;
110 mTuner->openDemux([&](HidlResult r, uint32_t demuxId, const sp<IDemux>& demux) {
111 demuxSp = demux;
112 id = demuxId;
113 res = r;
114 ALOGD("open demux, id = %d", demuxId);
115 });
116 if (res == HidlResult::SUCCESS) {
Hongguang5eef5142022-08-09 20:26:42 -0700117 *_aidl_return = ::ndk::SharedRefBase::make<TunerHidlDemux>(demuxSp, id,
118 this->ref<TunerHidlService>());
Hongguang093c5f32021-08-09 19:46:34 -0700119 return ::ndk::ScopedAStatus::ok();
120 }
121
122 ALOGW("open demux failed, res = %d", res);
123 return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
124}
125
126::ndk::ScopedAStatus TunerHidlService::getDemuxCaps(DemuxCapabilities* _aidl_return) {
127 ALOGV("getDemuxCaps");
Hongguang093c5f32021-08-09 19:46:34 -0700128 HidlResult res;
129 HidlDemuxCapabilities caps;
130 mTuner->getDemuxCaps([&](HidlResult r, const HidlDemuxCapabilities& demuxCaps) {
131 caps = demuxCaps;
132 res = r;
133 });
134 if (res == HidlResult::SUCCESS) {
135 *_aidl_return = getAidlDemuxCaps(caps);
136 return ::ndk::ScopedAStatus::ok();
137 }
138
139 ALOGW("Get demux caps failed, res = %d", res);
140 return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
141}
142
143::ndk::ScopedAStatus TunerHidlService::getFrontendIds(vector<int32_t>* ids) {
Hongguang093c5f32021-08-09 19:46:34 -0700144 hidl_vec<HidlFrontendId> feIds;
145 HidlResult res = getHidlFrontendIds(feIds);
146 if (res != HidlResult::SUCCESS) {
147 return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
148 }
149 ids->resize(feIds.size());
150 copy(feIds.begin(), feIds.end(), ids->begin());
151
152 return ::ndk::ScopedAStatus::ok();
153}
154
155::ndk::ScopedAStatus TunerHidlService::getFrontendInfo(int32_t id, FrontendInfo* _aidl_return) {
Hongguang093c5f32021-08-09 19:46:34 -0700156 HidlFrontendInfo info;
157 HidlResult res = getHidlFrontendInfo(id, info);
158 if (res != HidlResult::SUCCESS) {
159 return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
160 }
161
162 HidlFrontendDtmbCapabilities dtmbCaps;
163 if (static_cast<HidlFrontendType>(info.type) == HidlFrontendType::DTMB) {
Hongguang5eef5142022-08-09 20:26:42 -0700164 if (mTuner_1_1 == nullptr) {
Hongguang093c5f32021-08-09 19:46:34 -0700165 ALOGE("ITuner_1_1 service is not init.");
166 return ::ndk::ScopedAStatus::fromServiceSpecificError(
167 static_cast<int32_t>(Result::UNAVAILABLE));
168 }
169
170 mTuner_1_1->getFrontendDtmbCapabilities(
171 id, [&](HidlResult r, const HidlFrontendDtmbCapabilities& caps) {
172 dtmbCaps = caps;
173 res = r;
174 });
175 if (res != HidlResult::SUCCESS) {
176 return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
177 }
178 }
179
180 *_aidl_return = getAidlFrontendInfo(info, dtmbCaps);
181 return ::ndk::ScopedAStatus::ok();
182}
183
184::ndk::ScopedAStatus TunerHidlService::openFrontend(int32_t frontendHandle,
185 shared_ptr<ITunerFrontend>* _aidl_return) {
Hongguang093c5f32021-08-09 19:46:34 -0700186 HidlResult status;
187 sp<HidlIFrontend> frontend;
188 int id = TunerHelper::getResourceIdFromHandle(frontendHandle, FRONTEND);
189 mTuner->openFrontendById(id, [&](HidlResult result, const sp<HidlIFrontend>& fe) {
190 frontend = fe;
191 status = result;
192 });
193 if (status != HidlResult::SUCCESS) {
194 return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(status));
195 }
Hongguangd8ccaae2021-12-13 18:07:10 -0800196
Hongguang5eef5142022-08-09 20:26:42 -0700197 shared_ptr<TunerHidlFrontend> tunerFrontend = ::ndk::SharedRefBase::make<TunerHidlFrontend>(
198 frontend, id, this->ref<TunerHidlService>());
Hongguangd8ccaae2021-12-13 18:07:10 -0800199 if (mLnaStatus != -1) {
200 tunerFrontend->setLna(mLnaStatus == 1);
201 }
202 {
203 Mutex::Autolock _l(mOpenedFrontendsLock);
204 mOpenedFrontends.insert(tunerFrontend);
205 }
206 *_aidl_return = tunerFrontend;
Hongguang093c5f32021-08-09 19:46:34 -0700207 return ::ndk::ScopedAStatus::ok();
208}
209
210::ndk::ScopedAStatus TunerHidlService::openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return) {
Hongguang093c5f32021-08-09 19:46:34 -0700211 HidlResult status;
212 sp<HidlILnb> lnb;
213 int id = TunerHelper::getResourceIdFromHandle(lnbHandle, LNB);
214 mTuner->openLnbById(id, [&](HidlResult result, const sp<HidlILnb>& lnbSp) {
215 lnb = lnbSp;
216 status = result;
217 });
218 if (status != HidlResult::SUCCESS) {
219 return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(status));
220 }
221
222 *_aidl_return = ::ndk::SharedRefBase::make<TunerHidlLnb>(lnb, id);
223 return ::ndk::ScopedAStatus::ok();
224}
225
226::ndk::ScopedAStatus TunerHidlService::openLnbByName(const string& lnbName,
227 shared_ptr<ITunerLnb>* _aidl_return) {
Hongguang093c5f32021-08-09 19:46:34 -0700228 int lnbId;
229 HidlResult status;
230 sp<HidlILnb> lnb;
231 mTuner->openLnbByName(lnbName, [&](HidlResult r, HidlLnbId id, const sp<HidlILnb>& lnbSp) {
232 status = r;
233 lnb = lnbSp;
234 lnbId = static_cast<int32_t>(id);
235 });
236 if (status != HidlResult::SUCCESS) {
237 return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(status));
238 }
239
240 *_aidl_return = ::ndk::SharedRefBase::make<TunerHidlLnb>(lnb, lnbId);
241 return ::ndk::ScopedAStatus::ok();
242}
243
244::ndk::ScopedAStatus TunerHidlService::openDescrambler(
245 int32_t /*descramblerHandle*/, shared_ptr<ITunerDescrambler>* _aidl_return) {
Hongguang093c5f32021-08-09 19:46:34 -0700246 HidlResult status;
247 sp<HidlIDescrambler> descrambler;
248 //int id = TunerHelper::getResourceIdFromHandle(descramblerHandle, DESCRAMBLER);
249 mTuner->openDescrambler([&](HidlResult r, const sp<HidlIDescrambler>& descramblerSp) {
250 status = r;
251 descrambler = descramblerSp;
252 });
253 if (status != HidlResult::SUCCESS) {
254 return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(status));
255 }
256
257 *_aidl_return = ::ndk::SharedRefBase::make<TunerHidlDescrambler>(descrambler);
258 return ::ndk::ScopedAStatus::ok();
259}
260
261::ndk::ScopedAStatus TunerHidlService::getTunerHalVersion(int* _aidl_return) {
Hongguang093c5f32021-08-09 19:46:34 -0700262 *_aidl_return = mTunerVersion;
263 return ::ndk::ScopedAStatus::ok();
264}
265
Hongguang34a479e2021-10-04 16:14:47 -0700266::ndk::ScopedAStatus TunerHidlService::openSharedFilter(
267 const string& in_filterToken, const shared_ptr<ITunerFilterCallback>& in_cb,
268 shared_ptr<ITunerFilter>* _aidl_return) {
Hongguang5eef5142022-08-09 20:26:42 -0700269 if (mTuner == nullptr) {
Hongguang34a479e2021-10-04 16:14:47 -0700270 ALOGE("get ITuner failed");
271 return ::ndk::ScopedAStatus::fromServiceSpecificError(
272 static_cast<int32_t>(Result::UNAVAILABLE));
273 }
274
275 if (!PermissionCache::checkCallingPermission(sSharedFilterPermission)) {
276 ALOGE("Request requires android.permission.ACCESS_TV_SHARED_FILTER");
277 return ::ndk::ScopedAStatus::fromServiceSpecificError(
278 static_cast<int32_t>(Result::UNAVAILABLE));
279 }
280
281 Mutex::Autolock _l(mSharedFiltersLock);
282 if (mSharedFilters.find(in_filterToken) == mSharedFilters.end()) {
283 *_aidl_return = nullptr;
284 ALOGD("fail to find %s", in_filterToken.c_str());
285 return ::ndk::ScopedAStatus::fromServiceSpecificError(
286 static_cast<int32_t>(Result::INVALID_STATE));
287 }
288
289 shared_ptr<TunerHidlFilter> filter = mSharedFilters.at(in_filterToken);
290 IPCThreadState* ipc = IPCThreadState::self();
291 const int pid = ipc->getCallingPid();
292 if (!filter->isSharedFilterAllowed(pid)) {
293 *_aidl_return = nullptr;
294 ALOGD("shared filter %s is opened in the same process", in_filterToken.c_str());
295 return ::ndk::ScopedAStatus::fromServiceSpecificError(
296 static_cast<int32_t>(Result::INVALID_STATE));
297 }
298
299 filter->attachSharedFilterCallback(in_cb);
300
301 *_aidl_return = filter;
302 return ::ndk::ScopedAStatus::ok();
303}
304
Hongguangd8ccaae2021-12-13 18:07:10 -0800305::ndk::ScopedAStatus TunerHidlService::setLna(bool bEnable) {
Hongguang5eef5142022-08-09 20:26:42 -0700306 if (mTuner == nullptr) {
Hongguangd8ccaae2021-12-13 18:07:10 -0800307 ALOGE("get ITuner failed");
308 return ::ndk::ScopedAStatus::fromServiceSpecificError(
309 static_cast<int32_t>(Result::UNAVAILABLE));
310 }
311
312 mLnaStatus = bEnable ? 1 : 0;
313
314 {
315 Mutex::Autolock _l(mOpenedFrontendsLock);
316 for (auto it = mOpenedFrontends.begin(); it != mOpenedFrontends.end(); ++it) {
317 (*it)->setLna(mLnaStatus == 1);
318 }
319 }
320
321 return ::ndk::ScopedAStatus::ok();
322}
323
Hongguang9fc18a92021-12-22 15:15:04 -0800324::ndk::ScopedAStatus TunerHidlService::setMaxNumberOfFrontends(FrontendType /* in_frontendType */,
325 int32_t /* in_maxNumber */) {
326 return ::ndk::ScopedAStatus::fromServiceSpecificError(
327 static_cast<int32_t>(Result::UNAVAILABLE));
328}
329
330::ndk::ScopedAStatus TunerHidlService::getMaxNumberOfFrontends(FrontendType /* in_frontendType */,
331 int32_t* _aidl_return) {
332 *_aidl_return = -1;
333 return ::ndk::ScopedAStatus::fromServiceSpecificError(
334 static_cast<int32_t>(Result::UNAVAILABLE));
335}
336
Hongguang34a479e2021-10-04 16:14:47 -0700337string TunerHidlService::addFilterToShared(const shared_ptr<TunerHidlFilter>& sharedFilter) {
338 Mutex::Autolock _l(mSharedFiltersLock);
339
340 // Use sharedFilter address as token.
341 string token = to_string(reinterpret_cast<std::uintptr_t>(sharedFilter.get()));
342 mSharedFilters[token] = sharedFilter;
343
344 return token;
345}
346
347void TunerHidlService::removeSharedFilter(const shared_ptr<TunerHidlFilter>& sharedFilter) {
348 Mutex::Autolock _l(mSharedFiltersLock);
349
350 // Use sharedFilter address as token.
351 mSharedFilters.erase(to_string(reinterpret_cast<std::uintptr_t>(sharedFilter.get())));
352}
353
Hongguangd8ccaae2021-12-13 18:07:10 -0800354void TunerHidlService::removeFrontend(const shared_ptr<TunerHidlFrontend>& frontend) {
355 Mutex::Autolock _l(mOpenedFrontendsLock);
356 for (auto it = mOpenedFrontends.begin(); it != mOpenedFrontends.end(); ++it) {
357 if (it->get() == frontend.get()) {
358 mOpenedFrontends.erase(it);
359 break;
360 }
361 }
362}
363
Hongguang093c5f32021-08-09 19:46:34 -0700364void TunerHidlService::updateTunerResources() {
Hongguang093c5f32021-08-09 19:46:34 -0700365 TunerHelper::updateTunerResources(getTRMFrontendInfos(), getTRMLnbHandles());
366}
367
368vector<TunerFrontendInfo> TunerHidlService::getTRMFrontendInfos() {
369 vector<TunerFrontendInfo> infos;
370 hidl_vec<HidlFrontendId> ids;
371 HidlResult res = getHidlFrontendIds(ids);
372 if (res != HidlResult::SUCCESS) {
373 return infos;
374 }
375
376 for (int i = 0; i < ids.size(); i++) {
377 HidlFrontendInfo frontendInfo;
378 HidlResult res = getHidlFrontendInfo(static_cast<int32_t>(ids[i]), frontendInfo);
379 if (res != HidlResult::SUCCESS) {
380 continue;
381 }
382 TunerFrontendInfo tunerFrontendInfo{
383 .handle = TunerHelper::getResourceHandleFromId(static_cast<int32_t>(ids[i]),
384 FRONTEND),
385 .type = static_cast<int32_t>(frontendInfo.type),
386 .exclusiveGroupId = static_cast<int32_t>(frontendInfo.exclusiveGroupId),
387 };
388 infos.push_back(tunerFrontendInfo);
389 }
390
391 return infos;
392}
393
394vector<int32_t> TunerHidlService::getTRMLnbHandles() {
395 vector<int32_t> lnbHandles;
396 if (mTuner != nullptr) {
397 HidlResult res;
398 vector<HidlLnbId> lnbIds;
399 mTuner->getLnbIds([&](HidlResult r, const hidl_vec<HidlLnbId>& ids) {
400 lnbIds = ids;
401 res = r;
402 });
403 if (res == HidlResult::SUCCESS && lnbIds.size() > 0) {
404 for (int i = 0; i < lnbIds.size(); i++) {
405 lnbHandles.push_back(
406 TunerHelper::getResourceHandleFromId(static_cast<int32_t>(lnbIds[i]), LNB));
407 }
408 }
409 }
410
411 return lnbHandles;
412}
413
414HidlResult TunerHidlService::getHidlFrontendIds(hidl_vec<HidlFrontendId>& ids) {
415 if (mTuner == nullptr) {
416 return HidlResult::NOT_INITIALIZED;
417 }
418 HidlResult res;
419 mTuner->getFrontendIds([&](HidlResult r, const hidl_vec<HidlFrontendId>& frontendIds) {
420 ids = frontendIds;
421 res = r;
422 });
423 return res;
424}
425
426HidlResult TunerHidlService::getHidlFrontendInfo(const int id, HidlFrontendInfo& info) {
427 if (mTuner == nullptr) {
428 return HidlResult::NOT_INITIALIZED;
429 }
430 HidlResult res;
431 mTuner->getFrontendInfo(id, [&](HidlResult r, const HidlFrontendInfo& feInfo) {
432 info = feInfo;
433 res = r;
434 });
435 return res;
436}
437
438DemuxCapabilities TunerHidlService::getAidlDemuxCaps(const HidlDemuxCapabilities& caps) {
439 DemuxCapabilities aidlCaps{
440 .numDemux = static_cast<int32_t>(caps.numDemux),
441 .numRecord = static_cast<int32_t>(caps.numRecord),
442 .numPlayback = static_cast<int32_t>(caps.numPlayback),
443 .numTsFilter = static_cast<int32_t>(caps.numTsFilter),
444 .numSectionFilter = static_cast<int32_t>(caps.numSectionFilter),
445 .numAudioFilter = static_cast<int32_t>(caps.numAudioFilter),
446 .numVideoFilter = static_cast<int32_t>(caps.numVideoFilter),
447 .numPesFilter = static_cast<int32_t>(caps.numPesFilter),
448 .numPcrFilter = static_cast<int32_t>(caps.numPcrFilter),
449 .numBytesInSectionFilter = static_cast<int64_t>(caps.numBytesInSectionFilter),
450 .filterCaps = static_cast<int32_t>(caps.filterCaps),
451 .bTimeFilter = caps.bTimeFilter,
452 };
453 aidlCaps.linkCaps.resize(caps.linkCaps.size());
454 copy(caps.linkCaps.begin(), caps.linkCaps.end(), aidlCaps.linkCaps.begin());
455 return aidlCaps;
456}
457
458FrontendInfo TunerHidlService::getAidlFrontendInfo(
459 const HidlFrontendInfo& halInfo, const HidlFrontendDtmbCapabilities& halDtmbCaps) {
460 FrontendInfo info{
461 .type = static_cast<FrontendType>(halInfo.type),
462 .minFrequency = static_cast<int64_t>(halInfo.minFrequency),
463 .maxFrequency = static_cast<int64_t>(halInfo.maxFrequency),
464 .minSymbolRate = static_cast<int32_t>(halInfo.minSymbolRate),
465 .maxSymbolRate = static_cast<int32_t>(halInfo.maxSymbolRate),
466 .acquireRange = static_cast<int64_t>(halInfo.acquireRange),
467 .exclusiveGroupId = static_cast<int32_t>(halInfo.exclusiveGroupId),
468 };
469 for (int i = 0; i < halInfo.statusCaps.size(); i++) {
470 info.statusCaps.push_back(static_cast<FrontendStatusType>(halInfo.statusCaps[i]));
471 }
472
473 FrontendCapabilities caps;
474 switch (halInfo.type) {
475 case ::android::hardware::tv::tuner::V1_0::FrontendType::ANALOG: {
476 if (HidlFrontendInfo::FrontendCapabilities::hidl_discriminator::analogCaps ==
477 halInfo.frontendCaps.getDiscriminator()) {
478 FrontendAnalogCapabilities analogCaps{
479 .typeCap = static_cast<int32_t>(halInfo.frontendCaps.analogCaps().typeCap),
480 .sifStandardCap =
481 static_cast<int32_t>(halInfo.frontendCaps.analogCaps().sifStandardCap),
482 };
483 caps.set<FrontendCapabilities::analogCaps>(analogCaps);
484 }
485 break;
486 }
487 case ::android::hardware::tv::tuner::V1_0::FrontendType::ATSC: {
488 if (HidlFrontendInfo::FrontendCapabilities::hidl_discriminator::atscCaps ==
489 halInfo.frontendCaps.getDiscriminator()) {
490 FrontendAtscCapabilities atscCaps{
491 .modulationCap =
492 static_cast<int32_t>(halInfo.frontendCaps.atscCaps().modulationCap),
493 };
494 caps.set<FrontendCapabilities::atscCaps>(atscCaps);
495 }
496 break;
497 }
498 case ::android::hardware::tv::tuner::V1_0::FrontendType::ATSC3: {
499 if (HidlFrontendInfo::FrontendCapabilities::hidl_discriminator::atsc3Caps ==
500 halInfo.frontendCaps.getDiscriminator()) {
501 FrontendAtsc3Capabilities atsc3Caps{
502 .bandwidthCap =
503 static_cast<int32_t>(halInfo.frontendCaps.atsc3Caps().bandwidthCap),
504 .modulationCap =
505 static_cast<int32_t>(halInfo.frontendCaps.atsc3Caps().modulationCap),
506 .timeInterleaveModeCap = static_cast<int32_t>(
507 halInfo.frontendCaps.atsc3Caps().timeInterleaveModeCap),
508 .codeRateCap =
509 static_cast<int32_t>(halInfo.frontendCaps.atsc3Caps().codeRateCap),
510 .demodOutputFormatCap = static_cast<int8_t>(
511 halInfo.frontendCaps.atsc3Caps().demodOutputFormatCap),
512 .fecCap = static_cast<int32_t>(halInfo.frontendCaps.atsc3Caps().fecCap),
513 };
514 caps.set<FrontendCapabilities::atsc3Caps>(atsc3Caps);
515 }
516 break;
517 }
518 case ::android::hardware::tv::tuner::V1_0::FrontendType::DVBC: {
519 if (HidlFrontendInfo::FrontendCapabilities::hidl_discriminator::dvbcCaps ==
520 halInfo.frontendCaps.getDiscriminator()) {
521 FrontendDvbcCapabilities dvbcCaps{
522 .modulationCap =
523 static_cast<int32_t>(halInfo.frontendCaps.dvbcCaps().modulationCap),
524 .fecCap = static_cast<int64_t>(halInfo.frontendCaps.dvbcCaps().fecCap),
525 .annexCap = static_cast<int8_t>(halInfo.frontendCaps.dvbcCaps().annexCap),
526 };
527 caps.set<FrontendCapabilities::dvbcCaps>(dvbcCaps);
528 }
529 break;
530 }
531 case ::android::hardware::tv::tuner::V1_0::FrontendType::DVBS: {
532 if (HidlFrontendInfo::FrontendCapabilities::hidl_discriminator::dvbsCaps ==
533 halInfo.frontendCaps.getDiscriminator()) {
534 FrontendDvbsCapabilities dvbsCaps{
535 .modulationCap =
536 static_cast<int32_t>(halInfo.frontendCaps.dvbsCaps().modulationCap),
537 .innerfecCap =
538 static_cast<int64_t>(halInfo.frontendCaps.dvbsCaps().innerfecCap),
539 .standard = static_cast<int8_t>(halInfo.frontendCaps.dvbsCaps().standard),
540 };
541 caps.set<FrontendCapabilities::dvbsCaps>(dvbsCaps);
542 }
543 break;
544 }
545 case ::android::hardware::tv::tuner::V1_0::FrontendType::DVBT: {
546 if (HidlFrontendInfo::FrontendCapabilities::hidl_discriminator::dvbtCaps ==
547 halInfo.frontendCaps.getDiscriminator()) {
548 FrontendDvbtCapabilities dvbtCaps{
549 .transmissionModeCap = static_cast<int32_t>(
550 halInfo.frontendCaps.dvbtCaps().transmissionModeCap),
551 .bandwidthCap =
552 static_cast<int32_t>(halInfo.frontendCaps.dvbtCaps().bandwidthCap),
553 .constellationCap =
554 static_cast<int32_t>(halInfo.frontendCaps.dvbtCaps().constellationCap),
555 .coderateCap =
556 static_cast<int32_t>(halInfo.frontendCaps.dvbtCaps().coderateCap),
557 .hierarchyCap =
558 static_cast<int32_t>(halInfo.frontendCaps.dvbtCaps().hierarchyCap),
559 .guardIntervalCap =
560 static_cast<int32_t>(halInfo.frontendCaps.dvbtCaps().guardIntervalCap),
561 .isT2Supported = halInfo.frontendCaps.dvbtCaps().isT2Supported,
562 .isMisoSupported = halInfo.frontendCaps.dvbtCaps().isMisoSupported,
563 };
564 caps.set<FrontendCapabilities::dvbtCaps>(dvbtCaps);
565 }
566 break;
567 }
568 case ::android::hardware::tv::tuner::V1_0::FrontendType::ISDBS: {
569 if (HidlFrontendInfo::FrontendCapabilities::hidl_discriminator::isdbsCaps ==
570 halInfo.frontendCaps.getDiscriminator()) {
571 FrontendIsdbsCapabilities isdbsCaps{
572 .modulationCap =
573 static_cast<int32_t>(halInfo.frontendCaps.isdbsCaps().modulationCap),
574 .coderateCap =
575 static_cast<int32_t>(halInfo.frontendCaps.isdbsCaps().coderateCap),
576 };
577 caps.set<FrontendCapabilities::isdbsCaps>(isdbsCaps);
578 }
579 break;
580 }
581 case ::android::hardware::tv::tuner::V1_0::FrontendType::ISDBS3: {
582 if (HidlFrontendInfo::FrontendCapabilities::hidl_discriminator::isdbs3Caps ==
583 halInfo.frontendCaps.getDiscriminator()) {
584 FrontendIsdbs3Capabilities isdbs3Caps{
585 .modulationCap =
586 static_cast<int32_t>(halInfo.frontendCaps.isdbs3Caps().modulationCap),
587 .coderateCap =
588 static_cast<int32_t>(halInfo.frontendCaps.isdbs3Caps().coderateCap),
589 };
590 caps.set<FrontendCapabilities::isdbs3Caps>(isdbs3Caps);
591 }
592 break;
593 }
594 case ::android::hardware::tv::tuner::V1_0::FrontendType::ISDBT: {
595 if (HidlFrontendInfo::FrontendCapabilities::hidl_discriminator::isdbtCaps ==
596 halInfo.frontendCaps.getDiscriminator()) {
597 FrontendIsdbtCapabilities isdbtCaps{
598 .modeCap = static_cast<int32_t>(halInfo.frontendCaps.isdbtCaps().modeCap),
599 .bandwidthCap =
600 static_cast<int32_t>(halInfo.frontendCaps.isdbtCaps().bandwidthCap),
601 .modulationCap =
602 static_cast<int32_t>(halInfo.frontendCaps.isdbtCaps().modulationCap),
603 .coderateCap =
604 static_cast<int32_t>(halInfo.frontendCaps.isdbtCaps().coderateCap),
605 .guardIntervalCap =
606 static_cast<int32_t>(halInfo.frontendCaps.isdbtCaps().guardIntervalCap),
Hongguang15758a82021-10-29 13:32:07 -0700607 .timeInterleaveCap =
608 static_cast<int32_t>(FrontendIsdbtTimeInterleaveMode::UNDEFINED),
609 .isSegmentAuto = false,
610 .isFullSegment = false,
Hongguang093c5f32021-08-09 19:46:34 -0700611 };
612 caps.set<FrontendCapabilities::isdbtCaps>(isdbtCaps);
613 }
614 break;
615 }
616 default: {
617 if (static_cast<HidlFrontendType>(info.type) == HidlFrontendType::DTMB) {
618 FrontendDtmbCapabilities dtmbCaps{
619 .transmissionModeCap = static_cast<int32_t>(halDtmbCaps.transmissionModeCap),
620 .bandwidthCap = static_cast<int32_t>(halDtmbCaps.bandwidthCap),
621 .modulationCap = static_cast<int32_t>(halDtmbCaps.modulationCap),
622 .codeRateCap = static_cast<int32_t>(halDtmbCaps.codeRateCap),
623 .guardIntervalCap = static_cast<int32_t>(halDtmbCaps.guardIntervalCap),
624 .interleaveModeCap = static_cast<int32_t>(halDtmbCaps.interleaveModeCap),
625 };
626 caps.set<FrontendCapabilities::dtmbCaps>(dtmbCaps);
627 }
628 break;
629 }
630 }
631
632 info.frontendCaps = caps;
633 return info;
634}
635
636} // namespace tuner
637} // namespace tv
638} // namespace media
639} // namespace android
640} // namespace aidl