Home | History | Annotate | Download | only in source
      1 /*
      2  *  Copyright (c) 2011 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_MAIN_SOURCE_RECEIVER_H_
     12 #define WEBRTC_MODULES_VIDEO_CODING_MAIN_SOURCE_RECEIVER_H_
     13 
     14 #include "webrtc/modules/video_coding/main/source/jitter_buffer.h"
     15 #include "webrtc/modules/video_coding/main/source/packet.h"
     16 #include "webrtc/modules/video_coding/main/source/timing.h"
     17 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
     18 #include "webrtc/modules/video_coding/main/interface/video_coding.h"
     19 #include "webrtc/modules/video_coding/main/interface/video_coding_defines.h"
     20 
     21 namespace webrtc {
     22 
     23 class Clock;
     24 class VCMEncodedFrame;
     25 
     26 enum VCMNackStatus {
     27   kNackOk,
     28   kNackKeyFrameRequest
     29 };
     30 
     31 enum VCMReceiverState {
     32   kReceiving,
     33   kPassive,
     34   kWaitForPrimaryDecode
     35 };
     36 
     37 class VCMReceiver {
     38  public:
     39   VCMReceiver(VCMTiming* timing,
     40               Clock* clock,
     41               EventFactory* event_factory,
     42               bool master);
     43   ~VCMReceiver();
     44 
     45   void Reset();
     46   int32_t Initialize();
     47   void UpdateRtt(uint32_t rtt);
     48   int32_t InsertPacket(const VCMPacket& packet,
     49                        uint16_t frame_width,
     50                        uint16_t frame_height);
     51   VCMEncodedFrame* FrameForDecoding(uint16_t max_wait_time_ms,
     52                                     int64_t& next_render_time_ms,
     53                                     bool render_timing = true,
     54                                     VCMReceiver* dual_receiver = NULL);
     55   void ReleaseFrame(VCMEncodedFrame* frame);
     56   void ReceiveStatistics(uint32_t* bitrate, uint32_t* framerate);
     57   void ReceivedFrameCount(VCMFrameCount* frame_count) const;
     58   uint32_t DiscardedPackets() const;
     59 
     60   // NACK.
     61   void SetNackMode(VCMNackMode nackMode,
     62                    int low_rtt_nack_threshold_ms,
     63                    int high_rtt_nack_threshold_ms);
     64   void SetNackSettings(size_t max_nack_list_size,
     65                        int max_packet_age_to_nack,
     66                        int max_incomplete_time_ms);
     67   VCMNackMode NackMode() const;
     68   VCMNackStatus NackList(uint16_t* nackList, uint16_t size,
     69                          uint16_t* nack_list_length);
     70 
     71   // Dual decoder.
     72   bool DualDecoderCaughtUp(VCMEncodedFrame* dual_frame,
     73                            VCMReceiver& dual_receiver) const;
     74   VCMReceiverState State() const;
     75 
     76   // Receiver video delay.
     77   int SetMinReceiverDelay(int desired_delay_ms);
     78 
     79   // Decoding with errors.
     80   void SetDecodeErrorMode(VCMDecodeErrorMode decode_error_mode);
     81   VCMDecodeErrorMode DecodeErrorMode() const;
     82 
     83   // Returns size in time (milliseconds) of complete continuous frames in the
     84   // jitter buffer. The render time is estimated based on the render delay at
     85   // the time this function is called.
     86   int RenderBufferSizeMs();
     87 
     88  private:
     89   void CopyJitterBufferStateFromReceiver(const VCMReceiver& receiver);
     90   void UpdateState(VCMReceiverState new_state);
     91   void UpdateState(const VCMEncodedFrame& frame);
     92   static int32_t GenerateReceiverId();
     93 
     94   CriticalSectionWrapper* crit_sect_;
     95   Clock* clock_;
     96   bool master_;
     97   VCMJitterBuffer jitter_buffer_;
     98   VCMTiming* timing_;
     99   scoped_ptr<EventWrapper> render_wait_event_;
    100   VCMReceiverState state_;
    101   int max_video_delay_ms_;
    102 
    103   static int32_t receiver_id_counter_;
    104 };
    105 
    106 }  // namespace webrtc
    107 
    108 #endif  // WEBRTC_MODULES_VIDEO_CODING_MAIN_SOURCE_RECEIVER_H_
    109