| 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 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 clock_delta_ms_(clock_->TimeInMilliseconds() - rtc::TimeMillis()), | 85 clock_delta_ms_(clock_->TimeInMilliseconds() - rtc::TimeMillis()), |
| 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 470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 967 void RTPSender::GetDataCounters(StreamDataCounters* rtp_stats, | 966 void RTPSender::GetDataCounters(StreamDataCounters* rtp_stats, |
| 968 StreamDataCounters* rtx_stats) const { | 967 StreamDataCounters* rtx_stats) const { |
| 969 rtc::CritScope lock(&statistics_crit_); | 968 rtc::CritScope lock(&statistics_crit_); |
| 970 *rtp_stats = rtp_stats_; | 969 *rtp_stats = rtp_stats_; |
| 971 *rtx_stats = rtx_rtp_stats_; | 970 *rtx_stats = rtx_rtp_stats_; |
| 972 } | 971 } |
| 973 | 972 |
| 974 std::unique_ptr<RtpPacketToSend> RTPSender::AllocatePacket() const { | 973 std::unique_ptr<RtpPacketToSend> RTPSender::AllocatePacket() const { |
| 975 rtc::CritScope lock(&send_critsect_); | 974 rtc::CritScope lock(&send_critsect_); |
| 976 std::unique_ptr<RtpPacketToSend> packet( | 975 std::unique_ptr<RtpPacketToSend> packet( |
| 977 new RtpPacketToSend(&rtp_header_extension_map_, max_payload_length_)); | 976 new RtpPacketToSend(&rtp_header_extension_map_, max_packet_size_)); |
| 978 packet->SetSsrc(ssrc_); | 977 packet->SetSsrc(ssrc_); |
| 979 packet->SetCsrcs(csrcs_); | 978 packet->SetCsrcs(csrcs_); |
| 980 // Reserve extensions, if registered, RtpSender set in SendToNetwork. | 979 // Reserve extensions, if registered, RtpSender set in SendToNetwork. |
| 981 packet->ReserveExtension<AbsoluteSendTime>(); | 980 packet->ReserveExtension<AbsoluteSendTime>(); |
| 982 packet->ReserveExtension<TransmissionOffset>(); | 981 packet->ReserveExtension<TransmissionOffset>(); |
| 983 packet->ReserveExtension<TransportSequenceNumber>(); | 982 packet->ReserveExtension<TransportSequenceNumber>(); |
| 984 if (playout_delay_oracle_.send_playout_delay()) { | 983 if (playout_delay_oracle_.send_playout_delay()) { |
| 985 packet->SetExtension<PlayoutDelayLimits>( | 984 packet->SetExtension<PlayoutDelayLimits>( |
| 986 playout_delay_oracle_.playout_delay()); | 985 playout_delay_oracle_.playout_delay()); |
| 987 } | 986 } |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1246 RtpState RTPSender::GetRtxRtpState() const { | 1245 RtpState RTPSender::GetRtxRtpState() const { |
| 1247 rtc::CritScope lock(&send_critsect_); | 1246 rtc::CritScope lock(&send_critsect_); |
| 1248 | 1247 |
| 1249 RtpState state; | 1248 RtpState state; |
| 1250 state.sequence_number = sequence_number_rtx_; | 1249 state.sequence_number = sequence_number_rtx_; |
| 1251 state.start_timestamp = timestamp_offset_; | 1250 state.start_timestamp = timestamp_offset_; |
| 1252 | 1251 |
| 1253 return state; | 1252 return state; |
| 1254 } | 1253 } |
| 1255 | 1254 |
| 1256 void RTPSender::SetTransportOverhead(int transport_overhead) { | |
| 1257 if (!overhead_observer_) | |
| 1258 return; | |
| 1259 size_t overhead_bytes_per_packet = 0; | |
| 1260 { | |
| 1261 rtc::CritScope lock(&send_critsect_); | |
| 1262 if (transport_overhead_bytes_per_packet_ == | |
| 1263 static_cast<size_t>(transport_overhead)) { | |
| 1264 return; | |
| 1265 } | |
| 1266 transport_overhead_bytes_per_packet_ = transport_overhead; | |
| 1267 overhead_bytes_per_packet = | |
| 1268 rtp_overhead_bytes_per_packet_ + transport_overhead_bytes_per_packet_; | |
| 1269 } | |
| 1270 overhead_observer_->OnOverheadChanged(overhead_bytes_per_packet); | |
| 1271 } | |
| 1272 | |
| 1273 void RTPSender::AddPacketToTransportFeedback(uint16_t packet_id, | 1255 void RTPSender::AddPacketToTransportFeedback(uint16_t packet_id, |
| 1274 const RtpPacketToSend& packet, | 1256 const RtpPacketToSend& packet, |
| 1275 int probe_cluster_id) { | 1257 int probe_cluster_id) { |
| 1276 size_t packet_size = packet.payload_size() + packet.padding_size(); | 1258 size_t packet_size = packet.payload_size() + packet.padding_size(); |
| 1277 if (webrtc::field_trial::FindFullName("WebRTC-SendSideBwe-WithOverhead") == | 1259 if (webrtc::field_trial::FindFullName("WebRTC-SendSideBwe-WithOverhead") == |
| 1278 "Enabled") { | 1260 "Enabled") { |
| 1279 rtc::CritScope lock(&send_critsect_); | 1261 packet_size = packet.size(); |
| 1280 packet_size = packet.size() + transport_overhead_bytes_per_packet_; | |
| 1281 } | 1262 } |
| 1282 | 1263 |
| 1283 if (transport_feedback_observer_) { | 1264 if (transport_feedback_observer_) { |
| 1284 transport_feedback_observer_->AddPacket(packet_id, packet_size, | 1265 transport_feedback_observer_->AddPacket(packet_id, packet_size, |
| 1285 probe_cluster_id); | 1266 probe_cluster_id); |
| 1286 } | 1267 } |
| 1287 } | 1268 } |
| 1288 | 1269 |
| 1289 void RTPSender::UpdateRtpOverhead(const RtpPacketToSend& packet) { | 1270 void RTPSender::UpdateRtpOverhead(const RtpPacketToSend& packet) { |
| 1290 if (!overhead_observer_) | 1271 if (!overhead_observer_) |
| 1291 return; | 1272 return; |
| 1292 size_t overhead_bytes_per_packet = 0; | 1273 size_t overhead_bytes_per_packet; |
| 1293 { | 1274 { |
| 1294 rtc::CritScope lock(&send_critsect_); | 1275 rtc::CritScope lock(&send_critsect_); |
| 1295 if (rtp_overhead_bytes_per_packet_ == packet.headers_size()) { | 1276 if (rtp_overhead_bytes_per_packet_ == packet.headers_size()) { |
| 1296 return; | 1277 return; |
| 1297 } | 1278 } |
| 1298 rtp_overhead_bytes_per_packet_ = packet.headers_size(); | 1279 rtp_overhead_bytes_per_packet_ = packet.headers_size(); |
| 1299 overhead_bytes_per_packet = | 1280 overhead_bytes_per_packet = rtp_overhead_bytes_per_packet_; |
| 1300 rtp_overhead_bytes_per_packet_ + transport_overhead_bytes_per_packet_; | |
| 1301 } | 1281 } |
| 1302 overhead_observer_->OnOverheadChanged(overhead_bytes_per_packet); | 1282 overhead_observer_->OnOverheadChanged(overhead_bytes_per_packet); |
| 1303 } | 1283 } |
| 1304 | 1284 |
| 1305 } // namespace webrtc | 1285 } // namespace webrtc |
| OLD | NEW |