| Index: chromecast/media/cma/base/buffering_state.h
|
| diff --git a/chromecast/media/cma/base/buffering_state.h b/chromecast/media/cma/base/buffering_state.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ced8206d8a159e30a2975afc07bf94b79397eca9
|
| --- /dev/null
|
| +++ b/chromecast/media/cma/base/buffering_state.h
|
| @@ -0,0 +1,138 @@
|
| +// Copyright 2014 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.
|
| +
|
| +#ifndef CHROMECAST_MEDIA_CMA_BASE_BUFFERING_STATE_H_
|
| +#define CHROMECAST_MEDIA_CMA_BASE_BUFFERING_STATE_H_
|
| +
|
| +#include <string>
|
| +
|
| +#include "base/callback.h"
|
| +#include "base/macros.h"
|
| +#include "base/memory/ref_counted.h"
|
| +#include "base/time/time.h"
|
| +
|
| +namespace chromecast {
|
| +namespace media {
|
| +
|
| +class BufferingConfig : public base::RefCountedThreadSafe<BufferingConfig> {
|
| + public:
|
| + BufferingConfig(base::TimeDelta low_level_threshold,
|
| + base::TimeDelta high_level_threshold);
|
| +
|
| + base::TimeDelta low_level() const { return low_level_threshold_; }
|
| + base::TimeDelta high_level() const { return high_level_threshold_; }
|
| +
|
| + void set_low_level(base::TimeDelta low_level) {
|
| + low_level_threshold_ = low_level;
|
| + }
|
| + void set_high_level(base::TimeDelta high_level) {
|
| + high_level_threshold_ = high_level;
|
| + }
|
| +
|
| + private:
|
| + friend class base::RefCountedThreadSafe<BufferingConfig>;
|
| + virtual ~BufferingConfig();
|
| +
|
| + base::TimeDelta low_level_threshold_;
|
| + base::TimeDelta high_level_threshold_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(BufferingConfig);
|
| +};
|
| +
|
| +class BufferingState
|
| + : public base::RefCountedThreadSafe<BufferingState> {
|
| + public:
|
| + typedef base::Callback<void(base::TimeDelta)> HighLevelBufferCB;
|
| +
|
| + enum State {
|
| + kLowLevel,
|
| + kMediumLevel,
|
| + kHighLevel,
|
| + kEosReached,
|
| + };
|
| +
|
| + // Creates a new buffering state. The initial state is |kLowLevel|.
|
| + // |state_changed_cb| is used to notify about possible state changes.
|
| + // |high_level_buffer_cb| is used to adjust the high buffer threshold
|
| + // when the underlying buffer is not large enough to accomodate
|
| + // the current high buffer level.
|
| + BufferingState(const scoped_refptr<BufferingConfig>& config,
|
| + const base::Closure& state_changed_cb,
|
| + const HighLevelBufferCB& high_level_buffer_cb);
|
| +
|
| + // Returns the buffering state.
|
| + State GetState() const { return state_; }
|
| +
|
| + // Invoked when the buffering configuration has changed.
|
| + // Based on the new configuration, the buffering state might change.
|
| + // However, |state_changed_cb_| is not triggered in that case.
|
| + void OnConfigChanged();
|
| +
|
| + // Sets the current rendering time for this stream.
|
| + void SetMediaTime(base::TimeDelta media_time);
|
| +
|
| + // Sets/gets the maximum rendering media time for this stream.
|
| + // The maximum rendering time is always lower than the buffered time.
|
| + void SetMaxRenderingTime(base::TimeDelta max_rendering_time);
|
| + base::TimeDelta GetMaxRenderingTime() const;
|
| +
|
| + // Sets the buffered time.
|
| + void SetBufferedTime(base::TimeDelta buffered_time);
|
| +
|
| + // Notifies the buffering state that all the frames for this stream have been
|
| + // buffered, i.e. the end of stream has been reached.
|
| + void NotifyEos();
|
| +
|
| + // Notifies the buffering state the underlying buffer has reached
|
| + // its maximum capacity.
|
| + // The maximum frame timestamp in the buffer is given by |buffered_time|.
|
| + // Note: this timestamp can be different from the one provided through
|
| + // SetBufferedTime since SetBufferedTime takes the timestamp of a playable
|
| + // frame which is not necessarily the case here (e.g. missing key id).
|
| + void NotifyMaxCapacity(base::TimeDelta buffered_time);
|
| +
|
| + // Buffering state as a human readable string, for debugging.
|
| + std::string ToString() const;
|
| +
|
| + private:
|
| + friend class base::RefCountedThreadSafe<BufferingState>;
|
| + virtual ~BufferingState();
|
| +
|
| + // Returns the state solely based on the buffered time.
|
| + State GetBufferLevelState() const;
|
| +
|
| + // Updates the state to |new_state|.
|
| + void UpdateState(State new_state);
|
| +
|
| + scoped_refptr<BufferingConfig> const config_;
|
| +
|
| + // Callback invoked each time there is a change of state.
|
| + base::Closure state_changed_cb_;
|
| +
|
| + // Callback invoked to adjust the high buffer level.
|
| + HighLevelBufferCB high_level_buffer_cb_;
|
| +
|
| + // State.
|
| + State state_;
|
| +
|
| + // Playback media time.
|
| + // Equal to kNoTimestamp() when not known.
|
| + base::TimeDelta media_time_;
|
| +
|
| + // Maximum rendering media time.
|
| + // This corresponds to the timestamp of the last frame sent to the hardware
|
| + // decoder/renderer.
|
| + base::TimeDelta max_rendering_time_;
|
| +
|
| + // Buffered media time.
|
| + // Equal to kNoTimestamp() when not known.
|
| + base::TimeDelta buffered_time_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(BufferingState);
|
| +};
|
| +
|
| +} // namespace media
|
| +} // namespace chromecast
|
| +
|
| +#endif // CHROMECAST_MEDIA_CMA_BASE_BUFFERING_STATE_H_
|
|
|