fixup! [MM] Handle buffering and playback 08/289908/2
authorVenugopal S M <sm.venugopal@samsung.com>
Wed, 15 Mar 2023 06:49:11 +0000 (12:19 +0530)
committerBot Blink <blinkbot@samsung.com>
Wed, 15 Mar 2023 10:54:01 +0000 (10:54 +0000)
- Submit the packet again when the buffer is full.
- Delay read call on need-buffer state

https://review.tizen.org/gerrit/285113
https://review.tizen.org/gerrit/286895

Change-Id: I34a71fed8dae4f19459d01a3ccc3e3f8b28cf812
Signed-off-by: Venugopal S M <sm.venugopal@samsung.com>
tizen_src/chromium_impl/media/filters/media_player_esplusplayer.cc
tizen_src/chromium_impl/media/filters/media_player_esplusplayer.h

index 156a7d8..6368a82 100644 (file)
@@ -29,6 +29,10 @@ const media::player_buffer_size_t kPlayerTotalBufferSize = 64 * 1024 * 1024;
 // Limit of platform player's audio buffer in bytes
 const media::player_buffer_size_t kPlayerAudioBufferSize = 768 * 1024;
 
+// The delay time before retrying ReadBuffer.
+// Wait until there is space in the buffer.
+const base::TimeDelta kBufferQueueReadDelay = base::Milliseconds(100);
+
 espp_buffer_size_t GetMaxAudioBufferSize() {
   return kPlayerAudioBufferSize;
 }
@@ -716,16 +720,26 @@ void MediaPlayerESPlusPlayer::ReadBuffer(DemuxerStream::Type type) {
                      weak_factory_.GetWeakPtr(), type));
 }
 
+void MediaPlayerESPlusPlayer::PostReadBuffer(DemuxerStream::Type type) {
+  task_runner_->PostDelayedTask(
+      FROM_HERE,
+      base::BindOnce(&MediaPlayerESPlusPlayer::ReadBuffer,
+                     weak_factory_.GetWeakPtr(), type),
+      kBufferQueueReadDelay);
+}
+
 void MediaPlayerESPlusPlayer::OnBufferReady(
     DemuxerStream::Type type,
     DemuxerStream::Status status,
     scoped_refptr<DecoderBuffer> buffer) {
+  bool should_delay_read = false;
   switch (status) {
     case DemuxerStream::kAborted:
     case DemuxerStream::kError:
       GetBufferQueue(type).clear();
       break;
     case DemuxerStream::kNeedBuffer:
+      should_delay_read = true;
       break;
     case DemuxerStream::kConfigChanged:
       // Clear pending buffer of older config
@@ -739,7 +753,10 @@ void MediaPlayerESPlusPlayer::OnBufferReady(
   }
 
   SetReadRequested(type, false);
-  ReadBuffer(type);
+  if (should_delay_read)
+    PostReadBuffer(type);
+  else
+    ReadBuffer(type);
 }
 
 bool MediaPlayerESPlusPlayer::ReadFromBufferQueue(DemuxerStream::Type type) {
@@ -753,12 +770,16 @@ bool MediaPlayerESPlusPlayer::ReadFromBufferQueue(DemuxerStream::Type type) {
   else
     status = SubmitEsPacket(type, buffer);
 
-  if (status == ESPLUSPLAYER_SUBMIT_STATUS_NOT_PREPARED ||
-      status == ESPLUSPLAYER_SUBMIT_STATUS_OUT_OF_MEMORY ||
-      status == ESPLUSPLAYER_SUBMIT_STATUS_FULL) {
+  if (status == ESPLUSPLAYER_SUBMIT_STATUS_FULL) {
+    // If buffer is full, try again after a while.
+    PostReadBuffer(type);
     return false;
   }
 
+  if (status == ESPLUSPLAYER_SUBMIT_STATUS_NOT_PREPARED ||
+      status == ESPLUSPLAYER_SUBMIT_STATUS_OUT_OF_MEMORY)
+    return false;
+
   UpdateBufferedDtsDifference();
   GetBufferQueue(type).pop_front();
   return true;
index 0361c4c..a2c344a 100644 (file)
@@ -119,6 +119,7 @@ class MEDIA_EXPORT MediaPlayerESPlusPlayer : public MediaPlayerTizen {
 
   void InitializeStreamConfig(DemuxerStream::Type type);
   void ReadBuffer(DemuxerStream::Type type);
+  void PostReadBuffer(DemuxerStream::Type type);
   void OnBufferReady(DemuxerStream::Type type,
                      DemuxerStream::Status status,
                      scoped_refptr<DecoderBuffer> buffer);