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