1 /*
2 * Copyright (c) 2021-2022 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 "input/camera_input.h"
17
18 #include <cinttypes>
19 #include <cstdint>
20 #include <mutex>
21 #include <securec.h>
22 #include "camera_device.h"
23 #include "camera_device_ability_items.h"
24 #include "camera_log.h"
25 #include "camera_manager.h"
26 #include "camera_util.h"
27 #include "icamera_util.h"
28 #include "metadata_utils.h"
29 #include "metadata_common_utils.h"
30 #include "timer.h"
31 #include "time_broker.h"
32
33 namespace OHOS {
34 namespace CameraStandard {
35 using OHOS::HDI::Camera::V1_3::OperationMode;
OnError(const int32_t errorType,const int32_t errorMsg)36 int32_t CameraDeviceServiceCallback::OnError(const int32_t errorType, const int32_t errorMsg)
37 {
38 std::lock_guard<std::mutex> lock(deviceCallbackMutex_);
39 auto camInputSptr = camInput_.promote();
40 MEDIA_ERR_LOG("CameraDeviceServiceCallback::OnError() is called!, errorType: %{public}d, errorMsg: %{public}d",
41 errorType, errorMsg);
42 if (camInputSptr != nullptr && camInputSptr->GetErrorCallback() != nullptr) {
43 int32_t serviceErrorType = ServiceToCameraError(errorType);
44 camInputSptr->GetErrorCallback()->OnError(serviceErrorType, errorMsg);
45 } else {
46 MEDIA_INFO_LOG("CameraDeviceServiceCallback::ErrorCallback not set!, Discarding callback");
47 }
48 return CAMERA_OK;
49 }
50
OnResult(const uint64_t timestamp,const std::shared_ptr<OHOS::Camera::CameraMetadata> & result)51 int32_t CameraDeviceServiceCallback::OnResult(const uint64_t timestamp,
52 const std::shared_ptr<OHOS::Camera::CameraMetadata> &result)
53 {
54 CHECK_ERROR_RETURN_RET_LOG(result == nullptr, CAMERA_INVALID_ARG, "OnResult get null meta from server");
55 std::lock_guard<std::mutex> lock(deviceCallbackMutex_);
56 auto camInputSptr = camInput_.promote();
57 CHECK_ERROR_RETURN_RET_LOG(camInputSptr == nullptr, CAMERA_OK,
58 "CameraDeviceServiceCallback::OnResult() camInput_ is null!");
59 auto cameraObject = camInputSptr->GetCameraDeviceInfo();
60 if (cameraObject == nullptr) {
61 MEDIA_ERR_LOG("CameraDeviceServiceCallback::OnResult() camInput_->GetCameraDeviceInfo() is null!");
62 } else {
63 MEDIA_DEBUG_LOG("CameraDeviceServiceCallback::OnResult()"
64 "is called!, cameraId: %{public}s, timestamp: %{public}"
65 PRIu64, cameraObject->GetID().c_str(), timestamp);
66 }
67 CHECK_EXECUTE(camInputSptr->GetResultCallback() != nullptr,
68 camInputSptr->GetResultCallback()->OnResult(timestamp, result));
69
70 auto pfnOcclusionDetectCallback = camInputSptr->GetOcclusionDetectCallback();
71 if (pfnOcclusionDetectCallback != nullptr) {
72 camera_metadata_item itemOcclusion;
73 int32_t retOcclusion = OHOS::Camera::FindCameraMetadataItem(result->get(),
74 OHOS_STATUS_CAMERA_OCCLUSION_DETECTION, &itemOcclusion);
75 bool foundOcclusion = (retOcclusion == CAM_META_SUCCESS && itemOcclusion.count != 0);
76 uint8_t occlusion = foundOcclusion ? static_cast<uint8_t>(itemOcclusion.data.i32[0]) : 0;
77
78 camera_metadata_item itemLensDirty;
79 int32_t retLensDirty = OHOS::Camera::FindCameraMetadataItem(result->get(),
80 OHOS_STATUS_CAMERA_LENS_DIRTY_DETECTION, &itemLensDirty);
81 bool foundLensDirty = (retLensDirty == CAM_META_SUCCESS && itemLensDirty.count != 0);
82 uint8_t lensDirty = foundLensDirty ? itemLensDirty.data.u8[0] : 0;
83
84 if (foundOcclusion || foundLensDirty) {
85 MEDIA_DEBUG_LOG("occlusion found:%{public}d val:%{public}u; lensDirty found:%{public}d val:%{public}u",
86 foundOcclusion, occlusion, foundLensDirty, lensDirty);
87 pfnOcclusionDetectCallback->OnCameraOcclusionDetected(occlusion, lensDirty);
88 }
89 }
90
91 camInputSptr->ProcessCallbackUpdates(timestamp, result);
92 return CAMERA_OK;
93 }
94
CameraInput(sptr<ICameraDeviceService> & deviceObj,sptr<CameraDevice> & cameraObj)95 CameraInput::CameraInput(sptr<ICameraDeviceService> &deviceObj,
96 sptr<CameraDevice> &cameraObj) : deviceObj_(deviceObj), cameraObj_(cameraObj)
97 {
98 MEDIA_INFO_LOG("CameraInput::CameraInput Contructor!");
99 InitCameraInput();
100 }
101
GetMetadataFromService(sptr<CameraDevice> & device)102 void CameraInput::GetMetadataFromService(sptr<CameraDevice> &device)
103 {
104 CHECK_ERROR_RETURN_LOG(device == nullptr, "GetMetadataFromService device is nullptr");
105 auto cameraId = device->GetID();
106 auto serviceProxy = CameraManager::GetInstance()->GetServiceProxy();
107 CHECK_ERROR_RETURN_LOG(serviceProxy == nullptr, "GetMetadataFromService serviceProxy is null");
108 std::shared_ptr<OHOS::Camera::CameraMetadata> metaData;
109 serviceProxy->GetCameraAbility(cameraId, metaData);
110 CHECK_ERROR_RETURN_LOG(metaData == nullptr,
111 "GetMetadataFromService GetDeviceMetadata failed");
112 device->AddMetadata(metaData);
113 }
InitCameraInput()114 void CameraInput::InitCameraInput()
115 {
116 auto cameraObj = GetCameraDeviceInfo();
117 auto deviceObj = GetCameraDevice();
118 if (cameraObj) {
119 MEDIA_INFO_LOG("CameraInput::CameraInput Contructor Camera: %{public}s", cameraObj->GetID().c_str());
120 GetMetadataFromService(cameraObj);
121 }
122 CameraDeviceSvcCallback_ = new(std::nothrow) CameraDeviceServiceCallback(this);
123 CHECK_ERROR_RETURN_LOG(CameraDeviceSvcCallback_ == nullptr, "Failed to new CameraDeviceSvcCallback_!");
124 CHECK_ERROR_RETURN_LOG(!deviceObj, "CameraInput::CameraInput() deviceObj is nullptr");
125 deviceObj->SetCallback(CameraDeviceSvcCallback_);
126 sptr<IRemoteObject> object = deviceObj->AsObject();
127 CHECK_ERROR_RETURN(object == nullptr);
128 pid_t pid = 0;
129 deathRecipient_ = new(std::nothrow) CameraDeathRecipient(pid);
130 CHECK_ERROR_RETURN_LOG(deathRecipient_ == nullptr, "failed to new CameraDeathRecipient.");
131 auto thisPtr = wptr<CameraInput>(this);
132 deathRecipient_->SetNotifyCb([thisPtr](pid_t pid) {
133 auto ptr = thisPtr.promote();
134 CHECK_EXECUTE(ptr != nullptr, ptr->CameraServerDied(pid));
135 });
136 bool result = object->AddDeathRecipient(deathRecipient_);
137 CHECK_ERROR_RETURN_LOG(!result, "CameraInput::CameraInput failed to add deathRecipient");
138 CameraTimer::GetInstance()->IncreaseUserCount();
139 }
140
CameraServerDied(pid_t pid)141 void CameraInput::CameraServerDied(pid_t pid)
142 {
143 MEDIA_ERR_LOG("camera server has died, pid:%{public}d!", pid);
144 {
145 std::lock_guard<std::mutex> errLock(errorCallbackMutex_);
146 if (errorCallback_ != nullptr) {
147 MEDIA_DEBUG_LOG("appCallback not nullptr");
148 int32_t serviceErrorType = ServiceToCameraError(CAMERA_INVALID_STATE);
149 int32_t serviceErrorMsg = 0;
150 MEDIA_DEBUG_LOG("serviceErrorType:%{public}d!, serviceErrorMsg:%{public}d!", serviceErrorType,
151 serviceErrorMsg);
152 errorCallback_->OnError(serviceErrorType, serviceErrorMsg);
153 }
154 }
155 std::lock_guard<std::mutex> interfaceLock(interfaceMutex_);
156 InputRemoveDeathRecipient();
157 }
158
InputRemoveDeathRecipient()159 void CameraInput::InputRemoveDeathRecipient()
160 {
161 auto deviceObj = GetCameraDevice();
162 if (deviceObj != nullptr) {
163 (void)deviceObj->AsObject()->RemoveDeathRecipient(deathRecipient_);
164 SetCameraDevice(nullptr);
165 }
166 deathRecipient_ = nullptr;
167 }
168
~CameraInput()169 CameraInput::~CameraInput()
170 {
171 MEDIA_INFO_LOG("CameraInput::CameraInput Destructor!");
172 UnregisterTime();
173 CameraTimer::GetInstance()->DecreaseUserCount();
174 std::lock_guard<std::mutex> lock(interfaceMutex_);
175 if (cameraObj_) {
176 MEDIA_INFO_LOG("CameraInput::CameraInput Destructor Camera: %{public}s", cameraObj_->GetID().c_str());
177 }
178 InputRemoveDeathRecipient();
179 }
180
Open()181 int CameraInput::Open()
182 {
183 std::lock_guard<std::mutex> lock(interfaceMutex_);
184 UnregisterTime();
185 MEDIA_DEBUG_LOG("Enter Into CameraInput::Open");
186 int32_t retCode = CAMERA_UNKNOWN_ERROR;
187 auto deviceObj = GetCameraDevice();
188 if (deviceObj) {
189 retCode = deviceObj->Open();
190 CHECK_ERROR_PRINT_LOG(retCode != CAMERA_OK, "Failed to open Camera Input, retCode: %{public}d", retCode);
191 } else {
192 MEDIA_ERR_LOG("CameraInput::Open() deviceObj is nullptr");
193 }
194 return ServiceToCameraError(retCode);
195 }
196
197 const std::unordered_map<CameraPosition, camera_position_enum_t> fwToMetaCameraPosition_ = {
198 {CAMERA_POSITION_FRONT, OHOS_CAMERA_POSITION_FRONT},
199 {CAMERA_POSITION_BACK, OHOS_CAMERA_POSITION_BACK},
200 {CAMERA_POSITION_UNSPECIFIED, OHOS_CAMERA_POSITION_OTHER}
201 };
202
203 // LCOV_EXCL_START
Open(int32_t cameraConcurrentType)204 int CameraInput::Open(int32_t cameraConcurrentType)
205 {
206 std::lock_guard<std::mutex> lock(interfaceMutex_);
207 MEDIA_INFO_LOG("Enter Into CameraInput::Open with CameraConcurrentType"
208 " CameraConcurrentType = %{public}d", cameraConcurrentType);
209 int32_t retCode = CAMERA_UNKNOWN_ERROR;
210 auto deviceObj = GetCameraDevice();
211 auto cameraObject = GetCameraDeviceInfo();
212
213 CameraPosition cameraPosition = cameraObject->GetPosition();
214 auto cameraServiceOnly = CameraManager::GetInstance()->GetServiceProxy();
215 CHECK_ERROR_RETURN_RET_LOG(cameraServiceOnly == nullptr,
216 CAMERA_UNKNOWN_ERROR, "GetMetadata Failed to get cameraProxy");
217
218 string idOfThis;
219 auto iter = fwToMetaCameraPosition_.find(cameraPosition);
220 if (iter == fwToMetaCameraPosition_.end()) {
221 MEDIA_ERR_LOG("CameraInput::Open can not find cameraPosition in fwToMetaCameraPosition_");
222 return retCode;
223 }
224
225 cameraServiceOnly->GetIdforCameraConcurrentType(iter->second, idOfThis);
226 sptr<ICameraDeviceService> cameraDevicePhysic = nullptr;
227 CameraManager::GetInstance()->CreateCameraDevice(idOfThis, &cameraDevicePhysic);
228 SetCameraDevice(cameraDevicePhysic);
229
230 std::shared_ptr<OHOS::Camera::CameraMetadata> cameraAbility;
231 retCode = cameraServiceOnly->GetConcurrentCameraAbility(idOfThis, cameraAbility);
232 if (retCode != CAMERA_OK) {
233 MEDIA_ERR_LOG("CameraInput::Open camera id: %{public}s get concurrent camera ability failed", idOfThis.c_str());
234 return retCode;
235 }
236
237 sptr<CameraDevice> cameraObjnow = new (std::nothrow) CameraDevice(idOfThis, cameraAbility);
238 if (cameraConcurrentType == 0) {
239 cameraObjnow->isConcurrentLimted_ = 1;
240 auto itr = CameraManager::GetInstance()->cameraConLimCapMap_.find(cameraObjnow->GetID());
241 if (itr != CameraManager::GetInstance()->cameraConLimCapMap_.end()) {
242 cameraObjnow->limtedCapabilitySave_ = itr->second;
243 } else {
244 MEDIA_ERR_LOG("CameraInput::Open can not find CameraDevice in ConcurrentCameraMap");
245 return CAMERA_DEVICE_ERROR;
246 }
247 }
248 std::lock_guard<std::mutex> lock2(deviceObjMutex_);
249 cameraObj_ = cameraObjnow;
250 CameraManager::GetInstance()->SetProfile(cameraObj_, cameraAbility);
251
252 if (cameraDevicePhysic) {
253 retCode = cameraDevicePhysic->Open(cameraConcurrentType);
254 CHECK_ERROR_PRINT_LOG(retCode != CAMERA_OK, "Failed to open Camera Input, retCode: %{public}d", retCode);
255 } else {
256 MEDIA_ERR_LOG("CameraInput::Open()with CameraConcurrentType deviceObj is nullptr");
257 }
258 return ServiceToCameraError(retCode);
259 }
260 // LCOV_EXCL_STOP
261
Open(bool isEnableSecureCamera,uint64_t * secureSeqId)262 int CameraInput::Open(bool isEnableSecureCamera, uint64_t* secureSeqId)
263 {
264 std::lock_guard<std::mutex> lock(interfaceMutex_);
265 MEDIA_DEBUG_LOG("Enter Into CameraInput::OpenSecureCamera");
266 int32_t retCode = CAMERA_UNKNOWN_ERROR;
267 bool isSupportSecCamera = false;
268 auto cameraObject = GetCameraDeviceInfo();
269 if (isEnableSecureCamera && cameraObject) {
270 // LCOV_EXCL_START
271 std::vector<SceneMode> supportedModes = cameraObject->GetSupportedModes();
272 CHECK_ERROR_RETURN_RET_LOG(supportedModes.empty(), retCode, "CameraInput::GetSupportedModes Failed");
273 for (uint32_t i = 0; i < supportedModes.size(); i++) {
274 if (supportedModes[i] == SECURE) {
275 isSupportSecCamera = true;
276 }
277 }
278 // LCOV_EXCL_STOP
279 }
280
281 auto deviceObj = GetCameraDevice();
282 if (deviceObj) {
283 retCode = isSupportSecCamera ? (deviceObj->OpenSecureCamera(secureSeqId)) : (deviceObj->Open());
284 CHECK_ERROR_PRINT_LOG(retCode != CAMERA_OK,
285 "Failed to open Camera Input, retCode: %{public}d, isSupportSecCamera is %{public}d",
286 retCode, isSupportSecCamera);
287 } else {
288 MEDIA_ERR_LOG("CameraInput::OpenSecureCamera() deviceObj is nullptr");
289 }
290 MEDIA_INFO_LOG("Enter Into CameraInput::OpenSecureCamera secureSeqId = %{public}" PRIu64, *secureSeqId);
291 return ServiceToCameraError(retCode);
292 }
293
Close()294 int CameraInput::Close()
295 {
296 std::lock_guard<std::mutex> lock(interfaceMutex_);
297 UnregisterTime();
298 MEDIA_DEBUG_LOG("Enter Into CameraInput::Close");
299 int32_t retCode = CAMERA_UNKNOWN_ERROR;
300 auto deviceObj = GetCameraDevice();
301 if (deviceObj) {
302 retCode = deviceObj->Close();
303 CHECK_ERROR_PRINT_LOG(retCode != CAMERA_OK, "Failed to close Camera Input, retCode: %{public}d", retCode);
304 } else {
305 MEDIA_ERR_LOG("CameraInput::Close() deviceObj is nullptr");
306 }
307 SetCameraDeviceInfo(nullptr);
308 InputRemoveDeathRecipient();
309 CameraDeviceSvcCallback_ = nullptr;
310 return ServiceToCameraError(retCode);
311 }
312
closeDelayed(int32_t delayTime)313 int CameraInput::closeDelayed(int32_t delayTime)
314 {
315 int32_t retCode = CAMERA_UNKNOWN_ERROR;
316 std::lock_guard<std::mutex> lock(interfaceMutex_);
317 MEDIA_INFO_LOG("Enter Into CameraInput::closeDelayed");
318 auto cameraObject = GetCameraDeviceInfo();
319 auto deviceObj = GetCameraDevice();
320 // LCOV_EXCL_START
321 if (delayTime > 0 && deviceObj) {
322 std::shared_ptr<Camera::CameraMetadata> metadata = std::make_shared<Camera::CameraMetadata>(1, 1);
323 uint32_t count = 1;
324 metadata->addEntry(OHOS_CONTROL_CAMERA_CLOSE_AFTER_SECONDS, &delayTime, count);
325 deviceObj->UpdateSetting(metadata);
326 }
327 if (deviceObj) {
328 MEDIA_INFO_LOG("CameraInput::closeDelayed() deviceObj is true");
329 retCode = deviceObj->closeDelayed();
330 CHECK_ERROR_PRINT_LOG(retCode != CAMERA_OK, "Failed to close closeDelayed Input, retCode: %{public}d", retCode);
331 } else {
332 MEDIA_ERR_LOG("CameraInput::closeDelayed() deviceObj is nullptr");
333 }
334 // LCOV_EXCL_STOP
335 auto thiswptr = wptr<CameraInput>(this);
336 const int delayTaskTime = delayTime * 1000;
337 UnregisterTime();
338 uint32_t timeIdFirst = CameraTimer::GetInstance()->Register(
339 [thiswptr] {
340 auto input = thiswptr.promote();
341 if (input) {
342 MEDIA_INFO_LOG("Enter Into CameraInput::closeDelayed obj->close");
343 input->Close();
344 }
345 }, delayTaskTime, true);
346
347 timeQueue_.push(timeIdFirst);
348 return ServiceToCameraError(retCode);
349 }
350
UnregisterTime()351 void CameraInput::UnregisterTime()
352 {
353 MEDIA_INFO_LOG("Enter Into CameraInput::UnregisterTime");
354 while (!timeQueue_.empty()) {
355 uint32_t timeIdFirst = timeQueue_.front();
356 timeQueue_.pop();
357 CameraTimer::GetInstance()->Unregister(timeIdFirst);
358 }
359 }
360
Release()361 int CameraInput::Release()
362 {
363 std::lock_guard<std::mutex> lock(interfaceMutex_);
364 MEDIA_DEBUG_LOG("Enter Into CameraInput::Release");
365 int32_t retCode = CAMERA_UNKNOWN_ERROR;
366 auto deviceObj = GetCameraDevice();
367 if (deviceObj) {
368 retCode = deviceObj->Release();
369 CHECK_ERROR_PRINT_LOG(retCode != CAMERA_OK, "Failed to release Camera Input, retCode: %{public}d", retCode);
370 } else {
371 MEDIA_ERR_LOG("CameraInput::Release() deviceObj is nullptr");
372 }
373 SetCameraDeviceInfo(nullptr);
374 InputRemoveDeathRecipient();
375 CameraDeviceSvcCallback_ = nullptr;
376 return ServiceToCameraError(retCode);
377 }
378
SetErrorCallback(std::shared_ptr<ErrorCallback> errorCallback)379 void CameraInput::SetErrorCallback(std::shared_ptr<ErrorCallback> errorCallback)
380 {
381 CHECK_ERROR_PRINT_LOG(errorCallback == nullptr, "SetErrorCallback: Unregistering error callback");
382 std::lock_guard<std::mutex> lock(errorCallbackMutex_);
383 errorCallback_ = errorCallback;
384 return;
385 }
386
SetResultCallback(std::shared_ptr<ResultCallback> resultCallback)387 void CameraInput::SetResultCallback(std::shared_ptr<ResultCallback> resultCallback)
388 {
389 CHECK_ERROR_PRINT_LOG(resultCallback == nullptr, "SetResultCallback: Unregistering error resultCallback");
390 MEDIA_DEBUG_LOG("CameraInput::setresult callback");
391 std::lock_guard<std::mutex> lock(resultCallbackMutex_);
392 resultCallback_ = resultCallback;
393 return;
394 }
SetCameraDeviceInfo(sptr<CameraDevice> cameraObj)395 void CameraInput::SetCameraDeviceInfo(sptr<CameraDevice> cameraObj)
396 {
397 MEDIA_DEBUG_LOG("CameraInput::SetCameraDeviceInfo");
398 std::lock_guard<std::mutex> lock(cameraDeviceInfoMutex_);
399 cameraObj_ = cameraObj;
400 return;
401 }
402
createPositionMapping()403 std::map<CameraPosition, camera_position_enum> createPositionMapping()
404 {
405 std::map<CameraPosition, camera_position_enum> enumMapping;
406 enumMapping[CameraPosition::CAMERA_POSITION_UNSPECIFIED] = camera_position_enum::OHOS_CAMERA_POSITION_OTHER;
407 enumMapping[CameraPosition::CAMERA_POSITION_BACK] = camera_position_enum::OHOS_CAMERA_POSITION_BACK;
408 enumMapping[CameraPosition::CAMERA_POSITION_FRONT] = camera_position_enum::OHOS_CAMERA_POSITION_FRONT;
409 return enumMapping;
410 }
411
SetInputUsedAsPosition(CameraPosition usedAsPosition)412 void CameraInput::SetInputUsedAsPosition(CameraPosition usedAsPosition)
413 {
414 MEDIA_INFO_LOG("CameraInput::SetInputUsedAsPosition params: %{public}u", usedAsPosition);
415 std::lock_guard<std::mutex> lock(cameraDeviceInfoMutex_);
416 uint8_t translatePos = OHOS_CAMERA_POSITION_OTHER;
417 if (positionMapping.empty()) {
418 positionMapping = createPositionMapping();
419 }
420 translatePos = positionMapping[usedAsPosition];
421
422 auto metadata = std::make_shared<Camera::CameraMetadata>(1, 1);
423 MEDIA_INFO_LOG("CameraInput::SetInputUsedAsPosition fr: %{public}u, to: %{public}u", usedAsPosition, translatePos);
424 if (!AddOrUpdateMetadata(metadata, OHOS_CONTROL_CAMERA_USED_AS_POSITION, &translatePos, 1)) {
425 MEDIA_INFO_LOG("CameraInput::SetInputUsedAsPosition Failed to set metadata");
426 }
427 auto deviceObj = GetCameraDevice();
428 CHECK_ERROR_RETURN_LOG(deviceObj == nullptr, "deviceObj is nullptr");
429 // LCOV_EXCL_START
430 deviceObj->SetUsedAsPosition(translatePos);
431 deviceObj->UpdateSetting(metadata);
432 CHECK_ERROR_RETURN_LOG(cameraObj_ == nullptr, "cameraObj_ is nullptr");
433 cameraObj_->SetCameraDeviceUsedAsPosition(usedAsPosition);
434 // LCOV_EXCL_STOP
435 }
436
437 // LCOV_EXCL_START
ControlAuxiliary(AuxiliaryType type,AuxiliaryStatus status)438 void CameraInput::ControlAuxiliary(AuxiliaryType type, AuxiliaryStatus status)
439 {
440 MEDIA_INFO_LOG("CameraInput::ControlAuxiliary type: %{public}u, status:%{public}u", type, status);
441 if (type == AuxiliaryType::CONTRACTLENS && status == AuxiliaryStatus::AUXILIARY_ON) {
442 uint8_t value = 1;
443 uint32_t count = 1;
444 constexpr int32_t DEFAULT_ITEMS = 1;
445 constexpr int32_t DEFAULT_DATA_LENGTH = 1;
446 auto metadata = std::make_shared<Camera::CameraMetadata>(DEFAULT_ITEMS, DEFAULT_DATA_LENGTH);
447 if (!AddOrUpdateMetadata(metadata, OHOS_CONTROL_EJECT_RETRY, &value, count)) {
448 MEDIA_ERR_LOG("CameraInput::ControlAuxiliary Failed to set metadata");
449 return;
450 }
451 auto deviceObj = GetCameraDevice();
452 CHECK_ERROR_RETURN_LOG(deviceObj == nullptr, "deviceObj is nullptr");
453 deviceObj->UpdateSetting(metadata);
454 deviceObj->SetDeviceRetryTime();
455 }
456 }
457 // LCOV_EXCL_STOP
458
SetOcclusionDetectCallback(std::shared_ptr<CameraOcclusionDetectCallback> cameraOcclusionDetectCallback)459 void CameraInput::SetOcclusionDetectCallback(
460 std::shared_ptr<CameraOcclusionDetectCallback> cameraOcclusionDetectCallback)
461 {
462 CHECK_ERROR_PRINT_LOG(cameraOcclusionDetectCallback == nullptr,
463 "SetOcclusionDetectCallback: SetOcclusionDetectCallback error cameraOcclusionDetectCallback");
464 MEDIA_DEBUG_LOG("CameraInput::SetOcclusionDetectCallback callback");
465 std::lock_guard<std::mutex> lock(occlusionCallbackMutex_);
466 cameraOcclusionDetectCallback_ = cameraOcclusionDetectCallback;
467 return;
468 }
469
GetCameraId()470 std::string CameraInput::GetCameraId()
471 {
472 auto cameraObject = GetCameraDeviceInfo();
473 CHECK_ERROR_RETURN_RET_LOG(cameraObject == nullptr, nullptr, "CameraInput::GetCameraId cameraObject is null");
474 return cameraObject->GetID();
475 }
476
GetCameraDevice()477 sptr<ICameraDeviceService> CameraInput::GetCameraDevice()
478 {
479 std::lock_guard<std::mutex> lock(deviceObjMutex_);
480 return deviceObj_;
481 }
482
SetCameraDevice(sptr<ICameraDeviceService> deviceObj)483 void CameraInput::SetCameraDevice(sptr<ICameraDeviceService> deviceObj)
484 {
485 std::lock_guard<std::mutex> lock(deviceObjMutex_);
486 deviceObj_ = deviceObj;
487 return;
488 }
489
GetErrorCallback()490 std::shared_ptr<ErrorCallback> CameraInput::GetErrorCallback()
491 {
492 std::lock_guard<std::mutex> lock(errorCallbackMutex_);
493 return errorCallback_;
494 }
495
GetResultCallback()496 std::shared_ptr<ResultCallback> CameraInput::GetResultCallback()
497 {
498 std::lock_guard<std::mutex> lock(resultCallbackMutex_);
499 MEDIA_DEBUG_LOG("CameraDeviceServiceCallback::GetResultCallback");
500 return resultCallback_;
501 }
502
GetOcclusionDetectCallback()503 std::shared_ptr<CameraOcclusionDetectCallback> CameraInput::GetOcclusionDetectCallback()
504 {
505 std::lock_guard<std::mutex> lock(occlusionCallbackMutex_);
506 return cameraOcclusionDetectCallback_;
507 }
508
GetCameraDeviceInfo()509 sptr<CameraDevice> CameraInput::GetCameraDeviceInfo()
510 {
511 std::lock_guard<std::mutex> lock(cameraDeviceInfoMutex_);
512 return cameraObj_;
513 }
514
ProcessCallbackUpdates(const uint64_t timestamp,const std::shared_ptr<OHOS::Camera::CameraMetadata> & result)515 void CameraInput::ProcessCallbackUpdates(
516 const uint64_t timestamp, const std::shared_ptr<OHOS::Camera::CameraMetadata>& result)
517 {
518 auto metadataResultProcessor = GetMetadataResultProcessor();
519 CHECK_ERROR_RETURN(metadataResultProcessor == nullptr);
520 metadataResultProcessor->ProcessCallbacks(timestamp, result);
521 }
522
UpdateSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> changedMetadata)523 int32_t CameraInput::UpdateSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> changedMetadata)
524 {
525 CAMERA_SYNC_TRACE;
526 CHECK_ERROR_RETURN_RET(changedMetadata == nullptr, CAMERA_INVALID_ARG);
527 CHECK_ERROR_RETURN_RET_LOG(!OHOS::Camera::GetCameraMetadataItemCount(changedMetadata->get()), CAMERA_OK,
528 "CameraInput::UpdateSetting No configuration to update");
529
530 std::lock_guard<std::mutex> lock(interfaceMutex_);
531 auto deviceObj = GetCameraDevice();
532 CHECK_ERROR_RETURN_RET_LOG(!deviceObj, ServiceToCameraError(CAMERA_INVALID_ARG),
533 "CameraInput::UpdateSetting() deviceObj is nullptr");
534 int32_t ret = deviceObj->UpdateSetting(changedMetadata);
535 CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, ret, "CameraInput::UpdateSetting Failed to update settings");
536
537 auto cameraObject = GetCameraDeviceInfo();
538 CHECK_ERROR_RETURN_RET_LOG(cameraObject == nullptr, CAMERA_INVALID_ARG,
539 "CameraInput::UpdateSetting cameraObject is null");
540
541 std::shared_ptr<OHOS::Camera::CameraMetadata> baseMetadata = cameraObject->GetCachedMetadata();
542 bool mergeResult = MergeMetadata(changedMetadata, baseMetadata);
543 CHECK_ERROR_RETURN_RET_LOG(!mergeResult, CAMERA_INVALID_ARG,
544 "CameraInput::UpdateSetting() baseMetadata or itemEntry is nullptr");
545 return CAMERA_OK;
546 }
547
MergeMetadata(const std::shared_ptr<OHOS::Camera::CameraMetadata> srcMetadata,std::shared_ptr<OHOS::Camera::CameraMetadata> dstMetadata)548 bool CameraInput::MergeMetadata(const std::shared_ptr<OHOS::Camera::CameraMetadata> srcMetadata,
549 std::shared_ptr<OHOS::Camera::CameraMetadata> dstMetadata)
550 {
551 CHECK_ERROR_RETURN_RET(srcMetadata == nullptr || dstMetadata == nullptr, false);
552 auto srcHeader = srcMetadata->get();
553 CHECK_ERROR_RETURN_RET(srcHeader == nullptr, false);
554 auto dstHeader = dstMetadata->get();
555 CHECK_ERROR_RETURN_RET(dstHeader == nullptr, false);
556
557 auto srcItemCount = srcHeader->item_count;
558 camera_metadata_item_t srcItem;
559 for (uint32_t index = 0; index < srcItemCount; index++) {
560 int ret = OHOS::Camera::GetCameraMetadataItem(srcHeader, index, &srcItem);
561 CHECK_ERROR_RETURN_RET_LOG(ret != CAM_META_SUCCESS, false,
562 "Failed to get metadata item at index: %{public}d", index);
563 bool status = false;
564 uint32_t currentIndex;
565 ret = OHOS::Camera::FindCameraMetadataItemIndex(dstMetadata->get(), srcItem.item, ¤tIndex);
566 if (ret == CAM_META_ITEM_NOT_FOUND) {
567 status = dstMetadata->addEntry(srcItem.item, srcItem.data.u8, srcItem.count);
568 } else if (ret == CAM_META_SUCCESS) {
569 status = dstMetadata->updateEntry(srcItem.item, srcItem.data.u8, srcItem.count);
570 }
571 CHECK_ERROR_RETURN_RET_LOG(!status, false, "Failed to update metadata item: %{public}d", srcItem.item);
572 }
573 return true;
574 }
575
GetCameraSettings()576 std::string CameraInput::GetCameraSettings()
577 {
578 auto cameraObject = GetCameraDeviceInfo();
579 CHECK_ERROR_RETURN_RET_LOG(cameraObject == nullptr, nullptr, "GetCameraSettings cameraObject is null");
580 return OHOS::Camera::MetadataUtils::EncodeToString(cameraObject->GetCachedMetadata());
581 }
582
SetCameraSettings(std::string setting)583 int32_t CameraInput::SetCameraSettings(std::string setting)
584 {
585 std::shared_ptr<OHOS::Camera::CameraMetadata> metadata = OHOS::Camera::MetadataUtils::DecodeFromString(setting);
586 CHECK_ERROR_RETURN_RET_LOG(metadata == nullptr, CAMERA_INVALID_ARG,
587 "CameraInput::SetCameraSettings Failed to decode metadata setting from string");
588 return UpdateSetting(metadata);
589 }
590
GetMetaSetting(uint32_t metaTag)591 std::shared_ptr<camera_metadata_item_t> CameraInput::GetMetaSetting(uint32_t metaTag)
592 {
593 auto cameraObject = GetCameraDeviceInfo();
594 CHECK_ERROR_RETURN_RET_LOG(cameraObject == nullptr, nullptr,
595 "CameraInput::GetMetaSetting cameraObj has release!");
596 std::shared_ptr<OHOS::Camera::CameraMetadata> baseMetadata = cameraObject->GetCachedMetadata();
597 CHECK_ERROR_RETURN_RET_LOG(baseMetadata == nullptr, nullptr,
598 "CameraInput::GetMetaSetting Failed to find baseMetadata");
599 std::shared_ptr<camera_metadata_item_t> item = MetadataCommonUtils::GetCapabilityEntry(baseMetadata, metaTag);
600 CHECK_ERROR_RETURN_RET_LOG(item == nullptr || item->count == 0, nullptr,
601 "CameraInput::GetMetaSetting Failed to find meta item: metaTag = %{public}u", metaTag);
602 return item;
603 }
604
GetCameraAllVendorTags(std::vector<vendorTag_t> & infos)605 int32_t CameraInput::GetCameraAllVendorTags(std::vector<vendorTag_t> &infos) __attribute__((no_sanitize("cfi")))
606 {
607 infos.clear();
608 MEDIA_INFO_LOG("CameraInput::GetCameraAllVendorTags called!");
609 int32_t ret = OHOS::Camera::GetAllVendorTags(infos);
610 CHECK_ERROR_RETURN_RET_LOG(ret != CAM_META_SUCCESS, CAMERA_UNKNOWN_ERROR,
611 "CameraInput::GetCameraAllVendorTags failed! because of hdi error, ret = %{public}d", ret);
612 MEDIA_INFO_LOG("CameraInput::GetCameraAllVendorTags success! vendors size = %{public}zu!", infos.size());
613 MEDIA_INFO_LOG("CameraInput::GetCameraAllVendorTags end!");
614 return CAMERA_OK;
615 }
616
SwitchCameraDevice(sptr<ICameraDeviceService> & deviceObj,sptr<CameraDevice> & cameraObj)617 void CameraInput::SwitchCameraDevice(sptr<ICameraDeviceService> &deviceObj, sptr<CameraDevice> &cameraObj)
618 {
619 SetCameraDeviceInfo(cameraObj);
620 SetCameraDevice(deviceObj);
621 InitCameraInput();
622 }
623 } // namespace CameraStandard
624 } // namespace OHOS
625