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

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

Issue 1478253002: Add histogram stats for send delay for a sent video stream. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 5 years 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 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 RTPSender::RTPSender( 112 RTPSender::RTPSender(
113 bool audio, 113 bool audio,
114 Clock* clock, 114 Clock* clock,
115 Transport* transport, 115 Transport* transport,
116 RtpAudioFeedback* audio_feedback, 116 RtpAudioFeedback* audio_feedback,
117 RtpPacketSender* paced_sender, 117 RtpPacketSender* paced_sender,
118 TransportSequenceNumberAllocator* sequence_number_allocator, 118 TransportSequenceNumberAllocator* sequence_number_allocator,
119 TransportFeedbackObserver* transport_feedback_observer, 119 TransportFeedbackObserver* transport_feedback_observer,
120 BitrateStatisticsObserver* bitrate_callback, 120 BitrateStatisticsObserver* bitrate_callback,
121 FrameCountObserver* frame_count_observer, 121 FrameCountObserver* frame_count_observer,
122 SendSideDelayObserver* send_side_delay_observer) 122 SendSideDelayObserver* send_side_delay_observer,
123 SendPacketObserver* send_packet_observer)
123 : clock_(clock), 124 : clock_(clock),
124 // TODO(holmer): Remove this conversion when we remove the use of 125 // TODO(holmer): Remove this conversion when we remove the use of
125 // TickTime. 126 // TickTime.
126 clock_delta_ms_(clock_->TimeInMilliseconds() - 127 clock_delta_ms_(clock_->TimeInMilliseconds() -
127 TickTime::MillisecondTimestamp()), 128 TickTime::MillisecondTimestamp()),
128 bitrates_(new BitrateAggregator(bitrate_callback)), 129 bitrates_(new BitrateAggregator(bitrate_callback)),
129 total_bitrate_sent_(clock, bitrates_->total_bitrate_observer()), 130 total_bitrate_sent_(clock, bitrates_->total_bitrate_observer()),
130 audio_configured_(audio), 131 audio_configured_(audio),
131 audio_(audio ? new RTPSenderAudio(clock, this, audio_feedback) : nullptr), 132 audio_(audio ? new RTPSenderAudio(clock, this, audio_feedback) : nullptr),
132 video_(audio ? nullptr : new RTPSenderVideo(clock, this)), 133 video_(audio ? nullptr : new RTPSenderVideo(clock, this)),
(...skipping 17 matching lines...) Expand all
150 // NACK. 151 // NACK.
151 nack_byte_count_times_(), 152 nack_byte_count_times_(),
152 nack_byte_count_(), 153 nack_byte_count_(),
153 nack_bitrate_(clock, bitrates_->retransmit_bitrate_observer()), 154 nack_bitrate_(clock, bitrates_->retransmit_bitrate_observer()),
154 packet_history_(clock), 155 packet_history_(clock),
155 // Statistics 156 // Statistics
156 statistics_crit_(CriticalSectionWrapper::CreateCriticalSection()), 157 statistics_crit_(CriticalSectionWrapper::CreateCriticalSection()),
157 rtp_stats_callback_(NULL), 158 rtp_stats_callback_(NULL),
158 frame_count_observer_(frame_count_observer), 159 frame_count_observer_(frame_count_observer),
159 send_side_delay_observer_(send_side_delay_observer), 160 send_side_delay_observer_(send_side_delay_observer),
161 send_packet_observer_(send_packet_observer),
160 // RTP variables 162 // RTP variables
161 start_timestamp_forced_(false), 163 start_timestamp_forced_(false),
162 start_timestamp_(0), 164 start_timestamp_(0),
163 ssrc_db_(*SSRCDatabase::GetSSRCDatabase()), 165 ssrc_db_(*SSRCDatabase::GetSSRCDatabase()),
164 remote_ssrc_(0), 166 remote_ssrc_(0),
165 sequence_number_forced_(false), 167 sequence_number_forced_(false),
166 ssrc_forced_(false), 168 ssrc_forced_(false),
167 timestamp_(0), 169 timestamp_(0),
168 capture_time_ms_(0), 170 capture_time_ms_(0),
169 last_timestamp_time_ms_(0), 171 last_timestamp_time_ms_(0),
(...skipping 706 matching lines...) Expand 10 before | Expand all | Expand 10 after
876 878
877 if (!packet_history_.GetPacketAndSetSendTime(sequence_number, 879 if (!packet_history_.GetPacketAndSetSendTime(sequence_number,
878 0, 880 0,
879 retransmission, 881 retransmission,
880 data_buffer, 882 data_buffer,
881 &length, 883 &length,
882 &stored_time_ms)) { 884 &stored_time_ms)) {
883 // Packet cannot be found. Allow sending to continue. 885 // Packet cannot be found. Allow sending to continue.
884 return true; 886 return true;
885 } 887 }
886 if (!retransmission && capture_time_ms > 0) { 888
887 UpdateDelayStatistics(capture_time_ms, clock_->TimeInMilliseconds());
888 }
889 int rtx; 889 int rtx;
890 { 890 {
891 CriticalSectionScoped lock(send_critsect_.get()); 891 CriticalSectionScoped lock(send_critsect_.get());
892 rtx = rtx_; 892 rtx = rtx_;
893 } 893 }
894 return PrepareAndSendPacket(data_buffer, 894 return PrepareAndSendPacket(data_buffer,
895 length, 895 length,
896 capture_time_ms, 896 capture_time_ms,
897 retransmission && (rtx & kRtxRetransmitted) > 0, 897 retransmission && (rtx & kRtxRetransmitted) > 0,
898 retransmission); 898 retransmission);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
937 PacketOptions options; 937 PacketOptions options;
938 if (using_transport_seq) { 938 if (using_transport_seq) {
939 options.packet_id = 939 options.packet_id =
940 UpdateTransportSequenceNumber(buffer_to_send_ptr, length, rtp_header); 940 UpdateTransportSequenceNumber(buffer_to_send_ptr, length, rtp_header);
941 } 941 }
942 942
943 if (using_transport_seq && transport_feedback_observer_) { 943 if (using_transport_seq && transport_feedback_observer_) {
944 transport_feedback_observer_->AddPacket(options.packet_id, length, true); 944 transport_feedback_observer_->AddPacket(options.packet_id, length, true);
945 } 945 }
946 946
947 if (!is_retransmit && !send_over_rtx) {
948 UpdateDelayStatistics(capture_time_ms, now_ms);
949 UpdateOnSendPacket(capture_time_ms, &options.packet_id);
950 }
951
947 bool ret = SendPacketToNetwork(buffer_to_send_ptr, length, options); 952 bool ret = SendPacketToNetwork(buffer_to_send_ptr, length, options);
948 if (ret) { 953 if (ret) {
949 CriticalSectionScoped lock(send_critsect_.get()); 954 CriticalSectionScoped lock(send_critsect_.get());
950 media_has_been_sent_ = true; 955 media_has_been_sent_ = true;
951 } 956 }
952 UpdateRtpStats(buffer_to_send_ptr, length, rtp_header, send_over_rtx, 957 UpdateRtpStats(buffer_to_send_ptr, length, rtp_header, send_over_rtx,
953 is_retransmit); 958 is_retransmit);
954 return ret; 959 return ret;
955 } 960 }
956 961
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
1056 payload_length, false); 1061 payload_length, false);
1057 if (last_capture_time_ms_sent_ == 0 || 1062 if (last_capture_time_ms_sent_ == 0 ||
1058 corrected_time_ms > last_capture_time_ms_sent_) { 1063 corrected_time_ms > last_capture_time_ms_sent_) {
1059 last_capture_time_ms_sent_ = corrected_time_ms; 1064 last_capture_time_ms_sent_ = corrected_time_ms;
1060 TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), 1065 TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
1061 "PacedSend", corrected_time_ms, 1066 "PacedSend", corrected_time_ms,
1062 "capture_time_ms", corrected_time_ms); 1067 "capture_time_ms", corrected_time_ms);
1063 } 1068 }
1064 return 0; 1069 return 0;
1065 } 1070 }
1066 if (capture_time_ms > 0) { 1071 PacketOptions options;
1067 UpdateDelayStatistics(capture_time_ms, now_ms); 1072 UpdateDelayStatistics(capture_time_ms, now_ms);
1068 } 1073 UpdateOnSendPacket(capture_time_ms, &options.packet_id);
1069 1074
1070 size_t length = payload_length + rtp_header_length; 1075 size_t length = payload_length + rtp_header_length;
1071 bool sent = SendPacketToNetwork(buffer, length, PacketOptions()); 1076 bool sent = SendPacketToNetwork(buffer, length, options);
1072 1077
1073 // Mark the packet as sent in the history even if send failed. Dropping a 1078 // Mark the packet as sent in the history even if send failed. Dropping a
1074 // packet here should be treated as any other packet drop so we should be 1079 // packet here should be treated as any other packet drop so we should be
1075 // ready for a retransmission. 1080 // ready for a retransmission.
1076 packet_history_.SetSent(rtp_header.sequenceNumber); 1081 packet_history_.SetSent(rtp_header.sequenceNumber);
1077 1082
1078 if (!sent) 1083 if (!sent)
1079 return -1; 1084 return -1;
1080 1085
1081 { 1086 {
1082 CriticalSectionScoped lock(send_critsect_.get()); 1087 CriticalSectionScoped lock(send_critsect_.get());
1083 media_has_been_sent_ = true; 1088 media_has_been_sent_ = true;
1084 } 1089 }
1085 UpdateRtpStats(buffer, length, rtp_header, false, false); 1090 UpdateRtpStats(buffer, length, rtp_header, false, false);
1086 return 0; 1091 return 0;
1087 } 1092 }
1088 1093
1089 void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) { 1094 void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) {
1090 if (!send_side_delay_observer_) 1095 if (!send_side_delay_observer_ || capture_time_ms <= 0)
1091 return; 1096 return;
1092 1097
1093 uint32_t ssrc; 1098 uint32_t ssrc;
1094 int avg_delay_ms = 0; 1099 int avg_delay_ms = 0;
1095 int max_delay_ms = 0; 1100 int max_delay_ms = 0;
1096 { 1101 {
1097 CriticalSectionScoped lock(send_critsect_.get()); 1102 CriticalSectionScoped lock(send_critsect_.get());
1098 ssrc = ssrc_; 1103 ssrc = ssrc_;
1099 } 1104 }
1100 { 1105 {
(...skipping 11 matching lines...) Expand all
1112 ++num_delays; 1117 ++num_delays;
1113 } 1118 }
1114 if (num_delays == 0) 1119 if (num_delays == 0)
1115 return; 1120 return;
1116 avg_delay_ms = (avg_delay_ms + num_delays / 2) / num_delays; 1121 avg_delay_ms = (avg_delay_ms + num_delays / 2) / num_delays;
1117 } 1122 }
1118 send_side_delay_observer_->SendSideDelayUpdated(avg_delay_ms, max_delay_ms, 1123 send_side_delay_observer_->SendSideDelayUpdated(avg_delay_ms, max_delay_ms,
1119 ssrc); 1124 ssrc);
1120 } 1125 }
1121 1126
1127 void RTPSender::UpdateOnSendPacket(int64_t capture_time_ms, int* packet_id) {
1128 if (!send_packet_observer_ || !transport_sequence_number_allocator_ ||
1129 capture_time_ms <= 0)
1130 return;
1131
1132 uint32_t ssrc;
1133 {
1134 CriticalSectionScoped lock(send_critsect_.get());
1135 ssrc = ssrc_;
1136 }
1137 if (*packet_id == -1)
1138 *packet_id = transport_sequence_number_allocator_->AllocateSequenceNumber();
1139
1140 send_packet_observer_->OnSendPacket(*packet_id, capture_time_ms, ssrc);
1141 }
1142
1122 void RTPSender::ProcessBitrate() { 1143 void RTPSender::ProcessBitrate() {
1123 CriticalSectionScoped cs(send_critsect_.get()); 1144 CriticalSectionScoped cs(send_critsect_.get());
1124 total_bitrate_sent_.Process(); 1145 total_bitrate_sent_.Process();
1125 nack_bitrate_.Process(); 1146 nack_bitrate_.Process();
1126 if (audio_configured_) { 1147 if (audio_configured_) {
1127 return; 1148 return;
1128 } 1149 }
1129 video_->ProcessBitrate(); 1150 video_->ProcessBitrate();
1130 } 1151 }
1131 1152
(...skipping 771 matching lines...) Expand 10 before | Expand all | Expand 10 after
1903 CriticalSectionScoped lock(send_critsect_.get()); 1924 CriticalSectionScoped lock(send_critsect_.get());
1904 1925
1905 RtpState state; 1926 RtpState state;
1906 state.sequence_number = sequence_number_rtx_; 1927 state.sequence_number = sequence_number_rtx_;
1907 state.start_timestamp = start_timestamp_; 1928 state.start_timestamp = start_timestamp_;
1908 1929
1909 return state; 1930 return state;
1910 } 1931 }
1911 1932
1912 } // namespace webrtc 1933 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698