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