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

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: error_cb 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
« no previous file with comments | « media/base/mock_filters.cc ('k') | media/base/pipeline.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) 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 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 // method was called. 218 // method was called.
219 bool DidLoadingProgress() const; 219 bool DidLoadingProgress() const;
220 220
221 // Gets the current pipeline statistics. 221 // Gets the current pipeline statistics.
222 PipelineStatistics GetStatistics() const; 222 PipelineStatistics GetStatistics() const;
223 223
224 void SetClockForTesting(Clock* clock); 224 void SetClockForTesting(Clock* clock);
225 225
226 private: 226 private:
227 FRIEND_TEST_ALL_PREFIXES(PipelineTest, GetBufferedTimeRanges); 227 FRIEND_TEST_ALL_PREFIXES(PipelineTest, GetBufferedTimeRanges);
228 FRIEND_TEST_ALL_PREFIXES(PipelineTest, DisableAudioRenderer);
228 friend class MediaLog; 229 friend class MediaLog;
229 230
230 // Only allow ourselves to be deleted by reference counting. 231 // Only allow ourselves to be deleted by reference counting.
231 friend class base::RefCountedThreadSafe<Pipeline>; 232 friend class base::RefCountedThreadSafe<Pipeline>;
232 virtual ~Pipeline(); 233 virtual ~Pipeline();
233 234
234 // Pipeline states, as described above. 235 // Pipeline states, as described above.
235 enum State { 236 enum State {
236 kCreated, 237 kCreated,
237 kInitDemuxer, 238 kInitDemuxer,
(...skipping 56 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 305
306 // Callbacks executed by filters upon completing initialization. 306 // Callbacks executed by filters upon completing initialization.
307 void OnFilterInitialize(PipelineStatus status); 307 void OnFilterInitialize(PipelineStatus status);
308 308
309 // Callback executed by filters upon completing Play(), Pause(), or Stop(). 309 // Callback executed by filters upon completing Play(), Pause(), or Stop().
310 void OnFilterStateTransition(); 310 void OnFilterStateTransition();
311 311
312 // Callback executed by filters upon completing Seek(). 312 // Callback executed by filters upon completing Seek().
313 void OnFilterStateTransitionWithStatus(PipelineStatus status); 313 void OnFilterStateTransitionWithStatus(PipelineStatus status);
314 314
315 // Callback executed by filters when completing teardown operations. 315 // Callback executed by filters when completing teardown operations.
316 void OnTeardownStateTransition(); 316 void OnTeardownStateTransition();
317 317
318 // Callback executed by filters to update statistics. 318 // Callback executed by filters to update statistics.
319 void OnUpdateStatistics(const PipelineStatistics& stats); 319 void OnUpdateStatistics(const PipelineStatistics& stats);
320 320
321 // Callback executed by audio renderer when it has been disabled.
322 void OnAudioDisabled();
323
321 // Callback executed by audio renderer to update clock time. 324 // Callback executed by audio renderer to update clock time.
322 void OnAudioTimeUpdate(base::TimeDelta time, base::TimeDelta max_time); 325 void OnAudioTimeUpdate(base::TimeDelta time, base::TimeDelta max_time);
323 326
324 // Callback executed by video renderer to update clock time. 327 // Callback executed by video renderer to update clock time.
325 void OnVideoTimeUpdate(base::TimeDelta max_time); 328 void OnVideoTimeUpdate(base::TimeDelta max_time);
326 329
327 // The following "task" methods correspond to the public methods, but these 330 // The following "task" methods correspond to the public methods, but these
328 // methods are run as the result of posting a task to the PipelineInternal's 331 // methods are run as the result of posting a task to the PipelineInternal's
329 // message loop. 332 // message loop.
330 void StartTask(scoped_ptr<FilterCollection> filter_collection, 333 void StartTask(scoped_ptr<FilterCollection> filter_collection,
(...skipping 21 matching lines...) Expand all
352 // Carries out notifying filters that the volume has changed. 355 // Carries out notifying filters that the volume has changed.
353 void VolumeChangedTask(float volume); 356 void VolumeChangedTask(float volume);
354 357
355 // Carries out notifying filters that we are seeking to a new timestamp. 358 // Carries out notifying filters that we are seeking to a new timestamp.
356 void SeekTask(base::TimeDelta time, const PipelineStatusCB& seek_cb); 359 void SeekTask(base::TimeDelta time, const PipelineStatusCB& seek_cb);
357 360
358 // Carries out handling a notification from a filter that it has ended. 361 // Carries out handling a notification from a filter that it has ended.
359 void NotifyEndedTask(); 362 void NotifyEndedTask();
360 363
361 // Carries out disabling the audio renderer. 364 // Carries out disabling the audio renderer.
362 void DisableAudioRendererTask(); 365 void AudioDisabledTask();
363 366
364 // Carries out advancing to the next filter during Play()/Pause()/Seek(). 367 // Carries out advancing to the next filter during Play()/Pause()/Seek().
365 void FilterStateTransitionTask(); 368 void FilterStateTransitionTask();
366 369
367 // Carries out advancing to the next teardown operation. 370 // Carries out advancing to the next teardown operation.
368 void TeardownStateTransitionTask(); 371 void TeardownStateTransitionTask();
369 372
370 // Carries out stopping filter threads, deleting filters, running 373 // Carries out stopping filter threads, deleting filters, running
371 // appropriate callbacks, and setting the appropriate pipeline state 374 // appropriate callbacks, and setting the appropriate pipeline state
372 // depending on whether we performing Stop() or SetError(). 375 // 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. 406 // This will remove the race condition during stop between filters.
404 void TearDownPipeline(); 407 void TearDownPipeline();
405 408
406 // Compute the current time. Assumes that the lock has been acquired by the 409 // Compute the current time. Assumes that the lock has been acquired by the
407 // caller. 410 // caller.
408 base::TimeDelta GetCurrentTime_Locked() const; 411 base::TimeDelta GetCurrentTime_Locked() const;
409 412
410 // Compute the time corresponding to a byte offset. 413 // Compute the time corresponding to a byte offset.
411 base::TimeDelta TimeForByteOffset_Locked(int64 byte_offset) const; 414 base::TimeDelta TimeForByteOffset_Locked(int64 byte_offset) const;
412 415
413 // Initiates a Stop() on |demuxer_| & |pipeline_filter_|. |callback| 416 // Initiates an asynchronous Pause/Seek/Play/Stop() call sequence executing
414 // is called once both objects have been stopped. 417 // |done_cb| when completed.
415 void DoStop(const base::Closure& callback); 418 void DoPause(const base::Closure& done_cb);
419 void DoFlush(const base::Closure& done_cb);
420 void DoPlay(const base::Closure& done_cb);
421 void DoStop(const base::Closure& done_cb);
416 422
417 // Called when |demuxer_| has stopped. This method calls Stop() 423 // Initiates an asynchronous Seek() and preroll call sequence executing
418 // on |pipeline_filter_|. 424 // |done_cb| with the final status when completed. If |skip_demuxer_seek| is
419 void OnDemuxerStopDone(const base::Closure& callback); 425 // true then only renderers will attempt to preroll.
420 426 //
421 // Initiates a Seek() on the |demuxer_| & |pipeline_filter_|. 427 // TODO(scherkus): Prerolling should be separate from seeking so we can report
422 void DoSeek(base::TimeDelta seek_timestamp); 428 // finer grained ready states (HAVE_CURRENT_DATA vs. HAVE_FUTURE_DATA)
423 429 // indepentent from seeking.
424 // Called when |demuxer_| finishes seeking. If seeking was successful, 430 void DoSeek(base::TimeDelta seek_timestamp, bool skip_demuxer_seek,
425 // then Seek() is called on |pipeline_filter_|. 431 const PipelineStatusCB& done_cb);
426 void OnDemuxerSeekDone(base::TimeDelta seek_timestamp,
427 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
436 // Message loop used to execute pipeline tasks. 440 // Message loop used to execute pipeline tasks.
437 scoped_refptr<base::MessageLoopProxy> message_loop_; 441 scoped_refptr<base::MessageLoopProxy> message_loop_;
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
526 // Filter collection as passed in by Start(). 530 // Filter collection as passed in by Start().
527 scoped_ptr<FilterCollection> filter_collection_; 531 scoped_ptr<FilterCollection> filter_collection_;
528 532
529 // Callbacks for various pipeline operations. 533 // Callbacks for various pipeline operations.
530 PipelineStatusCB seek_cb_; 534 PipelineStatusCB seek_cb_;
531 base::Closure stop_cb_; 535 base::Closure stop_cb_;
532 PipelineStatusCB ended_cb_; 536 PipelineStatusCB ended_cb_;
533 PipelineStatusCB error_cb_; 537 PipelineStatusCB error_cb_;
534 538
535 // Reference to the filter(s) that constitute the pipeline. 539 // Reference to the filter(s) that constitute the pipeline.
540 //
541 // TODO(scherkus): At this point in time this is a CompositeFilter that
542 // contains |video_renderer_|. Remove when CompositeFilter is gone, see
543 // http://crbug.com/126069
536 scoped_refptr<Filter> pipeline_filter_; 544 scoped_refptr<Filter> pipeline_filter_;
537 545
538 // Decoder reference used for signalling imminent shutdown. 546 // Decoder reference used for signalling imminent shutdown.
539 // This is a HACK necessary because WebMediaPlayerImpl::Destroy() holds the 547 // This is a HACK necessary because WebMediaPlayerImpl::Destroy() holds the
540 // renderer thread loop hostage for until PipelineImpl::Stop() calls its 548 // renderer thread loop hostage for until PipelineImpl::Stop() calls its
541 // callback. 549 // callback.
542 // This reference should only be used for this hack and no other purposes. 550 // This reference should only be used for this hack and no other purposes.
543 // http://crbug.com/110228 tracks removing this hack. 551 // http://crbug.com/110228 tracks removing this hack.
544 scoped_refptr<VideoDecoder> video_decoder_; 552 scoped_refptr<VideoDecoder> video_decoder_;
545 553
(...skipping 15 matching lines...) Expand all
561 // Time of pipeline creation; is non-zero only until the pipeline first 569 // Time of pipeline creation; is non-zero only until the pipeline first
562 // reaches "kStarted", at which point it is used & zeroed out. 570 // reaches "kStarted", at which point it is used & zeroed out.
563 base::Time creation_time_; 571 base::Time creation_time_;
564 572
565 DISALLOW_COPY_AND_ASSIGN(Pipeline); 573 DISALLOW_COPY_AND_ASSIGN(Pipeline);
566 }; 574 };
567 575
568 } // namespace media 576 } // namespace media
569 577
570 #endif // MEDIA_BASE_PIPELINE_H_ 578 #endif // MEDIA_BASE_PIPELINE_H_
OLDNEW
« no previous file with comments | « media/base/mock_filters.cc ('k') | media/base/pipeline.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698