OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
56 uint32_t ConvertMsTo24Bits(int64_t time_ms) { | 56 uint32_t ConvertMsTo24Bits(int64_t time_ms) { |
57 uint32_t time_24_bits = | 57 uint32_t time_24_bits = |
58 static_cast<uint32_t>( | 58 static_cast<uint32_t>( |
59 ((static_cast<uint64_t>(time_ms) << kAbsSendTimeFraction) + 500) / | 59 ((static_cast<uint64_t>(time_ms) << kAbsSendTimeFraction) + 500) / |
60 1000) & | 60 1000) & |
61 0x00FFFFFF; | 61 0x00FFFFFF; |
62 return time_24_bits; | 62 return time_24_bits; |
63 } | 63 } |
64 } // namespace | 64 } // namespace |
65 | 65 |
66 class BitrateAggregator { | 66 RTPSender::BitrateAggregator::BitrateAggregator( |
67 public: | 67 BitrateStatisticsObserver* bitrate_callback) |
68 explicit BitrateAggregator(BitrateStatisticsObserver* bitrate_callback) | 68 : callback_(bitrate_callback), |
69 : callback_(bitrate_callback), | 69 total_bitrate_observer_(*this), |
70 total_bitrate_observer_(*this), | 70 retransmit_bitrate_observer_(*this), |
71 retransmit_bitrate_observer_(*this), | 71 ssrc_(0) {} |
72 ssrc_(0) {} | |
73 | 72 |
74 void OnStatsUpdated() const { | 73 void RTPSender::BitrateAggregator::OnStatsUpdated() const { |
75 if (callback_) | 74 if (callback_) { |
76 callback_->Notify(total_bitrate_observer_.statistics(), | 75 callback_->Notify(total_bitrate_observer_.statistics(), |
77 retransmit_bitrate_observer_.statistics(), | 76 retransmit_bitrate_observer_.statistics(), ssrc_); |
78 ssrc_); | |
79 } | 77 } |
| 78 } |
80 | 79 |
81 Bitrate::Observer* total_bitrate_observer() { | 80 Bitrate::Observer* RTPSender::BitrateAggregator::total_bitrate_observer() { |
82 return &total_bitrate_observer_; | 81 return &total_bitrate_observer_; |
83 } | 82 } |
84 Bitrate::Observer* retransmit_bitrate_observer() { | 83 Bitrate::Observer* RTPSender::BitrateAggregator::retransmit_bitrate_observer() { |
85 return &retransmit_bitrate_observer_; | 84 return &retransmit_bitrate_observer_; |
86 } | 85 } |
87 | 86 |
88 void set_ssrc(uint32_t ssrc) { ssrc_ = ssrc; } | 87 void RTPSender::BitrateAggregator::set_ssrc(uint32_t ssrc) { |
| 88 ssrc_ = ssrc; |
| 89 } |
89 | 90 |
90 private: | 91 RTPSender::BitrateAggregator::BitrateObserver::BitrateObserver( |
91 // We assume that these observers are called on the same thread, which is | 92 const BitrateAggregator& aggregator) |
92 // true for RtpSender as they are called on the Process thread. | 93 : aggregator_(aggregator) {} |
93 class BitrateObserver : public Bitrate::Observer { | |
94 public: | |
95 explicit BitrateObserver(const BitrateAggregator& aggregator) | |
96 : aggregator_(aggregator) {} | |
97 | 94 |
98 // Implements Bitrate::Observer. | 95 // Implements Bitrate::Observer. |
99 void BitrateUpdated(const BitrateStatistics& stats) override { | 96 void RTPSender::BitrateAggregator::BitrateObserver::BitrateUpdated( |
100 statistics_ = stats; | 97 const BitrateStatistics& stats) { |
101 aggregator_.OnStatsUpdated(); | 98 statistics_ = stats; |
102 } | 99 aggregator_.OnStatsUpdated(); |
| 100 } |
103 | 101 |
104 BitrateStatistics statistics() const { return statistics_; } | 102 const BitrateStatistics& |
105 | 103 RTPSender::BitrateAggregator::BitrateObserver::statistics() const { |
106 private: | 104 return statistics_; |
107 BitrateStatistics statistics_; | 105 } |
108 const BitrateAggregator& aggregator_; | |
109 }; | |
110 | |
111 BitrateStatisticsObserver* const callback_; | |
112 BitrateObserver total_bitrate_observer_; | |
113 BitrateObserver retransmit_bitrate_observer_; | |
114 uint32_t ssrc_; | |
115 }; | |
116 | 106 |
117 RTPSender::RTPSender( | 107 RTPSender::RTPSender( |
118 bool audio, | 108 bool audio, |
119 Clock* clock, | 109 Clock* clock, |
120 Transport* transport, | 110 Transport* transport, |
121 RtpAudioFeedback* audio_feedback, | 111 RtpAudioFeedback* audio_feedback, |
122 RtpPacketSender* paced_sender, | 112 RtpPacketSender* paced_sender, |
123 TransportSequenceNumberAllocator* sequence_number_allocator, | 113 TransportSequenceNumberAllocator* sequence_number_allocator, |
124 TransportFeedbackObserver* transport_feedback_observer, | 114 TransportFeedbackObserver* transport_feedback_observer, |
125 BitrateStatisticsObserver* bitrate_callback, | 115 BitrateStatisticsObserver* bitrate_callback, |
126 FrameCountObserver* frame_count_observer, | 116 FrameCountObserver* frame_count_observer, |
127 SendSideDelayObserver* send_side_delay_observer, | 117 SendSideDelayObserver* send_side_delay_observer, |
128 RtcEventLog* event_log) | 118 RtcEventLog* event_log) |
129 : clock_(clock), | 119 : clock_(clock), |
130 // TODO(holmer): Remove this conversion when we remove the use of | 120 // TODO(holmer): Remove this conversion when we remove the use of |
131 // TickTime. | 121 // TickTime. |
132 clock_delta_ms_(clock_->TimeInMilliseconds() - | 122 clock_delta_ms_(clock_->TimeInMilliseconds() - |
133 TickTime::MillisecondTimestamp()), | 123 TickTime::MillisecondTimestamp()), |
134 random_(clock_->TimeInMicroseconds()), | 124 random_(clock_->TimeInMicroseconds()), |
135 bitrates_(new BitrateAggregator(bitrate_callback)), | 125 bitrates_(bitrate_callback), |
136 total_bitrate_sent_(clock, bitrates_->total_bitrate_observer()), | 126 total_bitrate_sent_(clock, bitrates_.total_bitrate_observer()), |
137 audio_configured_(audio), | 127 audio_configured_(audio), |
138 audio_(audio ? new RTPSenderAudio(clock, this, audio_feedback) : nullptr), | 128 audio_(audio ? new RTPSenderAudio(clock, this, audio_feedback) : nullptr), |
139 video_(audio ? nullptr : new RTPSenderVideo(clock, this)), | 129 video_(audio ? nullptr : new RTPSenderVideo(clock, this)), |
140 paced_sender_(paced_sender), | 130 paced_sender_(paced_sender), |
141 transport_sequence_number_allocator_(sequence_number_allocator), | 131 transport_sequence_number_allocator_(sequence_number_allocator), |
142 transport_feedback_observer_(transport_feedback_observer), | 132 transport_feedback_observer_(transport_feedback_observer), |
143 last_capture_time_ms_sent_(0), | 133 last_capture_time_ms_sent_(0), |
144 send_critsect_(CriticalSectionWrapper::CreateCriticalSection()), | |
145 transport_(transport), | 134 transport_(transport), |
146 sending_media_(true), // Default to sending media. | 135 sending_media_(true), // Default to sending media. |
147 max_payload_length_(IP_PACKET_SIZE - 28), // Default is IP-v4/UDP. | 136 max_payload_length_(IP_PACKET_SIZE - 28), // Default is IP-v4/UDP. |
148 packet_over_head_(28), | 137 packet_over_head_(28), |
149 payload_type_(-1), | 138 payload_type_(-1), |
150 payload_type_map_(), | 139 payload_type_map_(), |
151 rtp_header_extension_map_(), | 140 rtp_header_extension_map_(), |
152 transmission_time_offset_(0), | 141 transmission_time_offset_(0), |
153 absolute_send_time_(0), | 142 absolute_send_time_(0), |
154 rotation_(kVideoRotation_0), | 143 rotation_(kVideoRotation_0), |
155 cvo_mode_(kCVONone), | 144 cvo_mode_(kCVONone), |
156 transport_sequence_number_(0), | 145 transport_sequence_number_(0), |
157 // NACK. | 146 // NACK. |
158 nack_byte_count_times_(), | 147 nack_byte_count_times_(), |
159 nack_byte_count_(), | 148 nack_byte_count_(), |
160 nack_bitrate_(clock, bitrates_->retransmit_bitrate_observer()), | 149 nack_bitrate_(clock, bitrates_.retransmit_bitrate_observer()), |
161 packet_history_(clock), | 150 packet_history_(clock), |
162 // Statistics | 151 // Statistics |
163 statistics_crit_(CriticalSectionWrapper::CreateCriticalSection()), | 152 statistics_crit_(CriticalSectionWrapper::CreateCriticalSection()), |
164 rtp_stats_callback_(NULL), | 153 rtp_stats_callback_(NULL), |
165 frame_count_observer_(frame_count_observer), | 154 frame_count_observer_(frame_count_observer), |
166 send_side_delay_observer_(send_side_delay_observer), | 155 send_side_delay_observer_(send_side_delay_observer), |
167 event_log_(event_log), | 156 event_log_(event_log), |
168 // RTP variables | 157 // RTP variables |
169 start_timestamp_forced_(false), | 158 start_timestamp_forced_(false), |
170 start_timestamp_(0), | 159 start_timestamp_(0), |
171 ssrc_db_(*SSRCDatabase::GetSSRCDatabase()), | 160 ssrc_db_(SSRCDatabase::GetSSRCDatabase()), |
172 remote_ssrc_(0), | 161 remote_ssrc_(0), |
173 sequence_number_forced_(false), | 162 sequence_number_forced_(false), |
174 ssrc_forced_(false), | 163 ssrc_forced_(false), |
175 timestamp_(0), | 164 timestamp_(0), |
176 capture_time_ms_(0), | 165 capture_time_ms_(0), |
177 last_timestamp_time_ms_(0), | 166 last_timestamp_time_ms_(0), |
178 media_has_been_sent_(false), | 167 media_has_been_sent_(false), |
179 last_packet_marker_bit_(false), | 168 last_packet_marker_bit_(false), |
180 csrcs_(), | 169 csrcs_(), |
181 rtx_(kRtxOff), | 170 rtx_(kRtxOff), |
182 rtx_payload_type_(-1), | 171 rtx_payload_type_(-1), |
183 target_bitrate_critsect_(CriticalSectionWrapper::CreateCriticalSection()), | 172 target_bitrate_critsect_(CriticalSectionWrapper::CreateCriticalSection()), |
184 target_bitrate_(0) { | 173 target_bitrate_(0) { |
185 memset(nack_byte_count_times_, 0, sizeof(nack_byte_count_times_)); | 174 memset(nack_byte_count_times_, 0, sizeof(nack_byte_count_times_)); |
186 memset(nack_byte_count_, 0, sizeof(nack_byte_count_)); | 175 memset(nack_byte_count_, 0, sizeof(nack_byte_count_)); |
187 // We need to seed the random generator. | 176 // We need to seed the random generator for BuildPaddingPacket() below. |
| 177 // TODO(holmer,tommi): Note that TimeInMilliseconds might return 0 on Mac |
| 178 // early on in the process. |
188 srand(static_cast<uint32_t>(clock_->TimeInMilliseconds())); | 179 srand(static_cast<uint32_t>(clock_->TimeInMilliseconds())); |
189 ssrc_ = ssrc_db_.CreateSSRC(); // Can't be 0. | 180 ssrc_ = ssrc_db_->CreateSSRC(); |
190 ssrc_rtx_ = ssrc_db_.CreateSSRC(); // Can't be 0. | 181 RTC_DCHECK(ssrc_ != 0); |
191 bitrates_->set_ssrc(ssrc_); | 182 ssrc_rtx_ = ssrc_db_->CreateSSRC(); |
| 183 RTC_DCHECK(ssrc_rtx_ != 0); |
| 184 |
| 185 bitrates_.set_ssrc(ssrc_); |
192 // Random start, 16 bits. Can't be 0. | 186 // Random start, 16 bits. Can't be 0. |
193 sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber); | 187 sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber); |
194 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); | 188 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); |
195 } | 189 } |
196 | 190 |
197 RTPSender::~RTPSender() { | 191 RTPSender::~RTPSender() { |
| 192 // TODO(tommi): Use a thread checker to ensure the object is created and |
| 193 // deleted on the same thread. At the moment this isn't possible due to |
| 194 // voe::ChannelOwner in voice engine. To reproduce, run: |
| 195 // voe_auto_test --automated --gtest_filter=*MixManyChannelsForStressOpus |
| 196 |
| 197 // TODO(tommi,holmer): We don't grab locks in the dtor before accessing member |
| 198 // variables but we grab them in all other methods. (what's the design?) |
| 199 // Start documenting what thread we're on in what method so that it's easier |
| 200 // to understand performance attributes and possibly remove locks. |
198 if (remote_ssrc_ != 0) { | 201 if (remote_ssrc_ != 0) { |
199 ssrc_db_.ReturnSSRC(remote_ssrc_); | 202 ssrc_db_->ReturnSSRC(remote_ssrc_); |
200 } | 203 } |
201 ssrc_db_.ReturnSSRC(ssrc_); | 204 ssrc_db_->ReturnSSRC(ssrc_); |
202 | 205 |
203 SSRCDatabase::ReturnSSRCDatabase(); | 206 SSRCDatabase::ReturnSSRCDatabase(); |
204 while (!payload_type_map_.empty()) { | 207 while (!payload_type_map_.empty()) { |
205 std::map<int8_t, RtpUtility::Payload*>::iterator it = | 208 std::map<int8_t, RtpUtility::Payload*>::iterator it = |
206 payload_type_map_.begin(); | 209 payload_type_map_.begin(); |
207 delete it->second; | 210 delete it->second; |
208 payload_type_map_.erase(it); | 211 payload_type_map_.erase(it); |
209 } | 212 } |
210 } | 213 } |
211 | 214 |
(...skipping 27 matching lines...) Expand all Loading... |
239 | 242 |
240 uint32_t RTPSender::NackOverheadRate() const { | 243 uint32_t RTPSender::NackOverheadRate() const { |
241 return nack_bitrate_.BitrateLast(); | 244 return nack_bitrate_.BitrateLast(); |
242 } | 245 } |
243 | 246 |
244 int32_t RTPSender::SetTransmissionTimeOffset(int32_t transmission_time_offset) { | 247 int32_t RTPSender::SetTransmissionTimeOffset(int32_t transmission_time_offset) { |
245 if (transmission_time_offset > (0x800000 - 1) || | 248 if (transmission_time_offset > (0x800000 - 1) || |
246 transmission_time_offset < -(0x800000 - 1)) { // Word24. | 249 transmission_time_offset < -(0x800000 - 1)) { // Word24. |
247 return -1; | 250 return -1; |
248 } | 251 } |
249 CriticalSectionScoped cs(send_critsect_.get()); | 252 rtc::CritScope lock(&send_critsect_); |
250 transmission_time_offset_ = transmission_time_offset; | 253 transmission_time_offset_ = transmission_time_offset; |
251 return 0; | 254 return 0; |
252 } | 255 } |
253 | 256 |
254 int32_t RTPSender::SetAbsoluteSendTime(uint32_t absolute_send_time) { | 257 int32_t RTPSender::SetAbsoluteSendTime(uint32_t absolute_send_time) { |
255 if (absolute_send_time > 0xffffff) { // UWord24. | 258 if (absolute_send_time > 0xffffff) { // UWord24. |
256 return -1; | 259 return -1; |
257 } | 260 } |
258 CriticalSectionScoped cs(send_critsect_.get()); | 261 rtc::CritScope lock(&send_critsect_); |
259 absolute_send_time_ = absolute_send_time; | 262 absolute_send_time_ = absolute_send_time; |
260 return 0; | 263 return 0; |
261 } | 264 } |
262 | 265 |
263 void RTPSender::SetVideoRotation(VideoRotation rotation) { | 266 void RTPSender::SetVideoRotation(VideoRotation rotation) { |
264 CriticalSectionScoped cs(send_critsect_.get()); | 267 rtc::CritScope lock(&send_critsect_); |
265 rotation_ = rotation; | 268 rotation_ = rotation; |
266 } | 269 } |
267 | 270 |
268 int32_t RTPSender::SetTransportSequenceNumber(uint16_t sequence_number) { | 271 int32_t RTPSender::SetTransportSequenceNumber(uint16_t sequence_number) { |
269 CriticalSectionScoped cs(send_critsect_.get()); | 272 rtc::CritScope lock(&send_critsect_); |
270 transport_sequence_number_ = sequence_number; | 273 transport_sequence_number_ = sequence_number; |
271 return 0; | 274 return 0; |
272 } | 275 } |
273 | 276 |
274 int32_t RTPSender::RegisterRtpHeaderExtension(RTPExtensionType type, | 277 int32_t RTPSender::RegisterRtpHeaderExtension(RTPExtensionType type, |
275 uint8_t id) { | 278 uint8_t id) { |
276 CriticalSectionScoped cs(send_critsect_.get()); | 279 rtc::CritScope lock(&send_critsect_); |
277 if (type == kRtpExtensionVideoRotation) { | 280 if (type == kRtpExtensionVideoRotation) { |
278 cvo_mode_ = kCVOInactive; | 281 cvo_mode_ = kCVOInactive; |
279 return rtp_header_extension_map_.RegisterInactive(type, id); | 282 return rtp_header_extension_map_.RegisterInactive(type, id); |
280 } | 283 } |
281 return rtp_header_extension_map_.Register(type, id); | 284 return rtp_header_extension_map_.Register(type, id); |
282 } | 285 } |
283 | 286 |
284 bool RTPSender::IsRtpHeaderExtensionRegistered(RTPExtensionType type) { | 287 bool RTPSender::IsRtpHeaderExtensionRegistered(RTPExtensionType type) { |
285 CriticalSectionScoped cs(send_critsect_.get()); | 288 rtc::CritScope lock(&send_critsect_); |
286 return rtp_header_extension_map_.IsRegistered(type); | 289 return rtp_header_extension_map_.IsRegistered(type); |
287 } | 290 } |
288 | 291 |
289 int32_t RTPSender::DeregisterRtpHeaderExtension(RTPExtensionType type) { | 292 int32_t RTPSender::DeregisterRtpHeaderExtension(RTPExtensionType type) { |
290 CriticalSectionScoped cs(send_critsect_.get()); | 293 rtc::CritScope lock(&send_critsect_); |
291 return rtp_header_extension_map_.Deregister(type); | 294 return rtp_header_extension_map_.Deregister(type); |
292 } | 295 } |
293 | 296 |
294 size_t RTPSender::RtpHeaderExtensionTotalLength() const { | 297 size_t RTPSender::RtpHeaderExtensionTotalLength() const { |
295 CriticalSectionScoped cs(send_critsect_.get()); | 298 rtc::CritScope lock(&send_critsect_); |
296 return rtp_header_extension_map_.GetTotalLengthInBytes(); | 299 return rtp_header_extension_map_.GetTotalLengthInBytes(); |
297 } | 300 } |
298 | 301 |
299 int32_t RTPSender::RegisterPayload( | 302 int32_t RTPSender::RegisterPayload( |
300 const char payload_name[RTP_PAYLOAD_NAME_SIZE], | 303 const char payload_name[RTP_PAYLOAD_NAME_SIZE], |
301 int8_t payload_number, | 304 int8_t payload_number, |
302 uint32_t frequency, | 305 uint32_t frequency, |
303 size_t channels, | 306 size_t channels, |
304 uint32_t rate) { | 307 uint32_t rate) { |
305 assert(payload_name); | 308 assert(payload_name); |
306 CriticalSectionScoped cs(send_critsect_.get()); | 309 rtc::CritScope lock(&send_critsect_); |
307 | 310 |
308 std::map<int8_t, RtpUtility::Payload*>::iterator it = | 311 std::map<int8_t, RtpUtility::Payload*>::iterator it = |
309 payload_type_map_.find(payload_number); | 312 payload_type_map_.find(payload_number); |
310 | 313 |
311 if (payload_type_map_.end() != it) { | 314 if (payload_type_map_.end() != it) { |
312 // We already use this payload type. | 315 // We already use this payload type. |
313 RtpUtility::Payload* payload = it->second; | 316 RtpUtility::Payload* payload = it->second; |
314 assert(payload); | 317 assert(payload); |
315 | 318 |
316 // Check if it's the same as we already have. | 319 // Check if it's the same as we already have. |
(...skipping 22 matching lines...) Expand all Loading... |
339 } else { | 342 } else { |
340 payload = video_->CreateVideoPayload(payload_name, payload_number, rate); | 343 payload = video_->CreateVideoPayload(payload_name, payload_number, rate); |
341 } | 344 } |
342 if (payload) { | 345 if (payload) { |
343 payload_type_map_[payload_number] = payload; | 346 payload_type_map_[payload_number] = payload; |
344 } | 347 } |
345 return ret_val; | 348 return ret_val; |
346 } | 349 } |
347 | 350 |
348 int32_t RTPSender::DeRegisterSendPayload(int8_t payload_type) { | 351 int32_t RTPSender::DeRegisterSendPayload(int8_t payload_type) { |
349 CriticalSectionScoped lock(send_critsect_.get()); | 352 rtc::CritScope lock(&send_critsect_); |
350 | 353 |
351 std::map<int8_t, RtpUtility::Payload*>::iterator it = | 354 std::map<int8_t, RtpUtility::Payload*>::iterator it = |
352 payload_type_map_.find(payload_type); | 355 payload_type_map_.find(payload_type); |
353 | 356 |
354 if (payload_type_map_.end() == it) { | 357 if (payload_type_map_.end() == it) { |
355 return -1; | 358 return -1; |
356 } | 359 } |
357 RtpUtility::Payload* payload = it->second; | 360 RtpUtility::Payload* payload = it->second; |
358 delete payload; | 361 delete payload; |
359 payload_type_map_.erase(it); | 362 payload_type_map_.erase(it); |
360 return 0; | 363 return 0; |
361 } | 364 } |
362 | 365 |
363 void RTPSender::SetSendPayloadType(int8_t payload_type) { | 366 void RTPSender::SetSendPayloadType(int8_t payload_type) { |
364 CriticalSectionScoped cs(send_critsect_.get()); | 367 rtc::CritScope lock(&send_critsect_); |
365 payload_type_ = payload_type; | 368 payload_type_ = payload_type; |
366 } | 369 } |
367 | 370 |
368 int8_t RTPSender::SendPayloadType() const { | 371 int8_t RTPSender::SendPayloadType() const { |
369 CriticalSectionScoped cs(send_critsect_.get()); | 372 rtc::CritScope lock(&send_critsect_); |
370 return payload_type_; | 373 return payload_type_; |
371 } | 374 } |
372 | 375 |
373 int RTPSender::SendPayloadFrequency() const { | 376 int RTPSender::SendPayloadFrequency() const { |
374 return audio_ != NULL ? audio_->AudioFrequency() : kVideoPayloadTypeFrequency; | 377 return audio_ != NULL ? audio_->AudioFrequency() : kVideoPayloadTypeFrequency; |
375 } | 378 } |
376 | 379 |
377 int32_t RTPSender::SetMaxPayloadLength(size_t max_payload_length, | 380 int32_t RTPSender::SetMaxPayloadLength(size_t max_payload_length, |
378 uint16_t packet_over_head) { | 381 uint16_t packet_over_head) { |
379 // Sanity check. | 382 // Sanity check. |
380 RTC_DCHECK(max_payload_length >= 100 && max_payload_length <= IP_PACKET_SIZE) | 383 RTC_DCHECK(max_payload_length >= 100 && max_payload_length <= IP_PACKET_SIZE) |
381 << "Invalid max payload length: " << max_payload_length; | 384 << "Invalid max payload length: " << max_payload_length; |
382 CriticalSectionScoped cs(send_critsect_.get()); | 385 rtc::CritScope lock(&send_critsect_); |
383 max_payload_length_ = max_payload_length; | 386 max_payload_length_ = max_payload_length; |
384 packet_over_head_ = packet_over_head; | 387 packet_over_head_ = packet_over_head; |
385 return 0; | 388 return 0; |
386 } | 389 } |
387 | 390 |
388 size_t RTPSender::MaxDataPayloadLength() const { | 391 size_t RTPSender::MaxDataPayloadLength() const { |
389 int rtx; | 392 int rtx; |
390 { | 393 { |
391 CriticalSectionScoped rtx_lock(send_critsect_.get()); | 394 rtc::CritScope lock(&send_critsect_); |
392 rtx = rtx_; | 395 rtx = rtx_; |
393 } | 396 } |
394 if (audio_configured_) { | 397 if (audio_configured_) { |
395 return max_payload_length_ - RTPHeaderLength(); | 398 return max_payload_length_ - RTPHeaderLength(); |
396 } else { | 399 } else { |
397 return max_payload_length_ - RTPHeaderLength() // RTP overhead. | 400 return max_payload_length_ - RTPHeaderLength() // RTP overhead. |
398 - video_->FECPacketOverhead() // FEC/ULP/RED overhead. | 401 - video_->FECPacketOverhead() // FEC/ULP/RED overhead. |
399 - ((rtx) ? 2 : 0); // RTX overhead. | 402 - ((rtx) ? 2 : 0); // RTX overhead. |
400 } | 403 } |
401 } | 404 } |
402 | 405 |
403 size_t RTPSender::MaxPayloadLength() const { | 406 size_t RTPSender::MaxPayloadLength() const { |
404 return max_payload_length_; | 407 return max_payload_length_; |
405 } | 408 } |
406 | 409 |
407 uint16_t RTPSender::PacketOverHead() const { return packet_over_head_; } | 410 uint16_t RTPSender::PacketOverHead() const { return packet_over_head_; } |
408 | 411 |
409 void RTPSender::SetRtxStatus(int mode) { | 412 void RTPSender::SetRtxStatus(int mode) { |
410 CriticalSectionScoped cs(send_critsect_.get()); | 413 rtc::CritScope lock(&send_critsect_); |
411 rtx_ = mode; | 414 rtx_ = mode; |
412 } | 415 } |
413 | 416 |
414 int RTPSender::RtxStatus() const { | 417 int RTPSender::RtxStatus() const { |
415 CriticalSectionScoped cs(send_critsect_.get()); | 418 rtc::CritScope lock(&send_critsect_); |
416 return rtx_; | 419 return rtx_; |
417 } | 420 } |
418 | 421 |
419 void RTPSender::SetRtxSsrc(uint32_t ssrc) { | 422 void RTPSender::SetRtxSsrc(uint32_t ssrc) { |
420 CriticalSectionScoped cs(send_critsect_.get()); | 423 rtc::CritScope lock(&send_critsect_); |
421 ssrc_rtx_ = ssrc; | 424 ssrc_rtx_ = ssrc; |
422 } | 425 } |
423 | 426 |
424 uint32_t RTPSender::RtxSsrc() const { | 427 uint32_t RTPSender::RtxSsrc() const { |
425 CriticalSectionScoped cs(send_critsect_.get()); | 428 rtc::CritScope lock(&send_critsect_); |
426 return ssrc_rtx_; | 429 return ssrc_rtx_; |
427 } | 430 } |
428 | 431 |
429 void RTPSender::SetRtxPayloadType(int payload_type, | 432 void RTPSender::SetRtxPayloadType(int payload_type, |
430 int associated_payload_type) { | 433 int associated_payload_type) { |
431 CriticalSectionScoped cs(send_critsect_.get()); | 434 rtc::CritScope lock(&send_critsect_); |
432 RTC_DCHECK_LE(payload_type, 127); | 435 RTC_DCHECK_LE(payload_type, 127); |
433 RTC_DCHECK_LE(associated_payload_type, 127); | 436 RTC_DCHECK_LE(associated_payload_type, 127); |
434 if (payload_type < 0) { | 437 if (payload_type < 0) { |
435 LOG(LS_ERROR) << "Invalid RTX payload type: " << payload_type; | 438 LOG(LS_ERROR) << "Invalid RTX payload type: " << payload_type; |
436 return; | 439 return; |
437 } | 440 } |
438 | 441 |
439 rtx_payload_type_map_[associated_payload_type] = payload_type; | 442 rtx_payload_type_map_[associated_payload_type] = payload_type; |
440 rtx_payload_type_ = payload_type; | 443 rtx_payload_type_ = payload_type; |
441 } | 444 } |
442 | 445 |
443 std::pair<int, int> RTPSender::RtxPayloadType() const { | 446 std::pair<int, int> RTPSender::RtxPayloadType() const { |
444 CriticalSectionScoped cs(send_critsect_.get()); | 447 rtc::CritScope lock(&send_critsect_); |
445 for (const auto& kv : rtx_payload_type_map_) { | 448 for (const auto& kv : rtx_payload_type_map_) { |
446 if (kv.second == rtx_payload_type_) { | 449 if (kv.second == rtx_payload_type_) { |
447 return std::make_pair(rtx_payload_type_, kv.first); | 450 return std::make_pair(rtx_payload_type_, kv.first); |
448 } | 451 } |
449 } | 452 } |
450 return std::make_pair(-1, -1); | 453 return std::make_pair(-1, -1); |
451 } | 454 } |
452 | 455 |
453 int32_t RTPSender::CheckPayloadType(int8_t payload_type, | 456 int32_t RTPSender::CheckPayloadType(int8_t payload_type, |
454 RtpVideoCodecTypes* video_type) { | 457 RtpVideoCodecTypes* video_type) { |
455 CriticalSectionScoped cs(send_critsect_.get()); | 458 rtc::CritScope lock(&send_critsect_); |
456 | 459 |
457 if (payload_type < 0) { | 460 if (payload_type < 0) { |
458 LOG(LS_ERROR) << "Invalid payload_type " << payload_type; | 461 LOG(LS_ERROR) << "Invalid payload_type " << payload_type; |
459 return -1; | 462 return -1; |
460 } | 463 } |
461 if (audio_configured_) { | 464 if (audio_configured_) { |
462 int8_t red_pl_type = -1; | 465 int8_t red_pl_type = -1; |
463 if (audio_->RED(&red_pl_type) == 0) { | 466 if (audio_->RED(&red_pl_type) == 0) { |
464 // We have configured RED. | 467 // We have configured RED. |
465 if (red_pl_type == payload_type) { | 468 if (red_pl_type == payload_type) { |
(...skipping 21 matching lines...) Expand all Loading... |
487 if (!payload->audio && !audio_configured_) { | 490 if (!payload->audio && !audio_configured_) { |
488 video_->SetVideoCodecType(payload->typeSpecific.Video.videoCodecType); | 491 video_->SetVideoCodecType(payload->typeSpecific.Video.videoCodecType); |
489 *video_type = payload->typeSpecific.Video.videoCodecType; | 492 *video_type = payload->typeSpecific.Video.videoCodecType; |
490 video_->SetMaxConfiguredBitrateVideo(payload->typeSpecific.Video.maxRate); | 493 video_->SetMaxConfiguredBitrateVideo(payload->typeSpecific.Video.maxRate); |
491 } | 494 } |
492 return 0; | 495 return 0; |
493 } | 496 } |
494 | 497 |
495 RTPSenderInterface::CVOMode RTPSender::ActivateCVORtpHeaderExtension() { | 498 RTPSenderInterface::CVOMode RTPSender::ActivateCVORtpHeaderExtension() { |
496 if (cvo_mode_ == kCVOInactive) { | 499 if (cvo_mode_ == kCVOInactive) { |
497 CriticalSectionScoped cs(send_critsect_.get()); | 500 rtc::CritScope lock(&send_critsect_); |
498 if (rtp_header_extension_map_.SetActive(kRtpExtensionVideoRotation, true)) { | 501 if (rtp_header_extension_map_.SetActive(kRtpExtensionVideoRotation, true)) { |
499 cvo_mode_ = kCVOActivated; | 502 cvo_mode_ = kCVOActivated; |
500 } | 503 } |
501 } | 504 } |
502 return cvo_mode_; | 505 return cvo_mode_; |
503 } | 506 } |
504 | 507 |
505 int32_t RTPSender::SendOutgoingData(FrameType frame_type, | 508 int32_t RTPSender::SendOutgoingData(FrameType frame_type, |
506 int8_t payload_type, | 509 int8_t payload_type, |
507 uint32_t capture_timestamp, | 510 uint32_t capture_timestamp, |
508 int64_t capture_time_ms, | 511 int64_t capture_time_ms, |
509 const uint8_t* payload_data, | 512 const uint8_t* payload_data, |
510 size_t payload_size, | 513 size_t payload_size, |
511 const RTPFragmentationHeader* fragmentation, | 514 const RTPFragmentationHeader* fragmentation, |
512 const RTPVideoHeader* rtp_hdr) { | 515 const RTPVideoHeader* rtp_hdr) { |
513 uint32_t ssrc; | 516 uint32_t ssrc; |
514 { | 517 { |
515 // Drop this packet if we're not sending media packets. | 518 // Drop this packet if we're not sending media packets. |
516 CriticalSectionScoped cs(send_critsect_.get()); | 519 rtc::CritScope lock(&send_critsect_); |
517 ssrc = ssrc_; | 520 ssrc = ssrc_; |
518 if (!sending_media_) { | 521 if (!sending_media_) { |
519 return 0; | 522 return 0; |
520 } | 523 } |
521 } | 524 } |
522 RtpVideoCodecTypes video_type = kRtpVideoGeneric; | 525 RtpVideoCodecTypes video_type = kRtpVideoGeneric; |
523 if (CheckPayloadType(payload_type, &video_type) != 0) { | 526 if (CheckPayloadType(payload_type, &video_type) != 0) { |
524 LOG(LS_ERROR) << "Don't send data with unknown payload type: " | 527 LOG(LS_ERROR) << "Don't send data with unknown payload type: " |
525 << static_cast<int>(payload_type) << "."; | 528 << static_cast<int>(payload_type) << "."; |
526 return -1; | 529 return -1; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
558 } | 561 } |
559 if (frame_count_observer_) { | 562 if (frame_count_observer_) { |
560 frame_count_observer_->FrameCountUpdated(frame_counts_, ssrc); | 563 frame_count_observer_->FrameCountUpdated(frame_counts_, ssrc); |
561 } | 564 } |
562 | 565 |
563 return ret_val; | 566 return ret_val; |
564 } | 567 } |
565 | 568 |
566 size_t RTPSender::TrySendRedundantPayloads(size_t bytes_to_send) { | 569 size_t RTPSender::TrySendRedundantPayloads(size_t bytes_to_send) { |
567 { | 570 { |
568 CriticalSectionScoped cs(send_critsect_.get()); | 571 rtc::CritScope lock(&send_critsect_); |
569 if ((rtx_ & kRtxRedundantPayloads) == 0) | 572 if ((rtx_ & kRtxRedundantPayloads) == 0) |
570 return 0; | 573 return 0; |
571 } | 574 } |
572 | 575 |
573 uint8_t buffer[IP_PACKET_SIZE]; | 576 uint8_t buffer[IP_PACKET_SIZE]; |
574 int bytes_left = static_cast<int>(bytes_to_send); | 577 int bytes_left = static_cast<int>(bytes_to_send); |
575 while (bytes_left > 0) { | 578 while (bytes_left > 0) { |
576 size_t length = bytes_left; | 579 size_t length = bytes_left; |
577 int64_t capture_time_ms; | 580 int64_t capture_time_ms; |
578 if (!packet_history_.GetBestFittingPacket(buffer, &length, | 581 if (!packet_history_.GetBestFittingPacket(buffer, &length, |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
620 transport_sequence_number_allocator_; | 623 transport_sequence_number_allocator_; |
621 for (; bytes > 0; bytes -= padding_bytes_in_packet) { | 624 for (; bytes > 0; bytes -= padding_bytes_in_packet) { |
622 if (bytes < padding_bytes_in_packet) | 625 if (bytes < padding_bytes_in_packet) |
623 bytes = padding_bytes_in_packet; | 626 bytes = padding_bytes_in_packet; |
624 | 627 |
625 uint32_t ssrc; | 628 uint32_t ssrc; |
626 uint16_t sequence_number; | 629 uint16_t sequence_number; |
627 int payload_type; | 630 int payload_type; |
628 bool over_rtx; | 631 bool over_rtx; |
629 { | 632 { |
630 CriticalSectionScoped cs(send_critsect_.get()); | 633 rtc::CritScope lock(&send_critsect_); |
631 if (!timestamp_provided) { | 634 if (!timestamp_provided) { |
632 timestamp = timestamp_; | 635 timestamp = timestamp_; |
633 capture_time_ms = capture_time_ms_; | 636 capture_time_ms = capture_time_ms_; |
634 } | 637 } |
635 if (rtx_ == kRtxOff) { | 638 if (rtx_ == kRtxOff) { |
636 // Without RTX we can't send padding in the middle of frames. | 639 // Without RTX we can't send padding in the middle of frames. |
637 if (!last_packet_marker_bit_) | 640 if (!last_packet_marker_bit_) |
638 return 0; | 641 return 0; |
639 ssrc = ssrc_; | 642 ssrc = ssrc_; |
640 sequence_number = sequence_number_; | 643 sequence_number = sequence_number_; |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
738 // TickTime. | 741 // TickTime. |
739 int64_t corrected_capture_tims_ms = capture_time_ms + clock_delta_ms_; | 742 int64_t corrected_capture_tims_ms = capture_time_ms + clock_delta_ms_; |
740 paced_sender_->InsertPacket( | 743 paced_sender_->InsertPacket( |
741 RtpPacketSender::kNormalPriority, header.ssrc, header.sequenceNumber, | 744 RtpPacketSender::kNormalPriority, header.ssrc, header.sequenceNumber, |
742 corrected_capture_tims_ms, length - header.headerLength, true); | 745 corrected_capture_tims_ms, length - header.headerLength, true); |
743 | 746 |
744 return length; | 747 return length; |
745 } | 748 } |
746 int rtx = kRtxOff; | 749 int rtx = kRtxOff; |
747 { | 750 { |
748 CriticalSectionScoped lock(send_critsect_.get()); | 751 rtc::CritScope lock(&send_critsect_); |
749 rtx = rtx_; | 752 rtx = rtx_; |
750 } | 753 } |
751 if (!PrepareAndSendPacket(data_buffer, length, capture_time_ms, | 754 if (!PrepareAndSendPacket(data_buffer, length, capture_time_ms, |
752 (rtx & kRtxRetransmitted) > 0, true)) { | 755 (rtx & kRtxRetransmitted) > 0, true)) { |
753 return -1; | 756 return -1; |
754 } | 757 } |
755 return static_cast<int32_t>(length); | 758 return static_cast<int32_t>(length); |
756 } | 759 } |
757 | 760 |
758 bool RTPSender::SendPacketToNetwork(const uint8_t* packet, | 761 bool RTPSender::SendPacketToNetwork(const uint8_t* packet, |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
836 UpdateNACKBitRate(bytes_re_sent, now); | 839 UpdateNACKBitRate(bytes_re_sent, now); |
837 } | 840 } |
838 } | 841 } |
839 | 842 |
840 bool RTPSender::ProcessNACKBitRate(uint32_t now) { | 843 bool RTPSender::ProcessNACKBitRate(uint32_t now) { |
841 uint32_t num = 0; | 844 uint32_t num = 0; |
842 size_t byte_count = 0; | 845 size_t byte_count = 0; |
843 const uint32_t kAvgIntervalMs = 1000; | 846 const uint32_t kAvgIntervalMs = 1000; |
844 uint32_t target_bitrate = GetTargetBitrate(); | 847 uint32_t target_bitrate = GetTargetBitrate(); |
845 | 848 |
846 CriticalSectionScoped cs(send_critsect_.get()); | 849 rtc::CritScope lock(&send_critsect_); |
847 | 850 |
848 if (target_bitrate == 0) { | 851 if (target_bitrate == 0) { |
849 return true; | 852 return true; |
850 } | 853 } |
851 for (num = 0; num < NACK_BYTECOUNT_SIZE; ++num) { | 854 for (num = 0; num < NACK_BYTECOUNT_SIZE; ++num) { |
852 if ((now - nack_byte_count_times_[num]) > kAvgIntervalMs) { | 855 if ((now - nack_byte_count_times_[num]) > kAvgIntervalMs) { |
853 // Don't use data older than 1sec. | 856 // Don't use data older than 1sec. |
854 break; | 857 break; |
855 } else { | 858 } else { |
856 byte_count += nack_byte_count_[num]; | 859 byte_count += nack_byte_count_[num]; |
857 } | 860 } |
858 } | 861 } |
859 uint32_t time_interval = kAvgIntervalMs; | 862 uint32_t time_interval = kAvgIntervalMs; |
860 if (num == NACK_BYTECOUNT_SIZE) { | 863 if (num == NACK_BYTECOUNT_SIZE) { |
861 // More than NACK_BYTECOUNT_SIZE nack messages has been received | 864 // More than NACK_BYTECOUNT_SIZE nack messages has been received |
862 // during the last msg_interval. | 865 // during the last msg_interval. |
863 if (nack_byte_count_times_[num - 1] <= now) { | 866 if (nack_byte_count_times_[num - 1] <= now) { |
864 time_interval = now - nack_byte_count_times_[num - 1]; | 867 time_interval = now - nack_byte_count_times_[num - 1]; |
865 } | 868 } |
866 } | 869 } |
867 return (byte_count * 8) < (target_bitrate / 1000 * time_interval); | 870 return (byte_count * 8) < (target_bitrate / 1000 * time_interval); |
868 } | 871 } |
869 | 872 |
870 void RTPSender::UpdateNACKBitRate(uint32_t bytes, int64_t now) { | 873 void RTPSender::UpdateNACKBitRate(uint32_t bytes, int64_t now) { |
871 CriticalSectionScoped cs(send_critsect_.get()); | 874 rtc::CritScope lock(&send_critsect_); |
872 if (bytes == 0) | 875 if (bytes == 0) |
873 return; | 876 return; |
874 nack_bitrate_.Update(bytes); | 877 nack_bitrate_.Update(bytes); |
875 // Save bitrate statistics. | 878 // Save bitrate statistics. |
876 // Shift all but first time. | 879 // Shift all but first time. |
877 for (int i = NACK_BYTECOUNT_SIZE - 2; i >= 0; i--) { | 880 for (int i = NACK_BYTECOUNT_SIZE - 2; i >= 0; i--) { |
878 nack_byte_count_[i + 1] = nack_byte_count_[i]; | 881 nack_byte_count_[i + 1] = nack_byte_count_[i]; |
879 nack_byte_count_times_[i + 1] = nack_byte_count_times_[i]; | 882 nack_byte_count_times_[i + 1] = nack_byte_count_times_[i]; |
880 } | 883 } |
881 nack_byte_count_[0] = bytes; | 884 nack_byte_count_[0] = bytes; |
(...skipping 15 matching lines...) Expand all Loading... |
897 &length, | 900 &length, |
898 &stored_time_ms)) { | 901 &stored_time_ms)) { |
899 // Packet cannot be found. Allow sending to continue. | 902 // Packet cannot be found. Allow sending to continue. |
900 return true; | 903 return true; |
901 } | 904 } |
902 if (!retransmission && capture_time_ms > 0) { | 905 if (!retransmission && capture_time_ms > 0) { |
903 UpdateDelayStatistics(capture_time_ms, clock_->TimeInMilliseconds()); | 906 UpdateDelayStatistics(capture_time_ms, clock_->TimeInMilliseconds()); |
904 } | 907 } |
905 int rtx; | 908 int rtx; |
906 { | 909 { |
907 CriticalSectionScoped lock(send_critsect_.get()); | 910 rtc::CritScope lock(&send_critsect_); |
908 rtx = rtx_; | 911 rtx = rtx_; |
909 } | 912 } |
910 return PrepareAndSendPacket(data_buffer, | 913 return PrepareAndSendPacket(data_buffer, |
911 length, | 914 length, |
912 capture_time_ms, | 915 capture_time_ms, |
913 retransmission && (rtx & kRtxRetransmitted) > 0, | 916 retransmission && (rtx & kRtxRetransmitted) > 0, |
914 retransmission); | 917 retransmission); |
915 } | 918 } |
916 | 919 |
917 bool RTPSender::PrepareAndSendPacket(uint8_t* buffer, | 920 bool RTPSender::PrepareAndSendPacket(uint8_t* buffer, |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
955 options.packet_id = | 958 options.packet_id = |
956 UpdateTransportSequenceNumber(buffer_to_send_ptr, length, rtp_header); | 959 UpdateTransportSequenceNumber(buffer_to_send_ptr, length, rtp_header); |
957 } | 960 } |
958 | 961 |
959 if (using_transport_seq && transport_feedback_observer_) { | 962 if (using_transport_seq && transport_feedback_observer_) { |
960 transport_feedback_observer_->AddPacket(options.packet_id, length, true); | 963 transport_feedback_observer_->AddPacket(options.packet_id, length, true); |
961 } | 964 } |
962 | 965 |
963 bool ret = SendPacketToNetwork(buffer_to_send_ptr, length, options); | 966 bool ret = SendPacketToNetwork(buffer_to_send_ptr, length, options); |
964 if (ret) { | 967 if (ret) { |
965 CriticalSectionScoped lock(send_critsect_.get()); | 968 rtc::CritScope lock(&send_critsect_); |
966 media_has_been_sent_ = true; | 969 media_has_been_sent_ = true; |
967 } | 970 } |
968 UpdateRtpStats(buffer_to_send_ptr, length, rtp_header, send_over_rtx, | 971 UpdateRtpStats(buffer_to_send_ptr, length, rtp_header, send_over_rtx, |
969 is_retransmit); | 972 is_retransmit); |
970 return ret; | 973 return ret; |
971 } | 974 } |
972 | 975 |
973 void RTPSender::UpdateRtpStats(const uint8_t* buffer, | 976 void RTPSender::UpdateRtpStats(const uint8_t* buffer, |
974 size_t packet_length, | 977 size_t packet_length, |
975 const RTPHeader& header, | 978 const RTPHeader& header, |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1015 video_->GenericFECStatus(&fec_enabled, &pt_red, &pt_fec); | 1018 video_->GenericFECStatus(&fec_enabled, &pt_red, &pt_fec); |
1016 return fec_enabled && | 1019 return fec_enabled && |
1017 header.payloadType == pt_red && | 1020 header.payloadType == pt_red && |
1018 buffer[header.headerLength] == pt_fec; | 1021 buffer[header.headerLength] == pt_fec; |
1019 } | 1022 } |
1020 | 1023 |
1021 size_t RTPSender::TimeToSendPadding(size_t bytes) { | 1024 size_t RTPSender::TimeToSendPadding(size_t bytes) { |
1022 if (audio_configured_ || bytes == 0) | 1025 if (audio_configured_ || bytes == 0) |
1023 return 0; | 1026 return 0; |
1024 { | 1027 { |
1025 CriticalSectionScoped cs(send_critsect_.get()); | 1028 rtc::CritScope lock(&send_critsect_); |
1026 if (!sending_media_) | 1029 if (!sending_media_) |
1027 return 0; | 1030 return 0; |
1028 } | 1031 } |
1029 size_t bytes_sent = TrySendRedundantPayloads(bytes); | 1032 size_t bytes_sent = TrySendRedundantPayloads(bytes); |
1030 if (bytes_sent < bytes) | 1033 if (bytes_sent < bytes) |
1031 bytes_sent += SendPadData(bytes - bytes_sent, false, 0, 0); | 1034 bytes_sent += SendPadData(bytes - bytes_sent, false, 0, 0); |
1032 return bytes_sent; | 1035 return bytes_sent; |
1033 } | 1036 } |
1034 | 1037 |
1035 // TODO(pwestin): send in the RtpHeaderParser to avoid parsing it again. | 1038 // TODO(pwestin): send in the RtpHeaderParser to avoid parsing it again. |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1101 | 1104 |
1102 // Mark the packet as sent in the history even if send failed. Dropping a | 1105 // Mark the packet as sent in the history even if send failed. Dropping a |
1103 // packet here should be treated as any other packet drop so we should be | 1106 // packet here should be treated as any other packet drop so we should be |
1104 // ready for a retransmission. | 1107 // ready for a retransmission. |
1105 packet_history_.SetSent(rtp_header.sequenceNumber); | 1108 packet_history_.SetSent(rtp_header.sequenceNumber); |
1106 | 1109 |
1107 if (!sent) | 1110 if (!sent) |
1108 return -1; | 1111 return -1; |
1109 | 1112 |
1110 { | 1113 { |
1111 CriticalSectionScoped lock(send_critsect_.get()); | 1114 rtc::CritScope lock(&send_critsect_); |
1112 media_has_been_sent_ = true; | 1115 media_has_been_sent_ = true; |
1113 } | 1116 } |
1114 UpdateRtpStats(buffer, length, rtp_header, false, false); | 1117 UpdateRtpStats(buffer, length, rtp_header, false, false); |
1115 return 0; | 1118 return 0; |
1116 } | 1119 } |
1117 | 1120 |
1118 void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) { | 1121 void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) { |
1119 if (!send_side_delay_observer_) | 1122 if (!send_side_delay_observer_) |
1120 return; | 1123 return; |
1121 | 1124 |
1122 uint32_t ssrc; | 1125 uint32_t ssrc; |
1123 int avg_delay_ms = 0; | 1126 int avg_delay_ms = 0; |
1124 int max_delay_ms = 0; | 1127 int max_delay_ms = 0; |
1125 { | 1128 { |
1126 CriticalSectionScoped lock(send_critsect_.get()); | 1129 rtc::CritScope lock(&send_critsect_); |
1127 ssrc = ssrc_; | 1130 ssrc = ssrc_; |
1128 } | 1131 } |
1129 { | 1132 { |
1130 CriticalSectionScoped cs(statistics_crit_.get()); | 1133 CriticalSectionScoped cs(statistics_crit_.get()); |
1131 // TODO(holmer): Compute this iteratively instead. | 1134 // TODO(holmer): Compute this iteratively instead. |
1132 send_delays_[now_ms] = now_ms - capture_time_ms; | 1135 send_delays_[now_ms] = now_ms - capture_time_ms; |
1133 send_delays_.erase(send_delays_.begin(), | 1136 send_delays_.erase(send_delays_.begin(), |
1134 send_delays_.lower_bound(now_ms - | 1137 send_delays_.lower_bound(now_ms - |
1135 kSendSideDelayWindowMs)); | 1138 kSendSideDelayWindowMs)); |
1136 int num_delays = 0; | 1139 int num_delays = 0; |
1137 for (auto it = send_delays_.upper_bound(now_ms - kSendSideDelayWindowMs); | 1140 for (auto it = send_delays_.upper_bound(now_ms - kSendSideDelayWindowMs); |
1138 it != send_delays_.end(); ++it) { | 1141 it != send_delays_.end(); ++it) { |
1139 max_delay_ms = std::max(max_delay_ms, it->second); | 1142 max_delay_ms = std::max(max_delay_ms, it->second); |
1140 avg_delay_ms += it->second; | 1143 avg_delay_ms += it->second; |
1141 ++num_delays; | 1144 ++num_delays; |
1142 } | 1145 } |
1143 if (num_delays == 0) | 1146 if (num_delays == 0) |
1144 return; | 1147 return; |
1145 avg_delay_ms = (avg_delay_ms + num_delays / 2) / num_delays; | 1148 avg_delay_ms = (avg_delay_ms + num_delays / 2) / num_delays; |
1146 } | 1149 } |
1147 send_side_delay_observer_->SendSideDelayUpdated(avg_delay_ms, max_delay_ms, | 1150 send_side_delay_observer_->SendSideDelayUpdated(avg_delay_ms, max_delay_ms, |
1148 ssrc); | 1151 ssrc); |
1149 } | 1152 } |
1150 | 1153 |
1151 void RTPSender::ProcessBitrate() { | 1154 void RTPSender::ProcessBitrate() { |
1152 CriticalSectionScoped cs(send_critsect_.get()); | 1155 rtc::CritScope lock(&send_critsect_); |
1153 total_bitrate_sent_.Process(); | 1156 total_bitrate_sent_.Process(); |
1154 nack_bitrate_.Process(); | 1157 nack_bitrate_.Process(); |
1155 if (audio_configured_) { | 1158 if (audio_configured_) { |
1156 return; | 1159 return; |
1157 } | 1160 } |
1158 video_->ProcessBitrate(); | 1161 video_->ProcessBitrate(); |
1159 } | 1162 } |
1160 | 1163 |
1161 size_t RTPSender::RTPHeaderLength() const { | 1164 size_t RTPSender::RTPHeaderLength() const { |
1162 CriticalSectionScoped lock(send_critsect_.get()); | 1165 rtc::CritScope lock(&send_critsect_); |
1163 size_t rtp_header_length = kRtpHeaderLength; | 1166 size_t rtp_header_length = kRtpHeaderLength; |
1164 rtp_header_length += sizeof(uint32_t) * csrcs_.size(); | 1167 rtp_header_length += sizeof(uint32_t) * csrcs_.size(); |
1165 rtp_header_length += RtpHeaderExtensionTotalLength(); | 1168 rtp_header_length += RtpHeaderExtensionTotalLength(); |
1166 return rtp_header_length; | 1169 return rtp_header_length; |
1167 } | 1170 } |
1168 | 1171 |
1169 uint16_t RTPSender::AllocateSequenceNumber(uint16_t packets_to_send) { | 1172 uint16_t RTPSender::AllocateSequenceNumber(uint16_t packets_to_send) { |
1170 CriticalSectionScoped cs(send_critsect_.get()); | 1173 rtc::CritScope lock(&send_critsect_); |
1171 uint16_t first_allocated_sequence_number = sequence_number_; | 1174 uint16_t first_allocated_sequence_number = sequence_number_; |
1172 sequence_number_ += packets_to_send; | 1175 sequence_number_ += packets_to_send; |
1173 return first_allocated_sequence_number; | 1176 return first_allocated_sequence_number; |
1174 } | 1177 } |
1175 | 1178 |
1176 void RTPSender::GetDataCounters(StreamDataCounters* rtp_stats, | 1179 void RTPSender::GetDataCounters(StreamDataCounters* rtp_stats, |
1177 StreamDataCounters* rtx_stats) const { | 1180 StreamDataCounters* rtx_stats) const { |
1178 CriticalSectionScoped lock(statistics_crit_.get()); | 1181 CriticalSectionScoped lock(statistics_crit_.get()); |
1179 *rtp_stats = rtp_stats_; | 1182 *rtp_stats = rtp_stats_; |
1180 *rtx_stats = rtx_rtp_stats_; | 1183 *rtx_stats = rtx_rtp_stats_; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1219 } | 1222 } |
1220 | 1223 |
1221 int32_t RTPSender::BuildRTPheader(uint8_t* data_buffer, | 1224 int32_t RTPSender::BuildRTPheader(uint8_t* data_buffer, |
1222 int8_t payload_type, | 1225 int8_t payload_type, |
1223 bool marker_bit, | 1226 bool marker_bit, |
1224 uint32_t capture_timestamp, | 1227 uint32_t capture_timestamp, |
1225 int64_t capture_time_ms, | 1228 int64_t capture_time_ms, |
1226 bool timestamp_provided, | 1229 bool timestamp_provided, |
1227 bool inc_sequence_number) { | 1230 bool inc_sequence_number) { |
1228 assert(payload_type >= 0); | 1231 assert(payload_type >= 0); |
1229 CriticalSectionScoped cs(send_critsect_.get()); | 1232 rtc::CritScope lock(&send_critsect_); |
1230 | 1233 |
1231 if (timestamp_provided) { | 1234 if (timestamp_provided) { |
1232 timestamp_ = start_timestamp_ + capture_timestamp; | 1235 timestamp_ = start_timestamp_ + capture_timestamp; |
1233 } else { | 1236 } else { |
1234 // Make a unique time stamp. | 1237 // Make a unique time stamp. |
1235 // We can't inc by the actual time, since then we increase the risk of back | 1238 // We can't inc by the actual time, since then we increase the risk of back |
1236 // timing. | 1239 // timing. |
1237 timestamp_++; | 1240 timestamp_++; |
1238 } | 1241 } |
1239 last_timestamp_time_ms_ = clock_->TimeInMilliseconds(); | 1242 last_timestamp_time_ms_ = clock_->TimeInMilliseconds(); |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1526 | 1529 |
1527 *extension_offset = block_pos; | 1530 *extension_offset = block_pos; |
1528 return ExtensionStatus::kOk; | 1531 return ExtensionStatus::kOk; |
1529 } | 1532 } |
1530 | 1533 |
1531 void RTPSender::UpdateTransmissionTimeOffset(uint8_t* rtp_packet, | 1534 void RTPSender::UpdateTransmissionTimeOffset(uint8_t* rtp_packet, |
1532 size_t rtp_packet_length, | 1535 size_t rtp_packet_length, |
1533 const RTPHeader& rtp_header, | 1536 const RTPHeader& rtp_header, |
1534 int64_t time_diff_ms) const { | 1537 int64_t time_diff_ms) const { |
1535 size_t offset; | 1538 size_t offset; |
1536 CriticalSectionScoped cs(send_critsect_.get()); | 1539 rtc::CritScope lock(&send_critsect_); |
1537 switch (VerifyExtension(kRtpExtensionTransmissionTimeOffset, rtp_packet, | 1540 switch (VerifyExtension(kRtpExtensionTransmissionTimeOffset, rtp_packet, |
1538 rtp_packet_length, rtp_header, | 1541 rtp_packet_length, rtp_header, |
1539 kTransmissionTimeOffsetLength, &offset)) { | 1542 kTransmissionTimeOffsetLength, &offset)) { |
1540 case ExtensionStatus::kNotRegistered: | 1543 case ExtensionStatus::kNotRegistered: |
1541 return; | 1544 return; |
1542 case ExtensionStatus::kError: | 1545 case ExtensionStatus::kError: |
1543 LOG(LS_WARNING) << "Failed to update transmission time offset."; | 1546 LOG(LS_WARNING) << "Failed to update transmission time offset."; |
1544 return; | 1547 return; |
1545 case ExtensionStatus::kOk: | 1548 case ExtensionStatus::kOk: |
1546 break; | 1549 break; |
1547 default: | 1550 default: |
1548 RTC_NOTREACHED(); | 1551 RTC_NOTREACHED(); |
1549 } | 1552 } |
1550 | 1553 |
1551 // Update transmission offset field (converting to a 90 kHz timestamp). | 1554 // Update transmission offset field (converting to a 90 kHz timestamp). |
1552 ByteWriter<int32_t, 3>::WriteBigEndian(rtp_packet + offset + 1, | 1555 ByteWriter<int32_t, 3>::WriteBigEndian(rtp_packet + offset + 1, |
1553 time_diff_ms * 90); // RTP timestamp. | 1556 time_diff_ms * 90); // RTP timestamp. |
1554 } | 1557 } |
1555 | 1558 |
1556 bool RTPSender::UpdateAudioLevel(uint8_t* rtp_packet, | 1559 bool RTPSender::UpdateAudioLevel(uint8_t* rtp_packet, |
1557 size_t rtp_packet_length, | 1560 size_t rtp_packet_length, |
1558 const RTPHeader& rtp_header, | 1561 const RTPHeader& rtp_header, |
1559 bool is_voiced, | 1562 bool is_voiced, |
1560 uint8_t dBov) const { | 1563 uint8_t dBov) const { |
1561 size_t offset; | 1564 size_t offset; |
1562 CriticalSectionScoped cs(send_critsect_.get()); | 1565 rtc::CritScope lock(&send_critsect_); |
1563 | 1566 |
1564 switch (VerifyExtension(kRtpExtensionAudioLevel, rtp_packet, | 1567 switch (VerifyExtension(kRtpExtensionAudioLevel, rtp_packet, |
1565 rtp_packet_length, rtp_header, kAudioLevelLength, | 1568 rtp_packet_length, rtp_header, kAudioLevelLength, |
1566 &offset)) { | 1569 &offset)) { |
1567 case ExtensionStatus::kNotRegistered: | 1570 case ExtensionStatus::kNotRegistered: |
1568 return false; | 1571 return false; |
1569 case ExtensionStatus::kError: | 1572 case ExtensionStatus::kError: |
1570 LOG(LS_WARNING) << "Failed to update audio level."; | 1573 LOG(LS_WARNING) << "Failed to update audio level."; |
1571 return false; | 1574 return false; |
1572 case ExtensionStatus::kOk: | 1575 case ExtensionStatus::kOk: |
1573 break; | 1576 break; |
1574 default: | 1577 default: |
1575 RTC_NOTREACHED(); | 1578 RTC_NOTREACHED(); |
1576 } | 1579 } |
1577 | 1580 |
1578 rtp_packet[offset + 1] = (is_voiced ? 0x80 : 0x00) + (dBov & 0x7f); | 1581 rtp_packet[offset + 1] = (is_voiced ? 0x80 : 0x00) + (dBov & 0x7f); |
1579 return true; | 1582 return true; |
1580 } | 1583 } |
1581 | 1584 |
1582 bool RTPSender::UpdateVideoRotation(uint8_t* rtp_packet, | 1585 bool RTPSender::UpdateVideoRotation(uint8_t* rtp_packet, |
1583 size_t rtp_packet_length, | 1586 size_t rtp_packet_length, |
1584 const RTPHeader& rtp_header, | 1587 const RTPHeader& rtp_header, |
1585 VideoRotation rotation) const { | 1588 VideoRotation rotation) const { |
1586 size_t offset; | 1589 size_t offset; |
1587 CriticalSectionScoped cs(send_critsect_.get()); | 1590 rtc::CritScope lock(&send_critsect_); |
1588 | 1591 |
1589 switch (VerifyExtension(kRtpExtensionVideoRotation, rtp_packet, | 1592 switch (VerifyExtension(kRtpExtensionVideoRotation, rtp_packet, |
1590 rtp_packet_length, rtp_header, kVideoRotationLength, | 1593 rtp_packet_length, rtp_header, kVideoRotationLength, |
1591 &offset)) { | 1594 &offset)) { |
1592 case ExtensionStatus::kNotRegistered: | 1595 case ExtensionStatus::kNotRegistered: |
1593 return false; | 1596 return false; |
1594 case ExtensionStatus::kError: | 1597 case ExtensionStatus::kError: |
1595 LOG(LS_WARNING) << "Failed to update CVO."; | 1598 LOG(LS_WARNING) << "Failed to update CVO."; |
1596 return false; | 1599 return false; |
1597 case ExtensionStatus::kOk: | 1600 case ExtensionStatus::kOk: |
1598 break; | 1601 break; |
1599 default: | 1602 default: |
1600 RTC_NOTREACHED(); | 1603 RTC_NOTREACHED(); |
1601 } | 1604 } |
1602 | 1605 |
1603 rtp_packet[offset + 1] = ConvertVideoRotationToCVOByte(rotation); | 1606 rtp_packet[offset + 1] = ConvertVideoRotationToCVOByte(rotation); |
1604 return true; | 1607 return true; |
1605 } | 1608 } |
1606 | 1609 |
1607 void RTPSender::UpdateAbsoluteSendTime(uint8_t* rtp_packet, | 1610 void RTPSender::UpdateAbsoluteSendTime(uint8_t* rtp_packet, |
1608 size_t rtp_packet_length, | 1611 size_t rtp_packet_length, |
1609 const RTPHeader& rtp_header, | 1612 const RTPHeader& rtp_header, |
1610 int64_t now_ms) const { | 1613 int64_t now_ms) const { |
1611 size_t offset; | 1614 size_t offset; |
1612 CriticalSectionScoped cs(send_critsect_.get()); | 1615 rtc::CritScope lock(&send_critsect_); |
1613 | 1616 |
1614 switch (VerifyExtension(kRtpExtensionAbsoluteSendTime, rtp_packet, | 1617 switch (VerifyExtension(kRtpExtensionAbsoluteSendTime, rtp_packet, |
1615 rtp_packet_length, rtp_header, | 1618 rtp_packet_length, rtp_header, |
1616 kAbsoluteSendTimeLength, &offset)) { | 1619 kAbsoluteSendTimeLength, &offset)) { |
1617 case ExtensionStatus::kNotRegistered: | 1620 case ExtensionStatus::kNotRegistered: |
1618 return; | 1621 return; |
1619 case ExtensionStatus::kError: | 1622 case ExtensionStatus::kError: |
1620 LOG(LS_WARNING) << "Failed to update absolute send time"; | 1623 LOG(LS_WARNING) << "Failed to update absolute send time"; |
1621 return; | 1624 return; |
1622 case ExtensionStatus::kOk: | 1625 case ExtensionStatus::kOk: |
1623 break; | 1626 break; |
1624 default: | 1627 default: |
1625 RTC_NOTREACHED(); | 1628 RTC_NOTREACHED(); |
1626 } | 1629 } |
1627 | 1630 |
1628 // Update absolute send time field (convert ms to 24-bit unsigned with 18 bit | 1631 // Update absolute send time field (convert ms to 24-bit unsigned with 18 bit |
1629 // fractional part). | 1632 // fractional part). |
1630 ByteWriter<uint32_t, 3>::WriteBigEndian(rtp_packet + offset + 1, | 1633 ByteWriter<uint32_t, 3>::WriteBigEndian(rtp_packet + offset + 1, |
1631 ConvertMsTo24Bits(now_ms)); | 1634 ConvertMsTo24Bits(now_ms)); |
1632 } | 1635 } |
1633 | 1636 |
1634 uint16_t RTPSender::UpdateTransportSequenceNumber( | 1637 uint16_t RTPSender::UpdateTransportSequenceNumber( |
1635 uint8_t* rtp_packet, | 1638 uint8_t* rtp_packet, |
1636 size_t rtp_packet_length, | 1639 size_t rtp_packet_length, |
1637 const RTPHeader& rtp_header) const { | 1640 const RTPHeader& rtp_header) const { |
1638 size_t offset; | 1641 size_t offset; |
1639 CriticalSectionScoped cs(send_critsect_.get()); | 1642 rtc::CritScope lock(&send_critsect_); |
1640 | 1643 |
1641 switch (VerifyExtension(kRtpExtensionTransportSequenceNumber, rtp_packet, | 1644 switch (VerifyExtension(kRtpExtensionTransportSequenceNumber, rtp_packet, |
1642 rtp_packet_length, rtp_header, | 1645 rtp_packet_length, rtp_header, |
1643 kTransportSequenceNumberLength, &offset)) { | 1646 kTransportSequenceNumberLength, &offset)) { |
1644 case ExtensionStatus::kNotRegistered: | 1647 case ExtensionStatus::kNotRegistered: |
1645 return 0; | 1648 return 0; |
1646 case ExtensionStatus::kError: | 1649 case ExtensionStatus::kError: |
1647 LOG(LS_WARNING) << "Failed to update transport sequence number"; | 1650 LOG(LS_WARNING) << "Failed to update transport sequence number"; |
1648 return 0; | 1651 return 0; |
1649 case ExtensionStatus::kOk: | 1652 case ExtensionStatus::kOk: |
1650 break; | 1653 break; |
1651 default: | 1654 default: |
1652 RTC_NOTREACHED(); | 1655 RTC_NOTREACHED(); |
1653 } | 1656 } |
1654 | 1657 |
1655 uint16_t seq = transport_sequence_number_allocator_->AllocateSequenceNumber(); | 1658 uint16_t seq = transport_sequence_number_allocator_->AllocateSequenceNumber(); |
1656 BuildTransportSequenceNumberExtension(rtp_packet + offset, seq); | 1659 BuildTransportSequenceNumberExtension(rtp_packet + offset, seq); |
1657 return seq; | 1660 return seq; |
1658 } | 1661 } |
1659 | 1662 |
1660 void RTPSender::SetSendingStatus(bool enabled) { | 1663 void RTPSender::SetSendingStatus(bool enabled) { |
1661 if (enabled) { | 1664 if (enabled) { |
1662 uint32_t frequency_hz = SendPayloadFrequency(); | 1665 uint32_t frequency_hz = SendPayloadFrequency(); |
1663 uint32_t RTPtime = CurrentRtp(*clock_, frequency_hz); | 1666 uint32_t RTPtime = CurrentRtp(*clock_, frequency_hz); |
1664 | 1667 |
1665 // Will be ignored if it's already configured via API. | 1668 // Will be ignored if it's already configured via API. |
1666 SetStartTimestamp(RTPtime, false); | 1669 SetStartTimestamp(RTPtime, false); |
1667 } else { | 1670 } else { |
1668 CriticalSectionScoped lock(send_critsect_.get()); | 1671 rtc::CritScope lock(&send_critsect_); |
1669 if (!ssrc_forced_) { | 1672 if (!ssrc_forced_) { |
1670 // Generate a new SSRC. | 1673 // Generate a new SSRC. |
1671 ssrc_db_.ReturnSSRC(ssrc_); | 1674 ssrc_db_->ReturnSSRC(ssrc_); |
1672 ssrc_ = ssrc_db_.CreateSSRC(); // Can't be 0. | 1675 ssrc_ = ssrc_db_->CreateSSRC(); |
1673 bitrates_->set_ssrc(ssrc_); | 1676 RTC_DCHECK(ssrc_ != 0); |
| 1677 bitrates_.set_ssrc(ssrc_); |
1674 } | 1678 } |
1675 // Don't initialize seq number if SSRC passed externally. | 1679 // Don't initialize seq number if SSRC passed externally. |
1676 if (!sequence_number_forced_ && !ssrc_forced_) { | 1680 if (!sequence_number_forced_ && !ssrc_forced_) { |
1677 // Generate a new sequence number. | 1681 // Generate a new sequence number. |
1678 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); | 1682 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); |
1679 } | 1683 } |
1680 } | 1684 } |
1681 } | 1685 } |
1682 | 1686 |
1683 void RTPSender::SetSendingMediaStatus(bool enabled) { | 1687 void RTPSender::SetSendingMediaStatus(bool enabled) { |
1684 CriticalSectionScoped cs(send_critsect_.get()); | 1688 rtc::CritScope lock(&send_critsect_); |
1685 sending_media_ = enabled; | 1689 sending_media_ = enabled; |
1686 } | 1690 } |
1687 | 1691 |
1688 bool RTPSender::SendingMedia() const { | 1692 bool RTPSender::SendingMedia() const { |
1689 CriticalSectionScoped cs(send_critsect_.get()); | 1693 rtc::CritScope lock(&send_critsect_); |
1690 return sending_media_; | 1694 return sending_media_; |
1691 } | 1695 } |
1692 | 1696 |
1693 uint32_t RTPSender::Timestamp() const { | 1697 uint32_t RTPSender::Timestamp() const { |
1694 CriticalSectionScoped cs(send_critsect_.get()); | 1698 rtc::CritScope lock(&send_critsect_); |
1695 return timestamp_; | 1699 return timestamp_; |
1696 } | 1700 } |
1697 | 1701 |
1698 void RTPSender::SetStartTimestamp(uint32_t timestamp, bool force) { | 1702 void RTPSender::SetStartTimestamp(uint32_t timestamp, bool force) { |
1699 CriticalSectionScoped cs(send_critsect_.get()); | 1703 rtc::CritScope lock(&send_critsect_); |
1700 if (force) { | 1704 if (force) { |
1701 start_timestamp_forced_ = true; | 1705 start_timestamp_forced_ = true; |
1702 start_timestamp_ = timestamp; | 1706 start_timestamp_ = timestamp; |
1703 } else { | 1707 } else { |
1704 if (!start_timestamp_forced_) { | 1708 if (!start_timestamp_forced_) { |
1705 start_timestamp_ = timestamp; | 1709 start_timestamp_ = timestamp; |
1706 } | 1710 } |
1707 } | 1711 } |
1708 } | 1712 } |
1709 | 1713 |
1710 uint32_t RTPSender::StartTimestamp() const { | 1714 uint32_t RTPSender::StartTimestamp() const { |
1711 CriticalSectionScoped cs(send_critsect_.get()); | 1715 rtc::CritScope lock(&send_critsect_); |
1712 return start_timestamp_; | 1716 return start_timestamp_; |
1713 } | 1717 } |
1714 | 1718 |
1715 uint32_t RTPSender::GenerateNewSSRC() { | 1719 uint32_t RTPSender::GenerateNewSSRC() { |
1716 // If configured via API, return 0. | 1720 // If configured via API, return 0. |
1717 CriticalSectionScoped cs(send_critsect_.get()); | 1721 rtc::CritScope lock(&send_critsect_); |
1718 | 1722 |
1719 if (ssrc_forced_) { | 1723 if (ssrc_forced_) { |
1720 return 0; | 1724 return 0; |
1721 } | 1725 } |
1722 ssrc_ = ssrc_db_.CreateSSRC(); // Can't be 0. | 1726 ssrc_ = ssrc_db_->CreateSSRC(); |
1723 bitrates_->set_ssrc(ssrc_); | 1727 RTC_DCHECK(ssrc_ != 0); |
| 1728 bitrates_.set_ssrc(ssrc_); |
1724 return ssrc_; | 1729 return ssrc_; |
1725 } | 1730 } |
1726 | 1731 |
1727 void RTPSender::SetSSRC(uint32_t ssrc) { | 1732 void RTPSender::SetSSRC(uint32_t ssrc) { |
1728 // This is configured via the API. | 1733 // This is configured via the API. |
1729 CriticalSectionScoped cs(send_critsect_.get()); | 1734 rtc::CritScope lock(&send_critsect_); |
1730 | 1735 |
1731 if (ssrc_ == ssrc && ssrc_forced_) { | 1736 if (ssrc_ == ssrc && ssrc_forced_) { |
1732 return; // Since it's same ssrc, don't reset anything. | 1737 return; // Since it's same ssrc, don't reset anything. |
1733 } | 1738 } |
1734 ssrc_forced_ = true; | 1739 ssrc_forced_ = true; |
1735 ssrc_db_.ReturnSSRC(ssrc_); | 1740 ssrc_db_->ReturnSSRC(ssrc_); |
1736 ssrc_db_.RegisterSSRC(ssrc); | 1741 ssrc_db_->RegisterSSRC(ssrc); |
1737 ssrc_ = ssrc; | 1742 ssrc_ = ssrc; |
1738 bitrates_->set_ssrc(ssrc_); | 1743 bitrates_.set_ssrc(ssrc_); |
1739 if (!sequence_number_forced_) { | 1744 if (!sequence_number_forced_) { |
1740 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); | 1745 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); |
1741 } | 1746 } |
1742 } | 1747 } |
1743 | 1748 |
1744 uint32_t RTPSender::SSRC() const { | 1749 uint32_t RTPSender::SSRC() const { |
1745 CriticalSectionScoped cs(send_critsect_.get()); | 1750 rtc::CritScope lock(&send_critsect_); |
1746 return ssrc_; | 1751 return ssrc_; |
1747 } | 1752 } |
1748 | 1753 |
1749 void RTPSender::SetCsrcs(const std::vector<uint32_t>& csrcs) { | 1754 void RTPSender::SetCsrcs(const std::vector<uint32_t>& csrcs) { |
1750 assert(csrcs.size() <= kRtpCsrcSize); | 1755 assert(csrcs.size() <= kRtpCsrcSize); |
1751 CriticalSectionScoped cs(send_critsect_.get()); | 1756 rtc::CritScope lock(&send_critsect_); |
1752 csrcs_ = csrcs; | 1757 csrcs_ = csrcs; |
1753 } | 1758 } |
1754 | 1759 |
1755 void RTPSender::SetSequenceNumber(uint16_t seq) { | 1760 void RTPSender::SetSequenceNumber(uint16_t seq) { |
1756 CriticalSectionScoped cs(send_critsect_.get()); | 1761 rtc::CritScope lock(&send_critsect_); |
1757 sequence_number_forced_ = true; | 1762 sequence_number_forced_ = true; |
1758 sequence_number_ = seq; | 1763 sequence_number_ = seq; |
1759 } | 1764 } |
1760 | 1765 |
1761 uint16_t RTPSender::SequenceNumber() const { | 1766 uint16_t RTPSender::SequenceNumber() const { |
1762 CriticalSectionScoped cs(send_critsect_.get()); | 1767 rtc::CritScope lock(&send_critsect_); |
1763 return sequence_number_; | 1768 return sequence_number_; |
1764 } | 1769 } |
1765 | 1770 |
1766 // Audio. | 1771 // Audio. |
1767 int32_t RTPSender::SendTelephoneEvent(uint8_t key, | 1772 int32_t RTPSender::SendTelephoneEvent(uint8_t key, |
1768 uint16_t time_ms, | 1773 uint16_t time_ms, |
1769 uint8_t level) { | 1774 uint8_t level) { |
1770 if (!audio_configured_) { | 1775 if (!audio_configured_) { |
1771 return -1; | 1776 return -1; |
1772 } | 1777 } |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1829 const FecProtectionParams *key_params) { | 1834 const FecProtectionParams *key_params) { |
1830 if (audio_configured_) { | 1835 if (audio_configured_) { |
1831 return -1; | 1836 return -1; |
1832 } | 1837 } |
1833 video_->SetFecParameters(delta_params, key_params); | 1838 video_->SetFecParameters(delta_params, key_params); |
1834 return 0; | 1839 return 0; |
1835 } | 1840 } |
1836 | 1841 |
1837 void RTPSender::BuildRtxPacket(uint8_t* buffer, size_t* length, | 1842 void RTPSender::BuildRtxPacket(uint8_t* buffer, size_t* length, |
1838 uint8_t* buffer_rtx) { | 1843 uint8_t* buffer_rtx) { |
1839 CriticalSectionScoped cs(send_critsect_.get()); | 1844 rtc::CritScope lock(&send_critsect_); |
1840 uint8_t* data_buffer_rtx = buffer_rtx; | 1845 uint8_t* data_buffer_rtx = buffer_rtx; |
1841 // Add RTX header. | 1846 // Add RTX header. |
1842 RtpUtility::RtpHeaderParser rtp_parser( | 1847 RtpUtility::RtpHeaderParser rtp_parser( |
1843 reinterpret_cast<const uint8_t*>(buffer), *length); | 1848 reinterpret_cast<const uint8_t*>(buffer), *length); |
1844 | 1849 |
1845 RTPHeader rtp_header; | 1850 RTPHeader rtp_header; |
1846 rtp_parser.Parse(&rtp_header); | 1851 rtp_parser.Parse(&rtp_header); |
1847 | 1852 |
1848 // Add original RTP header. | 1853 // Add original RTP header. |
1849 memcpy(data_buffer_rtx, buffer, rtp_header.headerLength); | 1854 memcpy(data_buffer_rtx, buffer, rtp_header.headerLength); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1883 StreamDataCountersCallback* RTPSender::GetRtpStatisticsCallback() const { | 1888 StreamDataCountersCallback* RTPSender::GetRtpStatisticsCallback() const { |
1884 CriticalSectionScoped cs(statistics_crit_.get()); | 1889 CriticalSectionScoped cs(statistics_crit_.get()); |
1885 return rtp_stats_callback_; | 1890 return rtp_stats_callback_; |
1886 } | 1891 } |
1887 | 1892 |
1888 uint32_t RTPSender::BitrateSent() const { | 1893 uint32_t RTPSender::BitrateSent() const { |
1889 return total_bitrate_sent_.BitrateLast(); | 1894 return total_bitrate_sent_.BitrateLast(); |
1890 } | 1895 } |
1891 | 1896 |
1892 void RTPSender::SetRtpState(const RtpState& rtp_state) { | 1897 void RTPSender::SetRtpState(const RtpState& rtp_state) { |
1893 CriticalSectionScoped lock(send_critsect_.get()); | 1898 rtc::CritScope lock(&send_critsect_); |
1894 sequence_number_ = rtp_state.sequence_number; | 1899 sequence_number_ = rtp_state.sequence_number; |
1895 sequence_number_forced_ = true; | 1900 sequence_number_forced_ = true; |
1896 timestamp_ = rtp_state.timestamp; | 1901 timestamp_ = rtp_state.timestamp; |
1897 capture_time_ms_ = rtp_state.capture_time_ms; | 1902 capture_time_ms_ = rtp_state.capture_time_ms; |
1898 last_timestamp_time_ms_ = rtp_state.last_timestamp_time_ms; | 1903 last_timestamp_time_ms_ = rtp_state.last_timestamp_time_ms; |
1899 media_has_been_sent_ = rtp_state.media_has_been_sent; | 1904 media_has_been_sent_ = rtp_state.media_has_been_sent; |
1900 } | 1905 } |
1901 | 1906 |
1902 RtpState RTPSender::GetRtpState() const { | 1907 RtpState RTPSender::GetRtpState() const { |
1903 CriticalSectionScoped lock(send_critsect_.get()); | 1908 rtc::CritScope lock(&send_critsect_); |
1904 | 1909 |
1905 RtpState state; | 1910 RtpState state; |
1906 state.sequence_number = sequence_number_; | 1911 state.sequence_number = sequence_number_; |
1907 state.start_timestamp = start_timestamp_; | 1912 state.start_timestamp = start_timestamp_; |
1908 state.timestamp = timestamp_; | 1913 state.timestamp = timestamp_; |
1909 state.capture_time_ms = capture_time_ms_; | 1914 state.capture_time_ms = capture_time_ms_; |
1910 state.last_timestamp_time_ms = last_timestamp_time_ms_; | 1915 state.last_timestamp_time_ms = last_timestamp_time_ms_; |
1911 state.media_has_been_sent = media_has_been_sent_; | 1916 state.media_has_been_sent = media_has_been_sent_; |
1912 | 1917 |
1913 return state; | 1918 return state; |
1914 } | 1919 } |
1915 | 1920 |
1916 void RTPSender::SetRtxRtpState(const RtpState& rtp_state) { | 1921 void RTPSender::SetRtxRtpState(const RtpState& rtp_state) { |
1917 CriticalSectionScoped lock(send_critsect_.get()); | 1922 rtc::CritScope lock(&send_critsect_); |
1918 sequence_number_rtx_ = rtp_state.sequence_number; | 1923 sequence_number_rtx_ = rtp_state.sequence_number; |
1919 } | 1924 } |
1920 | 1925 |
1921 RtpState RTPSender::GetRtxRtpState() const { | 1926 RtpState RTPSender::GetRtxRtpState() const { |
1922 CriticalSectionScoped lock(send_critsect_.get()); | 1927 rtc::CritScope lock(&send_critsect_); |
1923 | 1928 |
1924 RtpState state; | 1929 RtpState state; |
1925 state.sequence_number = sequence_number_rtx_; | 1930 state.sequence_number = sequence_number_rtx_; |
1926 state.start_timestamp = start_timestamp_; | 1931 state.start_timestamp = start_timestamp_; |
1927 | 1932 |
1928 return state; | 1933 return state; |
1929 } | 1934 } |
1930 | 1935 |
1931 } // namespace webrtc | 1936 } // namespace webrtc |
OLD | NEW |