| 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 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Transport* outgoing_transport) |
| 140 : audio_(audio), | 140 : audio_(audio), |
| 141 clock_(clock), | 141 clock_(clock), |
| 142 method_(kRtcpOff), | 142 method_(RtcpMode::kOff), |
| 143 transport_(outgoing_transport), | 143 transport_(outgoing_transport), |
| 144 | 144 |
| 145 critical_section_rtcp_sender_( | 145 critical_section_rtcp_sender_( |
| 146 CriticalSectionWrapper::CreateCriticalSection()), | 146 CriticalSectionWrapper::CreateCriticalSection()), |
| 147 using_nack_(false), | 147 using_nack_(false), |
| 148 sending_(false), | 148 sending_(false), |
| 149 remb_enabled_(false), | 149 remb_enabled_(false), |
| 150 next_time_to_send_rtcp_(0), | 150 next_time_to_send_rtcp_(0), |
| 151 start_timestamp_(0), | 151 start_timestamp_(0), |
| 152 last_rtp_timestamp_(0), | 152 last_rtp_timestamp_(0), |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 RTCPMethod RTCPSender::Status() const { | 199 RtcpMode RTCPSender::Status() const { |
| 200 CriticalSectionScoped lock(critical_section_rtcp_sender_.get()); | 200 CriticalSectionScoped lock(critical_section_rtcp_sender_.get()); |
| 201 return method_; | 201 return method_; |
| 202 } | 202 } |
| 203 | 203 |
| 204 void RTCPSender::SetRTCPStatus(RTCPMethod method) { | 204 void RTCPSender::SetRTCPStatus(RtcpMode method) { |
| 205 CriticalSectionScoped lock(critical_section_rtcp_sender_.get()); | 205 CriticalSectionScoped lock(critical_section_rtcp_sender_.get()); |
| 206 method_ = method; | 206 method_ = method; |
| 207 | 207 |
| 208 if (method == kRtcpOff) | 208 if (method == RtcpMode::kOff) |
| 209 return; | 209 return; |
| 210 next_time_to_send_rtcp_ = | 210 next_time_to_send_rtcp_ = |
| 211 clock_->TimeInMilliseconds() + | 211 clock_->TimeInMilliseconds() + |
| 212 (audio_ ? RTCP_INTERVAL_AUDIO_MS / 2 : RTCP_INTERVAL_VIDEO_MS / 2); | 212 (audio_ ? RTCP_INTERVAL_AUDIO_MS / 2 : RTCP_INTERVAL_VIDEO_MS / 2); |
| 213 } | 213 } |
| 214 | 214 |
| 215 bool RTCPSender::Sending() const { | 215 bool RTCPSender::Sending() const { |
| 216 CriticalSectionScoped lock(critical_section_rtcp_sender_.get()); | 216 CriticalSectionScoped lock(critical_section_rtcp_sender_.get()); |
| 217 return sending_; | 217 return sending_; |
| 218 } | 218 } |
| 219 | 219 |
| 220 int32_t RTCPSender::SetSendingStatus(const FeedbackState& feedback_state, | 220 int32_t RTCPSender::SetSendingStatus(const FeedbackState& feedback_state, |
| 221 bool sending) { | 221 bool sending) { |
| 222 bool sendRTCPBye = false; | 222 bool sendRTCPBye = false; |
| 223 { | 223 { |
| 224 CriticalSectionScoped lock(critical_section_rtcp_sender_.get()); | 224 CriticalSectionScoped lock(critical_section_rtcp_sender_.get()); |
| 225 | 225 |
| 226 if (method_ != kRtcpOff) { | 226 if (method_ != RtcpMode::kOff) { |
| 227 if (sending == false && sending_ == true) { | 227 if (sending == false && sending_ == true) { |
| 228 // Trigger RTCP bye | 228 // Trigger RTCP bye |
| 229 sendRTCPBye = true; | 229 sendRTCPBye = true; |
| 230 } | 230 } |
| 231 } | 231 } |
| 232 sending_ = sending; | 232 sending_ = sending; |
| 233 } | 233 } |
| 234 if (sendRTCPBye) | 234 if (sendRTCPBye) |
| 235 return SendRTCP(feedback_state, kRtcpBye); | 235 return SendRTCP(feedback_state, kRtcpBye); |
| 236 return 0; | 236 return 0; |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 395 | 395 |
| 396 5. The resulting value of T is divided by e-3/2=1.21828 to compensate | 396 5. The resulting value of T is divided by e-3/2=1.21828 to compensate |
| 397 for the fact that the timer reconsideration algorithm converges to | 397 for the fact that the timer reconsideration algorithm converges to |
| 398 a value of the RTCP bandwidth below the intended average | 398 a value of the RTCP bandwidth below the intended average |
| 399 */ | 399 */ |
| 400 | 400 |
| 401 int64_t now = clock_->TimeInMilliseconds(); | 401 int64_t now = clock_->TimeInMilliseconds(); |
| 402 | 402 |
| 403 CriticalSectionScoped lock(critical_section_rtcp_sender_.get()); | 403 CriticalSectionScoped lock(critical_section_rtcp_sender_.get()); |
| 404 | 404 |
| 405 if (method_ == kRtcpOff) | 405 if (method_ == RtcpMode::kOff) |
| 406 return false; | 406 return false; |
| 407 | 407 |
| 408 if (!audio_ && sendKeyframeBeforeRTP) { | 408 if (!audio_ && sendKeyframeBeforeRTP) { |
| 409 // for video key-frames we want to send the RTCP before the large key-frame | 409 // for video key-frames we want to send the RTCP before the large key-frame |
| 410 // if we have a 100 ms margin | 410 // if we have a 100 ms margin |
| 411 now += RTCP_SEND_BEFORE_KEY_FRAME_MS; | 411 now += RTCP_SEND_BEFORE_KEY_FRAME_MS; |
| 412 } | 412 } |
| 413 | 413 |
| 414 if (now >= next_time_to_send_rtcp_) { | 414 if (now >= next_time_to_send_rtcp_) { |
| 415 return true; | 415 return true; |
| (...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 926 | 926 |
| 927 int32_t RTCPSender::SendCompoundRTCP( | 927 int32_t RTCPSender::SendCompoundRTCP( |
| 928 const FeedbackState& feedback_state, | 928 const FeedbackState& feedback_state, |
| 929 const std::set<RTCPPacketType>& packetTypes, | 929 const std::set<RTCPPacketType>& packetTypes, |
| 930 int32_t nack_size, | 930 int32_t nack_size, |
| 931 const uint16_t* nack_list, | 931 const uint16_t* nack_list, |
| 932 bool repeat, | 932 bool repeat, |
| 933 uint64_t pictureID) { | 933 uint64_t pictureID) { |
| 934 { | 934 { |
| 935 CriticalSectionScoped lock(critical_section_rtcp_sender_.get()); | 935 CriticalSectionScoped lock(critical_section_rtcp_sender_.get()); |
| 936 if (method_ == kRtcpOff) { | 936 if (method_ == RtcpMode::kOff) { |
| 937 LOG(LS_WARNING) << "Can't send rtcp if it is disabled."; | 937 LOG(LS_WARNING) << "Can't send rtcp if it is disabled."; |
| 938 return -1; | 938 return -1; |
| 939 } | 939 } |
| 940 } | 940 } |
| 941 uint8_t rtcp_buffer[IP_PACKET_SIZE]; | 941 uint8_t rtcp_buffer[IP_PACKET_SIZE]; |
| 942 int rtcp_length = | 942 int rtcp_length = |
| 943 PrepareRTCP(feedback_state, packetTypes, nack_size, nack_list, repeat, | 943 PrepareRTCP(feedback_state, packetTypes, nack_size, nack_list, repeat, |
| 944 pictureID, rtcp_buffer, IP_PACKET_SIZE); | 944 pictureID, rtcp_buffer, IP_PACKET_SIZE); |
| 945 | 945 |
| 946 // Sanity don't send empty packets. | 946 // Sanity don't send empty packets. |
| (...skipping 23 matching lines...) Expand all Loading... |
| 970 if (packet_type_counter_.first_packet_time_ms == -1) | 970 if (packet_type_counter_.first_packet_time_ms == -1) |
| 971 packet_type_counter_.first_packet_time_ms = clock_->TimeInMilliseconds(); | 971 packet_type_counter_.first_packet_time_ms = clock_->TimeInMilliseconds(); |
| 972 | 972 |
| 973 bool generate_report; | 973 bool generate_report; |
| 974 if (IsFlagPresent(kRtcpSr) || IsFlagPresent(kRtcpRr)) { | 974 if (IsFlagPresent(kRtcpSr) || IsFlagPresent(kRtcpRr)) { |
| 975 // Report type already explicitly set, don't automatically populate. | 975 // Report type already explicitly set, don't automatically populate. |
| 976 generate_report = true; | 976 generate_report = true; |
| 977 RTC_DCHECK(ConsumeFlag(kRtcpReport) == false); | 977 RTC_DCHECK(ConsumeFlag(kRtcpReport) == false); |
| 978 } else { | 978 } else { |
| 979 generate_report = | 979 generate_report = |
| 980 (ConsumeFlag(kRtcpReport) && method_ == kRtcpNonCompound) || | 980 (ConsumeFlag(kRtcpReport) && method_ == RtcpMode::kReducedSize) || |
| 981 method_ == kRtcpCompound; | 981 method_ == RtcpMode::kCompound; |
| 982 if (generate_report) | 982 if (generate_report) |
| 983 SetFlag(sending_ ? kRtcpSr : kRtcpRr, true); | 983 SetFlag(sending_ ? kRtcpSr : kRtcpRr, true); |
| 984 } | 984 } |
| 985 | 985 |
| 986 if (IsFlagPresent(kRtcpSr) || (IsFlagPresent(kRtcpRr) && !cname_.empty())) | 986 if (IsFlagPresent(kRtcpSr) || (IsFlagPresent(kRtcpRr) && !cname_.empty())) |
| 987 SetFlag(kRtcpSdes, true); | 987 SetFlag(kRtcpSdes, true); |
| 988 | 988 |
| 989 // We need to send our NTP even if we haven't received any reports. | 989 // We need to send our NTP even if we haven't received any reports. |
| 990 clock_->CurrentNtp(context.ntp_sec, context.ntp_frac); | 990 clock_->CurrentNtp(context.ntp_sec, context.ntp_frac); |
| 991 | 991 |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1214 Transport* const transport_; | 1214 Transport* const transport_; |
| 1215 bool send_failure_; | 1215 bool send_failure_; |
| 1216 } sender(transport_); | 1216 } sender(transport_); |
| 1217 | 1217 |
| 1218 uint8_t buffer[IP_PACKET_SIZE]; | 1218 uint8_t buffer[IP_PACKET_SIZE]; |
| 1219 return packet.BuildExternalBuffer(buffer, IP_PACKET_SIZE, &sender) && | 1219 return packet.BuildExternalBuffer(buffer, IP_PACKET_SIZE, &sender) && |
| 1220 !sender.send_failure_; | 1220 !sender.send_failure_; |
| 1221 } | 1221 } |
| 1222 | 1222 |
| 1223 } // namespace webrtc | 1223 } // namespace webrtc |
| OLD | NEW |