Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtp_sender.cc

Issue 1623543002: Refactor RtpSender and SSRCDatabase a bit. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Update comment and remove the one from ssrc_database.cc Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/rtp_sender.h ('k') | webrtc/modules/rtp_rtcp/source/ssrc_database.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698