| 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 |
| 11 #include "webrtc/modules/rtp_rtcp/source/rtp_sender.h" | 11 #include "webrtc/modules/rtp_rtcp/source/rtp_sender.h" |
| 12 | 12 |
| 13 #include <stdlib.h> // srand | 13 #include <stdlib.h> // srand |
| 14 #include <algorithm> | 14 #include <algorithm> |
| 15 #include <utility> | 15 #include <utility> |
| 16 | 16 |
| 17 #include "webrtc/base/checks.h" | 17 #include "webrtc/base/checks.h" |
| 18 #include "webrtc/base/logging.h" | 18 #include "webrtc/base/logging.h" |
| 19 #include "webrtc/base/trace_event.h" | 19 #include "webrtc/base/trace_event.h" |
| 20 #include "webrtc/call.h" |
| 21 #include "webrtc/call/rtc_event_log.h" |
| 20 #include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h" | 22 #include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h" |
| 21 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" | 23 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
| 22 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_audio.h" | 24 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_audio.h" |
| 23 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h" | 25 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h" |
| 24 #include "webrtc/modules/rtp_rtcp/source/time_util.h" | 26 #include "webrtc/modules/rtp_rtcp/source/time_util.h" |
| 25 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" | 27 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" |
| 26 #include "webrtc/system_wrappers/include/tick_util.h" | 28 #include "webrtc/system_wrappers/include/tick_util.h" |
| 27 | 29 |
| 28 namespace webrtc { | 30 namespace webrtc { |
| 29 | 31 |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 115 RTPSender::RTPSender( | 117 RTPSender::RTPSender( |
| 116 bool audio, | 118 bool audio, |
| 117 Clock* clock, | 119 Clock* clock, |
| 118 Transport* transport, | 120 Transport* transport, |
| 119 RtpAudioFeedback* audio_feedback, | 121 RtpAudioFeedback* audio_feedback, |
| 120 RtpPacketSender* paced_sender, | 122 RtpPacketSender* paced_sender, |
| 121 TransportSequenceNumberAllocator* sequence_number_allocator, | 123 TransportSequenceNumberAllocator* sequence_number_allocator, |
| 122 TransportFeedbackObserver* transport_feedback_observer, | 124 TransportFeedbackObserver* transport_feedback_observer, |
| 123 BitrateStatisticsObserver* bitrate_callback, | 125 BitrateStatisticsObserver* bitrate_callback, |
| 124 FrameCountObserver* frame_count_observer, | 126 FrameCountObserver* frame_count_observer, |
| 125 SendSideDelayObserver* send_side_delay_observer) | 127 SendSideDelayObserver* send_side_delay_observer, |
| 128 RtcEventLog* event_log) |
| 126 : clock_(clock), | 129 : clock_(clock), |
| 127 // TODO(holmer): Remove this conversion when we remove the use of | 130 // TODO(holmer): Remove this conversion when we remove the use of |
| 128 // TickTime. | 131 // TickTime. |
| 129 clock_delta_ms_(clock_->TimeInMilliseconds() - | 132 clock_delta_ms_(clock_->TimeInMilliseconds() - |
| 130 TickTime::MillisecondTimestamp()), | 133 TickTime::MillisecondTimestamp()), |
| 131 random_(clock_->TimeInMicroseconds()), | 134 random_(clock_->TimeInMicroseconds()), |
| 132 bitrates_(new BitrateAggregator(bitrate_callback)), | 135 bitrates_(new BitrateAggregator(bitrate_callback)), |
| 133 total_bitrate_sent_(clock, bitrates_->total_bitrate_observer()), | 136 total_bitrate_sent_(clock, bitrates_->total_bitrate_observer()), |
| 134 audio_configured_(audio), | 137 audio_configured_(audio), |
| 135 audio_(audio ? new RTPSenderAudio(clock, this, audio_feedback) : nullptr), | 138 audio_(audio ? new RTPSenderAudio(clock, this, audio_feedback) : nullptr), |
| (...skipping 18 matching lines...) Expand all Loading... |
| 154 // NACK. | 157 // NACK. |
| 155 nack_byte_count_times_(), | 158 nack_byte_count_times_(), |
| 156 nack_byte_count_(), | 159 nack_byte_count_(), |
| 157 nack_bitrate_(clock, bitrates_->retransmit_bitrate_observer()), | 160 nack_bitrate_(clock, bitrates_->retransmit_bitrate_observer()), |
| 158 packet_history_(clock), | 161 packet_history_(clock), |
| 159 // Statistics | 162 // Statistics |
| 160 statistics_crit_(CriticalSectionWrapper::CreateCriticalSection()), | 163 statistics_crit_(CriticalSectionWrapper::CreateCriticalSection()), |
| 161 rtp_stats_callback_(NULL), | 164 rtp_stats_callback_(NULL), |
| 162 frame_count_observer_(frame_count_observer), | 165 frame_count_observer_(frame_count_observer), |
| 163 send_side_delay_observer_(send_side_delay_observer), | 166 send_side_delay_observer_(send_side_delay_observer), |
| 167 event_log_(event_log), |
| 164 // RTP variables | 168 // RTP variables |
| 165 start_timestamp_forced_(false), | 169 start_timestamp_forced_(false), |
| 166 start_timestamp_(0), | 170 start_timestamp_(0), |
| 167 ssrc_db_(*SSRCDatabase::GetSSRCDatabase()), | 171 ssrc_db_(*SSRCDatabase::GetSSRCDatabase()), |
| 168 remote_ssrc_(0), | 172 remote_ssrc_(0), |
| 169 sequence_number_forced_(false), | 173 sequence_number_forced_(false), |
| 170 ssrc_forced_(false), | 174 ssrc_forced_(false), |
| 171 timestamp_(0), | 175 timestamp_(0), |
| 172 capture_time_ms_(0), | 176 capture_time_ms_(0), |
| 173 last_timestamp_time_ms_(0), | 177 last_timestamp_time_ms_(0), |
| (...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 748 } | 752 } |
| 749 | 753 |
| 750 bool RTPSender::SendPacketToNetwork(const uint8_t* packet, | 754 bool RTPSender::SendPacketToNetwork(const uint8_t* packet, |
| 751 size_t size, | 755 size_t size, |
| 752 const PacketOptions& options) { | 756 const PacketOptions& options) { |
| 753 int bytes_sent = -1; | 757 int bytes_sent = -1; |
| 754 if (transport_) { | 758 if (transport_) { |
| 755 bytes_sent = transport_->SendRtp(packet, size, options) | 759 bytes_sent = transport_->SendRtp(packet, size, options) |
| 756 ? static_cast<int>(size) | 760 ? static_cast<int>(size) |
| 757 : -1; | 761 : -1; |
| 762 if (event_log_ && bytes_sent > 0) { |
| 763 event_log_->LogRtpHeader(kOutgoingPacket, MediaType::ANY, packet, size); |
| 764 } |
| 758 } | 765 } |
| 759 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), | 766 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), |
| 760 "RTPSender::SendPacketToNetwork", "size", size, "sent", | 767 "RTPSender::SendPacketToNetwork", "size", size, "sent", |
| 761 bytes_sent); | 768 bytes_sent); |
| 762 // TODO(pwestin): Add a separate bitrate for sent bitrate after pacer. | 769 // TODO(pwestin): Add a separate bitrate for sent bitrate after pacer. |
| 763 if (bytes_sent <= 0) { | 770 if (bytes_sent <= 0) { |
| 764 LOG(LS_WARNING) << "Transport failed to send packet"; | 771 LOG(LS_WARNING) << "Transport failed to send packet"; |
| 765 return false; | 772 return false; |
| 766 } | 773 } |
| 767 return true; | 774 return true; |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1021 return bytes_sent; | 1028 return bytes_sent; |
| 1022 } | 1029 } |
| 1023 | 1030 |
| 1024 // TODO(pwestin): send in the RtpHeaderParser to avoid parsing it again. | 1031 // TODO(pwestin): send in the RtpHeaderParser to avoid parsing it again. |
| 1025 int32_t RTPSender::SendToNetwork(uint8_t* buffer, | 1032 int32_t RTPSender::SendToNetwork(uint8_t* buffer, |
| 1026 size_t payload_length, | 1033 size_t payload_length, |
| 1027 size_t rtp_header_length, | 1034 size_t rtp_header_length, |
| 1028 int64_t capture_time_ms, | 1035 int64_t capture_time_ms, |
| 1029 StorageType storage, | 1036 StorageType storage, |
| 1030 RtpPacketSender::Priority priority) { | 1037 RtpPacketSender::Priority priority) { |
| 1031 RtpUtility::RtpHeaderParser rtp_parser(buffer, | 1038 size_t length = payload_length + rtp_header_length; |
| 1032 payload_length + rtp_header_length); | 1039 RtpUtility::RtpHeaderParser rtp_parser(buffer, length); |
| 1040 |
| 1033 RTPHeader rtp_header; | 1041 RTPHeader rtp_header; |
| 1034 rtp_parser.Parse(&rtp_header); | 1042 rtp_parser.Parse(&rtp_header); |
| 1035 | 1043 |
| 1036 int64_t now_ms = clock_->TimeInMilliseconds(); | 1044 int64_t now_ms = clock_->TimeInMilliseconds(); |
| 1037 | 1045 |
| 1038 // |capture_time_ms| <= 0 is considered invalid. | 1046 // |capture_time_ms| <= 0 is considered invalid. |
| 1039 // TODO(holmer): This should be changed all over Video Engine so that negative | 1047 // TODO(holmer): This should be changed all over Video Engine so that negative |
| 1040 // time is consider invalid, while 0 is considered a valid time. | 1048 // time is consider invalid, while 0 is considered a valid time. |
| 1041 if (capture_time_ms > 0) { | 1049 if (capture_time_ms > 0) { |
| 1042 UpdateTransmissionTimeOffset(buffer, payload_length + rtp_header_length, | 1050 UpdateTransmissionTimeOffset(buffer, length, rtp_header, |
| 1043 rtp_header, now_ms - capture_time_ms); | 1051 now_ms - capture_time_ms); |
| 1044 } | 1052 } |
| 1045 | 1053 |
| 1046 UpdateAbsoluteSendTime(buffer, payload_length + rtp_header_length, | 1054 UpdateAbsoluteSendTime(buffer, length, rtp_header, now_ms); |
| 1047 rtp_header, now_ms); | |
| 1048 | 1055 |
| 1049 // Used for NACK and to spread out the transmission of packets. | 1056 // Used for NACK and to spread out the transmission of packets. |
| 1050 if (packet_history_.PutRTPPacket(buffer, rtp_header_length + payload_length, | 1057 if (packet_history_.PutRTPPacket(buffer, length, capture_time_ms, storage) != |
| 1051 capture_time_ms, storage) != 0) { | 1058 0) { |
| 1052 return -1; | 1059 return -1; |
| 1053 } | 1060 } |
| 1054 | 1061 |
| 1055 if (paced_sender_) { | 1062 if (paced_sender_) { |
| 1056 // Correct offset between implementations of millisecond time stamps in | 1063 // Correct offset between implementations of millisecond time stamps in |
| 1057 // TickTime and Clock. | 1064 // TickTime and Clock. |
| 1058 int64_t corrected_time_ms = capture_time_ms + clock_delta_ms_; | 1065 int64_t corrected_time_ms = capture_time_ms + clock_delta_ms_; |
| 1059 paced_sender_->InsertPacket(priority, rtp_header.ssrc, | 1066 paced_sender_->InsertPacket(priority, rtp_header.ssrc, |
| 1060 rtp_header.sequenceNumber, corrected_time_ms, | 1067 rtp_header.sequenceNumber, corrected_time_ms, |
| 1061 payload_length, false); | 1068 payload_length, false); |
| 1062 if (last_capture_time_ms_sent_ == 0 || | 1069 if (last_capture_time_ms_sent_ == 0 || |
| 1063 corrected_time_ms > last_capture_time_ms_sent_) { | 1070 corrected_time_ms > last_capture_time_ms_sent_) { |
| 1064 last_capture_time_ms_sent_ = corrected_time_ms; | 1071 last_capture_time_ms_sent_ = corrected_time_ms; |
| 1065 TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), | 1072 TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), |
| 1066 "PacedSend", corrected_time_ms, | 1073 "PacedSend", corrected_time_ms, |
| 1067 "capture_time_ms", corrected_time_ms); | 1074 "capture_time_ms", corrected_time_ms); |
| 1068 } | 1075 } |
| 1069 return 0; | 1076 return 0; |
| 1070 } | 1077 } |
| 1071 if (capture_time_ms > 0) { | 1078 if (capture_time_ms > 0) { |
| 1072 UpdateDelayStatistics(capture_time_ms, now_ms); | 1079 UpdateDelayStatistics(capture_time_ms, now_ms); |
| 1073 } | 1080 } |
| 1074 | 1081 |
| 1075 size_t length = payload_length + rtp_header_length; | |
| 1076 bool sent = SendPacketToNetwork(buffer, length, PacketOptions()); | 1082 bool sent = SendPacketToNetwork(buffer, length, PacketOptions()); |
| 1077 | 1083 |
| 1078 // Mark the packet as sent in the history even if send failed. Dropping a | 1084 // Mark the packet as sent in the history even if send failed. Dropping a |
| 1079 // packet here should be treated as any other packet drop so we should be | 1085 // packet here should be treated as any other packet drop so we should be |
| 1080 // ready for a retransmission. | 1086 // ready for a retransmission. |
| 1081 packet_history_.SetSent(rtp_header.sequenceNumber); | 1087 packet_history_.SetSent(rtp_header.sequenceNumber); |
| 1082 | 1088 |
| 1083 if (!sent) | 1089 if (!sent) |
| 1084 return -1; | 1090 return -1; |
| 1085 | 1091 |
| (...skipping 813 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1899 CriticalSectionScoped lock(send_critsect_.get()); | 1905 CriticalSectionScoped lock(send_critsect_.get()); |
| 1900 | 1906 |
| 1901 RtpState state; | 1907 RtpState state; |
| 1902 state.sequence_number = sequence_number_rtx_; | 1908 state.sequence_number = sequence_number_rtx_; |
| 1903 state.start_timestamp = start_timestamp_; | 1909 state.start_timestamp = start_timestamp_; |
| 1904 | 1910 |
| 1905 return state; | 1911 return state; |
| 1906 } | 1912 } |
| 1907 | 1913 |
| 1908 } // namespace webrtc | 1914 } // namespace webrtc |
| OLD | NEW |