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 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 Transport* transport, | 68 Transport* transport, |
69 RtpPacketSender* paced_sender, | 69 RtpPacketSender* paced_sender, |
70 FlexfecSender* flexfec_sender, | 70 FlexfecSender* flexfec_sender, |
71 TransportSequenceNumberAllocator* sequence_number_allocator, | 71 TransportSequenceNumberAllocator* sequence_number_allocator, |
72 TransportFeedbackObserver* transport_feedback_observer, | 72 TransportFeedbackObserver* transport_feedback_observer, |
73 BitrateStatisticsObserver* bitrate_callback, | 73 BitrateStatisticsObserver* bitrate_callback, |
74 FrameCountObserver* frame_count_observer, | 74 FrameCountObserver* frame_count_observer, |
75 SendSideDelayObserver* send_side_delay_observer, | 75 SendSideDelayObserver* send_side_delay_observer, |
76 RtcEventLog* event_log, | 76 RtcEventLog* event_log, |
77 SendPacketObserver* send_packet_observer, | 77 SendPacketObserver* send_packet_observer, |
78 RateLimiter* retransmission_rate_limiter) | 78 RateLimiter* retransmission_rate_limiter, |
| 79 OverheadPerPacketObserver* const overhead_per_packet_observer) |
79 : clock_(clock), | 80 : clock_(clock), |
80 // TODO(holmer): Remove this conversion? | 81 // TODO(holmer): Remove this conversion? |
81 clock_delta_ms_(clock_->TimeInMilliseconds() - rtc::TimeMillis()), | 82 clock_delta_ms_(clock_->TimeInMilliseconds() - rtc::TimeMillis()), |
82 random_(clock_->TimeInMicroseconds()), | 83 random_(clock_->TimeInMicroseconds()), |
83 audio_configured_(audio), | 84 audio_configured_(audio), |
84 audio_(audio ? new RTPSenderAudio(clock, this) : nullptr), | 85 audio_(audio ? new RTPSenderAudio(clock, this) : nullptr), |
85 video_(audio ? nullptr : new RTPSenderVideo(clock, this, flexfec_sender)), | 86 video_(audio ? nullptr : new RTPSenderVideo(clock, this, flexfec_sender)), |
86 paced_sender_(paced_sender), | 87 paced_sender_(paced_sender), |
87 transport_sequence_number_allocator_(sequence_number_allocator), | 88 transport_sequence_number_allocator_(sequence_number_allocator), |
88 transport_feedback_observer_(transport_feedback_observer), | 89 transport_feedback_observer_(transport_feedback_observer), |
(...skipping 20 matching lines...) Expand all Loading... |
109 remote_ssrc_(0), | 110 remote_ssrc_(0), |
110 sequence_number_forced_(false), | 111 sequence_number_forced_(false), |
111 ssrc_forced_(false), | 112 ssrc_forced_(false), |
112 last_rtp_timestamp_(0), | 113 last_rtp_timestamp_(0), |
113 capture_time_ms_(0), | 114 capture_time_ms_(0), |
114 last_timestamp_time_ms_(0), | 115 last_timestamp_time_ms_(0), |
115 media_has_been_sent_(false), | 116 media_has_been_sent_(false), |
116 last_packet_marker_bit_(false), | 117 last_packet_marker_bit_(false), |
117 csrcs_(), | 118 csrcs_(), |
118 rtx_(kRtxOff), | 119 rtx_(kRtxOff), |
119 retransmission_rate_limiter_(retransmission_rate_limiter) { | 120 transport_overhead_per_packet_(0), |
| 121 rtp_overhead_per_packet_(0), |
| 122 retransmission_rate_limiter_(retransmission_rate_limiter), |
| 123 overhead_per_packet_observer_(overhead_per_packet_observer) { |
120 ssrc_ = ssrc_db_->CreateSSRC(); | 124 ssrc_ = ssrc_db_->CreateSSRC(); |
121 RTC_DCHECK(ssrc_ != 0); | 125 RTC_DCHECK(ssrc_ != 0); |
122 ssrc_rtx_ = ssrc_db_->CreateSSRC(); | 126 ssrc_rtx_ = ssrc_db_->CreateSSRC(); |
123 RTC_DCHECK(ssrc_rtx_ != 0); | 127 RTC_DCHECK(ssrc_rtx_ != 0); |
124 | 128 |
125 // This random initialization is not intended to be cryptographic strong. | 129 // This random initialization is not intended to be cryptographic strong. |
126 timestamp_offset_ = random_.Rand<uint32_t>(); | 130 timestamp_offset_ = random_.Rand<uint32_t>(); |
127 // Random start, 16 bits. Can't be 0. | 131 // Random start, 16 bits. Can't be 0. |
128 sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber); | 132 sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber); |
129 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); | 133 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); |
(...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
554 padding_packet.SetTimestamp(timestamp); | 558 padding_packet.SetTimestamp(timestamp); |
555 padding_packet.SetSsrc(ssrc); | 559 padding_packet.SetSsrc(ssrc); |
556 | 560 |
557 int64_t now_ms = clock_->TimeInMilliseconds(); | 561 int64_t now_ms = clock_->TimeInMilliseconds(); |
558 | 562 |
559 if (capture_time_ms > 0) { | 563 if (capture_time_ms > 0) { |
560 padding_packet.SetExtension<TransmissionOffset>( | 564 padding_packet.SetExtension<TransmissionOffset>( |
561 kTimestampTicksPerMs * (now_ms - capture_time_ms)); | 565 kTimestampTicksPerMs * (now_ms - capture_time_ms)); |
562 } | 566 } |
563 padding_packet.SetExtension<AbsoluteSendTime>(now_ms); | 567 padding_packet.SetExtension<AbsoluteSendTime>(now_ms); |
| 568 padding_packet.SetPadding(padding_bytes_in_packet, &random_); |
564 | 569 |
565 PacketOptions options; | 570 PacketOptions options; |
566 bool has_transport_seq_no = | 571 AddPacketToTransportFeedback(&options, &padding_packet, probe_cluster_id); |
567 UpdateTransportSequenceNumber(&padding_packet, &options.packet_id); | |
568 | |
569 padding_packet.SetPadding(padding_bytes_in_packet, &random_); | |
570 | |
571 if (has_transport_seq_no && transport_feedback_observer_) | |
572 transport_feedback_observer_->AddPacket( | |
573 options.packet_id, | |
574 padding_packet.payload_size() + padding_packet.padding_size(), | |
575 probe_cluster_id); | |
576 | 572 |
577 if (!SendPacketToNetwork(padding_packet, options)) | 573 if (!SendPacketToNetwork(padding_packet, options)) |
578 break; | 574 break; |
579 | 575 |
580 bytes_sent += padding_bytes_in_packet; | 576 bytes_sent += padding_bytes_in_packet; |
581 UpdateRtpStats(padding_packet, over_rtx, false); | 577 UpdateRtpStats(padding_packet, over_rtx, false); |
582 } | 578 } |
583 | 579 |
584 return bytes_sent; | 580 return bytes_sent; |
585 } | 581 } |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
728 packet_to_send = packet_rtx.get(); | 724 packet_to_send = packet_rtx.get(); |
729 } | 725 } |
730 | 726 |
731 int64_t now_ms = clock_->TimeInMilliseconds(); | 727 int64_t now_ms = clock_->TimeInMilliseconds(); |
732 int64_t diff_ms = now_ms - capture_time_ms; | 728 int64_t diff_ms = now_ms - capture_time_ms; |
733 packet_to_send->SetExtension<TransmissionOffset>(kTimestampTicksPerMs * | 729 packet_to_send->SetExtension<TransmissionOffset>(kTimestampTicksPerMs * |
734 diff_ms); | 730 diff_ms); |
735 packet_to_send->SetExtension<AbsoluteSendTime>(now_ms); | 731 packet_to_send->SetExtension<AbsoluteSendTime>(now_ms); |
736 | 732 |
737 PacketOptions options; | 733 PacketOptions options; |
738 if (UpdateTransportSequenceNumber(packet_to_send, &options.packet_id) && | 734 AddPacketToTransportFeedback(&options, packet_to_send, probe_cluster_id); |
739 transport_feedback_observer_) { | |
740 transport_feedback_observer_->AddPacket( | |
741 options.packet_id, | |
742 packet_to_send->payload_size() + packet_to_send->padding_size(), | |
743 probe_cluster_id); | |
744 } | |
745 | 735 |
746 if (!is_retransmit && !send_over_rtx) { | 736 if (!is_retransmit && !send_over_rtx) { |
747 UpdateDelayStatistics(packet->capture_time_ms(), now_ms); | 737 UpdateDelayStatistics(packet->capture_time_ms(), now_ms); |
748 UpdateOnSendPacket(options.packet_id, packet->capture_time_ms(), | 738 UpdateOnSendPacket(options.packet_id, packet->capture_time_ms(), |
749 packet->Ssrc()); | 739 packet->Ssrc()); |
750 } | 740 } |
751 | 741 |
752 if (!SendPacketToNetwork(*packet_to_send, options)) | 742 if (!SendPacketToNetwork(*packet_to_send, options)) |
753 return false; | 743 return false; |
754 | 744 |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
851 corrected_time_ms > last_capture_time_ms_sent_) { | 841 corrected_time_ms > last_capture_time_ms_sent_) { |
852 last_capture_time_ms_sent_ = corrected_time_ms; | 842 last_capture_time_ms_sent_ = corrected_time_ms; |
853 TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), | 843 TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), |
854 "PacedSend", corrected_time_ms, | 844 "PacedSend", corrected_time_ms, |
855 "capture_time_ms", corrected_time_ms); | 845 "capture_time_ms", corrected_time_ms); |
856 } | 846 } |
857 return true; | 847 return true; |
858 } | 848 } |
859 | 849 |
860 PacketOptions options; | 850 PacketOptions options; |
861 if (UpdateTransportSequenceNumber(packet.get(), &options.packet_id) && | 851 AddPacketToTransportFeedback(&options, packet.get(), PacketInfo::kNotAProbe); |
862 transport_feedback_observer_) { | |
863 transport_feedback_observer_->AddPacket( | |
864 options.packet_id, packet->payload_size() + packet->padding_size(), | |
865 PacketInfo::kNotAProbe); | |
866 } | |
867 | 852 |
868 UpdateDelayStatistics(packet->capture_time_ms(), now_ms); | 853 UpdateDelayStatistics(packet->capture_time_ms(), now_ms); |
869 UpdateOnSendPacket(options.packet_id, packet->capture_time_ms(), | 854 UpdateOnSendPacket(options.packet_id, packet->capture_time_ms(), |
870 packet->Ssrc()); | 855 packet->Ssrc()); |
871 | 856 |
872 bool sent = SendPacketToNetwork(*packet, options); | 857 bool sent = SendPacketToNetwork(*packet, options); |
873 | 858 |
874 if (sent) { | 859 if (sent) { |
875 { | 860 { |
876 rtc::CritScope lock(&send_critsect_); | 861 rtc::CritScope lock(&send_critsect_); |
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1237 RtpState RTPSender::GetRtxRtpState() const { | 1222 RtpState RTPSender::GetRtxRtpState() const { |
1238 rtc::CritScope lock(&send_critsect_); | 1223 rtc::CritScope lock(&send_critsect_); |
1239 | 1224 |
1240 RtpState state; | 1225 RtpState state; |
1241 state.sequence_number = sequence_number_rtx_; | 1226 state.sequence_number = sequence_number_rtx_; |
1242 state.start_timestamp = timestamp_offset_; | 1227 state.start_timestamp = timestamp_offset_; |
1243 | 1228 |
1244 return state; | 1229 return state; |
1245 } | 1230 } |
1246 | 1231 |
| 1232 void RTPSender::SetTransportOverhead(int transport_overhead) { |
| 1233 rtc::CritScope lock(&send_critsect_); |
| 1234 if (overhead_per_packet_observer_ && |
| 1235 transport_overhead_per_packet_ != transport_overhead) { |
| 1236 overhead_per_packet_observer_->OnOverheadPerPacketChange( |
| 1237 rtp_overhead_per_packet_ + transport_overhead); |
| 1238 } |
| 1239 transport_overhead_per_packet_ = transport_overhead; |
| 1240 } |
| 1241 |
| 1242 void RTPSender::AddPacketToTransportFeedback(PacketOptions* options, |
| 1243 RtpPacketToSend* packet, |
| 1244 int probe_cluster_id) { |
| 1245 rtc::CritScope lock(&send_critsect_); |
| 1246 if (UpdateTransportSequenceNumber(packet, &options->packet_id) && |
| 1247 transport_feedback_observer_) { |
| 1248 transport_feedback_observer_->AddPacket( |
| 1249 options->packet_id, packet->payload_size() + packet->padding_size(), |
| 1250 probe_cluster_id); |
| 1251 } |
| 1252 if (overhead_per_packet_observer_ && |
| 1253 rtp_overhead_per_packet_ != packet->headers_size()) { |
| 1254 overhead_per_packet_observer_->OnOverheadPerPacketChange( |
| 1255 packet->headers_size() + transport_overhead_per_packet_); |
| 1256 } |
| 1257 rtp_overhead_per_packet_ = packet->headers_size(); |
| 1258 } |
| 1259 |
1247 } // namespace webrtc | 1260 } // namespace webrtc |
OLD | NEW |