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

Unified Diff: media/base/pipeline.cc

Issue 284763002: Update AudioRenderer API to fire changes in BufferingState. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 7 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
Index: media/base/pipeline.cc
diff --git a/media/base/pipeline.cc b/media/base/pipeline.cc
index 9a7488094259402a467d4587d1b5c911c6676985..9a8fc7cea96253c22aa5ba2908829b8dab7441f9 100644
--- a/media/base/pipeline.cc
+++ b/media/base/pipeline.cc
@@ -412,6 +412,10 @@ void Pipeline::StateTransitionTask(PipelineStatus status) {
PlaybackRateChangedTask(GetPlaybackRate());
VolumeChangedTask(GetVolume());
+ // Handle renderers that immediately signal they have enough data.
+ if (!WaitingForEnoughData())
+ StartPlayback();
+
// We enter this state from either kInitPrerolling or kSeeking. As of now
// both those states call Preroll(), which means by time we enter this
// state we've already buffered enough data. Forcefully update the
@@ -420,11 +424,10 @@ void Pipeline::StateTransitionTask(PipelineStatus status) {
//
// TODO(scherkus): Remove after renderers are taught to fire buffering
// state callbacks http://crbug.com/144683
- DCHECK(WaitingForEnoughData());
- if (audio_renderer_)
- BufferingStateChanged(&audio_buffering_state_, BUFFERING_HAVE_ENOUGH);
- if (video_renderer_)
+ if (video_renderer_) {
+ DCHECK(WaitingForEnoughData());
BufferingStateChanged(&video_buffering_state_, BUFFERING_HAVE_ENOUGH);
+ }
return;
case kStopping:
@@ -451,9 +454,9 @@ void Pipeline::DoInitialPreroll(const PipelineStatusCB& done_cb) {
// Preroll renderers.
if (audio_renderer_) {
- bound_fns.Push(base::Bind(
- &AudioRenderer::Preroll, base::Unretained(audio_renderer_.get()),
- seek_timestamp));
+ bound_fns.Push(base::Bind(&AudioRenderer::StartPlayingFrom,
+ base::Unretained(audio_renderer_.get()),
+ seek_timestamp));
}
if (video_renderer_) {
@@ -522,9 +525,9 @@ void Pipeline::DoSeek(
// Preroll renderers.
if (audio_renderer_) {
- bound_fns.Push(base::Bind(
- &AudioRenderer::Preroll, base::Unretained(audio_renderer_.get()),
- seek_timestamp));
+ bound_fns.Push(base::Bind(&AudioRenderer::StartPlayingFrom,
+ base::Unretained(audio_renderer_.get()),
+ seek_timestamp));
}
if (video_renderer_) {
@@ -857,8 +860,9 @@ void Pipeline::InitializeAudioRenderer(const PipelineStatusCB& done_cb) {
demuxer_->GetStream(DemuxerStream::AUDIO),
done_cb,
base::Bind(&Pipeline::OnUpdateStatistics, base::Unretained(this)),
- base::Bind(&Pipeline::OnAudioUnderflow, base::Unretained(this)),
base::Bind(&Pipeline::OnAudioTimeUpdate, base::Unretained(this)),
+ base::Bind(&Pipeline::BufferingStateChanged, base::Unretained(this),
+ &audio_buffering_state_),
base::Bind(&Pipeline::OnAudioRendererEnded, base::Unretained(this)),
base::Bind(&Pipeline::SetError, base::Unretained(this)));
}
@@ -879,20 +883,6 @@ void Pipeline::InitializeVideoRenderer(const PipelineStatusCB& done_cb) {
base::Bind(&Pipeline::GetMediaDuration, base::Unretained(this)));
}
-void Pipeline::OnAudioUnderflow() {
- if (!task_runner_->BelongsToCurrentThread()) {
- task_runner_->PostTask(FROM_HERE, base::Bind(
- &Pipeline::OnAudioUnderflow, base::Unretained(this)));
- return;
- }
-
- if (state_ != kPlaying)
- return;
-
- if (audio_renderer_)
- audio_renderer_->ResumeAfterUnderflow();
-}
-
void Pipeline::BufferingStateChanged(BufferingState* buffering_state,
BufferingState new_buffering_state) {
DVLOG(1) << __FUNCTION__ << "(" << *buffering_state << ", "
@@ -904,7 +894,7 @@ void Pipeline::BufferingStateChanged(BufferingState* buffering_state,
// Renderer underflowed.
if (!was_waiting_for_enough_data && WaitingForEnoughData()) {
- StartWaitingForEnoughData();
+ PausePlayback();
return;
}
@@ -926,10 +916,11 @@ bool Pipeline::WaitingForEnoughData() const {
return false;
}
-void Pipeline::StartWaitingForEnoughData() {
+void Pipeline::PausePlayback() {
DVLOG(1) << __FUNCTION__;
DCHECK_EQ(state_, kPlaying);
DCHECK(WaitingForEnoughData());
+ DCHECK(task_runner_->BelongsToCurrentThread());
if (audio_renderer_)
audio_renderer_->StopRendering();
@@ -942,6 +933,7 @@ void Pipeline::StartPlayback() {
DVLOG(1) << __FUNCTION__;
DCHECK_EQ(state_, kPlaying);
DCHECK(!WaitingForEnoughData());
+ DCHECK(task_runner_->BelongsToCurrentThread());
if (audio_renderer_) {
// We use audio stream to update the clock. So if there is such a

Powered by Google App Engine
This is Rietveld 408576698