1 /* 2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 // This sub-API supports the following functionalities: 12 // 13 // - Allocating capture devices. 14 // - Connect a capture device with one or more channels. 15 // - Start and stop capture devices. 16 // - Getting capture device capabilities. 17 18 #ifndef WEBRTC_VIDEO_ENGINE_INCLUDE_VIE_CAPTURE_H_ 19 #define WEBRTC_VIDEO_ENGINE_INCLUDE_VIE_CAPTURE_H_ 20 21 #include "webrtc/common_types.h" 22 #include "webrtc/common_video/interface/i420_video_frame.h" 23 24 namespace webrtc { 25 26 class VideoEngine; 27 class VideoCaptureModule; 28 29 // This structure describes one set of the supported capabilities for a capture 30 // device. 31 struct CaptureCapability { 32 unsigned int width; 33 unsigned int height; 34 unsigned int maxFPS; 35 RawVideoType rawType; 36 VideoCodecType codecType; 37 unsigned int expectedCaptureDelay; 38 bool interlaced; 39 CaptureCapability() { 40 width = 0; 41 height = 0; 42 maxFPS = 0; 43 rawType = kVideoI420; 44 codecType = kVideoCodecUnknown; 45 expectedCaptureDelay = 0; 46 interlaced = false; 47 } 48 }; 49 50 // This enumerator tells the current brightness alarm mode. 51 enum Brightness { 52 Normal = 0, 53 Bright = 1, 54 Dark = 2 55 }; 56 57 // This enumerator describes the capture alarm mode. 58 enum CaptureAlarm { 59 AlarmRaised = 0, 60 AlarmCleared = 1 61 }; 62 63 enum RotateCapturedFrame { 64 RotateCapturedFrame_0 = 0, 65 RotateCapturedFrame_90 = 90, 66 RotateCapturedFrame_180 = 180, 67 RotateCapturedFrame_270 = 270 68 }; 69 70 struct ViEVideoFrameI420 { 71 ViEVideoFrameI420() { 72 y_plane = NULL; 73 u_plane = NULL; 74 v_plane = NULL; 75 y_pitch = 0; 76 u_pitch = 0; 77 v_pitch = 0; 78 width = 0; 79 height = 0; 80 } 81 82 unsigned char* y_plane; 83 unsigned char* u_plane; 84 unsigned char* v_plane; 85 86 int y_pitch; 87 int u_pitch; 88 int v_pitch; 89 90 unsigned short width; 91 unsigned short height; 92 }; 93 94 // This class declares an abstract interface to be used when implementing 95 // a user-defined capture device. This interface is not meant to be 96 // implemented by the user. Instead, the user should call AllocateCaptureDevice 97 // in the ViECapture interface, which will create a suitable implementation. 98 // The user should then call IncomingFrame in this interface to deliver 99 // captured frames to the system. 100 class WEBRTC_DLLEXPORT ViEExternalCapture { 101 public: 102 ViEExternalCapture() {} 103 virtual ~ViEExternalCapture() {} 104 105 // This method is called by the user to deliver a new captured frame to 106 // VideoEngine. 107 // |capture_time| must be specified in the NTP time format in milliseconds. 108 virtual int IncomingFrame(unsigned char* video_frame, 109 unsigned int video_frame_length, 110 unsigned short width, 111 unsigned short height, 112 RawVideoType video_type, 113 unsigned long long capture_time = 0) = 0; 114 115 // This method is specifically for delivering a new captured I420 frame to 116 // VideoEngine. 117 // |capture_time| must be specified in the NTP time format in milliseconds. 118 virtual int IncomingFrameI420( 119 const ViEVideoFrameI420& video_frame, 120 unsigned long long capture_time = 0) = 0; 121 122 virtual void SwapFrame(I420VideoFrame* frame) {} 123 }; 124 125 // This class declares an abstract interface for a user defined observer. It is 126 // up to the VideoEngine user to implement a derived class which implements the 127 // observer class. The observer is registered using RegisterObserver() and 128 // deregistered using DeregisterObserver(). 129 class WEBRTC_DLLEXPORT ViECaptureObserver { 130 public: 131 // This method is called if a bright or dark captured image is detected. 132 virtual void BrightnessAlarm(const int capture_id, 133 const Brightness brightness) = 0; 134 135 // This method is called periodically telling the capture device frame rate. 136 virtual void CapturedFrameRate(const int capture_id, 137 const unsigned char frame_rate) = 0; 138 139 // This method is called if the capture device stops delivering images to 140 // VideoEngine. 141 virtual void NoPictureAlarm(const int capture_id, 142 const CaptureAlarm alarm) = 0; 143 144 protected: 145 virtual ~ViECaptureObserver() {} 146 }; 147 148 class WEBRTC_DLLEXPORT ViECapture { 149 public: 150 // Factory for the ViECapture subAPI and increases an internal reference 151 // counter if successful. Returns NULL if the API is not supported or if 152 // construction fails. 153 static ViECapture* GetInterface(VideoEngine* video_engine); 154 155 // Releases the ViECapture sub-API and decreases an internal reference 156 // counter. 157 // Returns the new reference count. This value should be zero 158 // for all sub-API:s before the VideoEngine object can be safely deleted. 159 virtual int Release() = 0; 160 161 // Gets the number of available capture devices. 162 virtual int NumberOfCaptureDevices() = 0; 163 164 // Gets the name and unique id of a capture device. 165 virtual int GetCaptureDevice(unsigned int list_number, 166 char* device_nameUTF8, 167 const unsigned int device_nameUTF8Length, 168 char* unique_idUTF8, 169 const unsigned int unique_idUTF8Length) = 0; 170 171 // Allocates a capture device to be used in VideoEngine. 172 virtual int AllocateCaptureDevice(const char* unique_idUTF8, 173 const unsigned int unique_idUTF8Length, 174 int& capture_id) = 0; 175 176 // Registers an external capture device to be used in VideoEngine 177 virtual int AllocateExternalCaptureDevice( 178 int& capture_id, 179 ViEExternalCapture *&external_capture) = 0; 180 181 // Use capture device using external capture module. 182 virtual int AllocateCaptureDevice(VideoCaptureModule& capture_module, 183 int& capture_id) = 0; 184 185 // Releases a capture device and makes it available for other applications. 186 virtual int ReleaseCaptureDevice(const int capture_id) = 0; 187 188 // This function connects a capture device with a channel. Multiple channels 189 // can be connected to the same capture device. 190 virtual int ConnectCaptureDevice(const int capture_id, 191 const int video_channel) = 0; 192 193 // Disconnects a capture device as input for a specified channel. 194 virtual int DisconnectCaptureDevice(const int video_channel) = 0; 195 196 // Makes a capture device start capturing video frames. 197 virtual int StartCapture( 198 const int capture_id, 199 const CaptureCapability& capture_capability = CaptureCapability()) = 0; 200 201 // Stops a started capture device from capturing video frames. 202 virtual int StopCapture(const int capture_id) = 0; 203 204 // Rotates captured frames before encoding and sending. 205 // Used on mobile devices with rotates cameras. 206 virtual int SetRotateCapturedFrames(const int capture_id, 207 const RotateCapturedFrame rotation) = 0; 208 209 // This function sets the expected delay from when a video frame is captured 210 // to when that frame is delivered to VideoEngine. 211 virtual int SetCaptureDelay(const int capture_id, 212 const unsigned int capture_delay_ms) = 0; 213 214 // Returns the number of sets of capture capabilities the capture device 215 // supports. 216 virtual int NumberOfCapabilities( 217 const char* unique_id_utf8, 218 const unsigned int unique_id_utf8_length) = 0; 219 220 // Gets a set of capture capabilities for a specified capture device. 221 virtual int GetCaptureCapability(const char* unique_id_utf8, 222 const unsigned int unique_id_utf8_length, 223 const unsigned int capability_number, 224 CaptureCapability& capability) = 0; 225 226 // Displays the capture device property dialog box for the specified capture 227 // device. Windows only. 228 virtual int ShowCaptureSettingsDialogBox( 229 const char* unique_idUTF8, 230 const unsigned int unique_id_utf8_length, 231 const char* dialog_title, 232 void* parent_window = NULL, 233 const unsigned int x = 200, 234 const unsigned int y = 200) = 0; 235 236 // Gets the clockwise angle the frames from the camera must be rotated in 237 // order to display the frames correctly if the display is rotated in its 238 // natural orientation. 239 virtual int GetOrientation(const char* unique_id_utf8, 240 RotateCapturedFrame& orientation) = 0; 241 242 // Enables brightness alarm detection and the brightness alarm callback. 243 virtual int EnableBrightnessAlarm(const int capture_id, 244 const bool enable) = 0; 245 246 // Registers an instance of a user implementation of the ViECaptureObserver. 247 virtual int RegisterObserver(const int capture_id, 248 ViECaptureObserver& observer) = 0; 249 250 // Removes an already registered instance of ViECaptureObserver. 251 virtual int DeregisterObserver(const int capture_id) = 0; 252 253 protected: 254 ViECapture() {} 255 virtual ~ViECapture() {} 256 }; 257 258 } // namespace webrtc 259 260 #endif // WEBRTC_VIDEO_ENGINE_INCLUDE_VIE_CAPTURE_H_ 261