[M120][WebMedia] Avoid to pause playback in case of bufferflow 91/320291/3
authorpeng1xiao <peng1.xiao@samsung.com>
Tue, 12 Nov 2024 08:34:42 +0000 (16:34 +0800)
committerBot Blink <blinkbot@samsung.com>
Wed, 13 Nov 2024 08:16:44 +0000 (08:16 +0000)
1.if buffer overflow && paused by buffering logic, should resume to play, or mmplayer buffer won't be consumed
  it maybe casue player can not be resumed forever
2.fix spelling error

Migrate from
https://review.tizen.org/gerrit/#/c/platform/framework/web/chromium-efl/+/312095/

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

index dd329095448a41da51ad75974a44a392c55bf3ae..e34708eceab3e791af151e0315d59fc28789fa39 100644 (file)
@@ -34,6 +34,11 @@ enum BufferStatus {
   kBufferEos,
 };
 
+struct AppBufferStatus {
+  BufferStatus audio_status;
+  BufferStatus video_status;
+};
+
 // An interface for processing media buffering-related callback from player.
 class BufferObserver {
  public:
index 7177e7baccfa2b3a3b58f956024d1dcc79271c54..09767dc30b8accb82bc7620ac10bb454ada0db2a 100644 (file)
@@ -1001,7 +1001,7 @@ void MediaPlayerBridgeCapiTV::SeekCompleteUpdate() {
   // The buffering may have completed to 100% during the seek - in which case
   // we need to kick the player and send the correct events by calling
   // HandleBufferingStatus(100).
-  if (is_buffering_compeleted_ && is_paused_ == false) {
+  if (is_buffering_completed_ && is_paused_ == false) {
     LOG_ID(INFO, player_id_) << "Seek completed:buffering complete, not paused";
     if (MediaPlayerBridgeCapi::GetPlayerState() == PLAYER_STATE_PAUSED) {
       HandleBufferingStatus(100);
@@ -1243,9 +1243,9 @@ void MediaPlayerBridgeCapiTV::HandleBufferingStatus(int percent) {
   if (percent == 100) {
     LOG_ID(INFO, player_id_)
         << "(" << static_cast<void*>(this) << ") buffering completed";
-    is_buffering_compeleted_ = true;
+    is_buffering_completed_ = true;
 
-    // If seeking, return after setting the is_buffering_compeleted_ flag, so
+    // If seeking, return after setting the is_buffering_completed_ flag, so
     // that in SeekCompleteUpdate we can trigger player_start() as required.
     if (is_seeking_) {
       LOG_ID(INFO, player_id_) << "Seeking, return";
@@ -1259,7 +1259,7 @@ void MediaPlayerBridgeCapiTV::HandleBufferingStatus(int percent) {
       return;
     }
 
-    if (is_buffering_compeleted_ && blink::IsHbbTV())
+    if (is_buffering_completed_ && blink::IsHbbTV())
       UpdatePreferAudio();
 
     if (!is_file_url_)
@@ -1269,10 +1269,10 @@ void MediaPlayerBridgeCapiTV::HandleBufferingStatus(int percent) {
         player_id_, blink::WebMediaPlayer::kReadyStateHaveEnoughData);
     MediaPlayerBridgeCapi::OnNetworkStateChange(
         player_id_, blink::WebMediaPlayer::kNetworkStateLoaded);
-  } else if (is_buffering_compeleted_) {
-    is_buffering_compeleted_ = false;
+  } else if (is_buffering_completed_) {
+    is_buffering_completed_ = false;
 
-    // If seeking, return after setting the is_buffering_compeleted_ flag, so
+    // If seeking, return after setting the is_buffering_completed_ flag, so
     // that in SeekCompleteUpdate we can trigger player_start() as required.
     if (is_seeking_) {
       LOG_ID(INFO, player_id_) << "Seeking, return";
index ff884968d2cf531386e9eb6bdb214d24f8ce641b..46aa5ac50eed9e1fd78debaf5fd829f436db8a56 100644 (file)
@@ -343,7 +343,7 @@ class MEDIA_EXPORT MediaPlayerBridgeCapiTV : public MediaPlayerBridgeCapi {
   int prefer_audio_adaptionset_idx_{-1};
   int last_prefer_audio_adaptionset_idx_{-1};
   bool parental_rating_pass_{false};
-  bool is_buffering_compeleted_{false};
+  bool is_buffering_completed_{false};
   bool audio_preloading_set_{false};
   bool player_started_{false};
   bool is_resuming_{false};
index 55ae173a32e6478b8d48d3563f099366e1ee1717..015a0d2966b6fe9e937db3f3e207b5b3df8ee053 100644 (file)
@@ -1052,6 +1052,11 @@ void MediaPlayerESPlusPlayer::OnBufferingStatusChanged(DemuxerStream::Type type,
     return;
   }
 
+  if (type == media::DemuxerStream::Type::AUDIO)
+    buffer_status_.audio_status = status;
+  else if (type == media::DemuxerStream::Type::VIDEO)
+    buffer_status_.video_status = status;
+
   switch (status) {
     case kBufferUnderrun:
     case kBufferMinThreshold:
@@ -1146,6 +1151,21 @@ MediaPlayerESPlusPlayer::GetOperationForData() {
   base::TimeDelta current_position = GetCurrentTime();
 
   if (is_paused_by_buffering_) {
+    // there is a case: video push is slower than audio
+    // audio is playing and current_time is audio time, and video is undecoded
+    // in buffer chromium check that push_pts is close to current_time and pause
+    // but video undecoded is much and report overflow, then shouldfeed=false
+    // finally state is pause&shouldfeed=false
+    // as this case current time is only audio time, we can't resume play by
+    // check conditoin: cur_end - official_playback_position_ >=
+    // kMiniWaitTimeForPlayBack MM suggestion: when receive overflow, call play
+    // to AV sync
+    bool need_overflow_play = false;
+    if (buffer_status_.audio_status == kBufferOverflow ||
+        buffer_status_.video_status == kBufferOverflow) {
+      LOG(INFO) << "neeed_overflow_play";
+      need_overflow_play = true;
+    }
     // Get the end position of pushed data.
     base::TimeDelta pushed_end_position =
         std::min(has_video_media_type
@@ -1159,7 +1179,7 @@ MediaPlayerESPlusPlayer::GetOperationForData() {
     base::TimeDelta time_diff = pushed_end_position - current_position;
 
     // If data has been pushed enough (>= kMinWaitTimeForPlayback)
-    if (time_diff >= kMinWaitTimeForPlayback) {
+    if (time_diff >= kMinWaitTimeForPlayback || need_overflow_play) {
       LOG_ID(INFO, player_id_) << __func__ << " Data is enough to play,";
       return OperationForData::PLAY;
     }
index 39245689b0f10c4c35bffbf71181644717724b3d..c8120b945369f82f7f2e52760cc5b4f19b246056 100644 (file)
@@ -254,6 +254,8 @@ class MEDIA_EXPORT MediaPlayerESPlusPlayer : public MediaPlayerTizen {
 
   base::RepeatingTimer operation_for_data_timer_;
 
+  AppBufferStatus buffer_status_{kBufferNone, kBufferNone};
+
   base::WeakPtrFactory<MediaPlayerESPlusPlayer> weak_factory_{this};
 };