Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1044)

Unified Diff: media/base/android/media_codec_player_state.h

Issue 1128383003: Implementation of MediaCodecPlayer stage 1 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed Min comments, added DCHECKs for current threads Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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_

Powered by Google App Engine
This is Rietveld 408576698