1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "dcamera_provider.h"
17 #include "anonymous_string.h"
18 #include "constants.h"
19 #include "dcamera_device.h"
20 #include "dcamera_host.h"
21 #include "distributed_hardware_log.h"
22 #include "dcamera.h"
23
24 namespace OHOS {
25 namespace DistributedHardware {
26 OHOS::sptr<DCameraProvider> DCameraProvider::instance_ = nullptr;
27 DCameraProvider::AutoRelease DCameraProvider::autoRelease_;
28
HdiImplGetInstance(void)29 extern "C" IDCameraProvider *HdiImplGetInstance(void)
30 {
31 return static_cast<IDCameraProvider *>(DCameraProvider::GetInstance().GetRefPtr());
32 }
33
GetInstance()34 OHOS::sptr<DCameraProvider> DCameraProvider::GetInstance()
35 {
36 if (instance_ == nullptr) {
37 instance_ = new DCameraProvider();
38 if (instance_ == nullptr) {
39 DHLOGE("Get distributed camera provider instance failed.");
40 return nullptr;
41 }
42 }
43 return instance_;
44 }
45
EnableDCameraDevice(const DHBase & dhBase,const std::string & abilityInfo,const sptr<IDCameraProviderCallback> & callbackObj)46 int32_t DCameraProvider::EnableDCameraDevice(const DHBase& dhBase, const std::string& abilityInfo,
47 const sptr<IDCameraProviderCallback>& callbackObj)
48 {
49 if (IsDhBaseInfoInvalid(dhBase)) {
50 DHLOGE("DCameraProvider::EnableDCameraDevice, devId or dhId is invalid.");
51 return DCamRetCode::INVALID_ARGUMENT;
52 }
53 DHLOGI("DCameraProvider::EnableDCameraDevice for {devId: %s, dhId: %s, abilityInfo length: %d}.",
54 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str(), abilityInfo.length());
55
56 if (abilityInfo.empty() || abilityInfo.length() > ABILITYINFO_MAX_LENGTH) {
57 DHLOGE("DCameraProvider::EnableDCameraDevice, dcamera ability is empty or over limit.");
58 return DCamRetCode::INVALID_ARGUMENT;
59 }
60 if (callbackObj == nullptr) {
61 DHLOGE("DCameraProvider::EnableDCameraDevice, dcamera provider callback is null.");
62 return DCamRetCode::INVALID_ARGUMENT;
63 }
64
65 OHOS::sptr<DCameraHost> dCameraHost = DCameraHost::GetInstance();
66 if (dCameraHost == nullptr) {
67 DHLOGE("DCameraProvider::EnableDCameraDevice, dcamera host is null.");
68 return DCamRetCode::DEVICE_NOT_INIT;
69 }
70 DCamRetCode ret = dCameraHost->AddDCameraDevice(dhBase, abilityInfo, callbackObj);
71 if (ret != DCamRetCode::SUCCESS) {
72 DHLOGE("DCameraProvider::EnableDCameraDevice failed, ret = %d.", ret);
73 }
74
75 return ret;
76 }
77
DisableDCameraDevice(const DHBase & dhBase)78 int32_t DCameraProvider::DisableDCameraDevice(const DHBase& dhBase)
79 {
80 if (IsDhBaseInfoInvalid(dhBase)) {
81 DHLOGE("DCameraProvider::DisableDCameraDevice, devId or dhId is invalid.");
82 return DCamRetCode::INVALID_ARGUMENT;
83 }
84 DHLOGI("DCameraProvider::DisableDCameraDevice for {devId: %s, dhId: %s}.",
85 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
86
87 OHOS::sptr<DCameraHost> dCameraHost = DCameraHost::GetInstance();
88 if (dCameraHost == nullptr) {
89 DHLOGE("DCameraProvider::DisableDCameraDevice, dcamera host is null.");
90 return DCamRetCode::DEVICE_NOT_INIT;
91 }
92 DCamRetCode ret = dCameraHost->RemoveDCameraDevice(dhBase);
93 if (ret != DCamRetCode::SUCCESS) {
94 DHLOGE("DCameraProvider::DisableDCameraDevice failed, ret = %d.", ret);
95 return ret;
96 }
97
98 return DCamRetCode::SUCCESS;
99 }
100
AcquireBuffer(const DHBase & dhBase,int32_t streamId,DCameraBuffer & buffer)101 int32_t DCameraProvider::AcquireBuffer(const DHBase& dhBase, int32_t streamId, DCameraBuffer& buffer)
102 {
103 if (IsDhBaseInfoInvalid(dhBase)) {
104 DHLOGE("DCameraProvider::AcquireBuffer, devId or dhId is invalid.");
105 return DCamRetCode::INVALID_ARGUMENT;
106 }
107 if (streamId < 0) {
108 DHLOGE("DCameraProvider::AcquireBuffer, input streamId is invalid.");
109 return DCamRetCode::INVALID_ARGUMENT;
110 }
111
112 DHLOGD("DCameraProvider::AcquireBuffer for {devId: %s, dhId: %s}, streamId: %d.",
113 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str(), streamId);
114
115 OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
116 if (device == nullptr) {
117 DHLOGE("DCameraProvider::AcquireBuffer failed, dcamera device not found.");
118 return DCamRetCode::INVALID_ARGUMENT;
119 }
120
121 DCamRetCode ret = device->AcquireBuffer(streamId, buffer);
122 if (ret != DCamRetCode::SUCCESS) {
123 DHLOGE("DCameraProvider::AcquireBuffer failed, ret = %d.", ret);
124 return ret;
125 }
126 return DCamRetCode::SUCCESS;
127 }
128
ShutterBuffer(const DHBase & dhBase,int32_t streamId,const DCameraBuffer & buffer)129 int32_t DCameraProvider::ShutterBuffer(const DHBase& dhBase, int32_t streamId, const DCameraBuffer& buffer)
130 {
131 if (IsDhBaseInfoInvalid(dhBase)) {
132 DHLOGE("DCameraProvider::ShutterBuffer, devId or dhId is invalid.");
133 return DCamRetCode::INVALID_ARGUMENT;
134 }
135 if (buffer.index_ < 0 || buffer.size_ < 0) {
136 DHLOGE("DCameraProvider::ShutterBuffer, input dcamera buffer is invalid.");
137 return DCamRetCode::INVALID_ARGUMENT;
138 }
139 if (streamId < 0) {
140 DHLOGE("DCameraProvider::ShutterBuffer, input streamId is invalid.");
141 return DCamRetCode::INVALID_ARGUMENT;
142 }
143
144 DHLOGD("DCameraProvider::ShutterBuffer for {devId: %s, dhId: %s}, streamId = %d, buffer index = %d.",
145 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str(), streamId, buffer.index_);
146
147 OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
148 if (device == nullptr) {
149 DHLOGE("DCameraProvider::ShutterBuffer failed, dcamera device not found.");
150 return DCamRetCode::INVALID_ARGUMENT;
151 }
152 return device->ShutterBuffer(streamId, buffer);
153 }
154
OnSettingsResult(const DHBase & dhBase,const DCameraSettings & result)155 int32_t DCameraProvider::OnSettingsResult(const DHBase& dhBase, const DCameraSettings& result)
156 {
157 if (IsDhBaseInfoInvalid(dhBase)) {
158 DHLOGE("DCameraProvider::OnSettingsResult, devId or dhId is invalid.");
159 return DCamRetCode::INVALID_ARGUMENT;
160 }
161 if (IsDCameraSettingsInvalid(result)) {
162 DHLOGE("DCameraProvider::OnSettingsResult, input dcamera settings is valid.");
163 return DCamRetCode::INVALID_ARGUMENT;
164 }
165 DHLOGI("DCameraProvider::OnSettingsResult for {devId: %s, dhId: %s}.",
166 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
167
168 OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
169 if (device == nullptr) {
170 DHLOGE("DCameraProvider::OnSettingsResult failed, dcamera device not found.");
171 return DCamRetCode::INVALID_ARGUMENT;
172 }
173
174 std::shared_ptr<DCameraSettings> dCameraResult = std::make_shared<DCameraSettings>();
175 dCameraResult->type_ = result.type_;
176 dCameraResult->value_ = result.value_;
177 return device->OnSettingsResult(dCameraResult);
178 }
179
Notify(const DHBase & dhBase,const DCameraHDFEvent & event)180 int32_t DCameraProvider::Notify(const DHBase& dhBase, const DCameraHDFEvent& event)
181 {
182 if (IsDhBaseInfoInvalid(dhBase)) {
183 DHLOGE("DCameraProvider::Notify, devId or dhId is invalid.");
184 return DCamRetCode::INVALID_ARGUMENT;
185 }
186 if (IsDCameraHDFEventInvalid(event)) {
187 DHLOGE("DCameraProvider::Notify, input dcamera hdf event is null.");
188 return DCamRetCode::INVALID_ARGUMENT;
189 }
190 DHLOGI("DCameraProvider::Notify for {devId: %s, dhId: %s}.",
191 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
192
193 OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
194 if (device == nullptr) {
195 DHLOGE("DCameraProvider::Notify failed, dcamera device not found.");
196 return DCamRetCode::INVALID_ARGUMENT;
197 }
198
199 std::shared_ptr<DCameraHDFEvent> dCameraEvent = std::make_shared<DCameraHDFEvent>();
200 dCameraEvent->type_ = event.type_;
201 dCameraEvent->result_ = event.result_;
202 dCameraEvent->content_ = event.content_;
203 return device->Notify(dCameraEvent);
204 }
205
OpenSession(const DHBase & dhBase)206 int32_t DCameraProvider::OpenSession(const DHBase &dhBase)
207 {
208 DHLOGI("DCameraProvider::OpenSession for {devId: %s, dhId: %s}.",
209 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
210
211 sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
212 if (callback == nullptr) {
213 DHLOGE("DCameraProvider::OpenSession, dcamera provider callback not found.");
214 return DCamRetCode::INVALID_ARGUMENT;
215 }
216
217 return callback->OpenSession(dhBase);
218 }
219
CloseSession(const DHBase & dhBase)220 int32_t DCameraProvider::CloseSession(const DHBase &dhBase)
221 {
222 DHLOGI("DCameraProvider::CloseSession for {devId: %s, dhId: %s}.",
223 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
224
225 sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
226 if (callback == nullptr) {
227 DHLOGE("DCameraProvider::CloseSession, dcamera provider callback not found.");
228 return DCamRetCode::INVALID_ARGUMENT;
229 }
230
231 return callback->CloseSession(dhBase);
232 }
233
ConfigureStreams(const DHBase & dhBase,const std::vector<DCStreamInfo> & streamInfos)234 int32_t DCameraProvider::ConfigureStreams(const DHBase &dhBase, const std::vector<DCStreamInfo> &streamInfos)
235 {
236 DHLOGI("DCameraProvider::ConfigureStreams for {devId: %s, dhId: %s}.",
237 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
238
239 sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
240 if (callback == nullptr) {
241 DHLOGE("DCameraProvider::ConfigStreams, dcamera provider callback not found.");
242 return DCamRetCode::INVALID_ARGUMENT;
243 }
244
245 for (auto info = streamInfos.begin(); info != streamInfos.end(); info++) {
246 DHLOGI("ConfigureStreams: id=%d, width=%d, height=%d, format=%d, " +
247 "type=%d.", info->streamId_, info->width_, info->height_, info->format_, info->type_);
248 }
249 return callback->ConfigureStreams(dhBase, streamInfos);
250 }
251
ReleaseStreams(const DHBase & dhBase,const std::vector<int> & streamIds)252 int32_t DCameraProvider::ReleaseStreams(const DHBase &dhBase, const std::vector<int> &streamIds)
253 {
254 DHLOGI("DCameraProvider::ReleaseStreams for {devId: %s, dhId: %s}.",
255 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
256
257 sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
258 if (callback == nullptr) {
259 DHLOGE("DCameraProvider::ReleaseStreams, dcamera provider callback not found.");
260 return DCamRetCode::INVALID_ARGUMENT;
261 }
262
263 std::string idString = "";
264 for (int id : streamIds) {
265 idString += (std::to_string(id) + ", ");
266 }
267 DHLOGI("ReleaseStreams: ids=[%s].", idString.c_str());
268 return callback->ReleaseStreams(dhBase, streamIds);
269 }
270
StartCapture(const DHBase & dhBase,const std::vector<DCCaptureInfo> & captureInfos)271 int32_t DCameraProvider::StartCapture(const DHBase &dhBase, const std::vector<DCCaptureInfo> &captureInfos)
272 {
273 DHLOGI("DCameraProvider::StartCapture for {devId: %s, dhId: %s}.",
274 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
275
276 sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
277 if (callback == nullptr) {
278 DHLOGE("DCameraProvider::StartCapture, dcamera provider callback not found.");
279 return DCamRetCode::INVALID_ARGUMENT;
280 }
281
282 for (auto info = captureInfos.begin(); info != captureInfos.end(); info++) {
283 std::string idString = "";
284 for (int id : info->streamIds_) {
285 idString += (std::to_string(id) + ", ");
286 }
287 DHLOGI("DCameraProvider::StartCapture: ids=[%s], width=%d, height=%d, format=%d, type=%d, isCapture=%d.",
288 (idString.empty() ? idString.c_str() : (idString.substr(0, idString.length() - INGNORE_STR_LEN)).c_str()),
289 info->width_, info->height_, info->format_, info->type_, info->isCapture_);
290 }
291 return callback->StartCapture(dhBase, captureInfos);
292 }
293
StopCapture(const DHBase & dhBase,const std::vector<int> & streamIds)294 int32_t DCameraProvider::StopCapture(const DHBase &dhBase, const std::vector<int> &streamIds)
295 {
296 DHLOGI("DCameraProvider::StopCapture for {devId: %s, dhId: %s}.",
297 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
298
299 sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
300 if (callback == nullptr) {
301 DHLOGE("DCameraProvider::StopCapture, dcamera provider callback not found.");
302 return DCamRetCode::INVALID_ARGUMENT;
303 }
304
305 std::string idString = "";
306 for (int id : streamIds) {
307 idString += (std::to_string(id) + ", ");
308 }
309 DHLOGI("DCameraProvider::StopCapture: ids=[%s].",
310 idString.empty() ? idString.c_str() : (idString.substr(0, idString.length() - INGNORE_STR_LEN)).c_str());
311 return callback->StopCapture(dhBase, streamIds);
312 }
313
UpdateSettings(const DHBase & dhBase,const std::vector<DCameraSettings> & settings)314 int32_t DCameraProvider::UpdateSettings(const DHBase &dhBase, const std::vector<DCameraSettings> &settings)
315 {
316 DHLOGI("DCameraProvider::UpdateSettings for {devId: %s, dhId: %s}.",
317 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
318
319 sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
320 if (callback == nullptr) {
321 DHLOGE("DCameraProvider::UpdateSettings, dcamera provider callback not found.");
322 return DCamRetCode::INVALID_ARGUMENT;
323 }
324
325 return callback->UpdateSettings(dhBase, settings);
326 }
327
IsDCameraSettingsInvalid(const DCameraSettings & result)328 bool DCameraProvider::IsDCameraSettingsInvalid(const DCameraSettings& result)
329 {
330 return result.value_.empty() || result.value_.length() > SETTING_VALUE_MAX_LENGTH;
331 }
332
IsDCameraHDFEventInvalid(const DCameraHDFEvent & event)333 bool DCameraProvider::IsDCameraHDFEventInvalid(const DCameraHDFEvent& event)
334 {
335 return event.content_.length() > HDF_EVENT_CONTENT_MAX_LENGTH;
336 }
337
GetCallbackBydhBase(const DHBase & dhBase)338 sptr<IDCameraProviderCallback> DCameraProvider::GetCallbackBydhBase(const DHBase &dhBase)
339 {
340 OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
341 if (device == nullptr) {
342 DHLOGE("DCameraProvider::GetCallbackBydhBase failed, dcamera device not found.");
343 return nullptr;
344 }
345 return device->GetProviderCallback();
346 }
347
GetDCameraDevice(const DHBase & dhBase)348 OHOS::sptr<DCameraDevice> DCameraProvider::GetDCameraDevice(const DHBase &dhBase)
349 {
350 OHOS::sptr<DCameraHost> dCameraHost = DCameraHost::GetInstance();
351 if (dCameraHost == nullptr) {
352 DHLOGE("DCameraProvider::GetDCameraDevice, dcamera host is null.");
353 return nullptr;
354 }
355 return dCameraHost->GetDCameraDeviceByDHBase(dhBase);
356 }
357 } // namespace DistributedHardware
358 } // namespace OHOS
359