1*4882a593SmuzhiyunFrom 499e9f7b9caa1e47194f8043d607f71eef2248bb 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 36/36] 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 ext/wayland/wlwindow.c | 32 ++++++++++++++++++++++---------- 11*4882a593Smuzhiyun ext/wayland/wlwindow.h | 3 +++ 12*4882a593Smuzhiyun 2 files changed, 25 insertions(+), 10 deletions(-) 13*4882a593Smuzhiyun 14*4882a593Smuzhiyundiff --git a/ext/wayland/wlwindow.c b/ext/wayland/wlwindow.c 15*4882a593Smuzhiyunindex ba1046a..330579f 100644 16*4882a593Smuzhiyun--- a/ext/wayland/wlwindow.c 17*4882a593Smuzhiyun+++ b/ext/wayland/wlwindow.c 18*4882a593Smuzhiyun@@ -528,17 +528,19 @@ gst_wl_window_resize_video_surface (GstWlWindow * window, gboolean commit) 19*4882a593Smuzhiyun } 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun static void 22*4882a593Smuzhiyun-gst_wl_window_set_opaque (GstWlWindow * window, const GstVideoInfo * info) 23*4882a593Smuzhiyun+gst_wl_window_set_opaque (GstWlWindow * window) 24*4882a593Smuzhiyun { 25*4882a593Smuzhiyun struct wl_region *region; 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun- /* Set area opaque */ 28*4882a593Smuzhiyun- region = wl_compositor_create_region (window->display->compositor); 29*4882a593Smuzhiyun- wl_region_add (region, 0, 0, G_MAXINT32, G_MAXINT32); 30*4882a593Smuzhiyun- wl_surface_set_opaque_region (window->area_surface, region); 31*4882a593Smuzhiyun- wl_region_destroy (region); 32*4882a593Smuzhiyun+ if (window->area_opaque) { 33*4882a593Smuzhiyun+ /* Set area opaque */ 34*4882a593Smuzhiyun+ region = wl_compositor_create_region (window->display->compositor); 35*4882a593Smuzhiyun+ wl_region_add (region, 0, 0, G_MAXINT32, G_MAXINT32); 36*4882a593Smuzhiyun+ wl_surface_set_opaque_region (window->area_surface, region); 37*4882a593Smuzhiyun+ wl_region_destroy (region); 38*4882a593Smuzhiyun+ } 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun- if (!GST_VIDEO_INFO_HAS_ALPHA (info)) { 41*4882a593Smuzhiyun+ if (window->video_opaque) { 42*4882a593Smuzhiyun /* Set video opaque */ 43*4882a593Smuzhiyun region = wl_compositor_create_region (window->display->compositor); 44*4882a593Smuzhiyun wl_region_add (region, 0, 0, G_MAXINT32, G_MAXINT32); 45*4882a593Smuzhiyun@@ -554,10 +556,15 @@ gst_wl_window_render (GstWlWindow * window, GstWlBuffer * buffer, 46*4882a593Smuzhiyun if (G_UNLIKELY (info)) { 47*4882a593Smuzhiyun window->video_width = info->width; 48*4882a593Smuzhiyun window->video_height = info->height; 49*4882a593Smuzhiyun+ window->video_opaque = !GST_VIDEO_INFO_HAS_ALPHA (info); 50*4882a593Smuzhiyun+ window->area_opaque = window->video_opaque; 51*4882a593Smuzhiyun+ 52*4882a593Smuzhiyun+ if (g_getenv ("WAYLANDSINK_FORCE_OPAQUE")) 53*4882a593Smuzhiyun+ window->area_opaque = window->video_opaque = TRUE; 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun wl_subsurface_set_sync (window->video_subsurface); 56*4882a593Smuzhiyun gst_wl_window_resize_video_surface (window, FALSE); 57*4882a593Smuzhiyun- gst_wl_window_set_opaque (window, info); 58*4882a593Smuzhiyun+ gst_wl_window_set_opaque (window); 59*4882a593Smuzhiyun } else if (window->crop_dirty) { 60*4882a593Smuzhiyun gst_wl_window_resize_video_surface (window, FALSE); 61*4882a593Smuzhiyun } 62*4882a593Smuzhiyun@@ -624,8 +631,13 @@ gst_wl_window_update_borders (GstWlWindow * window) 63*4882a593Smuzhiyun height = window->render_rectangle.h; 64*4882a593Smuzhiyun } 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun- /* we want WL_SHM_FORMAT_XRGB8888 */ 67*4882a593Smuzhiyun- format = GST_VIDEO_FORMAT_BGRx; 68*4882a593Smuzhiyun+ if (window->area_opaque) { 69*4882a593Smuzhiyun+ /* we want WL_SHM_FORMAT_XRGB8888 */ 70*4882a593Smuzhiyun+ format = GST_VIDEO_FORMAT_BGRx; 71*4882a593Smuzhiyun+ } else { 72*4882a593Smuzhiyun+ /* we want WL_SHM_FORMAT_ARGB8888 */ 73*4882a593Smuzhiyun+ format = GST_VIDEO_FORMAT_BGRA; 74*4882a593Smuzhiyun+ } 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun /* draw the area_subsurface */ 77*4882a593Smuzhiyun gst_video_info_set_format (&info, format, width, height); 78*4882a593Smuzhiyundiff --git a/ext/wayland/wlwindow.h b/ext/wayland/wlwindow.h 79*4882a593Smuzhiyunindex 672e15a..66b69f4 100644 80*4882a593Smuzhiyun--- a/ext/wayland/wlwindow.h 81*4882a593Smuzhiyun+++ b/ext/wayland/wlwindow.h 82*4882a593Smuzhiyun@@ -77,6 +77,9 @@ struct _GstWlWindow 83*4882a593Smuzhiyun gint crop_x, crop_y, crop_w, crop_h; 84*4882a593Smuzhiyun gboolean crop_dirty; 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun+ gboolean video_opaque; 87*4882a593Smuzhiyun+ gboolean area_opaque; 88*4882a593Smuzhiyun+ 89*4882a593Smuzhiyun /* when this is not set both the area_surface and the video_surface are not 90*4882a593Smuzhiyun * visible and certain steps should be skipped */ 91*4882a593Smuzhiyun gboolean is_area_surface_mapped; 92*4882a593Smuzhiyun-- 93*4882a593Smuzhiyun2.20.1 94*4882a593Smuzhiyun 95