1*4882a593SmuzhiyunFrom 094b728bb0ab22c917928d334358b4491b04b163 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com> 3*4882a593SmuzhiyunDate: Tue, 28 Dec 2021 14:06:19 +0800 4*4882a593SmuzhiyunSubject: [PATCH 20/41] waylandsink: Support window alpha property 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunTested with: 7*4882a593Smuzhiyungst-launch-1.0 videotestsrc ! waylandsink alpha=0.5 8*4882a593Smuzhiyun 9*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 10*4882a593Smuzhiyun--- 11*4882a593Smuzhiyun ext/wayland/gstwaylandsink.c | 31 ++++++++++++++++++++++++++++++ 12*4882a593Smuzhiyun ext/wayland/gstwaylandsink.h | 1 + 13*4882a593Smuzhiyun gst-libs/gst/wayland/gstwlwindow.c | 10 ++++++++++ 14*4882a593Smuzhiyun gst-libs/gst/wayland/gstwlwindow.h | 3 +++ 15*4882a593Smuzhiyun 4 files changed, 45 insertions(+) 16*4882a593Smuzhiyun 17*4882a593Smuzhiyundiff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c 18*4882a593Smuzhiyunindex 56a6849..008c774 100644 19*4882a593Smuzhiyun--- a/ext/wayland/gstwaylandsink.c 20*4882a593Smuzhiyun+++ b/ext/wayland/gstwaylandsink.c 21*4882a593Smuzhiyun@@ -62,6 +62,7 @@ enum 22*4882a593Smuzhiyun PROP_FULLSCREEN, 23*4882a593Smuzhiyun PROP_ROTATE_METHOD, 24*4882a593Smuzhiyun PROP_LAYER, 25*4882a593Smuzhiyun+ PROP_ALPHA, 26*4882a593Smuzhiyun PROP_LAST 27*4882a593Smuzhiyun }; 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun@@ -202,6 +203,11 @@ gst_wayland_sink_class_init (GstWaylandSinkClass * klass) 30*4882a593Smuzhiyun GST_TYPE_WL_WINDOW_LAYER, GST_WL_WINDOW_LAYER_NORMAL, 31*4882a593Smuzhiyun G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun+ g_object_class_install_property (gobject_class, PROP_ALPHA, 34*4882a593Smuzhiyun+ g_param_spec_double ("alpha", "Window alpha", 35*4882a593Smuzhiyun+ "Wayland window alpha", 0.0, 1.0, 1.0, 36*4882a593Smuzhiyun+ G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); 37*4882a593Smuzhiyun+ 38*4882a593Smuzhiyun /** 39*4882a593Smuzhiyun * waylandsink:render-rectangle: 40*4882a593Smuzhiyun * 41*4882a593Smuzhiyun@@ -221,6 +227,7 @@ gst_wayland_sink_init (GstWaylandSink * self) 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun self->window_handle = 1; 44*4882a593Smuzhiyun self->layer = GST_WL_WINDOW_LAYER_NORMAL; 45*4882a593Smuzhiyun+ self->alpha = 1.0; 46*4882a593Smuzhiyun } 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun static void 49*4882a593Smuzhiyun@@ -284,6 +291,18 @@ gst_wayland_sink_set_layer (GstWaylandSink * self, GstWlWindowLayer layer) 50*4882a593Smuzhiyun g_mutex_unlock (&self->render_lock); 51*4882a593Smuzhiyun } 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun+static void 54*4882a593Smuzhiyun+gst_wayland_sink_set_alpha (GstWaylandSink * self, gdouble alpha) 55*4882a593Smuzhiyun+{ 56*4882a593Smuzhiyun+ if (alpha == self->alpha) 57*4882a593Smuzhiyun+ return; 58*4882a593Smuzhiyun+ 59*4882a593Smuzhiyun+ g_mutex_lock (&self->render_lock); 60*4882a593Smuzhiyun+ self->alpha = alpha; 61*4882a593Smuzhiyun+ gst_wl_window_ensure_alpha (self->window, alpha); 62*4882a593Smuzhiyun+ g_mutex_unlock (&self->render_lock); 63*4882a593Smuzhiyun+} 64*4882a593Smuzhiyun+ 65*4882a593Smuzhiyun static void 66*4882a593Smuzhiyun gst_wayland_sink_get_property (GObject * object, 67*4882a593Smuzhiyun guint prop_id, GValue * value, GParamSpec * pspec) 68*4882a593Smuzhiyun@@ -311,6 +330,11 @@ gst_wayland_sink_get_property (GObject * object, 69*4882a593Smuzhiyun g_value_set_enum (value, self->layer); 70*4882a593Smuzhiyun GST_OBJECT_UNLOCK (self); 71*4882a593Smuzhiyun break; 72*4882a593Smuzhiyun+ case PROP_ALPHA: 73*4882a593Smuzhiyun+ GST_OBJECT_LOCK (self); 74*4882a593Smuzhiyun+ g_value_set_double (value, self->alpha); 75*4882a593Smuzhiyun+ GST_OBJECT_UNLOCK (self); 76*4882a593Smuzhiyun+ break; 77*4882a593Smuzhiyun default: 78*4882a593Smuzhiyun G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); 79*4882a593Smuzhiyun break; 80*4882a593Smuzhiyun@@ -343,6 +367,11 @@ gst_wayland_sink_set_property (GObject * object, 81*4882a593Smuzhiyun gst_wayland_sink_set_layer (self, g_value_get_enum (value)); 82*4882a593Smuzhiyun GST_OBJECT_UNLOCK (self); 83*4882a593Smuzhiyun break; 84*4882a593Smuzhiyun+ case PROP_ALPHA: 85*4882a593Smuzhiyun+ GST_OBJECT_LOCK (self); 86*4882a593Smuzhiyun+ gst_wayland_sink_set_alpha (self, g_value_get_double (value)); 87*4882a593Smuzhiyun+ GST_OBJECT_UNLOCK (self); 88*4882a593Smuzhiyun+ break; 89*4882a593Smuzhiyun default: 90*4882a593Smuzhiyun if (!gst_video_overlay_set_property (object, PROP_LAST, prop_id, value)) 91*4882a593Smuzhiyun G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); 92*4882a593Smuzhiyun@@ -827,6 +856,7 @@ gst_wayland_sink_show_frame (GstVideoSink * vsink, GstBuffer * buffer) 93*4882a593Smuzhiyun G_CALLBACK (on_window_closed), self, 0); 94*4882a593Smuzhiyun gst_wl_window_set_rotate_method (self->window, 95*4882a593Smuzhiyun self->current_rotate_method); 96*4882a593Smuzhiyun+ gst_wl_window_ensure_alpha (self->window, self->alpha); 97*4882a593Smuzhiyun } 98*4882a593Smuzhiyun } 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun@@ -1085,6 +1115,7 @@ gst_wayland_sink_set_window_handle (GstVideoOverlay * overlay, guintptr handle) 101*4882a593Smuzhiyun &self->render_lock); 102*4882a593Smuzhiyun gst_wl_window_set_rotate_method (self->window, 103*4882a593Smuzhiyun self->current_rotate_method); 104*4882a593Smuzhiyun+ gst_wl_window_ensure_alpha (self->window, self->alpha); 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun if (self->last_buffer) { 107*4882a593Smuzhiyun /* Resend video info to force resize video surface */ 108*4882a593Smuzhiyundiff --git a/ext/wayland/gstwaylandsink.h b/ext/wayland/gstwaylandsink.h 109*4882a593Smuzhiyunindex a417788..0339ef7 100644 110*4882a593Smuzhiyun--- a/ext/wayland/gstwaylandsink.h 111*4882a593Smuzhiyun+++ b/ext/wayland/gstwaylandsink.h 112*4882a593Smuzhiyun@@ -58,6 +58,7 @@ struct _GstWaylandSink 113*4882a593Smuzhiyun GstVideoInfo video_info; 114*4882a593Smuzhiyun gboolean fullscreen; 115*4882a593Smuzhiyun GstWlWindowLayer layer; 116*4882a593Smuzhiyun+ gdouble alpha; 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun gchar *display_name; 119*4882a593Smuzhiyun 120*4882a593Smuzhiyundiff --git a/gst-libs/gst/wayland/gstwlwindow.c b/gst-libs/gst/wayland/gstwlwindow.c 121*4882a593Smuzhiyunindex fed1c97..f470338 100644 122*4882a593Smuzhiyun--- a/gst-libs/gst/wayland/gstwlwindow.c 123*4882a593Smuzhiyun+++ b/gst-libs/gst/wayland/gstwlwindow.c 124*4882a593Smuzhiyun@@ -24,6 +24,7 @@ 125*4882a593Smuzhiyun #include <config.h> 126*4882a593Smuzhiyun #endif 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun+#include <stdio.h> 129*4882a593Smuzhiyun #include <stdlib.h> 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun #include "gstwlwindow.h" 132*4882a593Smuzhiyun@@ -267,6 +268,15 @@ gst_wl_window_set_config (GstWlWindow * self, const char *config) 133*4882a593Smuzhiyun xdg_toplevel_set_title (priv->xdg_toplevel, config); 134*4882a593Smuzhiyun } 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun+void 137*4882a593Smuzhiyun+gst_wl_window_ensure_alpha (GstWlWindow * window, gdouble alpha) 138*4882a593Smuzhiyun+{ 139*4882a593Smuzhiyun+ char s[128]; 140*4882a593Smuzhiyun+ 141*4882a593Smuzhiyun+ snprintf (s, sizeof (s), "attrs=alpha:%f;", alpha); 142*4882a593Smuzhiyun+ gst_wl_window_set_config (window, s); 143*4882a593Smuzhiyun+} 144*4882a593Smuzhiyun+ 145*4882a593Smuzhiyun void 146*4882a593Smuzhiyun gst_wl_window_ensure_layer (GstWlWindow * self, GstWlWindowLayer layer) 147*4882a593Smuzhiyun { 148*4882a593Smuzhiyundiff --git a/gst-libs/gst/wayland/gstwlwindow.h b/gst-libs/gst/wayland/gstwlwindow.h 149*4882a593Smuzhiyunindex a0b05c3..2672e0f 100644 150*4882a593Smuzhiyun--- a/gst-libs/gst/wayland/gstwlwindow.h 151*4882a593Smuzhiyun+++ b/gst-libs/gst/wayland/gstwlwindow.h 152*4882a593Smuzhiyun@@ -40,6 +40,9 @@ struct _GstWlWindow 153*4882a593Smuzhiyun GObject parent_instance; 154*4882a593Smuzhiyun }; 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun+GST_WL_API 157*4882a593Smuzhiyun+void gst_wl_window_ensure_alpha (GstWlWindow * self, gdouble alpha); 158*4882a593Smuzhiyun+ 159*4882a593Smuzhiyun GST_WL_API 160*4882a593Smuzhiyun void gst_wl_window_ensure_layer (GstWlWindow * self, 161*4882a593Smuzhiyun GstWlWindowLayer layer); 162*4882a593Smuzhiyun-- 163*4882a593Smuzhiyun2.20.1 164*4882a593Smuzhiyun 165