blob: 99032adf8a202d1d0c0d7ec797b1d1a81eab85a6 [file] [log] [blame]
shubangae56a2e2021-01-21 07:29:55 -08001/**
2 * Copyright 2021, 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
17#define LOG_TAG "TunerDemux"
18
Amy Zhangada92d72021-01-22 16:45:53 -080019#include "TunerDvr.h"
shubangae56a2e2021-01-21 07:29:55 -080020#include "TunerDemux.h"
Amy Zhang07428dc2021-02-04 15:58:02 -080021#include "TunerTimeFilter.h"
shubangae56a2e2021-01-21 07:29:55 -080022
23using ::android::hardware::tv::tuner::V1_0::DemuxAlpFilterType;
24using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType;
25using ::android::hardware::tv::tuner::V1_0::DemuxFilterType;
26using ::android::hardware::tv::tuner::V1_0::DemuxIpFilterType;
27using ::android::hardware::tv::tuner::V1_0::DemuxMmtpFilterType;
28using ::android::hardware::tv::tuner::V1_0::DemuxTlvFilterType;
29using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterType;
Amy Zhangada92d72021-01-22 16:45:53 -080030using ::android::hardware::tv::tuner::V1_0::DvrType;
shubangae56a2e2021-01-21 07:29:55 -080031using ::android::hardware::tv::tuner::V1_0::Result;
32
33namespace android {
34
35TunerDemux::TunerDemux(sp<IDemux> demux, int id) {
36 mDemux = demux;
37 mDemuxId = id;
38}
39
40TunerDemux::~TunerDemux() {
41 mDemux = nullptr;
42}
43
44Status TunerDemux::setFrontendDataSource(const std::shared_ptr<ITunerFrontend>& frontend) {
45 if (mDemux == nullptr) {
46 ALOGE("IDemux is not initialized");
47 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
48 }
49
50 int frontendId;
51 frontend->getFrontendId(&frontendId);
52 Result res = mDemux->setFrontendDataSource(frontendId);
53 if (res != Result::SUCCESS) {
54 return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
55 }
56 return Status::ok();
57}
58
Kensuke Miyagi83f407b2021-07-30 17:38:06 -070059Status TunerDemux::setFrontendDataSourceById(int frontendId) {
60 if (mDemux == nullptr) {
61 ALOGE("IDemux is not initialized");
62 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
63 }
64
65 Result res = mDemux->setFrontendDataSource(frontendId);
66 if (res != Result::SUCCESS) {
67 return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
68 }
69 return Status::ok();
70}
71
shubangae56a2e2021-01-21 07:29:55 -080072Status TunerDemux::openFilter(
73 int type, int subType, int bufferSize, const std::shared_ptr<ITunerFilterCallback>& cb,
74 std::shared_ptr<ITunerFilter>* _aidl_return) {
75 if (mDemux == nullptr) {
76 ALOGE("IDemux is not initialized.");
77 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
78 }
79
80 DemuxFilterMainType mainType = static_cast<DemuxFilterMainType>(type);
81 DemuxFilterType filterType {
82 .mainType = mainType,
83 };
84
85 switch(mainType) {
86 case DemuxFilterMainType::TS:
87 filterType.subType.tsFilterType(static_cast<DemuxTsFilterType>(subType));
88 break;
89 case DemuxFilterMainType::MMTP:
90 filterType.subType.mmtpFilterType(static_cast<DemuxMmtpFilterType>(subType));
91 break;
92 case DemuxFilterMainType::IP:
93 filterType.subType.ipFilterType(static_cast<DemuxIpFilterType>(subType));
94 break;
95 case DemuxFilterMainType::TLV:
96 filterType.subType.tlvFilterType(static_cast<DemuxTlvFilterType>(subType));
97 break;
98 case DemuxFilterMainType::ALP:
99 filterType.subType.alpFilterType(static_cast<DemuxAlpFilterType>(subType));
100 break;
101 }
102 Result status;
103 sp<IFilter> filterSp;
104 sp<IFilterCallback> cbSp = new TunerFilter::FilterCallback(cb);
105 mDemux->openFilter(filterType, bufferSize, cbSp,
106 [&](Result r, const sp<IFilter>& filter) {
107 filterSp = filter;
108 status = r;
109 });
110 if (status != Result::SUCCESS) {
111 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
112 }
113
Amy Zhang957e0442021-02-22 13:57:11 -0800114 *_aidl_return = ::ndk::SharedRefBase::make<TunerFilter>(filterSp, type, subType);
shubangae56a2e2021-01-21 07:29:55 -0800115 return Status::ok();
116}
117
Amy Zhang07428dc2021-02-04 15:58:02 -0800118Status TunerDemux::openTimeFilter(shared_ptr<ITunerTimeFilter>* _aidl_return) {
119 if (mDemux == nullptr) {
120 ALOGE("IDemux is not initialized.");
121 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
122 }
123
124 Result status;
125 sp<ITimeFilter> filterSp;
126 mDemux->openTimeFilter([&](Result r, const sp<ITimeFilter>& filter) {
127 filterSp = filter;
128 status = r;
129 });
130 if (status != Result::SUCCESS) {
131 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
132 }
133
134 *_aidl_return = ::ndk::SharedRefBase::make<TunerTimeFilter>(filterSp);
135 return Status::ok();
136}
137
138Status TunerDemux::getAvSyncHwId(const shared_ptr<ITunerFilter>& tunerFilter, int* _aidl_return) {
139 if (mDemux == nullptr) {
140 ALOGE("IDemux is not initialized.");
141 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
142 }
143
144 uint32_t avSyncHwId;
145 Result res;
146 sp<IFilter> halFilter = static_cast<TunerFilter*>(tunerFilter.get())->getHalFilter();
147 mDemux->getAvSyncHwId(halFilter,
148 [&](Result r, uint32_t id) {
149 res = r;
150 avSyncHwId = id;
151 });
152 if (res != Result::SUCCESS) {
153 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
154 }
155
156 *_aidl_return = (int)avSyncHwId;
157 return Status::ok();
158}
159
160Status TunerDemux::getAvSyncTime(int avSyncHwId, int64_t* _aidl_return) {
161 if (mDemux == nullptr) {
162 ALOGE("IDemux is not initialized.");
163 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
164 }
165
166 uint64_t time;
167 Result res;
168 mDemux->getAvSyncTime(static_cast<uint32_t>(avSyncHwId),
169 [&](Result r, uint64_t ts) {
170 res = r;
171 time = ts;
172 });
173 if (res != Result::SUCCESS) {
174 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
175 }
176
177 *_aidl_return = (int64_t)time;
178 return Status::ok();
179}
180
Amy Zhangada92d72021-01-22 16:45:53 -0800181Status TunerDemux::openDvr(int dvrType, int bufferSize, const shared_ptr<ITunerDvrCallback>& cb,
182 shared_ptr<ITunerDvr>* _aidl_return) {
183 if (mDemux == nullptr) {
184 ALOGE("IDemux is not initialized.");
185 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
186 }
187
188 Result res;
189 sp<IDvrCallback> callback = new TunerDvr::DvrCallback(cb);
190 sp<IDvr> hidlDvr;
191 mDemux->openDvr(static_cast<DvrType>(dvrType), bufferSize, callback,
192 [&](Result r, const sp<IDvr>& dvr) {
193 hidlDvr = dvr;
194 res = r;
195 });
196 if (res != Result::SUCCESS) {
197 *_aidl_return = NULL;
198 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
199 }
200
201 *_aidl_return = ::ndk::SharedRefBase::make<TunerDvr>(hidlDvr, dvrType);
202 return Status::ok();
203}
Amy Zhangeb292c12021-01-26 16:28:19 -0800204
Amy Zhang07428dc2021-02-04 15:58:02 -0800205Status TunerDemux::connectCiCam(int ciCamId) {
206 if (mDemux == nullptr) {
207 ALOGE("IDemux is not initialized.");
208 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
209 }
210
211 Result res = mDemux->connectCiCam(static_cast<uint32_t>(ciCamId));
212 if (res != Result::SUCCESS) {
213 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
214 }
215 return Status::ok();
216}
217
218Status TunerDemux::disconnectCiCam() {
219 if (mDemux == nullptr) {
220 ALOGE("IDemux is not initialized.");
221 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
222 }
223
224 Result res = mDemux->disconnectCiCam();
225 if (res != Result::SUCCESS) {
226 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
227 }
228 return Status::ok();
229}
230
Amy Zhangeb292c12021-01-26 16:28:19 -0800231Status TunerDemux::close() {
232 if (mDemux == nullptr) {
233 ALOGE("IDemux is not initialized.");
234 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
235 }
236
237 Result res = mDemux->close();
Amy Zhang14a60e82021-02-11 15:22:52 -0800238 mDemux = NULL;
239
Amy Zhangeb292c12021-01-26 16:28:19 -0800240 if (res != Result::SUCCESS) {
241 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
242 }
243 return Status::ok();
244}
shubangae56a2e2021-01-21 07:29:55 -0800245} // namespace android