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