Home | History | Annotate | Download | only in video_coding
      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_MODULES_VIDEO_CODING_GENERIC_ENCODER_H_
     12 #define WEBRTC_MODULES_VIDEO_CODING_GENERIC_ENCODER_H_
     13 
     14 #include <stdio.h>
     15 #include <vector>
     16 
     17 #include "webrtc/modules/video_coding/include/video_codec_interface.h"
     18 #include "webrtc/modules/video_coding/include/video_coding_defines.h"
     19 
     20 #include "webrtc/base/criticalsection.h"
     21 #include "webrtc/base/scoped_ptr.h"
     22 
     23 namespace webrtc {
     24 class CriticalSectionWrapper;
     25 
     26 namespace media_optimization {
     27 class MediaOptimization;
     28 }  // namespace media_optimization
     29 
     30 struct EncoderParameters {
     31   uint32_t target_bitrate;
     32   uint8_t loss_rate;
     33   int64_t rtt;
     34   uint32_t input_frame_rate;
     35 };
     36 
     37 /*************************************/
     38 /* VCMEncodeFrameCallback class     */
     39 /***********************************/
     40 class VCMEncodedFrameCallback : public EncodedImageCallback {
     41  public:
     42     explicit VCMEncodedFrameCallback(
     43       EncodedImageCallback* post_encode_callback);
     44     virtual ~VCMEncodedFrameCallback();
     45 
     46     /*
     47     * Callback implementation - codec encode complete
     48     */
     49     int32_t Encoded(
     50         const EncodedImage& encodedImage,
     51         const CodecSpecificInfo* codecSpecificInfo = NULL,
     52         const RTPFragmentationHeader* fragmentationHeader = NULL);
     53     /*
     54     * Callback implementation - generic encoder encode complete
     55     */
     56     int32_t SetTransportCallback(VCMPacketizationCallback* transport);
     57     /**
     58     * Set media Optimization
     59     */
     60     void SetMediaOpt(media_optimization::MediaOptimization* mediaOpt);
     61 
     62     void SetPayloadType(uint8_t payloadType) {
     63       _payloadType = payloadType;
     64     }
     65 
     66     void SetInternalSource(bool internalSource) {
     67       _internalSource = internalSource;
     68     }
     69 
     70     void SetRotation(VideoRotation rotation) { _rotation = rotation; }
     71     void SignalLastEncoderImplementationUsed(
     72         const char* encoder_implementation_name);
     73 
     74  private:
     75     VCMPacketizationCallback* send_callback_;
     76     media_optimization::MediaOptimization* _mediaOpt;
     77     uint8_t _payloadType;
     78     bool _internalSource;
     79     VideoRotation _rotation;
     80 
     81     EncodedImageCallback* post_encode_callback_;
     82 
     83 #ifdef DEBUG_ENCODER_BIT_STREAM
     84     FILE* _bitStreamAfterEncoder;
     85 #endif
     86 };  // end of VCMEncodeFrameCallback class
     87 
     88 /******************************/
     89 /* VCMGenericEncoder class    */
     90 /******************************/
     91 class VCMGenericEncoder {
     92   friend class VCMCodecDataBase;
     93 
     94  public:
     95   VCMGenericEncoder(VideoEncoder* encoder,
     96                     VideoEncoderRateObserver* rate_observer,
     97                     VCMEncodedFrameCallback* encoded_frame_callback,
     98                     bool internalSource);
     99   ~VCMGenericEncoder();
    100   /**
    101   * Free encoder memory
    102   */
    103   int32_t Release();
    104   /**
    105   * Initialize the encoder with the information from the VideoCodec
    106   */
    107   int32_t InitEncode(const VideoCodec* settings,
    108                      int32_t numberOfCores,
    109                      size_t maxPayloadSize);
    110   /**
    111   * Encode raw image
    112   * inputFrame        : Frame containing raw image
    113   * codecSpecificInfo : Specific codec data
    114   * cameraFrameRate   : Request or information from the remote side
    115   * frameType         : The requested frame type to encode
    116   */
    117   int32_t Encode(const VideoFrame& inputFrame,
    118                  const CodecSpecificInfo* codecSpecificInfo,
    119                  const std::vector<FrameType>& frameTypes);
    120 
    121   void SetEncoderParameters(const EncoderParameters& params);
    122   EncoderParameters GetEncoderParameters() const;
    123 
    124   int32_t SetPeriodicKeyFrames(bool enable);
    125 
    126   int32_t RequestFrame(const std::vector<FrameType>& frame_types);
    127 
    128   bool InternalSource() const;
    129 
    130   void OnDroppedFrame();
    131 
    132   bool SupportsNativeHandle() const;
    133 
    134   int GetTargetFramerate();
    135 
    136  private:
    137   VideoEncoder* const encoder_;
    138   VideoEncoderRateObserver* const rate_observer_;
    139   VCMEncodedFrameCallback* const vcm_encoded_frame_callback_;
    140   const bool internal_source_;
    141   mutable rtc::CriticalSection params_lock_;
    142   EncoderParameters encoder_params_ GUARDED_BY(params_lock_);
    143   VideoRotation rotation_;
    144   bool is_screenshare_;
    145 };  // end of VCMGenericEncoder class
    146 
    147 }  // namespace webrtc
    148 
    149 #endif  // WEBRTC_MODULES_VIDEO_CODING_GENERIC_ENCODER_H_
    150