[TTVD] Use direct receiver for video rendering interface 98/325098/5
authorJakub Gajownik <j.gajownik2@samsung.com>
Thu, 15 May 2025 12:28:29 +0000 (14:28 +0200)
committerBot Blink <blinkbot@samsung.com>
Tue, 3 Jun 2025 08:28:02 +0000 (08:28 +0000)
Standard mojo receivers use IO thread to receive messages
and dispatch to proper task runner. This makes dedicated
rendering mode sensitive for any stalling on IO thread.
Instead we can use |DirectReceiver| if possible to reduce
that vulnerability.

Bug: https://jira-eu.sec.samsung.net/browse/VDGAME-680
Change-Id: Ib3237d1b8d049301d4bfb1e1b25e749a2e7a8729
Signed-off-by: Jakub Gajownik <j.gajownik2@samsung.com>
media/filters/tizen/ttvd_media_provider.cc
media/filters/tizen/ttvd_video_decoder_impl.cc
media/filters/tizen/ttvd_video_decoder_impl.h
mojo/public/cpp/bindings/direct_receiver.h

index 37e3233da013b92a3b63cfb0c28ad179ec23d702..8bef0c20f8c5887b50ec32b6be07a0382581dbc5 100644 (file)
@@ -75,7 +75,9 @@ void MakeSelfOwnedSideReceiver(
     const std::string& thread_name,
     Ts&&... args) {
   auto decoder_thread = std::make_unique<base::Thread>(thread_name);
-  if (!decoder_thread->Start()) {
+  if (!decoder_thread->IsRunning() &&
+      !decoder_thread->StartWithOptions(
+          base::Thread::Options(base::MessagePumpType::IO, 0))) {
     return;
   }
 
index 857980846cbfc98de9039871ec618e5d7e659f40..19876ee593ef7d383945747864e80691263f8a42 100644 (file)
@@ -22,6 +22,7 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/task/bind_post_task.h"
+#include "base/task/current_thread.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/task/task_runner.h"
@@ -2626,10 +2627,20 @@ void TTvdVideoDecoderImpl::RequestKeyframe(DecodeCallback decode_cb) {
 void TTvdVideoDecoderImpl::BindReceiver(
     mojo::PendingReceiver<gfx::mojom::TizenOverlayCollection>
         pending_receiver) {
-  if (receiver_.is_bound()) {
-    receiver_.reset();
+  if (mojo::IsDirectReceiverSupported()) {
+    TIZEN_MEDIA_LOG(INFO) << "Use direct receiver";
+    auto& receiver =
+        receiver_
+            .emplace<mojo::DirectReceiver<gfx::mojom::TizenOverlayCollection>>(
+                mojo::DirectReceiverKey{}, this);
+    receiver.Bind(std::move(pending_receiver));
+  } else {
+    TIZEN_MEDIA_LOG(INFO) << "Use standard receiver";
+    auto& receiver =
+        receiver_.emplace<mojo::Receiver<gfx::mojom::TizenOverlayCollection>>(
+            this);
+    receiver.Bind(std::move(pending_receiver));
   }
-  receiver_.Bind(std::move(pending_receiver));
 }
 
 void TTvdVideoDecoderImpl::NotifyPlaneCollectionAboutTexturingChange() {
index 7327ccd91d67613df63d7802d78253b8d8bd09a0..a57f4fbbb39dc1a53d02833911c31e752bac41cf 100644 (file)
@@ -8,6 +8,7 @@
 #include <deque>
 #include <map>
 #include <string>
+#include <variant>
 #include <vector>
 
 #include "absl/types/optional.h"
@@ -37,6 +38,7 @@
 #include "media/mojo/mojom/ttvd_media_provider.mojom.h"
 #include "media/mojo/services/mojo_cdm_service_context.h"
 #include "mojo/public/cpp/bindings/associated_remote.h"
+#include "mojo/public/cpp/bindings/direct_receiver.h"
 #include "mojo/public/cpp/bindings/pending_associated_remote.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
@@ -579,7 +581,10 @@ class MEDIA_EXPORT TTvdVideoDecoderImpl
   mojo::Receiver<suspend_resume::mojom::SuspendResumeObserver>
       suspend_resume_observer_{this};
 
-  mojo::Receiver<gfx::mojom::TizenOverlayCollection> receiver_{this};
+  std::variant<std::monostate,
+               mojo::Receiver<gfx::mojom::TizenOverlayCollection>,
+               mojo::DirectReceiver<gfx::mojom::TizenOverlayCollection>>
+      receiver_;
 
   base::flat_map<base::UnguessableToken, scoped_refptr<VideoFrame>>
       video_frames_;
index 466c35626eeabb861e9220bc3bf79e345021da81..1df1da648194fcba67f466434c991e0343fd804f 100644 (file)
@@ -31,6 +31,10 @@ namespace cc::mojo_embedder {
 class AsyncLayerTreeFrameSink;
 }
 
+namespace media {
+class TTvdVideoDecoderImpl;
+}
+
 namespace mojo {
 
 namespace internal {
@@ -106,6 +110,7 @@ class DirectReceiverKey {
   friend class cc::mojo_embedder::AsyncLayerTreeFrameSink;
   friend class mojo::test::direct_receiver_unittest::ServiceImpl;
   friend class blink::WidgetInputHandlerImpl;
+  friend class media::TTvdVideoDecoderImpl;
 };
 
 // DirectReceiver is a wrapper around the standard Receiver<T> type that always