OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef MEDIA_BASE_ANDROID_MEDIA_CODEC_PLAYER_STATE_H_ | |
6 #define MEDIA_BASE_ANDROID_MEDIA_CODEC_PLAYER_STATE_H_ | |
7 | |
8 #include "base/macros.h" | |
9 #include "media/base/android/demuxer_android.h" | |
10 #include "ui/gl/android/scoped_java_surface.h" | |
11 | |
12 #define DEFINE_INSTANCE(TypeName) \ | |
13 public: \ | |
14 static TypeName * Instance() { \ | |
15 static TypeName singleton; return &singleton; \ | |
16 } \ | |
17 const char* name() override { \ | |
18 return #TypeName ; \ | |
19 } \ | |
20 private: \ | |
21 TypeName() {} \ | |
22 DISALLOW_COPY_AND_ASSIGN(TypeName); | |
23 | |
24 | |
25 namespace media { | |
26 | |
27 /* | |
28 | |
29 --------------------------> Paused | |
30 | StopDone: | |
31 | ^ | | |
32 | | | | |
33 | Pause: | | Start: dec.Prefetch | |
34 | | | | |
35 | | | | |
36 | | | | |
37 | | v PrefetchDone, | |
38 | no surface: | |
39 | ------------------> Prefetching --------------> Waiting | |
40 | | for surface | |
41 | | | / | |
42 | | | / | |
43 | | StopDone w/ | / | |
44 | | pending start: | PrefetchDone: / | |
45 | | dec.Prefetch | dec.Start / | |
46 | | | / SetSurface: | |
47 | | | / dec.Start | |
48 | | | / | |
49 | | v / | |
50 | | / | |
51 | | Playing <----------/ | |
52 | | | |
53 | | | | |
54 | | | | |
55 | | | Pause: dec.RequestToStop | |
56 | | | | |
57 | | | | |
58 | | v | |
59 | | | |
60 -------------------------- Stopping | |
61 | |
62 */ | |
63 | |
64 // Implementaton of the State pattern: | |
65 // | |
66 // PlayerState is an abstract state that has virtual methods for | |
67 // every possible event. Normally these methods do nothing. | |
68 // | |
69 // Concrete states (StatePaused, StatePlaying etc.) inherit from this | |
70 // PlayerState and implement the event handlers for the events expected | |
71 // to these states. If an event handler is omitted in a concrete state, | |
72 // the PlayerState method is called which usually means empty implementation | |
73 // and the event is ignored. | |
74 | |
75 class MediaCodecPlayer; | |
76 | |
77 class MediaCodecPlayerState { | |
78 public: | |
79 virtual const char* name() = 0; | |
80 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
| |
81 virtual void EventSetVideoSurface(MediaCodecPlayer* player) {} | |
82 virtual void EventStart(MediaCodecPlayer* player) {} | |
83 virtual void EventPause(MediaCodecPlayer* player) {} | |
84 virtual void EventSeekTo(MediaCodecPlayer* player, | |
85 base::TimeDelta timestamp) {} | |
86 virtual void EventDemuxerConfigsAvailable(MediaCodecPlayer* player, | |
87 const DemuxerConfigs& params); | |
88 virtual void EventDemuxerSeekDone(MediaCodecPlayer* player) {} | |
89 virtual void EventPrefetchDone(MediaCodecPlayer* player) {} | |
90 virtual void EventStopDone(MediaCodecPlayer* player) {} | |
91 virtual void EventStarvation(MediaCodecPlayer* player) {} | |
92 virtual void EventRelease(MediaCodecPlayer* player); | |
93 virtual void EventError(MediaCodecPlayer* player); | |
94 }; | |
95 | |
96 class StatePaused : public MediaCodecPlayerState { | |
97 DEFINE_INSTANCE(StatePaused); | |
98 public: | |
99 void EventStart(MediaCodecPlayer* player) override; | |
100 }; | |
101 | |
102 class StatePrefetching : public MediaCodecPlayerState { | |
103 DEFINE_INSTANCE(StatePrefetching); | |
104 public: | |
105 void EventPause(MediaCodecPlayer* player) override; | |
106 void EventPrefetchDone(MediaCodecPlayer* player) override; | |
107 }; | |
108 | |
109 class StateWaitingForConfig : public MediaCodecPlayerState { | |
110 DEFINE_INSTANCE(StateWaitingForConfig); | |
111 public: | |
112 void EventDemuxerConfigsAvailable(MediaCodecPlayer* player, | |
113 const DemuxerConfigs& params) override; | |
114 void EventPause(MediaCodecPlayer* player) override; | |
115 }; | |
116 | |
117 class StateWaitingForSurface : public MediaCodecPlayerState { | |
118 DEFINE_INSTANCE(StateWaitingForSurface); | |
119 public: | |
120 void EventSetVideoSurface(MediaCodecPlayer* player) override; | |
121 void EventPause(MediaCodecPlayer* player) override; | |
122 }; | |
123 | |
124 class StatePlaying : public MediaCodecPlayerState { | |
125 DEFINE_INSTANCE(StatePlaying); | |
126 public: | |
127 void EventPause(MediaCodecPlayer* player) override; | |
128 void EventStarvation(MediaCodecPlayer* player) override; | |
129 void EventStopDone(MediaCodecPlayer* player) override; | |
130 void EventError(MediaCodecPlayer* player) override; | |
131 }; | |
132 | |
133 class StateStopping : public MediaCodecPlayerState { | |
134 DEFINE_INSTANCE(StateStopping); | |
135 public: | |
136 void EventStart(MediaCodecPlayer* player) override; | |
137 void EventStopDone(MediaCodecPlayer* player) override; | |
138 }; | |
139 | |
140 class StateWaitingForSeek : public MediaCodecPlayerState { | |
141 DEFINE_INSTANCE(StateWaitingForSeek); | |
142 public: | |
143 }; | |
144 | |
145 class StateError : public MediaCodecPlayerState { | |
146 DEFINE_INSTANCE(StateError); | |
147 public: | |
148 }; | |
149 | |
150 } // namespace media | |
151 | |
152 #endif // MEDIA_BASE_ANDROID_MEDIA_CODEC_PLAYER_STATE_H_ | |
OLD | NEW |