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