• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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