| Index: webrtc/video/send_statistics_proxy.cc
|
| diff --git a/webrtc/video/send_statistics_proxy.cc b/webrtc/video/send_statistics_proxy.cc
|
| index 5c2052a207868d9c6b2e5c7bd4e7edbb0a83d7e1..8dd91d90f49ac298925ddffe95a2d1eaa0d1fc60 100644
|
| --- a/webrtc/video/send_statistics_proxy.cc
|
| +++ b/webrtc/video/send_statistics_proxy.cc
|
| @@ -31,6 +31,17 @@ enum HistogramCodecType {
|
| kVideoMax = 64,
|
| };
|
|
|
| +const char* GetUmaPrefix(VideoEncoderConfig::ContentType content_type) {
|
| + switch (content_type) {
|
| + case VideoEncoderConfig::ContentType::kRealtimeVideo:
|
| + return "WebRTC.Video.";
|
| + case VideoEncoderConfig::ContentType::kScreen:
|
| + return "WebRTC.Video.Screenshare.";
|
| + }
|
| + RTC_NOTREACHED();
|
| + return nullptr;
|
| +}
|
| +
|
| HistogramCodecType PayloadNameToHistogramCodecType(
|
| const std::string& payload_name) {
|
| if (payload_name == "VP8") {
|
| @@ -53,78 +64,98 @@ void UpdateCodecTypeHistogram(const std::string& payload_name) {
|
|
|
| const int SendStatisticsProxy::kStatsTimeoutMs = 5000;
|
|
|
| -SendStatisticsProxy::SendStatisticsProxy(Clock* clock,
|
| - const VideoSendStream::Config& config)
|
| +SendStatisticsProxy::SendStatisticsProxy(
|
| + Clock* clock,
|
| + const VideoSendStream::Config& config,
|
| + VideoEncoderConfig::ContentType content_type)
|
| : clock_(clock),
|
| config_(config),
|
| - input_frame_rate_tracker_(100u, 10u),
|
| - sent_frame_rate_tracker_(100u, 10u),
|
| + content_type_(content_type),
|
| last_sent_frame_timestamp_(0),
|
| - max_sent_width_per_timestamp_(0),
|
| - max_sent_height_per_timestamp_(0) {
|
| + uma_container_(new UmaSamplesContainer(GetUmaPrefix(content_type_))) {
|
| UpdateCodecTypeHistogram(config_.encoder_settings.payload_name);
|
| }
|
|
|
| -SendStatisticsProxy::~SendStatisticsProxy() {
|
| +SendStatisticsProxy::~SendStatisticsProxy() {}
|
| +
|
| +SendStatisticsProxy::UmaSamplesContainer::UmaSamplesContainer(
|
| + const char* prefix)
|
| + : uma_prefix_(prefix),
|
| + max_sent_width_per_timestamp_(0),
|
| + max_sent_height_per_timestamp_(0),
|
| + input_frame_rate_tracker_(100u, 10u),
|
| + sent_frame_rate_tracker_(100u, 10u) {}
|
| +
|
| +SendStatisticsProxy::UmaSamplesContainer::~UmaSamplesContainer() {
|
| UpdateHistograms();
|
| }
|
|
|
| -void SendStatisticsProxy::UpdateHistograms() {
|
| +void SendStatisticsProxy::UmaSamplesContainer::UpdateHistograms() {
|
| const int kMinRequiredSamples = 200;
|
| int in_width = input_width_counter_.Avg(kMinRequiredSamples);
|
| int in_height = input_height_counter_.Avg(kMinRequiredSamples);
|
| int in_fps = round(input_frame_rate_tracker_.ComputeTotalRate());
|
| if (in_width != -1) {
|
| - RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.InputWidthInPixels", in_width);
|
| - RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.InputHeightInPixels", in_height);
|
| - RTC_HISTOGRAM_COUNTS_100("WebRTC.Video.InputFramesPerSecond", in_fps);
|
| + RTC_HISTOGRAM_COUNTS_10000(uma_prefix_ + "InputWidthInPixels", in_width);
|
| + RTC_HISTOGRAM_COUNTS_10000(uma_prefix_ + "InputHeightInPixels", in_height);
|
| + RTC_HISTOGRAM_COUNTS_100(uma_prefix_ + "InputFramesPerSecond", in_fps);
|
| }
|
| int sent_width = sent_width_counter_.Avg(kMinRequiredSamples);
|
| int sent_height = sent_height_counter_.Avg(kMinRequiredSamples);
|
| int sent_fps = round(sent_frame_rate_tracker_.ComputeTotalRate());
|
| if (sent_width != -1) {
|
| - RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.SentWidthInPixels", sent_width);
|
| - RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.SentHeightInPixels", sent_height);
|
| - RTC_HISTOGRAM_COUNTS_100("WebRTC.Video.SentFramesPerSecond", sent_fps);
|
| + RTC_HISTOGRAM_COUNTS_10000(uma_prefix_ + "SentWidthInPixels", sent_width);
|
| + RTC_HISTOGRAM_COUNTS_10000(uma_prefix_ + "SentHeightInPixels", sent_height);
|
| + RTC_HISTOGRAM_COUNTS_100(uma_prefix_ + "SentFramesPerSecond", sent_fps);
|
| }
|
| int encode_ms = encode_time_counter_.Avg(kMinRequiredSamples);
|
| if (encode_ms != -1)
|
| - RTC_HISTOGRAM_COUNTS_1000("WebRTC.Video.EncodeTimeInMs", encode_ms);
|
| + RTC_HISTOGRAM_COUNTS_1000(uma_prefix_ + "EncodeTimeInMs", encode_ms);
|
|
|
| int key_frames_permille = key_frame_counter_.Permille(kMinRequiredSamples);
|
| if (key_frames_permille != -1) {
|
| - RTC_HISTOGRAM_COUNTS_1000("WebRTC.Video.KeyFramesSentInPermille",
|
| - key_frames_permille);
|
| + RTC_HISTOGRAM_COUNTS_1000(uma_prefix_ + "KeyFramesSentInPermille",
|
| + key_frames_permille);
|
| }
|
| int quality_limited =
|
| quality_limited_frame_counter_.Percent(kMinRequiredSamples);
|
| if (quality_limited != -1) {
|
| - RTC_HISTOGRAM_PERCENTAGE("WebRTC.Video.QualityLimitedResolutionInPercent",
|
| + RTC_HISTOGRAM_PERCENTAGE(uma_prefix_ + "QualityLimitedResolutionInPercent",
|
| quality_limited);
|
| }
|
| int downscales = quality_downscales_counter_.Avg(kMinRequiredSamples);
|
| if (downscales != -1) {
|
| - RTC_HISTOGRAM_ENUMERATION("WebRTC.Video.QualityLimitedResolutionDownscales",
|
| - downscales, 20);
|
| + RTC_HISTOGRAM_ENUMERATION(
|
| + uma_prefix_ + "QualityLimitedResolutionDownscales", downscales, 20);
|
| }
|
| int bw_limited = bw_limited_frame_counter_.Percent(kMinRequiredSamples);
|
| if (bw_limited != -1) {
|
| - RTC_HISTOGRAM_PERCENTAGE("WebRTC.Video.BandwidthLimitedResolutionInPercent",
|
| - bw_limited);
|
| + RTC_HISTOGRAM_PERCENTAGE(
|
| + uma_prefix_ + "BandwidthLimitedResolutionInPercent", bw_limited);
|
| }
|
| int num_disabled = bw_resolutions_disabled_counter_.Avg(kMinRequiredSamples);
|
| if (num_disabled != -1) {
|
| RTC_HISTOGRAM_ENUMERATION(
|
| - "WebRTC.Video.BandwidthLimitedResolutionsDisabled", num_disabled, 10);
|
| + uma_prefix_ + "BandwidthLimitedResolutionsDisabled", num_disabled, 10);
|
| }
|
| int delay_ms = delay_counter_.Avg(kMinRequiredSamples);
|
| if (delay_ms != -1)
|
| - RTC_HISTOGRAM_COUNTS_100000("WebRTC.Video.SendSideDelayInMs", delay_ms);
|
| + RTC_HISTOGRAM_COUNTS_100000(uma_prefix_ + "SendSideDelayInMs", delay_ms);
|
|
|
| int max_delay_ms = max_delay_counter_.Avg(kMinRequiredSamples);
|
| if (max_delay_ms != -1) {
|
| - RTC_HISTOGRAM_COUNTS_100000(
|
| - "WebRTC.Video.SendSideDelayMaxInMs", max_delay_ms);
|
| + RTC_HISTOGRAM_COUNTS_100000(uma_prefix_ + "SendSideDelayMaxInMs",
|
| + max_delay_ms);
|
| + }
|
| +}
|
| +
|
| +void SendStatisticsProxy::SetContentType(
|
| + VideoEncoderConfig::ContentType content_type) {
|
| + rtc::CritScope lock(&crit_);
|
| + if (content_type_ != content_type) {
|
| + uma_container_->UpdateHistograms();
|
| + uma_container_.reset(new UmaSamplesContainer(GetUmaPrefix(content_type)));
|
| + content_type_ = content_type;
|
| }
|
| }
|
|
|
| @@ -151,7 +182,7 @@ VideoSendStream::Stats SendStatisticsProxy::GetStats() {
|
| rtc::CritScope lock(&crit_);
|
| PurgeOldStats();
|
| stats_.input_frame_rate =
|
| - round(input_frame_rate_tracker_.ComputeRate());
|
| + round(uma_container_->input_frame_rate_tracker_.ComputeRate());
|
| return stats_;
|
| }
|
|
|
| @@ -224,23 +255,24 @@ void SendStatisticsProxy::OnSendEncodedImage(
|
| stats->height = encoded_image._encodedHeight;
|
| update_times_[ssrc].resolution_update_ms = clock_->TimeInMilliseconds();
|
|
|
| - key_frame_counter_.Add(encoded_image._frameType == kVideoFrameKey);
|
| + uma_container_->key_frame_counter_.Add(encoded_image._frameType ==
|
| + kVideoFrameKey);
|
|
|
| if (encoded_image.adapt_reason_.quality_resolution_downscales != -1) {
|
| bool downscaled =
|
| encoded_image.adapt_reason_.quality_resolution_downscales > 0;
|
| - quality_limited_frame_counter_.Add(downscaled);
|
| + uma_container_->quality_limited_frame_counter_.Add(downscaled);
|
| if (downscaled) {
|
| - quality_downscales_counter_.Add(
|
| + uma_container_->quality_downscales_counter_.Add(
|
| encoded_image.adapt_reason_.quality_resolution_downscales);
|
| }
|
| }
|
| if (encoded_image.adapt_reason_.bw_resolutions_disabled != -1) {
|
| bool bw_limited = encoded_image.adapt_reason_.bw_resolutions_disabled > 0;
|
| - bw_limited_frame_counter_.Add(bw_limited);
|
| + uma_container_->bw_limited_frame_counter_.Add(bw_limited);
|
| if (bw_limited) {
|
| - bw_resolutions_disabled_counter_.Add(
|
| - encoded_image.adapt_reason_.bw_resolutions_disabled);
|
| + uma_container_->bw_resolutions_disabled_counter_.Add(
|
| + encoded_image.adapt_reason_.bw_resolutions_disabled);
|
| }
|
| }
|
|
|
| @@ -249,31 +281,33 @@ void SendStatisticsProxy::OnSendEncodedImage(
|
| // are encoded before the next start.
|
| if (last_sent_frame_timestamp_ > 0 &&
|
| encoded_image._timeStamp != last_sent_frame_timestamp_) {
|
| - sent_frame_rate_tracker_.AddSamples(1);
|
| - sent_width_counter_.Add(max_sent_width_per_timestamp_);
|
| - sent_height_counter_.Add(max_sent_height_per_timestamp_);
|
| - max_sent_width_per_timestamp_ = 0;
|
| - max_sent_height_per_timestamp_ = 0;
|
| + uma_container_->sent_frame_rate_tracker_.AddSamples(1);
|
| + uma_container_->sent_width_counter_.Add(
|
| + uma_container_->max_sent_width_per_timestamp_);
|
| + uma_container_->sent_height_counter_.Add(
|
| + uma_container_->max_sent_height_per_timestamp_);
|
| + uma_container_->max_sent_width_per_timestamp_ = 0;
|
| + uma_container_->max_sent_height_per_timestamp_ = 0;
|
| }
|
| last_sent_frame_timestamp_ = encoded_image._timeStamp;
|
| - max_sent_width_per_timestamp_ =
|
| - std::max(max_sent_width_per_timestamp_,
|
| + uma_container_->max_sent_width_per_timestamp_ =
|
| + std::max(uma_container_->max_sent_width_per_timestamp_,
|
| static_cast<int>(encoded_image._encodedWidth));
|
| - max_sent_height_per_timestamp_ =
|
| - std::max(max_sent_height_per_timestamp_,
|
| + uma_container_->max_sent_height_per_timestamp_ =
|
| + std::max(uma_container_->max_sent_height_per_timestamp_,
|
| static_cast<int>(encoded_image._encodedHeight));
|
| }
|
|
|
| void SendStatisticsProxy::OnIncomingFrame(int width, int height) {
|
| rtc::CritScope lock(&crit_);
|
| - input_frame_rate_tracker_.AddSamples(1);
|
| - input_width_counter_.Add(width);
|
| - input_height_counter_.Add(height);
|
| + uma_container_->input_frame_rate_tracker_.AddSamples(1);
|
| + uma_container_->input_width_counter_.Add(width);
|
| + uma_container_->input_height_counter_.Add(height);
|
| }
|
|
|
| void SendStatisticsProxy::OnEncodedFrame(int encode_time_ms) {
|
| rtc::CritScope lock(&crit_);
|
| - encode_time_counter_.Add(encode_time_ms);
|
| + uma_container_->encode_time_counter_.Add(encode_time_ms);
|
| }
|
|
|
| void SendStatisticsProxy::RtcpPacketTypesCounterUpdated(
|
| @@ -343,8 +377,8 @@ void SendStatisticsProxy::SendSideDelayUpdated(int avg_delay_ms,
|
| stats->avg_delay_ms = avg_delay_ms;
|
| stats->max_delay_ms = max_delay_ms;
|
|
|
| - delay_counter_.Add(avg_delay_ms);
|
| - max_delay_counter_.Add(max_delay_ms);
|
| + uma_container_->delay_counter_.Add(avg_delay_ms);
|
| + uma_container_->max_delay_counter_.Add(max_delay_ms);
|
| }
|
|
|
| void SendStatisticsProxy::SampleCounter::Add(int sample) {
|
| @@ -380,5 +414,4 @@ int SendStatisticsProxy::BoolSampleCounter::Fraction(
|
| return -1;
|
| return static_cast<int>((sum * multiplier / num_samples) + 0.5f);
|
| }
|
| -
|
| } // namespace webrtc
|
|
|