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_ |