Home | History | Annotate | Download | only in video_engine
      1 /*
      2  *  Copyright (c) 2012 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 #ifndef WEBRTC_VIDEO_ENGINE_VIE_CAPTURER_H_
     12 #define WEBRTC_VIDEO_ENGINE_VIE_CAPTURER_H_
     13 
     14 #include <vector>
     15 
     16 #include "webrtc/base/thread_annotations.h"
     17 #include "webrtc/common_types.h"
     18 #include "webrtc/engine_configurations.h"
     19 #include "webrtc/modules/video_capture/include/video_capture.h"
     20 #include "webrtc/modules/video_coding/codecs/interface/video_codec_interface.h"
     21 #include "webrtc/modules/video_coding/main/interface/video_coding.h"
     22 #include "webrtc/modules/video_processing/main/interface/video_processing.h"
     23 #include "webrtc/system_wrappers/interface/scoped_ptr.h"
     24 #include "webrtc/typedefs.h"
     25 #include "webrtc/video_engine/include/vie_base.h"
     26 #include "webrtc/video_engine/include/vie_capture.h"
     27 #include "webrtc/video_engine/vie_defines.h"
     28 #include "webrtc/video_engine/vie_frame_provider_base.h"
     29 
     30 namespace webrtc {
     31 
     32 class Config;
     33 class CriticalSectionWrapper;
     34 class EventWrapper;
     35 class CpuOveruseObserver;
     36 class OveruseFrameDetector;
     37 class ProcessThread;
     38 class ThreadWrapper;
     39 class ViEEffectFilter;
     40 class ViEEncoder;
     41 struct ViEPicture;
     42 
     43 class ViECapturer
     44     : public ViEFrameProviderBase,
     45       public ViEExternalCapture,
     46       protected VideoCaptureDataCallback,
     47       protected VideoCaptureFeedBack {
     48  public:
     49   static ViECapturer* CreateViECapture(int capture_id,
     50                                        int engine_id,
     51                                        const Config& config,
     52                                        VideoCaptureModule* capture_module,
     53                                        ProcessThread& module_process_thread);
     54 
     55   static ViECapturer* CreateViECapture(
     56       int capture_id,
     57       int engine_id,
     58       const Config& config,
     59       const char* device_unique_idUTF8,
     60       uint32_t device_unique_idUTF8Length,
     61       ProcessThread& module_process_thread);
     62 
     63   ~ViECapturer();
     64 
     65   // Implements ViEFrameProviderBase.
     66   int FrameCallbackChanged();
     67   virtual int DeregisterFrameCallback(const ViEFrameCallback* callbackObject);
     68   bool IsFrameCallbackRegistered(const ViEFrameCallback* callbackObject);
     69 
     70   // Implements ExternalCapture.
     71   virtual int IncomingFrame(unsigned char* video_frame,
     72                             unsigned int video_frame_length,
     73                             uint16_t width,
     74                             uint16_t height,
     75                             RawVideoType video_type,
     76                             unsigned long long capture_time = 0);  // NOLINT
     77 
     78   virtual int IncomingFrameI420(const ViEVideoFrameI420& video_frame,
     79                                 unsigned long long capture_time = 0);  // NOLINT
     80 
     81   virtual void SwapFrame(I420VideoFrame* frame) OVERRIDE;
     82 
     83   // Start/Stop.
     84   int32_t Start(
     85       const CaptureCapability& capture_capability = CaptureCapability());
     86   int32_t Stop();
     87   bool Started();
     88 
     89   // Overrides the capture delay.
     90   int32_t SetCaptureDelay(int32_t delay_ms);
     91 
     92   // Sets rotation of the incoming captured frame.
     93   int32_t SetRotateCapturedFrames(const RotateCapturedFrame rotation);
     94 
     95   // Effect filter.
     96   int32_t RegisterEffectFilter(ViEEffectFilter* effect_filter);
     97   int32_t EnableDeflickering(bool enable);
     98   int32_t EnableBrightnessAlarm(bool enable);
     99 
    100   // Statistics observer.
    101   int32_t RegisterObserver(ViECaptureObserver* observer);
    102   int32_t DeRegisterObserver();
    103   bool IsObserverRegistered();
    104 
    105   // Information.
    106   const char* CurrentDeviceName() const;
    107 
    108   void RegisterCpuOveruseObserver(CpuOveruseObserver* observer);
    109   void SetCpuOveruseOptions(const CpuOveruseOptions& options);
    110   void GetCpuOveruseMetrics(CpuOveruseMetrics* metrics) const;
    111 
    112  protected:
    113   ViECapturer(int capture_id,
    114               int engine_id,
    115               const Config& config,
    116               ProcessThread& module_process_thread);
    117 
    118   int32_t Init(VideoCaptureModule* capture_module);
    119   int32_t Init(const char* device_unique_idUTF8,
    120                uint32_t device_unique_idUTF8Length);
    121 
    122   // Implements VideoCaptureDataCallback.
    123   virtual void OnIncomingCapturedFrame(const int32_t id,
    124                                        I420VideoFrame& video_frame);
    125   virtual void OnCaptureDelayChanged(const int32_t id,
    126                                      const int32_t delay);
    127 
    128   // Returns true if the capture capability has been set in |StartCapture|
    129   // function and may not be changed.
    130   bool CaptureCapabilityFixed();
    131 
    132   // Help function used for keeping track of VideoImageProcesingModule.
    133   // Creates the module if it is needed, returns 0 on success and guarantees
    134   // that the image proc module exist.
    135   int32_t IncImageProcRefCount();
    136   int32_t DecImageProcRefCount();
    137 
    138   // Implements VideoCaptureFeedBack
    139   virtual void OnCaptureFrameRate(const int32_t id,
    140                                   const uint32_t frame_rate);
    141   virtual void OnNoPictureAlarm(const int32_t id,
    142                                 const VideoCaptureAlarm alarm);
    143 
    144   // Thread functions for deliver captured frames to receivers.
    145   static bool ViECaptureThreadFunction(void* obj);
    146   bool ViECaptureProcess();
    147 
    148   void DeliverI420Frame(I420VideoFrame* video_frame);
    149   void DeliverCodedFrame(VideoFrame* video_frame);
    150 
    151  private:
    152   bool SwapCapturedAndDeliverFrameIfAvailable();
    153 
    154   // Never take capture_cs_ before deliver_cs_!
    155   scoped_ptr<CriticalSectionWrapper> capture_cs_;
    156   scoped_ptr<CriticalSectionWrapper> deliver_cs_;
    157   VideoCaptureModule* capture_module_;
    158   VideoCaptureExternal* external_capture_module_;
    159   ProcessThread& module_process_thread_;
    160   const int capture_id_;
    161 
    162   // Frame used in IncomingFrameI420.
    163   scoped_ptr<CriticalSectionWrapper> incoming_frame_cs_;
    164   I420VideoFrame incoming_frame_;
    165 
    166   // Capture thread.
    167   ThreadWrapper& capture_thread_;
    168   EventWrapper& capture_event_;
    169   EventWrapper& deliver_event_;
    170 
    171   scoped_ptr<I420VideoFrame> captured_frame_;
    172   scoped_ptr<I420VideoFrame> deliver_frame_;
    173 
    174   // Image processing.
    175   ViEEffectFilter* effect_filter_;
    176   VideoProcessingModule* image_proc_module_;
    177   int image_proc_module_ref_counter_;
    178   VideoProcessingModule::FrameStats* deflicker_frame_stats_;
    179   VideoProcessingModule::FrameStats* brightness_frame_stats_;
    180   Brightness current_brightness_level_;
    181   Brightness reported_brightness_level_;
    182 
    183   // Statistics observer.
    184   scoped_ptr<CriticalSectionWrapper> observer_cs_;
    185   ViECaptureObserver* observer_ GUARDED_BY(observer_cs_.get());
    186 
    187   CaptureCapability requested_capability_;
    188 
    189   scoped_ptr<OveruseFrameDetector> overuse_detector_;
    190 };
    191 
    192 }  // namespace webrtc
    193 
    194 #endif  // WEBRTC_VIDEO_ENGINE_VIE_CAPTURER_H_
    195