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_VIDEO_CODING_IMPL_H_
     12 #define WEBRTC_MODULES_VIDEO_CODING_VIDEO_CODING_IMPL_H_
     13 
     14 #include "webrtc/modules/video_coding/include/video_coding.h"
     15 
     16 #include <vector>
     17 
     18 #include "webrtc/base/thread_annotations.h"
     19 #include "webrtc/base/thread_checker.h"
     20 #include "webrtc/modules/video_coding/codec_database.h"
     21 #include "webrtc/modules/video_coding/frame_buffer.h"
     22 #include "webrtc/modules/video_coding/generic_decoder.h"
     23 #include "webrtc/modules/video_coding/generic_encoder.h"
     24 #include "webrtc/modules/video_coding/jitter_buffer.h"
     25 #include "webrtc/modules/video_coding/media_optimization.h"
     26 #include "webrtc/modules/video_coding/receiver.h"
     27 #include "webrtc/modules/video_coding/timing.h"
     28 #include "webrtc/modules/video_coding/utility/qp_parser.h"
     29 #include "webrtc/system_wrappers/include/clock.h"
     30 #include "webrtc/system_wrappers/include/critical_section_wrapper.h"
     31 
     32 namespace webrtc {
     33 
     34 class EncodedFrameObserver;
     35 
     36 namespace vcm {
     37 
     38 class VCMProcessTimer {
     39  public:
     40   VCMProcessTimer(int64_t periodMs, Clock* clock)
     41       : _clock(clock),
     42         _periodMs(periodMs),
     43         _latestMs(_clock->TimeInMilliseconds()) {}
     44   int64_t Period() const;
     45   int64_t TimeUntilProcess() const;
     46   void Processed();
     47 
     48  private:
     49   Clock* _clock;
     50   int64_t _periodMs;
     51   int64_t _latestMs;
     52 };
     53 
     54 class VideoSender {
     55  public:
     56   typedef VideoCodingModule::SenderNackMode SenderNackMode;
     57 
     58   VideoSender(Clock* clock,
     59               EncodedImageCallback* post_encode_callback,
     60               VideoEncoderRateObserver* encoder_rate_observer,
     61               VCMQMSettingsCallback* qm_settings_callback);
     62 
     63   ~VideoSender();
     64 
     65   // Register the send codec to be used.
     66   // This method must be called on the construction thread.
     67   int32_t RegisterSendCodec(const VideoCodec* sendCodec,
     68                             uint32_t numberOfCores,
     69                             uint32_t maxPayloadSize);
     70 
     71   void RegisterExternalEncoder(VideoEncoder* externalEncoder,
     72                                uint8_t payloadType,
     73                                bool internalSource);
     74 
     75   int Bitrate(unsigned int* bitrate) const;
     76   int FrameRate(unsigned int* framerate) const;
     77 
     78   int32_t SetChannelParameters(uint32_t target_bitrate,  // bits/s.
     79                                uint8_t lossRate,
     80                                int64_t rtt);
     81 
     82   int32_t RegisterTransportCallback(VCMPacketizationCallback* transport);
     83   int32_t RegisterSendStatisticsCallback(VCMSendStatisticsCallback* sendStats);
     84   int32_t RegisterProtectionCallback(VCMProtectionCallback* protection);
     85   void SetVideoProtection(VCMVideoProtection videoProtection);
     86 
     87   int32_t AddVideoFrame(const VideoFrame& videoFrame,
     88                         const VideoContentMetrics* _contentMetrics,
     89                         const CodecSpecificInfo* codecSpecificInfo);
     90 
     91   int32_t IntraFrameRequest(int stream_index);
     92   int32_t EnableFrameDropper(bool enable);
     93 
     94   void SuspendBelowMinBitrate();
     95   bool VideoSuspended() const;
     96 
     97   int64_t TimeUntilNextProcess();
     98   int32_t Process();
     99 
    100  private:
    101   void SetEncoderParameters(EncoderParameters params)
    102       EXCLUSIVE_LOCKS_REQUIRED(send_crit_);
    103 
    104   Clock* const clock_;
    105 
    106   rtc::scoped_ptr<CriticalSectionWrapper> process_crit_sect_;
    107   mutable rtc::CriticalSection send_crit_;
    108   VCMGenericEncoder* _encoder;
    109   VCMEncodedFrameCallback _encodedFrameCallback;
    110   std::vector<FrameType> _nextFrameTypes;
    111   media_optimization::MediaOptimization _mediaOpt;
    112   VCMSendStatisticsCallback* _sendStatsCallback GUARDED_BY(process_crit_sect_);
    113   VCMCodecDataBase _codecDataBase GUARDED_BY(send_crit_);
    114   bool frame_dropper_enabled_ GUARDED_BY(send_crit_);
    115   VCMProcessTimer _sendStatsTimer;
    116 
    117   // Must be accessed on the construction thread of VideoSender.
    118   VideoCodec current_codec_;
    119   rtc::ThreadChecker main_thread_;
    120 
    121   VCMQMSettingsCallback* const qm_settings_callback_;
    122   VCMProtectionCallback* protection_callback_;
    123 
    124   rtc::CriticalSection params_lock_;
    125   EncoderParameters encoder_params_ GUARDED_BY(params_lock_);
    126 };
    127 
    128 class VideoReceiver {
    129  public:
    130   typedef VideoCodingModule::ReceiverRobustness ReceiverRobustness;
    131 
    132   VideoReceiver(Clock* clock, EventFactory* event_factory);
    133   ~VideoReceiver();
    134 
    135   int32_t RegisterReceiveCodec(const VideoCodec* receiveCodec,
    136                                int32_t numberOfCores,
    137                                bool requireKeyFrame);
    138 
    139   void RegisterExternalDecoder(VideoDecoder* externalDecoder,
    140                                uint8_t payloadType);
    141   int32_t RegisterReceiveCallback(VCMReceiveCallback* receiveCallback);
    142   int32_t RegisterReceiveStatisticsCallback(
    143       VCMReceiveStatisticsCallback* receiveStats);
    144   int32_t RegisterDecoderTimingCallback(
    145       VCMDecoderTimingCallback* decoderTiming);
    146   int32_t RegisterFrameTypeCallback(VCMFrameTypeCallback* frameTypeCallback);
    147   int32_t RegisterPacketRequestCallback(VCMPacketRequestCallback* callback);
    148   int RegisterRenderBufferSizeCallback(VCMRenderBufferSizeCallback* callback);
    149 
    150   int32_t Decode(uint16_t maxWaitTimeMs);
    151   int32_t ResetDecoder();
    152 
    153   int32_t ReceiveCodec(VideoCodec* currentReceiveCodec) const;
    154   VideoCodecType ReceiveCodec() const;
    155 
    156   int32_t IncomingPacket(const uint8_t* incomingPayload,
    157                          size_t payloadLength,
    158                          const WebRtcRTPHeader& rtpInfo);
    159   int32_t SetMinimumPlayoutDelay(uint32_t minPlayoutDelayMs);
    160   int32_t SetRenderDelay(uint32_t timeMS);
    161   int32_t Delay() const;
    162   uint32_t DiscardedPackets() const;
    163 
    164   int SetReceiverRobustnessMode(ReceiverRobustness robustnessMode,
    165                                 VCMDecodeErrorMode errorMode);
    166   void SetNackSettings(size_t max_nack_list_size,
    167                        int max_packet_age_to_nack,
    168                        int max_incomplete_time_ms);
    169 
    170   void SetDecodeErrorMode(VCMDecodeErrorMode decode_error_mode);
    171   int SetMinReceiverDelay(int desired_delay_ms);
    172 
    173   int32_t SetReceiveChannelParameters(int64_t rtt);
    174   int32_t SetVideoProtection(VCMVideoProtection videoProtection, bool enable);
    175 
    176   int64_t TimeUntilNextProcess();
    177   int32_t Process();
    178 
    179   void RegisterPreDecodeImageCallback(EncodedImageCallback* observer);
    180   void TriggerDecoderShutdown();
    181 
    182  protected:
    183   int32_t Decode(const webrtc::VCMEncodedFrame& frame)
    184       EXCLUSIVE_LOCKS_REQUIRED(_receiveCritSect);
    185   int32_t RequestKeyFrame();
    186   int32_t RequestSliceLossIndication(const uint64_t pictureID) const;
    187 
    188  private:
    189   Clock* const clock_;
    190   rtc::scoped_ptr<CriticalSectionWrapper> process_crit_sect_;
    191   CriticalSectionWrapper* _receiveCritSect;
    192   VCMTiming _timing;
    193   VCMReceiver _receiver;
    194   VCMDecodedFrameCallback _decodedFrameCallback;
    195   VCMFrameTypeCallback* _frameTypeCallback GUARDED_BY(process_crit_sect_);
    196   VCMReceiveStatisticsCallback* _receiveStatsCallback
    197       GUARDED_BY(process_crit_sect_);
    198   VCMDecoderTimingCallback* _decoderTimingCallback
    199       GUARDED_BY(process_crit_sect_);
    200   VCMPacketRequestCallback* _packetRequestCallback
    201       GUARDED_BY(process_crit_sect_);
    202   VCMRenderBufferSizeCallback* render_buffer_callback_
    203       GUARDED_BY(process_crit_sect_);
    204   VCMGenericDecoder* _decoder;
    205 #ifdef DEBUG_DECODER_BIT_STREAM
    206   FILE* _bitStreamBeforeDecoder;
    207 #endif
    208   VCMFrameBuffer _frameFromFile;
    209   bool _scheduleKeyRequest GUARDED_BY(process_crit_sect_);
    210   size_t max_nack_list_size_ GUARDED_BY(process_crit_sect_);
    211   EncodedImageCallback* pre_decode_image_callback_ GUARDED_BY(_receiveCritSect);
    212 
    213   VCMCodecDataBase _codecDataBase GUARDED_BY(_receiveCritSect);
    214   VCMProcessTimer _receiveStatsTimer;
    215   VCMProcessTimer _retransmissionTimer;
    216   VCMProcessTimer _keyRequestTimer;
    217   QpParser qp_parser_;
    218 };
    219 
    220 }  // namespace vcm
    221 }  // namespace webrtc
    222 #endif  // WEBRTC_MODULES_VIDEO_CODING_VIDEO_CODING_IMPL_H_
    223