From 3c3bf0192d23fb60a7043bd3bcf47ef8f662e4c3 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 29 Apr 2024 11:37:50 +0200 Subject: [PATCH] gstreamer: Always build dmabuf support I just spent an hour trying to figure out why things don't work. And it was an optional dependency hidden 3 layers deep in some meson file. This really has to stop. And because just like in GTK, GStreamer's dmabuf APIs are always available (they will just fail on Windows etc), there's no need to have any conditions. The only difference is that the GStreamer media backend now requires GStreamer 1.24. --- modules/media/gtkgstsink.c | 64 +++++++++++-------------------- modules/media/gtkgstsinkprivate.h | 2 - modules/media/meson.build | 11 ++---- 3 files changed, 25 insertions(+), 52 deletions(-) diff --git a/modules/media/gtkgstsink.c b/modules/media/gtkgstsink.c index aa3f8cdfa6..587c5fa3da 100644 --- a/modules/media/gtkgstsink.c +++ b/modules/media/gtkgstsink.c @@ -52,10 +52,8 @@ #include -#ifdef HAVE_GSTREAMER_DRM #include #include -#endif enum { PROP_0, @@ -72,17 +70,11 @@ GST_DEBUG_CATEGORY (gtk_debug_gst_sink); #define NOGL_CAPS GST_VIDEO_CAPS_MAKE (FORMATS) -#ifdef HAVE_GSTREAMER_DRM -# define GST_VIDEO_DMA_DRM_CAPS_MAKE_STR GST_VIDEO_DMA_DRM_CAPS_MAKE "; " -#else -# define GST_VIDEO_DMA_DRM_CAPS_MAKE_STR -#endif - static GstStaticPadTemplate gtk_gst_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_DMA_DRM_CAPS_MAKE_STR + GST_STATIC_CAPS (GST_VIDEO_DMA_DRM_CAPS_MAKE "; " "video/x-raw(" GST_CAPS_FEATURE_MEMORY_GL_MEMORY "), " "format = (string) RGBA, " "width = " GST_VIDEO_SIZE_RANGE ", " @@ -130,7 +122,6 @@ gtk_gst_sink_get_times (GstBaseSink *bsink, } } -#ifdef HAVE_GSTREAMER_DRM static void add_drm_formats_and_modifiers (GstCaps *caps, GdkDmabufFormats *dmabuf_formats) @@ -164,7 +155,6 @@ add_drm_formats_and_modifiers (GstCaps *caps, gst_structure_take_value (gst_caps_get_structure (caps, 0), "drm-format", &dmabuf_list); } -#endif static GdkColorState * gtk_gst_color_state_from_colorimetry (GtkGstSink *self, @@ -219,16 +209,12 @@ gtk_gst_sink_get_caps (GstBaseSink *bsink, if (self->gst_context) { - tmp = gst_pad_get_pad_template_caps (GST_BASE_SINK_PAD (bsink)); -#ifdef HAVE_GSTREAMER_DRM - { - GdkDisplay *display = gdk_gl_context_get_display (self->gdk_context); - GdkDmabufFormats *formats = gdk_display_get_dmabuf_formats (display); + GdkDisplay *display = gdk_gl_context_get_display (self->gdk_context); + GdkDmabufFormats *formats = gdk_display_get_dmabuf_formats (display); - tmp = gst_caps_make_writable (tmp); - add_drm_formats_and_modifiers (tmp, formats); - } -#endif + tmp = gst_pad_get_pad_template_caps (GST_BASE_SINK_PAD (bsink)); + tmp = gst_caps_make_writable (tmp); + add_drm_formats_and_modifiers (tmp, formats); } else { @@ -261,24 +247,23 @@ gtk_gst_sink_set_caps (GstBaseSink *bsink, GST_DEBUG_OBJECT (self, "set caps with %" GST_PTR_FORMAT, caps); -#ifdef HAVE_GSTREAMER_DRM - if (gst_video_is_dma_drm_caps (caps)) { - if (!gst_video_info_dma_drm_from_caps (&self->drm_info, caps)) - return FALSE; + if (gst_video_is_dma_drm_caps (caps)) + { + if (!gst_video_info_dma_drm_from_caps (&self->drm_info, caps)) + return FALSE; - if (!gst_video_info_dma_drm_to_video_info (&self->drm_info, &self->v_info)) - return FALSE; + if (!gst_video_info_dma_drm_to_video_info (&self->drm_info, &self->v_info)) + return FALSE; - GST_INFO_OBJECT (self, "using DMABuf, passthrough possible"); - } else { - gst_video_info_dma_drm_init (&self->drm_info); -#endif + GST_INFO_OBJECT (self, "using DMABuf, passthrough possible"); + } + else + { + gst_video_info_dma_drm_init (&self->drm_info); - if (!gst_video_info_from_caps (&self->v_info, caps)) - return FALSE; -#ifdef HAVE_GSTREAMER_DRM - } -#endif + if (!gst_video_info_from_caps (&self->v_info, caps)) + return FALSE; + } g_clear_pointer (&self->color_state, gdk_color_state_unref); self->color_state = gtk_gst_color_state_from_colorimetry (self, &self->v_info.colorimetry); @@ -325,13 +310,11 @@ gtk_gst_sink_propose_allocation (GstBaseSink *bsink, return FALSE; } -#ifdef HAVE_GSTREAMER_DRM if (gst_caps_features_contains (gst_caps_get_features (caps, 0), GST_CAPS_FEATURE_MEMORY_DMABUF)) { gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, 0); return TRUE; } -#endif if (!gst_caps_features_contains (gst_caps_get_features (caps, 0), GST_CAPS_FEATURE_MEMORY_GL_MEMORY)) return FALSE; @@ -424,7 +407,6 @@ gtk_gst_sink_texture_from_buffer (GtkGstSink *self, viewport->size.width = GST_VIDEO_INFO_WIDTH (&self->v_info); viewport->size.height = GST_VIDEO_INFO_HEIGHT (&self->v_info); -#ifdef HAVE_GSTREAMER_DRM if (gst_is_dmabuf_memory (gst_buffer_peek_memory (buffer, 0))) { GdkDmabufTextureBuilder *builder = NULL; @@ -483,10 +465,8 @@ gtk_gst_sink_texture_from_buffer (GtkGstSink *self, *pixel_aspect_ratio = ((double) GST_VIDEO_INFO_PAR_N (&self->v_info) / (double) GST_VIDEO_INFO_PAR_D (&self->v_info)); } - else -#endif - if (self->gdk_context && - gst_video_frame_map (frame, &self->v_info, buffer, GST_MAP_READ | GST_MAP_GL)) + else if (self->gdk_context && + gst_video_frame_map (frame, &self->v_info, buffer, GST_MAP_READ | GST_MAP_GL)) { GstGLSyncMeta *sync_meta; GdkGLTextureBuilder *builder; diff --git a/modules/media/gtkgstsinkprivate.h b/modules/media/gtkgstsinkprivate.h index cbbb5d6996..3c139c1785 100644 --- a/modules/media/gtkgstsinkprivate.h +++ b/modules/media/gtkgstsinkprivate.h @@ -47,9 +47,7 @@ struct _GtkGstSink GstVideoSink parent; GstVideoInfo v_info; -#ifdef HAVE_GSTREAMER_DRM GstVideoInfoDmaDrm drm_info; -#endif GtkGstPaintable * paintable; GdkGLContext * gdk_context; diff --git a/modules/media/meson.build b/modules/media/meson.build index d18f582cb2..8adca56208 100644 --- a/modules/media/meson.build +++ b/modules/media/meson.build @@ -9,8 +9,8 @@ gstplayer_dep = dependency('gstreamer-player-1.0', version: '>= 1.12.3', required: get_option('media-gstreamer')) gstgl_dep = dependency('gstreamer-gl-1.0', version: '>= 1.12.3', required: get_option('media-gstreamer')) -gstdrm_dep = dependency('gstreamer-allocators-1.0', version: '>= 1.23.1', - required: false) +gstallocators_dep = dependency('gstreamer-allocators-1.0', version: '>= 1.23.1', + required: get_option('media-gstreamer')) if gstplayer_dep.found() and gstgl_dep.found() extra_win_cflags = [] @@ -22,12 +22,7 @@ if gstplayer_dep.found() and gstgl_dep.found() media_backends += 'gstreamer' cdata.set('HAVE_GSTREAMER', 1) - media_gst_deps = [ libm, libgtk_dep, gstplayer_dep, gstgl_dep ] - - if libdrm_dep.found() and gstdrm_dep.found() - cdata.set('HAVE_GSTREAMER_DRM', 1) - media_gst_deps += [ gstdrm_dep ] - endif + media_gst_deps = [ libm, libgtk_dep, gstplayer_dep, gstgl_dep, gstallocators_dep ] shared_module('media-gstreamer', sources: [