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);