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

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

Issue 10753021: Move AudioRenderer out of Filter heirarchy. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src
Patch Set: docs Created 8 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 | Annotate | Revision Log
OLDNEW
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"
11 #include "base/synchronization/condition_variable.h" 11 #include "base/synchronization/condition_variable.h"
12 #include "base/synchronization/lock.h" 12 #include "base/synchronization/lock.h"
13 #include "media/base/audio_renderer.h"
13 #include "media/base/demuxer.h" 14 #include "media/base/demuxer.h"
14 #include "media/base/filter_host.h" 15 #include "media/base/filter_host.h"
15 #include "media/base/media_export.h" 16 #include "media/base/media_export.h"
16 #include "media/base/pipeline_status.h" 17 #include "media/base/pipeline_status.h"
17 #include "media/base/ranges.h" 18 #include "media/base/ranges.h"
18 #include "ui/gfx/size.h" 19 #include "ui/gfx/size.h"
19 20
20 class MessageLoop; 21 class MessageLoop;
21 22
22 namespace base { 23 namespace base {
23 class MessageLoopProxy; 24 class MessageLoopProxy;
24 class TimeDelta; 25 class TimeDelta;
25 } 26 }
26 27
27 namespace media { 28 namespace media {
28 29
29 class AudioDecoder; 30 class AudioDecoder;
30 class AudioRenderer;
31 class Clock; 31 class Clock;
32 class Filter; 32 class Filter;
33 class FilterCollection; 33 class FilterCollection;
34 class MediaLog; 34 class MediaLog;
35 class VideoDecoder; 35 class VideoDecoder;
36 class VideoRenderer; 36 class VideoRenderer;
37 37
38 // Adapter for using asynchronous Pipeline methods in code that wants to run 38 // Adapter for using asynchronous Pipeline methods in code that wants to run
39 // synchronously. To use, construct an instance of this class and pass the 39 // synchronously. To use, construct an instance of this class and pass the
40 // |Callback()| to the Pipeline method requiring a callback. Then Wait() for 40 // |Callback()| to the Pipeline method requiring a callback. Then Wait() for
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 // a Seek() to the beginning of the media to give filters a chance to preroll. 95 // a Seek() to the beginning of the media to give filters a chance to preroll.
96 // From then on the normal Seek() transitions are carried out and we start 96 // From then on the normal Seek() transitions are carried out and we start
97 // playing the media. 97 // playing the media.
98 // 98 //
99 // If any error ever happens, this object will transition to the "Error" state 99 // If any error ever happens, this object will transition to the "Error" state
100 // from any state. If Stop() is ever called, this object will transition to 100 // from any state. If Stop() is ever called, this object will transition to
101 // "Stopped" state. 101 // "Stopped" state.
102 class MEDIA_EXPORT Pipeline 102 class MEDIA_EXPORT Pipeline
103 : public base::RefCountedThreadSafe<Pipeline>, 103 : public base::RefCountedThreadSafe<Pipeline>,
104 public FilterHost, 104 public FilterHost,
105 public DemuxerHost { 105 public DemuxerHost,
106 public AudioRendererHost {
106 public: 107 public:
107 // Constructs a media pipeline that will execute on |message_loop|. 108 // Constructs a media pipeline that will execute on |message_loop|.
108 Pipeline(MessageLoop* message_loop, MediaLog* media_log); 109 Pipeline(MessageLoop* message_loop, MediaLog* media_log);
109 110
110 // Build a pipeline to using the given filter collection to construct a filter 111 // Build a pipeline to using the given filter collection to construct a filter
111 // chain. 112 // chain.
112 // 113 //
113 // Pipeline initialization is an inherently asynchronous process. Clients can 114 // Pipeline initialization is an inherently asynchronous process. Clients can
114 // either poll the IsInitialized() method (discouraged) or optionally pass in 115 // either poll the IsInitialized() method (discouraged) or optionally pass in
115 // |start_cb|, which will be executed when initialization completes. 116 // |start_cb|, which will be executed when initialization completes.
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 // DemuxerHost implementaion. 295 // DemuxerHost implementaion.
295 virtual void SetDuration(base::TimeDelta duration) OVERRIDE; 296 virtual void SetDuration(base::TimeDelta duration) OVERRIDE;
296 virtual void OnDemuxerError(PipelineStatus error) OVERRIDE; 297 virtual void OnDemuxerError(PipelineStatus error) OVERRIDE;
297 298
298 // FilterHost implementation. 299 // FilterHost implementation.
299 virtual void SetError(PipelineStatus error) OVERRIDE; 300 virtual void SetError(PipelineStatus error) OVERRIDE;
300 virtual base::TimeDelta GetTime() const OVERRIDE; 301 virtual base::TimeDelta GetTime() const OVERRIDE;
301 virtual base::TimeDelta GetDuration() const OVERRIDE; 302 virtual base::TimeDelta GetDuration() const OVERRIDE;
302 virtual void SetNaturalVideoSize(const gfx::Size& size) OVERRIDE; 303 virtual void SetNaturalVideoSize(const gfx::Size& size) OVERRIDE;
303 virtual void NotifyEnded() OVERRIDE; 304 virtual void NotifyEnded() OVERRIDE;
304 virtual void DisableAudioRenderer() OVERRIDE; 305
306 // AudioRendererHost implementation.
307 virtual void AudioRendererEnded() OVERRIDE;
308 virtual void AudioRendererDisabled() OVERRIDE;
305 309
306 // Callbacks executed by filters upon completing initialization. 310 // Callbacks executed by filters upon completing initialization.
307 void OnFilterInitialize(PipelineStatus status); 311 void OnFilterInitialize(PipelineStatus status);
308 312
309 // Callback executed by filters upon completing Play(), Pause(), or Stop(). 313 // Callback executed by filters upon completing Play(), Pause(), or Stop().
310 void OnFilterStateTransition(); 314 void OnFilterStateTransition();
311 315
312 // Callback executed by filters upon completing Seek(). 316 // Callback executed by filters upon completing Seek().
313 void OnFilterStateTransitionWithStatus(PipelineStatus status); 317 void OnFilterStateTransitionWithStatus(PipelineStatus status);
314 318
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
352 // Carries out notifying filters that the volume has changed. 356 // Carries out notifying filters that the volume has changed.
353 void VolumeChangedTask(float volume); 357 void VolumeChangedTask(float volume);
354 358
355 // Carries out notifying filters that we are seeking to a new timestamp. 359 // Carries out notifying filters that we are seeking to a new timestamp.
356 void SeekTask(base::TimeDelta time, const PipelineStatusCB& seek_cb); 360 void SeekTask(base::TimeDelta time, const PipelineStatusCB& seek_cb);
357 361
358 // Carries out handling a notification from a filter that it has ended. 362 // Carries out handling a notification from a filter that it has ended.
359 void NotifyEndedTask(); 363 void NotifyEndedTask();
360 364
361 // Carries out disabling the audio renderer. 365 // Carries out disabling the audio renderer.
362 void DisableAudioRendererTask(); 366 void AudioRendererDisabledTask();
363 367
364 // Carries out advancing to the next filter during Play()/Pause()/Seek(). 368 // Carries out advancing to the next filter during Play()/Pause()/Seek().
365 void FilterStateTransitionTask(); 369 void FilterStateTransitionTask();
366 370
367 // Carries out advancing to the next teardown operation. 371 // Carries out advancing to the next teardown operation.
368 void TeardownStateTransitionTask(); 372 void TeardownStateTransitionTask();
369 373
370 // Carries out stopping filter threads, deleting filters, running 374 // Carries out stopping filter threads, deleting filters, running
371 // appropriate callbacks, and setting the appropriate pipeline state 375 // appropriate callbacks, and setting the appropriate pipeline state
372 // depending on whether we performing Stop() or SetError(). 376 // depending on whether we performing Stop() or SetError().
(...skipping 30 matching lines...) Expand all
403 // This will remove the race condition during stop between filters. 407 // This will remove the race condition during stop between filters.
404 void TearDownPipeline(); 408 void TearDownPipeline();
405 409
406 // Compute the current time. Assumes that the lock has been acquired by the 410 // Compute the current time. Assumes that the lock has been acquired by the
407 // caller. 411 // caller.
408 base::TimeDelta GetCurrentTime_Locked() const; 412 base::TimeDelta GetCurrentTime_Locked() const;
409 413
410 // Compute the time corresponding to a byte offset. 414 // Compute the time corresponding to a byte offset.
411 base::TimeDelta TimeForByteOffset_Locked(int64 byte_offset) const; 415 base::TimeDelta TimeForByteOffset_Locked(int64 byte_offset) const;
412 416
413 // Initiates a Stop() on |demuxer_| & |pipeline_filter_|. |callback| 417 // Initiates an asynchronous Pause/Flush/Play/Stop() call sequence executing
414 // is called once both objects have been stopped. 418 // |done_cb| when completed.
415 void DoStop(const base::Closure& callback); 419 void DoPause(const base::Closure& done_cb);
420 void DoFlush(const base::Closure& done_cb);
421 void DoPlay(const base::Closure& done_cb);
422 void DoStop(const base::Closure& done_cb);
416 423
417 // Called when |demuxer_| has stopped. This method calls Stop() 424 // Initiates an asynchronous Seek() call sequence executing |done_cb| when
acolwell GONE FROM CHROMIUM 2012/07/10 16:34:37 s/done_cb/seek_cb_ since there are no done_cb para
scherkus (not reviewing) 2012/07/17 03:43:00 Done.
418 // on |pipeline_filter_|. 425 // completed. Seek() is separated from the other operations as we will
419 void OnDemuxerStopDone(const base::Closure& callback); 426 // prematurely terminate the call sequence if an error occurs.
420
421 // Initiates a Seek() on the |demuxer_| & |pipeline_filter_|.
422 void DoSeek(base::TimeDelta seek_timestamp); 427 void DoSeek(base::TimeDelta seek_timestamp);
423
424 // Called when |demuxer_| finishes seeking. If seeking was successful,
425 // then Seek() is called on |pipeline_filter_|.
426 void OnDemuxerSeekDone(base::TimeDelta seek_timestamp, 428 void OnDemuxerSeekDone(base::TimeDelta seek_timestamp,
427 PipelineStatus status); 429 PipelineStatus status);
430 void OnAudioRendererSeekDone(base::TimeDelta seek_timestamp,
431 PipelineStatus status);
428 432
429 void OnAudioUnderflow(); 433 void OnAudioUnderflow();
430 434
431 void StartClockIfWaitingForTimeUpdate_Locked(); 435 void StartClockIfWaitingForTimeUpdate_Locked();
432 436
433 // Report pipeline |status| through |cb| avoiding duplicate error reporting. 437 // Report pipeline |status| through |cb| avoiding duplicate error reporting.
434 void ReportStatus(const PipelineStatusCB& cb, PipelineStatus status); 438 void ReportStatus(const PipelineStatusCB& cb, PipelineStatus status);
435 439
440 void RunOnPipelineThread(const base::Closure& closure);
441
436 // Message loop used to execute pipeline tasks. 442 // Message loop used to execute pipeline tasks.
437 scoped_refptr<base::MessageLoopProxy> message_loop_; 443 scoped_refptr<base::MessageLoopProxy> message_loop_;
438 444
439 // MediaLog to which to log events. 445 // MediaLog to which to log events.
440 scoped_refptr<MediaLog> media_log_; 446 scoped_refptr<MediaLog> media_log_;
441 447
442 // Lock used to serialize access for the following data members. 448 // Lock used to serialize access for the following data members.
443 mutable base::Lock lock_; 449 mutable base::Lock lock_;
444 450
445 // Whether or not the pipeline is running. 451 // Whether or not the pipeline is running.
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 // Time of pipeline creation; is non-zero only until the pipeline first 567 // Time of pipeline creation; is non-zero only until the pipeline first
562 // reaches "kStarted", at which point it is used & zeroed out. 568 // reaches "kStarted", at which point it is used & zeroed out.
563 base::Time creation_time_; 569 base::Time creation_time_;
564 570
565 DISALLOW_COPY_AND_ASSIGN(Pipeline); 571 DISALLOW_COPY_AND_ASSIGN(Pipeline);
566 }; 572 };
567 573
568 } // namespace media 574 } // namespace media
569 575
570 #endif // MEDIA_BASE_PIPELINE_H_ 576 #endif // MEDIA_BASE_PIPELINE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698