[MM] Report BufferingState based on the actual buffering status. 07/308407/2
authorSun-woo Nam <sunny.nam@samsung.com>
Fri, 8 Mar 2024 04:44:15 +0000 (20:44 -0800)
committerBot Blink <blinkbot@samsung.com>
Tue, 26 Mar 2024 17:27:33 +0000 (17:27 +0000)
Report BufferingState based on actual espp buffering status.
If it can play when buffered timestamp is 500ms greater than current timestamp
then report BUFFERING_HAVE_ENOUGH.
If current timestamp is greater than buffered timestamp or buffer is flushed
then report BUFFERING_HAVE_NOTHING.
Reporting BufferingState affects setting WebMediaPlayer::ReadyState.

Change-Id: Ice1a8a42a576d62b8b1e837847e5853dcd5156de
Signed-off-by: Sun-woo Nam <sunny.nam@samsung.com>
tizen_src/chromium_impl/media/filters/media_player_esplusplayer.cc
tizen_src/chromium_impl/media/filters/media_player_esplusplayer.h

index 9c7290d..e091b85 100644 (file)
@@ -289,13 +289,11 @@ void MediaPlayerESPlusPlayer::Release() {
   SetShouldFeed(DemuxerStream::AUDIO, false);
   SetIsValid(DemuxerStream::AUDIO, false);
   SetReadRequested(DemuxerStream::AUDIO, false);
-  SetBufferingState(DemuxerStream::AUDIO, BUFFERING_HAVE_NOTHING);
 
   SetIsEos(DemuxerStream::VIDEO, false);
   SetShouldFeed(DemuxerStream::VIDEO, false);
   SetIsValid(DemuxerStream::VIDEO, false);
   SetReadRequested(DemuxerStream::VIDEO, false);
-  SetBufferingState(DemuxerStream::VIDEO, BUFFERING_HAVE_NOTHING);
 
   esplusplayer_set_ready_to_prepare_cb(esplayer_, nullptr, this);
   esplusplayer_set_prepare_async_done_cb(esplayer_, nullptr, this);
@@ -310,6 +308,8 @@ void MediaPlayerESPlusPlayer::Release() {
   buffer_observer_->ResetBufferStatus();
   buffer_observer_->ResetBufferStatusCallbacks();
 
+  reported_buffering_state_ = BUFFERING_HAVE_NOTHING;
+
   volume_ = 1.0;
   playback_rate_ = 0.0;
   is_prepared_ = false;
@@ -523,6 +523,10 @@ void MediaPlayerESPlusPlayer::Flush(base::OnceClosure flush_cb) {
     return;
   }
   LOG(INFO) << "(" << static_cast<void*>(this) << ") " << __func__;
+
+  ReportBufferingStateIfNeeded(BUFFERING_HAVE_NOTHING,
+                               BUFFERING_CHANGE_REASON_UNKNOWN);
+
   last_frames_.get<DemuxerStream::AUDIO>().first = media::kNoTimestamp;
   last_frames_.get<DemuxerStream::VIDEO>().first = media::kNoTimestamp;
 
@@ -533,8 +537,6 @@ void MediaPlayerESPlusPlayer::Flush(base::OnceClosure flush_cb) {
   SetShouldFeed(DemuxerStream::VIDEO, false);
   GetBufferQueue(DemuxerStream::VIDEO).clear();
   GetBufferQueue(DemuxerStream::AUDIO).clear();
-  SetBufferingState(DemuxerStream::AUDIO, BUFFERING_HAVE_NOTHING);
-  SetBufferingState(DemuxerStream::VIDEO, BUFFERING_HAVE_NOTHING);
   buffer_observer_->ResetBufferStatus();
 
   std::move(flush_cb).Run();
@@ -926,13 +928,23 @@ void MediaPlayerESPlusPlayer::OnBufferingStatusChanged(DemuxerStream::Type type,
   }
 
   if (status != kBufferNone) {
-    if (GetBufferingState(type) != BUFFERING_HAVE_ENOUGH) {
-      SetBufferingState(type, BUFFERING_HAVE_ENOUGH);
-      GetMediaPlayerClient()->OnBufferingStateChange(
-          BUFFERING_HAVE_ENOUGH, BUFFERING_CHANGE_REASON_UNKNOWN);
-    }
+    if (GetOperationForData() == OperationForData::PLAY)
+      ReportBufferingStateIfNeeded(BUFFERING_HAVE_ENOUGH,
+                                   BUFFERING_CHANGE_REASON_UNKNOWN);
   } else {
-    SetBufferingState(type, BUFFERING_HAVE_NOTHING);
+    ReportBufferingStateIfNeeded(BUFFERING_HAVE_NOTHING,
+                                 BUFFERING_CHANGE_REASON_UNKNOWN);
+  }
+}
+
+void MediaPlayerESPlusPlayer::ReportBufferingStateIfNeeded(
+    BufferingState buffering_state,
+    BufferingStateChangeReason reason) {
+  if (reported_buffering_state_ != buffering_state) {
+    LOG(INFO) << __func__ << " Report BufferingState : " << buffering_state
+              << ", reason : " << reason;
+    reported_buffering_state_ = buffering_state;
+    GetMediaPlayerClient()->OnBufferingStateChange(buffering_state, reason);
   }
 }
 
@@ -989,18 +1001,18 @@ MediaPlayerESPlusPlayer::GetOperationForData() {
     // If data has been pushed enough (>= kMinWaitTimeForPlayback)
     if (time_diff >= kMinWaitTimeForPlayback) {
       LOG(INFO) << __func__ << " Data is enough to play,";
+      ReportBufferingStateIfNeeded(BUFFERING_HAVE_ENOUGH,
+                                   BUFFERING_CHANGE_REASON_UNKNOWN);
       return OperationForData::PLAY;
     }
   } else {
     bool should_pause = false;
     if (has_video_media_type &&
         current_position >= last_frames_.get<DemuxerStream::VIDEO>().first) {
-      SetBufferingState(DemuxerStream::VIDEO, BUFFERING_HAVE_NOTHING);
       should_pause = true;
     }
     if (has_audio_media_type &&
         current_position >= last_frames_.get<DemuxerStream::AUDIO>().first) {
-      SetBufferingState(DemuxerStream::AUDIO, BUFFERING_HAVE_NOTHING);
       should_pause = true;
     }
 
@@ -1008,8 +1020,8 @@ MediaPlayerESPlusPlayer::GetOperationForData() {
       LOG(INFO) << __func__ << " Not enough data to play.";
       // If pushing pts smaller than current_position, should report
       // BUFFERING_HAVE_NOTHING to replace BUFFERING_HAVE_ENOUGH
-      GetMediaPlayerClient()->OnBufferingStateChange(
-          BUFFERING_HAVE_NOTHING, BUFFERING_CHANGE_REASON_UNKNOWN);
+      ReportBufferingStateIfNeeded(BUFFERING_HAVE_NOTHING,
+                                   BUFFERING_CHANGE_REASON_UNKNOWN);
       return OperationForData::PAUSE;
     }
   }
@@ -1355,16 +1367,6 @@ void MediaPlayerESPlusPlayer::SetReadRequested(DemuxerStream::Type type,
   GetElementryStream(type).read_requested_ = value;
 }
 
-BufferingState MediaPlayerESPlusPlayer::GetBufferingState(
-    DemuxerStream::Type type) {
-  return GetElementryStream(type).buffering_state_;
-}
-
-void MediaPlayerESPlusPlayer::SetBufferingState(DemuxerStream::Type type,
-                                                BufferingState state) {
-  GetElementryStream(type).buffering_state_ = state;
-}
-
 DemuxerStream* MediaPlayerESPlusPlayer::GetDemuxerStream(
     DemuxerStream::Type type) const {
   return GetElementryStream(type).input_stream_;
index 8c3a416..a8e9c59 100644 (file)
@@ -158,7 +158,6 @@ class MEDIA_EXPORT MediaPlayerESPlusPlayer : public MediaPlayerTizen {
     bool is_eos_ = false;
     bool should_feed_ = false;
     bool read_requested_ = false;
-    BufferingState buffering_state_ = BUFFERING_HAVE_NOTHING;
     DemuxerStream* input_stream_ = nullptr;
     base::circular_deque<scoped_refptr<DecoderBuffer>> pending_buffers_;
   };
@@ -175,6 +174,9 @@ class MEDIA_EXPORT MediaPlayerESPlusPlayer : public MediaPlayerTizen {
   void SeekInternal(base::TimeDelta time);
   void UpdateBufferedDtsDifference();
 
+  void ReportBufferingStateIfNeeded(BufferingState buffering_state,
+                                    BufferingStateChangeReason reason);
+
   void PerformOperationForData();
   OperationForData GetOperationForData();
   void StartOperationForDataTimer();
@@ -183,8 +185,6 @@ class MEDIA_EXPORT MediaPlayerESPlusPlayer : public MediaPlayerTizen {
   ElementryStream& GetElementryStream(DemuxerStream::Type type);
   const ElementryStream& GetElementryStream(DemuxerStream::Type type) const;
   void SetReadRequested(DemuxerStream::Type type, bool value);
-  BufferingState GetBufferingState(DemuxerStream::Type type);
-  void SetBufferingState(DemuxerStream::Type type, BufferingState state);
   DemuxerStream* GetDemuxerStream(DemuxerStream::Type type) const;
   void SetDemuxerStream(DemuxerStream::Type type, DemuxerStream* stream);
   Queue& GetBufferQueue(DemuxerStream::Type type);
@@ -207,6 +207,7 @@ class MEDIA_EXPORT MediaPlayerESPlusPlayer : public MediaPlayerTizen {
   bool should_set_playback_rate_ = false;
 
   bool is_paused_by_buffering_ = false;
+  BufferingState reported_buffering_state_ = BUFFERING_HAVE_NOTHING;
 
 #if defined(TIZEN_VIDEO_HOLE)
   gfx::Rect viewport_rect_;