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