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 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |