From e0e7a110896bee45f54f2cb11946ca26ae50d098 Mon Sep 17 00:00:00 2001 From: Colin Kinloch Date: Thu, 9 Jan 2025 14:27:11 +0000 Subject: [PATCH] wayland: De-dupe filling caps format fields Part-of: --- .../ext/gtk/gstgtkwaylandsink.c | 41 +++----------- .../ext/wayland/gstwaylandsink.c | 41 +++----------- .../gst-libs/gst/wayland/gstwldisplay.c | 55 +++++++++++++++++++ .../gst-libs/gst/wayland/gstwldisplay.h | 6 ++ 4 files changed, 77 insertions(+), 66 deletions(-) diff --git a/subprojects/gst-plugins-bad/ext/gtk/gstgtkwaylandsink.c b/subprojects/gst-plugins-bad/ext/gtk/gstgtkwaylandsink.c index d34fc4273a..b530eea357 100644 --- a/subprojects/gst-plugins-bad/ext/gtk/gstgtkwaylandsink.c +++ b/subprojects/gst-plugins-bad/ext/gtk/gstgtkwaylandsink.c @@ -780,46 +780,21 @@ gst_gtk_wayland_sink_get_caps (GstBaseSink * bsink, GstCaps * filter) g_mutex_lock (&priv->display_lock); if (priv->display) { - GValue shm_list = G_VALUE_INIT, dmabuf_list = G_VALUE_INIT; - GValue value = G_VALUE_INIT; - GArray *formats, *modifiers; - gint i; - guint fmt; - GstVideoFormat gfmt; - guint64 mod; + GValue format_list = G_VALUE_INIT; - g_value_init (&shm_list, GST_TYPE_LIST); - g_value_init (&dmabuf_list, GST_TYPE_LIST); + g_value_init (&format_list, GST_TYPE_LIST); /* Add corresponding shm formats */ - formats = gst_wl_display_get_shm_formats (priv->display); - for (i = 0; i < formats->len; i++) { - fmt = g_array_index (formats, uint32_t, i); - gfmt = gst_wl_shm_format_to_video_format (fmt); - if (gfmt != GST_VIDEO_FORMAT_UNKNOWN) { - g_value_init (&value, G_TYPE_STRING); - g_value_set_static_string (&value, gst_video_format_to_string (gfmt)); - gst_value_list_append_and_take_value (&shm_list, &value); - } - } - + gst_wl_display_fill_shm_format_list (priv->display, &format_list); gst_structure_take_value (gst_caps_get_structure (caps, 0), "format", - &shm_list); + &format_list); + + g_value_init (&format_list, GST_TYPE_LIST); /* Add corresponding dmabuf formats */ - formats = gst_wl_display_get_dmabuf_formats (priv->display); - modifiers = gst_wl_display_get_dmabuf_modifiers (priv->display); - for (i = 0; i < formats->len; i++) { - fmt = g_array_index (formats, uint32_t, i); - mod = g_array_index (modifiers, guint64, i); - g_value_init (&value, G_TYPE_STRING); - g_value_take_string (&value, gst_video_dma_drm_fourcc_to_string (fmt, - mod)); - gst_value_list_append_and_take_value (&dmabuf_list, &value); - } - + gst_wl_display_fill_dmabuf_format_list (priv->display, &format_list); gst_structure_take_value (gst_caps_get_structure (caps, 1), "drm-format", - &dmabuf_list); + &format_list); GST_DEBUG_OBJECT (self, "display caps: %" GST_PTR_FORMAT, caps); } diff --git a/subprojects/gst-plugins-bad/ext/wayland/gstwaylandsink.c b/subprojects/gst-plugins-bad/ext/wayland/gstwaylandsink.c index 4a025ac8b8..50c8ed6991 100644 --- a/subprojects/gst-plugins-bad/ext/wayland/gstwaylandsink.c +++ b/subprojects/gst-plugins-bad/ext/wayland/gstwaylandsink.c @@ -565,46 +565,21 @@ gst_wayland_sink_get_caps (GstBaseSink * bsink, GstCaps * filter) g_mutex_lock (&self->display_lock); if (self->display) { - GValue shm_list = G_VALUE_INIT, dmabuf_list = G_VALUE_INIT; - GValue value = G_VALUE_INIT; - GArray *formats, *modifiers; - gint i; - guint fmt; - GstVideoFormat gfmt; - guint64 mod; + GValue format_list = G_VALUE_INIT; - g_value_init (&shm_list, GST_TYPE_LIST); - g_value_init (&dmabuf_list, GST_TYPE_LIST); + g_value_init (&format_list, GST_TYPE_LIST); /* Add corresponding shm formats */ - formats = gst_wl_display_get_shm_formats (self->display); - for (i = 0; i < formats->len; i++) { - fmt = g_array_index (formats, uint32_t, i); - gfmt = gst_wl_shm_format_to_video_format (fmt); - if (gfmt != GST_VIDEO_FORMAT_UNKNOWN) { - g_value_init (&value, G_TYPE_STRING); - g_value_set_static_string (&value, gst_video_format_to_string (gfmt)); - gst_value_list_append_and_take_value (&shm_list, &value); - } - } - + gst_wl_display_fill_shm_format_list (self->display, &format_list); gst_structure_take_value (gst_caps_get_structure (caps, 0), "format", - &shm_list); + &format_list); + + g_value_init (&format_list, GST_TYPE_LIST); /* Add corresponding dmabuf formats */ - formats = gst_wl_display_get_dmabuf_formats (self->display); - modifiers = gst_wl_display_get_dmabuf_modifiers (self->display); - for (i = 0; i < formats->len; i++) { - fmt = g_array_index (formats, uint32_t, i); - mod = g_array_index (modifiers, guint64, i); - g_value_init (&value, G_TYPE_STRING); - g_value_take_string (&value, gst_video_dma_drm_fourcc_to_string (fmt, - mod)); - gst_value_list_append_and_take_value (&dmabuf_list, &value); - } - + gst_wl_display_fill_dmabuf_format_list (self->display, &format_list); gst_structure_take_value (gst_caps_get_structure (caps, 1), "drm-format", - &dmabuf_list); + &format_list); GST_DEBUG_OBJECT (self, "display caps: %" GST_PTR_FORMAT, caps); } diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/wayland/gstwldisplay.c b/subprojects/gst-plugins-bad/gst-libs/gst/wayland/gstwldisplay.c index 24caf88067..1af57586b1 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/wayland/gstwldisplay.c +++ b/subprojects/gst-plugins-bad/gst-libs/gst/wayland/gstwldisplay.c @@ -676,6 +676,61 @@ gst_wl_display_get_dmabuf_formats (GstWlDisplay * self) return priv->dmabuf_formats; } +/** + * gst_wl_display_fill_shm_format_list: + * @self: A #GstWlDisplay + * @format_list: A #GValue of type #GST_TYPE_LIST + * + * Append supported SHM formats to a given list, suitable for use with the "format" caps value. + * + * Since: 1.26 + */ +void +gst_wl_display_fill_shm_format_list (GstWlDisplay * self, GValue * format_list) +{ + GstWlDisplayPrivate *priv = gst_wl_display_get_instance_private (self); + GValue value = G_VALUE_INIT; + guint fmt; + GstVideoFormat gfmt; + + for (gint i = 0; i < priv->shm_formats->len; i++) { + fmt = g_array_index (priv->shm_formats, uint32_t, i); + gfmt = gst_wl_shm_format_to_video_format (fmt); + if (gfmt != GST_VIDEO_FORMAT_UNKNOWN) { + g_value_init (&value, G_TYPE_STRING); + g_value_set_static_string (&value, gst_video_format_to_string (gfmt)); + gst_value_list_append_and_take_value (format_list, &value); + } + } +} + +/** + * gst_wl_display_fill_drm_format_list: + * @self: A #GstWlDisplay + * @format_list: A #GValue of type #GST_TYPE_LIST + * + * Append supported DRM formats to a given list, suitable for use with the "drm-format" caps value. + * + * Since: 1.26 + */ +void +gst_wl_display_fill_dmabuf_format_list (GstWlDisplay * self, + GValue * format_list) +{ + GstWlDisplayPrivate *priv = gst_wl_display_get_instance_private (self); + GValue value = G_VALUE_INIT; + guint fmt; + guint64 mod; + + for (gint i = 0; i < priv->dmabuf_formats->len; i++) { + fmt = g_array_index (priv->dmabuf_formats, uint32_t, i); + mod = g_array_index (priv->dmabuf_formats, guint64, i); + g_value_init (&value, G_TYPE_STRING); + g_value_take_string (&value, gst_video_dma_drm_fourcc_to_string (fmt, mod)); + gst_value_list_append_and_take_value (format_list, &value); + } +} + struct wp_single_pixel_buffer_manager_v1 * gst_wl_display_get_single_pixel_buffer_manager_v1 (GstWlDisplay * self) { diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/wayland/gstwldisplay.h b/subprojects/gst-plugins-bad/gst-libs/gst/wayland/gstwldisplay.h index 3d29b4ea46..485cf18ac8 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/wayland/gstwldisplay.h +++ b/subprojects/gst-plugins-bad/gst-libs/gst/wayland/gstwldisplay.h @@ -103,6 +103,12 @@ GArray *gst_wl_display_get_dmabuf_formats (GstWlDisplay * self); GST_WL_API GArray *gst_wl_display_get_dmabuf_modifiers (GstWlDisplay * self); +GST_WL_API +void gst_wl_display_fill_shm_format_list (GstWlDisplay *self, GValue *format_list); + +GST_WL_API +void gst_wl_display_fill_dmabuf_format_list (GstWlDisplay *self, GValue *format_list); + GST_WL_API struct zwp_linux_dmabuf_v1 *gst_wl_display_get_dmabuf_v1 (GstWlDisplay * self);