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 15 matching lines...) Expand all Loading... | |
26 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_audio.h" | 26 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_audio.h" |
27 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h" | 27 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h" |
28 #include "webrtc/modules/rtp_rtcp/source/time_util.h" | 28 #include "webrtc/modules/rtp_rtcp/source/time_util.h" |
29 | 29 |
30 namespace webrtc { | 30 namespace webrtc { |
31 | 31 |
32 // Max in the RFC 3550 is 255 bytes, we limit it to be modulus 32 for SRTP. | 32 // Max in the RFC 3550 is 255 bytes, we limit it to be modulus 32 for SRTP. |
33 static const size_t kMaxPaddingLength = 224; | 33 static const size_t kMaxPaddingLength = 224; |
34 static const int kSendSideDelayWindowMs = 1000; | 34 static const int kSendSideDelayWindowMs = 1000; |
35 static const uint32_t kAbsSendTimeFraction = 18; | 35 static const uint32_t kAbsSendTimeFraction = 18; |
36 static const int kBitrateStatisticsWindowMs = 1000; | |
36 | 37 |
37 namespace { | 38 namespace { |
38 | 39 |
39 const size_t kRtpHeaderLength = 12; | 40 const size_t kRtpHeaderLength = 12; |
40 const uint16_t kMaxInitRtpSeqNumber = 32767; // 2^15 -1. | 41 const uint16_t kMaxInitRtpSeqNumber = 32767; // 2^15 -1. |
41 | 42 |
42 const char* FrameTypeToString(FrameType frame_type) { | 43 const char* FrameTypeToString(FrameType frame_type) { |
43 switch (frame_type) { | 44 switch (frame_type) { |
44 case kEmptyFrame: | 45 case kEmptyFrame: |
45 return "empty"; | 46 return "empty"; |
(...skipping 10 matching lines...) Expand all Loading... | |
56 uint32_t ConvertMsTo24Bits(int64_t time_ms) { | 57 uint32_t ConvertMsTo24Bits(int64_t time_ms) { |
57 uint32_t time_24_bits = | 58 uint32_t time_24_bits = |
58 static_cast<uint32_t>( | 59 static_cast<uint32_t>( |
59 ((static_cast<uint64_t>(time_ms) << kAbsSendTimeFraction) + 500) / | 60 ((static_cast<uint64_t>(time_ms) << kAbsSendTimeFraction) + 500) / |
60 1000) & | 61 1000) & |
61 0x00FFFFFF; | 62 0x00FFFFFF; |
62 return time_24_bits; | 63 return time_24_bits; |
63 } | 64 } |
64 } // namespace | 65 } // namespace |
65 | 66 |
66 RTPSender::BitrateAggregator::BitrateAggregator( | |
67 BitrateStatisticsObserver* bitrate_callback) | |
68 : callback_(bitrate_callback), | |
69 total_bitrate_observer_(*this), | |
70 retransmit_bitrate_observer_(*this), | |
71 ssrc_(0) {} | |
72 | |
73 void RTPSender::BitrateAggregator::OnStatsUpdated() const { | |
74 if (callback_) { | |
75 callback_->Notify(total_bitrate_observer_.statistics(), | |
76 retransmit_bitrate_observer_.statistics(), ssrc_); | |
77 } | |
78 } | |
79 | |
80 Bitrate::Observer* RTPSender::BitrateAggregator::total_bitrate_observer() { | |
81 return &total_bitrate_observer_; | |
82 } | |
83 Bitrate::Observer* RTPSender::BitrateAggregator::retransmit_bitrate_observer() { | |
84 return &retransmit_bitrate_observer_; | |
85 } | |
86 | |
87 void RTPSender::BitrateAggregator::set_ssrc(uint32_t ssrc) { | |
88 ssrc_ = ssrc; | |
89 } | |
90 | |
91 RTPSender::BitrateAggregator::BitrateObserver::BitrateObserver( | |
92 const BitrateAggregator& aggregator) | |
93 : aggregator_(aggregator) {} | |
94 | |
95 // Implements Bitrate::Observer. | |
96 void RTPSender::BitrateAggregator::BitrateObserver::BitrateUpdated( | |
97 const BitrateStatistics& stats) { | |
98 statistics_ = stats; | |
99 aggregator_.OnStatsUpdated(); | |
100 } | |
101 | |
102 const BitrateStatistics& | |
103 RTPSender::BitrateAggregator::BitrateObserver::statistics() const { | |
104 return statistics_; | |
105 } | |
106 | |
107 RTPSender::RTPSender( | 67 RTPSender::RTPSender( |
108 bool audio, | 68 bool audio, |
109 Clock* clock, | 69 Clock* clock, |
110 Transport* transport, | 70 Transport* transport, |
111 RtpPacketSender* paced_sender, | 71 RtpPacketSender* paced_sender, |
112 TransportSequenceNumberAllocator* sequence_number_allocator, | 72 TransportSequenceNumberAllocator* sequence_number_allocator, |
113 TransportFeedbackObserver* transport_feedback_observer, | 73 TransportFeedbackObserver* transport_feedback_observer, |
114 BitrateStatisticsObserver* bitrate_callback, | 74 BitrateStatisticsObserver* bitrate_callback, |
115 FrameCountObserver* frame_count_observer, | 75 FrameCountObserver* frame_count_observer, |
116 SendSideDelayObserver* send_side_delay_observer, | 76 SendSideDelayObserver* send_side_delay_observer, |
117 RtcEventLog* event_log, | 77 RtcEventLog* event_log, |
118 SendPacketObserver* send_packet_observer) | 78 SendPacketObserver* send_packet_observer) |
119 : clock_(clock), | 79 : clock_(clock), |
120 // TODO(holmer): Remove this conversion? | 80 // TODO(holmer): Remove this conversion? |
121 clock_delta_ms_(clock_->TimeInMilliseconds() - rtc::TimeMillis()), | 81 clock_delta_ms_(clock_->TimeInMilliseconds() - rtc::TimeMillis()), |
122 random_(clock_->TimeInMicroseconds()), | 82 random_(clock_->TimeInMicroseconds()), |
123 bitrates_(bitrate_callback), | 83 bitrate_callback_(bitrate_callback), |
124 total_bitrate_sent_(clock, bitrates_.total_bitrate_observer()), | 84 total_bitrate_sent_(kBitrateStatisticsWindowMs, 8000), // 1S win, bps. |
85 nack_bitrate_sent_(kBitrateStatisticsWindowMs, 8000), | |
125 audio_configured_(audio), | 86 audio_configured_(audio), |
126 audio_(audio ? new RTPSenderAudio(clock, this) : nullptr), | 87 audio_(audio ? new RTPSenderAudio(clock, this) : nullptr), |
127 video_(audio ? nullptr : new RTPSenderVideo(clock, this)), | 88 video_(audio ? nullptr : new RTPSenderVideo(clock, this)), |
128 paced_sender_(paced_sender), | 89 paced_sender_(paced_sender), |
129 transport_sequence_number_allocator_(sequence_number_allocator), | 90 transport_sequence_number_allocator_(sequence_number_allocator), |
130 transport_feedback_observer_(transport_feedback_observer), | 91 transport_feedback_observer_(transport_feedback_observer), |
131 last_capture_time_ms_sent_(0), | 92 last_capture_time_ms_sent_(0), |
132 transport_(transport), | 93 transport_(transport), |
133 sending_media_(true), // Default to sending media. | 94 sending_media_(true), // Default to sending media. |
134 max_payload_length_(IP_PACKET_SIZE - 28), // Default is IP-v4/UDP. | 95 max_payload_length_(IP_PACKET_SIZE - 28), // Default is IP-v4/UDP. |
135 payload_type_(-1), | 96 payload_type_(-1), |
136 payload_type_map_(), | 97 payload_type_map_(), |
137 rtp_header_extension_map_(), | 98 rtp_header_extension_map_(), |
138 transmission_time_offset_(0), | 99 transmission_time_offset_(0), |
139 absolute_send_time_(0), | 100 absolute_send_time_(0), |
140 rotation_(kVideoRotation_0), | 101 rotation_(kVideoRotation_0), |
141 video_rotation_active_(false), | 102 video_rotation_active_(false), |
142 transport_sequence_number_(0), | 103 transport_sequence_number_(0), |
143 // NACK. | |
144 nack_byte_count_times_(), | |
145 nack_byte_count_(), | |
146 nack_bitrate_(clock, bitrates_.retransmit_bitrate_observer()), | |
147 playout_delay_active_(false), | 104 playout_delay_active_(false), |
148 packet_history_(clock), | 105 packet_history_(clock), |
149 // Statistics | 106 // Statistics |
150 rtp_stats_callback_(NULL), | 107 rtp_stats_callback_(NULL), |
151 frame_count_observer_(frame_count_observer), | 108 frame_count_observer_(frame_count_observer), |
152 send_side_delay_observer_(send_side_delay_observer), | 109 send_side_delay_observer_(send_side_delay_observer), |
153 event_log_(event_log), | 110 event_log_(event_log), |
154 send_packet_observer_(send_packet_observer), | 111 send_packet_observer_(send_packet_observer), |
155 // RTP variables | 112 // RTP variables |
156 start_timestamp_forced_(false), | 113 start_timestamp_forced_(false), |
157 start_timestamp_(0), | 114 start_timestamp_(0), |
158 ssrc_db_(SSRCDatabase::GetSSRCDatabase()), | 115 ssrc_db_(SSRCDatabase::GetSSRCDatabase()), |
159 remote_ssrc_(0), | 116 remote_ssrc_(0), |
160 sequence_number_forced_(false), | 117 sequence_number_forced_(false), |
161 ssrc_forced_(false), | 118 ssrc_forced_(false), |
162 timestamp_(0), | 119 timestamp_(0), |
163 capture_time_ms_(0), | 120 capture_time_ms_(0), |
164 last_timestamp_time_ms_(0), | 121 last_timestamp_time_ms_(0), |
165 media_has_been_sent_(false), | 122 media_has_been_sent_(false), |
166 last_packet_marker_bit_(false), | 123 last_packet_marker_bit_(false), |
167 csrcs_(), | 124 csrcs_(), |
168 rtx_(kRtxOff), | 125 rtx_(kRtxOff), |
169 target_bitrate_(0) { | 126 target_bitrate_(0) { |
170 memset(nack_byte_count_times_, 0, sizeof(nack_byte_count_times_)); | |
171 memset(nack_byte_count_, 0, sizeof(nack_byte_count_)); | |
172 // We need to seed the random generator for BuildPaddingPacket() below. | 127 // We need to seed the random generator for BuildPaddingPacket() below. |
173 // TODO(holmer,tommi): Note that TimeInMilliseconds might return 0 on Mac | 128 // TODO(holmer,tommi): Note that TimeInMilliseconds might return 0 on Mac |
174 // early on in the process. | 129 // early on in the process. |
175 srand(static_cast<uint32_t>(clock_->TimeInMilliseconds())); | 130 srand(static_cast<uint32_t>(clock_->TimeInMilliseconds())); |
176 ssrc_ = ssrc_db_->CreateSSRC(); | 131 ssrc_ = ssrc_db_->CreateSSRC(); |
177 RTC_DCHECK(ssrc_ != 0); | 132 RTC_DCHECK(ssrc_ != 0); |
178 ssrc_rtx_ = ssrc_db_->CreateSSRC(); | 133 ssrc_rtx_ = ssrc_db_->CreateSSRC(); |
179 RTC_DCHECK(ssrc_rtx_ != 0); | 134 RTC_DCHECK(ssrc_rtx_ != 0); |
180 | 135 |
181 bitrates_.set_ssrc(ssrc_); | |
182 // Random start, 16 bits. Can't be 0. | 136 // Random start, 16 bits. Can't be 0. |
183 sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber); | 137 sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber); |
184 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); | 138 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); |
185 } | 139 } |
186 | 140 |
187 RTPSender::~RTPSender() { | 141 RTPSender::~RTPSender() { |
188 // TODO(tommi): Use a thread checker to ensure the object is created and | 142 // TODO(tommi): Use a thread checker to ensure the object is created and |
189 // deleted on the same thread. At the moment this isn't possible due to | 143 // deleted on the same thread. At the moment this isn't possible due to |
190 // voe::ChannelOwner in voice engine. To reproduce, run: | 144 // voe::ChannelOwner in voice engine. To reproduce, run: |
191 // voe_auto_test --automated --gtest_filter=*MixManyChannelsForStressOpus | 145 // voe_auto_test --automated --gtest_filter=*MixManyChannelsForStressOpus |
(...skipping 19 matching lines...) Expand all Loading... | |
211 void RTPSender::SetTargetBitrate(uint32_t bitrate) { | 165 void RTPSender::SetTargetBitrate(uint32_t bitrate) { |
212 rtc::CritScope cs(&target_bitrate_critsect_); | 166 rtc::CritScope cs(&target_bitrate_critsect_); |
213 target_bitrate_ = bitrate; | 167 target_bitrate_ = bitrate; |
214 } | 168 } |
215 | 169 |
216 uint32_t RTPSender::GetTargetBitrate() { | 170 uint32_t RTPSender::GetTargetBitrate() { |
217 rtc::CritScope cs(&target_bitrate_critsect_); | 171 rtc::CritScope cs(&target_bitrate_critsect_); |
218 return target_bitrate_; | 172 return target_bitrate_; |
219 } | 173 } |
220 | 174 |
221 uint16_t RTPSender::ActualSendBitrateKbit() const { | 175 uint16_t RTPSender::ActualSendBitrateKbit() { |
222 return (uint16_t)(total_bitrate_sent_.BitrateNow() / 1000); | 176 rtc::CritScope cs(&stats_critsect_); |
177 return static_cast<uint16_t>( | |
178 total_bitrate_sent_.Rate(clock_->TimeInMilliseconds()).value_or(0) / | |
179 1000); | |
223 } | 180 } |
224 | 181 |
225 uint32_t RTPSender::VideoBitrateSent() const { | 182 uint32_t RTPSender::VideoBitrateSent() const { |
226 if (video_) { | 183 if (video_) { |
227 return video_->VideoBitrateSent(); | 184 return video_->VideoBitrateSent(); |
228 } | 185 } |
229 return 0; | 186 return 0; |
230 } | 187 } |
231 | 188 |
232 uint32_t RTPSender::FecOverheadRate() const { | 189 uint32_t RTPSender::FecOverheadRate() const { |
233 if (video_) { | 190 if (video_) { |
234 return video_->FecOverheadRate(); | 191 return video_->FecOverheadRate(); |
235 } | 192 } |
236 return 0; | 193 return 0; |
237 } | 194 } |
238 | 195 |
239 uint32_t RTPSender::NackOverheadRate() const { | 196 uint32_t RTPSender::NackOverheadRate() { |
240 return nack_bitrate_.BitrateLast(); | 197 rtc::CritScope cs(&stats_critsect_); |
198 return nack_bitrate_sent_.Rate(clock_->TimeInMilliseconds()).value_or(0); | |
241 } | 199 } |
242 | 200 |
243 int32_t RTPSender::SetTransmissionTimeOffset(int32_t transmission_time_offset) { | 201 int32_t RTPSender::SetTransmissionTimeOffset(int32_t transmission_time_offset) { |
244 if (transmission_time_offset > (0x800000 - 1) || | 202 if (transmission_time_offset > (0x800000 - 1) || |
245 transmission_time_offset < -(0x800000 - 1)) { // Word24. | 203 transmission_time_offset < -(0x800000 - 1)) { // Word24. |
246 return -1; | 204 return -1; |
247 } | 205 } |
248 rtc::CritScope lock(&send_critsect_); | 206 rtc::CritScope lock(&send_critsect_); |
249 transmission_time_offset_ = transmission_time_offset; | 207 transmission_time_offset_ = transmission_time_offset; |
250 return 0; | 208 return 0; |
(...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
747 int64_t capture_time_ms; | 705 int64_t capture_time_ms; |
748 | 706 |
749 if (!packet_history_.GetPacketAndSetSendTime(packet_id, min_resend_time, true, | 707 if (!packet_history_.GetPacketAndSetSendTime(packet_id, min_resend_time, true, |
750 data_buffer, &length, | 708 data_buffer, &length, |
751 &capture_time_ms)) { | 709 &capture_time_ms)) { |
752 // Packet not found. | 710 // Packet not found. |
753 return 0; | 711 return 0; |
754 } | 712 } |
755 | 713 |
756 if (paced_sender_) { | 714 if (paced_sender_) { |
715 if (!paced_sender_->AllocateRetransmissionBitrate(length)) { | |
716 // Allowed NACK bitrate exhausted. | |
717 return -1; | |
718 } | |
757 RtpUtility::RtpHeaderParser rtp_parser(data_buffer, length); | 719 RtpUtility::RtpHeaderParser rtp_parser(data_buffer, length); |
758 RTPHeader header; | 720 RTPHeader header; |
759 if (!rtp_parser.Parse(&header)) { | 721 if (!rtp_parser.Parse(&header)) { |
760 assert(false); | 722 assert(false); |
761 return -1; | 723 return -1; |
762 } | 724 } |
763 // Convert from TickTime to Clock since capture_time_ms is based on | 725 // Convert from TickTime to Clock since capture_time_ms is based on |
764 // TickTime. | 726 // TickTime. |
765 int64_t corrected_capture_tims_ms = capture_time_ms + clock_delta_ms_; | 727 int64_t corrected_capture_tims_ms = capture_time_ms + clock_delta_ms_; |
766 paced_sender_->InsertPacket( | 728 paced_sender_->InsertPacket( |
767 RtpPacketSender::kNormalPriority, header.ssrc, header.sequenceNumber, | 729 RtpPacketSender::kNormalPriority, header.ssrc, header.sequenceNumber, |
768 corrected_capture_tims_ms, length - header.headerLength, true); | 730 corrected_capture_tims_ms, length - header.headerLength, true); |
769 | 731 |
770 return length; | 732 return length; |
771 } | 733 } |
772 int rtx = kRtxOff; | 734 int rtx = kRtxOff; |
danilchap
2016/06/23 12:46:12
what about the use case where RTPSender is used wi
sprang_webrtc
2016/06/28 09:12:33
You're right, this wouldn't worked. Moved this fun
| |
773 { | 735 { |
774 rtc::CritScope lock(&send_critsect_); | 736 rtc::CritScope lock(&send_critsect_); |
775 rtx = rtx_; | 737 rtx = rtx_; |
776 } | 738 } |
777 if (!PrepareAndSendPacket(data_buffer, length, capture_time_ms, | 739 if (!PrepareAndSendPacket(data_buffer, length, capture_time_ms, |
778 (rtx & kRtxRetransmitted) > 0, true, | 740 (rtx & kRtxRetransmitted) > 0, true, |
779 PacketInfo::kNotAProbe)) { | 741 PacketInfo::kNotAProbe)) { |
780 return -1; | 742 return -1; |
781 } | 743 } |
782 return static_cast<int32_t>(length); | 744 return static_cast<int32_t>(length); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
816 return -1; | 778 return -1; |
817 video_->SetSelectiveRetransmissions(settings); | 779 video_->SetSelectiveRetransmissions(settings); |
818 return 0; | 780 return 0; |
819 } | 781 } |
820 | 782 |
821 void RTPSender::OnReceivedNACK(const std::list<uint16_t>& nack_sequence_numbers, | 783 void RTPSender::OnReceivedNACK(const std::list<uint16_t>& nack_sequence_numbers, |
822 int64_t avg_rtt) { | 784 int64_t avg_rtt) { |
823 TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), | 785 TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), |
824 "RTPSender::OnReceivedNACK", "num_seqnum", | 786 "RTPSender::OnReceivedNACK", "num_seqnum", |
825 nack_sequence_numbers.size(), "avg_rtt", avg_rtt); | 787 nack_sequence_numbers.size(), "avg_rtt", avg_rtt); |
826 const int64_t now = clock_->TimeInMilliseconds(); | 788 for (uint16_t seq_no : nack_sequence_numbers) { |
827 uint32_t bytes_re_sent = 0; | 789 const int32_t bytes_sent = ReSendPacket(seq_no, 5 + avg_rtt); |
828 uint32_t target_bitrate = GetTargetBitrate(); | 790 if (bytes_sent < 0) { |
829 | 791 // Failed to send one Sequence number. Give up the rest in this nack. |
830 // Enough bandwidth to send NACK? | 792 LOG(LS_WARNING) << "Failed resending RTP packet " << seq_no |
831 if (!ProcessNACKBitRate(now)) { | 793 << ", Discard rest of packets"; |
832 LOG(LS_INFO) << "NACK bitrate reached. Skip sending NACK response. Target " | 794 break; |
833 << target_bitrate; | 795 } |
834 return; | 796 if (bytes_sent == 0) { |
835 } | |
836 | |
837 for (std::list<uint16_t>::const_iterator it = nack_sequence_numbers.begin(); | |
838 it != nack_sequence_numbers.end(); ++it) { | |
839 const int32_t bytes_sent = ReSendPacket(*it, 5 + avg_rtt); | |
840 if (bytes_sent > 0) { | |
841 bytes_re_sent += bytes_sent; | |
842 } else if (bytes_sent == 0) { | |
843 // The packet has previously been resent. | 797 // The packet has previously been resent. |
844 // Try resending next packet in the list. | 798 // Try resending next packet in the list. |
845 continue; | 799 continue; |
846 } else { | |
847 // Failed to send one Sequence number. Give up the rest in this nack. | |
848 LOG(LS_WARNING) << "Failed resending RTP packet " << *it | |
849 << ", Discard rest of packets"; | |
850 break; | |
851 } | 800 } |
852 // Delay bandwidth estimate (RTT * BW). | |
853 if (target_bitrate != 0 && avg_rtt) { | |
854 // kbits/s * ms = bits => bits/8 = bytes | |
855 size_t target_bytes = | |
856 (static_cast<size_t>(target_bitrate / 1000) * avg_rtt) >> 3; | |
857 if (bytes_re_sent > target_bytes) { | |
858 break; // Ignore the rest of the packets in the list. | |
859 } | |
860 } | |
861 } | |
862 if (bytes_re_sent > 0) { | |
863 UpdateNACKBitRate(bytes_re_sent, now); | |
864 } | 801 } |
865 } | 802 } |
866 | 803 |
867 void RTPSender::OnReceivedRtcpReportBlocks( | 804 void RTPSender::OnReceivedRtcpReportBlocks( |
868 const ReportBlockList& report_blocks) { | 805 const ReportBlockList& report_blocks) { |
869 playout_delay_oracle_.OnReceivedRtcpReportBlocks(report_blocks); | 806 playout_delay_oracle_.OnReceivedRtcpReportBlocks(report_blocks); |
870 } | 807 } |
871 | 808 |
872 bool RTPSender::ProcessNACKBitRate(uint32_t now) { | |
873 uint32_t num = 0; | |
874 size_t byte_count = 0; | |
875 const uint32_t kAvgIntervalMs = 1000; | |
876 uint32_t target_bitrate = GetTargetBitrate(); | |
877 | |
878 rtc::CritScope lock(&send_critsect_); | |
879 | |
880 if (target_bitrate == 0) { | |
881 return true; | |
882 } | |
883 for (num = 0; num < NACK_BYTECOUNT_SIZE; ++num) { | |
884 if ((now - nack_byte_count_times_[num]) > kAvgIntervalMs) { | |
885 // Don't use data older than 1sec. | |
886 break; | |
887 } else { | |
888 byte_count += nack_byte_count_[num]; | |
889 } | |
890 } | |
891 uint32_t time_interval = kAvgIntervalMs; | |
892 if (num == NACK_BYTECOUNT_SIZE) { | |
893 // More than NACK_BYTECOUNT_SIZE nack messages has been received | |
894 // during the last msg_interval. | |
895 if (nack_byte_count_times_[num - 1] <= now) { | |
896 time_interval = now - nack_byte_count_times_[num - 1]; | |
897 } | |
898 } | |
899 return (byte_count * 8) < (target_bitrate / 1000 * time_interval); | |
900 } | |
901 | |
902 void RTPSender::UpdateNACKBitRate(uint32_t bytes, int64_t now) { | |
903 rtc::CritScope lock(&send_critsect_); | |
904 if (bytes == 0) | |
905 return; | |
906 nack_bitrate_.Update(bytes); | |
907 // Save bitrate statistics. | |
908 // Shift all but first time. | |
909 for (int i = NACK_BYTECOUNT_SIZE - 2; i >= 0; i--) { | |
910 nack_byte_count_[i + 1] = nack_byte_count_[i]; | |
911 nack_byte_count_times_[i + 1] = nack_byte_count_times_[i]; | |
912 } | |
913 nack_byte_count_[0] = bytes; | |
914 nack_byte_count_times_[0] = now; | |
915 } | |
916 | |
917 // Called from pacer when we can send the packet. | 809 // Called from pacer when we can send the packet. |
918 bool RTPSender::TimeToSendPacket(uint16_t sequence_number, | 810 bool RTPSender::TimeToSendPacket(uint16_t sequence_number, |
919 int64_t capture_time_ms, | 811 int64_t capture_time_ms, |
920 bool retransmission, | 812 bool retransmission, |
921 int probe_cluster_id) { | 813 int probe_cluster_id) { |
922 size_t length = IP_PACKET_SIZE; | 814 size_t length = IP_PACKET_SIZE; |
923 uint8_t data_buffer[IP_PACKET_SIZE]; | 815 uint8_t data_buffer[IP_PACKET_SIZE]; |
924 int64_t stored_time_ms; | 816 int64_t stored_time_ms; |
925 | 817 |
926 if (!packet_history_.GetPacketAndSetSendTime(sequence_number, | 818 if (!packet_history_.GetPacketAndSetSendTime(sequence_number, |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1001 } | 893 } |
1002 | 894 |
1003 void RTPSender::UpdateRtpStats(const uint8_t* buffer, | 895 void RTPSender::UpdateRtpStats(const uint8_t* buffer, |
1004 size_t packet_length, | 896 size_t packet_length, |
1005 const RTPHeader& header, | 897 const RTPHeader& header, |
1006 bool is_rtx, | 898 bool is_rtx, |
1007 bool is_retransmit) { | 899 bool is_retransmit) { |
1008 StreamDataCounters* counters; | 900 StreamDataCounters* counters; |
1009 // Get ssrc before taking statistics_crit_ to avoid possible deadlock. | 901 // Get ssrc before taking statistics_crit_ to avoid possible deadlock. |
1010 uint32_t ssrc = is_rtx ? RtxSsrc() : SSRC(); | 902 uint32_t ssrc = is_rtx ? RtxSsrc() : SSRC(); |
903 int64_t now_ms = clock_->TimeInMilliseconds(); | |
1011 | 904 |
1012 rtc::CritScope lock(&statistics_crit_); | 905 rtc::CritScope lock(&statistics_crit_); |
1013 if (is_rtx) { | 906 if (is_rtx) { |
1014 counters = &rtx_rtp_stats_; | 907 counters = &rtx_rtp_stats_; |
1015 } else { | 908 } else { |
1016 counters = &rtp_stats_; | 909 counters = &rtp_stats_; |
1017 } | 910 } |
1018 | 911 |
1019 total_bitrate_sent_.Update(packet_length); | 912 { |
913 rtc::CritScope cs(&stats_critsect_); | |
914 total_bitrate_sent_.Update(packet_length, now_ms); | |
1020 | 915 |
1021 if (counters->first_packet_time_ms == -1) { | 916 if (counters->first_packet_time_ms == -1) { |
1022 counters->first_packet_time_ms = clock_->TimeInMilliseconds(); | 917 counters->first_packet_time_ms = clock_->TimeInMilliseconds(); |
918 } | |
919 if (IsFecPacket(buffer, header)) { | |
920 counters->fec.AddPacket(packet_length, header); | |
921 } | |
922 if (is_retransmit) { | |
923 counters->retransmitted.AddPacket(packet_length, header); | |
924 nack_bitrate_sent_.Update(packet_length, now_ms); | |
925 } | |
926 counters->transmitted.AddPacket(packet_length, header); | |
1023 } | 927 } |
1024 if (IsFecPacket(buffer, header)) { | |
1025 counters->fec.AddPacket(packet_length, header); | |
1026 } | |
1027 if (is_retransmit) { | |
1028 counters->retransmitted.AddPacket(packet_length, header); | |
1029 } | |
1030 counters->transmitted.AddPacket(packet_length, header); | |
1031 | 928 |
1032 if (rtp_stats_callback_) { | 929 if (rtp_stats_callback_) { |
1033 rtp_stats_callback_->DataCountersUpdated(*counters, ssrc); | 930 rtp_stats_callback_->DataCountersUpdated(*counters, ssrc); |
1034 } | 931 } |
1035 } | 932 } |
1036 | 933 |
1037 bool RTPSender::IsFecPacket(const uint8_t* buffer, | 934 bool RTPSender::IsFecPacket(const uint8_t* buffer, |
1038 const RTPHeader& header) const { | 935 const RTPHeader& header) const { |
1039 if (!video_) { | 936 if (!video_) { |
1040 return false; | 937 return false; |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1172 void RTPSender::UpdateOnSendPacket(int packet_id, | 1069 void RTPSender::UpdateOnSendPacket(int packet_id, |
1173 int64_t capture_time_ms, | 1070 int64_t capture_time_ms, |
1174 uint32_t ssrc) { | 1071 uint32_t ssrc) { |
1175 if (!send_packet_observer_ || capture_time_ms <= 0 || packet_id == -1) | 1072 if (!send_packet_observer_ || capture_time_ms <= 0 || packet_id == -1) |
1176 return; | 1073 return; |
1177 | 1074 |
1178 send_packet_observer_->OnSendPacket(packet_id, capture_time_ms, ssrc); | 1075 send_packet_observer_->OnSendPacket(packet_id, capture_time_ms, ssrc); |
1179 } | 1076 } |
1180 | 1077 |
1181 void RTPSender::ProcessBitrate() { | 1078 void RTPSender::ProcessBitrate() { |
1182 rtc::CritScope lock(&send_critsect_); | 1079 if (!bitrate_callback_) |
1183 total_bitrate_sent_.Process(); | |
1184 nack_bitrate_.Process(); | |
1185 if (audio_configured_) { | |
1186 return; | 1080 return; |
1081 int64_t now_ms = clock_->TimeInMilliseconds(); | |
1082 uint32_t ssrc; | |
1083 { | |
1084 rtc::CritScope lock(&send_critsect_); | |
1085 ssrc = ssrc_; | |
1187 } | 1086 } |
1188 video_->ProcessBitrate(); | 1087 |
1088 rtc::CritScope lock(&stats_critsect_); | |
1089 bitrate_callback_->Notify(total_bitrate_sent_.Rate(now_ms).value_or(0), | |
1090 nack_bitrate_sent_.Rate(now_ms).value_or(0), ssrc); | |
1189 } | 1091 } |
1190 | 1092 |
1191 size_t RTPSender::RtpHeaderLength() const { | 1093 size_t RTPSender::RtpHeaderLength() const { |
1192 rtc::CritScope lock(&send_critsect_); | 1094 rtc::CritScope lock(&send_critsect_); |
1193 size_t rtp_header_length = kRtpHeaderLength; | 1095 size_t rtp_header_length = kRtpHeaderLength; |
1194 rtp_header_length += sizeof(uint32_t) * csrcs_.size(); | 1096 rtp_header_length += sizeof(uint32_t) * csrcs_.size(); |
1195 rtp_header_length += RtpHeaderExtensionLength(); | 1097 rtp_header_length += RtpHeaderExtensionLength(); |
1196 return rtp_header_length; | 1098 return rtp_header_length; |
1197 } | 1099 } |
1198 | 1100 |
(...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1738 | 1640 |
1739 // Will be ignored if it's already configured via API. | 1641 // Will be ignored if it's already configured via API. |
1740 SetStartTimestamp(RTPtime, false); | 1642 SetStartTimestamp(RTPtime, false); |
1741 } else { | 1643 } else { |
1742 rtc::CritScope lock(&send_critsect_); | 1644 rtc::CritScope lock(&send_critsect_); |
1743 if (!ssrc_forced_) { | 1645 if (!ssrc_forced_) { |
1744 // Generate a new SSRC. | 1646 // Generate a new SSRC. |
1745 ssrc_db_->ReturnSSRC(ssrc_); | 1647 ssrc_db_->ReturnSSRC(ssrc_); |
1746 ssrc_ = ssrc_db_->CreateSSRC(); | 1648 ssrc_ = ssrc_db_->CreateSSRC(); |
1747 RTC_DCHECK(ssrc_ != 0); | 1649 RTC_DCHECK(ssrc_ != 0); |
1748 bitrates_.set_ssrc(ssrc_); | |
1749 } | 1650 } |
1750 // Don't initialize seq number if SSRC passed externally. | 1651 // Don't initialize seq number if SSRC passed externally. |
1751 if (!sequence_number_forced_ && !ssrc_forced_) { | 1652 if (!sequence_number_forced_ && !ssrc_forced_) { |
1752 // Generate a new sequence number. | 1653 // Generate a new sequence number. |
1753 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); | 1654 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); |
1754 } | 1655 } |
1755 } | 1656 } |
1756 } | 1657 } |
1757 | 1658 |
1758 void RTPSender::SetSendingMediaStatus(bool enabled) { | 1659 void RTPSender::SetSendingMediaStatus(bool enabled) { |
(...skipping 30 matching lines...) Expand all Loading... | |
1789 | 1690 |
1790 uint32_t RTPSender::GenerateNewSSRC() { | 1691 uint32_t RTPSender::GenerateNewSSRC() { |
1791 // If configured via API, return 0. | 1692 // If configured via API, return 0. |
1792 rtc::CritScope lock(&send_critsect_); | 1693 rtc::CritScope lock(&send_critsect_); |
1793 | 1694 |
1794 if (ssrc_forced_) { | 1695 if (ssrc_forced_) { |
1795 return 0; | 1696 return 0; |
1796 } | 1697 } |
1797 ssrc_ = ssrc_db_->CreateSSRC(); | 1698 ssrc_ = ssrc_db_->CreateSSRC(); |
1798 RTC_DCHECK(ssrc_ != 0); | 1699 RTC_DCHECK(ssrc_ != 0); |
1799 bitrates_.set_ssrc(ssrc_); | |
1800 return ssrc_; | 1700 return ssrc_; |
1801 } | 1701 } |
1802 | 1702 |
1803 void RTPSender::SetSSRC(uint32_t ssrc) { | 1703 void RTPSender::SetSSRC(uint32_t ssrc) { |
1804 // This is configured via the API. | 1704 // This is configured via the API. |
1805 rtc::CritScope lock(&send_critsect_); | 1705 rtc::CritScope lock(&send_critsect_); |
1806 | 1706 |
1807 if (ssrc_ == ssrc && ssrc_forced_) { | 1707 if (ssrc_ == ssrc && ssrc_forced_) { |
1808 return; // Since it's same ssrc, don't reset anything. | 1708 return; // Since it's same ssrc, don't reset anything. |
1809 } | 1709 } |
1810 ssrc_forced_ = true; | 1710 ssrc_forced_ = true; |
1811 ssrc_db_->ReturnSSRC(ssrc_); | 1711 ssrc_db_->ReturnSSRC(ssrc_); |
1812 ssrc_db_->RegisterSSRC(ssrc); | 1712 ssrc_db_->RegisterSSRC(ssrc); |
1813 ssrc_ = ssrc; | 1713 ssrc_ = ssrc; |
1814 bitrates_.set_ssrc(ssrc_); | |
1815 if (!sequence_number_forced_) { | 1714 if (!sequence_number_forced_) { |
1816 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); | 1715 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); |
1817 } | 1716 } |
1818 } | 1717 } |
1819 | 1718 |
1820 uint32_t RTPSender::SSRC() const { | 1719 uint32_t RTPSender::SSRC() const { |
1821 rtc::CritScope lock(&send_critsect_); | 1720 rtc::CritScope lock(&send_critsect_); |
1822 return ssrc_; | 1721 return ssrc_; |
1823 } | 1722 } |
1824 | 1723 |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1952 StreamDataCountersCallback* callback) { | 1851 StreamDataCountersCallback* callback) { |
1953 rtc::CritScope cs(&statistics_crit_); | 1852 rtc::CritScope cs(&statistics_crit_); |
1954 rtp_stats_callback_ = callback; | 1853 rtp_stats_callback_ = callback; |
1955 } | 1854 } |
1956 | 1855 |
1957 StreamDataCountersCallback* RTPSender::GetRtpStatisticsCallback() const { | 1856 StreamDataCountersCallback* RTPSender::GetRtpStatisticsCallback() const { |
1958 rtc::CritScope cs(&statistics_crit_); | 1857 rtc::CritScope cs(&statistics_crit_); |
1959 return rtp_stats_callback_; | 1858 return rtp_stats_callback_; |
1960 } | 1859 } |
1961 | 1860 |
1962 uint32_t RTPSender::BitrateSent() const { | 1861 uint32_t RTPSender::BitrateSent() { |
1963 return total_bitrate_sent_.BitrateLast(); | 1862 rtc::CritScope cs(&stats_critsect_); |
1863 return total_bitrate_sent_.Rate(clock_->TimeInMilliseconds()).value_or(0); | |
1964 } | 1864 } |
1965 | 1865 |
1966 void RTPSender::SetRtpState(const RtpState& rtp_state) { | 1866 void RTPSender::SetRtpState(const RtpState& rtp_state) { |
1967 rtc::CritScope lock(&send_critsect_); | 1867 rtc::CritScope lock(&send_critsect_); |
1968 sequence_number_ = rtp_state.sequence_number; | 1868 sequence_number_ = rtp_state.sequence_number; |
1969 sequence_number_forced_ = true; | 1869 sequence_number_forced_ = true; |
1970 timestamp_ = rtp_state.timestamp; | 1870 timestamp_ = rtp_state.timestamp; |
1971 capture_time_ms_ = rtp_state.capture_time_ms; | 1871 capture_time_ms_ = rtp_state.capture_time_ms; |
1972 last_timestamp_time_ms_ = rtp_state.last_timestamp_time_ms; | 1872 last_timestamp_time_ms_ = rtp_state.last_timestamp_time_ms; |
1973 media_has_been_sent_ = rtp_state.media_has_been_sent; | 1873 media_has_been_sent_ = rtp_state.media_has_been_sent; |
(...skipping 22 matching lines...) Expand all Loading... | |
1996 rtc::CritScope lock(&send_critsect_); | 1896 rtc::CritScope lock(&send_critsect_); |
1997 | 1897 |
1998 RtpState state; | 1898 RtpState state; |
1999 state.sequence_number = sequence_number_rtx_; | 1899 state.sequence_number = sequence_number_rtx_; |
2000 state.start_timestamp = start_timestamp_; | 1900 state.start_timestamp = start_timestamp_; |
2001 | 1901 |
2002 return state; | 1902 return state; |
2003 } | 1903 } |
2004 | 1904 |
2005 } // namespace webrtc | 1905 } // namespace webrtc |
OLD | NEW |