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_FRAME_PROVIDER_BASE_H_
     12 #define WEBRTC_VIDEO_ENGINE_VIE_FRAME_PROVIDER_BASE_H_
     13 
     14 #include <vector>
     15 
     16 #include "webrtc/common_types.h"
     17 #include "webrtc/system_wrappers/interface/scoped_ptr.h"
     18 #include "webrtc/typedefs.h"
     19 
     20 namespace webrtc {
     21 
     22 class CriticalSectionWrapper;
     23 class VideoEncoder;
     24 class I420VideoFrame;
     25 
     26 // ViEFrameCallback shall be implemented by all classes receiving frames from a
     27 // frame provider.
     28 class ViEFrameCallback {
     29  public:
     30   virtual void DeliverFrame(int id,
     31                             I420VideoFrame* video_frame,
     32                             int num_csrcs = 0,
     33                             const uint32_t CSRC[kRtpCsrcSize] = NULL) = 0;
     34 
     35   // The capture delay has changed from the provider. |frame_delay| is given in
     36   // ms.
     37   virtual void DelayChanged(int id, int frame_delay) = 0;
     38 
     39   // Get the width, height and frame rate preferred by this observer.
     40   virtual int GetPreferedFrameSettings(int* width,
     41                                        int* height,
     42                                        int* frame_rate) = 0;
     43 
     44   // ProviderDestroyed is called when the frame is about to be destroyed. There
     45   // must not be any more calls to the frame provider after this.
     46   virtual void ProviderDestroyed(int id) = 0;
     47 
     48   virtual ~ViEFrameCallback() {}
     49 };
     50 
     51 // ViEFrameProviderBase is a base class that will deliver frames to all
     52 // registered ViEFrameCallbacks.
     53 class ViEFrameProviderBase {
     54  public:
     55   ViEFrameProviderBase(int Id, int engine_id);
     56   virtual ~ViEFrameProviderBase();
     57 
     58   // Returns the frame provider id.
     59   int Id();
     60 
     61   // Register frame callbacks, i.e. a receiver of the captured frame.
     62   virtual int RegisterFrameCallback(int observer_id,
     63                                     ViEFrameCallback* callback_object);
     64 
     65   virtual int DeregisterFrameCallback(const ViEFrameCallback* callback_object);
     66 
     67   virtual bool IsFrameCallbackRegistered(
     68       const ViEFrameCallback* callback_object);
     69 
     70   int NumberOfRegisteredFrameCallbacks();
     71 
     72   // FrameCallbackChanged
     73   // Inherited classes should check for new frame_settings and reconfigure
     74   // output if possible.
     75   virtual int FrameCallbackChanged() = 0;
     76 
     77  protected:
     78   void DeliverFrame(I420VideoFrame* video_frame,
     79                     int num_csrcs = 0,
     80                     const uint32_t CSRC[kRtpCsrcSize] = NULL);
     81   void SetFrameDelay(int frame_delay);
     82   int FrameDelay();
     83   int GetBestFormat(int* best_width,
     84                     int* best_height,
     85                     int* best_frame_rate);
     86 
     87   int id_;
     88   int engine_id_;
     89 
     90   // Frame callbacks.
     91   typedef std::vector<ViEFrameCallback*> FrameCallbacks;
     92   FrameCallbacks frame_callbacks_;
     93   scoped_ptr<CriticalSectionWrapper> provider_cs_;
     94 
     95  private:
     96   scoped_ptr<I420VideoFrame> extra_frame_;
     97   int frame_delay_;
     98 };
     99 
    100 }  // namespace webrtc
    101 
    102 #endif  // WEBRTC_VIDEO_ENGINE_VIE_FRAME_PROVIDER_BASE_H_
    103