blob: e290c60db8ce67b7e1df47bf482532170f4818d3 [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) {
145 // TODO: pending aidl interface
146
147 if (mDemux != NULL) {
148 sp<HidlDvrCallback> callback = new HidlDvrCallback(cb);
149 sp<IDvr> hidlDvr = openHidlDvr(dvbType, bufferSize, callback);
150 if (hidlDvr != NULL) {
Amy Zhang2d7026b2021-01-22 18:07:51 -0800151 sp<DvrClient> dvrClient = new DvrClient(NULL);
Amy Zhang9a9ed602020-12-07 16:37:33 -0800152 dvrClient->setHidlDvr(hidlDvr);
153 return dvrClient;
154 }
155 }
156
157 return NULL;
158}
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800159
160Result DemuxClient::connectCiCam(int ciCamId) {
161 // pending aidl interface
162
163 if (mDemux != NULL) {
164 return mDemux->connectCiCam(static_cast<uint32_t>(ciCamId));
165 }
166
167 return Result::INVALID_STATE;
168}
169
170Result DemuxClient::disconnectCiCam() {
171 // pending aidl interface
172
173 if (mDemux != NULL) {
174 return mDemux->disconnectCiCam();
175 }
176
177 return Result::INVALID_STATE;
178}
179
180Result DemuxClient::close() {
Amy Zhang9b5831b2020-12-09 21:13:58 -0800181 // TODO: pending aidl interface
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800182
183 if (mDemux != NULL) {
184 Result res = mDemux->close();
185 if (res == Result::SUCCESS) {
186 mDemux = NULL;
187 }
188 return res;
189 }
190
191 return Result::INVALID_STATE;
192}
Amy Zhangb74185b2020-12-07 16:37:33 -0800193
194/////////////// DemuxClient Helper Methods ///////////////////////
195
196sp<IFilter> DemuxClient::openHidlFilter(DemuxFilterType type, int bufferSize,
197 sp<HidlFilterCallback> callback) {
198 if (mDemux == NULL) {
199 return NULL;
200 }
201
202 sp<IFilter> hidlFilter;
203 Result res;
204 mDemux->openFilter(type, bufferSize, callback,
205 [&](Result r, const sp<IFilter>& filter) {
206 hidlFilter = filter;
207 res = r;
208 });
209 if (res != Result::SUCCESS || hidlFilter == NULL) {
210 return NULL;
211 }
212
213 return hidlFilter;
214}
Amy Zhang9a9ed602020-12-07 16:37:33 -0800215
Amy Zhang90a50b42021-01-11 16:58:59 -0800216sp<ITimeFilter> DemuxClient::openHidlTimeFilter() {
217 if (mDemux == NULL) {
218 return NULL;
219 }
220
221 sp<ITimeFilter> timeFilter;
222 Result res;
223 mDemux->openTimeFilter(
224 [&](Result r, const sp<ITimeFilter>& timeFilterSp) {
225 timeFilter = timeFilterSp;
226 res = r;
227 });
228
229 if (res != Result::SUCCESS || timeFilter == NULL) {
230 return NULL;
231 }
232
233 return timeFilter;
234}
235
Amy Zhang9a9ed602020-12-07 16:37:33 -0800236sp<IDvr> DemuxClient::openHidlDvr(DvrType dvrType, int bufferSize,
237 sp<HidlDvrCallback> callback) {
238 if (mDemux == NULL) {
239 return NULL;
240 }
241
242 sp<IDvr> hidlDvr;
243 Result res;
244 mDemux->openDvr(dvrType, bufferSize, callback,
245 [&](Result r, const sp<IDvr>& dvr) {
246 hidlDvr = dvr;
247 res = r;
248 });
249 if (res != Result::SUCCESS || hidlDvr == NULL) {
250 return NULL;
251 }
252
253 return hidlDvr;
254}
Amy Zhang4a07e802021-01-21 17:10:21 -0800255
256int DemuxClient::getSubType(DemuxFilterType filterType) {
257 switch (filterType.mainType) {
258 case DemuxFilterMainType::TS:
259 return (int)filterType.subType.tsFilterType();
260 case DemuxFilterMainType::MMTP:
261 return (int)filterType.subType.mmtpFilterType();
262 case DemuxFilterMainType::IP:
263 return (int)filterType.subType.ipFilterType();
264 case DemuxFilterMainType::TLV:
265 return (int)filterType.subType.tlvFilterType();
266 case DemuxFilterMainType::ALP:
267 return (int)filterType.subType.alpFilterType();
268 default:
269 return -1;
270 }
271}
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800272} // namespace android