[HbbTV] Delay prepare until play if decoder is busy 17/321017/2
authorThomas Daniel <t.daniel@samsung.com>
Wed, 13 Nov 2024 17:12:31 +0000 (17:12 +0000)
committerBot Blink <blinkbot@samsung.com>
Thu, 28 Nov 2024 18:04:27 +0000 (18:04 +0000)
Change-Id: I70a2ac81d94812bcc87bf3cde035049ad53a45dd

tizen_src/chromium_impl/media/filters/media_player_esplusplayer.h
tizen_src/chromium_impl/media/filters/media_player_esplusplayer_tv.cc

index eacf05286ee612505354936943444b3c93d1d36b..2a9b059585af4f9fa69c2f0cb31fe40d7da990af 100644 (file)
@@ -166,6 +166,7 @@ class MEDIA_EXPORT MediaPlayerESPlusPlayer : public MediaPlayerTizen {
   bool is_video_hole_ = false;
   bool is_video_low_latency_ = false;
   int player_id_ = 0;
+  bool is_paused_ = true;
   // first -> pts, second -> duration
   base::StaticMap<DemuxerStream::Type,
                   std::pair<base::TimeDelta, base::TimeDelta>,
@@ -219,7 +220,6 @@ class MEDIA_EXPORT MediaPlayerESPlusPlayer : public MediaPlayerTizen {
   double pending_playback_rate_ = 0.0;
   bool is_prepared_ = false;
   bool is_preparing_ = false;
-  bool is_paused_ = true;
   bool is_buffering_ = false;
   base::TimeDelta current_position_;
 
index a8b09dccd03e792df249fe90394b9754a40274e0..460e461a1d1fb485925b6a17aaa65829d3f77c59 100644 (file)
@@ -122,9 +122,27 @@ bool MediaPlayerESPlusPlayerTV::Play() {
                            << __func__;
   auto td_ptr = suitable_decoder_.lock();
   auto dec_name = content::kNoneDecoder;
-  if (td_ptr) {
-    dec_name = td_ptr->GetDecoderType();
-    SetDecoderAcquired(td_ptr->GetDecoderType());
+  if (td_ptr || !(GetMediaType() & MediaType::Video)) {
+    if (td_ptr) {
+      dec_name = td_ptr->GetDecoderType();
+    }
+    if (!IsPrepared()) {
+      bool media_resource_acquired = false;
+      GetMediaPlayerClient()->NotifyPlaybackState(
+          kPlaybackReady, GetPlayerId(), "", "", &media_resource_acquired, NULL,
+          NULL, dec_name);
+      if (!media_resource_acquired) {
+        LOG_ID(ERROR, GetPlayerId()) << "HbbTV media resource was not acquired";
+      } else {
+        if (td_ptr) {
+          SetDecoderAcquired(td_ptr->GetDecoderType());
+        }
+        // Clear is_paused_ so that playback will start when prepare completes
+        is_paused_ = false;
+        MediaPlayerESPlusPlayer::Prepare();
+      }
+      return false;
+    }
   }
   if (GetMediaPlayerClient()) {
     bool media_resource_acquired = false;
@@ -180,10 +198,13 @@ void MediaPlayerESPlusPlayerTV::Prepare() {
       ChooseDecoderIfNeeded(video_config.codec());
       if (auto td_ptr = suitable_decoder_.lock()) {
         decoder_assigned_ = true;
+        if (td_ptr->IsOwnerTheSame(content::DecoderOwner(this))) {
+          // Decoder resource is acquired, we can prepare the player
+          MediaPlayerESPlusPlayer::Prepare();
+        }
       }
     }
   }
-  MediaPlayerESPlusPlayer::Prepare();
 }
 
 void MediaPlayerESPlusPlayerTV::Release() {