| Index: media/base/pipeline_impl.h
|
| diff --git a/media/base/pipeline_impl.h b/media/base/pipeline_impl.h
|
| index 8f0e4ea131d6fe707fd545be1ccef7bf8e68c715..e50322bb127ac5ab304f9279bfa37d0d80e98b6f 100644
|
| --- a/media/base/pipeline_impl.h
|
| +++ b/media/base/pipeline_impl.h
|
| @@ -2,7 +2,8 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -// Implementation of Pipeline.
|
| +// Implementation of Pipeline & PipelineStatusNotification (an async-to-sync
|
| +// callback adapter).
|
|
|
| #ifndef MEDIA_BASE_PIPELINE_IMPL_H_
|
| #define MEDIA_BASE_PIPELINE_IMPL_H_
|
| @@ -15,6 +16,8 @@
|
| #include "base/message_loop.h"
|
| #include "base/ref_counted.h"
|
| #include "base/scoped_ptr.h"
|
| +#include "base/synchronization/condition_variable.h"
|
| +#include "base/synchronization/lock.h"
|
| #include "base/threading/thread.h"
|
| #include "base/time.h"
|
| #include "media/base/clock.h"
|
| @@ -24,6 +27,32 @@
|
|
|
| namespace media {
|
|
|
| +// Adapter for using asynchronous Pipeline methods in code that wants to run
|
| +// synchronously. To use, construct an instance of this class and pass the
|
| +// |Callback()| to the Pipeline method requiring a callback. Then Wait() for
|
| +// the callback to get fired and call status() to see what the callback's
|
| +// argument was. This object is for one-time use; call |Callback()| exactly
|
| +// once.
|
| +class PipelineStatusNotification {
|
| + public:
|
| + PipelineStatusNotification();
|
| + ~PipelineStatusNotification();
|
| +
|
| + // See class-level comment for usage.
|
| + media::PipelineStatusCallback* Callback();
|
| + void Notify(media::PipelineStatus status);
|
| + void Wait();
|
| + media::PipelineStatus status();
|
| +
|
| + private:
|
| + base::Lock lock_;
|
| + base::ConditionVariable cv_;
|
| + media::PipelineStatus status_;
|
| + bool notified_;
|
| + scoped_ptr<media::PipelineStatusCallback> callback_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(PipelineStatusNotification);
|
| +};
|
|
|
| // PipelineImpl runs the media pipeline. Filters are created and called on the
|
| // message loop injected into this object. PipelineImpl works like a state
|
| @@ -67,14 +96,15 @@ class PipelineImpl : public Pipeline, public FilterHost {
|
| explicit PipelineImpl(MessageLoop* message_loop);
|
|
|
| // Pipeline implementation.
|
| - virtual void Init(PipelineCallback* ended_callback,
|
| - PipelineCallback* error_callback,
|
| - PipelineCallback* network_callback);
|
| + virtual void Init(PipelineStatusCallback* ended_callback,
|
| + PipelineStatusCallback* error_callback,
|
| + PipelineStatusCallback* network_callback);
|
| virtual bool Start(FilterCollection* filter_collection,
|
| const std::string& uri,
|
| - PipelineCallback* start_callback);
|
| - virtual void Stop(PipelineCallback* stop_callback);
|
| - virtual void Seek(base::TimeDelta time, PipelineCallback* seek_callback);
|
| + PipelineStatusCallback* start_callback);
|
| + virtual void Stop(PipelineStatusCallback* stop_callback);
|
| + virtual void Seek(base::TimeDelta time,
|
| + PipelineStatusCallback* seek_callback);
|
| virtual bool IsRunning() const;
|
| virtual bool IsInitialized() const;
|
| virtual bool IsNetworkActive() const;
|
| @@ -92,7 +122,6 @@ class PipelineImpl : public Pipeline, public FilterHost {
|
| virtual void GetVideoSize(size_t* width_out, size_t* height_out) const;
|
| virtual bool IsStreaming() const;
|
| virtual bool IsLoaded() const;
|
| - virtual PipelineError GetError() const;
|
| virtual PipelineStatistics GetStatistics() const;
|
|
|
| void SetClockForTesting(Clock* clock);
|
| @@ -155,7 +184,7 @@ class PipelineImpl : public Pipeline, public FilterHost {
|
| State FindNextState(State current);
|
|
|
| // FilterHost implementation.
|
| - virtual void SetError(PipelineError error);
|
| + virtual void SetError(PipelineStatus error);
|
| virtual base::TimeDelta GetTime() const;
|
| virtual base::TimeDelta GetDuration() const;
|
| virtual void SetTime(base::TimeDelta time);
|
| @@ -190,7 +219,7 @@ class PipelineImpl : public Pipeline, public FilterHost {
|
| // message loop.
|
| void StartTask(FilterCollection* filter_collection,
|
| const std::string& url,
|
| - PipelineCallback* start_callback);
|
| + PipelineStatusCallback* start_callback);
|
|
|
| // InitializeTask() performs initialization in multiple passes. It is executed
|
| // as a result of calling Start() or InitializationComplete() that advances
|
| @@ -199,11 +228,11 @@ class PipelineImpl : public Pipeline, public FilterHost {
|
| void InitializeTask();
|
|
|
| // Stops and destroys all filters, placing the pipeline in the kStopped state.
|
| - void StopTask(PipelineCallback* stop_callback);
|
| + void StopTask(PipelineStatusCallback* stop_callback);
|
|
|
| // Carries out stopping and destroying all filters, placing the pipeline in
|
| // the kError state.
|
| - void ErrorChangedTask(PipelineError error);
|
| + void ErrorChangedTask(PipelineStatus error);
|
|
|
| // Carries out notifying filters that the playback rate has changed.
|
| void PlaybackRateChangedTask(float playback_rate);
|
| @@ -212,7 +241,7 @@ class PipelineImpl : public Pipeline, public FilterHost {
|
| void VolumeChangedTask(float volume);
|
|
|
| // Carries out notifying filters that we are seeking to a new timestamp.
|
| - void SeekTask(base::TimeDelta time, PipelineCallback* seek_callback);
|
| + void SeekTask(base::TimeDelta time, PipelineStatusCallback* seek_callback);
|
|
|
| // Carries out handling a notification from a filter that it has ended.
|
| void NotifyEndedTask();
|
| @@ -245,7 +274,7 @@ class PipelineImpl : public Pipeline, public FilterHost {
|
| // The following initialize methods are used to select a specific type of
|
| // Filter object from FilterCollection and initialize it asynchronously.
|
| void InitializeDemuxer();
|
| - void OnDemuxerBuilt(PipelineError error, Demuxer* demuxer);
|
| + void OnDemuxerBuilt(PipelineStatus status, Demuxer* demuxer);
|
|
|
| // Returns true if the asynchronous action of creating decoder has started.
|
| // Returns false if this method did nothing because the corresponding
|
| @@ -351,7 +380,7 @@ class PipelineImpl : public Pipeline, public FilterHost {
|
| // the pipeline is operating correctly. Any other value indicates that the
|
| // pipeline is stopped or is stopping. Clients can call the Stop() method to
|
| // reset the pipeline state, and restore this to PIPELINE_OK.
|
| - PipelineError error_;
|
| + PipelineStatus status_;
|
|
|
| // Whether the media contains rendered audio and video streams.
|
| bool has_audio_;
|
| @@ -386,11 +415,11 @@ class PipelineImpl : public Pipeline, public FilterHost {
|
| std::string url_;
|
|
|
| // Callbacks for various pipeline operations.
|
| - scoped_ptr<PipelineCallback> seek_callback_;
|
| - scoped_ptr<PipelineCallback> stop_callback_;
|
| - scoped_ptr<PipelineCallback> ended_callback_;
|
| - scoped_ptr<PipelineCallback> error_callback_;
|
| - scoped_ptr<PipelineCallback> network_callback_;
|
| + scoped_ptr<PipelineStatusCallback> seek_callback_;
|
| + scoped_ptr<PipelineStatusCallback> stop_callback_;
|
| + scoped_ptr<PipelineStatusCallback> ended_callback_;
|
| + scoped_ptr<PipelineStatusCallback> error_callback_;
|
| + scoped_ptr<PipelineStatusCallback> network_callback_;
|
|
|
| // Reference to the filter(s) that constitute the pipeline.
|
| scoped_refptr<Filter> pipeline_filter_;
|
|
|