MMFMWK-7954 waylandsink: add property to set window resolution
add two property for user to set window resolution when
using waylandsink in cmdline
upstream status: Pending
https://bugzilla.gnome.org/show_bug.cgi?id=796932
diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c
index d291bf2..3f32a77 100644
--- a/ext/wayland/gstwaylandsink.c
+++ b/ext/wayland/gstwaylandsink.c
@@ -68,6 +68,8 @@
enum
{
PROP_0,
+ PROP_WINDOW_WIDTH,
+ PROP_WINDOW_HEIGHT,
PROP_DISPLAY,
PROP_ALPHA
};
@@ -207,6 +209,16 @@
gstvideosink_class->show_frame =
GST_DEBUG_FUNCPTR (gst_wayland_sink_show_frame);
+ g_object_class_install_property (gobject_class, PROP_WINDOW_WIDTH,
+ g_param_spec_int ("window-width", "Wayland sink window width", "Wayland "
+ "sink preferred window width in pixel",
+ -1, G_MAXINT, -1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_WINDOW_HEIGHT,
+ g_param_spec_int ("window-height", "Wayland sink window height", "Wayland "
+ "sink preferred window height in pixel",
+ -1, G_MAXINT, -1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
g_object_class_install_property (gobject_class, PROP_DISPLAY,
g_param_spec_string ("display", "Wayland Display name", "Wayland "
"display name to connect to, if not supplied via the GstContext",
@@ -222,6 +234,8 @@
gst_wayland_sink_init (GstWaylandSink * sink)
{
sink->alpha = 0.0f;
+ sink->preferred_width = -1;
+ sink->preferred_height = -1;
g_mutex_init (&sink->display_lock);
g_mutex_init (&sink->render_lock);
g_cond_init (&sink->redraw_wait);
@@ -241,6 +255,12 @@
g_value_set_string (value, sink->display_name);
GST_OBJECT_UNLOCK (sink);
break;
+ case PROP_WINDOW_WIDTH:
+ g_value_set_int (value, sink->preferred_width);
+ break;
+ case PROP_WINDOW_HEIGHT:
+ g_value_set_int (value, sink->preferred_height);
+ break;
case PROP_ALPHA:
g_value_set_float (value, sink->alpha);
break;
@@ -262,6 +282,12 @@
sink->display_name = g_value_dup_string (value);
GST_OBJECT_UNLOCK (sink);
break;
+ case PROP_WINDOW_WIDTH:
+ sink->preferred_width = g_value_get_int (value);
+ break;
+ case PROP_WINDOW_HEIGHT:
+ sink->preferred_height = g_value_get_int (value);
+ break;
case PROP_ALPHA:
sink->alpha = g_value_get_float (value);
break;
@@ -378,6 +404,8 @@
case GST_STATE_CHANGE_NULL_TO_READY:
if (!gst_wayland_sink_find_display (sink))
return GST_STATE_CHANGE_FAILURE;
+ sink->display->preferred_width = sink->preferred_width;
+ sink->display->preferred_height = sink->preferred_height;
break;
default:
break;
diff --git a/ext/wayland/gstwaylandsink.h b/ext/wayland/gstwaylandsink.h
index dd6bcec..d675348 100644
--- a/ext/wayland/gstwaylandsink.h
+++ b/ext/wayland/gstwaylandsink.h
@@ -64,6 +64,9 @@
gboolean video_info_changed;
GstVideoInfo video_info;
+ /* preferred window resolution */
+ gint preferred_width, preferred_height;
+
gchar *display_name;
gboolean redraw_pending;
diff --git a/ext/wayland/wldisplay.c b/ext/wayland/wldisplay.c
index 1ab61f3..9b56922 100644
--- a/ext/wayland/wldisplay.c
+++ b/ext/wayland/wldisplay.c
@@ -51,6 +51,8 @@
self->buffers = g_hash_table_new (g_direct_hash, g_direct_equal);
self->width = -1;
self->height = -1;
+ self->preferred_width = -1;
+ self->preferred_height = -1;
g_mutex_init (&self->buffers_mutex);
}
diff --git a/ext/wayland/wldisplay.h b/ext/wayland/wldisplay.h
index 031411e..45ef293 100644
--- a/ext/wayland/wldisplay.h
+++ b/ext/wayland/wldisplay.h
@@ -66,6 +66,9 @@
/* real display resolution */
gint width, height;
+ /* preferred window resolution */
+ gint preferred_width, preferred_height;
+
/* private */
gboolean own_display;
GThread *thread;
diff --git a/ext/wayland/wlutils.c b/ext/wayland/wlutils.c
index fb306b8..a4d4399 100644
--- a/ext/wayland/wlutils.c
+++ b/ext/wayland/wlutils.c
@@ -37,9 +37,6 @@
#define WESTON_INI "/etc/xdg/weston/weston.ini"
-/* FIXME: try to get from wayland server */
-#define PANEL_HEIGH 32
-
gboolean
gst_wl_init_surface_state(GstWlDisplay * display, GstWlWindow * window)
{
diff --git a/ext/wayland/wlutils.h b/ext/wayland/wlutils.h
index fb94ad8..003912c 100644
--- a/ext/wayland/wlutils.h
+++ b/ext/wayland/wlutils.h
@@ -28,6 +28,9 @@
G_BEGIN_DECLS
+/* FIXME: try to get from wayland server */
+#define PANEL_HEIGH 32
+
gboolean gst_wl_init_surface_state(GstWlDisplay * display, GstWlWindow * window);
G_END_DECLS
diff --git a/ext/wayland/wlwindow.c b/ext/wayland/wlwindow.c
index c42c330..c49bfd4 100644
--- a/ext/wayland/wlwindow.c
+++ b/ext/wayland/wlwindow.c
@@ -166,7 +166,7 @@
if (!gst_wl_init_surface_state(display, window)) {
window->fullscreen_width = display->width;
- window->fullscreen_height = display->height;
+ window->fullscreen_height = display->height - PANEL_HEIGH;
window->scale = 1;
GST_WARNING ("init surface_state fail, fallback to scale=%d fullscreen (%dx%d)",
window->scale,
@@ -201,7 +201,10 @@
return NULL;
}
- if (window->fullscreen_width <= 0) {
+ if (display->preferred_width > 0 && display->preferred_height > 0) {
+ width = display->preferred_width;
+ height = display->preferred_height;
+ } else if (window->fullscreen_width <= 0) {
/* set the initial size to be the same as the reported video size */
width =
gst_util_uint64_scale_int_round (info->width, info->par_n, info->par_d);