video_capture_input.h revision 470e71d3649f6cac4688e83819640b012b5d38bb
1470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/* 2470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * 4470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Use of this source code is governed by a BSD-style license 5470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * that can be found in the LICENSE file in the root of the source 6470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * tree. An additional intellectual property rights grant can be found 7470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * in the file PATENTS. All contributing project authors may 8470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * be found in the AUTHORS file in the root of the source tree. 9470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */ 10470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 11470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/* 12470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * vie_capturer.h 13470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */ 14470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 15470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifndef WEBRTC_VIDEO_ENGINE_MAIN_SOURCE_VIE_CAPTURER_H_ 16470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#define WEBRTC_VIDEO_ENGINE_MAIN_SOURCE_VIE_CAPTURER_H_ 17470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 18470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com// Defines 19470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "engine_configurations.h" 20470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "vie_defines.h" 21470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "typedefs.h" 22470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 23470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "video_capture.h" 24470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "video_processing.h" 25470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "vie_frame_provider_base.h" 26470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "video_codec_interface.h" 27470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "video_coding.h" 28470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "vie_capture.h" 29470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "common_types.h" 30470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 31470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com// Forward declarations 32470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comstruct ViEPicture; 33470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 34470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comnamespace webrtc { 35470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass CriticalSectionWrapper; 36470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass EventWrapper; 37470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ThreadWrapper; 38470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ViEEffectFilter; 39470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ViEEncoder; 40470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ProcessThread; 41470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 42470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ViECapturer: public ViEFrameProviderBase, 43470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com public ViEExternalCapture, // External capture 44470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com protected VideoCaptureDataCallback, 45470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com protected VideoEncoder, 46470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com protected VCMReceiveCallback, 47470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com protected VideoCaptureFeedBack 48470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{ 49470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.compublic: 50470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com static ViECapturer* CreateViECapture(int captureId, int, 51470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com VideoCaptureModule& captureModule, 52470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com ProcessThread& moduleProcessThread); 53470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 54470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com static ViECapturer* CreateViECapture(int captureId, int engineId, 55470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com const WebRtc_UWord8* deviceUniqueIdUTF8, 56470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com WebRtc_UWord32 deviceUniqueIdUTF8Length, 57470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com ProcessThread& moduleProcessThread); 58470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com ~ViECapturer(); 59470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 60470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com //Override ViEFrameProviderBase 61470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com int FrameCallbackChanged(); 62470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com virtual int DeregisterFrameCallback(const ViEFrameCallback* callbackObject); 63470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com bool IsFrameCallbackRegistered(const ViEFrameCallback* callbackObject); 64470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 65470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com // Implements ExternalCapture 66470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com virtual int IncomingFrame(unsigned char* videoFrame, 67470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com unsigned int videoFrameLength, 68470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com unsigned short width, unsigned short height, 69470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com RawVideoType videoType, 70470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com unsigned long long captureTime = 0); 71470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 72470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com // Use this capture device as encoder. Returns 0 if the codec is supported by this capture device. 73470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com virtual WebRtc_Word32 PreEncodeToViEEncoder(const VideoCodec& codec, 74470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com ViEEncoder& vieEncoder, 75470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com WebRtc_Word32 vieEncoderId); 76470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 77470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com // Start/Stop 78470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com WebRtc_Word32 Start(const CaptureCapability captureCapability = 79470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com CaptureCapability()); 80470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com WebRtc_Word32 Stop(); 81470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com bool Started(); 82470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 83470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com WebRtc_Word32 SetCaptureDelay(WebRtc_Word32 delayMS); 84470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com WebRtc_Word32 SetRotateCapturedFrames(const RotateCapturedFrame rotation); 85470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 86470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com // Effect filter 87470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com WebRtc_Word32 RegisterEffectFilter(ViEEffectFilter* effectFilter); 88470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com WebRtc_Word32 EnableDenoising(bool enable); 89470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com WebRtc_Word32 EnableDeflickering(bool enable); 90470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com WebRtc_Word32 EnableBrightnessAlarm(bool enable); 91470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 92470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com // Statistic observer 93470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com WebRtc_Word32 RegisterObserver(ViECaptureObserver& observer); 94470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com WebRtc_Word32 DeRegisterObserver(); 95470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com bool IsObserverRegistered(); 96470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 97470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com //Information 98470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com const WebRtc_UWord8* CurrentDeviceName() const; 99470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 100470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com // set device images 101470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com WebRtc_Word32 SetCaptureDeviceImage(const VideoFrame& captureDeviceImage); 102470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 103470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comprotected: 104470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com ViECapturer(int captureId, int engineId, 105470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com ProcessThread& moduleProcessThread); 106470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 107470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com WebRtc_Word32 Init(VideoCaptureModule& captureModule); 108470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com WebRtc_Word32 Init(const WebRtc_UWord8* deviceUniqueIdUTF8, 109470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com const WebRtc_UWord32 deviceUniqueIdUTF8Length); 110470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 111470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com // Implements VideoCaptureDataCallback 112470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com virtual void OnIncomingCapturedFrame(const WebRtc_Word32 id, 113470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com VideoFrame& videoFrame, 114470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com VideoCodecType codecType); 115470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com virtual void OnCaptureDelayChanged(const WebRtc_Word32 id, 116470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com const WebRtc_Word32 delay); 117470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com bool EncoderActive(); 118470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com bool CaptureCapabilityFixed(); // Returns true if the capture capability has been set in the StartCapture function and may not be changed. 119470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com WebRtc_Word32 IncImageProcRefCount(); 120470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com WebRtc_Word32 DecImageProcRefCount(); 121470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 122470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com // Implements VideoEncoder 123470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com virtual WebRtc_Word32 Version(WebRtc_Word8 *version, WebRtc_Word32 length) const; 124470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com virtual WebRtc_Word32 InitEncode(const VideoCodec* codecSettings, 125470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com WebRtc_Word32 numberOfCores, 126470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com WebRtc_UWord32 maxPayloadSize); 127470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com virtual WebRtc_Word32 Encode(const RawImage& inputImage, 128470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com const CodecSpecificInfo* codecSpecificInfo = 129470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com NULL, 130470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com VideoFrameType frameType = kDeltaFrame); 131470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com virtual WebRtc_Word32 RegisterEncodeCompleteCallback( 132470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com EncodedImageCallback* callback); 133470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com virtual WebRtc_Word32 Release(); 134470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com virtual WebRtc_Word32 Reset(); 135470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com virtual WebRtc_Word32 SetPacketLoss(WebRtc_UWord32 packetLoss); 136470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com virtual WebRtc_Word32 SetRates(WebRtc_UWord32 newBitRate, 137470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com WebRtc_UWord32 frameRate); 138470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 139470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com // Implements VCMReceiveCallback 140470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com virtual WebRtc_Word32 FrameToRender(VideoFrame& videoFrame); 141470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com // Implements VideoCaptureFeedBack 142470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com virtual void OnCaptureFrameRate(const WebRtc_Word32 id, 143470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com const WebRtc_UWord32 frameRate); 144470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com virtual void OnNoPictureAlarm(const WebRtc_Word32 id, 145470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com const VideoCaptureAlarm alarm); 146470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 147470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com // Thread functions for deliver captured frames to receivers 148470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com static bool ViECaptureThreadFunction(void* obj); 149470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com bool ViECaptureProcess(); 150470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 151470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com void DeliverI420Frame(VideoFrame& videoFrame); 152470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com void DeliverCodedFrame(VideoFrame& videoFrame); 153470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 154470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comprivate: 155470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com enum {kThreadWaitTimeMs = 100}; 156470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 157470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com CriticalSectionWrapper& _captureCritsect; // Never take this one before deliverCritsect! 158470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com CriticalSectionWrapper& _deliverCritsect; 159470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com VideoCaptureModule* _captureModule; 160470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com bool _useExternalModule; 161470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com VideoCaptureExternal* _externalCaptureModule; 162470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com ProcessThread& _moduleProcessThread; 163470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com const int _captureId; 164470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 165470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com // Capture thread 166470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com ThreadWrapper& _vieCaptureThread; 167470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com EventWrapper& _vieCaptureEvent; 168470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com EventWrapper& _vieDeliverEvent; 169470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 170470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com VideoFrame _capturedFrame; 171470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com VideoFrame _deliverFrame; 172470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com VideoFrame _encodedFrame; 173470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 174470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com // Image processing 175470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com ViEEffectFilter* _effectFilter; 176470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com VideoProcessingModule* _imageProcModule; 177470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com int _imageProcModuleRefCounter; 178470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com VideoProcessingModule::FrameStats* _deflickerFrameStats; 179470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com VideoProcessingModule::FrameStats* _brightnessFrameStats; 180470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com Brightness _currentBrightnessLevel; 181470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com Brightness _reportedBrightnessLevel; 182470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com bool _denoisingEnabled; 183470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 184470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com //Statistic observer 185470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com CriticalSectionWrapper& _observerCritsect; 186470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com ViECaptureObserver* _observer; 187470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 188470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com // Encoding using encoding capable cameras 189470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com CriticalSectionWrapper& _encodingCritsect; 190470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com VideoCaptureModule::VideoCaptureEncodeInterface* _captureEncoder; 191470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com EncodedImageCallback* _encodeCompleteCallback; 192470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com VideoCodec _codec; 193470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com ViEEncoder* _vieEncoder; //ViEEncoder we are encoding for. 194470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com WebRtc_Word32 _vieEncoderId; //ViEEncoder id we are encoding for. 195470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com VideoCodingModule* _vcm; // Used for decoding preencoded frames 196470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com EncodedVideoData _decodeBuffer; // Used for decoding preencoded frames 197470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com bool _decoderInitialized; 198470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com CaptureCapability _requestedCapability; 199470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 200470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com VideoFrame _captureDeviceImage; 201470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}; 202470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com} // namespace webrtc 203470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif // WEBRTC_VIDEO_ENGINE_MAIN_SOURCE_VIE_CAPTURER_H_ 204