blob: 52591517b8c25d15dafa56e31645b30383afd974 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef GARNET_BIN_MEDIAPLAYER_DEMUX_BYTE_RATE_ESTIMATOR_H_
#define GARNET_BIN_MEDIAPLAYER_DEMUX_BYTE_RATE_ESTIMATOR_H_
#include <deque>
#include <optional>
#include "lib/fxl/macros.h"
#include "lib/zx/time.h"
#include "zircon/types.h"
namespace media_player {
// Estimates the byte rate of some operation using the provided samples. E.g.
// read operations from a file or download.
class ByteRateEstimator {
public:
// Describes an instance of the measured operation (e.g. a read of one chunk
// from file). Times should come from |zx_clock_get|. See
// //zircon/docs/time.md.
struct ByteRateSample {
zx::time start_time;
zx::time stop_time;
size_t bytes_processed;
};
// |ByteRateSampler| is an API for recording |ByteRateSample|s.
class ByteRateSampler {
public:
ByteRateSampler(ByteRateSampler&& rvalue) = default;
ByteRateSampler& operator=(ByteRateSampler&&) = default;
// Starts a timed sample of an operation on |bytes| bytes.
static ByteRateSampler StartSample(size_t bytes);
// Stops timing and returns a finished sample.
static ByteRateSample FinishSample(ByteRateSampler sampler);
private:
explicit ByteRateSampler(ByteRateSample started_sample);
ByteRateSample sample_;
FXL_DISALLOW_COPY_AND_ASSIGN(ByteRateSampler);
};
explicit ByteRateEstimator(size_t max_sample_count);
// Adds a sample for the byte rate estimation.
void AddSample(const ByteRateSample& sample);
// Estimates the bytes per second of the operation this instance has sampled
// using a weighted moving average of at most |max_sample_count| samples.
std::optional<float> Estimate();
private:
std::deque<zx::duration> samples_;
size_t max_sample_count_;
};
} // namespace media_player
#endif // GARNET_BIN_MEDIAPLAYER_DEMUX_BYTE_RATE_ESTIMATOR_H_