diff options
author | Marius Vlad <marius.vlad@collabora.com> | 2023-08-10 12:47:56 +0300 |
---|---|---|
committer | Jan-Simon Moeller <jsmoeller@linuxfoundation.org> | 2023-08-17 22:02:12 +0000 |
commit | fbfb8b817f69fe276523650d4008386b66a05fda (patch) | |
tree | 1ca243c17ad4841ec8772dbe110056cc255963cb /meta-agl-core/recipes-multimedia/gstreamer1.0-plugins-bad | |
parent | 84f91bac6188103e23418b666733d027474f637f (diff) |
gstreamer1.0-plugins-bad_%.bbappend: Added a title/appidsandbox/nguyentanloc27/spec4808
This is necessary to display gst-launch application which uses its own
xdg-shell toplevel window. Any other application that creates its own
toplevel window would *not* have this problem.
There's a patch specific for rcar-gen3, as they have their own gstreamer
fork.
Bug-AGL: SPEC-4870
Change-Id: Ic899d9c5518a50bb426237775f54c8bf34474cc9
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Reviewed-on: https://gerrit.automotivelinux.org/gerrit/c/AGL/meta-agl/+/29115
Tested-by: Jenkins Job builder account
ci-image-build: Jenkins Job builder account
Reviewed-by: Jan-Simon Moeller <jsmoeller@linuxfoundation.org>
ci-image-boot-test: Jenkins Job builder account
Diffstat (limited to 'meta-agl-core/recipes-multimedia/gstreamer1.0-plugins-bad')
3 files changed, 334 insertions, 0 deletions
diff --git a/meta-agl-core/recipes-multimedia/gstreamer1.0-plugins-bad/files/0001-Added-appid-and-title-support.patch b/meta-agl-core/recipes-multimedia/gstreamer1.0-plugins-bad/files/0001-Added-appid-and-title-support.patch new file mode 100644 index 000000000..f4139ff2c --- /dev/null +++ b/meta-agl-core/recipes-multimedia/gstreamer1.0-plugins-bad/files/0001-Added-appid-and-title-support.patch @@ -0,0 +1,166 @@ +From 2de455486403a710cb6896b0052b4cd7e46d83a2 Mon Sep 17 00:00:00 2001 +From: Marius Vlad <marius.vlad@collabora.com> +Date: Thu, 10 Aug 2023 14:20:48 +0300 +Subject: [PATCH] ext/wayland: Add title/appid support + +Bug-AGL: SPEC-4870 +Signed-off-by: Marius Vlad <marius.vlad@collabora.com> +--- + ext/wayland/gstwaylandsink.c | 43 ++++++++++++++++++++++++++++++++++-- + ext/wayland/gstwaylandsink.h | 2 ++ + ext/wayland/wlwindow.c | 10 ++++++++- + ext/wayland/wlwindow.h | 2 +- + 4 files changed, 53 insertions(+), 4 deletions(-) + +diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c +index 0761304..8913ee2 100644 +--- a/ext/wayland/gstwaylandsink.c ++++ b/ext/wayland/gstwaylandsink.c +@@ -63,7 +63,9 @@ enum + { + PROP_0, + PROP_DISPLAY, +- PROP_FULLSCREEN ++ PROP_FULLSCREEN, ++ PROP_APP_ID, ++ PROP_TITLE + }; + + GST_DEBUG_CATEGORY (gstwayland_debug); +@@ -212,6 +214,16 @@ gst_wayland_sink_class_init (GstWaylandSinkClass * klass) + "Whether the surface should be made fullscreen ", FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + ++ g_object_class_install_property (gobject_class, PROP_APP_ID, ++ g_param_spec_string ("appid", "Top-level application id", "Wayland " ++ "appid, as xdg_shell::set_app_id", ++ NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ ++ g_object_class_install_property (gobject_class, PROP_TITLE, ++ g_param_spec_string ("title", "Top-level title", "Wayland " ++ "title, xdg_shell::set_title", ++ NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ + gst_type_mark_as_plugin_api (GST_TYPE_WAYLAND_VIDEO, 0); + } + +@@ -246,6 +258,16 @@ gst_wayland_sink_get_property (GObject * object, + g_value_set_string (value, sink->display_name); + GST_OBJECT_UNLOCK (sink); + break; ++ case PROP_APP_ID: ++ GST_OBJECT_LOCK (sink); ++ g_value_set_string (value, sink->app_id); ++ GST_OBJECT_UNLOCK (sink); ++ break; ++ case PROP_TITLE: ++ GST_OBJECT_LOCK (sink); ++ g_value_set_string (value, sink->title); ++ GST_OBJECT_UNLOCK (sink); ++ break; + case PROP_FULLSCREEN: + GST_OBJECT_LOCK (sink); + g_value_set_boolean (value, sink->fullscreen); +@@ -269,6 +291,16 @@ gst_wayland_sink_set_property (GObject * object, + sink->display_name = g_value_dup_string (value); + GST_OBJECT_UNLOCK (sink); + break; ++ case PROP_APP_ID: ++ GST_OBJECT_LOCK (sink); ++ sink->app_id = g_value_dup_string (value); ++ GST_OBJECT_UNLOCK (sink); ++ break; ++ case PROP_TITLE: ++ GST_OBJECT_LOCK (sink); ++ sink->title = g_value_dup_string (value); ++ GST_OBJECT_UNLOCK (sink); ++ break; + case PROP_FULLSCREEN: + GST_OBJECT_LOCK (sink); + gst_wayland_sink_set_fullscreen (sink, g_value_get_boolean (value)); +@@ -291,12 +323,18 @@ gst_wayland_sink_finalize (GObject * object) + gst_buffer_unref (sink->last_buffer); + if (sink->display) + g_object_unref (sink->display); ++ if (sink->title) ++ g_object_unref (sink->title); ++ if (sink->app_id) ++ g_object_unref (sink->app_id); + if (sink->window) + g_object_unref (sink->window); + if (sink->pool) + gst_object_unref (sink->pool); + + g_free (sink->display_name); ++ g_free (sink->title); ++ g_free (sink->app_id); + + g_mutex_clear (&sink->display_lock); + g_mutex_clear (&sink->render_lock); +@@ -718,7 +756,8 @@ gst_wayland_sink_show_frame (GstVideoSink * vsink, GstBuffer * buffer) + if (!sink->window) { + /* if we were not provided a window, create one ourselves */ + sink->window = gst_wl_window_new_toplevel (sink->display, +- &sink->video_info, sink->fullscreen, &sink->render_lock); ++ &sink->video_info, sink->fullscreen, sink->app_id, sink->title, ++ &sink->render_lock); + g_signal_connect_object (sink->window, "closed", + G_CALLBACK (on_window_closed), sink, 0); + } +diff --git a/ext/wayland/gstwaylandsink.h b/ext/wayland/gstwaylandsink.h +index 7aabb6f..4db00e5 100644 +--- a/ext/wayland/gstwaylandsink.h ++++ b/ext/wayland/gstwaylandsink.h +@@ -63,6 +63,8 @@ struct _GstWaylandSink + gboolean fullscreen; + + gchar *display_name; ++ gchar *app_id; ++ gchar *title; + + gboolean redraw_pending; + GMutex render_lock; +diff --git a/ext/wayland/wlwindow.c b/ext/wayland/wlwindow.c +index 66df0fc..ad2d3f3 100644 +--- a/ext/wayland/wlwindow.c ++++ b/ext/wayland/wlwindow.c +@@ -254,7 +254,7 @@ gst_wl_window_ensure_fullscreen (GstWlWindow * window, gboolean fullscreen) + + GstWlWindow * + gst_wl_window_new_toplevel (GstWlDisplay * display, const GstVideoInfo * info, +- gboolean fullscreen, GMutex * render_lock) ++ gboolean fullscreen, gchar *app_id, gchar *title, GMutex * render_lock) + { + GstWlWindow *window; + +@@ -287,6 +287,14 @@ gst_wl_window_new_toplevel (GstWlDisplay * display, const GstVideoInfo * info, + + /* Finally, commit the xdg_surface state as toplevel */ + window->configured = FALSE; ++ if (app_id) ++ xdg_toplevel_set_app_id (window->xdg_toplevel, app_id); ++ else ++ xdg_toplevel_set_app_id (window->xdg_toplevel, "ext.wayland.waylandsink"); ++ if (title) ++ xdg_toplevel_set_title (window->xdg_toplevel, title); ++ else ++ xdg_toplevel_set_title (window->xdg_toplevel, "ext.wayland.waylandsink"); + wl_surface_commit (window->area_surface); + wl_display_flush (display->display); + +diff --git a/ext/wayland/wlwindow.h b/ext/wayland/wlwindow.h +index 303c336..64399b3 100644 +--- a/ext/wayland/wlwindow.h ++++ b/ext/wayland/wlwindow.h +@@ -83,7 +83,7 @@ GType gst_wl_window_get_type (void); + void gst_wl_window_ensure_fullscreen (GstWlWindow * window, + gboolean fullscreen); + GstWlWindow *gst_wl_window_new_toplevel (GstWlDisplay * display, +- const GstVideoInfo * info, gboolean fullscreen, GMutex * render_lock); ++ const GstVideoInfo * info, gboolean fullscreen, gchar * app_id, gchar *title, GMutex * render_lock); + GstWlWindow *gst_wl_window_new_in_surface (GstWlDisplay * display, + struct wl_surface * parent, GMutex * render_lock); + +-- +2.35.1 + diff --git a/meta-agl-core/recipes-multimedia/gstreamer1.0-plugins-bad/files/rcar-gen3/0001-Added-appid-and-title-support.patch b/meta-agl-core/recipes-multimedia/gstreamer1.0-plugins-bad/files/rcar-gen3/0001-Added-appid-and-title-support.patch new file mode 100644 index 000000000..72b924337 --- /dev/null +++ b/meta-agl-core/recipes-multimedia/gstreamer1.0-plugins-bad/files/rcar-gen3/0001-Added-appid-and-title-support.patch @@ -0,0 +1,166 @@ +From df64f7e34d01a03957d78317ef9a1cf6d6b95055 Mon Sep 17 00:00:00 2001 +From: Marius Vlad <marius.vlad@collabora.com> +Date: Wed, 9 Aug 2023 14:34:19 +0300 +Subject: [PATCH] Added appid and title support + +Bug-AGL: SPEC-4870 +Signed-off-by: Marius Vlad <marius.vlad@collabora.com> +--- + ext/wayland/gstwaylandsink.c | 43 ++++++++++++++++++++++++++++++++++-- + ext/wayland/gstwaylandsink.h | 2 ++ + ext/wayland/wlwindow.c | 10 ++++++++- + ext/wayland/wlwindow.h | 2 +- + 4 files changed, 53 insertions(+), 4 deletions(-) + +diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c +index 4918154..f743cf2 100644 +--- a/ext/wayland/gstwaylandsink.c ++++ b/ext/wayland/gstwaylandsink.c +@@ -66,7 +66,9 @@ enum + PROP_DISPLAY, + PROP_FULLSCREEN, + PROP_USE_SUBSURFACE, +- PROP_SUPPRESS_INTERLACE ++ PROP_SUPPRESS_INTERLACE, ++ PROP_APP_ID, ++ PROP_TITLE + }; + + #define DEFAULT_USE_SUBSURFACE TRUE +@@ -229,6 +231,16 @@ gst_wayland_sink_class_init (GstWaylandSinkClass * klass) + DEFAULT_SUPPRESS_INTERLACE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + ++ g_object_class_install_property (gobject_class, PROP_APP_ID, ++ g_param_spec_string ("appid", "Top-level application id", "Wayland " ++ "appid, as xdg_shell::set_app_id", ++ NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ ++ g_object_class_install_property (gobject_class, PROP_TITLE, ++ g_param_spec_string ("title", "Top-level title", "Wayland " ++ "title, xdg_shell::set_title", ++ NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ + gst_type_mark_as_plugin_api (GST_TYPE_WAYLAND_VIDEO, 0); + } + +@@ -266,6 +278,16 @@ gst_wayland_sink_get_property (GObject * object, + g_value_set_string (value, sink->display_name); + GST_OBJECT_UNLOCK (sink); + break; ++ case PROP_APP_ID: ++ GST_OBJECT_LOCK (sink); ++ g_value_set_string (value, sink->app_id); ++ GST_OBJECT_UNLOCK (sink); ++ break; ++ case PROP_TITLE: ++ GST_OBJECT_LOCK (sink); ++ g_value_set_string (value, sink->title); ++ GST_OBJECT_UNLOCK (sink); ++ break; + case PROP_FULLSCREEN: + GST_OBJECT_LOCK (sink); + g_value_set_boolean (value, sink->fullscreen); +@@ -298,6 +320,16 @@ gst_wayland_sink_set_property (GObject * object, + sink->display_name = g_value_dup_string (value); + GST_OBJECT_UNLOCK (sink); + break; ++ case PROP_APP_ID: ++ GST_OBJECT_LOCK (sink); ++ sink->app_id = g_value_dup_string (value); ++ GST_OBJECT_UNLOCK (sink); ++ break; ++ case PROP_TITLE: ++ GST_OBJECT_LOCK (sink); ++ sink->title = g_value_dup_string (value); ++ GST_OBJECT_UNLOCK (sink); ++ break; + case PROP_FULLSCREEN: + GST_OBJECT_LOCK (sink); + gst_wayland_sink_set_fullscreen (sink, g_value_get_boolean (value)); +@@ -331,12 +363,18 @@ gst_wayland_sink_finalize (GObject * object) + gst_buffer_unref (sink->last_buffer); + if (sink->display) + g_object_unref (sink->display); ++ if (sink->title) ++ g_object_unref (sink->title); ++ if (sink->app_id) ++ g_object_unref (sink->app_id); + if (sink->window) + g_object_unref (sink->window); + if (sink->pool) + gst_object_unref (sink->pool); + + g_free (sink->display_name); ++ g_free (sink->title); ++ g_free (sink->app_id); + + g_mutex_clear (&sink->display_lock); + g_mutex_clear (&sink->render_lock); +@@ -768,7 +806,8 @@ gst_wayland_sink_show_frame (GstVideoSink * vsink, GstBuffer * buffer) + if (!sink->window) { + /* if we were not provided a window, create one ourselves */ + sink->window = gst_wl_window_new_toplevel (sink->display, +- &sink->video_info, sink->fullscreen, &sink->render_lock); ++ &sink->video_info, sink->fullscreen, sink->app_id, sink->title, ++ &sink->render_lock); + g_signal_connect_object (sink->window, "closed", + G_CALLBACK (on_window_closed), sink, 0); + } +diff --git a/ext/wayland/gstwaylandsink.h b/ext/wayland/gstwaylandsink.h +index 46ea538..e6c94ae 100644 +--- a/ext/wayland/gstwaylandsink.h ++++ b/ext/wayland/gstwaylandsink.h +@@ -64,6 +64,8 @@ struct _GstWaylandSink + gboolean fullscreen; + + gchar *display_name; ++ gchar *app_id; ++ gchar *title; + + gboolean redraw_pending; + GMutex render_lock; +diff --git a/ext/wayland/wlwindow.c b/ext/wayland/wlwindow.c +index 3aace87..16faec8 100644 +--- a/ext/wayland/wlwindow.c ++++ b/ext/wayland/wlwindow.c +@@ -255,7 +255,7 @@ gst_wl_window_ensure_fullscreen (GstWlWindow * window, gboolean fullscreen) + + GstWlWindow * + gst_wl_window_new_toplevel (GstWlDisplay * display, const GstVideoInfo * info, +- gboolean fullscreen, GMutex * render_lock) ++ gboolean fullscreen, gchar *app_id, gchar *title, GMutex * render_lock) + { + GstWlWindow *window; + +@@ -288,6 +288,14 @@ gst_wl_window_new_toplevel (GstWlDisplay * display, const GstVideoInfo * info, + + /* Finally, commit the xdg_surface state as toplevel */ + window->configured = FALSE; ++ if (app_id) ++ xdg_toplevel_set_app_id (window->xdg_toplevel, app_id); ++ else ++ xdg_toplevel_set_app_id (window->xdg_toplevel, "ext.wayland.waylandsink"); ++ if (title) ++ xdg_toplevel_set_title (window->xdg_toplevel, title); ++ else ++ xdg_toplevel_set_title (window->xdg_toplevel, "ext.wayland.waylandsink"); + wl_surface_commit (window->area_surface); + wl_display_flush (display->display); + +diff --git a/ext/wayland/wlwindow.h b/ext/wayland/wlwindow.h +index 034a5a5..6b525c8 100644 +--- a/ext/wayland/wlwindow.h ++++ b/ext/wayland/wlwindow.h +@@ -84,7 +84,7 @@ GType gst_wl_window_get_type (void); + void gst_wl_window_ensure_fullscreen (GstWlWindow * window, + gboolean fullscreen); + GstWlWindow *gst_wl_window_new_toplevel (GstWlDisplay * display, +- const GstVideoInfo * info, gboolean fullscreen, GMutex * render_lock); ++ const GstVideoInfo * info, gboolean fullscreen, gchar * app_id, gchar *title, GMutex * render_lock); + GstWlWindow *gst_wl_window_new_in_surface (GstWlDisplay * display, + struct wl_surface * parent, GMutex * render_lock); + +-- +2.35.1 + diff --git a/meta-agl-core/recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad_%.bbappend b/meta-agl-core/recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad_%.bbappend new file mode 100644 index 000000000..831862aff --- /dev/null +++ b/meta-agl-core/recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad_%.bbappend @@ -0,0 +1,2 @@ +FILESEXTRAPATHS:prepend := "${THISDIR}/files:" +SRC_URI:append = "file://0001-Added-appid-and-title-support.patch" |