blob: 3bae42ec3f85373c13254dcf58e9273a8a19924e [file] [log] [blame]
// 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 MEDIA_BASE_BUFFERING_STATE_H_
#define MEDIA_BASE_BUFFERING_STATE_H_
#include <string>
#include "base/callback_forward.h"
namespace media {
enum BufferingState {
// Indicates that there is no data buffered.
//
// Typical reason is data underflow and hence playback should be paused.
BUFFERING_HAVE_NOTHING,
// Indicates that enough data has been buffered.
//
// Typical reason is enough data has been prerolled to start playback.
BUFFERING_HAVE_ENOUGH,
BUFFERING_STATE_MAX = BUFFERING_HAVE_ENOUGH,
};
enum BufferingStateChangeReason {
// The reason for the change is not known. This is a valid value for both
// HAVE_NOTHING and HAVE_ENOUGH states. Notably, it is used with all
// HAVE_ENOUGH events. The real cause of have HAVE_ENOUGH events is either
// completion of initial pre-roll, or a resolution of the previous underflow's
// cause. Interested observers can determine this by checking the most recent
// state change events. This reason may also be provided for some HAVE_NOTHING
// events where it is architecturally difficult to determine the cause.
BUFFERING_CHANGE_REASON_UNKNOWN,
// Renderer ran out of decoded frames because of delay getting more encoded
// data from the demuxer. For src=, this indicates network slowness. For MSE
// it means the data wasn't appended in time (probably also network slowness).
DEMUXER_UNDERFLOW,
// Renderer ran out of decoded frames because decoder couldn't keep up.
DECODER_UNDERFLOW,
// The local demuxer has the data, but the remote renderer (e.g. cast) hasn't
// received it yet. Only possible during media "remoting".
REMOTING_NETWORK_CONGESTION,
BUFFERING_STATE_CHANGE_REASON_MAX = REMOTING_NETWORK_CONGESTION,
};
enum class SerializableBufferingStateType {
kPipeline,
kVideo,
kAudio,
};
// A serializable combo of the state, type, and reason.
template <SerializableBufferingStateType T>
struct SerializableBufferingState {
BufferingState state;
BufferingStateChangeReason reason;
// Only included in the serialized state if |type == kPipeline|
bool suspended_start = false;
};
// Used to indicate changes in buffering state;
using BufferingStateCB =
base::RepeatingCallback<void(BufferingState, BufferingStateChangeReason)>;
std::string BufferingStateToString(
BufferingState state,
BufferingStateChangeReason reason = BUFFERING_CHANGE_REASON_UNKNOWN);
} // namespace media
#endif // MEDIA_BASE_BUFFERING_STATE_H_