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 /* ShutterBuffer don't need buffer handle */
148 if (buffer.bufferHandle_ != nullptr) {
149 FreeBufferHandle(buffer.bufferHandle_->GetBufferHandle());
150 }
151 OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
152 if (device == nullptr) {
153 DHLOGE("DCameraProvider::ShutterBuffer failed, dcamera device not found.");
154 return DCamRetCode::INVALID_ARGUMENT;
155 }
156 return device->ShutterBuffer(streamId, buffer);
157 }
158
OnSettingsResult(const DHBase & dhBase,const DCameraSettings & result)159 int32_t DCameraProvider::OnSettingsResult(const DHBase& dhBase, const DCameraSettings& result)
160 {
161 if (IsDhBaseInfoInvalid(dhBase)) {
162 DHLOGE("DCameraProvider::OnSettingsResult, devId or dhId is invalid.");
163 return DCamRetCode::INVALID_ARGUMENT;
164 }
165 if (IsDCameraSettingsInvalid(result)) {
166 DHLOGE("DCameraProvider::OnSettingsResult, input dcamera settings is valid.");
167 return DCamRetCode::INVALID_ARGUMENT;
168 }
169 DHLOGI("DCameraProvider::OnSettingsResult for {devId: %s, dhId: %s}.",
170 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
171
172 OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
173 if (device == nullptr) {
174 DHLOGE("DCameraProvider::OnSettingsResult failed, dcamera device not found.");
175 return DCamRetCode::INVALID_ARGUMENT;
176 }
177
178 std::shared_ptr<DCameraSettings> dCameraResult = std::make_shared<DCameraSettings>();
179 dCameraResult->type_ = result.type_;
180 dCameraResult->value_ = result.value_;
181 return device->OnSettingsResult(dCameraResult);
182 }
183
Notify(const DHBase & dhBase,const DCameraHDFEvent & event)184 int32_t DCameraProvider::Notify(const DHBase& dhBase, const DCameraHDFEvent& event)
185 {
186 if (IsDhBaseInfoInvalid(dhBase)) {
187 DHLOGE("DCameraProvider::Notify, devId or dhId is invalid.");
188 return DCamRetCode::INVALID_ARGUMENT;
189 }
190 if (IsDCameraHDFEventInvalid(event)) {
191 DHLOGE("DCameraProvider::Notify, input dcamera hdf event is null.");
192 return DCamRetCode::INVALID_ARGUMENT;
193 }
194 DHLOGI("DCameraProvider::Notify for {devId: %s, dhId: %s}.",
195 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
196
197 OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
198 if (device == nullptr) {
199 DHLOGE("DCameraProvider::Notify failed, dcamera device not found.");
200 return DCamRetCode::INVALID_ARGUMENT;
201 }
202
203 std::shared_ptr<DCameraHDFEvent> dCameraEvent = std::make_shared<DCameraHDFEvent>();
204 dCameraEvent->type_ = event.type_;
205 dCameraEvent->result_ = event.result_;
206 dCameraEvent->content_ = event.content_;
207 return device->Notify(dCameraEvent);
208 }
209
OpenSession(const DHBase & dhBase)210 int32_t DCameraProvider::OpenSession(const DHBase &dhBase)
211 {
212 DHLOGI("DCameraProvider::OpenSession for {devId: %s, dhId: %s}.",
213 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
214
215 sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
216 if (callback == nullptr) {
217 DHLOGE("DCameraProvider::OpenSession, dcamera provider callback not found.");
218 return DCamRetCode::INVALID_ARGUMENT;
219 }
220
221 return callback->OpenSession(dhBase);
222 }
223
CloseSession(const DHBase & dhBase)224 int32_t DCameraProvider::CloseSession(const DHBase &dhBase)
225 {
226 DHLOGI("DCameraProvider::CloseSession for {devId: %s, dhId: %s}.",
227 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
228
229 sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
230 if (callback == nullptr) {
231 DHLOGE("DCameraProvider::CloseSession, dcamera provider callback not found.");
232 return DCamRetCode::INVALID_ARGUMENT;
233 }
234
235 return callback->CloseSession(dhBase);
236 }
237
ConfigureStreams(const DHBase & dhBase,const std::vector<DCStreamInfo> & streamInfos)238 int32_t DCameraProvider::ConfigureStreams(const DHBase &dhBase, const std::vector<DCStreamInfo> &streamInfos)
239 {
240 DHLOGI("DCameraProvider::ConfigureStreams for {devId: %s, dhId: %s}.",
241 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
242
243 sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
244 if (callback == nullptr) {
245 DHLOGE("DCameraProvider::ConfigStreams, dcamera provider callback not found.");
246 return DCamRetCode::INVALID_ARGUMENT;
247 }
248
249 for (auto info = streamInfos.begin(); info != streamInfos.end(); info++) {
250 DHLOGI("ConfigureStreams: id=%d, width=%d, height=%d, format=%d, " +
251 "type=%d.", info->streamId_, info->width_, info->height_, info->format_, info->type_);
252 }
253 return callback->ConfigureStreams(dhBase, streamInfos);
254 }
255
ReleaseStreams(const DHBase & dhBase,const std::vector<int> & streamIds)256 int32_t DCameraProvider::ReleaseStreams(const DHBase &dhBase, const std::vector<int> &streamIds)
257 {
258 DHLOGI("DCameraProvider::ReleaseStreams for {devId: %s, dhId: %s}.",
259 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
260
261 sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
262 if (callback == nullptr) {
263 DHLOGE("DCameraProvider::ReleaseStreams, dcamera provider callback not found.");
264 return DCamRetCode::INVALID_ARGUMENT;
265 }
266
267 std::string idString = "";
268 for (int id : streamIds) {
269 idString += (std::to_string(id) + ", ");
270 }
271 DHLOGI("ReleaseStreams: ids=[%s].", idString.c_str());
272 return callback->ReleaseStreams(dhBase, streamIds);
273 }
274
StartCapture(const DHBase & dhBase,const std::vector<DCCaptureInfo> & captureInfos)275 int32_t DCameraProvider::StartCapture(const DHBase &dhBase, const std::vector<DCCaptureInfo> &captureInfos)
276 {
277 DHLOGI("DCameraProvider::StartCapture for {devId: %s, dhId: %s}.",
278 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
279
280 sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
281 if (callback == nullptr) {
282 DHLOGE("DCameraProvider::StartCapture, dcamera provider callback not found.");
283 return DCamRetCode::INVALID_ARGUMENT;
284 }
285
286 for (auto info = captureInfos.begin(); info != captureInfos.end(); info++) {
287 std::string idString = "";
288 for (int id : info->streamIds_) {
289 idString += (std::to_string(id) + ", ");
290 }
291 DHLOGI("DCameraProvider::StartCapture: ids=[%s], width=%d, height=%d, format=%d, type=%d, isCapture=%d.",
292 (idString.empty() ? idString.c_str() : (idString.substr(0, idString.length() - INGNORE_STR_LEN)).c_str()),
293 info->width_, info->height_, info->format_, info->type_, info->isCapture_);
294 }
295 return callback->StartCapture(dhBase, captureInfos);
296 }
297
StopCapture(const DHBase & dhBase,const std::vector<int> & streamIds)298 int32_t DCameraProvider::StopCapture(const DHBase &dhBase, const std::vector<int> &streamIds)
299 {
300 DHLOGI("DCameraProvider::StopCapture for {devId: %s, dhId: %s}.",
301 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
302
303 sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
304 if (callback == nullptr) {
305 DHLOGE("DCameraProvider::StopCapture, dcamera provider callback not found.");
306 return DCamRetCode::INVALID_ARGUMENT;
307 }
308
309 std::string idString = "";
310 for (int id : streamIds) {
311 idString += (std::to_string(id) + ", ");
312 }
313 DHLOGI("DCameraProvider::StopCapture: ids=[%s].",
314 idString.empty() ? idString.c_str() : (idString.substr(0, idString.length() - INGNORE_STR_LEN)).c_str());
315 return callback->StopCapture(dhBase, streamIds);
316 }
317
UpdateSettings(const DHBase & dhBase,const std::vector<DCameraSettings> & settings)318 int32_t DCameraProvider::UpdateSettings(const DHBase &dhBase, const std::vector<DCameraSettings> &settings)
319 {
320 DHLOGI("DCameraProvider::UpdateSettings for {devId: %s, dhId: %s}.",
321 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
322
323 sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
324 if (callback == nullptr) {
325 DHLOGE("DCameraProvider::UpdateSettings, dcamera provider callback not found.");
326 return DCamRetCode::INVALID_ARGUMENT;
327 }
328
329 return callback->UpdateSettings(dhBase, settings);
330 }
331
IsDCameraSettingsInvalid(const DCameraSettings & result)332 bool DCameraProvider::IsDCameraSettingsInvalid(const DCameraSettings& result)
333 {
334 return result.value_.empty() || result.value_.length() > SETTING_VALUE_MAX_LENGTH;
335 }
336
IsDCameraHDFEventInvalid(const DCameraHDFEvent & event)337 bool DCameraProvider::IsDCameraHDFEventInvalid(const DCameraHDFEvent& event)
338 {
339 return event.content_.length() > HDF_EVENT_CONTENT_MAX_LENGTH;
340 }
341
GetCallbackBydhBase(const DHBase & dhBase)342 sptr<IDCameraProviderCallback> DCameraProvider::GetCallbackBydhBase(const DHBase &dhBase)
343 {
344 OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
345 if (device == nullptr) {
346 DHLOGE("DCameraProvider::GetCallbackBydhBase failed, dcamera device not found.");
347 return nullptr;
348 }
349 return device->GetProviderCallback();
350 }
351
GetDCameraDevice(const DHBase & dhBase)352 OHOS::sptr<DCameraDevice> DCameraProvider::GetDCameraDevice(const DHBase &dhBase)
353 {
354 OHOS::sptr<DCameraHost> dCameraHost = DCameraHost::GetInstance();
355 if (dCameraHost == nullptr) {
356 DHLOGE("DCameraProvider::GetDCameraDevice, dcamera host is null.");
357 return nullptr;
358 }
359 return dCameraHost->GetDCameraDeviceByDHBase(dhBase);
360 }
361 } // namespace DistributedHardware
362 } // namespace OHOS
363