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