gstreamer1.0-plugins-bad_%.bbappend: Added a title/appid 15/29115/9 sandbox/nguyentanloc27/spec4808
authorMarius Vlad <marius.vlad@collabora.com>
Thu, 10 Aug 2023 09:47:56 +0000 (12:47 +0300)
committerJan-Simon Moeller <jsmoeller@linuxfoundation.org>
Thu, 17 Aug 2023 22:02:12 +0000 (22:02 +0000)
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

meta-agl-core/recipes-multimedia/gstreamer1.0-plugins-bad/files/0001-Added-appid-and-title-support.patch [new file with mode: 0644]
meta-agl-core/recipes-multimedia/gstreamer1.0-plugins-bad/files/rcar-gen3/0001-Added-appid-and-title-support.patch [new file with mode: 0644]
meta-agl-core/recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad_%.bbappend [new file with mode: 0644]

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 (file)
index 0000000..f4139ff
--- /dev/null
@@ -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 (file)
index 0000000..72b9243
--- /dev/null
@@ -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 (file)
index 0000000..831862a
--- /dev/null
@@ -0,0 +1,2 @@
+FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
+SRC_URI:append = "file://0001-Added-appid-and-title-support.patch"