1 /* 2 * Copyright (c) 2023 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 CAMERA_MANAGER_ADAPTER_IMPL_H 17 #define CAMERA_MANAGER_ADAPTER_IMPL_H 18 19 #include "camera_manager_adapter.h" 20 #include "camera_manager.h" 21 22 23 #include <cstdio> 24 #include <fcntl.h> 25 #include <securec.h> 26 #include <sys/time.h> 27 #include <unistd.h> 28 29 namespace OHOS::NWeb { 30 using namespace OHOS::CameraStandard; 31 32 enum class SurfaceType { 33 INVALID = 0, 34 PREVIEW, 35 SECOND_PREVIEW, 36 PHOTO, 37 VIDEO 38 }; 39 40 class CameraSurfaceListener; 41 42 class CameraSurfaceBufferAdapterImpl : public CameraSurfaceBufferAdapter { 43 public: 44 explicit CameraSurfaceBufferAdapterImpl(sptr<SurfaceBuffer> buffer); 45 46 ~CameraSurfaceBufferAdapterImpl() override = default; 47 48 int32_t GetFileDescriptor() const override; 49 50 int32_t GetWidth() const override; 51 52 int32_t GetHeight() const override; 53 54 int32_t GetStride() const override; 55 56 int32_t GetFormat() const override; 57 58 uint32_t GetSize() const override; 59 60 uint8_t* GetBufferAddr() override; 61 62 sptr<SurfaceBuffer>& GetBuffer(); 63 64 private: 65 sptr<SurfaceBuffer> buffer_ = nullptr; 66 }; 67 68 class CameraManagerAdapterCallback : public CameraManagerCallback { 69 public: 70 explicit CameraManagerAdapterCallback(std::shared_ptr<CameraStatusCallbackAdapter> callback); 71 ~CameraManagerAdapterCallback() = default; 72 void OnCameraStatusChanged(const CameraStatusInfo &cameraStatusInfo) const override; 73 void OnFlashlightStatusChanged(const std::string &cameraID, 74 const FlashStatus flashStatus) const override; 75 76 private: 77 CameraStatusAdapter GetAdapterCameraStatus(CameraStatus status) const; 78 std::shared_ptr<CameraStatusCallbackAdapter> statusCallback_; 79 }; 80 81 class CameraManagerAdapterImpl : public CameraManagerAdapter { 82 public: 83 static CameraManagerAdapterImpl& GetInstance(); 84 CameraManagerAdapterImpl() = default; 85 86 ~CameraManagerAdapterImpl() override = default; 87 88 int32_t Create(std::shared_ptr<CameraStatusCallbackAdapter> cameraStatusCallback) override; 89 90 void GetDevicesInfo(std::vector<VideoDeviceDescriptor> &devicesDiscriptor) override; 91 92 int32_t ReleaseCameraManger() override; 93 94 int32_t GetExposureModes(std::vector<ExposureModeAdapter>& exposureModesAdapter) override; 95 96 int32_t GetCurrentExposureMode(ExposureModeAdapter& exposureModeAdapter) override; 97 98 int32_t GetCaptionRangeById(RangeIDAdapter rangeId, VideoCaptureRangeAdapter& rangeVal) override; 99 100 bool IsFocusModeSupported(FocusModeAdapter focusMode) override; 101 102 FocusModeAdapter GetCurrentFocusMode() override; 103 104 bool IsFlashModeSupported(FlashModeAdapter flashMode) override; 105 106 int32_t RestartSession() override; 107 108 int32_t StopSession(CameraStopType stopType) override; 109 110 CameraStatusAdapter GetCameraStatus() override; 111 112 bool IsExistCaptureTask() override; 113 114 int32_t StartStream(const std::string &deviceId, 115 const VideoCaptureParamsAdapter &captureParams, 116 std::shared_ptr<CameraBufferListenerAdapter> listener) override; 117 118 void SetForegroundFlag(bool isForeground) override; 119 120 void SetCameraStatus(CameraStatusAdapter status) override; 121 122 private: 123 VideoTransportType GetCameraTransportType(ConnectionType connectType); 124 VideoFacingModeAdapter GetCameraFacingMode(CameraPosition position); 125 std::vector<FormatAdapter> GetCameraSupportFormats(sptr<CameraOutputCapability> outputcapability); 126 VideoPixelFormatAdapter TransToAdapterCameraFormat(CameraFormat format); 127 ExposureModeAdapter GetAdapterExposureMode(ExposureMode exportMode); 128 CameraFormat TransToOriCameraFormat(VideoPixelFormatAdapter format); 129 int32_t TransToAdapterExposureModes( 130 std::vector<ExposureMode>& exposureModes, 131 std::vector<ExposureModeAdapter>& exposureModesAdapter); 132 int32_t GetExposureCompensation(VideoCaptureRangeAdapter& rangeVal); 133 FocusMode GetOriFocusMode(FocusModeAdapter focusMode); 134 FocusModeAdapter GetAdapterFocusMode(FocusMode focusMode); 135 FlashMode GetOriFlashMode(FlashModeAdapter flashMode); 136 int32_t ReleaseSession(); 137 int32_t ReleaseSessionResource(const std::string &deviceId); 138 int32_t InitCameraInput(const std::string &deviceId); 139 int32_t InitPreviewOutput(const VideoCaptureParamsAdapter &captureParams, 140 std::shared_ptr<CameraBufferListenerAdapter> listener); 141 int32_t CreateAndStartSession(); 142 sptr<CameraManager> cameraManager_; 143 sptr<CaptureSession> captureSession_; 144 sptr<CaptureInput> cameraInput_; 145 sptr<IConsumerSurface> previewSurface_; 146 sptr<CameraSurfaceListener> previewSurfaceListener_; 147 sptr<CaptureOutput> previewOutput_; 148 std::string deviceId_; 149 VideoCaptureParamsAdapter captureParams_; 150 std::shared_ptr<CameraBufferListenerAdapter> listener_; 151 const int32_t DEFAULT_FRAME_RATE = 30; 152 const uint32_t RANGE_MAX_SIZE = 2; 153 const uint32_t RANGE_MIN_INDEX = 0; 154 const uint32_t RANGE_MAX_INDEX = 1; 155 CameraStatusAdapter status_ = CameraStatusAdapter::AVAILABLE; 156 std::mutex mutex_; 157 bool inputInitedFlag_ = false; 158 bool isCapturing_ = false; 159 bool isForegound_ = false; 160 std::mutex restart_mutex_; 161 std::shared_ptr<CameraManagerAdapterCallback> cameraMngrCallback_; 162 }; 163 164 class CameraSurfaceListener : public IBufferConsumerListener { 165 public: 166 CameraSurfaceListener(SurfaceType surfaceType, 167 sptr<IConsumerSurface> surface, 168 std::shared_ptr<CameraBufferListenerAdapter> listener); 169 virtual ~CameraSurfaceListener() = default; 170 void OnBufferAvailable() override; 171 172 private: 173 CameraRotationInfo GetRotationInfo(GraphicTransformType transform); 174 CameraRotationInfo FillRotationInfo(int roration, bool isFlipX, bool isFlipY); 175 SurfaceType surfaceType_; 176 sptr<IConsumerSurface> surface_; 177 std::shared_ptr<CameraBufferListenerAdapter> listener_ = nullptr; 178 const int32_t ROTATION_0 = 0; 179 const int32_t ROTATION_90 = 90; 180 const int32_t ROTATION_180 = 180; 181 const int32_t ROTATION_270 = 270; 182 }; 183 184 class CameraSurfaceAdapterImpl : public CameraSurfaceAdapter { 185 public: 186 CameraSurfaceAdapterImpl(); 187 188 CameraSurfaceAdapterImpl(sptr<IConsumerSurface> surface); 189 190 ~CameraSurfaceAdapterImpl() = default; 191 192 int32_t ReleaseBuffer(std::unique_ptr<CameraSurfaceBufferAdapter> bufferAdapter, int32_t fence) override; 193 194 private: 195 sptr<IConsumerSurface> cSurface_ = nullptr; 196 }; 197 198 } // namespace OHOS::NWeb 199 200 #endif // CAMERA_MANAGER_ADAPTER_IMPL_H