OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 & PipelineStatusNotification (an async-to-sync | 5 // Implementation of Pipeline & PipelineStatusNotification (an async-to-sync |
6 // callback adapter). | 6 // callback adapter). |
7 | 7 |
8 #ifndef MEDIA_BASE_PIPELINE_IMPL_H_ | 8 #ifndef MEDIA_BASE_PIPELINE_IMPL_H_ |
9 #define MEDIA_BASE_PIPELINE_IMPL_H_ | 9 #define MEDIA_BASE_PIPELINE_IMPL_H_ |
10 | 10 |
(...skipping 21 matching lines...) Expand all Loading... |
32 // |Callback()| to the Pipeline method requiring a callback. Then Wait() for | 32 // |Callback()| to the Pipeline method requiring a callback. Then Wait() for |
33 // the callback to get fired and call status() to see what the callback's | 33 // the callback to get fired and call status() to see what the callback's |
34 // argument was. This object is for one-time use; call |Callback()| exactly | 34 // argument was. This object is for one-time use; call |Callback()| exactly |
35 // once. | 35 // once. |
36 class PipelineStatusNotification { | 36 class PipelineStatusNotification { |
37 public: | 37 public: |
38 PipelineStatusNotification(); | 38 PipelineStatusNotification(); |
39 ~PipelineStatusNotification(); | 39 ~PipelineStatusNotification(); |
40 | 40 |
41 // See class-level comment for usage. | 41 // See class-level comment for usage. |
42 media::PipelineStatusCallback* Callback(); | 42 PipelineStatusCB Callback(); |
43 void Notify(media::PipelineStatus status); | |
44 void Wait(); | 43 void Wait(); |
45 media::PipelineStatus status(); | 44 PipelineStatus status(); |
46 | 45 |
47 private: | 46 private: |
| 47 void Notify(media::PipelineStatus status); |
| 48 |
48 base::Lock lock_; | 49 base::Lock lock_; |
49 base::ConditionVariable cv_; | 50 base::ConditionVariable cv_; |
50 media::PipelineStatus status_; | 51 media::PipelineStatus status_; |
51 bool notified_; | 52 bool notified_; |
52 scoped_ptr<media::PipelineStatusCallback> callback_; | |
53 | 53 |
54 DISALLOW_COPY_AND_ASSIGN(PipelineStatusNotification); | 54 DISALLOW_COPY_AND_ASSIGN(PipelineStatusNotification); |
55 }; | 55 }; |
56 | 56 |
57 // PipelineImpl runs the media pipeline. Filters are created and called on the | 57 // PipelineImpl runs the media pipeline. Filters are created and called on the |
58 // message loop injected into this object. PipelineImpl works like a state | 58 // message loop injected into this object. PipelineImpl works like a state |
59 // machine to perform asynchronous initialization, pausing, seeking and playing. | 59 // machine to perform asynchronous initialization, pausing, seeking and playing. |
60 // | 60 // |
61 // Here's a state diagram that describes the lifetime of this object. | 61 // Here's a state diagram that describes the lifetime of this object. |
62 // | 62 // |
(...skipping 26 matching lines...) Expand all Loading... |
89 // playing the media. | 89 // playing the media. |
90 // | 90 // |
91 // If any error ever happens, this object will transition to the "Error" state | 91 // If any error ever happens, this object will transition to the "Error" state |
92 // from any state. If Stop() is ever called, this object will transition to | 92 // from any state. If Stop() is ever called, this object will transition to |
93 // "Stopped" state. | 93 // "Stopped" state. |
94 class PipelineImpl : public Pipeline, public FilterHost { | 94 class PipelineImpl : public Pipeline, public FilterHost { |
95 public: | 95 public: |
96 explicit PipelineImpl(MessageLoop* message_loop); | 96 explicit PipelineImpl(MessageLoop* message_loop); |
97 | 97 |
98 // Pipeline implementation. | 98 // Pipeline implementation. |
99 virtual void Init(PipelineStatusCallback* ended_callback, | 99 virtual void Init(const PipelineStatusCB& ended_callback, |
100 PipelineStatusCallback* error_callback, | 100 const PipelineStatusCB& error_callback, |
101 PipelineStatusCallback* network_callback); | 101 const PipelineStatusCB& network_callback); |
102 virtual bool Start(FilterCollection* filter_collection, | 102 virtual bool Start(FilterCollection* filter_collection, |
103 const std::string& uri, | 103 const std::string& uri, |
104 PipelineStatusCallback* start_callback); | 104 const PipelineStatusCB& start_callback); |
105 virtual void Stop(PipelineStatusCallback* stop_callback); | 105 virtual void Stop(const PipelineStatusCB& stop_callback); |
106 virtual void Seek(base::TimeDelta time, | 106 virtual void Seek(base::TimeDelta time, |
107 PipelineStatusCallback* seek_callback); | 107 const PipelineStatusCB& seek_callback); |
108 virtual bool IsRunning() const; | 108 virtual bool IsRunning() const; |
109 virtual bool IsInitialized() const; | 109 virtual bool IsInitialized() const; |
110 virtual bool IsNetworkActive() const; | 110 virtual bool IsNetworkActive() const; |
111 virtual bool HasAudio() const; | 111 virtual bool HasAudio() const; |
112 virtual bool HasVideo() const; | 112 virtual bool HasVideo() const; |
113 virtual float GetPlaybackRate() const; | 113 virtual float GetPlaybackRate() const; |
114 virtual void SetPlaybackRate(float playback_rate); | 114 virtual void SetPlaybackRate(float playback_rate); |
115 virtual float GetVolume() const; | 115 virtual float GetVolume() const; |
116 virtual void SetVolume(float volume); | 116 virtual void SetVolume(float volume); |
117 virtual void SetPreload(Preload preload); | 117 virtual void SetPreload(Preload preload); |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
215 void OnTeardownStateTransition(); | 215 void OnTeardownStateTransition(); |
216 | 216 |
217 // Callback executed by filters to update statistics. | 217 // Callback executed by filters to update statistics. |
218 void OnUpdateStatistics(const PipelineStatistics& stats); | 218 void OnUpdateStatistics(const PipelineStatistics& stats); |
219 | 219 |
220 // The following "task" methods correspond to the public methods, but these | 220 // The following "task" methods correspond to the public methods, but these |
221 // methods are run as the result of posting a task to the PipelineInternal's | 221 // methods are run as the result of posting a task to the PipelineInternal's |
222 // message loop. | 222 // message loop. |
223 void StartTask(FilterCollection* filter_collection, | 223 void StartTask(FilterCollection* filter_collection, |
224 const std::string& url, | 224 const std::string& url, |
225 PipelineStatusCallback* start_callback); | 225 const PipelineStatusCB& start_callback); |
226 | 226 |
227 // InitializeTask() performs initialization in multiple passes. It is executed | 227 // InitializeTask() performs initialization in multiple passes. It is executed |
228 // as a result of calling Start() or InitializationComplete() that advances | 228 // as a result of calling Start() or InitializationComplete() that advances |
229 // initialization to the next state. It works as a hub of state transition for | 229 // initialization to the next state. It works as a hub of state transition for |
230 // initialization. | 230 // initialization. |
231 void InitializeTask(); | 231 void InitializeTask(); |
232 | 232 |
233 // Stops and destroys all filters, placing the pipeline in the kStopped state. | 233 // Stops and destroys all filters, placing the pipeline in the kStopped state. |
234 void StopTask(PipelineStatusCallback* stop_callback); | 234 void StopTask(const PipelineStatusCB& stop_callback); |
235 | 235 |
236 // Carries out stopping and destroying all filters, placing the pipeline in | 236 // Carries out stopping and destroying all filters, placing the pipeline in |
237 // the kError state. | 237 // the kError state. |
238 void ErrorChangedTask(PipelineStatus error); | 238 void ErrorChangedTask(PipelineStatus error); |
239 | 239 |
240 // Carries out notifying filters that the playback rate has changed. | 240 // Carries out notifying filters that the playback rate has changed. |
241 void PlaybackRateChangedTask(float playback_rate); | 241 void PlaybackRateChangedTask(float playback_rate); |
242 | 242 |
243 // Carries out notifying filters that the volume has changed. | 243 // Carries out notifying filters that the volume has changed. |
244 void VolumeChangedTask(float volume); | 244 void VolumeChangedTask(float volume); |
245 | 245 |
246 // Returns media preload value. | 246 // Returns media preload value. |
247 virtual Preload GetPreload() const; | 247 virtual Preload GetPreload() const; |
248 | 248 |
249 // Carries out notifying filters that the preload value has changed. | 249 // Carries out notifying filters that the preload value has changed. |
250 void PreloadChangedTask(Preload preload); | 250 void PreloadChangedTask(Preload preload); |
251 | 251 |
252 // Carries out notifying filters that we are seeking to a new timestamp. | 252 // Carries out notifying filters that we are seeking to a new timestamp. |
253 void SeekTask(base::TimeDelta time, PipelineStatusCallback* seek_callback); | 253 void SeekTask(base::TimeDelta time, const PipelineStatusCB& seek_callback); |
254 | 254 |
255 // Carries out handling a notification from a filter that it has ended. | 255 // Carries out handling a notification from a filter that it has ended. |
256 void NotifyEndedTask(); | 256 void NotifyEndedTask(); |
257 | 257 |
258 // Carries out handling a notification of network event. | 258 // Carries out handling a notification of network event. |
259 void NotifyNetworkEventTask(); | 259 void NotifyNetworkEventTask(); |
260 | 260 |
261 // Carries out disabling the audio renderer. | 261 // Carries out disabling the audio renderer. |
262 void DisableAudioRendererTask(); | 262 void DisableAudioRendererTask(); |
263 | 263 |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
422 // TODO(vrk): This is a hack. | 422 // TODO(vrk): This is a hack. |
423 base::TimeDelta max_buffered_time_; | 423 base::TimeDelta max_buffered_time_; |
424 | 424 |
425 // Filter collection as passed in by Start(). | 425 // Filter collection as passed in by Start(). |
426 scoped_ptr<FilterCollection> filter_collection_; | 426 scoped_ptr<FilterCollection> filter_collection_; |
427 | 427 |
428 // URL for the data source as passed in by Start(). | 428 // URL for the data source as passed in by Start(). |
429 std::string url_; | 429 std::string url_; |
430 | 430 |
431 // Callbacks for various pipeline operations. | 431 // Callbacks for various pipeline operations. |
432 scoped_ptr<PipelineStatusCallback> seek_callback_; | 432 PipelineStatusCB seek_callback_; |
433 scoped_ptr<PipelineStatusCallback> stop_callback_; | 433 PipelineStatusCB stop_callback_; |
434 scoped_ptr<PipelineStatusCallback> ended_callback_; | 434 PipelineStatusCB ended_callback_; |
435 scoped_ptr<PipelineStatusCallback> error_callback_; | 435 PipelineStatusCB error_callback_; |
436 scoped_ptr<PipelineStatusCallback> network_callback_; | 436 PipelineStatusCB network_callback_; |
437 | 437 |
438 // Reference to the filter(s) that constitute the pipeline. | 438 // Reference to the filter(s) that constitute the pipeline. |
439 scoped_refptr<Filter> pipeline_filter_; | 439 scoped_refptr<Filter> pipeline_filter_; |
440 | 440 |
441 // Renderer references used for setting the volume and determining | 441 // Renderer references used for setting the volume and determining |
442 // when playback has finished. | 442 // when playback has finished. |
443 scoped_refptr<AudioRenderer> audio_renderer_; | 443 scoped_refptr<AudioRenderer> audio_renderer_; |
444 scoped_refptr<VideoRenderer> video_renderer_; | 444 scoped_refptr<VideoRenderer> video_renderer_; |
445 | 445 |
446 // Demuxer reference used for setting the preload value. | 446 // Demuxer reference used for setting the preload value. |
447 scoped_refptr<Demuxer> demuxer_; | 447 scoped_refptr<Demuxer> demuxer_; |
448 | 448 |
449 // Helper class that stores filter references during pipeline | 449 // Helper class that stores filter references during pipeline |
450 // initialization. | 450 // initialization. |
451 class PipelineInitState; | 451 class PipelineInitState; |
452 scoped_ptr<PipelineInitState> pipeline_init_state_; | 452 scoped_ptr<PipelineInitState> pipeline_init_state_; |
453 | 453 |
454 // Statistics. | 454 // Statistics. |
455 PipelineStatistics statistics_; | 455 PipelineStatistics statistics_; |
456 | 456 |
457 FRIEND_TEST_ALL_PREFIXES(PipelineImplTest, GetBufferedTime); | 457 FRIEND_TEST_ALL_PREFIXES(PipelineImplTest, GetBufferedTime); |
458 | 458 |
459 DISALLOW_COPY_AND_ASSIGN(PipelineImpl); | 459 DISALLOW_COPY_AND_ASSIGN(PipelineImpl); |
460 }; | 460 }; |
461 | 461 |
462 } // namespace media | 462 } // namespace media |
463 | 463 |
464 #endif // MEDIA_BASE_PIPELINE_IMPL_H_ | 464 #endif // MEDIA_BASE_PIPELINE_IMPL_H_ |
OLD | NEW |