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 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 } | 128 } |
129 | 129 |
130 private: | 130 private: |
131 RtcpContext* const context_; | 131 RtcpContext* const context_; |
132 }; | 132 }; |
133 | 133 |
134 RTCPSender::RTCPSender( | 134 RTCPSender::RTCPSender( |
135 bool audio, | 135 bool audio, |
136 Clock* clock, | 136 Clock* clock, |
137 ReceiveStatistics* receive_statistics, | 137 ReceiveStatistics* receive_statistics, |
138 RtcpPacketTypeCounterObserver* packet_type_counter_observer) | 138 RtcpPacketTypeCounterObserver* packet_type_counter_observer, |
| 139 Transport* outgoing_transport) |
139 : audio_(audio), | 140 : audio_(audio), |
140 clock_(clock), | 141 clock_(clock), |
141 method_(kRtcpOff), | 142 method_(kRtcpOff), |
142 critical_section_transport_( | 143 transport_(outgoing_transport), |
143 CriticalSectionWrapper::CreateCriticalSection()), | |
144 cbTransport_(nullptr), | |
145 | 144 |
146 critical_section_rtcp_sender_( | 145 critical_section_rtcp_sender_( |
147 CriticalSectionWrapper::CreateCriticalSection()), | 146 CriticalSectionWrapper::CreateCriticalSection()), |
148 using_nack_(false), | 147 using_nack_(false), |
149 sending_(false), | 148 sending_(false), |
150 remb_enabled_(false), | 149 remb_enabled_(false), |
151 next_time_to_send_rtcp_(0), | 150 next_time_to_send_rtcp_(0), |
152 start_timestamp_(0), | 151 start_timestamp_(0), |
153 last_rtp_timestamp_(0), | 152 last_rtp_timestamp_(0), |
154 last_frame_capture_time_ms_(-1), | 153 last_frame_capture_time_ms_(-1), |
(...skipping 11 matching lines...) Expand all Loading... |
166 | 165 |
167 app_sub_type_(0), | 166 app_sub_type_(0), |
168 app_name_(0), | 167 app_name_(0), |
169 app_data_(nullptr), | 168 app_data_(nullptr), |
170 app_length_(0), | 169 app_length_(0), |
171 | 170 |
172 xr_send_receiver_reference_time_enabled_(false), | 171 xr_send_receiver_reference_time_enabled_(false), |
173 packet_type_counter_observer_(packet_type_counter_observer) { | 172 packet_type_counter_observer_(packet_type_counter_observer) { |
174 memset(last_send_report_, 0, sizeof(last_send_report_)); | 173 memset(last_send_report_, 0, sizeof(last_send_report_)); |
175 memset(last_rtcp_time_, 0, sizeof(last_rtcp_time_)); | 174 memset(last_rtcp_time_, 0, sizeof(last_rtcp_time_)); |
| 175 RTC_DCHECK(transport_ != nullptr); |
176 | 176 |
177 builders_[kRtcpSr] = &RTCPSender::BuildSR; | 177 builders_[kRtcpSr] = &RTCPSender::BuildSR; |
178 builders_[kRtcpRr] = &RTCPSender::BuildRR; | 178 builders_[kRtcpRr] = &RTCPSender::BuildRR; |
179 builders_[kRtcpSdes] = &RTCPSender::BuildSDES; | 179 builders_[kRtcpSdes] = &RTCPSender::BuildSDES; |
180 builders_[kRtcpPli] = &RTCPSender::BuildPLI; | 180 builders_[kRtcpPli] = &RTCPSender::BuildPLI; |
181 builders_[kRtcpFir] = &RTCPSender::BuildFIR; | 181 builders_[kRtcpFir] = &RTCPSender::BuildFIR; |
182 builders_[kRtcpSli] = &RTCPSender::BuildSLI; | 182 builders_[kRtcpSli] = &RTCPSender::BuildSLI; |
183 builders_[kRtcpRpsi] = &RTCPSender::BuildRPSI; | 183 builders_[kRtcpRpsi] = &RTCPSender::BuildRPSI; |
184 builders_[kRtcpRemb] = &RTCPSender::BuildREMB; | 184 builders_[kRtcpRemb] = &RTCPSender::BuildREMB; |
185 builders_[kRtcpBye] = &RTCPSender::BuildBYE; | 185 builders_[kRtcpBye] = &RTCPSender::BuildBYE; |
186 builders_[kRtcpApp] = &RTCPSender::BuildAPP; | 186 builders_[kRtcpApp] = &RTCPSender::BuildAPP; |
187 builders_[kRtcpTmmbr] = &RTCPSender::BuildTMMBR; | 187 builders_[kRtcpTmmbr] = &RTCPSender::BuildTMMBR; |
188 builders_[kRtcpTmmbn] = &RTCPSender::BuildTMMBN; | 188 builders_[kRtcpTmmbn] = &RTCPSender::BuildTMMBN; |
189 builders_[kRtcpNack] = &RTCPSender::BuildNACK; | 189 builders_[kRtcpNack] = &RTCPSender::BuildNACK; |
190 builders_[kRtcpXrVoipMetric] = &RTCPSender::BuildVoIPMetric; | 190 builders_[kRtcpXrVoipMetric] = &RTCPSender::BuildVoIPMetric; |
191 builders_[kRtcpXrReceiverReferenceTime] = | 191 builders_[kRtcpXrReceiverReferenceTime] = |
192 &RTCPSender::BuildReceiverReferenceTime; | 192 &RTCPSender::BuildReceiverReferenceTime; |
193 builders_[kRtcpXrDlrrReportBlock] = &RTCPSender::BuildDlrr; | 193 builders_[kRtcpXrDlrrReportBlock] = &RTCPSender::BuildDlrr; |
194 } | 194 } |
195 | 195 |
196 RTCPSender::~RTCPSender() { | 196 RTCPSender::~RTCPSender() { |
197 } | 197 } |
198 | 198 |
199 int32_t RTCPSender::RegisterSendTransport(Transport* outgoingTransport) { | |
200 CriticalSectionScoped lock(critical_section_transport_.get()); | |
201 cbTransport_ = outgoingTransport; | |
202 return 0; | |
203 } | |
204 | |
205 RTCPMethod RTCPSender::Status() const { | 199 RTCPMethod RTCPSender::Status() const { |
206 CriticalSectionScoped lock(critical_section_rtcp_sender_.get()); | 200 CriticalSectionScoped lock(critical_section_rtcp_sender_.get()); |
207 return method_; | 201 return method_; |
208 } | 202 } |
209 | 203 |
210 void RTCPSender::SetRTCPStatus(RTCPMethod method) { | 204 void RTCPSender::SetRTCPStatus(RTCPMethod method) { |
211 CriticalSectionScoped lock(critical_section_rtcp_sender_.get()); | 205 CriticalSectionScoped lock(critical_section_rtcp_sender_.get()); |
212 method_ = method; | 206 method_ = method; |
213 | 207 |
214 if (method == kRtcpOff) | 208 if (method == kRtcpOff) |
(...skipping 893 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1108 receiveTime += (feedback_state.last_rr_ntp_frac & 0xffff0000) >> 16; | 1102 receiveTime += (feedback_state.last_rr_ntp_frac & 0xffff0000) >> 16; |
1109 | 1103 |
1110 delaySinceLastReceivedSR = now-receiveTime; | 1104 delaySinceLastReceivedSR = now-receiveTime; |
1111 } | 1105 } |
1112 report_block->delaySinceLastSR = delaySinceLastReceivedSR; | 1106 report_block->delaySinceLastSR = delaySinceLastReceivedSR; |
1113 report_block->lastSR = feedback_state.remote_sr; | 1107 report_block->lastSR = feedback_state.remote_sr; |
1114 return true; | 1108 return true; |
1115 } | 1109 } |
1116 | 1110 |
1117 int32_t RTCPSender::SendToNetwork(const uint8_t* dataBuffer, size_t length) { | 1111 int32_t RTCPSender::SendToNetwork(const uint8_t* dataBuffer, size_t length) { |
1118 CriticalSectionScoped lock(critical_section_transport_.get()); | 1112 if (transport_->SendRtcp(dataBuffer, length)) |
1119 if (cbTransport_) { | 1113 return 0; |
1120 if (cbTransport_->SendRtcp(dataBuffer, length)) | |
1121 return 0; | |
1122 } | |
1123 return -1; | 1114 return -1; |
1124 } | 1115 } |
1125 | 1116 |
1126 void RTCPSender::SetCsrcs(const std::vector<uint32_t>& csrcs) { | 1117 void RTCPSender::SetCsrcs(const std::vector<uint32_t>& csrcs) { |
1127 assert(csrcs.size() <= kRtpCsrcSize); | 1118 assert(csrcs.size() <= kRtpCsrcSize); |
1128 CriticalSectionScoped lock(critical_section_rtcp_sender_.get()); | 1119 CriticalSectionScoped lock(critical_section_rtcp_sender_.get()); |
1129 csrcs_ = csrcs; | 1120 csrcs_ = csrcs; |
1130 } | 1121 } |
1131 | 1122 |
1132 int32_t RTCPSender::SetApplicationSpecificData(uint8_t subType, | 1123 int32_t RTCPSender::SetApplicationSpecificData(uint8_t subType, |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1203 | 1194 |
1204 bool RTCPSender::AllVolatileFlagsConsumed() const { | 1195 bool RTCPSender::AllVolatileFlagsConsumed() const { |
1205 for (const ReportFlag& flag : report_flags_) { | 1196 for (const ReportFlag& flag : report_flags_) { |
1206 if (flag.is_volatile) | 1197 if (flag.is_volatile) |
1207 return false; | 1198 return false; |
1208 } | 1199 } |
1209 return true; | 1200 return true; |
1210 } | 1201 } |
1211 | 1202 |
1212 bool RTCPSender::SendFeedbackPacket(const rtcp::TransportFeedback& packet) { | 1203 bool RTCPSender::SendFeedbackPacket(const rtcp::TransportFeedback& packet) { |
1213 CriticalSectionScoped lock(critical_section_transport_.get()); | |
1214 if (!cbTransport_) | |
1215 return false; | |
1216 | |
1217 class Sender : public rtcp::RtcpPacket::PacketReadyCallback { | 1204 class Sender : public rtcp::RtcpPacket::PacketReadyCallback { |
1218 public: | 1205 public: |
1219 Sender(Transport* transport) | 1206 Sender(Transport* transport) |
1220 : transport_(transport), send_failure_(false) {} | 1207 : transport_(transport), send_failure_(false) {} |
1221 | 1208 |
1222 void OnPacketReady(uint8_t* data, size_t length) override { | 1209 void OnPacketReady(uint8_t* data, size_t length) override { |
1223 if (!transport_->SendRtcp(data, length)) | 1210 if (!transport_->SendRtcp(data, length)) |
1224 send_failure_ = true; | 1211 send_failure_ = true; |
1225 } | 1212 } |
1226 | 1213 |
1227 Transport* const transport_; | 1214 Transport* const transport_; |
1228 bool send_failure_; | 1215 bool send_failure_; |
1229 } sender(cbTransport_); | 1216 } sender(transport_); |
1230 | 1217 |
1231 uint8_t buffer[IP_PACKET_SIZE]; | 1218 uint8_t buffer[IP_PACKET_SIZE]; |
1232 return packet.BuildExternalBuffer(buffer, IP_PACKET_SIZE, &sender) && | 1219 return packet.BuildExternalBuffer(buffer, IP_PACKET_SIZE, &sender) && |
1233 !sender.send_failure_; | 1220 !sender.send_failure_; |
1234 } | 1221 } |
1235 | 1222 |
1236 } // namespace webrtc | 1223 } // namespace webrtc |
OLD | NEW |