1From e4f3a0e8236c9130b8d1258dd51a22c2921c2d09 Mon Sep 17 00:00:00 2001
2From: Jeffy Chen <jeffy.chen@rock-chips.com>
3Date: Wed, 14 Jun 2023 10:04:42 +0800
4Subject: [PATCH 43/43] waylandsink: Support force trying dmabuf
5
6Not all source plugins would provide dma feature for dmabuf.
7
8Set env WAYLANDSINK_FORCE_DMABUF=1 to enable it.
9
10Tested on RK3588 EVB with:
11export GST_MPP_VIDEODEC_DEFAULT_ARM_AFBC=1
12export WAYLANDSINK_FORCE_DMABUF=1
13gst-play-1.0 hevc.mp4 --videosink=waylandsink
14
15Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
16---
17 ext/wayland/gstwaylandsink.c | 34 +++++++++++++++++++++++-----------
18 ext/wayland/gstwaylandsink.h |  2 +-
19 2 files changed, 24 insertions(+), 12 deletions(-)
20
21diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c
22index 591f8e4..be74c95 100644
23--- a/ext/wayland/gstwaylandsink.c
24+++ b/ext/wayland/gstwaylandsink.c
25@@ -252,6 +252,8 @@ gst_wayland_sink_class_init (GstWaylandSinkClass * klass)
26 static void
27 gst_wayland_sink_init (GstWaylandSink * self)
28 {
29+  const gchar *env;
30+
31   g_mutex_init (&self->display_lock);
32   g_mutex_init (&self->render_lock);
33   g_cond_init (&self->redraw_cond);
34@@ -260,6 +262,10 @@ gst_wayland_sink_init (GstWaylandSink * self)
35   self->layer = GST_WL_WINDOW_LAYER_NORMAL;
36   self->alpha = 1.0;
37   self->fill_mode = DEFAULT_FILL_MODE;
38+
39+  env = g_getenv ("WAYLANDSINK_FORCE_DMABUF");
40+  if (env && !strcmp (env, "1"))
41+    self->force_dmabuf = TRUE;
42 }
43
44 static void
45@@ -655,9 +661,10 @@ gst_wayland_sink_fixup_caps (GstWaylandSink * self, GstCaps * caps)
46   /* HACK: Allow nv12-10le40 and arm-afbc in main caps */
47
48   if (gst_wl_display_support_nv12_10le40 (self->display)) {
49-    tmp_caps = gst_caps_from_string (
50-        GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_DMABUF,
51-            "NV12_10LE40"));
52+    tmp_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("NV12_10LE40"));
53+    if (!self->force_dmabuf)
54+      gst_caps_set_features_simple (tmp_caps,
55+          gst_caps_features_new_single (GST_CAPS_FEATURE_MEMORY_DMABUF));
56
57     /* NV15(AFBC) */
58     if (gst_wl_display_support_afbc (self->display)) {
59@@ -674,18 +681,22 @@ gst_wayland_sink_fixup_caps (GstWaylandSink * self, GstCaps * caps)
60   if (gst_wl_display_support_afbc (self->display)) {
61     if (gst_wl_display_check_format_for_dmabuf (self->display,
62             GST_VIDEO_FORMAT_NV12)) {
63-      tmp_caps = gst_caps_from_string (
64-          GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_DMABUF,
65-              "NV12"));
66+      tmp_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("NV12"));
67+      if (!self->force_dmabuf)
68+        gst_caps_set_features_simple (tmp_caps,
69+            gst_caps_features_new_single (GST_CAPS_FEATURE_MEMORY_DMABUF));
70+
71       gst_caps_set_simple (tmp_caps, "arm-afbc", G_TYPE_INT, 1, NULL);
72       gst_caps_append (caps, tmp_caps);
73     }
74
75     if (gst_wl_display_check_format_for_dmabuf (self->display,
76             GST_VIDEO_FORMAT_NV16)) {
77-      tmp_caps = gst_caps_from_string (
78-          GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_DMABUF,
79-              "NV16"));
80+      tmp_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("NV16"));
81+      if (!self->force_dmabuf)
82+        gst_caps_set_features_simple (tmp_caps,
83+            gst_caps_features_new_single (GST_CAPS_FEATURE_MEMORY_DMABUF));
84+
85       gst_caps_set_simple (tmp_caps, "arm-afbc", G_TYPE_INT, 1, NULL);
86       gst_caps_append (caps, tmp_caps);
87     }
88@@ -823,6 +834,9 @@ gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
89   use_dmabuf = gst_caps_features_contains (gst_caps_get_features (caps, 0),
90       GST_CAPS_FEATURE_MEMORY_DMABUF);
91
92+  if (self->force_dmabuf)
93+    use_dmabuf = TRUE;
94+
95   /* validate the format base on the memory type. */
96   if (use_dmabuf) {
97     if (!gst_wl_display_check_format_for_dmabuf (self->display, format))
98@@ -831,8 +845,6 @@ gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
99     goto unsupported_format;
100   }
101
102-  self->use_dmabuf = use_dmabuf;
103-
104   return TRUE;
105
106 invalid_format:
107diff --git a/ext/wayland/gstwaylandsink.h b/ext/wayland/gstwaylandsink.h
108index de11859..71bd686 100644
109--- a/ext/wayland/gstwaylandsink.h
110+++ b/ext/wayland/gstwaylandsink.h
111@@ -51,7 +51,7 @@ struct _GstWaylandSink
112   GstWlDisplay *display;
113   GstWlWindow *window;
114   GstBufferPool *pool;
115-  gboolean use_dmabuf;
116+  gboolean force_dmabuf;
117   guintptr window_handle;
118
119   gboolean video_info_changed;
120--
1212.20.1
122
123