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

Unified Diff: media/base/pipeline.h

Issue 503053007: Revert of media: Introduce Renderer interface and RendererImpl. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 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 | « media/base/mock_filters.cc ('k') | media/base/pipeline.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/base/pipeline.h
diff --git a/media/base/pipeline.h b/media/base/pipeline.h
index fed95a3f2743dde7971c3b4711f34978d91cdc2d..fe5962a4dd2831dc05ed5309270e1667b6ff67cb 100644
--- a/media/base/pipeline.h
+++ b/media/base/pipeline.h
@@ -5,11 +5,15 @@
#ifndef MEDIA_BASE_PIPELINE_H_
#define MEDIA_BASE_PIPELINE_H_
+#include <string>
+
#include "base/gtest_prod_util.h"
#include "base/memory/weak_ptr.h"
+#include "base/synchronization/condition_variable.h"
#include "base/synchronization/lock.h"
#include "base/threading/thread_checker.h"
#include "base/time/default_tick_clock.h"
+#include "media/base/audio_renderer.h"
#include "media/base/buffering_state.h"
#include "media/base/demuxer.h"
#include "media/base/media_export.h"
@@ -28,10 +32,11 @@
class FilterCollection;
class MediaLog;
-class Renderer;
class TextRenderer;
class TextTrackConfig;
class TimeDeltaInterpolator;
+class TimeSource;
+class VideoRenderer;
// Metadata describing a pipeline once it has been initialized.
struct PipelineMetadata {
@@ -173,6 +178,10 @@
// Gets the current pipeline statistics.
PipelineStatistics GetStatistics() const;
+ void set_underflow_disabled_for_testing(bool disabled) {
+ underflow_disabled_for_testing_ = disabled;
+ }
+ void SetTimeDeltaInterpolatorForTesting(TimeDeltaInterpolator* interpolator);
void SetErrorForTesting(PipelineStatus status);
bool HasWeakPtrsForTesting() const;
@@ -186,7 +195,8 @@
enum State {
kCreated,
kInitDemuxer,
- kInitRenderer,
+ kInitAudioRenderer,
+ kInitVideoRenderer,
kSeeking,
kPlaying,
kStopping,
@@ -219,6 +229,12 @@
// Callback executed by filters to update statistics.
void OnUpdateStatistics(const PipelineStatistics& stats);
+ // Callback executed by audio renderer to update clock time.
+ void OnAudioTimeUpdate(base::TimeDelta time, base::TimeDelta max_time);
+
+ // Callback executed by video renderer to update clock time.
+ void OnVideoTimeUpdate(base::TimeDelta max_time);
+
// 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.
@@ -241,7 +257,8 @@
void SeekTask(base::TimeDelta time, const PipelineStatusCB& seek_cb);
// Callbacks executed when a renderer has ended.
- void OnRendererEnded();
+ void OnAudioRendererEnded();
+ void OnVideoRendererEnded();
void OnTextRendererEnded();
void RunEndedCallbackIfNeeded();
@@ -255,7 +272,20 @@
// 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);
+ void InitializeAudioRenderer(const PipelineStatusCB& done_cb);
+ void InitializeVideoRenderer(const PipelineStatusCB& done_cb);
+
+ // Kicks off destroying filters. Called by StopTask() and ErrorChangedTask().
+ // When we start to tear down the pipeline, we will consider two cases:
+ // 1. when pipeline has not been initialized, we will transit to stopping
+ // state first.
+ // 2. when pipeline has been initialized, we will first transit to pausing
+ // => flushing => stopping => stopped state.
+ // This will remove the race condition during stop between filters.
+ void TearDownPipeline();
+
+ // Compute the time corresponding to a byte offset.
+ base::TimeDelta TimeForByteOffset_Locked(int64 byte_offset) const;
void OnStateTransition(PipelineStatus status);
void StateTransitionTask(PipelineStatus status);
@@ -269,7 +299,23 @@
void DoStop(const PipelineStatusCB& done_cb);
void OnStopCompleted(PipelineStatus status);
- void BufferingStateChanged(BufferingState new_buffering_state);
+ // Collection of callback methods and helpers for tracking changes in
+ // buffering state and transition from paused/underflow states and playing
+ // states.
+ //
+ // While in the kPlaying state:
+ // - A waiting to non-waiting transition indicates preroll has completed
+ // and StartPlayback() should be called
+ // - A non-waiting to waiting transition indicates underflow has occurred
+ // and PausePlayback() should be called
+ void BufferingStateChanged(BufferingState* buffering_state,
+ BufferingState new_buffering_state);
+ bool WaitingForEnoughData() const;
+ void PausePlayback();
+ void StartPlayback();
+
+ void PauseClockAndStopTicking_Locked();
+ void StartClockIfWaitingForTimeUpdate_Locked();
// Task runner used to execute pipeline tasks.
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
@@ -302,6 +348,26 @@
// Current duration as reported by |demuxer_|.
base::TimeDelta duration_;
+
+ // base::TickClock used by |interpolator_|.
+ base::DefaultTickClock default_tick_clock_;
+
+ // Tracks the most recent media time update and provides interpolated values
+ // as playback progresses.
+ scoped_ptr<TimeDeltaInterpolator> interpolator_;
+
+ enum InterpolationState {
+ // Audio (if present) is not rendering. Time isn't being interpolated.
+ INTERPOLATION_STOPPED,
+
+ // Audio (if present) is rendering. Time isn't being interpolated.
+ INTERPOLATION_WAITING_FOR_AUDIO_TIME_UPDATE,
+
+ // Audio (if present) is rendering. Time is being interpolated.
+ INTERPOLATION_STARTED,
+ };
+
+ InterpolationState interpolation_state_;
// Status of the pipeline. Initialized to PIPELINE_OK which indicates that
// the pipeline is operating correctly. Any other value indicates that the
@@ -312,8 +378,6 @@
// The following data members are only accessed by tasks posted to
// |task_runner_|.
- bool is_initialized_;
-
// Member that tracks the current state.
State state_;
@@ -321,8 +385,12 @@
base::TimeDelta start_timestamp_;
// Whether we've received the audio/video/text ended events.
- bool renderer_ended_;
- bool text_renderer_ended_;
+ bool audio_ended_;
+ bool video_ended_;
+ bool text_ended_;
+
+ BufferingState audio_buffering_state_;
+ BufferingState video_buffering_state_;
// Temporary callback used for Start() and Seek().
PipelineStatusCB seek_cb_;
@@ -345,12 +413,18 @@
// Holds the initialized renderers. Used for setting the volume,
// playback rate, and determining when playback has finished.
- scoped_ptr<Renderer> renderer_;
+ scoped_ptr<AudioRenderer> audio_renderer_;
+ scoped_ptr<VideoRenderer> video_renderer_;
scoped_ptr<TextRenderer> text_renderer_;
+ // Renderer-provided time source used to control playback.
+ TimeSource* time_source_;
+
PipelineStatistics statistics_;
scoped_ptr<SerialRunner> pending_callbacks_;
+
+ bool underflow_disabled_for_testing_;
base::ThreadChecker thread_checker_;
« 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