• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_PACED_SENDER_H_
12 #define WEBRTC_MODULES_PACED_SENDER_H_
13 
14 #include <list>
15 #include <set>
16 
17 #include "webrtc/modules/interface/module.h"
18 #include "webrtc/system_wrappers/interface/scoped_ptr.h"
19 #include "webrtc/system_wrappers/interface/tick_util.h"
20 #include "webrtc/typedefs.h"
21 
22 namespace webrtc {
23 class CriticalSectionWrapper;
24 namespace paced_sender {
25 class IntervalBudget;
26 struct Packet;
27 class PacketList;
28 }  // namespace paced_sender
29 
30 class PacedSender : public Module {
31  public:
32   enum Priority {
33     kHighPriority = 0,  // Pass through; will be sent immediately.
34     kNormalPriority = 2,  // Put in back of the line.
35     kLowPriority = 3,  // Put in back of the low priority line.
36   };
37   // Low priority packets are mixed with the normal priority packets
38   // while we are paused.
39 
40   class Callback {
41    public:
42     // Note: packets sent as a result of a callback should not pass by this
43     // module again.
44     // Called when it's time to send a queued packet.
45     // Returns false if packet cannot be sent.
46     virtual bool TimeToSendPacket(uint32_t ssrc,
47                                   uint16_t sequence_number,
48                                   int64_t capture_time_ms,
49                                   bool retransmission) = 0;
50     // Called when it's a good time to send a padding data.
51     virtual int TimeToSendPadding(int bytes) = 0;
52 
53    protected:
~Callback()54     virtual ~Callback() {}
55   };
56 
57   static const int kDefaultMaxQueueLengthMs = 2000;
58 
59   PacedSender(Callback* callback, int max_bitrate_kbps, int min_bitrate_kbps);
60 
61   virtual ~PacedSender();
62 
63   // Enable/disable pacing.
64   void SetStatus(bool enable);
65 
66   bool Enabled() const;
67 
68   // Temporarily pause all sending.
69   void Pause();
70 
71   // Resume sending packets.
72   void Resume();
73 
74   // Set target bitrates for the pacer. Padding packets will be utilized to
75   // reach |min_bitrate| unless enough media packets are available.
76   void UpdateBitrate(int max_bitrate_kbps, int min_bitrate_kbps);
77 
78   // Returns true if we send the packet now, else it will add the packet
79   // information to the queue and call TimeToSendPacket when it's time to send.
80   virtual bool SendPacket(Priority priority,
81                           uint32_t ssrc,
82                           uint16_t sequence_number,
83                           int64_t capture_time_ms,
84                           int bytes,
85                           bool retransmission);
86 
87   // Sets the max length of the pacer queue in milliseconds.
88   // A negative queue size is interpreted as infinite.
89   virtual void set_max_queue_length_ms(int max_queue_length_ms);
90 
91   // Returns the time since the oldest queued packet was enqueued.
92   virtual int QueueInMs() const;
93 
94   // Returns the number of milliseconds until the module want a worker thread
95   // to call Process.
96   virtual int32_t TimeUntilNextProcess() OVERRIDE;
97 
98   // Process any pending packets in the queue(s).
99   virtual int32_t Process() OVERRIDE;
100 
101  private:
102   // Return true if next packet in line should be transmitted.
103   // Return packet list that contains the next packet.
104   bool ShouldSendNextPacket(paced_sender::PacketList** packet_list);
105 
106   // Local helper function to GetNextPacket.
107   paced_sender::Packet GetNextPacketFromList(paced_sender::PacketList* packets);
108 
109   bool SendPacketFromList(paced_sender::PacketList* packet_list);
110 
111   // Updates the number of bytes that can be sent for the next time interval.
112   void UpdateBytesPerInterval(uint32_t delta_time_in_ms);
113 
114   // Updates the buffers with the number of bytes that we sent.
115   void UpdateMediaBytesSent(int num_bytes);
116 
117   Callback* callback_;
118   bool enabled_;
119   bool paused_;
120   int max_queue_length_ms_;
121   scoped_ptr<CriticalSectionWrapper> critsect_;
122   // This is the media budget, keeping track of how many bits of media
123   // we can pace out during the current interval.
124   scoped_ptr<paced_sender::IntervalBudget> media_budget_;
125   // This is the padding budget, keeping track of how many bits of padding we're
126   // allowed to send out during the current interval. This budget will be
127   // utilized when there's no media to send.
128   scoped_ptr<paced_sender::IntervalBudget> padding_budget_;
129 
130   TickTime time_last_update_;
131   TickTime time_last_send_;
132   int64_t capture_time_ms_last_queued_;
133   int64_t capture_time_ms_last_sent_;
134 
135   scoped_ptr<paced_sender::PacketList> high_priority_packets_;
136   scoped_ptr<paced_sender::PacketList> normal_priority_packets_;
137   scoped_ptr<paced_sender::PacketList> low_priority_packets_;
138 };
139 }  // namespace webrtc
140 #endif  // WEBRTC_MODULES_PACED_SENDER_H_
141