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

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 4 years, 8 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 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 RTPSender::RTPSender( 107 RTPSender::RTPSender(
108 bool audio, 108 bool audio,
109 Clock* clock, 109 Clock* clock,
110 Transport* transport, 110 Transport* transport,
111 RtpPacketSender* paced_sender, 111 RtpPacketSender* paced_sender,
112 TransportSequenceNumberAllocator* sequence_number_allocator, 112 TransportSequenceNumberAllocator* sequence_number_allocator,
113 TransportFeedbackObserver* transport_feedback_observer, 113 TransportFeedbackObserver* transport_feedback_observer,
114 BitrateStatisticsObserver* bitrate_callback, 114 BitrateStatisticsObserver* bitrate_callback,
115 FrameCountObserver* frame_count_observer, 115 FrameCountObserver* frame_count_observer,
116 SendSideDelayObserver* send_side_delay_observer, 116 SendSideDelayObserver* send_side_delay_observer,
117 RtcEventLog* event_log) 117 RtcEventLog* event_log,
118 SendPacketObserver* send_packet_observer)
118 : clock_(clock), 119 : clock_(clock),
119 // TODO(holmer): Remove this conversion when we remove the use of 120 // TODO(holmer): Remove this conversion when we remove the use of
120 // TickTime. 121 // TickTime.
121 clock_delta_ms_(clock_->TimeInMilliseconds() - 122 clock_delta_ms_(clock_->TimeInMilliseconds() -
122 TickTime::MillisecondTimestamp()), 123 TickTime::MillisecondTimestamp()),
123 random_(clock_->TimeInMicroseconds()), 124 random_(clock_->TimeInMicroseconds()),
124 bitrates_(bitrate_callback), 125 bitrates_(bitrate_callback),
125 total_bitrate_sent_(clock, bitrates_.total_bitrate_observer()), 126 total_bitrate_sent_(clock, bitrates_.total_bitrate_observer()),
126 audio_configured_(audio), 127 audio_configured_(audio),
127 audio_(audio ? new RTPSenderAudio(clock, this) : nullptr), 128 audio_(audio ? new RTPSenderAudio(clock, this) : nullptr),
(...skipping 17 matching lines...) Expand all
145 nack_byte_count_times_(), 146 nack_byte_count_times_(),
146 nack_byte_count_(), 147 nack_byte_count_(),
147 nack_bitrate_(clock, bitrates_.retransmit_bitrate_observer()), 148 nack_bitrate_(clock, bitrates_.retransmit_bitrate_observer()),
148 packet_history_(clock), 149 packet_history_(clock),
149 // Statistics 150 // Statistics
150 statistics_crit_(CriticalSectionWrapper::CreateCriticalSection()), 151 statistics_crit_(CriticalSectionWrapper::CreateCriticalSection()),
151 rtp_stats_callback_(NULL), 152 rtp_stats_callback_(NULL),
152 frame_count_observer_(frame_count_observer), 153 frame_count_observer_(frame_count_observer),
153 send_side_delay_observer_(send_side_delay_observer), 154 send_side_delay_observer_(send_side_delay_observer),
154 event_log_(event_log), 155 event_log_(event_log),
156 send_packet_observer_(send_packet_observer),
155 // RTP variables 157 // RTP variables
156 start_timestamp_forced_(false), 158 start_timestamp_forced_(false),
157 start_timestamp_(0), 159 start_timestamp_(0),
158 ssrc_db_(SSRCDatabase::GetSSRCDatabase()), 160 ssrc_db_(SSRCDatabase::GetSSRCDatabase()),
159 remote_ssrc_(0), 161 remote_ssrc_(0),
160 sequence_number_forced_(false), 162 sequence_number_forced_(false),
161 ssrc_forced_(false), 163 ssrc_forced_(false),
162 timestamp_(0), 164 timestamp_(0),
163 capture_time_ms_(0), 165 capture_time_ms_(0),
164 last_timestamp_time_ms_(0), 166 last_timestamp_time_ms_(0),
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after
668 rtp_parser.Parse(&rtp_header); 670 rtp_parser.Parse(&rtp_header);
669 671
670 if (capture_time_ms > 0) { 672 if (capture_time_ms > 0) {
671 UpdateTransmissionTimeOffset( 673 UpdateTransmissionTimeOffset(
672 padding_packet, length, rtp_header, now_ms - capture_time_ms); 674 padding_packet, length, rtp_header, now_ms - capture_time_ms);
673 } 675 }
674 676
675 UpdateAbsoluteSendTime(padding_packet, length, rtp_header, now_ms); 677 UpdateAbsoluteSendTime(padding_packet, length, rtp_header, now_ms);
676 678
677 PacketOptions options; 679 PacketOptions options;
678 if (using_transport_seq) { 680 if (using_transport_seq &&
679 options.packet_id = 681 AllocateTransportSequenceNumber(&options.packet_id)) {
stefan-webrtc 2016/04/19 11:06:15 Don't we want to set options.packet_id even if we'
åsapersson 2016/04/19 14:55:32 Thought it was not necessary to allocate and set o
stefan-webrtc 2016/04/20 10:59:54 It's not, but I can't see that you checked if the
åsapersson 2016/04/20 11:16:56 Stats not updated, UpdateOnSendPacket not called.
680 UpdateTransportSequenceNumber(padding_packet, length, rtp_header); 682 UpdateTransportSequenceNumber(options.packet_id, padding_packet, length,
681 } 683 rtp_header);
682 684 if (transport_feedback_observer_)
683 if (using_transport_seq && transport_feedback_observer_) { 685 transport_feedback_observer_->AddPacket(options.packet_id, length,
684 transport_feedback_observer_->AddPacket(options.packet_id, length, true); 686 true);
685 } 687 }
686 688
687 if (!SendPacketToNetwork(padding_packet, length, options)) 689 if (!SendPacketToNetwork(padding_packet, length, options))
688 break; 690 break;
689 691
690 bytes_sent += padding_bytes_in_packet; 692 bytes_sent += padding_bytes_in_packet;
691 UpdateRtpStats(padding_packet, length, rtp_header, over_rtx, false); 693 UpdateRtpStats(padding_packet, length, rtp_header, over_rtx, false);
692 } 694 }
693 695
694 return bytes_sent; 696 return bytes_sent;
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
879 881
880 if (!packet_history_.GetPacketAndSetSendTime(sequence_number, 882 if (!packet_history_.GetPacketAndSetSendTime(sequence_number,
881 0, 883 0,
882 retransmission, 884 retransmission,
883 data_buffer, 885 data_buffer,
884 &length, 886 &length,
885 &stored_time_ms)) { 887 &stored_time_ms)) {
886 // Packet cannot be found. Allow sending to continue. 888 // Packet cannot be found. Allow sending to continue.
887 return true; 889 return true;
888 } 890 }
889 if (!retransmission && capture_time_ms > 0) { 891
890 UpdateDelayStatistics(capture_time_ms, clock_->TimeInMilliseconds());
891 }
892 int rtx; 892 int rtx;
893 { 893 {
894 rtc::CritScope lock(&send_critsect_); 894 rtc::CritScope lock(&send_critsect_);
895 rtx = rtx_; 895 rtx = rtx_;
896 } 896 }
897 return PrepareAndSendPacket(data_buffer, 897 return PrepareAndSendPacket(data_buffer,
898 length, 898 length,
899 capture_time_ms, 899 capture_time_ms,
900 retransmission && (rtx & kRtxRetransmitted) > 0, 900 retransmission && (rtx & kRtxRetransmitted) > 0,
901 retransmission); 901 retransmission);
(...skipping 23 matching lines...) Expand all
925 BuildRtxPacket(buffer, &length, data_buffer_rtx); 925 BuildRtxPacket(buffer, &length, data_buffer_rtx);
926 buffer_to_send_ptr = data_buffer_rtx; 926 buffer_to_send_ptr = data_buffer_rtx;
927 } 927 }
928 928
929 int64_t now_ms = clock_->TimeInMilliseconds(); 929 int64_t now_ms = clock_->TimeInMilliseconds();
930 int64_t diff_ms = now_ms - capture_time_ms; 930 int64_t diff_ms = now_ms - capture_time_ms;
931 UpdateTransmissionTimeOffset(buffer_to_send_ptr, length, rtp_header, 931 UpdateTransmissionTimeOffset(buffer_to_send_ptr, length, rtp_header,
932 diff_ms); 932 diff_ms);
933 UpdateAbsoluteSendTime(buffer_to_send_ptr, length, rtp_header, now_ms); 933 UpdateAbsoluteSendTime(buffer_to_send_ptr, length, rtp_header, now_ms);
934 934
935 // TODO(sprang): Potentially too much overhead in IsRegistered()?
936 bool using_transport_seq = rtp_header_extension_map_.IsRegistered(
937 kRtpExtensionTransportSequenceNumber) &&
938 transport_sequence_number_allocator_;
939
940 PacketOptions options; 935 PacketOptions options;
941 if (using_transport_seq) { 936 if (AllocateTransportSequenceNumber(&options.packet_id)) {
942 options.packet_id = 937 if (UpdateTransportSequenceNumber(options.packet_id, buffer_to_send_ptr,
943 UpdateTransportSequenceNumber(buffer_to_send_ptr, length, rtp_header); 938 length, rtp_header)) {
939 if (transport_feedback_observer_)
940 transport_feedback_observer_->AddPacket(options.packet_id, length,
941 true);
942 }
944 } 943 }
945 944
946 if (using_transport_seq && transport_feedback_observer_) { 945 if (!is_retransmit && !send_over_rtx) {
947 transport_feedback_observer_->AddPacket(options.packet_id, length, true); 946 UpdateDelayStatistics(capture_time_ms, now_ms);
947 UpdateOnSendPacket(options.packet_id, capture_time_ms, rtp_header.ssrc);
948 } 948 }
949 949
950 bool ret = SendPacketToNetwork(buffer_to_send_ptr, length, options); 950 bool ret = SendPacketToNetwork(buffer_to_send_ptr, length, options);
951 if (ret) { 951 if (ret) {
952 rtc::CritScope lock(&send_critsect_); 952 rtc::CritScope lock(&send_critsect_);
953 media_has_been_sent_ = true; 953 media_has_been_sent_ = true;
954 } 954 }
955 UpdateRtpStats(buffer_to_send_ptr, length, rtp_header, send_over_rtx, 955 UpdateRtpStats(buffer_to_send_ptr, length, rtp_header, send_over_rtx,
956 is_retransmit); 956 is_retransmit);
957 return ret; 957 return ret;
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
1054 payload_length, false); 1054 payload_length, false);
1055 if (last_capture_time_ms_sent_ == 0 || 1055 if (last_capture_time_ms_sent_ == 0 ||
1056 corrected_time_ms > last_capture_time_ms_sent_) { 1056 corrected_time_ms > last_capture_time_ms_sent_) {
1057 last_capture_time_ms_sent_ = corrected_time_ms; 1057 last_capture_time_ms_sent_ = corrected_time_ms;
1058 TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), 1058 TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
1059 "PacedSend", corrected_time_ms, 1059 "PacedSend", corrected_time_ms,
1060 "capture_time_ms", corrected_time_ms); 1060 "capture_time_ms", corrected_time_ms);
1061 } 1061 }
1062 return 0; 1062 return 0;
1063 } 1063 }
1064 if (capture_time_ms > 0) {
1065 UpdateDelayStatistics(capture_time_ms, now_ms);
1066 }
1067
1068 // TODO(sprang): Potentially too much overhead in IsRegistered()?
1069 bool using_transport_seq = rtp_header_extension_map_.IsRegistered(
1070 kRtpExtensionTransportSequenceNumber) &&
1071 transport_sequence_number_allocator_;
1072 1064
1073 PacketOptions options; 1065 PacketOptions options;
1074 if (using_transport_seq) { 1066 if (AllocateTransportSequenceNumber(&options.packet_id)) {
1075 options.packet_id = 1067 if (UpdateTransportSequenceNumber(options.packet_id, buffer, length,
1076 UpdateTransportSequenceNumber(buffer, length, rtp_header); 1068 rtp_header)) {
1077 if (transport_feedback_observer_) { 1069 if (transport_feedback_observer_)
1078 transport_feedback_observer_->AddPacket(options.packet_id, length, true); 1070 transport_feedback_observer_->AddPacket(options.packet_id, length,
1071 true);
1079 } 1072 }
1080 } 1073 }
1074 UpdateDelayStatistics(capture_time_ms, now_ms);
1075 UpdateOnSendPacket(options.packet_id, capture_time_ms, rtp_header.ssrc);
1081 1076
1082 bool sent = SendPacketToNetwork(buffer, length, options); 1077 bool sent = SendPacketToNetwork(buffer, length, options);
1083 1078
1084 // Mark the packet as sent in the history even if send failed. Dropping a 1079 // Mark the packet as sent in the history even if send failed. Dropping a
1085 // packet here should be treated as any other packet drop so we should be 1080 // packet here should be treated as any other packet drop so we should be
1086 // ready for a retransmission. 1081 // ready for a retransmission.
1087 packet_history_.SetSent(rtp_header.sequenceNumber); 1082 packet_history_.SetSent(rtp_header.sequenceNumber);
1088 1083
1089 if (!sent) 1084 if (!sent)
1090 return -1; 1085 return -1;
1091 1086
1092 { 1087 {
1093 rtc::CritScope lock(&send_critsect_); 1088 rtc::CritScope lock(&send_critsect_);
1094 media_has_been_sent_ = true; 1089 media_has_been_sent_ = true;
1095 } 1090 }
1096 UpdateRtpStats(buffer, length, rtp_header, false, false); 1091 UpdateRtpStats(buffer, length, rtp_header, false, false);
1097 return 0; 1092 return 0;
1098 } 1093 }
1099 1094
1100 void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) { 1095 void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) {
1101 if (!send_side_delay_observer_) 1096 if (!send_side_delay_observer_ || capture_time_ms <= 0)
1102 return; 1097 return;
1103 1098
1104 uint32_t ssrc; 1099 uint32_t ssrc;
1105 int avg_delay_ms = 0; 1100 int avg_delay_ms = 0;
1106 int max_delay_ms = 0; 1101 int max_delay_ms = 0;
1107 { 1102 {
1108 rtc::CritScope lock(&send_critsect_); 1103 rtc::CritScope lock(&send_critsect_);
1109 ssrc = ssrc_; 1104 ssrc = ssrc_;
1110 } 1105 }
1111 { 1106 {
(...skipping 11 matching lines...) Expand all
1123 ++num_delays; 1118 ++num_delays;
1124 } 1119 }
1125 if (num_delays == 0) 1120 if (num_delays == 0)
1126 return; 1121 return;
1127 avg_delay_ms = (avg_delay_ms + num_delays / 2) / num_delays; 1122 avg_delay_ms = (avg_delay_ms + num_delays / 2) / num_delays;
1128 } 1123 }
1129 send_side_delay_observer_->SendSideDelayUpdated(avg_delay_ms, max_delay_ms, 1124 send_side_delay_observer_->SendSideDelayUpdated(avg_delay_ms, max_delay_ms,
1130 ssrc); 1125 ssrc);
1131 } 1126 }
1132 1127
1128 void RTPSender::UpdateOnSendPacket(int packet_id,
1129 int64_t capture_time_ms,
1130 uint32_t ssrc) {
1131 if (!send_packet_observer_ || capture_time_ms <= 0 || packet_id == -1)
1132 return;
1133
1134 send_packet_observer_->OnSendPacket(packet_id, capture_time_ms, ssrc);
1135 }
1136
1133 void RTPSender::ProcessBitrate() { 1137 void RTPSender::ProcessBitrate() {
1134 rtc::CritScope lock(&send_critsect_); 1138 rtc::CritScope lock(&send_critsect_);
1135 total_bitrate_sent_.Process(); 1139 total_bitrate_sent_.Process();
1136 nack_bitrate_.Process(); 1140 nack_bitrate_.Process();
1137 if (audio_configured_) { 1141 if (audio_configured_) {
1138 return; 1142 return;
1139 } 1143 }
1140 video_->ProcessBitrate(); 1144 video_->ProcessBitrate();
1141 } 1145 }
1142 1146
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after
1606 default: 1610 default:
1607 RTC_NOTREACHED(); 1611 RTC_NOTREACHED();
1608 } 1612 }
1609 1613
1610 // Update absolute send time field (convert ms to 24-bit unsigned with 18 bit 1614 // Update absolute send time field (convert ms to 24-bit unsigned with 18 bit
1611 // fractional part). 1615 // fractional part).
1612 ByteWriter<uint32_t, 3>::WriteBigEndian(rtp_packet + offset + 1, 1616 ByteWriter<uint32_t, 3>::WriteBigEndian(rtp_packet + offset + 1,
1613 ConvertMsTo24Bits(now_ms)); 1617 ConvertMsTo24Bits(now_ms));
1614 } 1618 }
1615 1619
1616 uint16_t RTPSender::UpdateTransportSequenceNumber( 1620 bool RTPSender::UpdateTransportSequenceNumber(
1621 uint16_t sequence_number,
1617 uint8_t* rtp_packet, 1622 uint8_t* rtp_packet,
1618 size_t rtp_packet_length, 1623 size_t rtp_packet_length,
1619 const RTPHeader& rtp_header) const { 1624 const RTPHeader& rtp_header) const {
1620 size_t offset; 1625 size_t offset;
1621 rtc::CritScope lock(&send_critsect_); 1626 rtc::CritScope lock(&send_critsect_);
1622 1627
1623 switch (VerifyExtension(kRtpExtensionTransportSequenceNumber, rtp_packet, 1628 switch (VerifyExtension(kRtpExtensionTransportSequenceNumber, rtp_packet,
1624 rtp_packet_length, rtp_header, 1629 rtp_packet_length, rtp_header,
1625 kTransportSequenceNumberLength, &offset)) { 1630 kTransportSequenceNumberLength, &offset)) {
1626 case ExtensionStatus::kNotRegistered: 1631 case ExtensionStatus::kNotRegistered:
1627 return 0; 1632 return false;
1628 case ExtensionStatus::kError: 1633 case ExtensionStatus::kError:
1629 LOG(LS_WARNING) << "Failed to update transport sequence number"; 1634 LOG(LS_WARNING) << "Failed to update transport sequence number";
1630 return 0; 1635 return false;
1631 case ExtensionStatus::kOk: 1636 case ExtensionStatus::kOk:
1632 break; 1637 break;
1633 default: 1638 default:
1634 RTC_NOTREACHED(); 1639 RTC_NOTREACHED();
1635 } 1640 }
1636 1641
1637 uint16_t seq = transport_sequence_number_allocator_->AllocateSequenceNumber(); 1642 BuildTransportSequenceNumberExtension(rtp_packet + offset, sequence_number);
1638 BuildTransportSequenceNumberExtension(rtp_packet + offset, seq); 1643 return true;
1639 return seq; 1644 }
1645
1646 bool RTPSender::AllocateTransportSequenceNumber(int* packet_id) const {
1647 if (!transport_sequence_number_allocator_)
1648 return false;
1649
1650 *packet_id = transport_sequence_number_allocator_->AllocateSequenceNumber();
1651 return true;
1640 } 1652 }
1641 1653
1642 void RTPSender::SetSendingStatus(bool enabled) { 1654 void RTPSender::SetSendingStatus(bool enabled) {
1643 if (enabled) { 1655 if (enabled) {
1644 uint32_t frequency_hz = SendPayloadFrequency(); 1656 uint32_t frequency_hz = SendPayloadFrequency();
1645 uint32_t RTPtime = CurrentRtp(*clock_, frequency_hz); 1657 uint32_t RTPtime = CurrentRtp(*clock_, frequency_hz);
1646 1658
1647 // Will be ignored if it's already configured via API. 1659 // Will be ignored if it's already configured via API.
1648 SetStartTimestamp(RTPtime, false); 1660 SetStartTimestamp(RTPtime, false);
1649 } else { 1661 } else {
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
1904 rtc::CritScope lock(&send_critsect_); 1916 rtc::CritScope lock(&send_critsect_);
1905 1917
1906 RtpState state; 1918 RtpState state;
1907 state.sequence_number = sequence_number_rtx_; 1919 state.sequence_number = sequence_number_rtx_;
1908 state.start_timestamp = start_timestamp_; 1920 state.start_timestamp = start_timestamp_;
1909 1921
1910 return state; 1922 return state;
1911 } 1923 }
1912 1924
1913 } // namespace webrtc 1925 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698