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