Chromium Code Reviews| 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) {} |
|
qinmin
2015/05/14 17:54:07
I would rename this to OnRemoveVideoSurface() or O
Tima Vaisburd
2015/05/15 00:12:40
Renamed to EventVideoSurfaceRemoved() to keep the
|
| + 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_ |