| 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 |