OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 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 25 matching lines...) Expand all Loading... |
36 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" | 36 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
37 #include "webrtc/modules/utility/include/process_thread.h" | 37 #include "webrtc/modules/utility/include/process_thread.h" |
38 #include "webrtc/system_wrappers/include/clock.h" | 38 #include "webrtc/system_wrappers/include/clock.h" |
39 #include "webrtc/system_wrappers/include/cpu_info.h" | 39 #include "webrtc/system_wrappers/include/cpu_info.h" |
40 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" | 40 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" |
41 #include "webrtc/system_wrappers/include/metrics.h" | 41 #include "webrtc/system_wrappers/include/metrics.h" |
42 #include "webrtc/system_wrappers/include/rw_lock_wrapper.h" | 42 #include "webrtc/system_wrappers/include/rw_lock_wrapper.h" |
43 #include "webrtc/system_wrappers/include/trace.h" | 43 #include "webrtc/system_wrappers/include/trace.h" |
44 #include "webrtc/video/call_stats.h" | 44 #include "webrtc/video/call_stats.h" |
45 #include "webrtc/video/send_delay_stats.h" | 45 #include "webrtc/video/send_delay_stats.h" |
| 46 #include "webrtc/video/stats_counter.h" |
46 #include "webrtc/video/video_receive_stream.h" | 47 #include "webrtc/video/video_receive_stream.h" |
47 #include "webrtc/video/video_send_stream.h" | 48 #include "webrtc/video/video_send_stream.h" |
48 #include "webrtc/video/vie_remb.h" | 49 #include "webrtc/video/vie_remb.h" |
49 #include "webrtc/voice_engine/include/voe_codec.h" | 50 #include "webrtc/voice_engine/include/voe_codec.h" |
50 | 51 |
51 namespace webrtc { | 52 namespace webrtc { |
52 | 53 |
53 const int Call::Config::kDefaultStartBitrateBps = 300000; | 54 const int Call::Config::kDefaultStartBitrateBps = 300000; |
54 | 55 |
55 namespace internal { | 56 namespace internal { |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 int64_t received_video_bytes_; | 180 int64_t received_video_bytes_; |
180 int64_t received_audio_bytes_; | 181 int64_t received_audio_bytes_; |
181 int64_t received_rtcp_bytes_; | 182 int64_t received_rtcp_bytes_; |
182 int64_t first_rtp_packet_received_ms_; | 183 int64_t first_rtp_packet_received_ms_; |
183 int64_t last_rtp_packet_received_ms_; | 184 int64_t last_rtp_packet_received_ms_; |
184 int64_t first_packet_sent_ms_; | 185 int64_t first_packet_sent_ms_; |
185 | 186 |
186 // TODO(holmer): Remove this lock once BitrateController no longer calls | 187 // TODO(holmer): Remove this lock once BitrateController no longer calls |
187 // OnNetworkChanged from multiple threads. | 188 // OnNetworkChanged from multiple threads. |
188 rtc::CriticalSection bitrate_crit_; | 189 rtc::CriticalSection bitrate_crit_; |
189 int64_t estimated_send_bitrate_sum_kbits_ GUARDED_BY(&bitrate_crit_); | |
190 int64_t pacer_bitrate_sum_kbits_ GUARDED_BY(&bitrate_crit_); | |
191 uint32_t min_allocated_send_bitrate_bps_ GUARDED_BY(&bitrate_crit_); | 190 uint32_t min_allocated_send_bitrate_bps_ GUARDED_BY(&bitrate_crit_); |
192 int64_t num_bitrate_updates_ GUARDED_BY(&bitrate_crit_); | |
193 uint32_t configured_max_padding_bitrate_bps_ GUARDED_BY(&bitrate_crit_); | 191 uint32_t configured_max_padding_bitrate_bps_ GUARDED_BY(&bitrate_crit_); |
| 192 AvgCounter estimated_send_bitrate_kbps_counter_ GUARDED_BY(&bitrate_crit_); |
| 193 AvgCounter pacer_bitrate_kbps_counter_ GUARDED_BY(&bitrate_crit_); |
194 | 194 |
195 std::map<std::string, rtc::NetworkRoute> network_routes_; | 195 std::map<std::string, rtc::NetworkRoute> network_routes_; |
196 | 196 |
197 VieRemb remb_; | 197 VieRemb remb_; |
198 const std::unique_ptr<CongestionController> congestion_controller_; | 198 const std::unique_ptr<CongestionController> congestion_controller_; |
199 const std::unique_ptr<SendDelayStats> video_send_delay_stats_; | 199 const std::unique_ptr<SendDelayStats> video_send_delay_stats_; |
200 const int64_t start_ms_; | 200 const int64_t start_ms_; |
201 | 201 |
202 RTC_DISALLOW_COPY_AND_ASSIGN(Call); | 202 RTC_DISALLOW_COPY_AND_ASSIGN(Call); |
203 }; | 203 }; |
(...skipping 29 matching lines...) Expand all Loading... |
233 video_network_state_(kNetworkUp), | 233 video_network_state_(kNetworkUp), |
234 receive_crit_(RWLockWrapper::CreateRWLock()), | 234 receive_crit_(RWLockWrapper::CreateRWLock()), |
235 send_crit_(RWLockWrapper::CreateRWLock()), | 235 send_crit_(RWLockWrapper::CreateRWLock()), |
236 event_log_(RtcEventLog::Create(webrtc::Clock::GetRealTimeClock())), | 236 event_log_(RtcEventLog::Create(webrtc::Clock::GetRealTimeClock())), |
237 received_video_bytes_(0), | 237 received_video_bytes_(0), |
238 received_audio_bytes_(0), | 238 received_audio_bytes_(0), |
239 received_rtcp_bytes_(0), | 239 received_rtcp_bytes_(0), |
240 first_rtp_packet_received_ms_(-1), | 240 first_rtp_packet_received_ms_(-1), |
241 last_rtp_packet_received_ms_(-1), | 241 last_rtp_packet_received_ms_(-1), |
242 first_packet_sent_ms_(-1), | 242 first_packet_sent_ms_(-1), |
243 estimated_send_bitrate_sum_kbits_(0), | |
244 pacer_bitrate_sum_kbits_(0), | |
245 min_allocated_send_bitrate_bps_(0), | 243 min_allocated_send_bitrate_bps_(0), |
246 num_bitrate_updates_(0), | |
247 configured_max_padding_bitrate_bps_(0), | 244 configured_max_padding_bitrate_bps_(0), |
| 245 estimated_send_bitrate_kbps_counter_(clock_, nullptr, true), |
| 246 pacer_bitrate_kbps_counter_(clock_, nullptr, true), |
248 remb_(clock_), | 247 remb_(clock_), |
249 congestion_controller_( | 248 congestion_controller_( |
250 new CongestionController(clock_, this, &remb_, event_log_.get())), | 249 new CongestionController(clock_, this, &remb_, event_log_.get())), |
251 video_send_delay_stats_(new SendDelayStats(clock_)), | 250 video_send_delay_stats_(new SendDelayStats(clock_)), |
252 start_ms_(clock_->TimeInMilliseconds()) { | 251 start_ms_(clock_->TimeInMilliseconds()) { |
253 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 252 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
254 RTC_DCHECK_GE(config.bitrate_config.min_bitrate_bps, 0); | 253 RTC_DCHECK_GE(config.bitrate_config.min_bitrate_bps, 0); |
255 RTC_DCHECK_GE(config.bitrate_config.start_bitrate_bps, | 254 RTC_DCHECK_GE(config.bitrate_config.start_bitrate_bps, |
256 config.bitrate_config.min_bitrate_bps); | 255 config.bitrate_config.min_bitrate_bps); |
257 if (config.bitrate_config.max_bitrate_bps != -1) { | 256 if (config.bitrate_config.max_bitrate_bps != -1) { |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
304 Trace::ReturnTrace(); | 303 Trace::ReturnTrace(); |
305 } | 304 } |
306 | 305 |
307 void Call::UpdateHistograms() { | 306 void Call::UpdateHistograms() { |
308 RTC_LOGGED_HISTOGRAM_COUNTS_100000( | 307 RTC_LOGGED_HISTOGRAM_COUNTS_100000( |
309 "WebRTC.Call.LifetimeInSeconds", | 308 "WebRTC.Call.LifetimeInSeconds", |
310 (clock_->TimeInMilliseconds() - start_ms_) / 1000); | 309 (clock_->TimeInMilliseconds() - start_ms_) / 1000); |
311 } | 310 } |
312 | 311 |
313 void Call::UpdateSendHistograms() { | 312 void Call::UpdateSendHistograms() { |
314 if (num_bitrate_updates_ == 0 || first_packet_sent_ms_ == -1) | 313 if (first_packet_sent_ms_ == -1) |
315 return; | 314 return; |
316 int64_t elapsed_sec = | 315 int64_t elapsed_sec = |
317 (clock_->TimeInMilliseconds() - first_packet_sent_ms_) / 1000; | 316 (clock_->TimeInMilliseconds() - first_packet_sent_ms_) / 1000; |
318 if (elapsed_sec < metrics::kMinRunTimeInSeconds) | 317 if (elapsed_sec < metrics::kMinRunTimeInSeconds) |
319 return; | 318 return; |
320 int send_bitrate_kbps = | 319 const int kMinRequiredPeriodicSamples = 5; |
321 estimated_send_bitrate_sum_kbits_ / num_bitrate_updates_; | 320 AggregatedStats send_bitrate_stats = |
322 int pacer_bitrate_kbps = pacer_bitrate_sum_kbits_ / num_bitrate_updates_; | 321 estimated_send_bitrate_kbps_counter_.ProcessAndGetStats(); |
323 if (send_bitrate_kbps > 0) { | 322 if (send_bitrate_stats.num_samples >= kMinRequiredPeriodicSamples) { |
324 RTC_LOGGED_HISTOGRAM_COUNTS_100000("WebRTC.Call.EstimatedSendBitrateInKbps", | 323 RTC_LOGGED_HISTOGRAM_COUNTS_100000("WebRTC.Call.EstimatedSendBitrateInKbps", |
325 send_bitrate_kbps); | 324 send_bitrate_stats.average); |
326 } | 325 } |
327 if (pacer_bitrate_kbps > 0) { | 326 AggregatedStats pacer_bitrate_stats = |
| 327 pacer_bitrate_kbps_counter_.ProcessAndGetStats(); |
| 328 if (pacer_bitrate_stats.num_samples >= kMinRequiredPeriodicSamples) { |
328 RTC_LOGGED_HISTOGRAM_COUNTS_100000("WebRTC.Call.PacerBitrateInKbps", | 329 RTC_LOGGED_HISTOGRAM_COUNTS_100000("WebRTC.Call.PacerBitrateInKbps", |
329 pacer_bitrate_kbps); | 330 pacer_bitrate_stats.average); |
330 } | 331 } |
331 } | 332 } |
332 | 333 |
333 void Call::UpdateReceiveHistograms() { | 334 void Call::UpdateReceiveHistograms() { |
334 if (first_rtp_packet_received_ms_ == -1) | 335 if (first_rtp_packet_received_ms_ == -1) |
335 return; | 336 return; |
336 int64_t elapsed_sec = | 337 int64_t elapsed_sec = |
337 (last_rtp_packet_received_ms_ - first_rtp_packet_received_ms_) / 1000; | 338 (last_rtp_packet_received_ms_ - first_rtp_packet_received_ms_) / 1000; |
338 if (elapsed_sec < metrics::kMinRunTimeInSeconds) | 339 if (elapsed_sec < metrics::kMinRunTimeInSeconds) |
339 return; | 340 return; |
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
725 video_send_delay_stats_->OnSentPacket(sent_packet.packet_id, | 726 video_send_delay_stats_->OnSentPacket(sent_packet.packet_id, |
726 clock_->TimeInMilliseconds()); | 727 clock_->TimeInMilliseconds()); |
727 congestion_controller_->OnSentPacket(sent_packet); | 728 congestion_controller_->OnSentPacket(sent_packet); |
728 } | 729 } |
729 | 730 |
730 void Call::OnNetworkChanged(uint32_t target_bitrate_bps, uint8_t fraction_loss, | 731 void Call::OnNetworkChanged(uint32_t target_bitrate_bps, uint8_t fraction_loss, |
731 int64_t rtt_ms) { | 732 int64_t rtt_ms) { |
732 bitrate_allocator_->OnNetworkChanged(target_bitrate_bps, fraction_loss, | 733 bitrate_allocator_->OnNetworkChanged(target_bitrate_bps, fraction_loss, |
733 rtt_ms); | 734 rtt_ms); |
734 | 735 |
735 // Ignore updates where the bitrate is zero because the aggregate network | 736 // Ignore updates if bitrate is zero (the aggregate network state is down). |
736 // state is down. | 737 if (target_bitrate_bps == 0) { |
737 if (target_bitrate_bps > 0) { | |
738 { | |
739 ReadLockScoped read_lock(*send_crit_); | |
740 // Do not update the stats if we are not sending video. | |
741 if (video_send_streams_.empty()) | |
742 return; | |
743 } | |
744 rtc::CritScope lock(&bitrate_crit_); | 738 rtc::CritScope lock(&bitrate_crit_); |
745 // We only update these stats if we have send streams, and assume that | 739 estimated_send_bitrate_kbps_counter_.ProcessAndPause(); |
746 // OnNetworkChanged is called roughly with a fixed frequency. | 740 pacer_bitrate_kbps_counter_.ProcessAndPause(); |
747 estimated_send_bitrate_sum_kbits_ += target_bitrate_bps / 1000; | 741 return; |
748 // Pacer bitrate might be higher than bitrate estimate if enforcing min | |
749 // bitrate. | |
750 uint32_t pacer_bitrate_bps = | |
751 std::max(target_bitrate_bps, min_allocated_send_bitrate_bps_); | |
752 pacer_bitrate_sum_kbits_ += pacer_bitrate_bps / 1000; | |
753 ++num_bitrate_updates_; | |
754 } | 742 } |
| 743 |
| 744 bool sending_video; |
| 745 { |
| 746 ReadLockScoped read_lock(*send_crit_); |
| 747 sending_video = !video_send_streams_.empty(); |
| 748 } |
| 749 |
| 750 rtc::CritScope lock(&bitrate_crit_); |
| 751 if (!sending_video) { |
| 752 // Do not update the stats if we are not sending video. |
| 753 estimated_send_bitrate_kbps_counter_.ProcessAndPause(); |
| 754 pacer_bitrate_kbps_counter_.ProcessAndPause(); |
| 755 return; |
| 756 } |
| 757 estimated_send_bitrate_kbps_counter_.Add(target_bitrate_bps / 1000); |
| 758 // Pacer bitrate may be higher than bitrate estimate if enforcing min bitrate. |
| 759 uint32_t pacer_bitrate_bps = |
| 760 std::max(target_bitrate_bps, min_allocated_send_bitrate_bps_); |
| 761 pacer_bitrate_kbps_counter_.Add(pacer_bitrate_bps / 1000); |
755 } | 762 } |
756 | 763 |
757 void Call::OnAllocationLimitsChanged(uint32_t min_send_bitrate_bps, | 764 void Call::OnAllocationLimitsChanged(uint32_t min_send_bitrate_bps, |
758 uint32_t max_padding_bitrate_bps) { | 765 uint32_t max_padding_bitrate_bps) { |
759 congestion_controller_->SetAllocatedSendBitrateLimits( | 766 congestion_controller_->SetAllocatedSendBitrateLimits( |
760 min_send_bitrate_bps, max_padding_bitrate_bps); | 767 min_send_bitrate_bps, max_padding_bitrate_bps); |
761 rtc::CritScope lock(&bitrate_crit_); | 768 rtc::CritScope lock(&bitrate_crit_); |
762 min_allocated_send_bitrate_bps_ = min_send_bitrate_bps; | 769 min_allocated_send_bitrate_bps_ = min_send_bitrate_bps; |
763 configured_max_padding_bitrate_bps_ = max_padding_bitrate_bps; | 770 configured_max_padding_bitrate_bps_ = max_padding_bitrate_bps; |
764 } | 771 } |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
907 // thread. Then this check can be enabled. | 914 // thread. Then this check can be enabled. |
908 // RTC_DCHECK(!configuration_thread_checker_.CalledOnValidThread()); | 915 // RTC_DCHECK(!configuration_thread_checker_.CalledOnValidThread()); |
909 if (RtpHeaderParser::IsRtcp(packet, length)) | 916 if (RtpHeaderParser::IsRtcp(packet, length)) |
910 return DeliverRtcp(media_type, packet, length); | 917 return DeliverRtcp(media_type, packet, length); |
911 | 918 |
912 return DeliverRtp(media_type, packet, length, packet_time); | 919 return DeliverRtp(media_type, packet, length, packet_time); |
913 } | 920 } |
914 | 921 |
915 } // namespace internal | 922 } // namespace internal |
916 } // namespace webrtc | 923 } // namespace webrtc |
OLD | NEW |