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