Home | History | Annotate | Download | only in vp8
      1 /*
      2  *  Copyright (c) 2014 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 
     12 #ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_SIMULCAST_ENCODER_ADAPTER_H_
     13 #define WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_SIMULCAST_ENCODER_ADAPTER_H_
     14 
     15 #include <vector>
     16 
     17 #include "webrtc/base/scoped_ptr.h"
     18 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
     19 
     20 namespace webrtc {
     21 
     22 class VideoEncoderFactory {
     23  public:
     24   virtual VideoEncoder* Create() = 0;
     25   virtual void Destroy(VideoEncoder* encoder) = 0;
     26   virtual ~VideoEncoderFactory() {}
     27 };
     28 
     29 // SimulcastEncoderAdapter implements simulcast support by creating multiple
     30 // webrtc::VideoEncoder instances with the given VideoEncoderFactory.
     31 // All the public interfaces are expected to be called from the same thread,
     32 // e.g the encoder thread.
     33 class SimulcastEncoderAdapter : public VP8Encoder {
     34  public:
     35   explicit SimulcastEncoderAdapter(VideoEncoderFactory* factory);
     36   virtual ~SimulcastEncoderAdapter();
     37 
     38   // Implements VideoEncoder
     39   int Release() override;
     40   int InitEncode(const VideoCodec* inst,
     41                  int number_of_cores,
     42                  size_t max_payload_size) override;
     43   int Encode(const VideoFrame& input_image,
     44              const CodecSpecificInfo* codec_specific_info,
     45              const std::vector<FrameType>* frame_types) override;
     46   int RegisterEncodeCompleteCallback(EncodedImageCallback* callback) override;
     47   int SetChannelParameters(uint32_t packet_loss, int64_t rtt) override;
     48   int SetRates(uint32_t new_bitrate_kbit, uint32_t new_framerate) override;
     49 
     50   // Eventual handler for the contained encoders' EncodedImageCallbacks, but
     51   // called from an internal helper that also knows the correct stream
     52   // index.
     53   int32_t Encoded(size_t stream_idx,
     54                   const EncodedImage& encodedImage,
     55                   const CodecSpecificInfo* codecSpecificInfo = NULL,
     56                   const RTPFragmentationHeader* fragmentation = NULL);
     57 
     58   void OnDroppedFrame() override;
     59 
     60   int GetTargetFramerate() override;
     61   bool SupportsNativeHandle() const override;
     62   const char* ImplementationName() const override;
     63 
     64  private:
     65   struct StreamInfo {
     66     StreamInfo()
     67         : encoder(NULL),
     68           callback(NULL),
     69           width(0),
     70           height(0),
     71           key_frame_request(false),
     72           send_stream(true) {}
     73     StreamInfo(VideoEncoder* encoder,
     74                EncodedImageCallback* callback,
     75                uint16_t width,
     76                uint16_t height,
     77                bool send_stream)
     78         : encoder(encoder),
     79           callback(callback),
     80           width(width),
     81           height(height),
     82           key_frame_request(false),
     83           send_stream(send_stream) {}
     84     // Deleted by SimulcastEncoderAdapter::Release().
     85     VideoEncoder* encoder;
     86     EncodedImageCallback* callback;
     87     uint16_t width;
     88     uint16_t height;
     89     bool key_frame_request;
     90     bool send_stream;
     91   };
     92 
     93   // Get the stream bitrate, for the stream |stream_idx|, given the bitrate
     94   // |new_bitrate_kbit| and the actual configured stream count in
     95   // |total_number_of_streams|. The function also returns whether there's enough
     96   // bandwidth to send this stream via |send_stream|.
     97   uint32_t GetStreamBitrate(int stream_idx,
     98                             size_t total_number_of_streams,
     99                             uint32_t new_bitrate_kbit,
    100                             bool* send_stream) const;
    101 
    102   // Populate the codec settings for each stream.
    103   void PopulateStreamCodec(const webrtc::VideoCodec* inst,
    104                            int stream_index,
    105                            size_t total_number_of_streams,
    106                            bool highest_resolution_stream,
    107                            webrtc::VideoCodec* stream_codec,
    108                            bool* send_stream);
    109 
    110   bool Initialized() const;
    111 
    112   rtc::scoped_ptr<VideoEncoderFactory> factory_;
    113   rtc::scoped_ptr<Config> screensharing_extra_options_;
    114   VideoCodec codec_;
    115   std::vector<StreamInfo> streaminfos_;
    116   EncodedImageCallback* encoded_complete_callback_;
    117 };
    118 
    119 }  // namespace webrtc
    120 
    121 #endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_SIMULCAST_ENCODER_ADAPTER_H_
    122