15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef MEDIA_BASE_PIPELINE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEDIA_BASE_PIPELINE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/condition_variable.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_checker.h"
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/time/default_tick_clock.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/audio_renderer.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/demuxer.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/media_export.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/pipeline_status.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/ranges.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/serial_runner.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MessageLoopProxy;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TimeDelta;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Clock;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FilterCollection;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MediaLog;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VideoRenderer;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Pipeline runs the media pipeline.  Filters are created and called on the
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// message loop injected into this object. Pipeline works like a state
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// machine to perform asynchronous initialization, pausing, seeking and playing.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Here's a state diagram that describes the lifetime of this object.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   [ *Created ]                       [ Any State ]
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//         | Start()                         | Stop() / SetError()
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//         V                                 V
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   [ InitXXX (for each filter) ]      [ Stopping ]
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//         |                                 |
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//         V                                 V
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   [ InitPreroll ]                    [ Stopped ]
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//         |
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//         V
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   [ Starting ] <-- [ Seeking ]
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//         |               ^
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//         V               |
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   [ Started ] ----------'
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                 Seek()
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Initialization is a series of state transitions from "Created" through each
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// filter initialization state.  When all filter initialization states have
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// completed, we are implicitly in a "Paused" state.  At that point we simulate
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a Seek() to the beginning of the media to give filters a chance to preroll.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// From then on the normal Seek() transitions are carried out and we start
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// playing the media.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If any error ever happens, this object will transition to the "Error" state
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from any state. If Stop() is ever called, this object will transition to
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "Stopped" state.
66b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class MEDIA_EXPORT Pipeline : public DemuxerHost {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Buffering states the pipeline transitions between during playback.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // kHaveMetadata:
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   Indicates that the following things are known:
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   content duration, natural size, start time, and whether the content has
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   audio and/or video in supported formats.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // kPrerollCompleted:
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   All renderers have buffered enough data to satisfy preroll and are ready
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   to start playback.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum BufferingState {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kHaveMetadata,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kPrerollCompleted,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::Callback<void(BufferingState)> BufferingStateCB;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Constructs a media pipeline that will execute on |message_loop|.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Pipeline(const scoped_refptr<base::MessageLoopProxy>& message_loop,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           MediaLog* media_log);
86b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual ~Pipeline();
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Build a pipeline to using the given filter collection to construct a filter
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // chain, executing |seek_cb| when the initial seek/preroll has completed.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |filter_collection| must be a complete collection containing a demuxer,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // audio/video decoders, and audio/video renderers. Failing to do so will
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // result in a crash.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The following permanent callbacks will be executed as follows up until
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stop() has completed:
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   |ended_cb| will be executed whenever the media reaches the end.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   |error_cb| will be executed whenever an error occurs but hasn't
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //              been reported already through another callback.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   |buffering_state_cb| Optional callback that will be executed whenever the
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //                    pipeline's buffering state changes.
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //   |duration_change_cb| Optional callback that will be executed whenever the
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //                        presentation duration changes.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It is an error to call this method after the pipeline has already started.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Start(scoped_ptr<FilterCollection> filter_collection,
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             const base::Closure& ended_cb,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             const PipelineStatusCB& error_cb,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             const PipelineStatusCB& seek_cb,
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             const BufferingStateCB& buffering_state_cb,
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             const base::Closure& duration_change_cb);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Asynchronously stops the pipeline, executing |stop_cb| when the pipeline
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // teardown has completed.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stop() must complete before destroying the pipeline. It it permissible to
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // call Stop() at any point during the lifetime of the pipeline.
117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  //
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // It is safe to delete the pipeline during the execution of |stop_cb|.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Stop(const base::Closure& stop_cb);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Attempt to seek to the position specified by time.  |seek_cb| will be
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // executed when the all filters in the pipeline have processed the seek.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clients are expected to call GetMediaTime() to check whether the seek
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // succeeded.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It is an error to call this method if the pipeline has not started.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Seek(base::TimeDelta time, const PipelineStatusCB& seek_cb);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the pipeline has been started via Start().  If IsRunning()
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // returns true, it is expected that Stop() will be called before destroying
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the pipeline.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsRunning() const;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the media has audio.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasAudio() const;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the media has video.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasVideo() const;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the current playback rate of the pipeline.  When the pipeline is
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // started, the playback rate will be 0.0f.  A rate of 1.0f indicates
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that the pipeline is rendering the media at the standard rate.  Valid
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // values for playback rate are >= 0.0f.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float GetPlaybackRate() const;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Attempt to adjust the playback rate. Setting a playback rate of 0.0f pauses
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // all rendering of the media.  A rate of 1.0f indicates a normal playback
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // rate.  Values for the playback rate must be greater than or equal to 0.0f.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(scherkus): What about maximum rate?  Does HTML5 specify a max?
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetPlaybackRate(float playback_rate);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the current volume setting being used by the audio renderer.  When
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the pipeline is started, this value will be 1.0f.  Valid values range
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from 0.0f to 1.0f.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float GetVolume() const;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Attempt to set the volume of the audio renderer.  Valid values for volume
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // range from 0.0f (muted) to 1.0f (full volume).  This value affects all
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // channels proportionately for multi-channel audio streams.
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetVolume(float volume);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the current media playback time, which progresses from 0 until
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GetMediaDuration().
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta GetMediaTime() const;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get approximate time ranges of buffered media.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Ranges<base::TimeDelta> GetBufferedTimeRanges();
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the duration of the media in microseconds.  If the duration has not
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // been determined yet, then returns 0.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta GetMediaDuration() const;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the total size of the media file.  If the size has not yet been
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // determined or can not be determined, this value is 0.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 GetTotalBytes() const;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the natural size of the video output in pixel units.  If there is no
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // video or the video has not been rendered yet, the width and height will
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be 0.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetNaturalVideoSize(gfx::Size* out_size) const;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return true if loading progress has been made since the last time this
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // method was called.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DidLoadingProgress() const;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the current pipeline statistics.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PipelineStatistics GetStatistics() const;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetClockForTesting(Clock* clock);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetErrorForTesting(PipelineStatus status);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(PipelineTest, GetBufferedTimeRanges);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(PipelineTest, DisableAudioRenderer);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(PipelineTest, DisableAudioRendererDuringInit);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(PipelineTest, EndedCallback);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(PipelineTest, AudioStreamShorterThanVideo);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class MediaLog;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pipeline states, as described above.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum State {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kCreated,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kInitDemuxer,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kInitAudioRenderer,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kInitVideoRenderer,
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kInitPrerolling,
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kSeeking,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kStarting,
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kStarted,
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kStopping,
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kStopped,
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates |state_|. All state transitions should use this call.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetState(State next_state);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* GetStateString(State state);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  State GetNextState() const;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper method that runs & resets |seek_cb_| and resets |seek_timestamp_|
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and |seek_pending_|.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FinishSeek();
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DataSourceHost (by way of DemuxerHost) implementation.
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetTotalBytes(int64 total_bytes) OVERRIDE;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AddBufferedByteRange(int64 start, int64 end) OVERRIDE;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AddBufferedTimeRange(base::TimeDelta start,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    base::TimeDelta end) OVERRIDE;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DemuxerHost implementaion.
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetDuration(base::TimeDelta duration) OVERRIDE;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDemuxerError(PipelineStatus error) OVERRIDE;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initiates teardown sequence in response to a runtime error.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Safe to call from any thread.
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetError(PipelineStatus error);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback executed when the natural size of the video has changed.
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnNaturalVideoSizeChanged(const gfx::Size& size);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callbacks executed when a renderer has ended.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnAudioRendererEnded();
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnVideoRendererEnded();
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback executed by filters to update statistics.
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnUpdateStatistics(const PipelineStatistics& stats);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback executed by audio renderer when it has been disabled.
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnAudioDisabled();
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback executed by audio renderer to update clock time.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnAudioTimeUpdate(base::TimeDelta time, base::TimeDelta max_time);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback executed by video renderer to update clock time.
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnVideoTimeUpdate(base::TimeDelta max_time);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The following "task" methods correspond to the public methods, but these
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // methods are run as the result of posting a task to the PipelineInternal's
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // message loop.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartTask(scoped_ptr<FilterCollection> filter_collection,
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 const base::Closure& ended_cb,
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const PipelineStatusCB& error_cb,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const PipelineStatusCB& seek_cb,
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 const BufferingStateCB& buffering_state_cb,
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 const base::Closure& duration_change_cb);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stops and destroys all filters, placing the pipeline in the kStopped state.
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StopTask(const base::Closure& stop_cb);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Carries out stopping and destroying all filters, placing the pipeline in
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the kStopped state.
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ErrorChangedTask(PipelineStatus error);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Carries out notifying filters that the playback rate has changed.
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PlaybackRateChangedTask(float playback_rate);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Carries out notifying filters that the volume has changed.
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void VolumeChangedTask(float volume);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Carries out notifying filters that we are seeking to a new timestamp.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SeekTask(base::TimeDelta time, const PipelineStatusCB& seek_cb);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles audio/video ended logic and running |ended_cb_|.
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoAudioRendererEnded();
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoVideoRendererEnded();
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunEndedCallbackIfNeeded();
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Carries out disabling the audio renderer.
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AudioDisabledTask();
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Kicks off initialization for each media object, executing |done_cb| with
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the result when completed.
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitializeDemuxer(const PipelineStatusCB& done_cb);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitializeAudioRenderer(const PipelineStatusCB& done_cb);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitializeVideoRenderer(const PipelineStatusCB& done_cb);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Kicks off destroying filters. Called by StopTask() and ErrorChangedTask().
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When we start to tear down the pipeline, we will consider two cases:
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 1. when pipeline has not been initialized, we will transit to stopping
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // state first.
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2. when pipeline has been initialized, we will first transit to pausing
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // => flushing => stopping => stopped state.
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This will remove the race condition during stop between filters.
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TearDownPipeline();
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Compute the time corresponding to a byte offset.
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta TimeForByteOffset_Locked(int64 byte_offset) const;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnStateTransition(PipelineStatus status);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StateTransitionTask(PipelineStatus status);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initiates an asynchronous preroll call sequence executing |done_cb|
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // with the final status when completed.
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoInitialPreroll(const PipelineStatusCB& done_cb);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initiates an asynchronous pause-flush-seek-preroll call sequence
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // executing |done_cb| with the final status when completed.
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(scherkus): Prerolling should be separate from seeking so we can report
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // finer grained ready states (HAVE_CURRENT_DATA vs. HAVE_FUTURE_DATA)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // indepentent from seeking.
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoSeek(base::TimeDelta seek_timestamp, const PipelineStatusCB& done_cb);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates playback rate and volume and initiates an asynchronous play call
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sequence executing |done_cb| with the final status when completed.
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoPlay(const PipelineStatusCB& done_cb);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initiates an asynchronous pause-flush-stop call sequence executing
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |done_cb| when completed.
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoStop(const PipelineStatusCB& done_cb);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnStopCompleted(PipelineStatus status);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnAudioUnderflow();
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartClockIfWaitingForTimeUpdate_Locked();
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Message loop used to execute pipeline tasks.
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> message_loop_;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MediaLog to which to log events.
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<MediaLog> media_log_;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lock used to serialize access for the following data members.
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mutable base::Lock lock_;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether or not the pipeline is running.
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool running_;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Amount of available buffered data.  Set by filters.
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Ranges<int64> buffered_byte_ranges_;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Ranges<base::TimeDelta> buffered_time_ranges_;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True when AddBufferedByteRange() has been called more recently than
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DidLoadingProgress().
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mutable bool did_loading_progress_;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Total size of the media.  Set by filters.
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 total_bytes_;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Video's natural width and height.  Set by filters.
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size natural_size_;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Current volume level (from 0.0f to 1.0f).  This value is set immediately
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // via SetVolume() and a task is dispatched on the message loop to notify the
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // filters.
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float volume_;
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Current playback rate (>= 0.0f).  This value is set immediately via
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SetPlaybackRate() and a task is dispatched on the message loop to notify
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the filters.
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float playback_rate_;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // base::TickClock used by |clock_|.
3777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DefaultTickClock default_tick_clock_;
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reference clock.  Keeps track of current playback time.  Uses system
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // clock and linear interpolation, but can have its time manually set
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // by filters.
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Clock> clock_;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If this value is set to true, then |clock_| is paused and we are waiting
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for an update of the clock greater than or equal to the elapsed time to
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // start the clock.
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool waiting_for_clock_update_;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Status of the pipeline.  Initialized to PIPELINE_OK which indicates that
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the pipeline is operating correctly. Any other value indicates that the
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pipeline is stopped or is stopping.  Clients can call the Stop() method to
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reset the pipeline state, and restore this to PIPELINE_OK.
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PipelineStatus status_;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether the media contains rendered audio and video streams.
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(fischman,scherkus): replace these with checks for
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // {audio,video}_decoder_ once extraction of {Audio,Video}Decoder from the
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Filter heirarchy is done.
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool has_audio_;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool has_video_;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The following data members are only accessed by tasks posted to
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |message_loop_|.
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Member that tracks the current state.
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  State state_;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether we've received the audio/video ended events.
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool audio_ended_;
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool video_ended_;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set to true in DisableAudioRendererTask().
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool audio_disabled_;
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Temporary callback used for Start() and Seek().
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PipelineStatusCB seek_cb_;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Temporary callback used for Stop().
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure stop_cb_;
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Permanent callbacks passed in via Start().
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Closure ended_cb_;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PipelineStatusCB error_cb_;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BufferingStateCB buffering_state_cb_;
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Closure duration_change_cb_;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Contains the demuxer and renderers to use when initializing.
428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<FilterCollection> filter_collection_;
429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Holds the initialized demuxer. Used for seeking. Owned by client.
431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Demuxer* demuxer_;
432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Holds the initialized renderers. Used for setting the volume,
434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // playback rate, and determining when playback has finished.
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<AudioRenderer> audio_renderer_;
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<VideoRenderer> video_renderer_;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PipelineStatistics statistics_;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Time of pipeline creation; is non-zero only until the pipeline first
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reaches "kStarted", at which point it is used & zeroed out.
4427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::TimeTicks creation_time_;
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<SerialRunner> pending_callbacks_;
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ThreadChecker thread_checker_;
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Pipeline);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // MEDIA_BASE_PIPELINE_H_
454