Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #ifndef MEDIA_BASE_PIPELINE_H_ | 5 #ifndef MEDIA_BASE_PIPELINE_H_ |
| 6 #define MEDIA_BASE_PIPELINE_H_ | 6 #define MEDIA_BASE_PIPELINE_H_ |
| 7 | 7 |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/gtest_prod_util.h" | 10 #include "base/gtest_prod_util.h" |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 53 void Notify(media::PipelineStatus status); | 53 void Notify(media::PipelineStatus status); |
| 54 | 54 |
| 55 base::Lock lock_; | 55 base::Lock lock_; |
| 56 base::ConditionVariable cv_; | 56 base::ConditionVariable cv_; |
| 57 media::PipelineStatus status_; | 57 media::PipelineStatus status_; |
| 58 bool notified_; | 58 bool notified_; |
| 59 | 59 |
| 60 DISALLOW_COPY_AND_ASSIGN(PipelineStatusNotification); | 60 DISALLOW_COPY_AND_ASSIGN(PipelineStatusNotification); |
| 61 }; | 61 }; |
| 62 | 62 |
| 63 // Pipeline runs the media pipeline. Filters are created and called on the | 63 // Pipeline runs the media pipeline. Filters are created and called on the |
|
Ami GONE FROM CHROMIUM
2012/07/30 04:06:21
The sentence starting with "Filters" is a lie.
IWB
| |
| 64 // message loop injected into this object. Pipeline works like a state | 64 // message loop injected into this object. Pipeline works like a state |
| 65 // machine to perform asynchronous initialization, pausing, seeking and playing. | 65 // machine to perform asynchronous initialization, pausing, seeking and playing. |
| 66 // | 66 // |
| 67 // Here's a state diagram that describes the lifetime of this object. | 67 // kCreated (from any state) |
| 68 // | 68 // | Start() | Stop()/SetError() |
| 69 // [ *Created ] [ Stopped ] | 69 // V V |
| 70 // | Start() ^ | 70 // kInitXXX (for each component) kStopping |
| 71 // V SetError() | | 71 // | | |
| 72 // [ InitXXX (for each filter) ] -------->[ Stopping (for each filter) ] | 72 // V V |
| 73 // | ^ | 73 // kSeeking <-------------. kStopped |
| 74 // V | if Stop | 74 // | | |
| 75 // [ Seeking (for each filter) ] <--------[ Flushing (for each filter) ] | 75 // V | |
| 76 // | if Seek ^ | 76 // kStarting kFlushing |
| 77 // V | | 77 // | ^ |
| 78 // [ Starting (for each filter) ] | | 78 // V Seek() | |
| 79 // | | | 79 // kStarted ---------> kPausing |
|
Ami GONE FROM CHROMIUM
2012/07/30 04:06:21
The fact that most states have a single ingress ed
| |
| 80 // V Seek()/Stop() | | |
| 81 // [ Started ] -------------------------> [ Pausing (for each filter) ] | |
| 82 // | ^ | |
| 83 // | OnRendererEnded() Seek()/Stop() | | |
| 84 // `-------------> [ Ended ] ---------------------' | |
| 85 // ^ SetError() | |
| 86 // | | |
| 87 // [ Any State Other Than InitXXX ] | |
| 88 | |
| 89 // | 80 // |
| 90 // Initialization is a series of state transitions from "Created" through each | 81 // Initialization is a series of state transitions from "Created" through each |
| 91 // filter initialization state. When all filter initialization states have | 82 // filter initialization state. When all filter initialization states have |
| 92 // completed, we are implicitly in a "Paused" state. At that point we simulate | 83 // completed, we are implicitly in a "Paused" state. At that point we simulate |
| 93 // a Seek() to the beginning of the media to give filters a chance to preroll. | 84 // a Seek() to the beginning of the media to give filters a chance to preroll. |
| 94 // From then on the normal Seek() transitions are carried out and we start | 85 // From then on the normal Seek() transitions are carried out and we start |
| 95 // playing the media. | 86 // playing the media. |
| 96 // | 87 // |
| 97 // If any error ever happens, this object will transition to the "Error" state | 88 // If Stop() is invoked or an error occurs during any point in time, the |
| 98 // from any state. If Stop() is ever called, this object will transition to | 89 // pipeline will transition to a stopped state. |
|
Ami GONE FROM CHROMIUM
2012/07/30 04:06:21
s/stopped/(terminal) stopped/
| |
| 99 // "Stopped" state. | |
| 100 class MEDIA_EXPORT Pipeline | 90 class MEDIA_EXPORT Pipeline |
| 101 : public base::RefCountedThreadSafe<Pipeline>, | 91 : public base::RefCountedThreadSafe<Pipeline>, |
| 102 public DemuxerHost { | 92 public DemuxerHost { |
| 103 public: | 93 public: |
| 104 // Constructs a media pipeline that will execute on |message_loop|. | 94 // Constructs a media pipeline that will execute on |message_loop|. |
| 105 Pipeline(MessageLoop* message_loop, MediaLog* media_log); | 95 Pipeline(MessageLoop* message_loop, MediaLog* media_log); |
| 106 | 96 |
| 107 // Build a pipeline to using the given filter collection to construct a filter | 97 // Build a pipeline to using the given filter collection to construct a filter |
| 108 // chain. | 98 // chain. |
| 109 // | 99 // |
| 110 // Pipeline initialization is an inherently asynchronous process. Clients can | |
| 111 // either poll the IsInitialized() method (discouraged) or optionally pass in | |
| 112 // |start_cb|, which will be executed when initialization completes. | |
| 113 // | |
| 114 // The following permanent callbacks will be executed as follows: | 100 // The following permanent callbacks will be executed as follows: |
| 115 // |start_cb_| will be executed when Start is done (successfully or not). | 101 // |start_cb_| will be executed when Start is done (successfully or not). |
| 116 // |ended_cb| will be executed whenever the media reaches the end. | 102 // |ended_cb| will be executed whenever the media reaches the end. |
| 117 // |error_cb_| will be executed whenever an error occurs but hasn't | 103 // |error_cb_| will be executed whenever an error occurs but hasn't |
| 118 // been reported already through another callback. | 104 // been reported already through another callback. |
| 119 // | 105 // |
| 120 // These callbacks are only executed after Start() has been called and until | 106 // These callbacks are only executed after Start() has been called and until |
| 121 // Stop() has completed. | 107 // Stop() has completed. |
| 122 // | 108 // |
| 123 // It is an error to call this method after the pipeline has already started. | 109 // It is an error to call this method after the pipeline has already started. |
| 124 // | |
| 125 // TODO(scherkus): remove IsInitialized() and force clients to use callbacks. | |
| 126 void Start(scoped_ptr<FilterCollection> filter_collection, | 110 void Start(scoped_ptr<FilterCollection> filter_collection, |
| 127 const PipelineStatusCB& ended_cb, | 111 const PipelineStatusCB& ended_cb, |
| 128 const PipelineStatusCB& error_cb, | 112 const PipelineStatusCB& error_cb, |
| 129 const PipelineStatusCB& start_cb); | 113 const PipelineStatusCB& start_cb); |
| 130 | 114 |
| 131 // Asynchronously stops the pipeline and resets it to an uninitialized state. | 115 // Asynchronously stops the pipeline and resets it to an uninitialized state. |
| 132 // | 116 // |
| 133 // If provided, |stop_cb| will be executed when the pipeline has been | 117 // If provided, |stop_cb| will be executed when the pipeline has been |
| 134 // completely torn down and reset to an uninitialized state. It is acceptable | 118 // completely torn down and reset to an uninitialized state. It is acceptable |
| 135 // to call Start() again once the callback has finished executing. | 119 // to call Start() again once the callback has finished executing. |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 150 // succeeded. | 134 // succeeded. |
| 151 // | 135 // |
| 152 // It is an error to call this method if the pipeline has not started. | 136 // It is an error to call this method if the pipeline has not started. |
| 153 void Seek(base::TimeDelta time, const PipelineStatusCB& seek_cb); | 137 void Seek(base::TimeDelta time, const PipelineStatusCB& seek_cb); |
| 154 | 138 |
| 155 // Returns true if the pipeline has been started via Start(). If IsRunning() | 139 // Returns true if the pipeline has been started via Start(). If IsRunning() |
| 156 // returns true, it is expected that Stop() will be called before destroying | 140 // returns true, it is expected that Stop() will be called before destroying |
| 157 // the pipeline. | 141 // the pipeline. |
| 158 bool IsRunning() const; | 142 bool IsRunning() const; |
| 159 | 143 |
| 160 // Returns true if the pipeline has been started and fully initialized to a | |
|
Ami GONE FROM CHROMIUM
2012/07/30 04:06:21
hawt!
| |
| 161 // point where playback controls will be respected. Note that it is possible | |
| 162 // for a pipeline to be started but not initialized (i.e., an error occurred). | |
| 163 bool IsInitialized() const; | |
| 164 | |
| 165 // Returns true if the media has audio. | 144 // Returns true if the media has audio. |
| 166 bool HasAudio() const; | 145 bool HasAudio() const; |
| 167 | 146 |
| 168 // Returns true if the media has video. | 147 // Returns true if the media has video. |
| 169 bool HasVideo() const; | 148 bool HasVideo() const; |
| 170 | 149 |
| 171 // Gets the current playback rate of the pipeline. When the pipeline is | 150 // Gets the current playback rate of the pipeline. When the pipeline is |
| 172 // started, the playback rate will be 0.0f. A rate of 1.0f indicates | 151 // started, the playback rate will be 0.0f. A rate of 1.0f indicates |
| 173 // that the pipeline is rendering the media at the standard rate. Valid | 152 // that the pipeline is rendering the media at the standard rate. Valid |
| 174 // values for playback rate are >= 0.0f. | 153 // values for playback rate are >= 0.0f. |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 212 void GetNaturalVideoSize(gfx::Size* out_size) const; | 191 void GetNaturalVideoSize(gfx::Size* out_size) const; |
| 213 | 192 |
| 214 // Return true if loading progress has been made since the last time this | 193 // Return true if loading progress has been made since the last time this |
| 215 // method was called. | 194 // method was called. |
| 216 bool DidLoadingProgress() const; | 195 bool DidLoadingProgress() const; |
| 217 | 196 |
| 218 // Gets the current pipeline statistics. | 197 // Gets the current pipeline statistics. |
| 219 PipelineStatistics GetStatistics() const; | 198 PipelineStatistics GetStatistics() const; |
| 220 | 199 |
| 221 void SetClockForTesting(Clock* clock); | 200 void SetClockForTesting(Clock* clock); |
| 201 void SetErrorForTesting(PipelineStatus status); | |
| 222 | 202 |
| 223 private: | 203 private: |
| 224 FRIEND_TEST_ALL_PREFIXES(PipelineTest, GetBufferedTimeRanges); | 204 FRIEND_TEST_ALL_PREFIXES(PipelineTest, GetBufferedTimeRanges); |
| 225 FRIEND_TEST_ALL_PREFIXES(PipelineTest, DisableAudioRenderer); | 205 FRIEND_TEST_ALL_PREFIXES(PipelineTest, DisableAudioRenderer); |
| 226 FRIEND_TEST_ALL_PREFIXES(PipelineTest, DisableAudioRendererDuringInit); | 206 FRIEND_TEST_ALL_PREFIXES(PipelineTest, DisableAudioRendererDuringInit); |
| 227 FRIEND_TEST_ALL_PREFIXES(PipelineTest, EndedCallback); | 207 FRIEND_TEST_ALL_PREFIXES(PipelineTest, EndedCallback); |
| 228 FRIEND_TEST_ALL_PREFIXES(PipelineTest, AudioStreamShorterThanVideo); | 208 FRIEND_TEST_ALL_PREFIXES(PipelineTest, AudioStreamShorterThanVideo); |
| 229 friend class MediaLog; | 209 friend class MediaLog; |
| 230 | 210 |
| 231 // Only allow ourselves to be deleted by reference counting. | 211 // Only allow ourselves to be deleted by reference counting. |
| 232 friend class base::RefCountedThreadSafe<Pipeline>; | 212 friend class base::RefCountedThreadSafe<Pipeline>; |
| 233 virtual ~Pipeline(); | 213 virtual ~Pipeline(); |
| 234 | 214 |
| 235 // Pipeline states, as described above. | 215 // Pipeline states, as described above. |
| 236 enum State { | 216 enum State { |
| 237 kCreated, | 217 kCreated, |
| 238 kInitDemuxer, | 218 kInitDemuxer, |
| 239 kInitAudioDecoder, | 219 kInitAudioDecoder, |
| 240 kInitAudioRenderer, | 220 kInitAudioRenderer, |
| 241 kInitVideoDecoder, | 221 kInitVideoDecoder, |
| 242 kInitVideoRenderer, | 222 kInitVideoRenderer, |
| 243 kPausing, | 223 kPausing, |
| 224 kFlushing, | |
| 244 kSeeking, | 225 kSeeking, |
| 245 kFlushing, | |
| 246 kStarting, | 226 kStarting, |
| 247 kStarted, | 227 kStarted, |
| 248 kEnded, | |
|
scherkus (not reviewing)
2012/07/28 02:26:07
kEnded wasn't actually used so it's been folded in
| |
| 249 kStopping, | 228 kStopping, |
| 250 kStopped, | 229 kStopped, |
| 251 kError, | |
|
scherkus (not reviewing)
2012/07/28 02:26:07
kError has been replaced by kStopped && status_ !=
| |
| 252 }; | 230 }; |
| 253 | 231 |
| 254 // Reset the state of the pipeline object to the initial state. This method | |
| 255 // is used by the constructor, and the Stop() method. | |
| 256 void ResetState(); | |
|
scherkus (not reviewing)
2012/07/28 02:26:07
This was only called via Stop() path but not SetEr
| |
| 257 | |
| 258 // Updates |state_|. All state transitions should use this call. | 232 // Updates |state_|. All state transitions should use this call. |
| 259 void SetState(State next_state); | 233 void SetState(State next_state); |
| 260 | 234 |
| 261 // Simple method used to make sure the pipeline is running normally. | 235 // Simple method used to make sure the pipeline is running normally. |
| 262 bool IsPipelineOk(); | 236 bool IsPipelineOk(); |
| 263 | 237 |
| 264 // Helper method to tell whether we are stopped or in error. | 238 // Returns true if an asynchronous operation is under way that will result in |
| 265 bool IsPipelineStopped(); | 239 // calling DoStateTransition(). |
| 240 bool IsTransitioning(); | |
| 266 | 241 |
| 267 // Helper method to tell whether we are in transition to stop state. | 242 // Completes the state transition for the current state, taking into account |
| 268 bool IsPipelineTearingDown(); | 243 // any errors that may have occured. |
| 269 | 244 void OnStateTransition(PipelineStatus status); |
| 270 // We could also be delayed by a transition during seek is performed. | 245 void DoStateTransition(PipelineStatus status); |
|
Ami GONE FROM CHROMIUM
2012/07/30 04:06:21
These names are not sufficiently self-explanatory
| |
| 271 bool IsPipelineStopPending(); | |
| 272 | |
| 273 // Helper method to tell whether we are in transition to seek state. | |
| 274 bool IsPipelineSeeking(); | |
| 275 | |
| 276 // Helper method to execute callback from Start() and reset | |
| 277 // |filter_collection_|. Called when initialization completes | |
| 278 // normally or when pipeline is stopped or error occurs during | |
| 279 // initialization. | |
| 280 void FinishInitialization(); | |
| 281 | |
| 282 // Returns true if the given state is one that transitions to a new state | |
| 283 // after iterating through each filter. | |
| 284 static bool TransientState(State state); | |
| 285 | |
| 286 // Given the current state, returns the next state. | |
| 287 State FindNextState(State current); | |
| 288 | 246 |
| 289 // DataSourceHost (by way of DemuxerHost) implementation. | 247 // DataSourceHost (by way of DemuxerHost) implementation. |
| 290 virtual void SetTotalBytes(int64 total_bytes) OVERRIDE; | 248 virtual void SetTotalBytes(int64 total_bytes) OVERRIDE; |
| 291 virtual void AddBufferedByteRange(int64 start, int64 end) OVERRIDE; | 249 virtual void AddBufferedByteRange(int64 start, int64 end) OVERRIDE; |
| 292 virtual void AddBufferedTimeRange(base::TimeDelta start, | 250 virtual void AddBufferedTimeRange(base::TimeDelta start, |
| 293 base::TimeDelta end) OVERRIDE; | 251 base::TimeDelta end) OVERRIDE; |
| 294 | 252 |
| 295 // DemuxerHost implementaion. | 253 // DemuxerHost implementaion. |
| 296 virtual void SetDuration(base::TimeDelta duration) OVERRIDE; | 254 virtual void SetDuration(base::TimeDelta duration) OVERRIDE; |
| 297 virtual void OnDemuxerError(PipelineStatus error) OVERRIDE; | 255 virtual void OnDemuxerError(PipelineStatus error) OVERRIDE; |
| 298 | 256 |
| 299 // Initiates teardown sequence in response to a runtime error. | 257 // Initiates teardown sequence in response to a runtime error. |
| 300 // | 258 // |
| 301 // Safe to call from any thread. | 259 // Safe to call from any thread. |
| 302 void SetError(PipelineStatus error); | 260 void SetError(PipelineStatus error); |
| 303 | 261 |
| 304 // Callback executed when the natural size of the video has changed. | 262 // Callback executed when the natural size of the video has changed. |
| 305 void OnNaturalVideoSizeChanged(const gfx::Size& size); | 263 void OnNaturalVideoSizeChanged(const gfx::Size& size); |
| 306 | 264 |
| 307 // Callback executed when either of the renderers have ended. | 265 // Callback executed when either of the renderers have ended. |
| 308 void OnRendererEnded(); | 266 void OnRendererEnded(); |
| 309 | 267 |
| 310 // Callbacks executed by filters upon completing initialization. | |
| 311 void OnFilterInitialize(PipelineStatus status); | |
| 312 | |
| 313 // Callback executed by filters upon completing Play(), Pause(), or Stop(). | |
| 314 void OnFilterStateTransition(); | |
| 315 | |
| 316 // Callback executed by filters upon completing Seek(). | |
| 317 void OnFilterStateTransitionWithStatus(PipelineStatus status); | |
| 318 | |
| 319 // Callback executed by filters when completing teardown operations. | |
| 320 void OnTeardownStateTransition(); | |
| 321 | |
| 322 // Callback executed by filters to update statistics. | 268 // Callback executed by filters to update statistics. |
| 323 void OnUpdateStatistics(const PipelineStatistics& stats); | 269 void OnUpdateStatistics(const PipelineStatistics& stats); |
| 324 | 270 |
| 325 // Callback executed by audio renderer when it has been disabled. | 271 // Callback executed by audio renderer when it has been disabled. |
| 326 void OnAudioDisabled(); | 272 void OnAudioDisabled(); |
| 327 | 273 |
| 328 // Callback executed by audio renderer to update clock time. | 274 // Callback executed by audio renderer to update clock time. |
| 329 void OnAudioTimeUpdate(base::TimeDelta time, base::TimeDelta max_time); | 275 void OnAudioTimeUpdate(base::TimeDelta time, base::TimeDelta max_time); |
| 330 | 276 |
| 331 // Callback executed by video renderer to update clock time. | 277 // Callback executed by video renderer to update clock time. |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 361 | 307 |
| 362 // Carries out notifying filters that we are seeking to a new timestamp. | 308 // Carries out notifying filters that we are seeking to a new timestamp. |
| 363 void SeekTask(base::TimeDelta time, const PipelineStatusCB& seek_cb); | 309 void SeekTask(base::TimeDelta time, const PipelineStatusCB& seek_cb); |
| 364 | 310 |
| 365 // Carries out handling a notification from a renderer that it has ended. | 311 // Carries out handling a notification from a renderer that it has ended. |
| 366 void OnRendererEndedTask(); | 312 void OnRendererEndedTask(); |
| 367 | 313 |
| 368 // Carries out disabling the audio renderer. | 314 // Carries out disabling the audio renderer. |
| 369 void AudioDisabledTask(); | 315 void AudioDisabledTask(); |
| 370 | 316 |
| 371 // Carries out advancing to the next filter during Play()/Pause()/Seek(). | 317 // Initiates asynchronous initialization for each media object, executing |
| 372 void FilterStateTransitionTask(); | 318 // |done_cb| when completed. |
| 373 | 319 void DoInitDemuxer(const PipelineStatusCB& done_cb); |
| 374 // Carries out advancing to the next teardown operation. | 320 void DoInitAudioDecoder(const PipelineStatusCB& done_cb); |
| 375 void TeardownStateTransitionTask(); | 321 void DoInitAudioRenderer(const PipelineStatusCB& done_cb); |
| 376 | 322 void DoInitVideoDecoder(const PipelineStatusCB& done_cb); |
| 377 // Carries out stopping filter threads, deleting filters, running | 323 void DoInitVideoRenderer(const PipelineStatusCB& done_cb); |
| 378 // appropriate callbacks, and setting the appropriate pipeline state | |
| 379 // depending on whether we performing Stop() or SetError(). | |
| 380 // Called after all filters have been stopped. | |
| 381 void FinishDestroyingFiltersTask(); | |
| 382 | |
| 383 // Internal methods used in the implementation of the pipeline thread. All | |
| 384 // of these methods are only called on the pipeline thread. | |
| 385 | |
| 386 // The following initialize methods are used to select a specific type of | |
| 387 // object from FilterCollection and initialize it asynchronously. | |
| 388 void InitializeDemuxer(); | |
| 389 void OnDemuxerInitialized(PipelineStatus status); | |
| 390 | |
| 391 // Returns true if the asynchronous action of creating decoder has started. | |
| 392 // Returns false if this method did nothing because the corresponding | |
| 393 // audio/video stream does not exist. | |
| 394 bool InitializeAudioDecoder(const scoped_refptr<Demuxer>& demuxer); | |
| 395 bool InitializeVideoDecoder(const scoped_refptr<Demuxer>& demuxer); | |
| 396 | |
| 397 // Initializes a renderer and connects it with decoder. Returns true if the | |
| 398 // asynchronous action of creating renderer has started. Returns | |
| 399 // false if this method did nothing because the corresponding audio/video | |
| 400 // stream does not exist. | |
| 401 bool InitializeAudioRenderer(const scoped_refptr<AudioDecoder>& decoder); | |
| 402 bool InitializeVideoRenderer(const scoped_refptr<VideoDecoder>& decoder); | |
| 403 | |
| 404 // Kicks off destroying filters. Called by StopTask() and ErrorChangedTask(). | |
| 405 // When we start to tear down the pipeline, we will consider two cases: | |
| 406 // 1. when pipeline has not been initialized, we will transit to stopping | |
| 407 // state first. | |
| 408 // 2. when pipeline has been initialized, we will first transit to pausing | |
| 409 // => flushing => stopping => stopped state. | |
| 410 // This will remove the race condition during stop between filters. | |
| 411 void TearDownPipeline(); | |
| 412 | 324 |
| 413 // Compute the time corresponding to a byte offset. | 325 // Compute the time corresponding to a byte offset. |
| 414 base::TimeDelta TimeForByteOffset_Locked(int64 byte_offset) const; | 326 base::TimeDelta TimeForByteOffset_Locked(int64 byte_offset) const; |
| 415 | 327 |
| 416 // Initiates an asynchronous Pause/Seek/Play/Stop() call sequence executing | 328 // Initiates an asynchronous Pause/Seek/Play/Stop() call sequence executing |
| 417 // |done_cb| when completed. | 329 // |done_cb| when completed. |
| 418 void DoPause(const base::Closure& done_cb); | 330 void DoPause(const base::Closure& done_cb); |
| 419 void DoFlush(const base::Closure& done_cb); | 331 void DoFlush(const base::Closure& done_cb); |
| 420 void DoPlay(const base::Closure& done_cb); | 332 void DoPlay(const base::Closure& done_cb); |
| 421 void DoStop(const base::Closure& done_cb); | 333 void DoStop(const base::Closure& done_cb); |
| 422 | 334 |
| 423 // Initiates an asynchronous Seek() and preroll call sequence executing | 335 // Initiates an asynchronous Seek() and preroll call sequence executing |
| 424 // |done_cb| with the final status when completed. If |skip_demuxer_seek| is | 336 // |done_cb| with the final status when completed. If |skip_demuxer_seek| is |
| 425 // true then only renderers will attempt to preroll. | 337 // true then only renderers will attempt to preroll. |
| 426 // | 338 // |
| 339 // |seek_timestamp_| must be set prior to calling DoSeek(). | |
| 340 // | |
| 427 // TODO(scherkus): Prerolling should be separate from seeking so we can report | 341 // TODO(scherkus): Prerolling should be separate from seeking so we can report |
| 428 // finer grained ready states (HAVE_CURRENT_DATA vs. HAVE_FUTURE_DATA) | 342 // finer grained ready states (HAVE_CURRENT_DATA vs. HAVE_FUTURE_DATA) |
| 429 // indepentent from seeking. | 343 // indepentent from seeking. |
| 430 void DoSeek(base::TimeDelta seek_timestamp, bool skip_demuxer_seek, | 344 void DoSeek(bool skip_demuxer_seek, const PipelineStatusCB& done_cb); |
| 431 const PipelineStatusCB& done_cb); | |
| 432 | 345 |
| 433 void OnAudioUnderflow(); | 346 void OnAudioUnderflow(); |
| 434 | 347 |
| 435 void StartClockIfWaitingForTimeUpdate_Locked(); | 348 void StartClockIfWaitingForTimeUpdate_Locked(); |
| 436 | 349 |
| 437 // Report pipeline |status| through |cb| avoiding duplicate error reporting. | 350 // Report pipeline |status| through |cb| avoiding duplicate error reporting. |
| 438 void ReportStatus(const PipelineStatusCB& cb, PipelineStatus status); | 351 void ReportStatus(const PipelineStatusCB& cb, PipelineStatus status); |
| 439 | 352 |
| 440 // Message loop used to execute pipeline tasks. | 353 // Message loop used to execute pipeline tasks. |
| 441 scoped_refptr<base::MessageLoopProxy> message_loop_; | 354 scoped_refptr<base::MessageLoopProxy> message_loop_; |
| 442 | 355 |
| 443 // MediaLog to which to log events. | 356 // MediaLog to which to log events. |
| 444 scoped_refptr<MediaLog> media_log_; | 357 scoped_refptr<MediaLog> media_log_; |
| 445 | 358 |
| 446 // Lock used to serialize access for the following data members. | 359 // Lock used to serialize access for the following data members. |
| 447 mutable base::Lock lock_; | 360 mutable base::Lock lock_; |
| 448 | 361 |
| 449 // Whether or not the pipeline is running. | 362 // Whether or not the pipeline is running. |
| 450 bool running_; | 363 bool running_; |
| 451 | 364 |
| 452 // Whether or not the pipeline is in transition for a seek operation. | |
| 453 bool seek_pending_; | |
| 454 | |
| 455 // Whether or not the pipeline is pending a stop operation. | |
| 456 bool stop_pending_; | |
| 457 | |
| 458 // Whether or not the pipeline is perform a stop operation. | |
| 459 bool tearing_down_; | |
| 460 | |
| 461 // Whether or not an error triggered the teardown. | |
| 462 bool error_caused_teardown_; | |
| 463 | |
| 464 // Whether or not a playback rate change should be done once seeking is done. | |
| 465 bool playback_rate_change_pending_; | |
|
scherkus (not reviewing)
2012/07/28 02:26:07
I replaced this + set volume pending-ness with a s
| |
| 466 | |
| 467 // Amount of available buffered data. Set by filters. | 365 // Amount of available buffered data. Set by filters. |
| 468 Ranges<int64> buffered_byte_ranges_; | 366 Ranges<int64> buffered_byte_ranges_; |
| 469 Ranges<base::TimeDelta> buffered_time_ranges_; | 367 Ranges<base::TimeDelta> buffered_time_ranges_; |
| 470 | 368 |
| 471 // True when AddBufferedByteRange() has been called more recently than | 369 // True when AddBufferedByteRange() has been called more recently than |
| 472 // DidLoadingProgress(). | 370 // DidLoadingProgress(). |
| 473 mutable bool did_loading_progress_; | 371 mutable bool did_loading_progress_; |
| 474 | 372 |
| 475 // Total size of the media. Set by filters. | 373 // Total size of the media. Set by filters. |
| 476 int64 total_bytes_; | 374 int64 total_bytes_; |
| 477 | 375 |
| 478 // Video's natural width and height. Set by filters. | 376 // Video's natural width and height. Set by filters. |
| 479 gfx::Size natural_size_; | 377 gfx::Size natural_size_; |
| 480 | 378 |
| 481 // Current volume level (from 0.0f to 1.0f). This value is set immediately | 379 // Current volume level (from 0.0f to 1.0f). This value is set immediately |
| 482 // via SetVolume() and a task is dispatched on the message loop to notify the | 380 // via SetVolume() and a task is dispatched on the message loop to notify the |
| 483 // filters. | 381 // filters. |
| 484 float volume_; | 382 float volume_; |
| 485 | 383 |
| 486 // Current playback rate (>= 0.0f). This value is set immediately via | 384 // Current playback rate (>= 0.0f). This value is set immediately via |
| 487 // SetPlaybackRate() and a task is dispatched on the message loop to notify | 385 // SetPlaybackRate() and a task is dispatched on the message loop to notify |
| 488 // the filters. | 386 // the filters. |
| 489 float playback_rate_; | 387 float playback_rate_; |
| 490 | 388 |
| 491 // Playback rate to set when the current seek has finished. | |
| 492 float pending_playback_rate_; | |
| 493 | |
| 494 // Reference clock. Keeps track of current playback time. Uses system | 389 // Reference clock. Keeps track of current playback time. Uses system |
| 495 // clock and linear interpolation, but can have its time manually set | 390 // clock and linear interpolation, but can have its time manually set |
| 496 // by filters. | 391 // by filters. |
| 497 scoped_ptr<Clock> clock_; | 392 scoped_ptr<Clock> clock_; |
| 498 | 393 |
| 499 // If this value is set to true, then |clock_| is paused and we are waiting | 394 // If this value is set to true, then |clock_| is paused and we are waiting |
| 500 // for an update of the clock greater than or equal to the elapsed time to | 395 // for an update of the clock greater than or equal to the elapsed time to |
| 501 // start the clock. | 396 // start the clock. |
| 502 bool waiting_for_clock_update_; | 397 bool waiting_for_clock_update_; |
| 503 | 398 |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 524 // replies. | 419 // replies. |
| 525 base::TimeDelta seek_timestamp_; | 420 base::TimeDelta seek_timestamp_; |
| 526 | 421 |
| 527 // Set to true in DisableAudioRendererTask(). | 422 // Set to true in DisableAudioRendererTask(). |
| 528 bool audio_disabled_; | 423 bool audio_disabled_; |
| 529 | 424 |
| 530 // Filter collection as passed in by Start(). | 425 // Filter collection as passed in by Start(). |
| 531 scoped_ptr<FilterCollection> filter_collection_; | 426 scoped_ptr<FilterCollection> filter_collection_; |
| 532 | 427 |
| 533 // Callbacks for various pipeline operations. | 428 // Callbacks for various pipeline operations. |
| 429 PipelineStatusCB start_cb_; | |
| 534 PipelineStatusCB seek_cb_; | 430 PipelineStatusCB seek_cb_; |
| 535 base::Closure stop_cb_; | 431 base::Closure stop_cb_; |
| 536 PipelineStatusCB ended_cb_; | 432 PipelineStatusCB ended_cb_; |
| 537 PipelineStatusCB error_cb_; | 433 PipelineStatusCB error_cb_; |
| 538 | 434 |
| 539 // Decoder reference used for signalling imminent shutdown. | 435 // Decoder reference used for signalling imminent shutdown. |
| 540 // This is a HACK necessary because WebMediaPlayerImpl::Destroy() holds the | 436 // This is a HACK necessary because WebMediaPlayerImpl::Destroy() holds the |
| 541 // renderer thread loop hostage for until PipelineImpl::Stop() calls its | 437 // renderer thread loop hostage for until PipelineImpl::Stop() calls its |
| 542 // callback. | 438 // callback. |
| 543 // This reference should only be used for this hack and no other purposes. | 439 // This reference should only be used for this hack and no other purposes. |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 562 // Time of pipeline creation; is non-zero only until the pipeline first | 458 // Time of pipeline creation; is non-zero only until the pipeline first |
| 563 // reaches "kStarted", at which point it is used & zeroed out. | 459 // reaches "kStarted", at which point it is used & zeroed out. |
| 564 base::Time creation_time_; | 460 base::Time creation_time_; |
| 565 | 461 |
| 566 DISALLOW_COPY_AND_ASSIGN(Pipeline); | 462 DISALLOW_COPY_AND_ASSIGN(Pipeline); |
| 567 }; | 463 }; |
| 568 | 464 |
| 569 } // namespace media | 465 } // namespace media |
| 570 | 466 |
| 571 #endif // MEDIA_BASE_PIPELINE_H_ | 467 #endif // MEDIA_BASE_PIPELINE_H_ |
| OLD | NEW |