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

Side by Side Diff: media/base/pipeline_impl.h

Issue 2101015: Change MediaFilter::Stop() to accept a callback so that Stop() is asynchronous. (Closed) Base URL: http://src.chromium.org/git/chromium.git
Patch Set: Revert filter changes. Going to make that another patch. Created 10 years, 6 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Implementation of Pipeline. 5 // Implementation of Pipeline.
6 6
7 #ifndef MEDIA_BASE_PIPELINE_IMPL_H_ 7 #ifndef MEDIA_BASE_PIPELINE_IMPL_H_
8 #define MEDIA_BASE_PIPELINE_IMPL_H_ 8 #define MEDIA_BASE_PIPELINE_IMPL_H_
9 9
10 #include <set> 10 #include <set>
(...skipping 28 matching lines...) Expand all
39 // V | 39 // V |
40 // [ Starting (for each filter) ] | 40 // [ Starting (for each filter) ] |
41 // | | 41 // | |
42 // V Seek() | 42 // V Seek() |
43 // [ Started ] --------> [ Pausing (for each filter) ] -' 43 // [ Started ] --------> [ Pausing (for each filter) ] -'
44 // | | 44 // | |
45 // | NotifyEnded() Seek() | 45 // | NotifyEnded() Seek() |
46 // `-------------> [ Ended ] ---------------------' 46 // `-------------> [ Ended ] ---------------------'
47 // 47 //
48 // SetError() 48 // SetError()
49 // [ Any State ] -------------> [ Error ] 49 // [ Any State ] -------------> [ Stopping (for each filter)]
50 // | Stop() 50 // | Stop() |
51 // '--------------------> [ Stopped ] 51 // V V
52 // [ Stopping (for each filter) ] [ Error ]
53 // |
54 // V
55 // [ Stopped ]
52 // 56 //
53 // Initialization is a series of state transitions from "Created" through each 57 // Initialization is a series of state transitions from "Created" through each
54 // filter initialization state. When all filter initialization states have 58 // filter initialization state. When all filter initialization states have
55 // completed, we are implicitly in a "Paused" state. At that point we simulate 59 // completed, we are implicitly in a "Paused" state. At that point we simulate
56 // a Seek() to the beginning of the media to give filters a chance to preroll. 60 // a Seek() to the beginning of the media to give filters a chance to preroll.
57 // From then on the normal Seek() transitions are carried out and we start 61 // From then on the normal Seek() transitions are carried out and we start
58 // playing the media. 62 // playing the media.
59 // 63 //
60 // If any error ever happens, this object will transition to the "Error" state 64 // If any error ever happens, this object will transition to the "Error" state
61 // from any state. If Stop() is ever called, this object will transition to 65 // from any state. If Stop() is ever called, this object will transition to
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 kInitDemuxer, 112 kInitDemuxer,
109 kInitAudioDecoder, 113 kInitAudioDecoder,
110 kInitAudioRenderer, 114 kInitAudioRenderer,
111 kInitVideoDecoder, 115 kInitVideoDecoder,
112 kInitVideoRenderer, 116 kInitVideoRenderer,
113 kPausing, 117 kPausing,
114 kSeeking, 118 kSeeking,
115 kStarting, 119 kStarting,
116 kStarted, 120 kStarted,
117 kEnded, 121 kEnded,
122 kStopping,
118 kStopped, 123 kStopped,
119 kError, 124 kError,
120 }; 125 };
121 126
122 virtual ~PipelineImpl(); 127 virtual ~PipelineImpl();
123 128
124 // Reset the state of the pipeline object to the initial state. This method 129 // Reset the state of the pipeline object to the initial state. This method
125 // is used by the constructor, and the Stop() method. 130 // is used by the constructor, and the Stop() method.
126 void ResetState(); 131 void ResetState();
127 132
128 // Simple method used to make sure the pipeline is running normally. 133 // Simple method used to make sure the pipeline is running normally.
129 bool IsPipelineOk(); 134 bool IsPipelineOk();
130 135
131 // Helper method to tell whether we are in the state of initializing. 136 // Helper method to tell whether we are in the state of initializing.
132 bool IsPipelineInitializing(); 137 bool IsPipelineInitializing();
133 138
134 // Returns true if the given state is one that transitions to the started 139 // Helper method to tell whether we are stopped or in error.
135 // state. 140 bool IsPipelineStopped();
136 static bool StateTransitionsToStarted(State state); 141
142 // Helper method to execute callback from Start() and reset
143 // |filter_factory_|. Called when initialization completes
144 // normally or when pipeline is stopped or error occurs during
145 // initialization.
146 void FinishInitialization();
147
148 // Returns true if the given state is one that transitions to a new state
149 // after iterating through each filter.
150 static bool TransientState(State state);
137 151
138 // Given the current state, returns the next state. 152 // Given the current state, returns the next state.
139 static State FindNextState(State current); 153 static State FindNextState(State current);
140 154
141 // FilterHost implementation. 155 // FilterHost implementation.
142 virtual void SetError(PipelineError error); 156 virtual void SetError(PipelineError error);
143 virtual base::TimeDelta GetTime() const; 157 virtual base::TimeDelta GetTime() const;
144 virtual base::TimeDelta GetDuration() const; 158 virtual base::TimeDelta GetDuration() const;
145 virtual void SetTime(base::TimeDelta time); 159 virtual void SetTime(base::TimeDelta time);
146 virtual void SetDuration(base::TimeDelta duration); 160 virtual void SetDuration(base::TimeDelta duration);
(...skipping 12 matching lines...) Expand all
159 // Method called during initialization to insert a mime type into the 173 // Method called during initialization to insert a mime type into the
160 // |rendered_mime_types_| set. 174 // |rendered_mime_types_| set.
161 void InsertRenderedMimeType(const std::string& major_mime_type); 175 void InsertRenderedMimeType(const std::string& major_mime_type);
162 176
163 // Method called during initialization to determine if we rendered anything. 177 // Method called during initialization to determine if we rendered anything.
164 bool HasRenderedMimeTypes() const; 178 bool HasRenderedMimeTypes() const;
165 179
166 // Callback executed by filters upon completing initialization. 180 // Callback executed by filters upon completing initialization.
167 void OnFilterInitialize(); 181 void OnFilterInitialize();
168 182
169 // Callback executed by filters upon completing Play(), Pause() or Seek(). 183 // Callback executed by filters upon completing Play(), Pause(), Seek(),
184 // or Stop().
170 void OnFilterStateTransition(); 185 void OnFilterStateTransition();
171 186
172 // The following "task" methods correspond to the public methods, but these 187 // The following "task" methods correspond to the public methods, but these
173 // methods are run as the result of posting a task to the PipelineInternal's 188 // methods are run as the result of posting a task to the PipelineInternal's
174 // message loop. 189 // message loop.
175 void StartTask(FilterFactory* filter_factory, 190 void StartTask(FilterFactory* filter_factory,
176 const std::string& url, 191 const std::string& url,
177 PipelineCallback* start_callback); 192 PipelineCallback* start_callback);
178 193
179 // InitializeTask() performs initialization in multiple passes. It is executed 194 // InitializeTask() performs initialization in multiple passes. It is executed
180 // as a result of calling Start() or InitializationComplete() that advances 195 // as a result of calling Start() or InitializationComplete() that advances
181 // initialization to the next state. It works as a hub of state transition for 196 // initialization to the next state. It works as a hub of state transition for
182 // initialization. 197 // initialization.
183 void InitializeTask(); 198 void InitializeTask();
184 199
185 // Stops and destroys all filters, placing the pipeline in the kStopped state 200 // Stops and destroys all filters, placing the pipeline in the kStopped state.
186 // and setting the error code to PIPELINE_STOPPED.
187 void StopTask(PipelineCallback* stop_callback); 201 void StopTask(PipelineCallback* stop_callback);
188 202
189 // Carries out stopping and destroying all filters, placing the pipeline in 203 // Carries out stopping and destroying all filters, placing the pipeline in
190 // the kError state. 204 // the kError state.
191 void ErrorChangedTask(PipelineError error); 205 void ErrorChangedTask(PipelineError error);
192 206
193 // Carries out notifying filters that the playback rate has changed. 207 // Carries out notifying filters that the playback rate has changed.
194 void PlaybackRateChangedTask(float playback_rate); 208 void PlaybackRateChangedTask(float playback_rate);
195 209
196 // Carries out notifying filters that the volume has changed. 210 // Carries out notifying filters that the volume has changed.
197 void VolumeChangedTask(float volume); 211 void VolumeChangedTask(float volume);
198 212
199 // Carries out notifying filters that we are seeking to a new timestamp. 213 // Carries out notifying filters that we are seeking to a new timestamp.
200 void SeekTask(base::TimeDelta time, PipelineCallback* seek_callback); 214 void SeekTask(base::TimeDelta time, PipelineCallback* seek_callback);
201 215
202 // Carries out handling a notification from a filter that it has ended. 216 // Carries out handling a notification from a filter that it has ended.
203 void NotifyEndedTask(); 217 void NotifyEndedTask();
204 218
205 // Carries out handling a notification of network event. 219 // Carries out handling a notification of network event.
206 void NotifyNetworkEventTask(); 220 void NotifyNetworkEventTask();
207 221
208 // Carries out disabling the audio renderer. 222 // Carries out disabling the audio renderer.
209 void DisableAudioRendererTask(); 223 void DisableAudioRendererTask();
210 224
211 // Carries out advancing to the next filter during Play()/Pause()/Seek(). 225 // Carries out advancing to the next filter during Play()/Pause()/Seek().
212 void FilterStateTransitionTask(); 226 void FilterStateTransitionTask();
213 227
228 // Carries out stopping filter threads, deleting filters, running
229 // appropriate callbacks, and setting the appropriate pipeline state
230 // depending on whether we performing Stop() or SetError().
231 // Called after all filters have been stopped.
232 void FinishDestroyingFiltersTask();
233
214 // Internal methods used in the implementation of the pipeline thread. All 234 // Internal methods used in the implementation of the pipeline thread. All
215 // of these methods are only called on the pipeline thread. 235 // of these methods are only called on the pipeline thread.
216 236
217 // The following template functions make use of the fact that media filter 237 // The following template functions make use of the fact that media filter
218 // derived interfaces are self-describing in the sense that they all contain 238 // derived interfaces are self-describing in the sense that they all contain
219 // the static method filter_type() which returns a FilterType enum that 239 // the static method filter_type() which returns a FilterType enum that
220 // uniquely identifies the filter's interface. In addition, filters that are 240 // uniquely identifies the filter's interface. In addition, filters that are
221 // specific to audio or video also support a static method major_mime_type() 241 // specific to audio or video also support a static method major_mime_type()
222 // which returns a string of "audio/" or "video/". 242 // which returns a string of "audio/" or "video/".
223 // 243 //
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
266 // stream does not exist. 286 // stream does not exist.
267 template <class Decoder, class Renderer> 287 template <class Decoder, class Renderer>
268 bool CreateRenderer(); 288 bool CreateRenderer();
269 289
270 // Examine the list of existing filters to find one that supports the 290 // Examine the list of existing filters to find one that supports the
271 // specified Filter interface. If one exists, the |filter_out| will contain 291 // specified Filter interface. If one exists, the |filter_out| will contain
272 // the filter, |*filter_out| will be NULL. 292 // the filter, |*filter_out| will be NULL.
273 template <class Filter> 293 template <class Filter>
274 void GetFilter(scoped_refptr<Filter>* filter_out) const; 294 void GetFilter(scoped_refptr<Filter>* filter_out) const;
275 295
276 // Stops every filters, filter host and filter thread and releases all 296 // Kicks off stopping filters. Called by StopTask() and ErrorChangedTask().
277 // references to them. 297 void StartDestroyingFilters();
278 void DestroyFilters();
279 298
280 // Message loop used to execute pipeline tasks. 299 // Message loop used to execute pipeline tasks.
281 MessageLoop* message_loop_; 300 MessageLoop* message_loop_;
282 301
283 // Lock used to serialize access for the following data members. 302 // Lock used to serialize access for the following data members.
284 mutable Lock lock_; 303 mutable Lock lock_;
285 304
286 // Whether or not the pipeline is running. 305 // Whether or not the pipeline is running.
287 bool running_; 306 bool running_;
288 307
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
392 // Vector of threads owned by the pipeline and being used by filters. 411 // Vector of threads owned by the pipeline and being used by filters.
393 typedef std::vector<base::Thread*> FilterThreadVector; 412 typedef std::vector<base::Thread*> FilterThreadVector;
394 FilterThreadVector filter_threads_; 413 FilterThreadVector filter_threads_;
395 414
396 DISALLOW_COPY_AND_ASSIGN(PipelineImpl); 415 DISALLOW_COPY_AND_ASSIGN(PipelineImpl);
397 }; 416 };
398 417
399 } // namespace media 418 } // namespace media
400 419
401 #endif // MEDIA_BASE_PIPELINE_IMPL_H_ 420 #endif // MEDIA_BASE_PIPELINE_IMPL_H_
OLDNEW
« no previous file with comments | « media/base/pipeline.h ('k') | media/base/pipeline_impl.cc » ('j') | media/base/pipeline_impl.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698