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 MODULES_VIDEO_CODING_RECEIVER_H_ 12 #define MODULES_VIDEO_CODING_RECEIVER_H_ 13 14 #include <memory> 15 #include <vector> 16 17 #include "modules/video_coding/include/video_coding.h" 18 #include "modules/video_coding/include/video_coding_defines.h" 19 #include "modules/video_coding/jitter_buffer.h" 20 #include "modules/video_coding/packet.h" 21 #include "modules/video_coding/timing.h" 22 #include "rtc_base/criticalsection.h" 23 24 namespace webrtc { 25 26 class Clock; 27 class VCMEncodedFrame; 28 29 class VCMReceiver { 30 public: 31 // Constructor for current interface, will be removed when the 32 // new jitter buffer is in place. 33 VCMReceiver(VCMTiming* timing, Clock* clock, EventFactory* event_factory); 34 35 // Create method for the new jitter buffer. 36 VCMReceiver(VCMTiming* timing, 37 Clock* clock, 38 EventFactory* event_factory, 39 NackSender* nack_sender, 40 KeyFrameRequestSender* keyframe_request_sender); 41 42 // Using this constructor, you can specify a different event factory for the 43 // jitter buffer. Useful for unit tests when you want to simulate incoming 44 // packets, in which case the jitter buffer's wait event is different from 45 // that of VCMReceiver itself. 46 // 47 // Constructor for current interface, will be removed when the 48 // new jitter buffer is in place. 49 VCMReceiver(VCMTiming* timing, 50 Clock* clock, 51 std::unique_ptr<EventWrapper> receiver_event, 52 std::unique_ptr<EventWrapper> jitter_buffer_event); 53 54 // Create method for the new jitter buffer. 55 VCMReceiver(VCMTiming* timing, 56 Clock* clock, 57 std::unique_ptr<EventWrapper> receiver_event, 58 std::unique_ptr<EventWrapper> jitter_buffer_event, 59 NackSender* nack_sender, 60 KeyFrameRequestSender* keyframe_request_sender); 61 62 ~VCMReceiver(); 63 64 void Reset(); 65 void UpdateRtt(int64_t rtt); 66 int32_t InsertPacket(const VCMPacket& packet); 67 VCMEncodedFrame* FrameForDecoding(uint16_t max_wait_time_ms, 68 bool prefer_late_decoding); 69 void ReleaseFrame(VCMEncodedFrame* frame); 70 void ReceiveStatistics(uint32_t* bitrate, uint32_t* framerate); 71 72 // NACK. 73 void SetNackMode(VCMNackMode nackMode, 74 int64_t low_rtt_nack_threshold_ms, 75 int64_t high_rtt_nack_threshold_ms); 76 void SetNackSettings(size_t max_nack_list_size, 77 int max_packet_age_to_nack, 78 int max_incomplete_time_ms); 79 VCMNackMode NackMode() const; 80 std::vector<uint16_t> NackList(bool* request_key_frame); 81 82 // Receiver video delay. 83 int SetMinReceiverDelay(int desired_delay_ms); 84 85 // Decoding with errors. 86 void SetDecodeErrorMode(VCMDecodeErrorMode decode_error_mode); 87 VCMDecodeErrorMode DecodeErrorMode() const; 88 89 void RegisterStatsCallback(VCMReceiveStatisticsCallback* callback); 90 91 void TriggerDecoderShutdown(); 92 93 private: 94 rtc::CriticalSection crit_sect_; 95 Clock* const clock_; 96 VCMJitterBuffer jitter_buffer_; 97 VCMTiming* timing_; 98 std::unique_ptr<EventWrapper> render_wait_event_; 99 int max_video_delay_ms_; 100 }; 101 102 } // namespace webrtc 103 104 #endif // MODULES_VIDEO_CODING_RECEIVER_H_ 105