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_PACING_PACED_SENDER_H_ 12 #define WEBRTC_MODULES_PACING_PACED_SENDER_H_ 13 14 #include <list> 15 #include <set> 16 17 #include "webrtc/base/scoped_ptr.h" 18 #include "webrtc/base/thread_annotations.h" 19 #include "webrtc/modules/include/module.h" 20 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" 21 #include "webrtc/typedefs.h" 22 23 namespace webrtc { 24 class BitrateProber; 25 class Clock; 26 class CriticalSectionWrapper; 27 28 namespace paced_sender { 29 class IntervalBudget; 30 struct Packet; 31 class PacketQueue; 32 } // namespace paced_sender 33 34 class PacedSender : public Module, public RtpPacketSender { 35 public: 36 class Callback { 37 public: 38 // Note: packets sent as a result of a callback should not pass by this 39 // module again. 40 // Called when it's time to send a queued packet. 41 // Returns false if packet cannot be sent. 42 virtual bool TimeToSendPacket(uint32_t ssrc, 43 uint16_t sequence_number, 44 int64_t capture_time_ms, 45 bool retransmission) = 0; 46 // Called when it's a good time to send a padding data. 47 // Returns the number of bytes sent. 48 virtual size_t TimeToSendPadding(size_t bytes) = 0; 49 50 protected: ~Callback()51 virtual ~Callback() {} 52 }; 53 54 // Expected max pacer delay in ms. If ExpectedQueueTimeMs() is higher than 55 // this value, the packet producers should wait (eg drop frames rather than 56 // encoding them). Bitrate sent may temporarily exceed target set by 57 // UpdateBitrate() so that this limit will be upheld. 58 static const int64_t kMaxQueueLengthMs; 59 // Pace in kbits/s until we receive first estimate. 60 static const int kDefaultInitialPaceKbps = 2000; 61 // Pacing-rate relative to our target send rate. 62 // Multiplicative factor that is applied to the target bitrate to calculate 63 // the number of bytes that can be transmitted per interval. 64 // Increasing this factor will result in lower delays in cases of bitrate 65 // overshoots from the encoder. 66 static const float kDefaultPaceMultiplier; 67 68 static const size_t kMinProbePacketSize = 200; 69 70 PacedSender(Clock* clock, 71 Callback* callback, 72 int bitrate_kbps, 73 int max_bitrate_kbps, 74 int min_bitrate_kbps); 75 76 virtual ~PacedSender(); 77 78 // Temporarily pause all sending. 79 void Pause(); 80 81 // Resume sending packets. 82 void Resume(); 83 84 // Enable bitrate probing. Enabled by default, mostly here to simplify 85 // testing. Must be called before any packets are being sent to have an 86 // effect. 87 void SetProbingEnabled(bool enabled); 88 89 // Set target bitrates for the pacer. 90 // We will pace out bursts of packets at a bitrate of |max_bitrate_kbps|. 91 // |bitrate_kbps| is our estimate of what we are allowed to send on average. 92 // Padding packets will be utilized to reach |min_bitrate| unless enough media 93 // packets are available. 94 void UpdateBitrate(int bitrate_kbps, 95 int max_bitrate_kbps, 96 int min_bitrate_kbps); 97 98 // Returns true if we send the packet now, else it will add the packet 99 // information to the queue and call TimeToSendPacket when it's time to send. 100 void InsertPacket(RtpPacketSender::Priority priority, 101 uint32_t ssrc, 102 uint16_t sequence_number, 103 int64_t capture_time_ms, 104 size_t bytes, 105 bool retransmission) override; 106 107 // Returns the time since the oldest queued packet was enqueued. 108 virtual int64_t QueueInMs() const; 109 110 virtual size_t QueueSizePackets() const; 111 112 // Returns the number of milliseconds it will take to send the current 113 // packets in the queue, given the current size and bitrate, ignoring prio. 114 virtual int64_t ExpectedQueueTimeMs() const; 115 116 // Returns the average time since being enqueued, in milliseconds, for all 117 // packets currently in the pacer queue, or 0 if queue is empty. 118 virtual int64_t AverageQueueTimeMs(); 119 120 // Returns the number of milliseconds until the module want a worker thread 121 // to call Process. 122 int64_t TimeUntilNextProcess() override; 123 124 // Process any pending packets in the queue(s). 125 int32_t Process() override; 126 127 private: 128 // Updates the number of bytes that can be sent for the next time interval. 129 void UpdateBytesPerInterval(int64_t delta_time_in_ms) 130 EXCLUSIVE_LOCKS_REQUIRED(critsect_); 131 132 bool SendPacket(const paced_sender::Packet& packet) 133 EXCLUSIVE_LOCKS_REQUIRED(critsect_); 134 void SendPadding(size_t padding_needed) EXCLUSIVE_LOCKS_REQUIRED(critsect_); 135 136 Clock* const clock_; 137 Callback* const callback_; 138 139 rtc::scoped_ptr<CriticalSectionWrapper> critsect_; 140 bool paused_ GUARDED_BY(critsect_); 141 bool probing_enabled_; 142 // This is the media budget, keeping track of how many bits of media 143 // we can pace out during the current interval. 144 rtc::scoped_ptr<paced_sender::IntervalBudget> media_budget_ 145 GUARDED_BY(critsect_); 146 // This is the padding budget, keeping track of how many bits of padding we're 147 // allowed to send out during the current interval. This budget will be 148 // utilized when there's no media to send. 149 rtc::scoped_ptr<paced_sender::IntervalBudget> padding_budget_ 150 GUARDED_BY(critsect_); 151 152 rtc::scoped_ptr<BitrateProber> prober_ GUARDED_BY(critsect_); 153 // Actual configured bitrates (media_budget_ may temporarily be higher in 154 // order to meet pace time constraint). 155 int bitrate_bps_ GUARDED_BY(critsect_); 156 int max_bitrate_kbps_ GUARDED_BY(critsect_); 157 158 int64_t time_last_update_us_ GUARDED_BY(critsect_); 159 160 rtc::scoped_ptr<paced_sender::PacketQueue> packets_ GUARDED_BY(critsect_); 161 uint64_t packet_counter_; 162 }; 163 } // namespace webrtc 164 #endif // WEBRTC_MODULES_PACING_PACED_SENDER_H_ 165