[MM] Use the timer to decide operations according to buffering status. 07/307307/3
authorSun-woo Nam <sunny.nam@samsung.com>
Thu, 7 Mar 2024 02:19:34 +0000 (18:19 -0800)
committerBot Blink <blinkbot@samsung.com>
Thu, 7 Mar 2024 12:04:30 +0000 (12:04 +0000)
Previously, PerformOperationForData was called in ReadBuffer which reads
a buffer from the demuxer. However, ReadBuffer may not be called depending on
the buffering status.
When actually determining an operation, it judges based on the current position
so there are cases that it does not work as intended.
Therefore, call the function periodically using a timer.

This fixes the patch below.
https://review.tizen.org/gerrit/#/c/305478/

Change-Id: I5c4ee665d52b02c609bef8a380d1aa05e5dfb577
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 d7bd803..b843150 100644 (file)
@@ -31,6 +31,9 @@ const base::TimeDelta kBufferQueueReadDelay = base::Milliseconds(100);
 // the time stamp of the buffered data.
 const base::TimeDelta kMinWaitTimeForPlayback = base::Milliseconds(500);
 
+// The delay time to check buffering and decide operations.
+const base::TimeDelta kOperationDecisionDelay = base::Milliseconds(500);
+
 player_buffer_size_t GetMaxAudioBufferSize() {
   return kPlayerAudioBufferSize;
 }
@@ -325,6 +328,8 @@ void MediaPlayerESPlusPlayer::Release() {
   GetBufferQueue(DemuxerStream::AUDIO).clear();
   sink_ = nullptr;
 
+  StopOperationForDataTimer();
+
   if (GetPlayerState() == ESPLUSPLAYER_STATE_NONE) {
     LOG(ERROR) << "(" << static_cast<void*>(this) << ") " << __func__
                << " Release called on invalid state : "
@@ -393,6 +398,9 @@ void MediaPlayerESPlusPlayer::Pause(bool is_media_related_action) {
   if (!is_media_related_action)
     is_paused_ = true;
 
+  // To decide operation is not needed in pause.
+  StopOperationForDataTimer();
+
   LOG(INFO) << "(" << static_cast<void*>(this) << ") " << __func__
             << " is_buffering : " << is_buffering_
             << " is_media_action : " << is_media_related_action;
@@ -734,14 +742,18 @@ void MediaPlayerESPlusPlayer::ReadBuffer(DemuxerStream::Type type) {
   if (!ReadFromBufferQueue(type))
     return;
 
-  PerformOperationForData();
-
   // Avoid unnecessary or redundant read requests.
   if (!ShouldFeed(type) || ReadRequested(type) || IsEos(type) ||
       (is_prepared_ && is_paused_ && !is_seeking_)) {
     return;
   }
 
+  // If the playing statue is expected,
+  // keep running a timer to decide play or pause with data.
+  if (!is_paused_) {
+    StartOperationForDataTimer();
+  }
+
   SetReadRequested(type, true);
   uint32_t buffer_read_count = 1;
   // TODO: Set correct buffer read count.
@@ -1005,6 +1017,20 @@ MediaPlayerESPlusPlayer::GetOperationForData() {
   return OperationForData::NONE;
 }
 
+void MediaPlayerESPlusPlayer::StartOperationForDataTimer() {
+  if (!operation_for_data_timer_.IsRunning()) {
+    operation_for_data_timer_.Start(
+        FROM_HERE, kOperationDecisionDelay, this,
+        &MediaPlayerESPlusPlayer::PerformOperationForData);
+  }
+}
+
+void MediaPlayerESPlusPlayer::StopOperationForDataTimer() {
+  if (operation_for_data_timer_.IsRunning()) {
+    operation_for_data_timer_.Stop();
+  }
+}
+
 void MediaPlayerESPlusPlayer::OnReadyToPrepare(
     const esplusplayer_stream_type stream_type) {
   if (!task_runner_->BelongsToCurrentThread()) {
index 3727dd6..8c3a416 100644 (file)
@@ -11,6 +11,7 @@
 #include "base/memory/unsafe_shared_memory_region.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/time/time.h"
+#include "base/timer/timer.h"
 #include "media/base/buffering_state.h"
 #include "media/base/demuxer_stream.h"
 #include "media/base/video_renderer_sink.h"
@@ -176,6 +177,8 @@ class MEDIA_EXPORT MediaPlayerESPlusPlayer : public MediaPlayerTizen {
 
   void PerformOperationForData();
   OperationForData GetOperationForData();
+  void StartOperationForDataTimer();
+  void StopOperationForDataTimer();
 
   ElementryStream& GetElementryStream(DemuxerStream::Type type);
   const ElementryStream& GetElementryStream(DemuxerStream::Type type) const;
@@ -221,6 +224,8 @@ class MEDIA_EXPORT MediaPlayerESPlusPlayer : public MediaPlayerTizen {
   std::array<ElementryStream, kElementryStreamCount> elementry_stream_;
   std::unique_ptr<BufferObserver> buffer_observer_;
 
+  base::RepeatingTimer operation_for_data_timer_;
+
   base::WeakPtrFactory<MediaPlayerESPlusPlayer> weak_factory_{this};
 };