xref: /aosp_15_r20/frameworks/base/media/jni/tuner/DemuxClient.cpp (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright 2021 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker  *
4*d57664e9SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker  *
8*d57664e9SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker  *
10*d57664e9SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker  * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker  */
16*d57664e9SAndroid Build Coastguard Worker 
17*d57664e9SAndroid Build Coastguard Worker #define LOG_TAG "DemuxClient"
18*d57664e9SAndroid Build Coastguard Worker 
19*d57664e9SAndroid Build Coastguard Worker #include "DemuxClient.h"
20*d57664e9SAndroid Build Coastguard Worker 
21*d57664e9SAndroid Build Coastguard Worker #include <aidl/android/hardware/tv/tuner/Constant.h>
22*d57664e9SAndroid Build Coastguard Worker #include <aidl/android/hardware/tv/tuner/Constant64Bit.h>
23*d57664e9SAndroid Build Coastguard Worker #include <android-base/logging.h>
24*d57664e9SAndroid Build Coastguard Worker #include <utils/Log.h>
25*d57664e9SAndroid Build Coastguard Worker 
26*d57664e9SAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::Constant;
27*d57664e9SAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::Constant64Bit;
28*d57664e9SAndroid Build Coastguard Worker 
29*d57664e9SAndroid Build Coastguard Worker namespace android {
30*d57664e9SAndroid Build Coastguard Worker /////////////// DemuxClient ///////////////////////
DemuxClient(shared_ptr<ITunerDemux> tunerDemux)31*d57664e9SAndroid Build Coastguard Worker DemuxClient::DemuxClient(shared_ptr<ITunerDemux> tunerDemux) {
32*d57664e9SAndroid Build Coastguard Worker     mTunerDemux = tunerDemux;
33*d57664e9SAndroid Build Coastguard Worker }
34*d57664e9SAndroid Build Coastguard Worker 
~DemuxClient()35*d57664e9SAndroid Build Coastguard Worker DemuxClient::~DemuxClient() {
36*d57664e9SAndroid Build Coastguard Worker     mTunerDemux = nullptr;
37*d57664e9SAndroid Build Coastguard Worker }
38*d57664e9SAndroid Build Coastguard Worker 
setFrontendDataSource(sp<FrontendClient> frontendClient)39*d57664e9SAndroid Build Coastguard Worker Result DemuxClient::setFrontendDataSource(sp<FrontendClient> frontendClient) {
40*d57664e9SAndroid Build Coastguard Worker     if (frontendClient == nullptr) {
41*d57664e9SAndroid Build Coastguard Worker         return Result::INVALID_ARGUMENT;
42*d57664e9SAndroid Build Coastguard Worker     }
43*d57664e9SAndroid Build Coastguard Worker 
44*d57664e9SAndroid Build Coastguard Worker     if (mTunerDemux != nullptr) {
45*d57664e9SAndroid Build Coastguard Worker         Status s = mTunerDemux->setFrontendDataSource(frontendClient->getAidlFrontend());
46*d57664e9SAndroid Build Coastguard Worker         return ClientHelper::getServiceSpecificErrorCode(s);
47*d57664e9SAndroid Build Coastguard Worker     }
48*d57664e9SAndroid Build Coastguard Worker 
49*d57664e9SAndroid Build Coastguard Worker     return Result::INVALID_STATE;
50*d57664e9SAndroid Build Coastguard Worker }
51*d57664e9SAndroid Build Coastguard Worker 
setFrontendDataSourceById(int frontendId)52*d57664e9SAndroid Build Coastguard Worker Result DemuxClient::setFrontendDataSourceById(int frontendId) {
53*d57664e9SAndroid Build Coastguard Worker     if (mTunerDemux != nullptr) {
54*d57664e9SAndroid Build Coastguard Worker         Status s = mTunerDemux->setFrontendDataSourceById(frontendId);
55*d57664e9SAndroid Build Coastguard Worker         return ClientHelper::getServiceSpecificErrorCode(s);
56*d57664e9SAndroid Build Coastguard Worker     }
57*d57664e9SAndroid Build Coastguard Worker 
58*d57664e9SAndroid Build Coastguard Worker     return Result::INVALID_STATE;
59*d57664e9SAndroid Build Coastguard Worker }
60*d57664e9SAndroid Build Coastguard Worker 
openFilter(const DemuxFilterType & type,int32_t bufferSize,sp<FilterClientCallback> cb)61*d57664e9SAndroid Build Coastguard Worker sp<FilterClient> DemuxClient::openFilter(const DemuxFilterType& type, int32_t bufferSize,
62*d57664e9SAndroid Build Coastguard Worker                                          sp<FilterClientCallback> cb) {
63*d57664e9SAndroid Build Coastguard Worker     if (cb == nullptr) {
64*d57664e9SAndroid Build Coastguard Worker         return nullptr;
65*d57664e9SAndroid Build Coastguard Worker     }
66*d57664e9SAndroid Build Coastguard Worker 
67*d57664e9SAndroid Build Coastguard Worker     if (mTunerDemux != nullptr) {
68*d57664e9SAndroid Build Coastguard Worker         shared_ptr<ITunerFilter> tunerFilter;
69*d57664e9SAndroid Build Coastguard Worker         shared_ptr<TunerFilterCallback> callback =
70*d57664e9SAndroid Build Coastguard Worker                 ::ndk::SharedRefBase::make<TunerFilterCallback>(cb);
71*d57664e9SAndroid Build Coastguard Worker         Status s = mTunerDemux->openFilter(type, bufferSize, callback, &tunerFilter);
72*d57664e9SAndroid Build Coastguard Worker         if (!s.isOk()) {
73*d57664e9SAndroid Build Coastguard Worker             return nullptr;
74*d57664e9SAndroid Build Coastguard Worker         }
75*d57664e9SAndroid Build Coastguard Worker         return new FilterClient(type, tunerFilter);
76*d57664e9SAndroid Build Coastguard Worker     }
77*d57664e9SAndroid Build Coastguard Worker 
78*d57664e9SAndroid Build Coastguard Worker     return nullptr;
79*d57664e9SAndroid Build Coastguard Worker }
80*d57664e9SAndroid Build Coastguard Worker 
openTimeFilter()81*d57664e9SAndroid Build Coastguard Worker sp<TimeFilterClient> DemuxClient::openTimeFilter() {
82*d57664e9SAndroid Build Coastguard Worker     if (mTunerDemux != nullptr) {
83*d57664e9SAndroid Build Coastguard Worker         shared_ptr<ITunerTimeFilter> tunerTimeFilter;
84*d57664e9SAndroid Build Coastguard Worker         Status s = mTunerDemux->openTimeFilter(&tunerTimeFilter);
85*d57664e9SAndroid Build Coastguard Worker         if (!s.isOk()) {
86*d57664e9SAndroid Build Coastguard Worker             return nullptr;
87*d57664e9SAndroid Build Coastguard Worker         }
88*d57664e9SAndroid Build Coastguard Worker         return new TimeFilterClient(tunerTimeFilter);
89*d57664e9SAndroid Build Coastguard Worker     }
90*d57664e9SAndroid Build Coastguard Worker 
91*d57664e9SAndroid Build Coastguard Worker     return nullptr;
92*d57664e9SAndroid Build Coastguard Worker }
93*d57664e9SAndroid Build Coastguard Worker 
getAvSyncHwId(sp<FilterClient> filterClient)94*d57664e9SAndroid Build Coastguard Worker int32_t DemuxClient::getAvSyncHwId(sp<FilterClient> filterClient) {
95*d57664e9SAndroid Build Coastguard Worker     if (filterClient == nullptr) {
96*d57664e9SAndroid Build Coastguard Worker         return static_cast<int32_t>(Constant::INVALID_AV_SYNC_ID);
97*d57664e9SAndroid Build Coastguard Worker     }
98*d57664e9SAndroid Build Coastguard Worker 
99*d57664e9SAndroid Build Coastguard Worker     if (mTunerDemux != nullptr) {
100*d57664e9SAndroid Build Coastguard Worker         int32_t hwId;
101*d57664e9SAndroid Build Coastguard Worker         Status s = mTunerDemux->getAvSyncHwId(filterClient->getAidlFilter(), &hwId);
102*d57664e9SAndroid Build Coastguard Worker         if (!s.isOk()) {
103*d57664e9SAndroid Build Coastguard Worker             return static_cast<int32_t>(Constant::INVALID_AV_SYNC_ID);
104*d57664e9SAndroid Build Coastguard Worker         }
105*d57664e9SAndroid Build Coastguard Worker         return hwId;
106*d57664e9SAndroid Build Coastguard Worker     }
107*d57664e9SAndroid Build Coastguard Worker 
108*d57664e9SAndroid Build Coastguard Worker     return static_cast<int32_t>(Constant::INVALID_AV_SYNC_ID);
109*d57664e9SAndroid Build Coastguard Worker }
110*d57664e9SAndroid Build Coastguard Worker 
getAvSyncTime(int32_t avSyncHwId)111*d57664e9SAndroid Build Coastguard Worker int64_t DemuxClient::getAvSyncTime(int32_t avSyncHwId) {
112*d57664e9SAndroid Build Coastguard Worker     if (mTunerDemux != nullptr) {
113*d57664e9SAndroid Build Coastguard Worker         int64_t time;
114*d57664e9SAndroid Build Coastguard Worker         Status s = mTunerDemux->getAvSyncTime(avSyncHwId, &time);
115*d57664e9SAndroid Build Coastguard Worker         if (!s.isOk()) {
116*d57664e9SAndroid Build Coastguard Worker             return static_cast<int64_t>(Constant64Bit::INVALID_PRESENTATION_TIME_STAMP);
117*d57664e9SAndroid Build Coastguard Worker         }
118*d57664e9SAndroid Build Coastguard Worker         return time;
119*d57664e9SAndroid Build Coastguard Worker     }
120*d57664e9SAndroid Build Coastguard Worker 
121*d57664e9SAndroid Build Coastguard Worker     return static_cast<int64_t>(Constant64Bit::INVALID_PRESENTATION_TIME_STAMP);
122*d57664e9SAndroid Build Coastguard Worker }
123*d57664e9SAndroid Build Coastguard Worker 
openDvr(DvrType dvbType,int32_t bufferSize,sp<DvrClientCallback> cb)124*d57664e9SAndroid Build Coastguard Worker sp<DvrClient> DemuxClient::openDvr(DvrType dvbType, int32_t bufferSize, sp<DvrClientCallback> cb) {
125*d57664e9SAndroid Build Coastguard Worker     if (cb == nullptr) {
126*d57664e9SAndroid Build Coastguard Worker         return nullptr;
127*d57664e9SAndroid Build Coastguard Worker     }
128*d57664e9SAndroid Build Coastguard Worker 
129*d57664e9SAndroid Build Coastguard Worker     if (mTunerDemux != nullptr) {
130*d57664e9SAndroid Build Coastguard Worker         shared_ptr<ITunerDvr> tunerDvr;
131*d57664e9SAndroid Build Coastguard Worker         shared_ptr<TunerDvrCallback> callback =
132*d57664e9SAndroid Build Coastguard Worker                 ::ndk::SharedRefBase::make<TunerDvrCallback>(cb);
133*d57664e9SAndroid Build Coastguard Worker         Status s = mTunerDemux->openDvr(dvbType, bufferSize, callback, &tunerDvr);
134*d57664e9SAndroid Build Coastguard Worker         if (!s.isOk()) {
135*d57664e9SAndroid Build Coastguard Worker             return nullptr;
136*d57664e9SAndroid Build Coastguard Worker         }
137*d57664e9SAndroid Build Coastguard Worker         return new DvrClient(tunerDvr);
138*d57664e9SAndroid Build Coastguard Worker     }
139*d57664e9SAndroid Build Coastguard Worker 
140*d57664e9SAndroid Build Coastguard Worker     return nullptr;
141*d57664e9SAndroid Build Coastguard Worker }
142*d57664e9SAndroid Build Coastguard Worker 
connectCiCam(int32_t ciCamId)143*d57664e9SAndroid Build Coastguard Worker Result DemuxClient::connectCiCam(int32_t ciCamId) {
144*d57664e9SAndroid Build Coastguard Worker     if (mTunerDemux != nullptr) {
145*d57664e9SAndroid Build Coastguard Worker         Status s = mTunerDemux->connectCiCam(ciCamId);
146*d57664e9SAndroid Build Coastguard Worker         return ClientHelper::getServiceSpecificErrorCode(s);
147*d57664e9SAndroid Build Coastguard Worker     }
148*d57664e9SAndroid Build Coastguard Worker 
149*d57664e9SAndroid Build Coastguard Worker     return Result::INVALID_STATE;
150*d57664e9SAndroid Build Coastguard Worker }
151*d57664e9SAndroid Build Coastguard Worker 
disconnectCiCam()152*d57664e9SAndroid Build Coastguard Worker Result DemuxClient::disconnectCiCam() {
153*d57664e9SAndroid Build Coastguard Worker     if (mTunerDemux != nullptr) {
154*d57664e9SAndroid Build Coastguard Worker         Status s = mTunerDemux->disconnectCiCam();
155*d57664e9SAndroid Build Coastguard Worker         return ClientHelper::getServiceSpecificErrorCode(s);
156*d57664e9SAndroid Build Coastguard Worker     }
157*d57664e9SAndroid Build Coastguard Worker 
158*d57664e9SAndroid Build Coastguard Worker     return Result::INVALID_STATE;
159*d57664e9SAndroid Build Coastguard Worker }
160*d57664e9SAndroid Build Coastguard Worker 
close()161*d57664e9SAndroid Build Coastguard Worker Result DemuxClient::close() {
162*d57664e9SAndroid Build Coastguard Worker     if (mTunerDemux != nullptr) {
163*d57664e9SAndroid Build Coastguard Worker         Status s = mTunerDemux->close();
164*d57664e9SAndroid Build Coastguard Worker         mTunerDemux = nullptr;
165*d57664e9SAndroid Build Coastguard Worker         return ClientHelper::getServiceSpecificErrorCode(s);
166*d57664e9SAndroid Build Coastguard Worker     }
167*d57664e9SAndroid Build Coastguard Worker 
168*d57664e9SAndroid Build Coastguard Worker     return Result::INVALID_STATE;
169*d57664e9SAndroid Build Coastguard Worker }
170*d57664e9SAndroid Build Coastguard Worker 
171*d57664e9SAndroid Build Coastguard Worker }  // namespace android
172