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

Unified Diff: media/base/pipeline_impl.h

Issue 1999893004: Splits PipelineImpl into main and media thread components. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: restores posting stop done_cb Created 4 years, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | media/base/pipeline_impl.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/base/pipeline_impl.h
diff --git a/media/base/pipeline_impl.h b/media/base/pipeline_impl.h
index 3a8a90a0ac58d6914c4a9e49e4f134e9b646da14..beb0b010492b908fc56ffcbc6de193779f045ac2 100644
--- a/media/base/pipeline_impl.h
+++ b/media/base/pipeline_impl.h
@@ -7,23 +7,12 @@
#include <memory>
-#include "base/gtest_prod_util.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
-#include "base/synchronization/lock.h"
#include "base/threading/thread_checker.h"
-#include "base/time/time.h"
-#include "media/base/buffering_state.h"
-#include "media/base/cdm_context.h"
-#include "media/base/demuxer.h"
#include "media/base/media_export.h"
#include "media/base/pipeline.h"
-#include "media/base/pipeline_status.h"
-#include "media/base/ranges.h"
-#include "media/base/renderer_client.h"
-#include "media/base/serial_runner.h"
-#include "media/base/text_track.h"
namespace base {
class SingleThreadTaskRunner;
@@ -32,7 +21,6 @@ class SingleThreadTaskRunner;
namespace media {
class MediaLog;
-class Renderer;
class TextRenderer;
// Pipeline runs the media pipeline. Filters are created and called on the
@@ -75,9 +63,7 @@ class TextRenderer;
// TODO(sandersd): It should be possible to pass through Suspended when going
// from InitDemuxer to InitRenderer, thereby eliminating the Resuming state.
// Some annoying differences between the two paths need to be removed first.
-class MEDIA_EXPORT PipelineImpl : public Pipeline,
- public DemuxerHost,
- public RendererClient {
+class MEDIA_EXPORT PipelineImpl : public Pipeline {
public:
// Constructs a media pipeline that will execute media tasks on
// |media_task_runner|.
@@ -86,9 +72,6 @@ class MEDIA_EXPORT PipelineImpl : public Pipeline,
MediaLog* media_log);
~PipelineImpl() override;
- void SetErrorForTesting(PipelineStatus status);
- bool HasWeakPtrsForTesting() const;
-
// Pipeline implementation.
void Start(Demuxer* demuxer,
std::unique_ptr<Renderer> renderer,
@@ -96,13 +79,13 @@ class MEDIA_EXPORT PipelineImpl : public Pipeline,
const PipelineStatusCB& seek_cb) override;
void Stop() override;
void Seek(base::TimeDelta time, const PipelineStatusCB& seek_cb) override;
- bool IsRunning() const override;
- double GetPlaybackRate() const override;
- void SetPlaybackRate(double playback_rate) override;
void Suspend(const PipelineStatusCB& suspend_cb) override;
void Resume(std::unique_ptr<Renderer> renderer,
- base::TimeDelta timestamp,
+ base::TimeDelta time,
const PipelineStatusCB& seek_cb) override;
+ bool IsRunning() const override;
+ double GetPlaybackRate() const override;
+ void SetPlaybackRate(double playback_rate) override;
float GetVolume() const override;
void SetVolume(float volume) override;
base::TimeDelta GetMediaTime() const override;
@@ -115,9 +98,11 @@ class MEDIA_EXPORT PipelineImpl : public Pipeline,
private:
friend class MediaLog;
- friend class PipelineImplTest;
+ class RendererWrapper;
// Pipeline states, as described above.
+ // TODO(alokp): Move this to RendererWrapper after removing the references
+ // from MediaLog.
enum State {
kCreated,
kInitDemuxer,
@@ -130,212 +115,66 @@ class MEDIA_EXPORT PipelineImpl : public Pipeline,
kSuspended,
kResuming,
};
-
- // Updates |state_|. All state transitions should use this call.
- void SetState(State next_state);
-
static const char* GetStateString(State state);
- State GetNextState() const;
-
- // Helper method that runs & resets |seek_cb_| and resets |seek_timestamp_|
- // and |seek_pending_|.
- void FinishSeek();
-
- // DemuxerHost implementaion.
- void OnBufferedTimeRangesChanged(
- const Ranges<base::TimeDelta>& ranges) override;
- void SetDuration(base::TimeDelta duration) override;
- void OnDemuxerError(PipelineStatus error) override;
- void AddTextStream(DemuxerStream* text_stream,
- const TextTrackConfig& config) override;
- void RemoveTextStream(DemuxerStream* text_stream) override;
-
- // RendererClient implementation.
- void OnError(PipelineStatus error) override;
- void OnEnded() override;
- void OnStatisticsUpdate(const PipelineStatistics& stats) override;
- void OnBufferingStateChange(BufferingState state) override;
- void OnWaitingForDecryptionKey() override;
- void OnVideoNaturalSizeChange(const gfx::Size& size) override;
- void OnVideoOpacityChange(bool opaque) override;
-
- // The following "task" methods correspond to the public methods, but these
- // methods are run as the result of posting a task to the Pipeline's
- // task runner.
- void StartTask();
-
- // Suspends the pipeline, discarding the current renderer.
- void SuspendTask(const PipelineStatusCB& suspend_cb);
-
- // Resumes the pipeline with a new renderer, and initializes it with a seek.
- void ResumeTask(std::unique_ptr<Renderer> renderer,
- base::TimeDelta timestamp,
- const PipelineStatusCB& seek_sb);
-
- // Stops and destroys all filters, placing the pipeline in the kStopped state.
- void StopTask(const base::Closure& stop_cb);
-
- // Carries out stopping and destroying all filters, placing the pipeline in
- // the kStopped state.
- void ErrorChangedTask(PipelineStatus error);
- // Carries out notifying filters that the playback rate has changed.
- void PlaybackRateChangedTask(double playback_rate);
-
- // Carries out notifying filters that the volume has changed.
- void VolumeChangedTask(float volume);
-
- // Carries out notifying filters that we are seeking to a new timestamp.
- void SeekTask(base::TimeDelta time, const PipelineStatusCB& seek_cb);
-
- // Carries out setting the |cdm_context| in |renderer_|, and then fires
- // |cdm_attached_cb| with the result. If |renderer_| is null,
- // |cdm_attached_cb| will be fired immediately with true, and |cdm_context|
- // will be set in |renderer_| later when |renderer_| is created.
- void SetCdmTask(CdmContext* cdm_context,
- const CdmAttachedCB& cdm_attached_cb);
- void OnCdmAttached(const CdmAttachedCB& cdm_attached_cb,
- CdmContext* cdm_context,
- bool success);
-
- // Callbacks executed when text renderer has ended.
- void OnTextRendererEnded();
- void RunEndedCallbackIfNeeded();
-
- std::unique_ptr<TextRenderer> CreateTextRenderer();
-
- // Carries out adding a new text stream to the text renderer.
- void AddTextStreamTask(DemuxerStream* text_stream,
- const TextTrackConfig& config);
-
- // Carries out removing a text stream from the text renderer.
- void RemoveTextStreamTask(DemuxerStream* text_stream);
-
- // Callbacks executed when a text track is added.
+ // Notifications from RendererWrapper.
+ void OnError(PipelineStatus error);
+ void OnEnded();
+ void OnMetadata(PipelineMetadata metadata);
+ void OnBufferingStateChange(BufferingState state);
+ void OnDurationChange(base::TimeDelta duration);
void OnAddTextTrack(const TextTrackConfig& config,
const AddTextTrackDoneCB& done_cb);
+ void OnWaitingForDecryptionKey();
+ void OnVideoNaturalSizeChange(const gfx::Size& size);
+ void OnVideoOpacityChange(bool opaque);
+ void OnBufferedTimeRangesChange(const Ranges<base::TimeDelta>& ranges);
+ void OnStatisticsUpdate(const PipelineStatistics& stats);
- // Kicks off initialization for each media object, executing |done_cb| with
- // the result when completed.
- void InitializeDemuxer(const PipelineStatusCB& done_cb);
- void InitializeRenderer(const PipelineStatusCB& done_cb);
+ // Task completion callbacks from RendererWrapper.
+ void OnSeekDone(base::TimeDelta start_time);
+ void OnSuspendDone(base::TimeDelta suspend_time);
- void StateTransitionTask(PipelineStatus status);
-
- // Initiates an asynchronous pause-flush-seek-preroll call sequence
- // executing |done_cb| with the final status when completed.
- void DoSeek(base::TimeDelta seek_timestamp, const PipelineStatusCB& done_cb);
-
- // Stops media rendering and executes |stop_cb_| when done.
- void DoStop();
-
- void ReportMetadata();
-
- // Task runner of the thread on which this class is constructed.
- // Also used to post notifications on Pipeline::Client object.
- const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
-
- // Task runner used to execute pipeline tasks.
+ // Parameters passed in the constructor.
const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
+ const scoped_refptr<MediaLog> media_log_;
- // MediaLog to which to log events.
- scoped_refptr<MediaLog> media_log_;
+ // Pipeline client. Valid only while the pipeline is running.
+ Client* client_;
- // Lock used to serialize access for the following data members.
- mutable base::Lock lock_;
+ // RendererWrapper instance that runs on the media thread.
+ std::unique_ptr<RendererWrapper> renderer_wrapper_;
- // Whether or not the pipeline is running.
- bool running_;
+ // Temporary callback used for Start(), Seek(), and Resume().
+ PipelineStatusCB seek_cb_;
- // Amount of available buffered data as reported by |demuxer_|.
- Ranges<base::TimeDelta> buffered_time_ranges_;
+ // Temporary callback used for Suspend().
+ PipelineStatusCB suspend_cb_;
- // True when OnBufferedTimeRangesChanged() has been called more recently than
- // DidLoadingProgress().
- bool did_loading_progress_;
+ // Current playback rate (>= 0.0). This value is set immediately via
+ // SetPlaybackRate() and a task is dispatched on the task runner to notify
+ // the filters.
+ double playback_rate_;
- // Current volume level (from 0.0f to 1.0f). This value is set immediately
+ // Current volume level (from 0.0f to 1.0f). This value is set immediately
// via SetVolume() and a task is dispatched on the task runner to notify the
// filters.
float volume_;
- // Current playback rate (>= 0.0). This value is set immediately via
- // SetPlaybackRate() and a task is dispatched on the task runner to notify
- // the filters.
- double playback_rate_;
+ // Amount of available buffered data as reported by Demuxer.
+ Ranges<base::TimeDelta> buffered_time_ranges_;
- // Current duration as reported by |demuxer_|.
+ // Current duration as reported by Demuxer.
base::TimeDelta duration_;
- // Status of the pipeline. Initialized to PIPELINE_OK which indicates that
- // 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.
- PipelineStatus status_;
-
- // The following data members are only accessed by tasks posted to
- // |task_runner_|.
-
- // Member that tracks the current state.
- State state_;
-
- // The timestamp to start playback from after starting/seeking/resuming has
- // completed.
- base::TimeDelta start_timestamp_;
-
- // The media timestamp to return while the pipeline is suspended. Otherwise
- // set to kNoTimestamp().
- base::TimeDelta suspend_timestamp_;
-
- // Whether we've received the audio/video/text ended events.
- bool renderer_ended_;
- bool text_renderer_ended_;
-
- // Temporary callback used for Start(), Seek(), and Resume().
- PipelineStatusCB seek_cb_;
-
- // Temporary callback used for Stop().
- base::Closure stop_cb_;
-
- // Temporary callback used for Suspend().
- PipelineStatusCB suspend_cb_;
-
- // Holds the initialized demuxer. Used for seeking. Owned by client.
- Demuxer* demuxer_;
-
- // Holds the initialized renderers. Used for setting the volume,
- // playback rate, and determining when playback has finished.
- std::unique_ptr<Renderer> renderer_;
- std::unique_ptr<TextRenderer> text_renderer_;
-
- // Holds the client passed on Start().
- // Initialized, Dereferenced, and Invalidated on |main_task_runner_|.
- // Used on |media_task_runner_| to post tasks on |main_task_runner_|.
- base::WeakPtr<Client> weak_client_;
- // Created and destroyed on |main_task_runner_|.
- std::unique_ptr<base::WeakPtrFactory<Client>> client_weak_factory_;
+ // True when OnBufferedTimeRangesChange() has been called more recently than
+ // DidLoadingProgress().
+ bool did_loading_progress_;
+ // Accumulated statistics reported by the renderer.
PipelineStatistics statistics_;
- std::unique_ptr<SerialRunner> pending_callbacks_;
-
- // The CdmContext to be used to decrypt (and decode) encrypted stream in this
- // pipeline. It is set when SetCdm() succeeds on the renderer (or when
- // SetCdm() is called before Start()), after which it is guaranteed to outlive
- // this pipeline. The saved value will be used to configure new renderers,
- // when starting or resuming.
- CdmContext* cdm_context_;
-
base::ThreadChecker thread_checker_;
-
- // A weak pointer that can be safely copied on the media thread.
- base::WeakPtr<PipelineImpl> weak_this_;
-
- // Weak pointers must be created on the main thread, and must be dereferenced
- // on the media thread.
- //
- // Declared last so that weak pointers will be invalidated before all other
- // member variables.
base::WeakPtrFactory<PipelineImpl> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(PipelineImpl);
« no previous file with comments | « no previous file | media/base/pipeline_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698