[M120][WebMedia]Avoid to push data before ready to seek event 65/320665/3
authorpeng1xiao <peng1.xiao@samsung.com>
Wed, 20 Nov 2024 12:29:12 +0000 (20:29 +0800)
committerBot Blink <blinkbot@samsung.com>
Thu, 21 Nov 2024 06:45:26 +0000 (06:45 +0000)
problem:
resume to play from last time, then restart from 0,
there is discrete pts pushed to decoder after omx flush
it causes output pts chaos from decoder

sloution:
clear buffer queue make sure data to decoder is fresh
after readytoseek is received

Change-Id: I1a64e36616156a4fcddbde30cbf82d8a6e75fb75
Signed-off-by: peng1xiao <peng1.xiao@samsung.com>
tizen_src/chromium_impl/media/filters/media_player_esplusplayer.cc
tizen_src/chromium_impl/media/filters/media_player_esplusplayer.h

index 86e87f7c23fc174b43175c059e77e09fc1bc3c51..57ea02d84f3c26640f6186c95147d9efe2044935 100644 (file)
@@ -394,6 +394,7 @@ void MediaPlayerESPlusPlayer::Release() {
   is_buffering_ = false;
   current_position_ = base::TimeDelta();
   is_seeking_ = false;
+  is_readytoseek_ = false;
   expected_seek_ = false;
   seek_position_ = base::TimeDelta();
   pending_seek_ = false;
@@ -604,6 +605,7 @@ void MediaPlayerESPlusPlayer::SeekInternal(base::TimeDelta time) {
   }
 
   is_seeking_ = true;
+  is_readytoseek_ = false;
   seek_position_ = time;
   pending_seek_ = false;
   pending_seek_position_ = base::TimeDelta();
@@ -632,6 +634,8 @@ void MediaPlayerESPlusPlayer::Flush(base::OnceClosure flush_cb) {
   UpdateBufferedDtsDifference();
 
   expected_seek_ = true;
+  SetShouldFeed(DemuxerStream::AUDIO, false);
+  SetShouldFeed(DemuxerStream::VIDEO, false);
   ClearBufferQueue(DemuxerStream::VIDEO);
   ClearBufferQueue(DemuxerStream::AUDIO);
   buffer_observer_->ResetBufferStatus();
@@ -1066,9 +1070,14 @@ void MediaPlayerESPlusPlayer::OnBufferingStatusChanged(DemuxerStream::Type type,
     case kBufferUnderrun:
     case kBufferMinThreshold:
     case kBufferNormal:
-      is_buffering_ = true;
-      SetShouldFeed(type, true);
-      ReadBuffer(type);
+      if (is_seeking_ && is_readytoseek_ == false) {
+        LOG_ID(INFO, player_id_)
+            << "Ignore the buffer status before read to seek";
+      } else {
+        is_buffering_ = true;
+        SetShouldFeed(type, true);
+        ReadBuffer(type);
+      }
       break;
     case kBufferMaxThreshold:
     case kBufferOverflow:
@@ -1484,7 +1493,7 @@ void MediaPlayerESPlusPlayer::OnReadyToSeek(
     return;
   }
   LOG_ID(INFO, player_id_) << "(" << static_cast<void*>(this) << ") "
-                           << __func__ << " : "
+                           << __func__ << " (clear queue first): "
                            << DemuxerStream::GetTypeName(
                                   GetDemuxerStreamType(stream_type))
                            << " : " << seek_time;
@@ -1493,7 +1502,8 @@ void MediaPlayerESPlusPlayer::OnReadyToSeek(
     LOG_ID(INFO, player_id_) << "player is destroyed:" << (void*)this;
     return;
   }
-
+  is_readytoseek_ = true;
+  ClearBufferQueue(GetDemuxerStreamType(stream_type));
   SetShouldFeed(GetDemuxerStreamType(stream_type), true);
   SetIsEos(GetDemuxerStreamType(stream_type), false);
   ReadBuffer(GetDemuxerStreamType(stream_type));
@@ -1516,6 +1526,7 @@ void MediaPlayerESPlusPlayer::OnSeekComplete() {
   current_position_ = seek_position_;
   is_seeking_ = false;
   expected_seek_ = false;
+  is_readytoseek_ = false;
   seek_position_ = base::TimeDelta();
 
   if (!is_paused_)
index c8120b945369f82f7f2e52760cc5b4f19b246056..eacf05286ee612505354936943444b3c93d1d36b 100644 (file)
@@ -225,6 +225,7 @@ class MEDIA_EXPORT MediaPlayerESPlusPlayer : public MediaPlayerTizen {
 
   bool expected_seek_ = false;
   bool is_seeking_ = false;
+  bool is_readytoseek_ = false;
   base::TimeDelta seek_position_;
 
   bool pending_seek_ = false;