Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1118)

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtp_sender.cc

Issue 2061423003: Refactor NACK bitrate allocation (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Fixed data race Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698