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