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