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 #ifndef OHOS_CAMERA_H_CAMERA_DEVICE_H 17 #define OHOS_CAMERA_H_CAMERA_DEVICE_H 18 19 #include <cstdint> 20 #include <iostream> 21 #include <atomic> 22 #include <mutex> 23 24 #include "accesstoken_kit.h" 25 #include "privacy_kit.h" 26 #include "v1_0/icamera_device_callback.h" 27 #include "camera_metadata_info.h" 28 #include "camera_util.h" 29 #include "hcamera_device_stub.h" 30 #include "hcamera_host_manager.h" 31 #include "v1_0/icamera_device.h" 32 #include "v1_1/icamera_device.h" 33 #include "v1_2/icamera_device.h" 34 #include "v1_0/icamera_host.h" 35 36 namespace OHOS { 37 namespace CameraStandard { 38 using OHOS::HDI::Camera::V1_0::CaptureEndedInfo; 39 using OHOS::HDI::Camera::V1_0::CaptureErrorInfo; 40 using OHOS::HDI::Camera::V1_0::ICameraDeviceCallback; 41 using OHOS::HDI::Camera::V1_2::IStreamOperatorCallback; 42 class HCameraDevice : public HCameraDeviceStub, public ICameraDeviceCallback, public IStreamOperatorCallback { 43 public: 44 explicit HCameraDevice( 45 sptr<HCameraHostManager>& cameraHostManager, std::string cameraID, const uint32_t callingTokenId); 46 ~HCameraDevice(); 47 48 int32_t Open() override; 49 int32_t Close() override; 50 int32_t Release() override; 51 int32_t UpdateSetting(const std::shared_ptr<OHOS::Camera::CameraMetadata>& settings) override; 52 int32_t UpdateSettingOnce(const std::shared_ptr<OHOS::Camera::CameraMetadata>& settings); 53 int32_t GetStatus(std::shared_ptr<OHOS::Camera::CameraMetadata> &metaIn, 54 std::shared_ptr<OHOS::Camera::CameraMetadata> &metaOut) override; 55 int32_t GetEnabledResults(std::vector<int32_t>& results) override; 56 int32_t EnableResult(std::vector<int32_t>& results) override; 57 int32_t DisableResult(std::vector<int32_t>& results) override; 58 int32_t ReleaseStreams(std::vector<int32_t>& releaseStreamIds); 59 sptr<OHOS::HDI::Camera::V1_0::IStreamOperator> GetStreamOperator(); 60 int32_t SetCallback(sptr<ICameraDeviceServiceCallback>& callback) override; 61 int32_t OnError(OHOS::HDI::Camera::V1_0::ErrorType type, int32_t errorCode) override; 62 int32_t OnResult(uint64_t timestamp, const std::vector<uint8_t>& result) override; 63 std::shared_ptr<OHOS::Camera::CameraMetadata> GetDeviceAbility(); 64 std::shared_ptr<OHOS::Camera::CameraMetadata> CloneCachedSettings(); 65 std::string GetCameraId(); 66 bool IsOpenedCameraDevice(); 67 int32_t GetCallerToken(); 68 int32_t CreateAndCommitStreams(std::vector<HDI::Camera::V1_1::StreamInfo_V1_1>& streamInfos, 69 std::shared_ptr<OHOS::Camera::CameraMetadata>& deviceSettings, int32_t operationMode); 70 int32_t UpdateStreams(std::vector<StreamInfo_V1_1>& streamInfos); 71 72 int32_t OperatePermissionCheck(uint32_t interfaceCode) override; 73 74 int32_t OnCaptureStarted(int32_t captureId, const std::vector<int32_t>& streamIds) override; 75 int32_t OnCaptureStarted_V1_2( 76 int32_t captureId, const std::vector<OHOS::HDI::Camera::V1_2::CaptureStartedInfo>& infos) override; 77 int32_t OnCaptureEnded(int32_t captureId, const std::vector<CaptureEndedInfo>& infos) override; 78 int32_t OnCaptureError(int32_t captureId, const std::vector<CaptureErrorInfo>& infos) override; 79 int32_t OnFrameShutter(int32_t captureId, const std::vector<int32_t>& streamIds, uint64_t timestamp) override; 80 81 int32_t ResetDeviceSettings(); 82 int32_t DispatchDefaultSettingToHdi(); 83 SetStreamOperatorCallback(wptr<IStreamOperatorCallback> operatorCallback)84 inline void SetStreamOperatorCallback(wptr<IStreamOperatorCallback> operatorCallback) 85 { 86 std::lock_guard<std::mutex> lock(proxyStreamOperatorCallbackMutex_); 87 proxyStreamOperatorCallback_ = operatorCallback; 88 } 89 GetStreamOperatorCallback()90 inline sptr<IStreamOperatorCallback> GetStreamOperatorCallback() 91 { 92 std::lock_guard<std::mutex> lock(proxyStreamOperatorCallbackMutex_); 93 return proxyStreamOperatorCallback_.promote(); 94 } 95 96 void NotifyCameraSessionStatus(bool running); 97 98 private: 99 class FoldScreenListener; 100 std::mutex opMutex_; // Lock the operations updateSettings_, streamOperator_, and hdiCameraDevice_. 101 std::shared_ptr<OHOS::Camera::CameraMetadata> updateSettings_; 102 sptr<OHOS::HDI::Camera::V1_0::IStreamOperator> streamOperator_; 103 sptr<OHOS::HDI::Camera::V1_0::ICameraDevice> hdiCameraDevice_; 104 std::shared_ptr<OHOS::Camera::CameraMetadata> cachedSettings_; 105 106 sptr<HCameraHostManager> cameraHostManager_; 107 std::string cameraID_; 108 std::atomic<bool> isOpenedCameraDevice_; 109 std::mutex deviceSvcCbMutex_; 110 std::mutex cachedSettingsMutex_; 111 static std::mutex g_deviceOpenCloseMutex_; 112 sptr<ICameraDeviceServiceCallback> deviceSvcCallback_; 113 std::map<int32_t, wptr<ICameraServiceCallback>> statusSvcCallbacks_; 114 115 uint32_t callerToken_; 116 117 std::mutex proxyStreamOperatorCallbackMutex_; 118 wptr<IStreamOperatorCallback> proxyStreamOperatorCallback_; 119 120 std::mutex deviceAbilityMutex_; 121 std::shared_ptr<OHOS::Camera::CameraMetadata> deviceAbility_; 122 123 std::mutex deviceOpenLifeCycleMutex_; 124 std::shared_ptr<OHOS::Camera::CameraMetadata> deviceOpenLifeCycleSettings_; 125 126 std::string clientName_; 127 int clientUserId_; 128 129 std::mutex unPrepareZoomMutex_; 130 uint32_t zoomTimerId_; 131 std::atomic<bool> inPrepareZoom_; 132 133 void UpdateDeviceOpenLifeCycleSettings(std::shared_ptr<OHOS::Camera::CameraMetadata> changedSettings); 134 void ResetDeviceOpenLifeCycleSettings(); 135 136 sptr<ICameraDeviceServiceCallback> GetDeviceServiceCallback(); 137 void ResetCachedSettings(); 138 int32_t InitStreamOperator(); 139 void ReportMetadataDebugLog(const std::shared_ptr<OHOS::Camera::CameraMetadata>& settings); 140 void RegisterFoldStatusListener(); 141 void UnRegisterFoldStatusListener(); 142 void CheckOnResultData(std::shared_ptr<OHOS::Camera::CameraMetadata> cameraResult); 143 int32_t CreateStreams(std::vector<HDI::Camera::V1_1::StreamInfo_V1_1>& streamInfos); 144 int32_t CommitStreams(std::shared_ptr<OHOS::Camera::CameraMetadata>& deviceSettings, int32_t operationMode); 145 bool CanOpenCamera(); 146 void ResetZoomTimer(); 147 void CheckZoomChange(const std::shared_ptr<OHOS::Camera::CameraMetadata>& settings); 148 void UnPrepareZoom(); 149 int32_t OpenDevice(); 150 int32_t CloseDevice(); 151 }; 152 } // namespace CameraStandard 153 } // namespace OHOS 154 #endif // OHOS_CAMERA_H_CAMERA_DEVICE_H 155