xref: /aosp_15_r20/frameworks/av/services/tuner/hidl/TunerHidlDemux.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /**
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright 2021, The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker  *
4*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker  *
8*ec779b8eSAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker  *
10*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker  */
16*ec779b8eSAndroid Build Coastguard Worker 
17*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "TunerHidlDemux"
18*ec779b8eSAndroid Build Coastguard Worker 
19*ec779b8eSAndroid Build Coastguard Worker #include "TunerHidlDemux.h"
20*ec779b8eSAndroid Build Coastguard Worker 
21*ec779b8eSAndroid Build Coastguard Worker #include "TunerHidlDvr.h"
22*ec779b8eSAndroid Build Coastguard Worker #include "TunerHidlFilter.h"
23*ec779b8eSAndroid Build Coastguard Worker #include "TunerHidlService.h"
24*ec779b8eSAndroid Build Coastguard Worker #include "TunerHidlTimeFilter.h"
25*ec779b8eSAndroid Build Coastguard Worker 
26*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::DemuxFilterSubType;
27*ec779b8eSAndroid Build Coastguard Worker 
28*ec779b8eSAndroid Build Coastguard Worker using HidlDemuxAlpFilterType = ::android::hardware::tv::tuner::V1_0::DemuxAlpFilterType;
29*ec779b8eSAndroid Build Coastguard Worker using HidlDemuxFilterMainType = ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType;
30*ec779b8eSAndroid Build Coastguard Worker using HidlDemuxFilterType = ::android::hardware::tv::tuner::V1_0::DemuxFilterType;
31*ec779b8eSAndroid Build Coastguard Worker using HidlDemuxIpFilterType = ::android::hardware::tv::tuner::V1_0::DemuxIpFilterType;
32*ec779b8eSAndroid Build Coastguard Worker using HidlDemuxMmtpFilterType = ::android::hardware::tv::tuner::V1_0::DemuxMmtpFilterType;
33*ec779b8eSAndroid Build Coastguard Worker using HidlDemuxTlvFilterType = ::android::hardware::tv::tuner::V1_0::DemuxTlvFilterType;
34*ec779b8eSAndroid Build Coastguard Worker using HidlDemuxTsFilterType = ::android::hardware::tv::tuner::V1_0::DemuxTsFilterType;
35*ec779b8eSAndroid Build Coastguard Worker using HidlDvrType = ::android::hardware::tv::tuner::V1_0::DvrType;
36*ec779b8eSAndroid Build Coastguard Worker using HidlResult = ::android::hardware::tv::tuner::V1_0::Result;
37*ec779b8eSAndroid Build Coastguard Worker 
38*ec779b8eSAndroid Build Coastguard Worker using namespace std;
39*ec779b8eSAndroid Build Coastguard Worker 
40*ec779b8eSAndroid Build Coastguard Worker namespace aidl {
41*ec779b8eSAndroid Build Coastguard Worker namespace android {
42*ec779b8eSAndroid Build Coastguard Worker namespace media {
43*ec779b8eSAndroid Build Coastguard Worker namespace tv {
44*ec779b8eSAndroid Build Coastguard Worker namespace tuner {
45*ec779b8eSAndroid Build Coastguard Worker 
TunerHidlDemux(const sp<IDemux> demux,const int id,const shared_ptr<TunerHidlService> tuner)46*ec779b8eSAndroid Build Coastguard Worker TunerHidlDemux::TunerHidlDemux(const sp<IDemux> demux, const int id,
47*ec779b8eSAndroid Build Coastguard Worker                                const shared_ptr<TunerHidlService> tuner) {
48*ec779b8eSAndroid Build Coastguard Worker     mDemux = demux;
49*ec779b8eSAndroid Build Coastguard Worker     mDemuxId = id;
50*ec779b8eSAndroid Build Coastguard Worker     mTunerService = tuner;
51*ec779b8eSAndroid Build Coastguard Worker }
52*ec779b8eSAndroid Build Coastguard Worker 
~TunerHidlDemux()53*ec779b8eSAndroid Build Coastguard Worker TunerHidlDemux::~TunerHidlDemux() {
54*ec779b8eSAndroid Build Coastguard Worker     mDemux = nullptr;
55*ec779b8eSAndroid Build Coastguard Worker     mTunerService = nullptr;
56*ec779b8eSAndroid Build Coastguard Worker }
57*ec779b8eSAndroid Build Coastguard Worker 
setFrontendDataSource(const shared_ptr<ITunerFrontend> & in_frontend)58*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlDemux::setFrontendDataSource(
59*ec779b8eSAndroid Build Coastguard Worker         const shared_ptr<ITunerFrontend>& in_frontend) {
60*ec779b8eSAndroid Build Coastguard Worker     int frontendId;
61*ec779b8eSAndroid Build Coastguard Worker     in_frontend->getFrontendId(&frontendId);
62*ec779b8eSAndroid Build Coastguard Worker     HidlResult res = mDemux->setFrontendDataSource(frontendId);
63*ec779b8eSAndroid Build Coastguard Worker     if (res != HidlResult::SUCCESS) {
64*ec779b8eSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
65*ec779b8eSAndroid Build Coastguard Worker     }
66*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
67*ec779b8eSAndroid Build Coastguard Worker }
68*ec779b8eSAndroid Build Coastguard Worker 
setFrontendDataSourceById(int frontendId)69*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlDemux::setFrontendDataSourceById(int frontendId) {
70*ec779b8eSAndroid Build Coastguard Worker     HidlResult res = mDemux->setFrontendDataSource(frontendId);
71*ec779b8eSAndroid Build Coastguard Worker     if (res != HidlResult::SUCCESS) {
72*ec779b8eSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
73*ec779b8eSAndroid Build Coastguard Worker     }
74*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
75*ec779b8eSAndroid Build Coastguard Worker }
76*ec779b8eSAndroid Build Coastguard Worker 
openFilter(const DemuxFilterType & in_type,int32_t in_bufferSize,const shared_ptr<ITunerFilterCallback> & in_cb,shared_ptr<ITunerFilter> * _aidl_return)77*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlDemux::openFilter(const DemuxFilterType& in_type,
78*ec779b8eSAndroid Build Coastguard Worker                                                 int32_t in_bufferSize,
79*ec779b8eSAndroid Build Coastguard Worker                                                 const shared_ptr<ITunerFilterCallback>& in_cb,
80*ec779b8eSAndroid Build Coastguard Worker                                                 shared_ptr<ITunerFilter>* _aidl_return) {
81*ec779b8eSAndroid Build Coastguard Worker     HidlDemuxFilterMainType mainType = static_cast<HidlDemuxFilterMainType>(in_type.mainType);
82*ec779b8eSAndroid Build Coastguard Worker     HidlDemuxFilterType filterType{
83*ec779b8eSAndroid Build Coastguard Worker             .mainType = mainType,
84*ec779b8eSAndroid Build Coastguard Worker     };
85*ec779b8eSAndroid Build Coastguard Worker 
86*ec779b8eSAndroid Build Coastguard Worker     switch (mainType) {
87*ec779b8eSAndroid Build Coastguard Worker     case HidlDemuxFilterMainType::TS:
88*ec779b8eSAndroid Build Coastguard Worker         filterType.subType.tsFilterType(static_cast<HidlDemuxTsFilterType>(
89*ec779b8eSAndroid Build Coastguard Worker                 in_type.subType.get<DemuxFilterSubType::Tag::tsFilterType>()));
90*ec779b8eSAndroid Build Coastguard Worker         break;
91*ec779b8eSAndroid Build Coastguard Worker     case HidlDemuxFilterMainType::MMTP:
92*ec779b8eSAndroid Build Coastguard Worker         filterType.subType.mmtpFilterType(static_cast<HidlDemuxMmtpFilterType>(
93*ec779b8eSAndroid Build Coastguard Worker                 in_type.subType.get<DemuxFilterSubType::Tag::mmtpFilterType>()));
94*ec779b8eSAndroid Build Coastguard Worker         break;
95*ec779b8eSAndroid Build Coastguard Worker     case HidlDemuxFilterMainType::IP:
96*ec779b8eSAndroid Build Coastguard Worker         filterType.subType.ipFilterType(static_cast<HidlDemuxIpFilterType>(
97*ec779b8eSAndroid Build Coastguard Worker                 in_type.subType.get<DemuxFilterSubType::Tag::ipFilterType>()));
98*ec779b8eSAndroid Build Coastguard Worker         break;
99*ec779b8eSAndroid Build Coastguard Worker     case HidlDemuxFilterMainType::TLV:
100*ec779b8eSAndroid Build Coastguard Worker         filterType.subType.tlvFilterType(static_cast<HidlDemuxTlvFilterType>(
101*ec779b8eSAndroid Build Coastguard Worker                 in_type.subType.get<DemuxFilterSubType::Tag::tlvFilterType>()));
102*ec779b8eSAndroid Build Coastguard Worker         break;
103*ec779b8eSAndroid Build Coastguard Worker     case HidlDemuxFilterMainType::ALP:
104*ec779b8eSAndroid Build Coastguard Worker         filterType.subType.alpFilterType(static_cast<HidlDemuxAlpFilterType>(
105*ec779b8eSAndroid Build Coastguard Worker                 in_type.subType.get<DemuxFilterSubType::Tag::alpFilterType>()));
106*ec779b8eSAndroid Build Coastguard Worker         break;
107*ec779b8eSAndroid Build Coastguard Worker     }
108*ec779b8eSAndroid Build Coastguard Worker     HidlResult status;
109*ec779b8eSAndroid Build Coastguard Worker     sp<HidlIFilter> filterSp;
110*ec779b8eSAndroid Build Coastguard Worker     sp<TunerHidlFilter::FilterCallback> filterCb = new TunerHidlFilter::FilterCallback(in_cb);
111*ec779b8eSAndroid Build Coastguard Worker     sp<::android::hardware::tv::tuner::V1_0::IFilterCallback> cbSp = filterCb;
112*ec779b8eSAndroid Build Coastguard Worker     mDemux->openFilter(filterType, static_cast<uint32_t>(in_bufferSize), cbSp,
113*ec779b8eSAndroid Build Coastguard Worker                        [&](HidlResult r, const sp<HidlIFilter>& filter) {
114*ec779b8eSAndroid Build Coastguard Worker                            filterSp = filter;
115*ec779b8eSAndroid Build Coastguard Worker                            status = r;
116*ec779b8eSAndroid Build Coastguard Worker                        });
117*ec779b8eSAndroid Build Coastguard Worker     if (status != HidlResult::SUCCESS) {
118*ec779b8eSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(status));
119*ec779b8eSAndroid Build Coastguard Worker     }
120*ec779b8eSAndroid Build Coastguard Worker 
121*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return =
122*ec779b8eSAndroid Build Coastguard Worker             ::ndk::SharedRefBase::make<TunerHidlFilter>(filterSp, filterCb, in_type, mTunerService);
123*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
124*ec779b8eSAndroid Build Coastguard Worker }
125*ec779b8eSAndroid Build Coastguard Worker 
openTimeFilter(shared_ptr<ITunerTimeFilter> * _aidl_return)126*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlDemux::openTimeFilter(shared_ptr<ITunerTimeFilter>* _aidl_return) {
127*ec779b8eSAndroid Build Coastguard Worker     HidlResult status;
128*ec779b8eSAndroid Build Coastguard Worker     sp<HidlITimeFilter> filterSp;
129*ec779b8eSAndroid Build Coastguard Worker     mDemux->openTimeFilter([&](HidlResult r, const sp<HidlITimeFilter>& filter) {
130*ec779b8eSAndroid Build Coastguard Worker         filterSp = filter;
131*ec779b8eSAndroid Build Coastguard Worker         status = r;
132*ec779b8eSAndroid Build Coastguard Worker     });
133*ec779b8eSAndroid Build Coastguard Worker     if (status != HidlResult::SUCCESS) {
134*ec779b8eSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(status));
135*ec779b8eSAndroid Build Coastguard Worker     }
136*ec779b8eSAndroid Build Coastguard Worker 
137*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = ::ndk::SharedRefBase::make<TunerHidlTimeFilter>(filterSp);
138*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
139*ec779b8eSAndroid Build Coastguard Worker }
140*ec779b8eSAndroid Build Coastguard Worker 
getAvSyncHwId(const shared_ptr<ITunerFilter> & tunerFilter,int32_t * _aidl_return)141*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlDemux::getAvSyncHwId(const shared_ptr<ITunerFilter>& tunerFilter,
142*ec779b8eSAndroid Build Coastguard Worker                                                    int32_t* _aidl_return) {
143*ec779b8eSAndroid Build Coastguard Worker     uint32_t avSyncHwId;
144*ec779b8eSAndroid Build Coastguard Worker     HidlResult res;
145*ec779b8eSAndroid Build Coastguard Worker     sp<HidlIFilter> halFilter = static_cast<TunerHidlFilter*>(tunerFilter.get())->getHalFilter();
146*ec779b8eSAndroid Build Coastguard Worker     mDemux->getAvSyncHwId(halFilter, [&](HidlResult r, uint32_t id) {
147*ec779b8eSAndroid Build Coastguard Worker         res = r;
148*ec779b8eSAndroid Build Coastguard Worker         avSyncHwId = id;
149*ec779b8eSAndroid Build Coastguard Worker     });
150*ec779b8eSAndroid Build Coastguard Worker     if (res != HidlResult::SUCCESS) {
151*ec779b8eSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
152*ec779b8eSAndroid Build Coastguard Worker     }
153*ec779b8eSAndroid Build Coastguard Worker 
154*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = (int)avSyncHwId;
155*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
156*ec779b8eSAndroid Build Coastguard Worker }
157*ec779b8eSAndroid Build Coastguard Worker 
getAvSyncTime(int32_t avSyncHwId,int64_t * _aidl_return)158*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlDemux::getAvSyncTime(int32_t avSyncHwId, int64_t* _aidl_return) {
159*ec779b8eSAndroid Build Coastguard Worker     uint64_t time;
160*ec779b8eSAndroid Build Coastguard Worker     HidlResult res;
161*ec779b8eSAndroid Build Coastguard Worker     mDemux->getAvSyncTime(static_cast<uint32_t>(avSyncHwId), [&](HidlResult r, uint64_t ts) {
162*ec779b8eSAndroid Build Coastguard Worker         res = r;
163*ec779b8eSAndroid Build Coastguard Worker         time = ts;
164*ec779b8eSAndroid Build Coastguard Worker     });
165*ec779b8eSAndroid Build Coastguard Worker     if (res != HidlResult::SUCCESS) {
166*ec779b8eSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
167*ec779b8eSAndroid Build Coastguard Worker     }
168*ec779b8eSAndroid Build Coastguard Worker 
169*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = (int64_t)time;
170*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
171*ec779b8eSAndroid Build Coastguard Worker }
172*ec779b8eSAndroid Build Coastguard Worker 
openDvr(DvrType in_dvbType,int32_t in_bufferSize,const shared_ptr<ITunerDvrCallback> & in_cb,shared_ptr<ITunerDvr> * _aidl_return)173*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlDemux::openDvr(DvrType in_dvbType, int32_t in_bufferSize,
174*ec779b8eSAndroid Build Coastguard Worker                                              const shared_ptr<ITunerDvrCallback>& in_cb,
175*ec779b8eSAndroid Build Coastguard Worker                                              shared_ptr<ITunerDvr>* _aidl_return) {
176*ec779b8eSAndroid Build Coastguard Worker     HidlResult res;
177*ec779b8eSAndroid Build Coastguard Worker     sp<HidlIDvrCallback> callback = new TunerHidlDvr::DvrCallback(in_cb);
178*ec779b8eSAndroid Build Coastguard Worker     sp<HidlIDvr> hidlDvr;
179*ec779b8eSAndroid Build Coastguard Worker     mDemux->openDvr(static_cast<HidlDvrType>(in_dvbType), in_bufferSize, callback,
180*ec779b8eSAndroid Build Coastguard Worker                     [&](HidlResult r, const sp<HidlIDvr>& dvr) {
181*ec779b8eSAndroid Build Coastguard Worker                         hidlDvr = dvr;
182*ec779b8eSAndroid Build Coastguard Worker                         res = r;
183*ec779b8eSAndroid Build Coastguard Worker                     });
184*ec779b8eSAndroid Build Coastguard Worker     if (res != HidlResult::SUCCESS) {
185*ec779b8eSAndroid Build Coastguard Worker         *_aidl_return = nullptr;
186*ec779b8eSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
187*ec779b8eSAndroid Build Coastguard Worker     }
188*ec779b8eSAndroid Build Coastguard Worker 
189*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = ::ndk::SharedRefBase::make<TunerHidlDvr>(hidlDvr, in_dvbType);
190*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
191*ec779b8eSAndroid Build Coastguard Worker }
192*ec779b8eSAndroid Build Coastguard Worker 
connectCiCam(int32_t ciCamId)193*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlDemux::connectCiCam(int32_t ciCamId) {
194*ec779b8eSAndroid Build Coastguard Worker     HidlResult res = mDemux->connectCiCam(static_cast<uint32_t>(ciCamId));
195*ec779b8eSAndroid Build Coastguard Worker     if (res != HidlResult::SUCCESS) {
196*ec779b8eSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
197*ec779b8eSAndroid Build Coastguard Worker     }
198*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
199*ec779b8eSAndroid Build Coastguard Worker }
200*ec779b8eSAndroid Build Coastguard Worker 
disconnectCiCam()201*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlDemux::disconnectCiCam() {
202*ec779b8eSAndroid Build Coastguard Worker     HidlResult res = mDemux->disconnectCiCam();
203*ec779b8eSAndroid Build Coastguard Worker     if (res != HidlResult::SUCCESS) {
204*ec779b8eSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
205*ec779b8eSAndroid Build Coastguard Worker     }
206*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
207*ec779b8eSAndroid Build Coastguard Worker }
208*ec779b8eSAndroid Build Coastguard Worker 
close()209*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlDemux::close() {
210*ec779b8eSAndroid Build Coastguard Worker     HidlResult res = mDemux->close();
211*ec779b8eSAndroid Build Coastguard Worker     if (res != HidlResult::SUCCESS) {
212*ec779b8eSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
213*ec779b8eSAndroid Build Coastguard Worker     }
214*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
215*ec779b8eSAndroid Build Coastguard Worker }
216*ec779b8eSAndroid Build Coastguard Worker 
217*ec779b8eSAndroid Build Coastguard Worker }  // namespace tuner
218*ec779b8eSAndroid Build Coastguard Worker }  // namespace tv
219*ec779b8eSAndroid Build Coastguard Worker }  // namespace media
220*ec779b8eSAndroid Build Coastguard Worker }  // namespace android
221*ec779b8eSAndroid Build Coastguard Worker }  // namespace aidl
222