| Index: media/base/pipeline.h
|
| ===================================================================
|
| --- media/base/pipeline.h (revision 8115)
|
| +++ media/base/pipeline.h (working copy)
|
| @@ -1,89 +1,146 @@
|
| -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
|
| +// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| // The pipeline is the public API clients use for playing back media. Clients
|
| // provide a filter factory containing the filters they want the pipeline to
|
| // use to render media.
|
| -//
|
| -// Playback controls (play, pause, seek) are asynchronous and clients are
|
| -// notified via callbacks.
|
|
|
| #ifndef MEDIA_BASE_PIPELINE_H_
|
| #define MEDIA_BASE_PIPELINE_H_
|
|
|
| +#include <string>
|
| +
|
| #include "base/task.h"
|
| +#include "media/base/factory.h"
|
|
|
| namespace media {
|
|
|
| -class FilterFactoryInterface;
|
| +// Error definitions for pipeline.
|
| +enum PipelineError {
|
| + PIPELINE_OK,
|
| + PIPELINE_ERROR_NETWORK,
|
| + PIPELINE_ERROR_DECODE,
|
| + PIPELINE_ERROR_ABORT,
|
| + PIPELINE_ERROR_INITIALIZATION_FAILED,
|
| + PIPELINE_STOPPING
|
| +};
|
|
|
| -enum PipelineState {
|
| - PS_UNINITIALIZED,
|
| - PS_PLAY,
|
| - PS_PAUSE,
|
| - PS_SEEK,
|
| - PS_SHUTDOWN
|
| +// Base class for Pipeline class which allows for read-only access to members.
|
| +// Filters are allowed to access the PipelineStatus interface but are not given
|
| +// access to the client Pipeline methods.
|
| +class PipelineStatus {
|
| + public:
|
| + // Returns the current initialization state of the pipeline. Clients can
|
| + // examine this to determine if it is acceptable to call SetRate/SetVolume/
|
| + // Seek after calling Start on the pipeline. Note that this will be
|
| + // set to true prior to a call to the client's |init_complete_callback| if
|
| + // initialization is successful.
|
| + virtual bool IsInitialized() const = 0;
|
| +
|
| + // Get the duration of the media in microseconds. If the duration has not
|
| + // been determined yet, then returns 0.
|
| + virtual int64 GetDuration() const = 0;
|
| +
|
| + // Get the approximate amount of playable data buffered so far in micro-
|
| + // seconds.
|
| + virtual int64 GetBufferedTime() const = 0;
|
| +
|
| + // Get the total size of the media file. If the size has not yet been
|
| + // determined or can not be determined, this value is 0.
|
| + virtual int64 GetTotalBytes() const = 0;
|
| +
|
| + // Get the total number of bytes that are buffered on the client and ready to
|
| + // be played.
|
| + virtual int64 GetBufferedBytes() const = 0;
|
| +
|
| + // Gets the size of the video output in pixel units. If there is no video
|
| + // or the video has not been rendered yet, the width and height will be 0.
|
| + virtual void GetVideoSize(size_t* width_out, size_t* height_out) const = 0;
|
| +
|
| + // Gets the current volume setting being used by the audio renderer. When
|
| + // the pipeline is started, this value will be 1.0f. Valid values range
|
| + // from 0.0f to 1.0f.
|
| + virtual float GetVolume() const = 0;
|
| +
|
| + // Gets the current playback rate of the pipeline. When the pipeline is
|
| + // started, the playback rate will be 0.0f. A rate of 1.0f indicates
|
| + // that the pipeline is rendering the media at the standard rate. Valid
|
| + // values for playback rate are >= 0.0f.
|
| + virtual float GetPlaybackRate() const = 0;
|
| +
|
| + // Gets the current pipeline time in microseconds. For a pipeline "time"
|
| + // progresses from 0 to the end of the media.
|
| + virtual int64 GetTime() const = 0;
|
| +
|
| + // Gets the current error status for the pipeline. If the pipeline is
|
| + // operating correctly, this will return OK.
|
| + virtual PipelineError GetError() const = 0;
|
| +
|
| + protected:
|
| + virtual ~PipelineStatus() = 0;
|
| };
|
|
|
| -class Pipeline : public base::RefCountedThreadSafe<Pipeline> {
|
| +
|
| +class Pipeline : public PipelineStatus {
|
| public:
|
| // Build a pipeline to render the given URI using the given filter factory to
|
| // construct a filter chain. Returns true if successful, false otherwise
|
| - // (i.e., pipeline already initialized).
|
| + // (i.e., pipeline already started). Note that a return value of true
|
| + // only indicates that the initialization process has started successfully.
|
| + // Pipeline initializaion is an inherently asynchronous process. Clients
|
| + // should not call SetPlaybackRate, Seek, or SetVolume until initialization
|
| + // is complete. Clients can either poll the IsInitialized() method (which is
|
| + // discouraged) or use the init_complete_callback as described below.
|
| //
|
| - // This method is asynchronous and will execute a state change callback when
|
| - // completed.
|
| - virtual bool Initialize(FilterFactoryInterface* filter_factory,
|
| - const std::string& uri) = 0;
|
| -
|
| - // Attempt to play the media. Returns true if successful, false otherwise
|
| - // (i.e., pipeline is unititalized).
|
| + // This method is asynchronous and can execute a callback when completed.
|
| + // If the caller provides an init_complete_callback, it will be
|
| + // called when the pipeline initiailization completes. If successful, the
|
| + // callback's bool parameter will be true. If the callback is called with
|
| + // false, then the client can use the GetError method to obtain more
|
| + // information about the reason initialization failed. The prototype for
|
| + // the client callback is:
|
| + // void Client::PipelineInitComplete(bool init_was_successful);
|
| //
|
| - // This method is asynchronous and will execute a state change callback when
|
| - // completed.
|
| - virtual bool Play() = 0;
|
| + // Note that clients must not call the Stop method from within the
|
| + // init_complete_callback. Other methods, including SetPlaybackRate,
|
| + // Seek, and SetVolume may be called. The client will be called on a
|
| + // thread owned by the pipeline class, not on the thread that originally
|
| + // called the Start method.
|
| + virtual bool Start(FilterFactory* filter_factory,
|
| + const std::string& uri,
|
| + Callback1<bool>::Type* init_complete_callback) = 0;
|
|
|
| - // Attempt to pause the media. Returns true if successful, false otherwise
|
| - // (i.e., pipeline is unititalized). Pause() is not a toggle and should not
|
| - // resume playback if already paused.
|
| + // Stops the pipeline and resets to an uninitialized state. This method
|
| + // will block the calling thread until the pipeline has been completely
|
| + // torn down and reset to an uninitialized state. After calling Stop, it
|
| + // is acceptable to call Start again since Stop leaves the pipeline
|
| + // in a state identical to a newly created pipeline.
|
| + virtual void Stop() = 0;
|
| +
|
| + // Attempt to adjust the playback rate. Returns true if successful,
|
| + // false otherwise. Setting a playback rate of 0.0f pauses all rendering
|
| + // of the media. A rate of 1.0f indicates a normal playback rate. Values
|
| + // for the playback rate must be greater than or equal to 0.0f.
|
| + // TODO(ralphl) What about maximum rate? Does HTML5 specify a max?
|
| //
|
| - // This method is asynchronous and will execute a state change callback when
|
| - // completed.
|
| - virtual bool Pause() = 0;
|
| + // This method must be called only after initialization has completed.
|
| + virtual bool SetPlaybackRate(float playback_rate) = 0;
|
|
|
| // Attempt to seek to the position in microseconds. Returns true if
|
| // successful, false otherwise. Playback is paused after the seek completes.
|
| //
|
| - // This method is asynchronous and will execute a state change callback when
|
| - // completed.
|
| - virtual bool Seek(int64 seek_position) = 0;
|
| + // This method must be called only after initialization has completed.
|
| + virtual bool Seek(int64 time) = 0;
|
|
|
| - // Shutdown the pipeline and destroy the filter chain.
|
| - virtual void Shutdown() = 0;
|
| -
|
| - // Returns the current playback position in microseconds.
|
| - virtual int64 GetTime() const = 0;
|
| -
|
| - // Returns the media duration in microseconds. Returns zero if the duration
|
| - // is not known (i.e., streaming media).
|
| - virtual int64 GetDuration() const = 0;
|
| -
|
| - // Set a callback to receive state change notifications. This callback is
|
| - // executed only after the state transition has been successfully carried out.
|
| - // For example, calling Play() will only execute a callback with PS_PLAY
|
| - // some time in the future.
|
| - virtual void SetStateChangedCallback(
|
| - Callback1<PipelineState>::Type* callback) = 0;
|
| -
|
| - // Set a callback to receive time change notifications.
|
| - virtual void SetTimeChangedCallback(Callback1<int64>::Type* callback) = 0;
|
| -
|
| - protected:
|
| - friend class base::RefCountedThreadSafe<Pipeline>;
|
| - virtual ~Pipeline() {}
|
| + // Attempt to set the volume of the audio renderer. Valid values for volume
|
| + // range from 0.0f (muted) to 1.0f (full volume). This value affects all
|
| + // channels proportionately for multi-channel audio streams.
|
| + //
|
| + // This method must be called only after initialization has completed.
|
| + virtual bool SetVolume(float volume) = 0;
|
| };
|
|
|
| } // namespace media
|
|
|
| -#endif // MEDIA_BASE_PIPELINE_H_
|
| +#endif // MEDIA_BASE_PIPELINE_H_
|
|
|