[WebRTC] Fix switchable decoder started in partial view mode 06/318006/3
authorJakub Gajownik <j.gajownik2@samsung.com>
Tue, 17 Sep 2024 07:46:58 +0000 (09:46 +0200)
committerBot Blink <blinkbot@samsung.com>
Mon, 23 Sep 2024 13:20:46 +0000 (13:20 +0000)
There was an issue when switchable video decoder was
initialized in partial view mode. It was starting with
hardware decoding which is not something that we expect.

Bug: https://jira-eu.sec.samsung.net/browse/VDGAME-575
Change-Id: I63c74c91ac80e7bfa574a9bf4f78d7e675c1c2ab
Signed-off-by: Jakub Gajownik <j.gajownik2@samsung.com>
tizen_src/chromium_impl/third_party/blink/renderer/platform/peerconnection/switchable_video_decoder_wrapper.cc

index d37d888e9ce3d230033feb3ce5ec7258dd398280..1576646500b9592f06ef97573e74d3284ccb05ac 100644 (file)
@@ -68,7 +68,7 @@ class SwitchableVideoDecoderWrapper final
 
  private:
   bool InitHwDecoder();
-  bool InitSwDecoder(bool is_fallback);
+  bool InitSwDecoder();
 
   webrtc::VideoDecoder& active_decoder() const;
 
@@ -84,6 +84,8 @@ class SwitchableVideoDecoderWrapper final
   webrtc::DecodedImageCallback* callback_;
   size_t hw_consequtive_generic_errors_;
 
+  suspend_resume::State last_state_;
+
   mojo::Receiver<suspend_resume::mojom::SuspendResumeObserver> receiver_{this};
 };
 
@@ -105,6 +107,7 @@ SwitchableVideoDecoderWrapper::SwitchableVideoDecoderWrapper(
   mojo::Remote<suspend_resume::mojom::SuspendResumeManager>(
       std::move(pending_manager))
       ->AddObserver(receiver_.BindNewPipeAndPassRemote(), &state);
+  last_state_ = state.value_or(suspend_resume::State::SUSPENDED);
 }
 
 bool SwitchableVideoDecoderWrapper::Configure(
@@ -115,7 +118,29 @@ bool SwitchableVideoDecoderWrapper::Configure(
     return true;
   }
 
-  return InitHwDecoder() || InitSwDecoder(true);
+  switch (last_state_) {
+    case suspend_resume::State::SUSPENDED:
+      break;
+    case suspend_resume::State::PARTIAL:
+      if (!InitSwDecoder()) {
+        return false;
+      }
+      decoding_mode_ = DecodingMode::kSoftware;
+      break;
+    case suspend_resume::State::RESUMED:
+      if (InitHwDecoder()) {
+        decoding_mode_ = DecodingMode::kHardware;
+      } else {
+        hw_decoder_->Release();
+        if (InitSwDecoder()) {
+          decoding_mode_ = DecodingMode::kSoftwareFallback;
+        } else {
+          return false;
+        }
+      }
+      break;
+  }
+  return true;
 }
 
 int32_t SwitchableVideoDecoderWrapper::Decode(
@@ -146,9 +171,11 @@ int32_t SwitchableVideoDecoderWrapper::Decode(
 
       // HW decoder returned WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE or
       // too many generic errors on key-frames encountered.
-      if (!InitSwDecoder(true)) {
+      hw_decoder_->Release();
+      if (!InitSwDecoder()) {
         return ret;
       }
+      decoding_mode_ = DecodingMode::kSoftwareFallback;
       return sw_decoder_->Decode(input_image, missing_frames, render_time_ms);
     }
     case DecodingMode::kSoftware:
@@ -217,13 +244,17 @@ void SwitchableVideoDecoderWrapper::OnStateChange(suspend_resume::State state) {
       break;
     case suspend_resume::State::PARTIAL:
       if (decoding_mode_ == DecodingMode::kHardware) {
-        if (!InitSwDecoder(false)) {
+        if (!InitSwDecoder()) {
           LOG(ERROR) << "Error initializing software decoder";
         }
+        decoding_mode_ = DecodingMode::kSoftware;
       }
       break;
     case suspend_resume::State::RESUMED:
       if (decoding_mode_ == DecodingMode::kSoftware) {
+        if (!InitHwDecoder()) {
+          LOG(ERROR) << "Error initializing hardware decoder";
+        }
         decoding_mode_ = DecodingMode::kHardware;
       }
       break;
@@ -237,27 +268,19 @@ bool SwitchableVideoDecoderWrapper::InitHwDecoder() {
   }
 
   hw_decoder_configured_ = true;
-  decoding_mode_ = DecodingMode::kHardware;
   if (callback_) {
     hw_decoder_->RegisterDecodeCompleteCallback(callback_);
   }
   return true;
 }
 
-bool SwitchableVideoDecoderWrapper::InitSwDecoder(bool is_fallback) {
+bool SwitchableVideoDecoderWrapper::InitSwDecoder() {
   LOG(INFO) << "Initialize software decoder";
   if (!sw_decoder_configured_ && !sw_decoder_->Configure(decoder_settings_)) {
     return false;
   }
 
   sw_decoder_configured_ = true;
-  if (is_fallback) {
-    hw_decoder_->Release();
-    decoding_mode_ = DecodingMode::kSoftwareFallback;
-  } else {
-    decoding_mode_ = DecodingMode::kSoftware;
-  }
-
   if (callback_) {
     sw_decoder_->RegisterDecodeCompleteCallback(callback_);
   }