1 /*
2 * Copyright (c) 2021-2024 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, sinkAbilityInfo 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
71 JSONCPP_STRING errs;
72 Json::CharReaderBuilder readerBuilder;
73 Json::Value rootValue;
74
75 std::unique_ptr<Json::CharReader> const jsonReader(readerBuilder.newCharReader());
76 if (!jsonReader->parse(abilityInfo.c_str(), abilityInfo.c_str() + abilityInfo.length(),
77 &rootValue, &errs) || !rootValue.isObject()) {
78 DHLOGE("Input sink ablity info is not json object.");
79 return DCamRetCode::INVALID_ARGUMENT;
80 }
81
82 if (!rootValue["SinkAbility"].isObject() && !rootValue["SourceAbility"].isObject()) {
83 DHLOGE("Get ability error.");
84 return DCamRetCode::INVALID_ARGUMENT;
85 }
86 Json::Value sinkRootValue = rootValue["SinkAbility"];
87 Json::Value srcRootValue = rootValue["SourceAbility"];
88 std::string sinkAbilityInfo = sinkRootValue.toStyledString();
89 std::string sourceAbilityInfo = srcRootValue.toStyledString();
90
91 DCamRetCode ret = dCameraHost->AddDCameraDevice(dhBase, sinkAbilityInfo, sourceAbilityInfo, callbackObj);
92 if (ret != DCamRetCode::SUCCESS) {
93 DHLOGE("DCameraProvider::EnableDCameraDevice failed, ret = %d.", ret);
94 }
95
96 return ret;
97 }
98
DisableDCameraDevice(const DHBase & dhBase)99 int32_t DCameraProvider::DisableDCameraDevice(const DHBase& dhBase)
100 {
101 if (IsDhBaseInfoInvalid(dhBase)) {
102 DHLOGE("DCameraProvider::DisableDCameraDevice, devId or dhId is invalid.");
103 return DCamRetCode::INVALID_ARGUMENT;
104 }
105 DHLOGI("DCameraProvider::DisableDCameraDevice for {devId: %s, dhId: %s}.",
106 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
107
108 OHOS::sptr<DCameraHost> dCameraHost = DCameraHost::GetInstance();
109 if (dCameraHost == nullptr) {
110 DHLOGE("DCameraProvider::DisableDCameraDevice, dcamera host is null.");
111 return DCamRetCode::DEVICE_NOT_INIT;
112 }
113 DCamRetCode ret = dCameraHost->RemoveDCameraDevice(dhBase);
114 if (ret != DCamRetCode::SUCCESS) {
115 DHLOGE("DCameraProvider::DisableDCameraDevice failed, ret = %d.", ret);
116 return ret;
117 }
118
119 return DCamRetCode::SUCCESS;
120 }
121
AcquireBuffer(const DHBase & dhBase,int32_t streamId,DCameraBuffer & buffer)122 int32_t DCameraProvider::AcquireBuffer(const DHBase& dhBase, int32_t streamId, DCameraBuffer& buffer)
123 {
124 if (IsDhBaseInfoInvalid(dhBase)) {
125 DHLOGE("DCameraProvider::AcquireBuffer, devId or dhId is invalid.");
126 return DCamRetCode::INVALID_ARGUMENT;
127 }
128 if (streamId < 0) {
129 DHLOGE("DCameraProvider::AcquireBuffer, input streamId is invalid.");
130 return DCamRetCode::INVALID_ARGUMENT;
131 }
132
133 DHLOGD("DCameraProvider::AcquireBuffer for {devId: %s, dhId: %s}, streamId: %d.",
134 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str(), streamId);
135
136 OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
137 if (device == nullptr) {
138 DHLOGE("DCameraProvider::AcquireBuffer failed, dcamera device not found.");
139 return DCamRetCode::INVALID_ARGUMENT;
140 }
141
142 DCamRetCode ret = device->AcquireBuffer(streamId, buffer);
143 if (ret != DCamRetCode::SUCCESS) {
144 DHLOGE("DCameraProvider::AcquireBuffer failed, ret = %d.", ret);
145 return ret;
146 }
147 return DCamRetCode::SUCCESS;
148 }
149
ShutterBuffer(const DHBase & dhBase,int32_t streamId,const DCameraBuffer & buffer)150 int32_t DCameraProvider::ShutterBuffer(const DHBase& dhBase, int32_t streamId, const DCameraBuffer& buffer)
151 {
152 if (IsDhBaseInfoInvalid(dhBase)) {
153 DHLOGE("DCameraProvider::ShutterBuffer, devId or dhId is invalid.");
154 return DCamRetCode::INVALID_ARGUMENT;
155 }
156 if (buffer.index_ < 0 || buffer.size_ < 0) {
157 DHLOGE("DCameraProvider::ShutterBuffer, input dcamera buffer is invalid.");
158 return DCamRetCode::INVALID_ARGUMENT;
159 }
160 if (streamId < 0) {
161 DHLOGE("DCameraProvider::ShutterBuffer, input streamId is invalid.");
162 return DCamRetCode::INVALID_ARGUMENT;
163 }
164
165 DHLOGD("DCameraProvider::ShutterBuffer for {devId: %s, dhId: %s}, streamId = %d, buffer index = %d.",
166 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str(), streamId, buffer.index_);
167
168 OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
169 if (device == nullptr) {
170 DHLOGE("DCameraProvider::ShutterBuffer failed, dcamera device not found.");
171 return DCamRetCode::INVALID_ARGUMENT;
172 }
173 return device->ShutterBuffer(streamId, buffer);
174 }
175
OnSettingsResult(const DHBase & dhBase,const DCameraSettings & result)176 int32_t DCameraProvider::OnSettingsResult(const DHBase& dhBase, const DCameraSettings& result)
177 {
178 if (IsDhBaseInfoInvalid(dhBase)) {
179 DHLOGE("DCameraProvider::OnSettingsResult, devId or dhId is invalid.");
180 return DCamRetCode::INVALID_ARGUMENT;
181 }
182 if (IsDCameraSettingsInvalid(result)) {
183 DHLOGE("DCameraProvider::OnSettingsResult, input dcamera settings is valid.");
184 return DCamRetCode::INVALID_ARGUMENT;
185 }
186 DHLOGI("DCameraProvider::OnSettingsResult for {devId: %s, dhId: %s}.",
187 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
188
189 OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
190 if (device == nullptr) {
191 DHLOGE("DCameraProvider::OnSettingsResult failed, dcamera device not found.");
192 return DCamRetCode::INVALID_ARGUMENT;
193 }
194
195 std::shared_ptr<DCameraSettings> dCameraResult = std::make_shared<DCameraSettings>();
196 dCameraResult->type_ = result.type_;
197 dCameraResult->value_ = result.value_;
198 return device->OnSettingsResult(dCameraResult);
199 }
200
Notify(const DHBase & dhBase,const DCameraHDFEvent & event)201 int32_t DCameraProvider::Notify(const DHBase& dhBase, const DCameraHDFEvent& event)
202 {
203 if (IsDhBaseInfoInvalid(dhBase)) {
204 DHLOGE("DCameraProvider::Notify, devId or dhId is invalid.");
205 return DCamRetCode::INVALID_ARGUMENT;
206 }
207 if (IsDCameraHDFEventInvalid(event)) {
208 DHLOGE("DCameraProvider::Notify, input dcamera hdf event is null.");
209 return DCamRetCode::INVALID_ARGUMENT;
210 }
211 DHLOGI("DCameraProvider::Notify for {devId: %s, dhId: %s}.",
212 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
213
214 OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
215 if (device == nullptr) {
216 DHLOGE("DCameraProvider::Notify failed, dcamera device not found.");
217 return DCamRetCode::INVALID_ARGUMENT;
218 }
219
220 std::shared_ptr<DCameraHDFEvent> dCameraEvent = std::make_shared<DCameraHDFEvent>();
221 dCameraEvent->type_ = event.type_;
222 dCameraEvent->result_ = event.result_;
223 dCameraEvent->content_ = event.content_;
224 return device->Notify(dCameraEvent);
225 }
226
OpenSession(const DHBase & dhBase)227 int32_t DCameraProvider::OpenSession(const DHBase &dhBase)
228 {
229 DHLOGI("DCameraProvider::OpenSession for {devId: %s, dhId: %s}.",
230 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
231
232 sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
233 if (callback == nullptr) {
234 DHLOGE("DCameraProvider::OpenSession, dcamera provider callback not found.");
235 return DCamRetCode::INVALID_ARGUMENT;
236 }
237
238 return callback->OpenSession(dhBase);
239 }
240
CloseSession(const DHBase & dhBase)241 int32_t DCameraProvider::CloseSession(const DHBase &dhBase)
242 {
243 DHLOGI("DCameraProvider::CloseSession for {devId: %s, dhId: %s}.",
244 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
245
246 sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
247 if (callback == nullptr) {
248 DHLOGE("DCameraProvider::CloseSession, dcamera provider callback not found.");
249 return DCamRetCode::INVALID_ARGUMENT;
250 }
251
252 return callback->CloseSession(dhBase);
253 }
254
ConfigureStreams(const DHBase & dhBase,const std::vector<DCStreamInfo> & streamInfos)255 int32_t DCameraProvider::ConfigureStreams(const DHBase &dhBase, const std::vector<DCStreamInfo> &streamInfos)
256 {
257 DHLOGI("DCameraProvider::ConfigureStreams for {devId: %s, dhId: %s}.",
258 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
259
260 sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
261 if (callback == nullptr) {
262 DHLOGE("DCameraProvider::ConfigStreams, dcamera provider callback not found.");
263 return DCamRetCode::INVALID_ARGUMENT;
264 }
265
266 for (auto info = streamInfos.begin(); info != streamInfos.end(); info++) {
267 DHLOGI("ConfigureStreams: id=%d, width=%d, height=%d, format=%d, " +
268 "type=%d.", info->streamId_, info->width_, info->height_, info->format_, info->type_);
269 }
270 return callback->ConfigureStreams(dhBase, streamInfos);
271 }
272
ReleaseStreams(const DHBase & dhBase,const std::vector<int> & streamIds)273 int32_t DCameraProvider::ReleaseStreams(const DHBase &dhBase, const std::vector<int> &streamIds)
274 {
275 DHLOGI("DCameraProvider::ReleaseStreams for {devId: %s, dhId: %s}.",
276 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
277
278 sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
279 if (callback == nullptr) {
280 DHLOGE("DCameraProvider::ReleaseStreams, dcamera provider callback not found.");
281 return DCamRetCode::INVALID_ARGUMENT;
282 }
283
284 std::string idString = "";
285 for (int id : streamIds) {
286 idString += (std::to_string(id) + ", ");
287 }
288 DHLOGI("ReleaseStreams: ids=[%s].", idString.c_str());
289 return callback->ReleaseStreams(dhBase, streamIds);
290 }
291
StartCapture(const DHBase & dhBase,const std::vector<DCCaptureInfo> & captureInfos)292 int32_t DCameraProvider::StartCapture(const DHBase &dhBase, const std::vector<DCCaptureInfo> &captureInfos)
293 {
294 DHLOGI("DCameraProvider::StartCapture for {devId: %s, dhId: %s}.",
295 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
296
297 sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
298 if (callback == nullptr) {
299 DHLOGE("DCameraProvider::StartCapture, dcamera provider callback not found.");
300 return DCamRetCode::INVALID_ARGUMENT;
301 }
302
303 for (auto info = captureInfos.begin(); info != captureInfos.end(); info++) {
304 std::string idString = "";
305 for (int id : info->streamIds_) {
306 idString += (std::to_string(id) + ", ");
307 }
308 DHLOGI("DCameraProvider::StartCapture: ids=[%s], width=%d, height=%d, format=%d, type=%d, isCapture=%d.",
309 (idString.empty() ? idString.c_str() : (idString.substr(0, idString.length() - INGNORE_STR_LEN)).c_str()),
310 info->width_, info->height_, info->format_, info->type_, info->isCapture_);
311 }
312 return callback->StartCapture(dhBase, captureInfos);
313 }
314
StopCapture(const DHBase & dhBase,const std::vector<int> & streamIds)315 int32_t DCameraProvider::StopCapture(const DHBase &dhBase, const std::vector<int> &streamIds)
316 {
317 DHLOGI("DCameraProvider::StopCapture for {devId: %s, dhId: %s}.",
318 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
319
320 sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
321 if (callback == nullptr) {
322 DHLOGE("DCameraProvider::StopCapture, dcamera provider callback not found.");
323 return DCamRetCode::INVALID_ARGUMENT;
324 }
325
326 std::string idString = "";
327 for (int id : streamIds) {
328 idString += (std::to_string(id) + ", ");
329 }
330 DHLOGI("DCameraProvider::StopCapture: ids=[%s].",
331 idString.empty() ? idString.c_str() : (idString.substr(0, idString.length() - INGNORE_STR_LEN)).c_str());
332 return callback->StopCapture(dhBase, streamIds);
333 }
334
UpdateSettings(const DHBase & dhBase,const std::vector<DCameraSettings> & settings)335 int32_t DCameraProvider::UpdateSettings(const DHBase &dhBase, const std::vector<DCameraSettings> &settings)
336 {
337 DHLOGI("DCameraProvider::UpdateSettings for {devId: %s, dhId: %s}.",
338 GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
339
340 sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
341 if (callback == nullptr) {
342 DHLOGE("DCameraProvider::UpdateSettings, dcamera provider callback not found.");
343 return DCamRetCode::INVALID_ARGUMENT;
344 }
345
346 return callback->UpdateSettings(dhBase, settings);
347 }
348
IsDCameraSettingsInvalid(const DCameraSettings & result)349 bool DCameraProvider::IsDCameraSettingsInvalid(const DCameraSettings& result)
350 {
351 return result.value_.empty() || result.value_.length() > SETTING_VALUE_MAX_LENGTH;
352 }
353
IsDCameraHDFEventInvalid(const DCameraHDFEvent & event)354 bool DCameraProvider::IsDCameraHDFEventInvalid(const DCameraHDFEvent& event)
355 {
356 return event.content_.length() > HDF_EVENT_CONTENT_MAX_LENGTH;
357 }
358
GetCallbackBydhBase(const DHBase & dhBase)359 sptr<IDCameraProviderCallback> DCameraProvider::GetCallbackBydhBase(const DHBase &dhBase)
360 {
361 OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
362 if (device == nullptr) {
363 DHLOGE("DCameraProvider::GetCallbackBydhBase failed, dcamera device not found.");
364 return nullptr;
365 }
366 return device->GetProviderCallback();
367 }
368
GetDCameraDevice(const DHBase & dhBase)369 OHOS::sptr<DCameraDevice> DCameraProvider::GetDCameraDevice(const DHBase &dhBase)
370 {
371 OHOS::sptr<DCameraHost> dCameraHost = DCameraHost::GetInstance();
372 if (dCameraHost == nullptr) {
373 DHLOGE("DCameraProvider::GetDCameraDevice, dcamera host is null.");
374 return nullptr;
375 }
376 return dCameraHost->GetDCameraDeviceByDHBase(dhBase);
377 }
378 } // namespace DistributedHardware
379 } // namespace OHOS
380