Import Cobalt 2.13610
diff --git a/src/cobalt/build/build.id b/src/cobalt/build/build.id
index a0e7819..b3eeb13 100644
--- a/src/cobalt/build/build.id
+++ b/src/cobalt/build/build.id
@@ -1 +1 @@
-13418
\ No newline at end of file
+13610
\ No newline at end of file
diff --git a/src/media/base/sbplayer_pipeline.cc b/src/media/base/sbplayer_pipeline.cc
index b9d2262..64497b8 100644
--- a/src/media/base/sbplayer_pipeline.cc
+++ b/src/media/base/sbplayer_pipeline.cc
@@ -201,8 +201,6 @@
scoped_refptr<SbPlayerSetBoundsHelper> set_bounds_helper_;
- bool flushing_;
-
// The following member variables can be accessed from WMPI thread but all
// modifications to them happens on the pipeline thread. So any access of
// them from the WMPI thread and any modification to them on the pipeline
@@ -232,7 +230,6 @@
has_video_(false),
audio_read_in_progress_(false),
video_read_in_progress_(false),
- flushing_(false),
set_bounds_helper_(new SbPlayerSetBoundsHelper),
suspended_(false) {}
@@ -327,19 +324,17 @@
seek_cb.Run(PIPELINE_ERROR_INVALID_STATE);
}
+ player_->PrepareForSeek();
+
DCHECK(seek_cb_.is_null());
DCHECK(!seek_cb.is_null());
- flushing_ = true;
-
if (audio_read_in_progress_ || video_read_in_progress_) {
message_loop_->PostTask(
FROM_HERE, base::Bind(&SbPlayerPipeline::Seek, this, time, seek_cb));
return;
}
- player_->PrepareForSeek();
-
{
base::AutoLock auto_lock(lock_);
seek_cb_ = seek_cb;
@@ -637,7 +632,6 @@
DCHECK(message_loop_->BelongsToCurrentThread());
if (status == PIPELINE_OK) {
- flushing_ = false;
player_->Seek(seek_time_);
}
}
@@ -682,7 +676,6 @@
video_read_in_progress_ = false;
}
if (!seek_cb_.is_null()) {
- buffering_state_cb_.Run(kPrerollCompleted);
PipelineStatusCB seek_cb;
{
base::AutoLock auto_lock(lock_);
@@ -718,10 +711,6 @@
return;
}
- if (flushing_) {
- return;
- }
-
if (type == DemuxerStream::AUDIO) {
if (audio_read_in_progress_) {
return;
diff --git a/src/media/base/starboard_player.cc b/src/media/base/starboard_player.cc
index ce5197c..2708468 100644
--- a/src/media/base/starboard_player.cc
+++ b/src/media/base/starboard_player.cc
@@ -40,6 +40,7 @@
ticket_(SB_PLAYER_INITIAL_TICKET),
volume_(1.0),
paused_(true),
+ seek_pending_(false),
state_(kPlaying) {
DCHECK(audio_config.IsValidConfig());
DCHECK(video_config.IsValidConfig());
@@ -131,6 +132,8 @@
void StarboardPlayer::PrepareForSeek() {
DCHECK(message_loop_->BelongsToCurrentThread());
++ticket_;
+ SbPlayerSetPause(player_, true);
+ seek_pending_ = true;
}
void StarboardPlayer::Seek(base::TimeDelta time) {
@@ -154,6 +157,10 @@
++ticket_;
SbPlayerSeek(player_, TimeDeltaToSbMediaTime(time), ticket_);
+ seek_pending_ = false;
+ if (!paused_) {
+ SbPlayerSetPause(player_, false);
+ }
}
void StarboardPlayer::SetVolume(float volume) {
@@ -174,8 +181,10 @@
DCHECK(message_loop_->BelongsToCurrentThread());
DCHECK(SbPlayerIsValid(player_));
- SbPlayerSetPause(player_, pause);
paused_ = pause;
+ if (!seek_pending_) {
+ SbPlayerSetPause(player_, pause);
+ }
}
void StarboardPlayer::GetInfo(uint32* video_frames_decoded,
diff --git a/src/media/base/starboard_player.h b/src/media/base/starboard_player.h
index 0f71acb..2d9dc58 100644
--- a/src/media/base/starboard_player.h
+++ b/src/media/base/starboard_player.h
@@ -131,6 +131,7 @@
int ticket_;
float volume_;
bool paused_;
+ bool seek_pending_;
DecoderBufferCache decoder_buffer_cache_;
// The following variables can be accessed from GetInfo(), which can be called