• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, &currentIndex);
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