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 OverheadSizeObserver* overhead_size_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_bytes_per_packet_(0), |
121 rtp_overhead_bytes_per_packet_(0), | |
122 retransmission_rate_limiter_(retransmission_rate_limiter), | |
123 overhead_size_observer_(overhead_size_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); |
564 | |
565 PacketOptions options; | 568 PacketOptions options; |
566 bool has_transport_seq_no = | 569 bool has_transport_seq_no = |
567 UpdateTransportSequenceNumber(&padding_packet, &options.packet_id); | 570 UpdateTransportSequenceNumber(&padding_packet, &options.packet_id); |
568 | |
569 padding_packet.SetPadding(padding_bytes_in_packet, &random_); | 571 padding_packet.SetPadding(padding_bytes_in_packet, &random_); |
570 | 572 |
571 if (has_transport_seq_no && transport_feedback_observer_) | 573 if (has_transport_seq_no) { |
stefan-webrtc
2016/11/15 09:59:47
Could you please change seq_no to seq_num? Thanks
michaelt
2016/11/15 11:25:04
Done.
| |
572 transport_feedback_observer_->AddPacket( | 574 AddPacketToTransportFeedback(options.packet_id, &padding_packet, |
573 options.packet_id, | 575 probe_cluster_id); |
574 padding_packet.payload_size() + padding_packet.padding_size(), | 576 } |
575 probe_cluster_id); | |
576 | 577 |
577 if (!SendPacketToNetwork(padding_packet, options)) | 578 if (!SendPacketToNetwork(padding_packet, options)) |
578 break; | 579 break; |
579 | 580 |
580 bytes_sent += padding_bytes_in_packet; | 581 bytes_sent += padding_bytes_in_packet; |
581 UpdateRtpStats(padding_packet, over_rtx, false); | 582 UpdateRtpStats(padding_packet, over_rtx, false); |
582 } | 583 } |
583 | 584 |
584 return bytes_sent; | 585 return bytes_sent; |
585 } | 586 } |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
728 packet_to_send = packet_rtx.get(); | 729 packet_to_send = packet_rtx.get(); |
729 } | 730 } |
730 | 731 |
731 int64_t now_ms = clock_->TimeInMilliseconds(); | 732 int64_t now_ms = clock_->TimeInMilliseconds(); |
732 int64_t diff_ms = now_ms - capture_time_ms; | 733 int64_t diff_ms = now_ms - capture_time_ms; |
733 packet_to_send->SetExtension<TransmissionOffset>(kTimestampTicksPerMs * | 734 packet_to_send->SetExtension<TransmissionOffset>(kTimestampTicksPerMs * |
734 diff_ms); | 735 diff_ms); |
735 packet_to_send->SetExtension<AbsoluteSendTime>(now_ms); | 736 packet_to_send->SetExtension<AbsoluteSendTime>(now_ms); |
736 | 737 |
737 PacketOptions options; | 738 PacketOptions options; |
738 if (UpdateTransportSequenceNumber(packet_to_send, &options.packet_id) && | 739 if (UpdateTransportSequenceNumber(packet_to_send, &options.packet_id)) { |
739 transport_feedback_observer_) { | 740 AddPacketToTransportFeedback(options.packet_id, packet_to_send, |
740 transport_feedback_observer_->AddPacket( | 741 probe_cluster_id); |
741 options.packet_id, | |
742 packet_to_send->payload_size() + packet_to_send->padding_size(), | |
743 probe_cluster_id); | |
744 } | 742 } |
745 | 743 |
746 if (!is_retransmit && !send_over_rtx) { | 744 if (!is_retransmit && !send_over_rtx) { |
747 UpdateDelayStatistics(packet->capture_time_ms(), now_ms); | 745 UpdateDelayStatistics(packet->capture_time_ms(), now_ms); |
748 UpdateOnSendPacket(options.packet_id, packet->capture_time_ms(), | 746 UpdateOnSendPacket(options.packet_id, packet->capture_time_ms(), |
749 packet->Ssrc()); | 747 packet->Ssrc()); |
750 } | 748 } |
751 | 749 |
752 if (!SendPacketToNetwork(*packet_to_send, options)) | 750 if (!SendPacketToNetwork(*packet_to_send, options)) |
753 return false; | 751 return false; |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
851 corrected_time_ms > last_capture_time_ms_sent_) { | 849 corrected_time_ms > last_capture_time_ms_sent_) { |
852 last_capture_time_ms_sent_ = corrected_time_ms; | 850 last_capture_time_ms_sent_ = corrected_time_ms; |
853 TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), | 851 TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), |
854 "PacedSend", corrected_time_ms, | 852 "PacedSend", corrected_time_ms, |
855 "capture_time_ms", corrected_time_ms); | 853 "capture_time_ms", corrected_time_ms); |
856 } | 854 } |
857 return true; | 855 return true; |
858 } | 856 } |
859 | 857 |
860 PacketOptions options; | 858 PacketOptions options; |
861 if (UpdateTransportSequenceNumber(packet.get(), &options.packet_id) && | 859 if (UpdateTransportSequenceNumber(packet.get(), &options.packet_id)) { |
862 transport_feedback_observer_) { | 860 AddPacketToTransportFeedback(options.packet_id, packet.get(), |
863 transport_feedback_observer_->AddPacket( | 861 PacketInfo::kNotAProbe); |
864 options.packet_id, packet->payload_size() + packet->padding_size(), | |
865 PacketInfo::kNotAProbe); | |
866 } | 862 } |
867 | 863 |
868 UpdateDelayStatistics(packet->capture_time_ms(), now_ms); | 864 UpdateDelayStatistics(packet->capture_time_ms(), now_ms); |
869 UpdateOnSendPacket(options.packet_id, packet->capture_time_ms(), | 865 UpdateOnSendPacket(options.packet_id, packet->capture_time_ms(), |
870 packet->Ssrc()); | 866 packet->Ssrc()); |
871 | 867 |
872 bool sent = SendPacketToNetwork(*packet, options); | 868 bool sent = SendPacketToNetwork(*packet, options); |
873 | 869 |
874 if (sent) { | 870 if (sent) { |
875 { | 871 { |
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1237 RtpState RTPSender::GetRtxRtpState() const { | 1233 RtpState RTPSender::GetRtxRtpState() const { |
1238 rtc::CritScope lock(&send_critsect_); | 1234 rtc::CritScope lock(&send_critsect_); |
1239 | 1235 |
1240 RtpState state; | 1236 RtpState state; |
1241 state.sequence_number = sequence_number_rtx_; | 1237 state.sequence_number = sequence_number_rtx_; |
1242 state.start_timestamp = timestamp_offset_; | 1238 state.start_timestamp = timestamp_offset_; |
1243 | 1239 |
1244 return state; | 1240 return state; |
1245 } | 1241 } |
1246 | 1242 |
1243 void RTPSender::SetTransportOverhead(int transport_overhead) { | |
1244 rtc::CritScope lock(&send_critsect_); | |
1245 if (overhead_size_observer_ && | |
1246 transport_overhead_bytes_per_packet_ != | |
1247 static_cast<size_t>(transport_overhead)) { | |
1248 overhead_size_observer_->OnOverheadSizeChanged( | |
1249 rtp_overhead_bytes_per_packet_ + transport_overhead); | |
1250 } | |
1251 transport_overhead_bytes_per_packet_ = transport_overhead; | |
1252 } | |
1253 | |
1254 void RTPSender::AddPacketToTransportFeedback(uint16_t packet_id, | |
1255 RtpPacketToSend* packet, | |
stefan-webrtc
2016/11/15 09:59:47
Should be possible to pass in a const RtpPacketToS
michaelt
2016/11/15 11:25:04
Right.
| |
1256 int probe_cluster_id) { | |
1257 rtc::CritScope lock(&send_critsect_); | |
1258 if (transport_feedback_observer_) { | |
1259 transport_feedback_observer_->AddPacket( | |
1260 packet_id, packet->payload_size() + packet->padding_size(), | |
1261 probe_cluster_id); | |
1262 } | |
1263 if (overhead_size_observer_ && | |
1264 rtp_overhead_bytes_per_packet_ != packet->headers_size()) { | |
stefan-webrtc
2016/11/15 09:59:47
Why do we report this only if we have transport se
michaelt
2016/11/15 11:25:04
I general you are right. Will decouple overhead_si
| |
1265 overhead_size_observer_->OnOverheadSizeChanged( | |
stefan-webrtc
2016/11/15 09:59:47
We shouldn't hold the send_critsect_ when calling
michaelt
2016/11/15 11:25:04
Changed the impl. so that OnOverheadSizeChanged is
| |
1266 packet->headers_size() + transport_overhead_bytes_per_packet_); | |
1267 } | |
1268 rtp_overhead_bytes_per_packet_ = packet->headers_size(); | |
1269 } | |
1270 | |
1247 } // namespace webrtc | 1271 } // namespace webrtc |
OLD | NEW |