blob: 1a2f8c065bd38a922d2459116d8ad8c02e5e8e70 [file] [log] [blame]
Amy Zhang6bfeaa02020-11-30 15:16:39 -08001/*
2 * Copyright 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
Amy Zhang9a9ed602020-12-07 16:37:33 -080017#define LOG_TAG "DemuxClient"
Amy Zhang6bfeaa02020-11-30 15:16:39 -080018
19#include <android-base/logging.h>
20#include <utils/Log.h>
21
22#include "DemuxClient.h"
23
24using ::aidl::android::media::tv::tuner::TunerFrontendSettings;
25
Amy Zhang4a07e802021-01-21 17:10:21 -080026using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType;
Amy Zhang6bfeaa02020-11-30 15:16:39 -080027using ::android::hardware::tv::tuner::V1_0::Result;
28
29namespace android {
30
31/////////////// DemuxClient ///////////////////////
32
Amy Zhang4a07e802021-01-21 17:10:21 -080033DemuxClient::DemuxClient(shared_ptr<ITunerDemux> tunerDemux) {
34 mTunerDemux = tunerDemux;
Amy Zhang921fd432021-01-07 13:18:27 -080035 mId = -1;
Amy Zhang6bfeaa02020-11-30 15:16:39 -080036}
37
38DemuxClient::~DemuxClient() {
Amy Zhang4a07e802021-01-21 17:10:21 -080039 mTunerDemux = NULL;
Amy Zhang6bfeaa02020-11-30 15:16:39 -080040 mDemux = NULL;
Amy Zhang921fd432021-01-07 13:18:27 -080041 mId = -1;
Amy Zhang6bfeaa02020-11-30 15:16:39 -080042}
43
44// TODO: remove after migration to Tuner Service is done.
45void DemuxClient::setHidlDemux(sp<IDemux> demux) {
46 mDemux = demux;
47}
48
Amy Zhangb74185b2020-12-07 16:37:33 -080049Result DemuxClient::setFrontendDataSource(sp<FrontendClient> frontendClient) {
Amy Zhang4a07e802021-01-21 17:10:21 -080050 if (mTunerDemux != NULL) {
51 Status s = mTunerDemux->setFrontendDataSource(frontendClient->getAidlFrontend());
52 return ClientHelper::getServiceSpecificErrorCode(s);
53 }
Amy Zhang6bfeaa02020-11-30 15:16:39 -080054
55 if (mDemux != NULL) {
Amy Zhangb74185b2020-12-07 16:37:33 -080056 Result res = mDemux->setFrontendDataSource(frontendClient->getId());
Amy Zhang6bfeaa02020-11-30 15:16:39 -080057 return res;
58 }
59
60 return Result::INVALID_STATE;
61}
62
Amy Zhangb74185b2020-12-07 16:37:33 -080063sp<FilterClient> DemuxClient::openFilter(DemuxFilterType type, int bufferSize,
64 sp<FilterClientCallback> cb) {
Amy Zhang4a07e802021-01-21 17:10:21 -080065 if (mTunerDemux != NULL) {
66 shared_ptr<ITunerFilter> tunerFilter;
67 shared_ptr<TunerFilterCallback> callback =
68 ::ndk::SharedRefBase::make<TunerFilterCallback>(cb);
69 Status s = mTunerDemux->openFilter((int)type.mainType, getSubType(type),
70 bufferSize, callback, &tunerFilter);
71 if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
72 return NULL;
73 }
74 return new FilterClient(type, tunerFilter);
75 }
Amy Zhang6bfeaa02020-11-30 15:16:39 -080076
Amy Zhangb74185b2020-12-07 16:37:33 -080077 if (mDemux != NULL) {
78 sp<HidlFilterCallback> callback = new HidlFilterCallback(cb);
79 sp<IFilter> hidlFilter = openHidlFilter(type, bufferSize, callback);
80 if (hidlFilter != NULL) {
Amy Zhang4a07e802021-01-21 17:10:21 -080081 sp<FilterClient> filterClient = new FilterClient(type, NULL);
Amy Zhangb74185b2020-12-07 16:37:33 -080082 filterClient->setHidlFilter(hidlFilter);
83 return filterClient;
84 }
85 }
86
Amy Zhangb74185b2020-12-07 16:37:33 -080087 return NULL;
88}
89
Amy Zhang90a50b42021-01-11 16:58:59 -080090sp<TimeFilterClient> DemuxClient::openTimeFilter() {
91 // TODO: pending aidl interface
92
93 if (mDemux != NULL) {
94 sp<ITimeFilter> hidlTimeFilter = openHidlTimeFilter();
95 if (hidlTimeFilter != NULL) {
96 sp<TimeFilterClient> timeFilterClient = new TimeFilterClient();
97 timeFilterClient->setHidlTimeFilter(hidlTimeFilter);
98 return timeFilterClient;
99 }
100 }
101
102 return NULL;
103}
104
Amy Zhangb74185b2020-12-07 16:37:33 -0800105int DemuxClient::getAvSyncHwId(sp<FilterClient> filterClient) {
106 // pending aidl interface
107
108 if (mDemux != NULL) {
109 uint32_t avSyncHwId;
110 Result res;
111 sp<IFilter> halFilter = filterClient->getHalFilter();
112 mDemux->getAvSyncHwId(halFilter,
113 [&](Result r, uint32_t id) {
114 res = r;
115 avSyncHwId = id;
116 });
117 if (res == Result::SUCCESS) {
118 return (int) avSyncHwId;
119 }
120 }
121
122 return -1;
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800123}
124
125long DemuxClient::getAvSyncTime(int avSyncHwId) {
126 // pending aidl interface
127
128 if (mDemux != NULL) {
129 uint64_t time;
130 Result res;
131 mDemux->getAvSyncTime(static_cast<uint32_t>(avSyncHwId),
132 [&](Result r, uint64_t ts) {
133 res = r;
134 time = ts;
135 });
136 if (res == Result::SUCCESS) {
137 return (long) time;
138 }
139 }
140
141 return -1;
142}
143
Amy Zhang9a9ed602020-12-07 16:37:33 -0800144sp<DvrClient> DemuxClient::openDvr(DvrType dvbType, int bufferSize, sp<DvrClientCallback> cb) {
Amy Zhangb5809be2021-01-26 16:27:23 -0800145 if (mTunerDemux != NULL) {
146 shared_ptr<ITunerDvr> tunerDvr;
147 shared_ptr<TunerDvrCallback> callback =
148 ::ndk::SharedRefBase::make<TunerDvrCallback>(cb);
149 Status s = mTunerDemux->openDvr((int)dvbType, bufferSize, callback, &tunerDvr);
150 if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
151 return NULL;
152 }
153 return new DvrClient(tunerDvr);
154 }
Amy Zhang9a9ed602020-12-07 16:37:33 -0800155
156 if (mDemux != NULL) {
157 sp<HidlDvrCallback> callback = new HidlDvrCallback(cb);
158 sp<IDvr> hidlDvr = openHidlDvr(dvbType, bufferSize, callback);
159 if (hidlDvr != NULL) {
Amy Zhang2d7026b2021-01-22 18:07:51 -0800160 sp<DvrClient> dvrClient = new DvrClient(NULL);
Amy Zhang9a9ed602020-12-07 16:37:33 -0800161 dvrClient->setHidlDvr(hidlDvr);
162 return dvrClient;
163 }
164 }
165
166 return NULL;
167}
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800168
169Result DemuxClient::connectCiCam(int ciCamId) {
170 // pending aidl interface
171
172 if (mDemux != NULL) {
173 return mDemux->connectCiCam(static_cast<uint32_t>(ciCamId));
174 }
175
176 return Result::INVALID_STATE;
177}
178
179Result DemuxClient::disconnectCiCam() {
180 // pending aidl interface
181
182 if (mDemux != NULL) {
183 return mDemux->disconnectCiCam();
184 }
185
186 return Result::INVALID_STATE;
187}
188
189Result DemuxClient::close() {
Amy Zhangb5809be2021-01-26 16:27:23 -0800190 if (mTunerDemux != NULL) {
191 Status s = mTunerDemux->close();
192 return ClientHelper::getServiceSpecificErrorCode(s);
193 }
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800194
195 if (mDemux != NULL) {
196 Result res = mDemux->close();
197 if (res == Result::SUCCESS) {
198 mDemux = NULL;
199 }
200 return res;
201 }
202
203 return Result::INVALID_STATE;
204}
Amy Zhangb74185b2020-12-07 16:37:33 -0800205
206/////////////// DemuxClient Helper Methods ///////////////////////
207
208sp<IFilter> DemuxClient::openHidlFilter(DemuxFilterType type, int bufferSize,
209 sp<HidlFilterCallback> callback) {
210 if (mDemux == NULL) {
211 return NULL;
212 }
213
214 sp<IFilter> hidlFilter;
215 Result res;
216 mDemux->openFilter(type, bufferSize, callback,
217 [&](Result r, const sp<IFilter>& filter) {
218 hidlFilter = filter;
219 res = r;
220 });
221 if (res != Result::SUCCESS || hidlFilter == NULL) {
222 return NULL;
223 }
224
225 return hidlFilter;
226}
Amy Zhang9a9ed602020-12-07 16:37:33 -0800227
Amy Zhang90a50b42021-01-11 16:58:59 -0800228sp<ITimeFilter> DemuxClient::openHidlTimeFilter() {
229 if (mDemux == NULL) {
230 return NULL;
231 }
232
233 sp<ITimeFilter> timeFilter;
234 Result res;
235 mDemux->openTimeFilter(
236 [&](Result r, const sp<ITimeFilter>& timeFilterSp) {
237 timeFilter = timeFilterSp;
238 res = r;
239 });
240
241 if (res != Result::SUCCESS || timeFilter == NULL) {
242 return NULL;
243 }
244
245 return timeFilter;
246}
247
Amy Zhang9a9ed602020-12-07 16:37:33 -0800248sp<IDvr> DemuxClient::openHidlDvr(DvrType dvrType, int bufferSize,
249 sp<HidlDvrCallback> callback) {
250 if (mDemux == NULL) {
251 return NULL;
252 }
253
254 sp<IDvr> hidlDvr;
255 Result res;
256 mDemux->openDvr(dvrType, bufferSize, callback,
257 [&](Result r, const sp<IDvr>& dvr) {
258 hidlDvr = dvr;
259 res = r;
260 });
261 if (res != Result::SUCCESS || hidlDvr == NULL) {
262 return NULL;
263 }
264
265 return hidlDvr;
266}
Amy Zhang4a07e802021-01-21 17:10:21 -0800267
268int DemuxClient::getSubType(DemuxFilterType filterType) {
269 switch (filterType.mainType) {
270 case DemuxFilterMainType::TS:
271 return (int)filterType.subType.tsFilterType();
272 case DemuxFilterMainType::MMTP:
273 return (int)filterType.subType.mmtpFilterType();
274 case DemuxFilterMainType::IP:
275 return (int)filterType.subType.ipFilterType();
276 case DemuxFilterMainType::TLV:
277 return (int)filterType.subType.tlvFilterType();
278 case DemuxFilterMainType::ALP:
279 return (int)filterType.subType.alpFilterType();
280 default:
281 return -1;
282 }
283}
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800284} // namespace android