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

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

Issue 149215: Big media::Pipeline cleanup. (Closed)
Patch Set: Test Created 11 years, 5 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
« no previous file with comments | « media/base/pipeline.h ('k') | media/base/pipeline_impl.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2008-2009 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 <string> 10 #include <string>
11 #include <vector> 11 #include <vector>
(...skipping 13 matching lines...) Expand all
25 // Class which implements the Media::Pipeline contract. The majority of the 25 // Class which implements the Media::Pipeline contract. The majority of the
26 // actual code for this object lives in the PipelineThread class, which is 26 // actual code for this object lives in the PipelineThread class, which is
27 // responsible for actually building and running the pipeline. This object 27 // responsible for actually building and running the pipeline. This object
28 // is basically a simple container for state information, and is responsible 28 // is basically a simple container for state information, and is responsible
29 // for creating and communicating with the PipelineThread object. 29 // for creating and communicating with the PipelineThread object.
30 class PipelineImpl : public Pipeline { 30 class PipelineImpl : public Pipeline {
31 public: 31 public:
32 PipelineImpl(); 32 PipelineImpl();
33 virtual ~PipelineImpl(); 33 virtual ~PipelineImpl();
34 34
35 // Implementation of PipelineStatus methods. 35 // Pipeline implementation.
36 virtual bool IsInitialized() const;
37 virtual base::TimeDelta GetDuration() const;
38 virtual base::TimeDelta GetBufferedTime() const;
39 virtual int64 GetTotalBytes() const;
40 virtual int64 GetBufferedBytes()const;
41 virtual void GetVideoSize(size_t* width_out, size_t* height_out) const;
42 virtual float GetVolume() const;
43 virtual float GetPlaybackRate() const;
44 virtual base::TimeDelta GetTime() const;
45 virtual base::TimeDelta GetInterpolatedTime() const;
46 virtual PipelineError GetError() const;
47 virtual bool IsRendered(const std::string& major_mime_type) const;
48
49 // Implementation of Pipeline methods.
50 virtual bool Start(FilterFactory* filter_factory, 36 virtual bool Start(FilterFactory* filter_factory,
51 const std::string& url, 37 const std::string& uri,
52 PipelineCallback* start_callback); 38 PipelineCallback* start_callback);
53 virtual void Stop(); 39 virtual void Stop();
54 virtual void SetPlaybackRate(float rate); 40 virtual void Seek(base::TimeDelta time, PipelineCallback* seek_callback);
55 virtual void Seek(base::TimeDelta time, 41 virtual bool IsInitialized() const;
56 PipelineCallback* seek_callback); 42 virtual bool IsRendered(const std::string& major_mime_type) const;
43 virtual float GetPlaybackRate() const;
44 virtual void SetPlaybackRate(float playback_rate);
45 virtual float GetVolume() const;
57 virtual void SetVolume(float volume); 46 virtual void SetVolume(float volume);
47 virtual base::TimeDelta GetTime() const;
48 virtual base::TimeDelta GetBufferedTime() const;
49 virtual base::TimeDelta GetDuration() const;
50 virtual int64 GetBufferedBytes() const;
51 virtual int64 GetTotalBytes() const;
52 virtual void GetVideoSize(size_t* width_out, size_t* height_out) const;
53 virtual PipelineError GetError() const;
58 54
59 private: 55 private:
60 friend class FilterHostImpl; 56 friend class FilterHostImpl;
61 friend class PipelineThread; 57 friend class PipelineThread;
62 58
63 // Reset the state of the pipeline object to the initial state. This method 59 // Reset the state of the pipeline object to the initial state. This method
64 // is used by the constructor, and the Stop method. 60 // is used by the constructor, and the Stop method.
65 void ResetState(); 61 void ResetState();
66 62
67 // Used internally to make sure that the thread is in a state that is 63 // Used internally to make sure that the thread is in a state that is
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 106
111 // Amount of available buffered data. Set by a FilterHostImpl object 107 // Amount of available buffered data. Set by a FilterHostImpl object
112 // on behalf of a filter. 108 // on behalf of a filter.
113 int64 buffered_bytes_; 109 int64 buffered_bytes_;
114 110
115 // Total size of the media. Set by a FilterHostImpl object on behalf 111 // Total size of the media. Set by a FilterHostImpl object on behalf
116 // of a filter. 112 // of a filter.
117 int64 total_bytes_; 113 int64 total_bytes_;
118 114
119 // Lock used to serialize access for getter/setter methods. 115 // Lock used to serialize access for getter/setter methods.
120 Lock lock_; 116 mutable Lock lock_;
121 117
122 // Video width and height. Set by a FilterHostImpl object on behalf 118 // Video width and height. Set by a FilterHostImpl object on behalf
123 // of a filter. The video_size_access_lock_ is used to make sure access 119 // of a filter. The video_size_access_lock_ is used to make sure access
124 // to the pair of width and height are modified or read in thread safe way. 120 // to the pair of width and height are modified or read in thread safe way.
125 size_t video_width_; 121 size_t video_width_;
126 size_t video_height_; 122 size_t video_height_;
127 123
128 // Current volume level (from 0.0f to 1.0f). The volume reflects the last 124 // Current volume level (from 0.0f to 1.0f). The volume reflects the last
129 // value the audio filter was called with SetVolume, so there will be a short 125 // value the audio filter was called with SetVolume, so there will be a short
130 // period of time between the client calling SetVolume on the pipeline and 126 // period of time between the client calling SetVolume on the pipeline and
131 // this value being updated. Set by the PipelineThread just prior to calling 127 // this value being updated. Set by the PipelineThread just prior to calling
132 // the audio renderer. 128 // the audio renderer.
133 float volume_; 129 float volume_;
134 130
135 // Current playback rate (>= 0.0f). This member reflects the last value 131 // Current playback rate (>= 0.0f). This member reflects the last value
136 // that the filters in the pipeline were called with, so there will be a short 132 // that the filters in the pipeline were called with, so there will be a short
137 // period of time between the client calling SetPlaybackRate and this value 133 // period of time between the client calling SetPlaybackRate and this value
138 // being updated. Set by the PipelineThread just prior to calling filters. 134 // being updated. Set by the PipelineThread just prior to calling filters.
139 float playback_rate_; 135 float playback_rate_;
140 136
141 // Current playback time. Set by a FilterHostImpl object on behalf of the 137 // Current playback time. Set by a FilterHostImpl object on behalf of the
142 // audio renderer filter. 138 // audio renderer filter.
143 base::TimeDelta time_; 139 base::TimeDelta time_;
144 140
145 // Internal system timer at last time the SetTime method was called. Used to
146 // compute interpolated time.
147 base::TimeTicks ticks_at_last_set_time_;
148
149 // Status of the pipeline. Initialized to PIPELINE_OK which indicates that 141 // Status of the pipeline. Initialized to PIPELINE_OK which indicates that
150 // the pipeline is operating correctly. Any other value indicates that the 142 // the pipeline is operating correctly. Any other value indicates that the
151 // pipeline is stopped or is stopping. Clients can call the Stop method to 143 // pipeline is stopped or is stopping. Clients can call the Stop method to
152 // reset the pipeline state, and restore this to PIPELINE_OK. 144 // reset the pipeline state, and restore this to PIPELINE_OK.
153 PipelineError error_; 145 PipelineError error_;
154 146
155 // Vector of major mime types that have been rendered by this pipeline. 147 // Vector of major mime types that have been rendered by this pipeline.
156 typedef std::set<std::string> RenderedMimeTypesSet; 148 typedef std::set<std::string> RenderedMimeTypesSet;
157 RenderedMimeTypesSet rendered_mime_types_; 149 RenderedMimeTypesSet rendered_mime_types_;
158 150
(...skipping 29 matching lines...) Expand all
188 // pipeline thread. For example, Seek posts a task to call SeekTask. 180 // pipeline thread. For example, Seek posts a task to call SeekTask.
189 explicit PipelineThread(PipelineImpl* pipeline); 181 explicit PipelineThread(PipelineImpl* pipeline);
190 182
191 // After Start() is called, a task of StartTask() is posted on the pipeline 183 // After Start() is called, a task of StartTask() is posted on the pipeline
192 // thread to perform initialization. See StartTask() to learn more about 184 // thread to perform initialization. See StartTask() to learn more about
193 // initialization. 185 // initialization.
194 bool Start(FilterFactory* filter_factory, 186 bool Start(FilterFactory* filter_factory,
195 const std::string& url_media_source, 187 const std::string& url_media_source,
196 PipelineCallback* init_complete_callback); 188 PipelineCallback* init_complete_callback);
197 void Stop(); 189 void Stop();
190 void Seek(base::TimeDelta time, PipelineCallback* seek_callback);
198 void SetPlaybackRate(float rate); 191 void SetPlaybackRate(float rate);
199 void Seek(base::TimeDelta time, PipelineCallback* seek_callback);
200 void SetVolume(float volume); 192 void SetVolume(float volume);
201 193
202 // Methods called by a FilterHostImpl object. These methods may be called 194 // Methods called by a FilterHostImpl object. These methods may be called
203 // on any thread, either the pipeline's thread or any other. 195 // on any thread, either the pipeline's thread or any other.
204 196
205 // When a filter calls it's FilterHost, the filter host calls back to the 197 // When a filter calls it's FilterHost, the filter host calls back to the
206 // pipeline thread. If the pipeline thread is running a nested message loop 198 // pipeline thread. If the pipeline thread is running a nested message loop
207 // then it will be exited. 199 // then it will be exited.
208 void InitializationComplete(FilterHostImpl* host); 200 void InitializationComplete(FilterHostImpl* host);
209 201
210 // Sets the pipeline time and schedules a task to call back to any filters 202 // Sets the pipeline time and schedules a task to call back to any filters
211 // that have registered a time update callback. 203 // that have registered a time update callback.
212 void SetTime(base::TimeDelta time); 204 void SetTime(base::TimeDelta time);
213 205
214 // Called by a FilterHostImpl on behalf of a filter calling FilterHost::Error. 206 // Called by a FilterHostImpl on behalf of a filter calling FilterHost::Error.
215 // If the pipeline is running a nested message loop, it will be exited. 207 // If the pipeline is running a nested message loop, it will be exited.
216 void Error(PipelineError error); 208 void Error(PipelineError error);
217 209
218 // Called by a FilterHostImpl on behalf of a filter that calls the
219 // FilterHost::PostTask method.
220 void PostTask(Task* task);
221
222 // Simple accessor used by the FilterHostImpl class to get access to the 210 // Simple accessor used by the FilterHostImpl class to get access to the
223 // pipeline object. 211 // pipeline object.
224 PipelineImpl* pipeline() const { return pipeline_; } 212 PipelineImpl* pipeline() const { return pipeline_; }
225 213
226 // Accessor used to post messages to thread's message loop. 214 // Accessor used to post messages to thread's message loop.
227 MessageLoop* message_loop() const { return thread_.message_loop(); } 215 MessageLoop* message_loop() const { return thread_.message_loop(); }
228 216
229 // Accessor used by PipelineImpl to check if we're executing on the pipeline 217 // Accessor used by PipelineImpl to check if we're executing on the pipeline
230 // thread. 218 // thread.
231 PlatformThreadId thread_id() const { return thread_.thread_id(); } 219 PlatformThreadId thread_id() const { return thread_.thread_id(); }
232 220
233 private: 221 private:
222 // Only allow ourselves to be destroyed via ref-counting.
223 friend class base::RefCountedThreadSafe<PipelineThread>;
224 virtual ~PipelineThread();
225
234 enum State { 226 enum State {
235 kCreated, 227 kCreated,
236 kInitDataSource, 228 kInitDataSource,
237 kInitDemuxer, 229 kInitDemuxer,
238 kInitAudioDecoder, 230 kInitAudioDecoder,
239 kInitAudioRenderer, 231 kInitAudioRenderer,
240 kInitVideoDecoder, 232 kInitVideoDecoder,
241 kInitVideoRenderer, 233 kInitVideoRenderer,
242 kStarted, 234 kStarted,
243 kStopped, 235 kStopped,
244 kError, 236 kError,
245 }; 237 };
246 238
247 // Implementation of MessageLoop::DestructionObserver. StartTask registers
248 // this class as a destruction observer on the thread's message loop.
249 // It is used to destroy the list of FilterHosts
250 // (and thus destroy the associated filters) when all tasks have been
251 // processed and the message loop has been quit.
252 virtual void WillDestroyCurrentMessageLoop();
253
254 friend class base::RefCountedThreadSafe<PipelineThread>;
255 virtual ~PipelineThread();
256
257 // Simple method used to make sure the pipeline is running normally. 239 // Simple method used to make sure the pipeline is running normally.
258 bool IsPipelineOk() { return PIPELINE_OK == pipeline_->error_; } 240 bool IsPipelineOk() { return PIPELINE_OK == pipeline_->error_; }
259 241
260 // Helper method to tell whether we are in the state of initializing. 242 // Helper method to tell whether we are in the state of initializing.
261 bool IsPipelineInitializing() { 243 bool IsPipelineInitializing() {
262 return state_ == kInitDataSource || 244 return state_ == kInitDataSource ||
263 state_ == kInitDemuxer || 245 state_ == kInitDemuxer ||
264 state_ == kInitAudioDecoder || 246 state_ == kInitAudioDecoder ||
265 state_ == kInitAudioRenderer || 247 state_ == kInitAudioRenderer ||
266 state_ == kInitVideoDecoder || 248 state_ == kInitVideoDecoder ||
267 state_ == kInitVideoRenderer; 249 state_ == kInitVideoRenderer;
268 } 250 }
269 251
252 // Implementation of MessageLoop::DestructionObserver. StartTask registers
253 // this class as a destruction observer on the thread's message loop.
254 // It is used to destroy the list of FilterHosts
255 // (and thus destroy the associated filters) when all tasks have been
256 // processed and the message loop has been quit.
257 virtual void WillDestroyCurrentMessageLoop();
258
270 // The following "task" methods correspond to the public methods, but these 259 // The following "task" methods correspond to the public methods, but these
271 // methods are run as the result of posting a task to the PipelineThread's 260 // methods are run as the result of posting a task to the PipelineThread's
272 // message loop. 261 // message loop.
273 262
274 // StartTask() is a special task that performs initialization in multiple 263 // StartTask() is a special task that performs initialization in multiple
275 // passes. It is executed as a result of calling Start() or 264 // passes. It is executed as a result of calling Start() or
276 // InitializationComplete() that advances initialization to the next state. It 265 // InitializationComplete() that advances initialization to the next state. It
277 // works as a hub of state transition for initialization. 266 // works as a hub of state transition for initialization.
278 void StartTask(); 267 void StartTask();
279 void StopTask(); 268 void StopTask();
280 void SetPlaybackRateTask(float rate); 269 void SetPlaybackRateTask(float rate);
281 void SeekTask(base::TimeDelta time, PipelineCallback* seek_callback); 270 void SeekTask(base::TimeDelta time, PipelineCallback* seek_callback);
282 void SetVolumeTask(float volume); 271 void SetVolumeTask(float volume);
283 void SetTimeTask();
284 272
285 // Internal methods used in the implementation of the pipeline thread. All 273 // Internal methods used in the implementation of the pipeline thread. All
286 // of these methods are only called on the pipeline thread. 274 // of these methods are only called on the pipeline thread.
287 275
288 // Calls the Stop method on every filter in the pipeline
289 void StopFilters();
290
291 // The following template functions make use of the fact that media filter 276 // The following template functions make use of the fact that media filter
292 // derived interfaces are self-describing in the sense that they all contain 277 // derived interfaces are self-describing in the sense that they all contain
293 // the static method filter_type() which returns a FilterType enum that 278 // the static method filter_type() which returns a FilterType enum that
294 // uniquely identifies the filter's interface. In addition, filters that are 279 // uniquely identifies the filter's interface. In addition, filters that are
295 // specific to audio or video also support a static method major_mime_type() 280 // specific to audio or video also support a static method major_mime_type()
296 // which returns a string of "audio/" or "video/". 281 // which returns a string of "audio/" or "video/".
297 // 282 //
298 // Uses the FilterFactory to create a new filter of the Filter class, and 283 // Uses the FilterFactory to create a new filter of the Filter class, and
299 // initializes it using the Source object. The source may be another filter 284 // initializes it using the Source object. The source may be another filter
300 // or it could be a string in the case of a DataSource. 285 // or it could be a string in the case of a DataSource.
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
383 368
384 typedef std::vector<base::Thread*> FilterThreadVector; 369 typedef std::vector<base::Thread*> FilterThreadVector;
385 FilterThreadVector filter_threads_; 370 FilterThreadVector filter_threads_;
386 371
387 DISALLOW_COPY_AND_ASSIGN(PipelineThread); 372 DISALLOW_COPY_AND_ASSIGN(PipelineThread);
388 }; 373 };
389 374
390 } // namespace media 375 } // namespace media
391 376
392 #endif // MEDIA_BASE_PIPELINE_IMPL_H_ 377 #endif // MEDIA_BASE_PIPELINE_IMPL_H_
OLDNEW
« no previous file with comments | « media/base/pipeline.h ('k') | media/base/pipeline_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698