Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(506)

Side by Side Diff: webrtc/video/send_statistics_proxy.cc

Issue 2804653002: Update stats for cpu/quality adaptation changes to excluded time when video is suspended. (Closed)
Patch Set: address comments Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/video/send_statistics_proxy.h ('k') | webrtc/video/send_statistics_proxy_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 Clock* clock, 82 Clock* clock,
83 const VideoSendStream::Config& config, 83 const VideoSendStream::Config& config,
84 VideoEncoderConfig::ContentType content_type) 84 VideoEncoderConfig::ContentType content_type)
85 : clock_(clock), 85 : clock_(clock),
86 payload_name_(config.encoder_settings.payload_name), 86 payload_name_(config.encoder_settings.payload_name),
87 rtp_config_(config.rtp), 87 rtp_config_(config.rtp),
88 content_type_(content_type), 88 content_type_(content_type),
89 start_ms_(clock->TimeInMilliseconds()), 89 start_ms_(clock->TimeInMilliseconds()),
90 last_sent_frame_timestamp_(0), 90 last_sent_frame_timestamp_(0),
91 encode_time_(kEncodeTimeWeigthFactor), 91 encode_time_(kEncodeTimeWeigthFactor),
92 quality_downscales_(-1),
93 cpu_downscales_(-1),
92 uma_container_( 94 uma_container_(
93 new UmaSamplesContainer(GetUmaPrefix(content_type_), stats_, clock)) { 95 new UmaSamplesContainer(GetUmaPrefix(content_type_), stats_, clock)) {
94 } 96 }
95 97
96 SendStatisticsProxy::~SendStatisticsProxy() { 98 SendStatisticsProxy::~SendStatisticsProxy() {
97 rtc::CritScope lock(&crit_); 99 rtc::CritScope lock(&crit_);
98 uma_container_->UpdateHistograms(rtp_config_, stats_); 100 uma_container_->UpdateHistograms(rtp_config_, stats_);
99 101
100 int64_t elapsed_sec = (clock_->TimeInMilliseconds() - start_ms_) / 1000; 102 int64_t elapsed_sec = (clock_->TimeInMilliseconds() - start_ms_) / 1000;
101 RTC_HISTOGRAM_COUNTS_100000("WebRTC.Video.SendStreamLifetimeInSeconds", 103 RTC_HISTOGRAM_COUNTS_100000("WebRTC.Video.SendStreamLifetimeInSeconds",
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 } 288 }
287 int qp_h264 = it.second.h264.Avg(kMinRequiredMetricsSamples); 289 int qp_h264 = it.second.h264.Avg(kMinRequiredMetricsSamples);
288 if (qp_h264 != -1) { 290 if (qp_h264 != -1) {
289 int spatial_idx = it.first; 291 int spatial_idx = it.first;
290 RTC_DCHECK_EQ(-1, spatial_idx); 292 RTC_DCHECK_EQ(-1, spatial_idx);
291 RTC_HISTOGRAMS_COUNTS_100(kIndex, uma_prefix_ + "Encoded.Qp.H264", 293 RTC_HISTOGRAMS_COUNTS_100(kIndex, uma_prefix_ + "Encoded.Qp.H264",
292 qp_h264); 294 qp_h264);
293 } 295 }
294 } 296 }
295 297
296 quality_scaling_timer_.Stop(clock_->TimeInMilliseconds()); 298 if (first_rtp_stats_time_ms_ != -1) {
297 int64_t elapsed_sec = quality_scaling_timer_.total_ms / 1000; 299 quality_scaling_timer_.Stop(clock_->TimeInMilliseconds());
298 if (elapsed_sec >= metrics::kMinRunTimeInSeconds) { 300 int64_t elapsed_sec = quality_scaling_timer_.total_ms / 1000;
299 int quality_changes = current_stats.number_of_quality_adapt_changes - 301 if (elapsed_sec >= metrics::kMinRunTimeInSeconds) {
300 start_stats_.number_of_quality_adapt_changes; 302 int quality_changes = current_stats.number_of_quality_adapt_changes -
301 RTC_HISTOGRAMS_COUNTS_100(kIndex, 303 start_stats_.number_of_quality_adapt_changes;
302 uma_prefix_ + "AdaptChangesPerMinute.Quality", 304 RTC_HISTOGRAMS_COUNTS_100(kIndex,
303 quality_changes * 60 / elapsed_sec); 305 uma_prefix_ + "AdaptChangesPerMinute.Quality",
304 } 306 quality_changes * 60 / elapsed_sec);
305 cpu_scaling_timer_.Stop(clock_->TimeInMilliseconds()); 307 }
306 elapsed_sec = cpu_scaling_timer_.total_ms / 1000; 308 cpu_scaling_timer_.Stop(clock_->TimeInMilliseconds());
307 if (elapsed_sec >= metrics::kMinRunTimeInSeconds) { 309 elapsed_sec = cpu_scaling_timer_.total_ms / 1000;
308 int cpu_changes = current_stats.number_of_cpu_adapt_changes - 310 if (elapsed_sec >= metrics::kMinRunTimeInSeconds) {
309 start_stats_.number_of_cpu_adapt_changes; 311 int cpu_changes = current_stats.number_of_cpu_adapt_changes -
310 RTC_HISTOGRAMS_COUNTS_100(kIndex, uma_prefix_ + "AdaptChangesPerMinute.Cpu", 312 start_stats_.number_of_cpu_adapt_changes;
311 cpu_changes * 60 / elapsed_sec); 313 RTC_HISTOGRAMS_COUNTS_100(kIndex,
314 uma_prefix_ + "AdaptChangesPerMinute.Cpu",
315 cpu_changes * 60 / elapsed_sec);
316 }
312 } 317 }
313 318
314 if (first_rtcp_stats_time_ms_ != -1) { 319 if (first_rtcp_stats_time_ms_ != -1) {
315 int64_t elapsed_sec = 320 int64_t elapsed_sec =
316 (clock_->TimeInMilliseconds() - first_rtcp_stats_time_ms_) / 1000; 321 (clock_->TimeInMilliseconds() - first_rtcp_stats_time_ms_) / 1000;
317 if (elapsed_sec >= metrics::kMinRunTimeInSeconds) { 322 if (elapsed_sec >= metrics::kMinRunTimeInSeconds) {
318 int fraction_lost = report_block_stats_.FractionLostInPercent(); 323 int fraction_lost = report_block_stats_.FractionLostInPercent();
319 if (fraction_lost != -1) { 324 if (fraction_lost != -1) {
320 RTC_HISTOGRAMS_PERCENTAGE( 325 RTC_HISTOGRAMS_PERCENTAGE(
321 kIndex, uma_prefix_ + "SentPacketsLostInPercent", fraction_lost); 326 kIndex, uma_prefix_ + "SentPacketsLostInPercent", fraction_lost);
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
466 stats_.encode_usage_percent = metrics.encode_usage_percent; 471 stats_.encode_usage_percent = metrics.encode_usage_percent;
467 TRACE_EVENT_INSTANT2("webrtc_stats", "WebRTC.Video.EncodeTimeInMs", 472 TRACE_EVENT_INSTANT2("webrtc_stats", "WebRTC.Video.EncodeTimeInMs",
468 "encode_time_ms", stats_.avg_encode_time_ms, 473 "encode_time_ms", stats_.avg_encode_time_ms,
469 "ssrc", rtp_config_.ssrcs[0]); 474 "ssrc", rtp_config_.ssrcs[0]);
470 TRACE_EVENT_INSTANT2("webrtc_stats", "WebRTC.Video.EncodeUsagePercent", 475 TRACE_EVENT_INSTANT2("webrtc_stats", "WebRTC.Video.EncodeUsagePercent",
471 "encode_usage_percent", stats_.encode_usage_percent, 476 "encode_usage_percent", stats_.encode_usage_percent,
472 "ssrc", rtp_config_.ssrcs[0]); 477 "ssrc", rtp_config_.ssrcs[0]);
473 } 478 }
474 479
475 void SendStatisticsProxy::OnSuspendChange(bool is_suspended) { 480 void SendStatisticsProxy::OnSuspendChange(bool is_suspended) {
481 int64_t now_ms = clock_->TimeInMilliseconds();
476 rtc::CritScope lock(&crit_); 482 rtc::CritScope lock(&crit_);
477 stats_.suspended = is_suspended; 483 stats_.suspended = is_suspended;
478 if (is_suspended) { 484 if (is_suspended) {
479 // Pause framerate (add min pause time since there may be frames/packets 485 // Pause framerate (add min pause time since there may be frames/packets
480 // that are not yet sent). 486 // that are not yet sent).
481 const int64_t kMinMs = 500; 487 const int64_t kMinMs = 500;
482 uma_container_->input_fps_counter_.ProcessAndPauseForDuration(kMinMs); 488 uma_container_->input_fps_counter_.ProcessAndPauseForDuration(kMinMs);
483 uma_container_->sent_fps_counter_.ProcessAndPauseForDuration(kMinMs); 489 uma_container_->sent_fps_counter_.ProcessAndPauseForDuration(kMinMs);
484 // Pause bitrate stats. 490 // Pause bitrate stats.
485 uma_container_->total_byte_counter_.ProcessAndPauseForDuration(kMinMs); 491 uma_container_->total_byte_counter_.ProcessAndPauseForDuration(kMinMs);
486 uma_container_->media_byte_counter_.ProcessAndPauseForDuration(kMinMs); 492 uma_container_->media_byte_counter_.ProcessAndPauseForDuration(kMinMs);
487 uma_container_->rtx_byte_counter_.ProcessAndPauseForDuration(kMinMs); 493 uma_container_->rtx_byte_counter_.ProcessAndPauseForDuration(kMinMs);
488 uma_container_->padding_byte_counter_.ProcessAndPauseForDuration(kMinMs); 494 uma_container_->padding_byte_counter_.ProcessAndPauseForDuration(kMinMs);
489 uma_container_->retransmit_byte_counter_.ProcessAndPauseForDuration(kMinMs); 495 uma_container_->retransmit_byte_counter_.ProcessAndPauseForDuration(kMinMs);
490 uma_container_->fec_byte_counter_.ProcessAndPauseForDuration(kMinMs); 496 uma_container_->fec_byte_counter_.ProcessAndPauseForDuration(kMinMs);
497 // Stop adaptation stats.
498 uma_container_->cpu_scaling_timer_.Stop(now_ms);
499 uma_container_->quality_scaling_timer_.Stop(now_ms);
491 } else { 500 } else {
501 // Start adaptation stats if scaling is enabled.
502 if (cpu_downscales_ >= 0)
503 uma_container_->cpu_scaling_timer_.Start(now_ms);
504 if (quality_downscales_ >= 0)
505 uma_container_->quality_scaling_timer_.Start(now_ms);
492 // Stop pause explicitly for stats that may be zero/not updated for some 506 // Stop pause explicitly for stats that may be zero/not updated for some
493 // time. 507 // time.
494 uma_container_->rtx_byte_counter_.ProcessAndStopPause(); 508 uma_container_->rtx_byte_counter_.ProcessAndStopPause();
495 uma_container_->padding_byte_counter_.ProcessAndStopPause(); 509 uma_container_->padding_byte_counter_.ProcessAndStopPause();
496 uma_container_->retransmit_byte_counter_.ProcessAndStopPause(); 510 uma_container_->retransmit_byte_counter_.ProcessAndStopPause();
497 uma_container_->fec_byte_counter_.ProcessAndStopPause(); 511 uma_container_->fec_byte_counter_.ProcessAndStopPause();
498 } 512 }
499 } 513 }
500 514
501 VideoSendStream::Stats SendStatisticsProxy::GetStats() { 515 VideoSendStream::Stats SendStatisticsProxy::GetStats() {
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
697 uma_container_->input_height_counter_.Add(height); 711 uma_container_->input_height_counter_.Add(height);
698 uma_container_->cpu_limited_frame_counter_.Add(stats_.cpu_limited_resolution); 712 uma_container_->cpu_limited_frame_counter_.Add(stats_.cpu_limited_resolution);
699 TRACE_EVENT_INSTANT2("webrtc_stats", "WebRTC.Video.InputFrameRate", 713 TRACE_EVENT_INSTANT2("webrtc_stats", "WebRTC.Video.InputFrameRate",
700 "frame_rate", round( 714 "frame_rate", round(
701 uma_container_->input_frame_rate_tracker_.ComputeRate()), 715 uma_container_->input_frame_rate_tracker_.ComputeRate()),
702 "ssrc", rtp_config_.ssrcs[0]); 716 "ssrc", rtp_config_.ssrcs[0]);
703 } 717 }
704 718
705 void SendStatisticsProxy::SetCpuScalingStats(int num_cpu_downscales) { 719 void SendStatisticsProxy::SetCpuScalingStats(int num_cpu_downscales) {
706 rtc::CritScope lock(&crit_); 720 rtc::CritScope lock(&crit_);
721 cpu_downscales_ = num_cpu_downscales;
707 stats_.cpu_limited_resolution = num_cpu_downscales > 0; 722 stats_.cpu_limited_resolution = num_cpu_downscales > 0;
708 723
709 if (num_cpu_downscales >= 0) { 724 if (num_cpu_downscales >= 0) {
710 // Scaling enabled. 725 // Scaling enabled.
711 uma_container_->cpu_scaling_timer_.Start(clock_->TimeInMilliseconds()); 726 if (!stats_.suspended)
712 } else { 727 uma_container_->cpu_scaling_timer_.Start(clock_->TimeInMilliseconds());
713 uma_container_->cpu_scaling_timer_.Stop(clock_->TimeInMilliseconds()); 728 return;
714 } 729 }
730 uma_container_->cpu_scaling_timer_.Stop(clock_->TimeInMilliseconds());
715 } 731 }
716 732
717 void SendStatisticsProxy::SetQualityScalingStats(int num_quality_downscales) { 733 void SendStatisticsProxy::SetQualityScalingStats(int num_quality_downscales) {
718 rtc::CritScope lock(&crit_); 734 rtc::CritScope lock(&crit_);
719 quality_downscales_ = num_quality_downscales; 735 quality_downscales_ = num_quality_downscales;
720 stats_.bw_limited_resolution = quality_downscales_ > 0; 736 stats_.bw_limited_resolution = quality_downscales_ > 0;
721 737
722 if (num_quality_downscales >= 0) { 738 if (num_quality_downscales >= 0) {
723 // Scaling enabled. 739 // Scaling enabled.
724 uma_container_->quality_scaling_timer_.Start(clock_->TimeInMilliseconds()); 740 if (!stats_.suspended) {
725 } else { 741 uma_container_->quality_scaling_timer_.Start(
726 uma_container_->quality_scaling_timer_.Stop(clock_->TimeInMilliseconds()); 742 clock_->TimeInMilliseconds());
743 }
744 return;
727 } 745 }
746 uma_container_->quality_scaling_timer_.Stop(clock_->TimeInMilliseconds());
728 } 747 }
729 748
730 void SendStatisticsProxy::OnCpuRestrictedResolutionChanged( 749 void SendStatisticsProxy::OnCpuRestrictedResolutionChanged(
731 bool cpu_restricted_resolution) { 750 bool cpu_restricted_resolution) {
732 rtc::CritScope lock(&crit_); 751 rtc::CritScope lock(&crit_);
733 stats_.cpu_limited_resolution = cpu_restricted_resolution; 752 stats_.cpu_limited_resolution = cpu_restricted_resolution;
734 ++stats_.number_of_cpu_adapt_changes; 753 ++stats_.number_of_cpu_adapt_changes;
735 TRACE_EVENT_INSTANT0("webrtc_stats", "WebRTC.Video.CpuAdaptationChanges"); 754 TRACE_EVENT_INSTANT0("webrtc_stats", "WebRTC.Video.CpuAdaptationChanges");
736 } 755 }
737 756
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
906 } 925 }
907 926
908 int SendStatisticsProxy::BoolSampleCounter::Fraction( 927 int SendStatisticsProxy::BoolSampleCounter::Fraction(
909 int64_t min_required_samples, 928 int64_t min_required_samples,
910 float multiplier) const { 929 float multiplier) const {
911 if (num_samples < min_required_samples || num_samples == 0) 930 if (num_samples < min_required_samples || num_samples == 0)
912 return -1; 931 return -1;
913 return static_cast<int>((sum * multiplier / num_samples) + 0.5f); 932 return static_cast<int>((sum * multiplier / num_samples) + 0.5f);
914 } 933 }
915 } // namespace webrtc 934 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/video/send_statistics_proxy.h ('k') | webrtc/video/send_statistics_proxy_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698