OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef MEDIA_CAST_NET_PACING_PACED_SENDER_H_ | 5 #ifndef MEDIA_CAST_NET_PACING_PACED_SENDER_H_ |
6 #define MEDIA_CAST_NET_PACING_PACED_SENDER_H_ | 6 #define MEDIA_CAST_NET_PACING_PACED_SENDER_H_ |
7 | 7 |
8 #include <list> | 8 #include <map> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "base/basictypes.h" | 11 #include "base/basictypes.h" |
12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
13 #include "base/memory/weak_ptr.h" | 13 #include "base/memory/weak_ptr.h" |
14 #include "base/single_thread_task_runner.h" | 14 #include "base/single_thread_task_runner.h" |
15 #include "base/threading/non_thread_safe.h" | 15 #include "base/threading/non_thread_safe.h" |
16 #include "base/time/default_tick_clock.h" | 16 #include "base/time/default_tick_clock.h" |
17 #include "base/time/tick_clock.h" | 17 #include "base/time/tick_clock.h" |
18 #include "base/time/time.h" | 18 #include "base/time/time.h" |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 LoggingImpl* logging, | 62 LoggingImpl* logging, |
63 PacketSender* external_transport, | 63 PacketSender* external_transport, |
64 const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner); | 64 const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner); |
65 | 65 |
66 virtual ~PacedSender(); | 66 virtual ~PacedSender(); |
67 | 67 |
68 // These must be called before non-RTCP packets are sent. | 68 // These must be called before non-RTCP packets are sent. |
69 void RegisterAudioSsrc(uint32 audio_ssrc); | 69 void RegisterAudioSsrc(uint32 audio_ssrc); |
70 void RegisterVideoSsrc(uint32 video_ssrc); | 70 void RegisterVideoSsrc(uint32 video_ssrc); |
71 | 71 |
| 72 // Register SSRC that has a higher priority for sending. Multiple SSRCs can |
| 73 // be registered. |
| 74 // Note that it is not expected to register many SSRCs with this method. |
| 75 // Because IsHigherPriority() is determined in linear time. |
| 76 void RegisterPrioritySsrc(uint32 ssrc); |
| 77 |
72 // PacedPacketSender implementation. | 78 // PacedPacketSender implementation. |
73 virtual bool SendPackets(const SendPacketVector& packets) OVERRIDE; | 79 virtual bool SendPackets(const SendPacketVector& packets) OVERRIDE; |
74 virtual bool ResendPackets(const SendPacketVector& packets, | 80 virtual bool ResendPackets(const SendPacketVector& packets, |
75 base::TimeDelta dedupe_window) OVERRIDE; | 81 base::TimeDelta dedupe_window) OVERRIDE; |
76 virtual bool SendRtcpPacket(uint32 ssrc, PacketRef packet) OVERRIDE; | 82 virtual bool SendRtcpPacket(uint32 ssrc, PacketRef packet) OVERRIDE; |
77 virtual void CancelSendingPacket(const PacketKey& packet_key) OVERRIDE; | 83 virtual void CancelSendingPacket(const PacketKey& packet_key) OVERRIDE; |
78 | 84 |
79 private: | 85 private: |
80 // Actually sends the packets to the transport. | 86 // Actually sends the packets to the transport. |
81 void SendStoredPackets(); | 87 void SendStoredPackets(); |
(...skipping 19 matching lines...) Expand all Loading... |
101 // send more data. | 107 // send more data. |
102 State_BurstFull | 108 State_BurstFull |
103 }; | 109 }; |
104 | 110 |
105 bool empty() const; | 111 bool empty() const; |
106 size_t size() const; | 112 size_t size() const; |
107 | 113 |
108 // Returns the next packet to send. RTCP packets have highest priority, | 114 // Returns the next packet to send. RTCP packets have highest priority, |
109 // resend packets have second highest priority and then comes everything | 115 // resend packets have second highest priority and then comes everything |
110 // else. | 116 // else. |
111 PacketRef GetNextPacket(PacketType* packet_type, | 117 PacketRef PopNextPacket(PacketType* packet_type, |
112 PacketKey* packet_key); | 118 PacketKey* packet_key); |
113 | 119 |
| 120 // Returns true if the packet should have a higher priority. |
| 121 bool IsHighPriority(const PacketKey& packet_key) const; |
| 122 |
114 base::TickClock* const clock_; // Not owned by this class. | 123 base::TickClock* const clock_; // Not owned by this class. |
115 LoggingImpl* const logging_; // Not owned by this class. | 124 LoggingImpl* const logging_; // Not owned by this class. |
116 PacketSender* transport_; // Not owned by this class. | 125 PacketSender* transport_; // Not owned by this class. |
117 scoped_refptr<base::SingleThreadTaskRunner> transport_task_runner_; | 126 scoped_refptr<base::SingleThreadTaskRunner> transport_task_runner_; |
118 uint32 audio_ssrc_; | 127 uint32 audio_ssrc_; |
119 uint32 video_ssrc_; | 128 uint32 video_ssrc_; |
120 std::map<PacketKey, std::pair<PacketType, PacketRef> > packet_list_; | 129 |
| 130 // Set of SSRCs that have higher priority. This is a vector instead of a |
| 131 // set because there's only very few in it (most likely 1). |
| 132 std::vector<uint32> priority_ssrcs_; |
| 133 typedef std::map<PacketKey, std::pair<PacketType, PacketRef> > PacketList; |
| 134 PacketList packet_list_; |
| 135 PacketList priority_packet_list_; |
121 std::map<PacketKey, base::TimeTicks> sent_time_; | 136 std::map<PacketKey, base::TimeTicks> sent_time_; |
122 std::map<PacketKey, base::TimeTicks> sent_time_buffer_; | 137 std::map<PacketKey, base::TimeTicks> sent_time_buffer_; |
123 | 138 |
124 // Maximum burst size for the next three bursts. | 139 // Maximum burst size for the next three bursts. |
125 size_t max_burst_size_; | 140 size_t max_burst_size_; |
126 size_t next_max_burst_size_; | 141 size_t next_max_burst_size_; |
127 size_t next_next_max_burst_size_; | 142 size_t next_next_max_burst_size_; |
128 // Number of packets already sent in the current burst. | 143 // Number of packets already sent in the current burst. |
129 size_t current_burst_size_; | 144 size_t current_burst_size_; |
130 // This is when the current burst ends. | 145 // This is when the current burst ends. |
131 base::TimeTicks burst_end_; | 146 base::TimeTicks burst_end_; |
132 | 147 |
133 State state_; | 148 State state_; |
134 | 149 |
135 // NOTE: Weak pointers must be invalidated before all other member variables. | 150 // NOTE: Weak pointers must be invalidated before all other member variables. |
136 base::WeakPtrFactory<PacedSender> weak_factory_; | 151 base::WeakPtrFactory<PacedSender> weak_factory_; |
137 | 152 |
138 DISALLOW_COPY_AND_ASSIGN(PacedSender); | 153 DISALLOW_COPY_AND_ASSIGN(PacedSender); |
139 }; | 154 }; |
140 | 155 |
141 } // namespace cast | 156 } // namespace cast |
142 } // namespace media | 157 } // namespace media |
143 | 158 |
144 #endif // MEDIA_CAST_NET_PACING_PACED_SENDER_H_ | 159 #endif // MEDIA_CAST_NET_PACING_PACED_SENDER_H_ |
OLD | NEW |