• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 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 "hcamera_device.h"
17 
18 #include "camera_log.h"
19 #include "ipc_skeleton.h"
20 #include "metadata_utils.h"
21 
22 namespace OHOS {
23 namespace CameraStandard {
HCameraDevice(sptr<HCameraHostManager> & cameraHostManager,std::string cameraID,const uint32_t callingTokenId)24 HCameraDevice::HCameraDevice(sptr<HCameraHostManager> &cameraHostManager,
25                              std::string cameraID,
26                              const uint32_t callingTokenId)
27 {
28     MEDIA_INFO_LOG("HCameraDevice::HCameraDevice Contructor Camera: %{public}s", cameraID.c_str());
29     cameraHostManager_ = cameraHostManager;
30     cameraID_ = cameraID;
31     streamOperator_ = nullptr;
32     isReleaseCameraDevice_ = false;
33     isOpenedCameraDevice_ = false;
34     callerToken_ = callingTokenId;
35     deviceOperatorsCallback_ = nullptr;
36 }
37 
~HCameraDevice()38 HCameraDevice::~HCameraDevice()
39 {
40     MEDIA_INFO_LOG("HCameraDevice::~HCameraDevice Destructor Camera: %{public}s", cameraID_.c_str());
41     {
42         std::lock_guard<std::mutex> lock(opMutex_);
43         hdiCameraDevice_ = nullptr;
44         streamOperator_ = nullptr;
45     }
46 
47     if (cameraHostManager_) {
48         cameraHostManager_ = nullptr;
49     }
50     {
51         std::lock_guard<std::mutex> lock(deviceSvcCbMutex_);
52         deviceSvcCallback_ = nullptr;
53     }
54 
55     deviceOperatorsCallback_ = nullptr;
56 }
57 
GetCameraId()58 std::string HCameraDevice::GetCameraId()
59 {
60     return cameraID_;
61 }
62 
SetReleaseCameraDevice(bool isRelease)63 int32_t HCameraDevice::SetReleaseCameraDevice(bool isRelease)
64 {
65     isReleaseCameraDevice_ = isRelease;
66     return CAMERA_OK;
67 }
68 
IsReleaseCameraDevice()69 bool HCameraDevice::IsReleaseCameraDevice()
70 {
71     return isReleaseCameraDevice_;
72 }
73 
IsOpenedCameraDevice()74 bool HCameraDevice::IsOpenedCameraDevice()
75 {
76     return isOpenedCameraDevice_;
77 }
78 
GetSettings()79 std::shared_ptr<OHOS::Camera::CameraMetadata> HCameraDevice::GetSettings()
80 {
81     int32_t errCode;
82     std::shared_ptr<OHOS::Camera::CameraMetadata> ability = nullptr;
83     errCode = cameraHostManager_->GetCameraAbility(cameraID_, ability);
84     if (errCode != CAMERA_OK) {
85         MEDIA_ERR_LOG("HCameraDevice::GetSettings Failed to get Camera Ability: %{public}d", errCode);
86         return nullptr;
87     }
88     int32_t* pos = nullptr;
89     int32_t videoFrameRateRangeSize;
90     {
91         std::lock_guard<std::mutex> lock(videoFrameRangeMutex_);
92         videoFrameRateRangeSize = videoFrameRateRange_.size();
93         if (videoFrameRateRangeSize != 0) {
94             pos = videoFrameRateRange_.data();
95         }
96     }
97     if (videoFrameRateRangeSize != 0 && ability != nullptr) {
98         bool status = false;
99         camera_metadata_item_t item;
100         int ret = OHOS::Camera::FindCameraMetadataItem(ability->get(), OHOS_CONTROL_FPS_RANGES, &item);
101         if (ret == CAM_META_ITEM_NOT_FOUND) {
102             status = ability->addEntry(OHOS_CONTROL_FPS_RANGES, pos, videoFrameRateRangeSize);
103         } else if (ret == CAM_META_SUCCESS) {
104             status = ability->updateEntry(OHOS_CONTROL_FPS_RANGES, pos, videoFrameRateRangeSize);
105         }
106         if (!status) {
107             MEDIA_ERR_LOG("HCameraDevice::Set fps renges Failed");
108         }
109     }
110     return ability;
111 }
112 
Open()113 int32_t HCameraDevice::Open()
114 {
115     CAMERA_SYNC_TRACE;
116     if (isOpenedCameraDevice_) {
117         MEDIA_ERR_LOG("HCameraDevice::Open failed, camera is busy");
118     }
119     uint32_t callerToken = IPCSkeleton::GetCallingTokenID();
120     if (callerToken_ != callerToken) {
121         MEDIA_ERR_LOG("Failed to Open camera, createCamera token is : %{public}d, now token is %{public}d",
122             callerToken_, callerToken);
123         return CAMERA_OPERATION_NOT_ALLOWED;
124     }
125     bool isAllowed = true;
126     if (IsValidTokenId(callerToken)) {
127         isAllowed = Security::AccessToken::PrivacyKit::IsAllowedUsingPermission(callerToken, OHOS_PERMISSION_CAMERA);
128     }
129     if (!isAllowed) {
130         MEDIA_ERR_LOG("HCameraDevice::Open IsAllowedUsingPermission failed");
131         return CAMERA_ALLOC_ERROR;
132     }
133 
134     if (deviceOperatorsCallback_.promote() == nullptr) {
135         MEDIA_ERR_LOG("HCameraDevice::Close there is no device operator callback");
136         return CAMERA_ALLOC_ERROR;
137     }
138 
139     MEDIA_INFO_LOG("HCameraDevice::Open Camera:[%{public}s", cameraID_.c_str());
140     return deviceOperatorsCallback_->DeviceOpen(cameraID_);
141 }
142 
Close()143 int32_t HCameraDevice::Close()
144 {
145     CAMERA_SYNC_TRACE;
146     MEDIA_INFO_LOG("HCameraDevice::Close Closing camera device: %{public}s", cameraID_.c_str());
147     if (deviceOperatorsCallback_.promote() == nullptr) {
148         MEDIA_ERR_LOG("HCameraDevice::Close there is no device operator callback");
149         return CAMERA_OPERATION_NOT_ALLOWED;
150     }
151     return deviceOperatorsCallback_->DeviceClose(cameraID_);
152 }
153 
OpenDevice()154 int32_t HCameraDevice::OpenDevice()
155 {
156     CAMERA_SYNC_TRACE;
157     int32_t errorCode;
158     MEDIA_INFO_LOG("HCameraDevice::OpenDevice Opening camera device: %{public}s", cameraID_.c_str());
159     std::lock_guard<std::mutex> lock(opMutex_);
160     errorCode = cameraHostManager_->OpenCameraDevice(cameraID_, this, hdiCameraDevice_);
161     if (errorCode == CAMERA_OK) {
162         isOpenedCameraDevice_ = true;
163         if (updateSettings_ != nullptr && hdiCameraDevice_ != nullptr) {
164             std::vector<uint8_t> setting;
165             OHOS::Camera::MetadataUtils::ConvertMetadataToVec(updateSettings_, setting);
166             CamRetCode rc = (CamRetCode)(hdiCameraDevice_->UpdateSettings(setting));
167             if (rc != HDI::Camera::V1_0::NO_ERROR) {
168                 MEDIA_ERR_LOG("HCameraDevice::OpenDevice Update setting failed with error Code: %{public}d", rc);
169                 return HdiToServiceError(rc);
170             }
171             updateSettings_ = nullptr;
172             MEDIA_DEBUG_LOG("HCameraDevice::Open Updated device settings");
173 
174             errorCode = HdiToServiceError((CamRetCode)(hdiCameraDevice_->SetResultMode(ON_CHANGED)));
175             cameraHostManager_->AddCameraDevice(cameraID_, this);
176         }
177     } else {
178         MEDIA_ERR_LOG("HCameraDevice::OpenDevice Failed to open camera");
179     }
180     return errorCode;
181 }
182 
CloseDevice()183 int32_t HCameraDevice::CloseDevice()
184 {
185     CAMERA_SYNC_TRACE;
186     {
187         std::lock_guard<std::mutex> lock(opMutex_);
188         if (hdiCameraDevice_ != nullptr) {
189             MEDIA_INFO_LOG("HCameraDevice::CloseDevice Closing camera device: %{public}s", cameraID_.c_str());
190             hdiCameraDevice_->Close();
191             isOpenedCameraDevice_ = false;
192             hdiCameraDevice_ = nullptr;
193         }
194         if (streamOperator_) {
195             streamOperator_ = nullptr;
196         }
197     }
198 
199     if (cameraHostManager_) {
200         cameraHostManager_->RemoveCameraDevice(cameraID_);
201     }
202     std::lock_guard<std::mutex> lock(deviceSvcCbMutex_);
203     deviceSvcCallback_ = nullptr;
204     return CAMERA_OK;
205 }
206 
Release()207 int32_t HCameraDevice::Release()
208 {
209     Close();
210     return CAMERA_OK;
211 }
212 
GetEnabledResults(std::vector<int32_t> & results)213 int32_t HCameraDevice::GetEnabledResults(std::vector<int32_t> &results)
214 {
215     std::lock_guard<std::mutex> lock(opMutex_);
216     if (hdiCameraDevice_) {
217         CamRetCode rc = (CamRetCode)(hdiCameraDevice_->GetEnabledResults(results));
218         if (rc != HDI::Camera::V1_0::NO_ERROR) {
219             MEDIA_ERR_LOG("HCameraDevice::GetEnabledResults failed with error Code:%{public}d", rc);
220             return HdiToServiceError(rc);
221         }
222     } else {
223         MEDIA_ERR_LOG("HCameraDevice::GetEnabledResults GetEnabledResults hdiCameraDevice_ is nullptr");
224         return CAMERA_UNKNOWN_ERROR;
225     }
226     return CAMERA_OK;
227 }
228 
UpdateSetting(const std::shared_ptr<OHOS::Camera::CameraMetadata> & settings)229 int32_t HCameraDevice::UpdateSetting(const std::shared_ptr<OHOS::Camera::CameraMetadata> &settings)
230 {
231     CAMERA_SYNC_TRACE;
232     if (settings == nullptr) {
233         MEDIA_ERR_LOG("settings is null");
234         return CAMERA_INVALID_ARG;
235     }
236 
237     uint32_t count = OHOS::Camera::GetCameraMetadataItemCount(settings->get());
238     if (!count) {
239         MEDIA_DEBUG_LOG("Nothing to update");
240         return CAMERA_OK;
241     }
242     std::lock_guard<std::mutex> lock(opMutex_);
243     if (updateSettings_) {
244         camera_metadata_item_t metadataItem;
245         for (uint32_t index = 0; index < count; index++) {
246             int ret = OHOS::Camera::GetCameraMetadataItem(settings->get(), index, &metadataItem);
247             if (ret != CAM_META_SUCCESS) {
248                 MEDIA_ERR_LOG("Failed to get metadata item at index: %{public}d", index);
249                 return CAMERA_INVALID_ARG;
250             }
251             bool status = false;
252             uint32_t currentIndex;
253             ret = OHOS::Camera::FindCameraMetadataItemIndex(updateSettings_->get(), metadataItem.item, &currentIndex);
254             if (ret == CAM_META_ITEM_NOT_FOUND) {
255                 status = updateSettings_->addEntry(metadataItem.item, metadataItem.data.u8, metadataItem.count);
256             } else if (ret == CAM_META_SUCCESS) {
257                 status = updateSettings_->updateEntry(metadataItem.item, metadataItem.data.u8, metadataItem.count);
258             }
259             if (!status) {
260                 MEDIA_ERR_LOG("Failed to update metadata item: %{public}d", metadataItem.item);
261                 return CAMERA_UNKNOWN_ERROR;
262             }
263         }
264     } else {
265         updateSettings_ = settings;
266     }
267     if (hdiCameraDevice_ != nullptr) {
268         std::vector<uint8_t> setting;
269         OHOS::Camera::MetadataUtils::ConvertMetadataToVec(updateSettings_, setting);
270         ReportMetadataDebugLog(updateSettings_);
271         GetFrameRateSetting(updateSettings_);
272 
273         CamRetCode rc = (CamRetCode)(hdiCameraDevice_->UpdateSettings(setting));
274         if (rc != HDI::Camera::V1_0::NO_ERROR) {
275             MEDIA_ERR_LOG("Failed with error Code: %{public}d", rc);
276             return HdiToServiceError(rc);
277         }
278         ReportFlashEvent(updateSettings_);
279         updateSettings_ = nullptr;
280     }
281     MEDIA_DEBUG_LOG("Updated device settings");
282     return CAMERA_OK;
283 }
284 
ReportMetadataDebugLog(const std::shared_ptr<OHOS::Camera::CameraMetadata> & settings)285 void HCameraDevice::ReportMetadataDebugLog(const std::shared_ptr<OHOS::Camera::CameraMetadata> &settings)
286 {
287     // debug log for focus mode
288     camera_metadata_item_t item;
289     int ret = OHOS::Camera::FindCameraMetadataItem(settings->get(), OHOS_CONTROL_FOCUS_MODE, &item);
290     if (ret != CAM_META_SUCCESS) {
291         MEDIA_DEBUG_LOG("HCameraDevice::Failed to find OHOS_CONTROL_FOCUS_MODE tag");
292     } else {
293         MEDIA_DEBUG_LOG("HCameraDevice::find OHOS_CONTROL_FOCUS_MODE value = %{public}d", item.data.u8[0]);
294     }
295 
296     // debug log for af regions
297     ret = OHOS::Camera::FindCameraMetadataItem(settings->get(), OHOS_CONTROL_AF_REGIONS, &item);
298     if (ret != CAM_META_SUCCESS) {
299         MEDIA_DEBUG_LOG("HCameraDevice::Failed to find OHOS_CONTROL_AF_REGIONS tag");
300     } else {
301         MEDIA_DEBUG_LOG("HCameraDevice::find OHOS_CONTROL_AF_REGIONS x = %{public}f, y = %{public}f",
302             item.data.f[0], item.data.f[1]);
303     }
304 
305     // debug log for af regions
306     ret = OHOS::Camera::FindCameraMetadataItem(settings->get(),
307         OHOS_CONTROL_VIDEO_STABILIZATION_MODE, &item);
308     if (ret != CAM_META_SUCCESS) {
309         MEDIA_DEBUG_LOG("HCameraDevice::Failed to find OHOS_CONTROL_VIDEO_STABILIZATION_MODE tag");
310     } else {
311         MEDIA_DEBUG_LOG("HCameraDevice::find OHOS_CONTROL_VIDEO_STABILIZATION_MODE value = %{public}d",
312             item.data.u8[0]);
313     }
314 
315     // debug log for exposure mode
316     ret = OHOS::Camera::FindCameraMetadataItem(settings->get(), OHOS_CONTROL_EXPOSURE_MODE, &item);
317     if (ret != CAM_META_SUCCESS) {
318         MEDIA_DEBUG_LOG("HCameraDevice::Failed to find OHOS_CONTROL_EXPOSURE_MODE tag");
319     } else {
320         MEDIA_DEBUG_LOG("HCameraDevice::find OHOS_CONTROL_EXPOSURE_MODE value = %{public}d", item.data.u8[0]);
321     }
322 
323     // debug log for ae regions
324     ret = OHOS::Camera::FindCameraMetadataItem(settings->get(), OHOS_CONTROL_AE_REGIONS, &item);
325     if (ret != CAM_META_SUCCESS) {
326         MEDIA_DEBUG_LOG("HCameraDevice::Failed to find OHOS_CONTROL_AE_REGIONS tag");
327     } else {
328         MEDIA_DEBUG_LOG("HCameraDevice::find OHOS_CONTROL_AE_REGIONS x = %{public}f, y = %{public}f",
329             item.data.f[0], item.data.f[1]);
330     }
331 
332     // debug log for ae exposure compensation
333     ret = OHOS::Camera::FindCameraMetadataItem(settings->get(),
334         OHOS_CONTROL_AE_EXPOSURE_COMPENSATION, &item);
335     if (ret != CAM_META_SUCCESS) {
336         MEDIA_DEBUG_LOG("HCameraDevice::Failed to find OHOS_CONTROL_AE_EXPOSURE_COMPENSATION tag");
337     } else {
338         MEDIA_DEBUG_LOG("HCameraDevice::find OHOS_CONTROL_AE_EXPOSURE_COMPENSATION value = %{public}d",
339             item.data.u8[0]);
340     }
341 }
342 
GetFrameRateSetting(const std::shared_ptr<OHOS::Camera::CameraMetadata> & settings)343 void HCameraDevice::GetFrameRateSetting(const std::shared_ptr<OHOS::Camera::CameraMetadata> &settings)
344 {
345     camera_metadata_item_t item;
346     int ret = OHOS::Camera::FindCameraMetadataItem(settings->get(), OHOS_CONTROL_FPS_RANGES, &item);
347     if (ret != CAM_META_SUCCESS) {
348         MEDIA_DEBUG_LOG("HCameraDevice::Failed to find OHOS_CONTROL_FPS_RANGES tag");
349     } else {
350         std::lock_guard<std::mutex> lock(videoFrameRangeMutex_);
351         videoFrameRateRange_ = {item.data.i32[0], item.data.i32[1]};
352         MEDIA_DEBUG_LOG("HCameraDevice::find OHOS_CONTROL_FPS_RANGES min = %{public}d, max = %{public}d",
353             item.data.i32[0], item.data.i32[1]);
354     }
355 }
356 
ReportFlashEvent(const std::shared_ptr<OHOS::Camera::CameraMetadata> & settings)357 void HCameraDevice::ReportFlashEvent(const std::shared_ptr<OHOS::Camera::CameraMetadata> &settings)
358 {
359     camera_metadata_item_t item;
360     camera_flash_mode_enum_t flashMode = OHOS_CAMERA_FLASH_MODE_ALWAYS_OPEN;
361     int ret = OHOS::Camera::FindCameraMetadataItem(settings->get(), OHOS_CONTROL_FLASH_MODE, &item);
362     if (ret == CAM_META_SUCCESS) {
363         flashMode = static_cast<camera_flash_mode_enum_t>(item.data.u8[0]);
364     } else {
365         MEDIA_ERR_LOG("CameraInput::GetFlashMode Failed with return code %{public}d", ret);
366     }
367 
368     if (flashMode == OHOS_CAMERA_FLASH_MODE_CLOSE) {
369         POWERMGR_SYSEVENT_FLASH_OFF();
370     } else {
371         POWERMGR_SYSEVENT_FLASH_ON();
372     }
373 }
374 
EnableResult(std::vector<int32_t> & results)375 int32_t HCameraDevice::EnableResult(std::vector<int32_t> &results)
376 {
377     if (results.empty()) {
378         MEDIA_ERR_LOG("HCameraDevice::EnableResult results vector empty");
379         return CAMERA_INVALID_ARG;
380     }
381     std::lock_guard<std::mutex> lock(opMutex_);
382     if (hdiCameraDevice_ == nullptr) {
383         MEDIA_ERR_LOG("HCameraDevice::hdiCameraDevice_ is null");
384         return CAMERA_UNKNOWN_ERROR;
385     }
386 
387     CamRetCode rc = (CamRetCode)(hdiCameraDevice_->EnableResult(results));
388     if (rc != HDI::Camera::V1_0::NO_ERROR) {
389         MEDIA_ERR_LOG("HCameraDevice::EnableResult failed with error Code:%{public}d", rc);
390         return HdiToServiceError(rc);
391     }
392 
393     return CAMERA_OK;
394 }
395 
DisableResult(std::vector<int32_t> & results)396 int32_t HCameraDevice::DisableResult(std::vector<int32_t> &results)
397 {
398     if (results.empty()) {
399         MEDIA_ERR_LOG("HCameraDevice::DisableResult results vector empty");
400         return CAMERA_INVALID_ARG;
401     }
402     std::lock_guard<std::mutex> lock(opMutex_);
403     if (hdiCameraDevice_ == nullptr) {
404         MEDIA_ERR_LOG("HCameraDevice::hdiCameraDevice_ is null");
405         return CAMERA_UNKNOWN_ERROR;
406     }
407 
408     CamRetCode rc = (CamRetCode)(hdiCameraDevice_->DisableResult(results));
409     if (rc != HDI::Camera::V1_0::NO_ERROR) {
410         MEDIA_ERR_LOG("HCameraDevice::DisableResult failed with error Code:%{public}d", rc);
411         return HdiToServiceError(rc);
412     }
413     return CAMERA_OK;
414 }
415 
SetCallback(sptr<ICameraDeviceServiceCallback> & callback)416 int32_t HCameraDevice::SetCallback(sptr<ICameraDeviceServiceCallback> &callback)
417 {
418     if (callback == nullptr) {
419         MEDIA_ERR_LOG("HCameraDevice::SetCallback callback is null");
420         return CAMERA_INVALID_ARG;
421     }
422     std::lock_guard<std::mutex> lock(deviceSvcCbMutex_);
423     deviceSvcCallback_ = callback;
424     return CAMERA_OK;
425 }
426 
GetStreamOperator(sptr<IStreamOperatorCallback> callback,sptr<OHOS::HDI::Camera::V1_1::IStreamOperator> & streamOperator)427 int32_t HCameraDevice::GetStreamOperator(sptr<IStreamOperatorCallback> callback,
428     sptr<OHOS::HDI::Camera::V1_1::IStreamOperator> &streamOperator)
429 {
430     if (callback == nullptr) {
431         MEDIA_ERR_LOG("HCameraDevice::GetStreamOperator callback is null");
432         return CAMERA_INVALID_ARG;
433     }
434     std::lock_guard<std::mutex> lock(opMutex_);
435     if (hdiCameraDevice_ == nullptr) {
436         MEDIA_ERR_LOG("HCameraDevice::hdiCameraDevice_ is null");
437         return CAMERA_UNKNOWN_ERROR;
438     }
439     CamRetCode rc;
440     if (GetVersionId(1, 1) == cameraHostManager_->GetVersionByCamera(cameraID_)) {
441         rc = (CamRetCode)(hdiCameraDevice_->GetStreamOperator_V1_1(callback, streamOperator));
442     } else {
443         sptr<IStreamOperator> tempStreamOperator;
444         rc = (CamRetCode)(hdiCameraDevice_->GetStreamOperator(callback, tempStreamOperator));
445         // static_cast to V1.1
446         streamOperator = static_cast<OHOS::HDI::Camera::V1_1::IStreamOperator *>(tempStreamOperator.GetRefPtr());
447     }
448 
449     if (rc != HDI::Camera::V1_0::NO_ERROR) {
450         MEDIA_ERR_LOG("HCameraDevice::GetStreamOperator failed with error Code:%{public}d", rc);
451         return HdiToServiceError(rc);
452     }
453     streamOperator_ = streamOperator;
454     return CAMERA_OK;
455 }
456 
SetDeviceOperatorsCallback(wptr<IDeviceOperatorsCallback> callback)457 int32_t HCameraDevice::SetDeviceOperatorsCallback(wptr<IDeviceOperatorsCallback> callback)
458 {
459     if (callback.promote() == nullptr) {
460         MEDIA_ERR_LOG("HCameraDevice::SetDeviceOperatorsCallback callback is null");
461         return CAMERA_INVALID_ARG;
462     }
463     deviceOperatorsCallback_ = callback;
464     return CAMERA_OK;
465 }
466 
GetStreamOperator()467 sptr<OHOS::HDI::Camera::V1_1::IStreamOperator> HCameraDevice::GetStreamOperator()
468 {
469     std::lock_guard<std::mutex> lock(opMutex_);
470     return streamOperator_;
471 }
472 
OnError(const ErrorType type,const int32_t errorMsg)473 int32_t HCameraDevice::OnError(const ErrorType type, const int32_t errorMsg)
474 {
475     std::lock_guard<std::mutex> lock(deviceSvcCbMutex_);
476     if (deviceSvcCallback_ != nullptr) {
477         int32_t errorType;
478         if (type == REQUEST_TIMEOUT) {
479             errorType = CAMERA_DEVICE_REQUEST_TIMEOUT;
480         } else if (type == DEVICE_PREEMPT) {
481             errorType = CAMERA_DEVICE_PREEMPTED;
482         } else {
483             errorType = CAMERA_UNKNOWN_ERROR;
484         }
485         deviceSvcCallback_->OnError(errorType, errorMsg);
486         CAMERA_SYSEVENT_FAULT(CreateMsg("CameraDeviceServiceCallback::OnError() is called!, errorType: %d,"
487                                         "errorMsg: %d", errorType, errorMsg));
488     }
489     return CAMERA_OK;
490 }
491 
OnResult(const uint64_t timestamp,const std::vector<uint8_t> & result)492 int32_t HCameraDevice::OnResult(const uint64_t timestamp, const std::vector<uint8_t>& result)
493 {
494     std::shared_ptr<OHOS::Camera::CameraMetadata> cameraResult = nullptr;
495     OHOS::Camera::MetadataUtils::ConvertVecToMetadata(result, cameraResult);
496 
497     std::lock_guard<std::mutex> lock(deviceSvcCbMutex_);
498     if (deviceSvcCallback_ != nullptr) {
499         deviceSvcCallback_->OnResult(timestamp, cameraResult);
500     }
501     if (cameraResult != nullptr) {
502         camera_metadata_item_t item;
503         common_metadata_header_t* metadata = cameraResult->get();
504         int ret = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_CONTROL_FLASH_MODE, &item);
505         if (ret == 0) {
506             MEDIA_DEBUG_LOG("CameraDeviceServiceCallback::OnResult() OHOS_CONTROL_FLASH_MODE is %{public}d",
507                             item.data.u8[0]);
508         }
509         ret = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_CONTROL_FLASH_STATE, &item);
510         if (ret == 0) {
511             MEDIA_DEBUG_LOG("CameraDeviceServiceCallback::OnResult() OHOS_CONTROL_FLASH_STATE is %{public}d",
512                             item.data.u8[0]);
513         }
514 
515         ret = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_CONTROL_FOCUS_MODE, &item);
516         if (ret == CAM_META_SUCCESS) {
517             MEDIA_DEBUG_LOG("Focus mode: %{public}d", item.data.u8[0]);
518         }
519         ret = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_CONTROL_FOCUS_STATE, &item);
520         if (ret == CAM_META_SUCCESS) {
521             MEDIA_DEBUG_LOG("Focus state: %{public}d", item.data.u8[0]);
522         }
523     } else {
524         MEDIA_ERR_LOG("HCameraDevice::OnResult cameraResult is nullptr");
525     }
526     return CAMERA_OK;
527 }
528 
GetCallerToken()529 int32_t HCameraDevice::GetCallerToken()
530 {
531     return callerToken_;
532 }
533 } // namespace CameraStandard
534 } // namespace OHOS
535