blob: fb7a0e0cce67bbf0820280021a1b40acccc9d5a3 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <stdint.h>
#include "base/callback.h"
#include "base/macros.h"
#include "base/timer/timer.h"
#include "remoting/base/rate_counter.h"
#include "remoting/base/running_samples.h"
#include "remoting/protocol/frame_stats.h"
namespace remoting {
namespace protocol {
// PerformanceTracker defines a bundle of performance counters and statistics
// for chromoting.
class PerformanceTracker : public FrameStatsConsumer {
// Callback that updates UMA custom counts or custom times histograms.
typedef base::Callback<void(const std::string& histogram_name,
int64_t value,
int histogram_min,
int histogram_max,
int histogram_buckets)>
// Callback that updates UMA enumeration histograms.
typedef base::Callback<
void(const std::string& histogram_name, int64_t value, int histogram_max)>
~PerformanceTracker() override;
// Constant used to calculate the average for rate metrics and used by the
// plugin for the frequency at which stats should be updated.
static const int kStatsUpdatePeriodSeconds = 1;
// Return rates and running-averages for different metrics.
double video_bandwidth() { return video_bandwidth_.Rate(); }
double video_frame_rate() { return video_frame_rate_.Rate(); }
double video_packet_rate() { return video_packet_rate_.Rate(); }
const RunningSamples& video_capture_ms() { return video_capture_ms_; }
const RunningSamples& video_encode_ms() { return video_encode_ms_; }
const RunningSamples& video_decode_ms() { return video_decode_ms_; }
const RunningSamples& video_paint_ms() { return video_paint_ms_; }
const RunningSamples& round_trip_ms() { return round_trip_ms_; }
// FrameStatsConsumer interface.
void OnVideoFrameStats(const FrameStats& stats) override;
// Sets callbacks in ChromotingInstance to update a UMA custom counts, custom
// times or enum histogram.
void SetUpdateUmaCallbacks(
UpdateUmaCustomHistogramCallback update_uma_custom_counts_callback,
UpdateUmaCustomHistogramCallback update_uma_custom_times_callback,
UpdateUmaEnumHistogramCallback update_uma_enum_histogram_callback);
void OnPauseStateChanged(bool paused);
// Updates frame-rate, packet-rate and bandwidth UMA statistics.
void UploadRateStatsToUma();
// The video and packet rate metrics below are updated per video packet
// received and then, for reporting, averaged over a 1s time-window.
// Bytes per second for non-empty video-packets.
RateCounter video_bandwidth_;
// Frames per second for non-empty video-packets.
RateCounter video_frame_rate_;
// Video packets per second, including empty video-packets.
// This will be greater than the frame rate, as individual frames are
// contained in packets, some of which might be empty (e.g. when there are no
// screen changes).
RateCounter video_packet_rate_;
// The following running-averages are uploaded to UMA per video packet and
// also used for display to users, averaged over the N most recent samples.
// N = kLatencySampleSize.
RunningSamples video_capture_ms_;
RunningSamples video_encode_ms_;
RunningSamples video_decode_ms_;
RunningSamples video_paint_ms_;
RunningSamples round_trip_ms_;
// Used to update UMA stats, if set.
UpdateUmaCustomHistogramCallback uma_custom_counts_updater_;
UpdateUmaCustomHistogramCallback uma_custom_times_updater_;
UpdateUmaEnumHistogramCallback uma_enum_histogram_updater_;
bool is_paused_ = false;
base::RepeatingTimer upload_uma_stats_timer_;
} // namespace protocol
} // namespace remoting