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