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/rtcp_sender.h" | 11 #include "webrtc/modules/rtp_rtcp/source/rtcp_sender.h" |
12 | 12 |
13 #include <assert.h> // assert | 13 #include <assert.h> // assert |
14 #include <string.h> // memcpy | 14 #include <string.h> // memcpy |
15 | 15 |
16 #include <algorithm> // min | 16 #include <algorithm> // min |
17 #include <limits> // max | 17 #include <limits> // max |
18 #include <utility> | 18 #include <utility> |
19 | 19 |
20 #include "webrtc/base/checks.h" | 20 #include "webrtc/base/checks.h" |
21 #include "webrtc/base/logging.h" | 21 #include "webrtc/base/logging.h" |
22 #include "webrtc/base/trace_event.h" | 22 #include "webrtc/base/trace_event.h" |
| 23 #include "webrtc/call.h" |
| 24 #include "webrtc/call/rtc_event_log.h" |
23 #include "webrtc/common_types.h" | 25 #include "webrtc/common_types.h" |
24 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" | 26 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
25 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/app.h" | 27 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/app.h" |
26 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h" | 28 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h" |
27 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/compound_packet.h" | 29 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/compound_packet.h" |
28 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h" | 30 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h" |
29 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h" | 31 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h" |
30 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/nack.h" | 32 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/nack.h" |
31 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/pli.h" | 33 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/pli.h" |
32 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h" | 34 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h" |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 send_bitrate(0), | 84 send_bitrate(0), |
83 last_rr_ntp_secs(0), | 85 last_rr_ntp_secs(0), |
84 last_rr_ntp_frac(0), | 86 last_rr_ntp_frac(0), |
85 remote_sr(0), | 87 remote_sr(0), |
86 has_last_xr_rr(false), | 88 has_last_xr_rr(false), |
87 module(nullptr) {} | 89 module(nullptr) {} |
88 | 90 |
89 class PacketContainer : public rtcp::CompoundPacket, | 91 class PacketContainer : public rtcp::CompoundPacket, |
90 public rtcp::RtcpPacket::PacketReadyCallback { | 92 public rtcp::RtcpPacket::PacketReadyCallback { |
91 public: | 93 public: |
92 explicit PacketContainer(Transport* transport) | 94 PacketContainer(Transport* transport, RtcEventLog* event_log) |
93 : transport_(transport), bytes_sent_(0) {} | 95 : transport_(transport), event_log_(event_log), bytes_sent_(0) {} |
94 virtual ~PacketContainer() { | 96 virtual ~PacketContainer() { |
95 for (RtcpPacket* packet : appended_packets_) | 97 for (RtcpPacket* packet : appended_packets_) |
96 delete packet; | 98 delete packet; |
97 } | 99 } |
98 | 100 |
99 void OnPacketReady(uint8_t* data, size_t length) override { | 101 void OnPacketReady(uint8_t* data, size_t length) override { |
100 if (transport_->SendRtcp(data, length)) | 102 if (transport_->SendRtcp(data, length)) { |
101 bytes_sent_ += length; | 103 bytes_sent_ += length; |
| 104 if (event_log_) { |
| 105 event_log_->LogRtcpPacket(kOutgoingPacket, MediaType::ANY, data, |
| 106 length); |
| 107 } |
| 108 } |
102 } | 109 } |
103 | 110 |
104 size_t SendPackets() { | 111 size_t SendPackets() { |
105 rtcp::CompoundPacket::Build(this); | 112 rtcp::CompoundPacket::Build(this); |
106 return bytes_sent_; | 113 return bytes_sent_; |
107 } | 114 } |
108 | 115 |
109 private: | 116 private: |
110 Transport* transport_; | 117 Transport* transport_; |
| 118 RtcEventLog* const event_log_; |
111 size_t bytes_sent_; | 119 size_t bytes_sent_; |
| 120 |
| 121 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(PacketContainer); |
112 }; | 122 }; |
113 | 123 |
114 class RTCPSender::RtcpContext { | 124 class RTCPSender::RtcpContext { |
115 public: | 125 public: |
116 RtcpContext(const FeedbackState& feedback_state, | 126 RtcpContext(const FeedbackState& feedback_state, |
117 int32_t nack_size, | 127 int32_t nack_size, |
118 const uint16_t* nack_list, | 128 const uint16_t* nack_list, |
119 bool repeat, | 129 bool repeat, |
120 uint64_t picture_id, | 130 uint64_t picture_id, |
121 uint32_t ntp_sec, | 131 uint32_t ntp_sec, |
(...skipping 19 matching lines...) Expand all Loading... |
141 const uint32_t ntp_frac_; | 151 const uint32_t ntp_frac_; |
142 | 152 |
143 PacketContainer* const container_; | 153 PacketContainer* const container_; |
144 }; | 154 }; |
145 | 155 |
146 RTCPSender::RTCPSender( | 156 RTCPSender::RTCPSender( |
147 bool audio, | 157 bool audio, |
148 Clock* clock, | 158 Clock* clock, |
149 ReceiveStatistics* receive_statistics, | 159 ReceiveStatistics* receive_statistics, |
150 RtcpPacketTypeCounterObserver* packet_type_counter_observer, | 160 RtcpPacketTypeCounterObserver* packet_type_counter_observer, |
| 161 RtcEventLog* event_log, |
151 Transport* outgoing_transport) | 162 Transport* outgoing_transport) |
152 : audio_(audio), | 163 : audio_(audio), |
153 clock_(clock), | 164 clock_(clock), |
154 random_(clock_->TimeInMicroseconds()), | 165 random_(clock_->TimeInMicroseconds()), |
155 method_(RtcpMode::kOff), | 166 method_(RtcpMode::kOff), |
| 167 event_log_(event_log), |
156 transport_(outgoing_transport), | 168 transport_(outgoing_transport), |
157 | 169 |
158 critical_section_rtcp_sender_( | 170 critical_section_rtcp_sender_( |
159 CriticalSectionWrapper::CreateCriticalSection()), | 171 CriticalSectionWrapper::CreateCriticalSection()), |
160 using_nack_(false), | 172 using_nack_(false), |
161 sending_(false), | 173 sending_(false), |
162 remb_enabled_(false), | 174 remb_enabled_(false), |
163 next_time_to_send_rtcp_(0), | 175 next_time_to_send_rtcp_(0), |
164 start_timestamp_(0), | 176 start_timestamp_(0), |
165 last_rtp_timestamp_(0), | 177 last_rtp_timestamp_(0), |
(...skipping 632 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
798 nack_size, nack_list, repeat, pictureID); | 810 nack_size, nack_list, repeat, pictureID); |
799 } | 811 } |
800 | 812 |
801 int32_t RTCPSender::SendCompoundRTCP( | 813 int32_t RTCPSender::SendCompoundRTCP( |
802 const FeedbackState& feedback_state, | 814 const FeedbackState& feedback_state, |
803 const std::set<RTCPPacketType>& packet_types, | 815 const std::set<RTCPPacketType>& packet_types, |
804 int32_t nack_size, | 816 int32_t nack_size, |
805 const uint16_t* nack_list, | 817 const uint16_t* nack_list, |
806 bool repeat, | 818 bool repeat, |
807 uint64_t pictureID) { | 819 uint64_t pictureID) { |
808 PacketContainer container(transport_); | 820 PacketContainer container(transport_, event_log_); |
809 { | 821 { |
810 CriticalSectionScoped lock(critical_section_rtcp_sender_.get()); | 822 CriticalSectionScoped lock(critical_section_rtcp_sender_.get()); |
811 if (method_ == RtcpMode::kOff) { | 823 if (method_ == RtcpMode::kOff) { |
812 LOG(LS_WARNING) << "Can't send rtcp if it is disabled."; | 824 LOG(LS_WARNING) << "Can't send rtcp if it is disabled."; |
813 return -1; | 825 return -1; |
814 } | 826 } |
815 | 827 |
816 // We need to send our NTP even if we haven't received any reports. | 828 // We need to send our NTP even if we haven't received any reports. |
817 uint32_t ntp_sec; | 829 uint32_t ntp_sec; |
818 uint32_t ntp_frac; | 830 uint32_t ntp_frac; |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1040 for (const ReportFlag& flag : report_flags_) { | 1052 for (const ReportFlag& flag : report_flags_) { |
1041 if (flag.is_volatile) | 1053 if (flag.is_volatile) |
1042 return false; | 1054 return false; |
1043 } | 1055 } |
1044 return true; | 1056 return true; |
1045 } | 1057 } |
1046 | 1058 |
1047 bool RTCPSender::SendFeedbackPacket(const rtcp::TransportFeedback& packet) { | 1059 bool RTCPSender::SendFeedbackPacket(const rtcp::TransportFeedback& packet) { |
1048 class Sender : public rtcp::RtcpPacket::PacketReadyCallback { | 1060 class Sender : public rtcp::RtcpPacket::PacketReadyCallback { |
1049 public: | 1061 public: |
1050 explicit Sender(Transport* transport) | 1062 Sender(Transport* transport, RtcEventLog* event_log) |
1051 : transport_(transport), send_failure_(false) {} | 1063 : transport_(transport), event_log_(event_log), send_failure_(false) {} |
1052 | 1064 |
1053 void OnPacketReady(uint8_t* data, size_t length) override { | 1065 void OnPacketReady(uint8_t* data, size_t length) override { |
1054 if (!transport_->SendRtcp(data, length)) | 1066 if (transport_->SendRtcp(data, length)) { |
| 1067 if (event_log_) { |
| 1068 event_log_->LogRtcpPacket(kOutgoingPacket, MediaType::ANY, data, |
| 1069 length); |
| 1070 } |
| 1071 } else { |
1055 send_failure_ = true; | 1072 send_failure_ = true; |
| 1073 } |
1056 } | 1074 } |
1057 | 1075 |
1058 Transport* const transport_; | 1076 Transport* const transport_; |
| 1077 RtcEventLog* const event_log_; |
1059 bool send_failure_; | 1078 bool send_failure_; |
1060 } sender(transport_); | 1079 // TODO(terelius): We would like to |
| 1080 // RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(Sender); |
| 1081 // but we can't because of an incorrect warning (C4822) in MVS 2013. |
| 1082 } sender(transport_, event_log_); |
1061 | 1083 |
1062 uint8_t buffer[IP_PACKET_SIZE]; | 1084 uint8_t buffer[IP_PACKET_SIZE]; |
1063 return packet.BuildExternalBuffer(buffer, IP_PACKET_SIZE, &sender) && | 1085 return packet.BuildExternalBuffer(buffer, IP_PACKET_SIZE, &sender) && |
1064 !sender.send_failure_; | 1086 !sender.send_failure_; |
1065 } | 1087 } |
1066 | 1088 |
1067 } // namespace webrtc | 1089 } // namespace webrtc |
OLD | NEW |