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_client.h"
17
18 #include "anonymous_string.h"
19 #include "camera_util.h"
20 #include "camera_metadata_operator.h"
21 #include "dcamera_input_callback.h"
22 #include "dcamera_manager_callback.h"
23 #include "dcamera_photo_callback.h"
24 #include "dcamera_preview_callback.h"
25 #include "dcamera_session_callback.h"
26 #include "dcamera_utils_tools.h"
27 #include "dcamera_video_callback.h"
28 #include "distributed_camera_constants.h"
29 #include "distributed_camera_errno.h"
30 #include "distributed_hardware_log.h"
31 #include "metadata_utils.h"
32
33 namespace OHOS {
34 namespace DistributedHardware {
DCameraClient(const std::string & dhId)35 DCameraClient::DCameraClient(const std::string& dhId)
36 {
37 DHLOGI("DCameraClient Constructor dhId: %{public}s", GetAnonyString(dhId).c_str());
38 if (dhId.size() >= CAMERA_ID_PREFIX.size()) {
39 cameraId_ = dhId.substr(CAMERA_ID_PREFIX.size());
40 }
41 isInit_ = false;
42 }
43
~DCameraClient()44 DCameraClient::~DCameraClient()
45 {
46 if (isInit_) {
47 UnInit();
48 }
49 }
50
Init()51 int32_t DCameraClient::Init()
52 {
53 DHLOGI("Init cameraId: %{public}s", GetAnonyString(cameraId_).c_str());
54 cameraManager_ = CameraStandard::CameraManager::GetInstance();
55 if (cameraManager_ == nullptr) {
56 DHLOGE("Init cameraManager getInstance failed");
57 return DCAMERA_BAD_VALUE;
58 }
59 cameraManager_->SetCallback(std::make_shared<DCameraManagerCallback>());
60
61 std::vector<sptr<CameraStandard::CameraDevice>> cameraList = cameraManager_->GetSupportedCameras();
62 if (cameraList.empty()) {
63 DHLOGE("Init no camera device");
64 return DCAMERA_BAD_VALUE;
65 }
66 uint64_t listSize = static_cast<uint64_t>(cameraList.size());
67 DHLOGI("Init camera size: %{public}" PRIu64, listSize);
68 for (auto& info : cameraList) {
69 if (info->GetID() == cameraId_) {
70 DHLOGI("Init cameraInfo get id: %{public}s", GetAnonyString(info->GetID()).c_str());
71 cameraInfo_ = info;
72 break;
73 }
74 }
75 if (cameraInfo_ == nullptr) {
76 DHLOGE("Init cameraInfo is null");
77 return DCAMERA_BAD_VALUE;
78 }
79
80 isInit_ = true;
81 DHLOGI("Init %{public}s success", GetAnonyString(cameraId_).c_str());
82 return DCAMERA_OK;
83 }
84
UnInit()85 int32_t DCameraClient::UnInit()
86 {
87 DHLOGI("UnInit cameraId: %{public}s", GetAnonyString(cameraId_).c_str());
88 if (cameraManager_ != nullptr) {
89 DHLOGI("UnInit unregister cameraManager callback");
90 cameraManager_->SetCallback(nullptr);
91 }
92
93 isInit_ = false;
94 cameraInfo_ = nullptr;
95 cameraManager_ = nullptr;
96 DHLOGI("UnInit %{public}s success", GetAnonyString(cameraId_).c_str());
97 return DCAMERA_OK;
98 }
99
UpdateSettings(std::vector<std::shared_ptr<DCameraSettings>> & settings)100 int32_t DCameraClient::UpdateSettings(std::vector<std::shared_ptr<DCameraSettings>>& settings)
101 {
102 DHLOGI("UpdateSettings cameraId: %{public}s", GetAnonyString(cameraId_).c_str());
103 for (auto& setting : settings) {
104 switch (setting->type_) {
105 case UPDATE_METADATA: {
106 DHLOGI("UpdateSettings %{public}s update metadata settings", GetAnonyString(cameraId_).c_str());
107 std::string dcSettingValue = setting->value_;
108 std::string metadataStr = Base64Decode(dcSettingValue);
109 FindCameraMetadata(metadataStr);
110
111 if (cameraInput_ == nullptr) {
112 DHLOGE("UpdateSettings %{public}s cameraInput is null", GetAnonyString(cameraId_).c_str());
113 UpdateSettingCache(metadataStr);
114 return DCAMERA_OK;
115 }
116
117 int32_t ret = ((sptr<CameraStandard::CameraInput> &)cameraInput_)->SetCameraSettings(metadataStr);
118 if (ret != DCAMERA_OK) {
119 DHLOGE("UpdateSettings %{public}s update metadata settings failed, ret: %{public}d",
120 GetAnonyString(cameraId_).c_str(), ret);
121 return ret;
122 }
123 break;
124 }
125 default: {
126 DHLOGE("UpdateSettings unknown setting type");
127 break;
128 }
129 }
130 }
131 DHLOGI("UpdateSettings %{public}s success", GetAnonyString(cameraId_).c_str());
132 return DCAMERA_OK;
133 }
134
UpdateSettingCache(const std::string & metadataStr)135 void DCameraClient::UpdateSettingCache(const std::string& metadataStr)
136 {
137 if (cameraMetadatas_.size() == DCAMERA_MAX_METADATA_SIZE) {
138 DHLOGE("UpdateSettingCache %{public}s camera metadata oversize",
139 GetAnonyString(cameraId_).c_str());
140 cameraMetadatas_.pop();
141 }
142 cameraMetadatas_.push(metadataStr);
143 }
144
FindCameraMetadata(const std::string & metadataStr)145 void DCameraClient::FindCameraMetadata(const std::string& metadataStr)
146 {
147 std::shared_ptr<Camera::CameraMetadata> cameraMetadata = Camera::MetadataUtils::DecodeFromString(metadataStr);
148 CHECK_AND_RETURN_LOG(cameraMetadata == nullptr, "FindCameraMetadata get cameraMetadata is null");
149 camera_metadata_item_t focusItem;
150 int32_t ret = Camera::FindCameraMetadataItem(cameraMetadata->get(), OHOS_CONTROL_FOCUS_MODE, &focusItem);
151 if (ret == CAM_META_SUCCESS) {
152 DHLOGI("FindCameraMetadata focus mode: %{public}d", focusItem.data.u8[0]);
153 } else {
154 DHLOGE("FindCameraMetadata %{public}s find focus mode failed, ret: %{public}d",
155 GetAnonyString(cameraId_).c_str(), ret);
156 }
157
158 camera_metadata_item_t exposureItem;
159 ret = Camera::FindCameraMetadataItem(cameraMetadata->get(), OHOS_CONTROL_EXPOSURE_MODE, &exposureItem);
160 if (ret == CAM_META_SUCCESS) {
161 DHLOGI("FindCameraMetadata exposure mode: %{public}d", exposureItem.data.u8[0]);
162 } else {
163 DHLOGE("FindCameraMetadata %{public}s find exposure mode failed, ret: %{public}d",
164 GetAnonyString(cameraId_).c_str(), ret);
165 }
166
167 camera_metadata_item_t stabilityItem;
168 ret = Camera::FindCameraMetadataItem(cameraMetadata->get(), OHOS_CONTROL_VIDEO_STABILIZATION_MODE, &stabilityItem);
169 if (ret == CAM_META_SUCCESS) {
170 DHLOGI("FindCameraMetadata stabilization mode: %{public}d", stabilityItem.data.u8[0]);
171 } else {
172 DHLOGE("FindCameraMetadata %{public}s find stabilization mode failed, ret: %{public}d",
173 GetAnonyString(cameraId_).c_str(), ret);
174 }
175 }
176
StartCapture(std::vector<std::shared_ptr<DCameraCaptureInfo>> & captureInfos,sptr<Surface> & surface,int32_t sceneMode)177 int32_t DCameraClient::StartCapture(std::vector<std::shared_ptr<DCameraCaptureInfo>>& captureInfos,
178 sptr<Surface>& surface, int32_t sceneMode)
179 {
180 DHLOGI("StartCapture cameraId: %{public}s, mode: %{public}d", GetAnonyString(cameraId_).c_str(), sceneMode);
181 if ((photoOutput_ == nullptr) && (previewOutput_ == nullptr)) {
182 DHLOGI("StartCapture %{public}s config capture session", GetAnonyString(cameraId_).c_str());
183 if (surface == nullptr) {
184 DHLOGE("StartCapture: input surface is nullptr.");
185 return DCAMERA_BAD_VALUE;
186 }
187 previewSurface_ = surface;
188 int32_t ret = ConfigCaptureSession(captureInfos, sceneMode);
189 if (ret != DCAMERA_OK) {
190 DHLOGE("StartCapture config capture session failed, cameraId: %{public}s, ret: %{public}d",
191 GetAnonyString(cameraId_).c_str(), ret);
192 return CameraServiceErrorType(ret);
193 }
194 }
195
196 for (auto& info : captureInfos) {
197 if ((info->streamType_ == CONTINUOUS_FRAME) || (!info->isCapture_)) {
198 continue;
199 }
200 int32_t ret = StartCaptureInner(info);
201 if (ret != DCAMERA_OK) {
202 DHLOGE("StartCapture failed, cameraId: %{public}s, ret: %{public}d",
203 GetAnonyString(cameraId_).c_str(), ret);
204 return CameraServiceErrorType(ret);
205 }
206 }
207 DHLOGI("StartCapture %{public}s success", GetAnonyString(cameraId_).c_str());
208 return DCAMERA_OK;
209 }
210
CameraServiceErrorType(const int32_t errorType)211 int32_t DCameraClient::CameraServiceErrorType(const int32_t errorType)
212 {
213 if (errorType == CameraStandard::CameraErrorCode::SERVICE_FATL_ERROR) {
214 return DCAMERA_ALLOC_ERROR;
215 } else if (errorType == CameraStandard::CameraErrorCode::CONFLICT_CAMERA) {
216 return DCAMERA_DEVICE_BUSY;
217 }
218 return errorType;
219 }
220
StopCapture()221 int32_t DCameraClient::StopCapture()
222 {
223 DHLOGI("StopCapture cameraId: %{public}s", GetAnonyString(cameraId_).c_str());
224 StopOutput();
225
226 if (cameraInput_ != nullptr) {
227 DHLOGI("StopCapture %{public}s release cameraInput", GetAnonyString(cameraId_).c_str());
228 int32_t ret = cameraInput_->Close();
229 if (ret != DCAMERA_OK) {
230 DHLOGE("StopCapture cameraInput Close failed, cameraId: %{public}s, ret: %{public}d",
231 GetAnonyString(cameraId_).c_str(), ret);
232 }
233 ret = cameraInput_->Release();
234 if (ret != DCAMERA_OK) {
235 DHLOGE("StopCapture cameraInput Release failed, cameraId: %{public}s, ret: %{public}d",
236 GetAnonyString(cameraId_).c_str(), ret);
237 }
238 cameraInput_ = nullptr;
239 }
240 ReleaseCaptureSession();
241
242 if (previewSurface_ != nullptr) {
243 DHLOGI("StopCapture %s previewsurface unregister consumer listener",
244 GetAnonyString(cameraId_).c_str());
245 previewSurface_ = nullptr;
246 }
247
248 if (photoSurface_ != nullptr) {
249 DHLOGI("StopCapture %{public}s photosurface unregister consumer listener",
250 GetAnonyString(cameraId_).c_str());
251 int32_t ret = photoSurface_->UnregisterConsumerListener();
252 if (ret != DCAMERA_OK) {
253 DHLOGE("StopCapture %{public}s photosurface unregister consumer listener failed, ret: %{public}d",
254 GetAnonyString(cameraId_).c_str(), ret);
255 }
256 photoListener_ = nullptr;
257 photoSurface_ = nullptr;
258 }
259
260 DHLOGI("StopCapture %{public}s success", GetAnonyString(cameraId_).c_str());
261 return DCAMERA_OK;
262 }
263
StopOutput()264 void DCameraClient::StopOutput()
265 {
266 if (previewOutput_ != nullptr) {
267 DHLOGI("StopCapture %{public}s stop previewOutput", GetAnonyString(cameraId_).c_str());
268 int32_t ret = ((sptr<CameraStandard::PreviewOutput> &)previewOutput_)->Stop();
269 if (ret != DCAMERA_OK) {
270 DHLOGE("StopCapture videoOutput stop failed, cameraId: %{public}s, ret: %{public}d",
271 GetAnonyString(cameraId_).c_str(), ret);
272 }
273 DHLOGI("StopCapture %{public}s release previewOutput", GetAnonyString(cameraId_).c_str());
274 ret = previewOutput_->Release();
275 if (ret != DCAMERA_OK) {
276 DHLOGE("StopCapture previewOutput Release failed, cameraId: %{public}s, ret: %{public}d",
277 GetAnonyString(cameraId_).c_str(), ret);
278 }
279 previewOutput_ = nullptr;
280 }
281
282 if (photoOutput_ != nullptr) {
283 DHLOGI("StopCapture %{public}s release photoOutput", GetAnonyString(cameraId_).c_str());
284 int32_t ret = photoOutput_->Release();
285 if (ret != DCAMERA_OK) {
286 DHLOGE("StopCapture photoOutput Release failed, cameraId: %{public}s, ret: %{public}d",
287 GetAnonyString(cameraId_).c_str(), ret);
288 }
289 photoOutput_ = nullptr;
290 }
291 }
292
ReleaseCaptureSession()293 void DCameraClient::ReleaseCaptureSession()
294 {
295 if (captureSession_ == nullptr) {
296 return;
297 }
298 DHLOGI("StopCapture %{public}s stop captureSession", GetAnonyString(cameraId_).c_str());
299 int32_t ret = captureSession_->Stop();
300 if (ret != DCAMERA_OK) {
301 DHLOGE("StopCapture captureSession stop failed, cameraId: %{public}s, ret: %{public}d",
302 GetAnonyString(cameraId_).c_str(), ret);
303 }
304 DHLOGI("StopCapture %{public}s release captureSession", GetAnonyString(cameraId_).c_str());
305 ret = captureSession_->Release();
306 if (ret != DCAMERA_OK) {
307 DHLOGE("StopCapture captureSession Release failed, cameraId: %{public}s, ret: %{public}d",
308 GetAnonyString(cameraId_).c_str(), ret);
309 }
310 captureSession_ = nullptr;
311 }
312
SetStateCallback(std::shared_ptr<StateCallback> & callback)313 int32_t DCameraClient::SetStateCallback(std::shared_ptr<StateCallback>& callback)
314 {
315 DHLOGI("SetStateCallback cameraId: %{public}s", GetAnonyString(cameraId_).c_str());
316 if (callback == nullptr) {
317 DHLOGE("SetStateCallback %{public}s unregistering state callback", GetAnonyString(cameraId_).c_str());
318 }
319 stateCallback_ = callback;
320 return DCAMERA_OK;
321 }
322
SetResultCallback(std::shared_ptr<ResultCallback> & callback)323 int32_t DCameraClient::SetResultCallback(std::shared_ptr<ResultCallback>& callback)
324 {
325 DHLOGI("SetResultCallback cameraId: %{public}s", GetAnonyString(cameraId_).c_str());
326 if (callback == nullptr) {
327 DHLOGE("SetResultCallback %{public}s unregistering result callback", GetAnonyString(cameraId_).c_str());
328 }
329 resultCallback_ = callback;
330 return DCAMERA_OK;
331 }
332
ConfigCaptureSession(std::vector<std::shared_ptr<DCameraCaptureInfo>> & captureInfos,int32_t sceneMode)333 int32_t DCameraClient::ConfigCaptureSession(std::vector<std::shared_ptr<DCameraCaptureInfo>>& captureInfos,
334 int32_t sceneMode)
335 {
336 DHLOGI("ConfigCaptureSession cameraId: %{public}s", GetAnonyString(cameraId_).c_str());
337 CHECK_AND_RETURN_RET_LOG(cameraManager_ == nullptr, DCAMERA_BAD_VALUE, "cameraManager is null.");
338 int rv = cameraManager_->CreateCameraInput(cameraInfo_, &((sptr<CameraStandard::CameraInput> &)cameraInput_));
339 if (rv != DCAMERA_OK) {
340 DHLOGE("ConfigCaptureSession %{public}s create cameraInput failed", GetAnonyString(cameraId_).c_str());
341 return DCAMERA_BAD_VALUE;
342 }
343 int32_t rc = ((sptr<CameraStandard::CameraInput> &)cameraInput_)->Open();
344 if (rc != DCAMERA_OK) {
345 DHLOGE("ConfigCaptureSession cameraInput_ Open failed, cameraId: %{public}s, ret: %{public}d",
346 GetAnonyString(cameraId_).c_str(), rc);
347 return DCAMERA_BAD_VALUE;
348 }
349 std::shared_ptr<DCameraInputCallback> inputCallback = std::make_shared<DCameraInputCallback>(stateCallback_);
350 ((sptr<CameraStandard::CameraInput> &)cameraInput_)->SetErrorCallback(inputCallback);
351
352 while (!cameraMetadatas_.empty()) {
353 std::string metadataStr = cameraMetadatas_.front();
354 FindCameraMetadata(metadataStr);
355 int32_t ret = ((sptr<CameraStandard::CameraInput> &)cameraInput_)->SetCameraSettings(metadataStr);
356 if (ret != DCAMERA_OK) {
357 DHLOGE("ConfigCaptureSession %{public}s set camera settings failed, ret: %{public}d",
358 GetAnonyString(cameraId_).c_str(), ret);
359 return ret;
360 }
361 cameraMetadatas_.pop();
362 }
363
364 captureSession_ = cameraManager_->CreateCaptureSession(static_cast<CameraStandard::SceneMode>(sceneMode));
365 if (captureSession_ == nullptr) {
366 DHLOGE("ConfigCaptureSession %{public}s create captureSession failed",
367 GetAnonyString(cameraId_).c_str());
368 return DCAMERA_BAD_VALUE;
369 }
370
371 std::shared_ptr<DCameraSessionCallback> sessionCallback = std::make_shared<DCameraSessionCallback>(stateCallback_);
372 captureSession_->SetFocusCallback(sessionCallback);
373 captureSession_->SetCallback(sessionCallback);
374
375 int32_t ret = CreateCaptureOutput(captureInfos);
376 if (ret != DCAMERA_OK) {
377 DHLOGE("ConfigCaptureSession create capture output failed, cameraId: %{public}s, ret: %{public}d",
378 GetAnonyString(cameraId_).c_str(), ret);
379 return ret;
380 }
381
382 return ConfigCaptureSessionInner();
383 }
384
ConfigCaptureSessionInner()385 int32_t DCameraClient::ConfigCaptureSessionInner()
386 {
387 int32_t ret = captureSession_->BeginConfig();
388 if (ret != DCAMERA_OK) {
389 DHLOGE("ConfigCaptureSession %{public}s config captureSession failed, ret: %{public}d",
390 GetAnonyString(cameraId_).c_str(), ret);
391 return ret;
392 }
393
394 ret = captureSession_->AddInput(cameraInput_);
395 if (ret != DCAMERA_OK) {
396 DHLOGE("ConfigCaptureSession %{public}s add cameraInput to captureSession failed, ret: %{public}d",
397 GetAnonyString(cameraId_).c_str(), ret);
398 return ret;
399 }
400
401 if (photoOutput_ != nullptr) {
402 ret = captureSession_->AddOutput(photoOutput_);
403 if (ret != DCAMERA_OK) {
404 DHLOGE("ConfigCaptureSession %{public}s add photoOutput to captureSession failed, ret: %{public}d",
405 GetAnonyString(cameraId_).c_str(), ret);
406 return ret;
407 }
408 }
409
410 if (previewOutput_ != nullptr) {
411 ret = captureSession_->AddOutput(previewOutput_);
412 if (ret != DCAMERA_OK) {
413 DHLOGE("ConfigCaptureSession %{public}s add previewOutput to captureSession failed, ret: %{public}d",
414 GetAnonyString(cameraId_).c_str(), ret);
415 return ret;
416 }
417 }
418
419 ret = captureSession_->CommitConfig();
420 if (ret != DCAMERA_OK) {
421 DHLOGE("ConfigCaptureSession %{public}s commit captureSession failed, ret: %{public}d",
422 GetAnonyString(cameraId_).c_str(), ret);
423 return ret;
424 }
425
426 ret = captureSession_->Start();
427 if (ret != DCAMERA_OK) {
428 DHLOGE("ConfigCaptureSession %{public}s start captureSession failed, ret: %{public}d",
429 GetAnonyString(cameraId_).c_str(), ret);
430 }
431
432 DHLOGI("ConfigCaptureSession %{public}s success", GetAnonyString(cameraId_).c_str());
433 return DCAMERA_OK;
434 }
435
CreateCaptureOutput(std::vector<std::shared_ptr<DCameraCaptureInfo>> & captureInfos)436 int32_t DCameraClient::CreateCaptureOutput(std::vector<std::shared_ptr<DCameraCaptureInfo>>& captureInfos)
437 {
438 if (captureInfos.empty()) {
439 DHLOGE("CreateCaptureOutput no capture info, cameraId: %{public}s", GetAnonyString(cameraId_).c_str());
440 return DCAMERA_BAD_VALUE;
441 }
442
443 for (auto& info : captureInfos) {
444 if (info->streamType_ == SNAPSHOT_FRAME) {
445 int32_t ret = CreatePhotoOutput(info);
446 if (ret != DCAMERA_OK) {
447 DHLOGE("CreateCaptureOutput %{public}s create photo output failed, ret: %{public}d",
448 GetAnonyString(cameraId_).c_str(), ret);
449 return ret;
450 }
451 } else if (info->streamType_ == CONTINUOUS_FRAME) {
452 int32_t ret = CreatePreviewOutput(info);
453 if (ret != DCAMERA_OK) {
454 DHLOGE("CreateCaptureOutput %{public}s create video output failed, ret: %{public}d",
455 GetAnonyString(cameraId_).c_str(), ret);
456 return ret;
457 }
458 } else {
459 DHLOGE("CreateCaptureOutput unknown stream type");
460 return DCAMERA_BAD_VALUE;
461 }
462 }
463 return DCAMERA_OK;
464 }
465
CreatePhotoOutput(std::shared_ptr<DCameraCaptureInfo> & info)466 int32_t DCameraClient::CreatePhotoOutput(std::shared_ptr<DCameraCaptureInfo>& info)
467 {
468 DHLOGI("CreatePhotoOutput dhId: %{public}s, width: %{public}d, height: %{public}d, format: %{public}d, stream: "
469 "%{public}d, isCapture: %{public}d", GetAnonyString(cameraId_).c_str(), info->width_, info->height_,
470 info->format_, info->streamType_, info->isCapture_);
471 photoSurface_ = IConsumerSurface::Create();
472 photoListener_ = sptr<DCameraPhotoSurfaceListener>(
473 new DCameraPhotoSurfaceListener(photoSurface_, resultCallback_));
474 photoSurface_->RegisterConsumerListener((sptr<IBufferConsumerListener> &)photoListener_);
475 CameraStandard::CameraFormat photoFormat = ConvertToCameraFormat(info->format_);
476 CameraStandard::Size photoSize = {info->width_, info->height_};
477 CameraStandard::Profile photoProfile(photoFormat, photoSize);
478 sptr<IBufferProducer> bp = photoSurface_->GetProducer();
479 int32_t rv = cameraManager_->CreatePhotoOutput(
480 photoProfile, bp, &((sptr<CameraStandard::PhotoOutput> &)photoOutput_));
481 if (rv != DCAMERA_OK) {
482 DHLOGE("CreatePhotoOutput %{public}s create photo output failed", GetAnonyString(cameraId_).c_str());
483 return DCAMERA_BAD_VALUE;
484 }
485 std::shared_ptr<DCameraPhotoCallback> photoCallback = std::make_shared<DCameraPhotoCallback>(stateCallback_);
486 ((sptr<CameraStandard::PhotoOutput> &)photoOutput_)->SetCallback(photoCallback);
487 DHLOGI("CreatePhotoOutput %{public}s success", GetAnonyString(cameraId_).c_str());
488 return DCAMERA_OK;
489 }
490
CreatePreviewOutput(std::shared_ptr<DCameraCaptureInfo> & info)491 int32_t DCameraClient::CreatePreviewOutput(std::shared_ptr<DCameraCaptureInfo>& info)
492 {
493 DHLOGI("CreatePreviewOutput dhId: %{public}s, width: %{public}d, height: %{public}d, format: %{public}d, stream:"
494 " %{public}d, isCapture: %{public}d", GetAnonyString(cameraId_).c_str(), info->width_, info->height_,
495 info->format_, info->streamType_, info->isCapture_);
496 CameraStandard::CameraFormat previewFormat = ConvertToCameraFormat(info->format_);
497 CameraStandard::Size previewSize = {info->width_, info->height_};
498 CameraStandard::Profile previewProfile(previewFormat, previewSize);
499 int32_t rv = cameraManager_->CreatePreviewOutput(
500 previewProfile, previewSurface_, &((sptr<CameraStandard::PreviewOutput> &)previewOutput_));
501 if (rv != DCAMERA_OK) {
502 DHLOGE("CreatePreviewOutput %{public}s create preview output failed", GetAnonyString(cameraId_).c_str());
503 return DCAMERA_BAD_VALUE;
504 }
505 auto previewCallback = std::make_shared<DCameraPreviewCallback>(stateCallback_);
506 ((sptr<CameraStandard::PreviewOutput> &)previewOutput_)->SetCallback(previewCallback);
507 DHLOGI("CreatePreviewOutput %{public}s success", GetAnonyString(cameraId_).c_str());
508 return DCAMERA_OK;
509 }
510
ConvertToCameraFormat(int32_t format)511 CameraStandard::CameraFormat DCameraClient::ConvertToCameraFormat(int32_t format)
512 {
513 CameraStandard::CameraFormat ret = CameraStandard::CameraFormat::CAMERA_FORMAT_INVALID;
514 DCameraFormat df = static_cast<DCameraFormat>(format);
515 switch (df) {
516 case DCameraFormat::OHOS_CAMERA_FORMAT_RGBA_8888:
517 ret = CameraStandard::CameraFormat::CAMERA_FORMAT_RGBA_8888;
518 break;
519 case DCameraFormat::OHOS_CAMERA_FORMAT_YCBCR_420_888:
520 ret = CameraStandard::CameraFormat::CAMERA_FORMAT_YCBCR_420_888;
521 break;
522 case DCameraFormat::OHOS_CAMERA_FORMAT_YCRCB_420_SP:
523 ret = CameraStandard::CameraFormat::CAMERA_FORMAT_YUV_420_SP;
524 break;
525 case DCameraFormat::OHOS_CAMERA_FORMAT_JPEG:
526 ret = CameraStandard::CameraFormat::CAMERA_FORMAT_JPEG;
527 break;
528 default:
529 break;
530 }
531 return ret;
532 }
533
StartCaptureInner(std::shared_ptr<DCameraCaptureInfo> & info)534 int32_t DCameraClient::StartCaptureInner(std::shared_ptr<DCameraCaptureInfo>& info)
535 {
536 if (info->streamType_ != SNAPSHOT_FRAME) {
537 DHLOGE("StartCaptureInner unknown stream type");
538 return DCAMERA_BAD_VALUE;
539 }
540 return StartPhotoOutput(info);
541 }
542
StartPhotoOutput(std::shared_ptr<DCameraCaptureInfo> & info)543 int32_t DCameraClient::StartPhotoOutput(std::shared_ptr<DCameraCaptureInfo>& info)
544 {
545 DHLOGI("StartPhotoOutput cameraId: %{public}s", GetAnonyString(cameraId_).c_str());
546 if (photoOutput_ == nullptr) {
547 DHLOGE("StartPhotoOutput photoOutput is null");
548 return DCAMERA_BAD_VALUE;
549 }
550
551 std::vector<std::shared_ptr<DCameraSettings>> captureSettings = info->captureSettings_;
552 std::string metadataSetting;
553 for (const auto& setting : captureSettings) {
554 if (setting->type_ == UPDATE_METADATA) {
555 DHLOGI("StartPhotoOutput %{public}s update metadata settings", GetAnonyString(cameraId_).c_str());
556 metadataSetting = setting->value_;
557 }
558 }
559
560 if (metadataSetting.empty()) {
561 DHLOGE("StartPhotoOutput no metadata settings to update");
562 int32_t ret = ((sptr<CameraStandard::PhotoOutput> &)photoOutput_)->Capture();
563 if (ret != DCAMERA_OK) {
564 DHLOGE("StartPhotoOutput %{public}s photoOutput capture failed, ret: %{public}d",
565 GetAnonyString(cameraId_).c_str(), ret);
566 return ret;
567 }
568 return DCAMERA_OK;
569 }
570
571 std::string metadataStr = Base64Decode(metadataSetting);
572 std::shared_ptr<Camera::CameraMetadata> cameraMetadata = Camera::MetadataUtils::DecodeFromString(metadataStr);
573 std::shared_ptr<CameraStandard::PhotoCaptureSetting> photoCaptureSetting =
574 std::make_shared<CameraStandard::PhotoCaptureSetting>();
575 SetPhotoCaptureRotation(cameraMetadata, photoCaptureSetting);
576 SetPhotoCaptureQuality(cameraMetadata, photoCaptureSetting);
577 SetPhotoCaptureLocation(cameraMetadata, photoCaptureSetting);
578 int32_t ret = ((sptr<CameraStandard::PhotoOutput> &)photoOutput_)->Capture(photoCaptureSetting);
579 if (ret != DCAMERA_OK) {
580 DHLOGE("StartPhotoOutput %{public}s photoOutput capture failed, ret: %{public}d",
581 GetAnonyString(cameraId_).c_str(), ret);
582 return ret;
583 }
584 return DCAMERA_OK;
585 }
586
SetPhotoCaptureRotation(const std::shared_ptr<Camera::CameraMetadata> & cameraMetadata,std::shared_ptr<CameraStandard::PhotoCaptureSetting> & photoCaptureSetting)587 void DCameraClient::SetPhotoCaptureRotation(const std::shared_ptr<Camera::CameraMetadata>& cameraMetadata,
588 std::shared_ptr<CameraStandard::PhotoCaptureSetting>& photoCaptureSetting)
589 {
590 CHECK_AND_RETURN_LOG(cameraMetadata == nullptr, "SetPhotoCaptureRotation param cameraMetadata is null");
591 uint32_t rotationCount = 1;
592 camera_metadata_item_t item;
593 int32_t ret = Camera::FindCameraMetadataItem(cameraMetadata->get(), OHOS_JPEG_ORIENTATION, &item);
594 if ((ret == CAM_META_SUCCESS) && (rotationCount == item.count)) {
595 CameraStandard::PhotoCaptureSetting::RotationConfig rotation =
596 static_cast<CameraStandard::PhotoCaptureSetting::RotationConfig>(item.data.i32[0]);
597 photoCaptureSetting->SetRotation(rotation);
598 DHLOGI("SetPhotoCaptureRotation %{public}s photo capture settings set %{public}d rotation: %{public}d",
599 GetAnonyString(cameraId_).c_str(), item.count, rotation);
600 }
601 }
602
SetPhotoCaptureQuality(const std::shared_ptr<Camera::CameraMetadata> & cameraMetadata,std::shared_ptr<CameraStandard::PhotoCaptureSetting> & photoCaptureSetting)603 void DCameraClient::SetPhotoCaptureQuality(const std::shared_ptr<Camera::CameraMetadata>& cameraMetadata,
604 std::shared_ptr<CameraStandard::PhotoCaptureSetting>& photoCaptureSetting)
605 {
606 uint32_t qualityCount = 1;
607 camera_metadata_item_t item;
608 int32_t ret = Camera::FindCameraMetadataItem(cameraMetadata->get(), OHOS_JPEG_QUALITY, &item);
609 if ((ret == CAM_META_SUCCESS) && (qualityCount == item.count)) {
610 CameraStandard::PhotoCaptureSetting::QualityLevel quality =
611 static_cast<CameraStandard::PhotoCaptureSetting::QualityLevel>(item.data.u8[0]);
612 photoCaptureSetting->SetQuality(quality);
613 DHLOGI("SetPhotoCaptureQuality %{public}s photo capture settings set %{public}d quality: %{public}d",
614 GetAnonyString(cameraId_).c_str(), item.count, quality);
615 }
616 }
617
SetPhotoCaptureLocation(const std::shared_ptr<Camera::CameraMetadata> & cameraMetadata,std::shared_ptr<CameraStandard::PhotoCaptureSetting> & photoCaptureSetting)618 void DCameraClient::SetPhotoCaptureLocation(const std::shared_ptr<Camera::CameraMetadata>& cameraMetadata,
619 std::shared_ptr<CameraStandard::PhotoCaptureSetting>& photoCaptureSetting)
620 {
621 uint32_t locationCount = 3;
622 camera_metadata_item_t item;
623 int32_t ret = Camera::FindCameraMetadataItem(cameraMetadata->get(), OHOS_JPEG_GPS_COORDINATES, &item);
624 if ((ret == CAM_META_SUCCESS) && (locationCount == item.count)) {
625 int32_t latitudeIndex = 0;
626 int32_t longitudeIndex = 1;
627 int32_t altitudeIndex = 2;
628 std::shared_ptr<CameraStandard::Location> location = std::make_shared<CameraStandard::Location>();
629 location->latitude = item.data.d[latitudeIndex];
630 location->longitude = item.data.d[longitudeIndex];
631 location->altitude = item.data.d[altitudeIndex];
632 photoCaptureSetting->SetLocation(location);
633 DHLOGI("SetPhotoCaptureLocation %{public}s photo capture settings set %{public}d location: "
634 "latitude=%{public}s, longitude=%{public}s, altitude=%{public}s", GetAnonyString(cameraId_).c_str(),
635 item.count, GetAnonyString(std::to_string(item.data.d[latitudeIndex])).c_str(),
636 GetAnonyString(std::to_string(item.data.d[longitudeIndex])).c_str(),
637 GetAnonyString(std::to_string(item.data.d[altitudeIndex])).c_str());
638 }
639 }
640
PauseCapture()641 int32_t DCameraClient::PauseCapture()
642 {
643 if (captureSession_ == nullptr) {
644 DHLOGE("PauseCapture captureSession_ is nullptr.");
645 return DCAMERA_BAD_VALUE;
646 }
647 int32_t ret = captureSession_->Stop();
648 if (ret != DCAMERA_OK) {
649 DHLOGE("PauseCapture captureSession stop failed, cameraId: %{public}s, ret: %{public}d",
650 GetAnonyString(cameraId_).c_str(), ret);
651 }
652 return ret;
653 }
654
ResumeCapture()655 int32_t DCameraClient::ResumeCapture()
656 {
657 if (captureSession_ == nullptr) {
658 DHLOGE("ResumeCapture captureSession_ is nullptr.");
659 return DCAMERA_BAD_VALUE;
660 }
661 int32_t ret = captureSession_->Start();
662 if (ret != DCAMERA_OK) {
663 DHLOGE("ResumeCapture captureSession Start failed, cameraId: %{public}s, ret: %{public}d",
664 GetAnonyString(cameraId_).c_str(), ret);
665 }
666 return ret;
667 }
668 } // namespace DistributedHardware
669 } // namespace OHOS
670