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 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
86 random_(clock_->TimeInMicroseconds()), | 86 random_(clock_->TimeInMicroseconds()), |
87 audio_configured_(audio), | 87 audio_configured_(audio), |
88 audio_(audio ? new RTPSenderAudio(clock, this) : nullptr), | 88 audio_(audio ? new RTPSenderAudio(clock, this) : nullptr), |
89 video_(audio ? nullptr : new RTPSenderVideo(clock, this, flexfec_sender)), | 89 video_(audio ? nullptr : new RTPSenderVideo(clock, this, flexfec_sender)), |
90 paced_sender_(paced_sender), | 90 paced_sender_(paced_sender), |
91 transport_sequence_number_allocator_(sequence_number_allocator), | 91 transport_sequence_number_allocator_(sequence_number_allocator), |
92 transport_feedback_observer_(transport_feedback_observer), | 92 transport_feedback_observer_(transport_feedback_observer), |
93 last_capture_time_ms_sent_(0), | 93 last_capture_time_ms_sent_(0), |
94 transport_(transport), | 94 transport_(transport), |
95 sending_media_(true), // Default to sending media. | 95 sending_media_(true), // Default to sending media. |
96 max_payload_length_(IP_PACKET_SIZE - 28), // Default is IP-v4/UDP. | 96 max_packet_size_(IP_PACKET_SIZE - 28), // Default is IP-v4/UDP. |
97 payload_type_(-1), | 97 payload_type_(-1), |
98 payload_type_map_(), | 98 payload_type_map_(), |
99 rtp_header_extension_map_(), | 99 rtp_header_extension_map_(), |
100 packet_history_(clock), | 100 packet_history_(clock), |
101 flexfec_packet_history_(clock), | 101 flexfec_packet_history_(clock), |
102 // Statistics | 102 // Statistics |
103 rtp_stats_callback_(nullptr), | 103 rtp_stats_callback_(nullptr), |
104 total_bitrate_sent_(kBitrateStatisticsWindowMs, | 104 total_bitrate_sent_(kBitrateStatisticsWindowMs, |
105 RateStatistics::kBpsScale), | 105 RateStatistics::kBpsScale), |
106 nack_bitrate_sent_(kBitrateStatisticsWindowMs, RateStatistics::kBpsScale), | 106 nack_bitrate_sent_(kBitrateStatisticsWindowMs, RateStatistics::kBpsScale), |
107 frame_count_observer_(frame_count_observer), | 107 frame_count_observer_(frame_count_observer), |
108 send_side_delay_observer_(send_side_delay_observer), | 108 send_side_delay_observer_(send_side_delay_observer), |
109 event_log_(event_log), | 109 event_log_(event_log), |
110 send_packet_observer_(send_packet_observer), | 110 send_packet_observer_(send_packet_observer), |
111 bitrate_callback_(bitrate_callback), | 111 bitrate_callback_(bitrate_callback), |
112 // RTP variables | 112 // RTP variables |
113 ssrc_db_(SSRCDatabase::GetSSRCDatabase()), | 113 ssrc_db_(SSRCDatabase::GetSSRCDatabase()), |
114 remote_ssrc_(0), | 114 remote_ssrc_(0), |
115 sequence_number_forced_(false), | 115 sequence_number_forced_(false), |
116 ssrc_forced_(false), | 116 ssrc_forced_(false), |
117 last_rtp_timestamp_(0), | 117 last_rtp_timestamp_(0), |
118 capture_time_ms_(0), | 118 capture_time_ms_(0), |
119 last_timestamp_time_ms_(0), | 119 last_timestamp_time_ms_(0), |
120 media_has_been_sent_(false), | 120 media_has_been_sent_(false), |
121 last_packet_marker_bit_(false), | 121 last_packet_marker_bit_(false), |
122 csrcs_(), | 122 csrcs_(), |
123 rtx_(kRtxOff), | 123 rtx_(kRtxOff), |
124 transport_overhead_bytes_per_packet_(0), | |
125 rtp_overhead_bytes_per_packet_(0), | 124 rtp_overhead_bytes_per_packet_(0), |
126 retransmission_rate_limiter_(retransmission_rate_limiter), | 125 retransmission_rate_limiter_(retransmission_rate_limiter), |
127 overhead_observer_(overhead_observer) { | 126 overhead_observer_(overhead_observer) { |
128 ssrc_ = ssrc_db_->CreateSSRC(); | 127 ssrc_ = ssrc_db_->CreateSSRC(); |
129 RTC_DCHECK(ssrc_ != 0); | 128 RTC_DCHECK(ssrc_ != 0); |
130 ssrc_rtx_ = ssrc_db_->CreateSSRC(); | 129 ssrc_rtx_ = ssrc_db_->CreateSSRC(); |
131 RTC_DCHECK(ssrc_rtx_ != 0); | 130 RTC_DCHECK(ssrc_rtx_ != 0); |
132 | 131 |
133 // This random initialization is not intended to be cryptographic strong. | 132 // This random initialization is not intended to be cryptographic strong. |
134 timestamp_offset_ = random_.Rand<uint32_t>(); | 133 timestamp_offset_ = random_.Rand<uint32_t>(); |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
290 void RTPSender::SetSendPayloadType(int8_t payload_type) { | 289 void RTPSender::SetSendPayloadType(int8_t payload_type) { |
291 rtc::CritScope lock(&send_critsect_); | 290 rtc::CritScope lock(&send_critsect_); |
292 payload_type_ = payload_type; | 291 payload_type_ = payload_type; |
293 } | 292 } |
294 | 293 |
295 int8_t RTPSender::SendPayloadType() const { | 294 int8_t RTPSender::SendPayloadType() const { |
296 rtc::CritScope lock(&send_critsect_); | 295 rtc::CritScope lock(&send_critsect_); |
297 return payload_type_; | 296 return payload_type_; |
298 } | 297 } |
299 | 298 |
300 void RTPSender::SetMaxPayloadLength(size_t max_payload_length) { | 299 void RTPSender::SetMaxRtpPacketSize(size_t max_packet_size) { |
301 // Sanity check. | 300 // Sanity check. |
302 RTC_DCHECK(max_payload_length >= 100 && max_payload_length <= IP_PACKET_SIZE) | 301 RTC_DCHECK(max_packet_size >= 100 && max_packet_size <= IP_PACKET_SIZE) |
303 << "Invalid max payload length: " << max_payload_length; | 302 << "Invalid max payload length: " << max_packet_size; |
304 rtc::CritScope lock(&send_critsect_); | 303 rtc::CritScope lock(&send_critsect_); |
305 max_payload_length_ = max_payload_length; | 304 max_packet_size_ = max_packet_size; |
306 } | 305 } |
307 | 306 |
308 size_t RTPSender::MaxDataPayloadLength() const { | 307 size_t RTPSender::MaxPayloadSize() const { |
309 if (audio_configured_) { | 308 if (audio_configured_) { |
310 return max_payload_length_ - RtpHeaderLength(); | 309 return max_packet_size_ - RtpHeaderLength(); |
311 } else { | 310 } else { |
312 return max_payload_length_ - RtpHeaderLength() // RTP overhead. | 311 return max_packet_size_ - RtpHeaderLength() // RTP overhead. |
313 - video_->FecPacketOverhead() // FEC/ULP/RED overhead. | 312 - video_->FecPacketOverhead() // FEC/ULP/RED overhead. |
314 - (RtxStatus() ? kRtxHeaderSize : 0); // RTX overhead. | 313 - (RtxStatus() ? kRtxHeaderSize : 0); // RTX overhead. |
315 } | 314 } |
316 } | 315 } |
317 | 316 |
318 size_t RTPSender::MaxPayloadLength() const { | 317 size_t RTPSender::MaxRtpPacketSize() const { |
319 return max_payload_length_; | 318 return max_packet_size_; |
320 } | 319 } |
321 | 320 |
322 void RTPSender::SetRtxStatus(int mode) { | 321 void RTPSender::SetRtxStatus(int mode) { |
323 rtc::CritScope lock(&send_critsect_); | 322 rtc::CritScope lock(&send_critsect_); |
324 rtx_ = mode; | 323 rtx_ = mode; |
325 } | 324 } |
326 | 325 |
327 int RTPSender::RtxStatus() const { | 326 int RTPSender::RtxStatus() const { |
328 rtc::CritScope lock(&send_critsect_); | 327 rtc::CritScope lock(&send_critsect_); |
329 return rtx_; | 328 return rtx_; |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
476 bytes_left -= payload_size; | 475 bytes_left -= payload_size; |
477 } | 476 } |
478 return bytes_to_send - bytes_left; | 477 return bytes_to_send - bytes_left; |
479 } | 478 } |
480 | 479 |
481 size_t RTPSender::SendPadData(size_t bytes, int probe_cluster_id) { | 480 size_t RTPSender::SendPadData(size_t bytes, int probe_cluster_id) { |
482 // Always send full padding packets. This is accounted for by the | 481 // Always send full padding packets. This is accounted for by the |
483 // RtpPacketSender, which will make sure we don't send too much padding even | 482 // RtpPacketSender, which will make sure we don't send too much padding even |
484 // if a single packet is larger than requested. | 483 // if a single packet is larger than requested. |
485 size_t padding_bytes_in_packet = | 484 size_t padding_bytes_in_packet = |
486 std::min(MaxDataPayloadLength(), kMaxPaddingLength); | 485 std::min(MaxPayloadSize(), kMaxPaddingLength); |
487 size_t bytes_sent = 0; | 486 size_t bytes_sent = 0; |
488 while (bytes_sent < bytes) { | 487 while (bytes_sent < bytes) { |
489 int64_t now_ms = clock_->TimeInMilliseconds(); | 488 int64_t now_ms = clock_->TimeInMilliseconds(); |
490 uint32_t ssrc; | 489 uint32_t ssrc; |
491 uint32_t timestamp; | 490 uint32_t timestamp; |
492 int64_t capture_time_ms; | 491 int64_t capture_time_ms; |
493 uint16_t sequence_number; | 492 uint16_t sequence_number; |
494 int payload_type; | 493 int payload_type; |
495 bool over_rtx; | 494 bool over_rtx; |
496 { | 495 { |
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
964 void RTPSender::GetDataCounters(StreamDataCounters* rtp_stats, | 963 void RTPSender::GetDataCounters(StreamDataCounters* rtp_stats, |
965 StreamDataCounters* rtx_stats) const { | 964 StreamDataCounters* rtx_stats) const { |
966 rtc::CritScope lock(&statistics_crit_); | 965 rtc::CritScope lock(&statistics_crit_); |
967 *rtp_stats = rtp_stats_; | 966 *rtp_stats = rtp_stats_; |
968 *rtx_stats = rtx_rtp_stats_; | 967 *rtx_stats = rtx_rtp_stats_; |
969 } | 968 } |
970 | 969 |
971 std::unique_ptr<RtpPacketToSend> RTPSender::AllocatePacket() const { | 970 std::unique_ptr<RtpPacketToSend> RTPSender::AllocatePacket() const { |
972 rtc::CritScope lock(&send_critsect_); | 971 rtc::CritScope lock(&send_critsect_); |
973 std::unique_ptr<RtpPacketToSend> packet( | 972 std::unique_ptr<RtpPacketToSend> packet( |
974 new RtpPacketToSend(&rtp_header_extension_map_, max_payload_length_)); | 973 new RtpPacketToSend(&rtp_header_extension_map_, max_packet_size_)); |
975 packet->SetSsrc(ssrc_); | 974 packet->SetSsrc(ssrc_); |
976 packet->SetCsrcs(csrcs_); | 975 packet->SetCsrcs(csrcs_); |
977 // Reserve extensions, if registered, RtpSender set in SendToNetwork. | 976 // Reserve extensions, if registered, RtpSender set in SendToNetwork. |
978 packet->ReserveExtension<AbsoluteSendTime>(); | 977 packet->ReserveExtension<AbsoluteSendTime>(); |
979 packet->ReserveExtension<TransmissionOffset>(); | 978 packet->ReserveExtension<TransmissionOffset>(); |
980 packet->ReserveExtension<TransportSequenceNumber>(); | 979 packet->ReserveExtension<TransportSequenceNumber>(); |
981 if (playout_delay_oracle_.send_playout_delay()) { | 980 if (playout_delay_oracle_.send_playout_delay()) { |
982 packet->SetExtension<PlayoutDelayLimits>( | 981 packet->SetExtension<PlayoutDelayLimits>( |
983 playout_delay_oracle_.playout_delay()); | 982 playout_delay_oracle_.playout_delay()); |
984 } | 983 } |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1243 RtpState RTPSender::GetRtxRtpState() const { | 1242 RtpState RTPSender::GetRtxRtpState() const { |
1244 rtc::CritScope lock(&send_critsect_); | 1243 rtc::CritScope lock(&send_critsect_); |
1245 | 1244 |
1246 RtpState state; | 1245 RtpState state; |
1247 state.sequence_number = sequence_number_rtx_; | 1246 state.sequence_number = sequence_number_rtx_; |
1248 state.start_timestamp = timestamp_offset_; | 1247 state.start_timestamp = timestamp_offset_; |
1249 | 1248 |
1250 return state; | 1249 return state; |
1251 } | 1250 } |
1252 | 1251 |
1253 void RTPSender::SetTransportOverhead(int transport_overhead) { | |
1254 if (!overhead_observer_) | |
1255 return; | |
1256 size_t overhead_bytes_per_packet = 0; | |
1257 { | |
1258 rtc::CritScope lock(&send_critsect_); | |
1259 if (transport_overhead_bytes_per_packet_ == | |
1260 static_cast<size_t>(transport_overhead)) { | |
1261 return; | |
1262 } | |
1263 transport_overhead_bytes_per_packet_ = transport_overhead; | |
1264 overhead_bytes_per_packet = | |
1265 rtp_overhead_bytes_per_packet_ + transport_overhead_bytes_per_packet_; | |
1266 } | |
1267 overhead_observer_->OnOverheadChanged(overhead_bytes_per_packet); | |
1268 } | |
1269 | |
1270 void RTPSender::AddPacketToTransportFeedback(uint16_t packet_id, | 1252 void RTPSender::AddPacketToTransportFeedback(uint16_t packet_id, |
1271 const RtpPacketToSend& packet, | 1253 const RtpPacketToSend& packet, |
1272 int probe_cluster_id) { | 1254 int probe_cluster_id) { |
1273 size_t packet_size = packet.payload_size() + packet.padding_size(); | 1255 size_t packet_size = packet.payload_size() + packet.padding_size(); |
1274 if (webrtc::field_trial::FindFullName("WebRTC-SendSideBwe-WithOverhead") == | 1256 if (webrtc::field_trial::FindFullName("WebRTC-SendSideBwe-WithOverhead") == |
1275 "Enabled") { | 1257 "Enabled") { |
1276 rtc::CritScope lock(&send_critsect_); | 1258 packet_size = packet.size(); |
1277 packet_size = packet.size() + transport_overhead_bytes_per_packet_; | |
1278 } | 1259 } |
1279 | 1260 |
1280 if (transport_feedback_observer_) { | 1261 if (transport_feedback_observer_) { |
1281 transport_feedback_observer_->AddPacket(packet_id, packet_size, | 1262 transport_feedback_observer_->AddPacket(packet_id, packet_size, |
1282 probe_cluster_id); | 1263 probe_cluster_id); |
1283 } | 1264 } |
1284 } | 1265 } |
1285 | 1266 |
1286 void RTPSender::UpdateRtpOverhead(const RtpPacketToSend& packet) { | 1267 void RTPSender::UpdateRtpOverhead(const RtpPacketToSend& packet) { |
1287 if (!overhead_observer_) | 1268 if (!overhead_observer_) |
1288 return; | 1269 return; |
1289 size_t overhead_bytes_per_packet = 0; | 1270 size_t overhead_bytes_per_packet; |
1290 { | 1271 { |
1291 rtc::CritScope lock(&send_critsect_); | 1272 rtc::CritScope lock(&send_critsect_); |
1292 if (rtp_overhead_bytes_per_packet_ == packet.headers_size()) { | 1273 if (rtp_overhead_bytes_per_packet_ == packet.headers_size()) { |
1293 return; | 1274 return; |
1294 } | 1275 } |
1295 rtp_overhead_bytes_per_packet_ = packet.headers_size(); | 1276 rtp_overhead_bytes_per_packet_ = packet.headers_size(); |
1296 overhead_bytes_per_packet = | 1277 overhead_bytes_per_packet = rtp_overhead_bytes_per_packet_; |
1297 rtp_overhead_bytes_per_packet_ + transport_overhead_bytes_per_packet_; | |
1298 } | 1278 } |
1299 overhead_observer_->OnOverheadChanged(overhead_bytes_per_packet); | 1279 overhead_observer_->OnOverheadChanged(overhead_bytes_per_packet); |
stefan-webrtc
2016/12/20 13:05:01
This should now be renamed OnRtpOverheadChanged()
nisse-webrtc
2016/12/20 13:38:13
And the abstract-looking OverheadObserver interfac
stefan-webrtc
2016/12/20 14:18:23
True. Maybe it's clear enough since it's only poss
| |
1300 } | 1280 } |
1301 | 1281 |
1302 } // namespace webrtc | 1282 } // namespace webrtc |
OLD | NEW |