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, ¤tIndex);
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