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