| Index: media/base/android/media_codec_player_state.h
|
| diff --git a/media/base/android/media_codec_player_state.h b/media/base/android/media_codec_player_state.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..611cdf3ba0ba884ba396f6b0cbbaab61f3ba756f
|
| --- /dev/null
|
| +++ b/media/base/android/media_codec_player_state.h
|
| @@ -0,0 +1,152 @@
|
| +// 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.
|
| +
|
| +#ifndef MEDIA_BASE_ANDROID_MEDIA_CODEC_PLAYER_STATE_H_
|
| +#define MEDIA_BASE_ANDROID_MEDIA_CODEC_PLAYER_STATE_H_
|
| +
|
| +#include "base/macros.h"
|
| +#include "media/base/android/demuxer_android.h"
|
| +#include "ui/gl/android/scoped_java_surface.h"
|
| +
|
| +#define DEFINE_INSTANCE(TypeName) \
|
| + public: \
|
| + static TypeName * Instance() { \
|
| + static TypeName singleton; return &singleton; \
|
| + } \
|
| + const char* name() override { \
|
| + return #TypeName ; \
|
| + } \
|
| + private: \
|
| + TypeName() {} \
|
| + DISALLOW_COPY_AND_ASSIGN(TypeName);
|
| +
|
| +
|
| +namespace media {
|
| +
|
| +/*
|
| +
|
| + --------------------------> Paused
|
| + | StopDone:
|
| + | ^ |
|
| + | | |
|
| + | Pause: | | Start: dec.Prefetch
|
| + | | |
|
| + | | |
|
| + | | |
|
| + | | v PrefetchDone,
|
| + | no surface:
|
| + | ------------------> Prefetching --------------> Waiting
|
| + | | for surface
|
| + | | | /
|
| + | | | /
|
| + | | StopDone w/ | /
|
| + | | pending start: | PrefetchDone: /
|
| + | | dec.Prefetch | dec.Start /
|
| + | | | / SetSurface:
|
| + | | | / dec.Start
|
| + | | | /
|
| + | | v /
|
| + | | /
|
| + | | Playing <----------/
|
| + | |
|
| + | | |
|
| + | | |
|
| + | | | Pause: dec.RequestToStop
|
| + | | |
|
| + | | |
|
| + | | v
|
| + | |
|
| + -------------------------- Stopping
|
| +
|
| + */
|
| +
|
| +// Implementaton of the State pattern:
|
| +//
|
| +// PlayerState is an abstract state that has virtual methods for
|
| +// every possible event. Normally these methods do nothing.
|
| +//
|
| +// Concrete states (StatePaused, StatePlaying etc.) inherit from this
|
| +// PlayerState and implement the event handlers for the events expected
|
| +// to these states. If an event handler is omitted in a concrete state,
|
| +// the PlayerState method is called which usually means empty implementation
|
| +// and the event is ignored.
|
| +
|
| +class MediaCodecPlayer;
|
| +
|
| +class MediaCodecPlayerState {
|
| + public:
|
| + virtual const char* name() = 0;
|
| + virtual void EventRemoveVideoSurface(MediaCodecPlayer* player) {}
|
| + virtual void EventSetVideoSurface(MediaCodecPlayer* player) {}
|
| + virtual void EventStart(MediaCodecPlayer* player) {}
|
| + virtual void EventPause(MediaCodecPlayer* player) {}
|
| + virtual void EventSeekTo(MediaCodecPlayer* player,
|
| + base::TimeDelta timestamp) {}
|
| + virtual void EventDemuxerConfigsAvailable(MediaCodecPlayer* player,
|
| + const DemuxerConfigs& params);
|
| + virtual void EventDemuxerSeekDone(MediaCodecPlayer* player) {}
|
| + virtual void EventPrefetchDone(MediaCodecPlayer* player) {}
|
| + virtual void EventStopDone(MediaCodecPlayer* player) {}
|
| + virtual void EventStarvation(MediaCodecPlayer* player) {}
|
| + virtual void EventRelease(MediaCodecPlayer* player);
|
| + virtual void EventError(MediaCodecPlayer* player);
|
| +};
|
| +
|
| +class StatePaused : public MediaCodecPlayerState {
|
| + DEFINE_INSTANCE(StatePaused);
|
| + public:
|
| + void EventStart(MediaCodecPlayer* player) override;
|
| +};
|
| +
|
| +class StatePrefetching : public MediaCodecPlayerState {
|
| + DEFINE_INSTANCE(StatePrefetching);
|
| + public:
|
| + void EventPause(MediaCodecPlayer* player) override;
|
| + void EventPrefetchDone(MediaCodecPlayer* player) override;
|
| +};
|
| +
|
| +class StateWaitingForConfig : public MediaCodecPlayerState {
|
| + DEFINE_INSTANCE(StateWaitingForConfig);
|
| + public:
|
| + void EventDemuxerConfigsAvailable(MediaCodecPlayer* player,
|
| + const DemuxerConfigs& params) override;
|
| + void EventPause(MediaCodecPlayer* player) override;
|
| +};
|
| +
|
| +class StateWaitingForSurface : public MediaCodecPlayerState {
|
| + DEFINE_INSTANCE(StateWaitingForSurface);
|
| + public:
|
| + void EventSetVideoSurface(MediaCodecPlayer* player) override;
|
| + void EventPause(MediaCodecPlayer* player) override;
|
| +};
|
| +
|
| +class StatePlaying : public MediaCodecPlayerState {
|
| + DEFINE_INSTANCE(StatePlaying);
|
| + public:
|
| + void EventPause(MediaCodecPlayer* player) override;
|
| + void EventStarvation(MediaCodecPlayer* player) override;
|
| + void EventStopDone(MediaCodecPlayer* player) override;
|
| + void EventError(MediaCodecPlayer* player) override;
|
| +};
|
| +
|
| +class StateStopping : public MediaCodecPlayerState {
|
| + DEFINE_INSTANCE(StateStopping);
|
| + public:
|
| + void EventStart(MediaCodecPlayer* player) override;
|
| + void EventStopDone(MediaCodecPlayer* player) override;
|
| +};
|
| +
|
| +class StateWaitingForSeek : public MediaCodecPlayerState {
|
| + DEFINE_INSTANCE(StateWaitingForSeek);
|
| + public:
|
| +};
|
| +
|
| +class StateError : public MediaCodecPlayerState {
|
| + DEFINE_INSTANCE(StateError);
|
| + public:
|
| +};
|
| +
|
| +} // namespace media
|
| +
|
| +#endif // MEDIA_BASE_ANDROID_MEDIA_CODEC_PLAYER_STATE_H_
|
|
|