[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 d7bd803b4319bcafec61fc04923e7acc4ee47080..b843150f3695b8e8ba33cdea626e788399d36c11 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 3727dd664ad84fd5d72d76ae63f73a003ede9d8f..8c3a41627cd017269ffb30eaaa5d70f96fcd78c2 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};
 };