add rectangle property in amlvideosink

Change-Id: I3d71499b6968371e67179d779f48b94826060239
diff --git a/src/gstamlvideosink.c b/src/gstamlvideosink.c
index e95a5b2..52d8b67 100644
--- a/src/gstamlvideosink.c
+++ b/src/gstamlvideosink.c
@@ -76,6 +76,7 @@
     PROP_SETMUTE,
     PROP_AVSYNC_MODE,
     PROP_VIDEO_FRAME_DROP_NUM,
+    PROP_WINDOW_SET,
 };
 
 // #define AML_VIDEO_FORMATS                                          \
@@ -95,8 +96,18 @@
 #define DRMBP_LIMIT_MAX_BUFSIZE_TO_BUFSIZE 1
 #define DRMBP_UNLIMIT_MAX_BUFSIZE 0
 
+typedef struct _GstAmlVideoSinkWindowSet
+{
+    gboolean window_change;
+    gint x;
+    gint y;
+    gint w;
+    gint h;
+} GstAmlVideoSinkWindowSet;
+
 struct _GstAmlVideoSinkPrivate
 {
+    GstAmlVideoSinkWindowSet window_set;
     GstBuffer *preroll_buffer;
     gchar *render_device_name;
     void *render_device_handle;
@@ -213,6 +224,12 @@
         g_param_spec_int("frames-dropped", "frames-dropped",
                          "number of dropped frames",
                          0, G_MAXINT32, 0, G_PARAM_READABLE));
+
+    g_object_class_install_property(
+        G_OBJECT_CLASS(klass), PROP_WINDOW_SET,
+        g_param_spec_string("rectangle", "rectangle",
+                            "Window Set Format: x,y,width,height",
+                            NULL, G_PARAM_WRITABLE));
 }
 
 static void gst_aml_video_sink_init(GstAmlVideoSink *sink)
@@ -310,6 +327,47 @@
         }
         GST_OBJECT_UNLOCK(sink);
         break;
+    case PROP_WINDOW_SET:
+    {
+        const gchar *str = g_value_get_string(value);
+        gchar **parts = g_strsplit(str, ",", 4);
+
+        if (!parts[0] || !parts[1] || !parts[2] || !parts[3])
+        {
+            GST_ERROR("Bad window properties string");
+        }
+        else
+        {
+            int nx, ny, nw, nh;
+            nx = atoi(parts[0]);
+            ny = atoi(parts[1]);
+            nw = atoi(parts[2]);
+            nh = atoi(parts[3]);
+
+            if ((nx != sink_priv->window_set.x) ||
+                (ny != sink_priv->window_set.y) ||
+                (nw != sink_priv->window_set.w) ||
+                (nh != sink_priv->window_set.h))
+            {
+                GST_OBJECT_LOCK(sink);
+                sink_priv->window_set.window_change = true;
+                sink_priv->window_set.x = nx;
+                sink_priv->window_set.y = ny;
+                sink_priv->window_set.w = nw;
+                sink_priv->window_set.h = nh;
+
+                GST_DEBUG("set window rect (%d,%d,%d,%d)\n",
+                          sink_priv->window_set.x,
+                          sink_priv->window_set.y,
+                          sink_priv->window_set.w,
+                          sink_priv->window_set.h);
+                GST_OBJECT_UNLOCK(sink);
+            }
+        }
+
+        g_strfreev(parts);
+        break;
+    }
     default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
         break;
@@ -563,6 +621,17 @@
         goto flushing;
     }
 
+    if(sink_priv->window_set.window_change)
+    {
+        RenderWindowSize window_size = {sink_priv->window_set.x, sink_priv->window_set.y, sink_priv->window_set.w, sink_priv->window_set.h};
+        if (render_set(sink_priv->render_device_handle, KEY_WINDOW_SIZE, &window_size) == -1)
+        {
+            GST_ERROR_OBJECT(vsink, "tunnel lib: set window size error");
+            return FALSE;
+        }
+        sink_priv->window_set.window_change = FALSE;
+    }
+
     if (sink_priv->video_info_changed)
     {
         if (gst_render_set_params(vsink) == FALSE)