1*4882a593SmuzhiyunFrom 347a0ce52357d2f199724b18b571516a95d73029 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com> 3*4882a593SmuzhiyunDate: Fri, 5 Aug 2022 11:39:00 +0800 4*4882a593SmuzhiyunSubject: [PATCH 37/41] waylandsink: Support transparent video 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunTested with transparent png picture. 7*4882a593Smuzhiyun 8*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 9*4882a593Smuzhiyun--- 10*4882a593Smuzhiyun gst-libs/gst/wayland/gstwlwindow.c | 36 +++++++++++++++++++++--------- 11*4882a593Smuzhiyun 1 file changed, 26 insertions(+), 10 deletions(-) 12*4882a593Smuzhiyun 13*4882a593Smuzhiyundiff --git a/gst-libs/gst/wayland/gstwlwindow.c b/gst-libs/gst/wayland/gstwlwindow.c 14*4882a593Smuzhiyunindex 21cd476..36afd3f 100644 15*4882a593Smuzhiyun--- a/gst-libs/gst/wayland/gstwlwindow.c 16*4882a593Smuzhiyun+++ b/gst-libs/gst/wayland/gstwlwindow.c 17*4882a593Smuzhiyun@@ -69,6 +69,9 @@ typedef struct _GstWlWindowPrivate 18*4882a593Smuzhiyun gint crop_x, crop_y, crop_w, crop_h; 19*4882a593Smuzhiyun gboolean crop_dirty; 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun+ gboolean video_opaque; 22*4882a593Smuzhiyun+ gboolean area_opaque; 23*4882a593Smuzhiyun+ 24*4882a593Smuzhiyun enum wl_output_transform buffer_transform; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun /* when this is not set both the area_surface and the video_surface are not 27*4882a593Smuzhiyun@@ -628,20 +631,23 @@ gst_wl_window_resize_video_surface (GstWlWindow * self, gboolean commit) 28*4882a593Smuzhiyun } 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun static void 31*4882a593Smuzhiyun-gst_wl_window_set_opaque (GstWlWindow * self, const GstVideoInfo * info) 32*4882a593Smuzhiyun+gst_wl_window_set_opaque (GstWlWindow * self) 33*4882a593Smuzhiyun { 34*4882a593Smuzhiyun GstWlWindowPrivate *priv = gst_wl_window_get_instance_private (self); 35*4882a593Smuzhiyun struct wl_compositor *compositor; 36*4882a593Smuzhiyun struct wl_region *region; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun- /* Set area opaque */ 39*4882a593Smuzhiyun compositor = gst_wl_display_get_compositor (priv->display); 40*4882a593Smuzhiyun- region = wl_compositor_create_region (compositor); 41*4882a593Smuzhiyun- wl_region_add (region, 0, 0, G_MAXINT32, G_MAXINT32); 42*4882a593Smuzhiyun- wl_surface_set_opaque_region (priv->area_surface, region); 43*4882a593Smuzhiyun- wl_region_destroy (region); 44*4882a593Smuzhiyun+ 45*4882a593Smuzhiyun+ if (priv->area_opaque) { 46*4882a593Smuzhiyun+ /* Set area opaque */ 47*4882a593Smuzhiyun+ region = wl_compositor_create_region (compositor); 48*4882a593Smuzhiyun+ wl_region_add (region, 0, 0, G_MAXINT32, G_MAXINT32); 49*4882a593Smuzhiyun+ wl_surface_set_opaque_region (priv->area_surface, region); 50*4882a593Smuzhiyun+ wl_region_destroy (region); 51*4882a593Smuzhiyun+ } 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun- if (!GST_VIDEO_INFO_HAS_ALPHA (info)) { 54*4882a593Smuzhiyun+ if (priv->video_opaque) { 55*4882a593Smuzhiyun /* Set video opaque */ 56*4882a593Smuzhiyun region = wl_compositor_create_region (compositor); 57*4882a593Smuzhiyun wl_region_add (region, 0, 0, G_MAXINT32, G_MAXINT32); 58*4882a593Smuzhiyun@@ -659,10 +665,15 @@ gst_wl_window_render (GstWlWindow * self, GstWlBuffer * buffer, 59*4882a593Smuzhiyun if (G_UNLIKELY (info)) { 60*4882a593Smuzhiyun priv->video_width = info->width; 61*4882a593Smuzhiyun priv->video_height = info->height; 62*4882a593Smuzhiyun+ priv->video_opaque = !GST_VIDEO_INFO_HAS_ALPHA (info); 63*4882a593Smuzhiyun+ priv->area_opaque = priv->video_opaque; 64*4882a593Smuzhiyun+ 65*4882a593Smuzhiyun+ if (g_getenv ("WAYLANDSINK_FORCE_OPAQUE")) 66*4882a593Smuzhiyun+ priv->area_opaque = priv->video_opaque = TRUE; 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun wl_subsurface_set_sync (priv->video_subsurface); 69*4882a593Smuzhiyun gst_wl_window_resize_video_surface (self, FALSE); 70*4882a593Smuzhiyun- gst_wl_window_set_opaque (self, info); 71*4882a593Smuzhiyun+ gst_wl_window_set_opaque (self); 72*4882a593Smuzhiyun } else if (priv->crop_dirty) { 73*4882a593Smuzhiyun gst_wl_window_resize_video_surface (self, FALSE); 74*4882a593Smuzhiyun } 75*4882a593Smuzhiyun@@ -730,8 +741,13 @@ gst_wl_window_update_borders (GstWlWindow * self) 76*4882a593Smuzhiyun height = priv->render_rectangle.h; 77*4882a593Smuzhiyun } 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun- /* we want WL_SHM_FORMAT_XRGB8888 */ 80*4882a593Smuzhiyun- format = GST_VIDEO_FORMAT_BGRx; 81*4882a593Smuzhiyun+ if (priv->area_opaque) { 82*4882a593Smuzhiyun+ /* we want WL_SHM_FORMAT_XRGB8888 */ 83*4882a593Smuzhiyun+ format = GST_VIDEO_FORMAT_BGRx; 84*4882a593Smuzhiyun+ } else { 85*4882a593Smuzhiyun+ /* we want WL_SHM_FORMAT_ARGB8888 */ 86*4882a593Smuzhiyun+ format = GST_VIDEO_FORMAT_BGRA; 87*4882a593Smuzhiyun+ } 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun /* draw the area_subsurface */ 90*4882a593Smuzhiyun gst_video_info_set_format (&info, format, width, height); 91*4882a593Smuzhiyun-- 92*4882a593Smuzhiyun2.20.1 93*4882a593Smuzhiyun 94