xvimagesink: Allow changing render-rectangle through property
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Tue, 23 Jan 2018 20:04:21 +0000 (15:04 -0500)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Mon, 29 Jan 2018 16:26:09 +0000 (16:26 +0000)
This also enables setting the render rectangle before the window
is provided or created.

https://bugzilla.gnome.org/show_bug.cgi?id=792798

sys/xvimage/xvimagesink.c
sys/xvimage/xvimagesink.h

index 54f3595..322117c 100644 (file)
@@ -185,7 +185,8 @@ enum
   PROP_COLORKEY,
   PROP_DRAW_BORDERS,
   PROP_WINDOW_WIDTH,
-  PROP_WINDOW_HEIGHT
+  PROP_WINDOW_HEIGHT,
+  PROP_LAST
 };
 
 /* ============================================================= */
@@ -792,6 +793,13 @@ gst_xv_image_sink_setcaps (GstBaseSink * bsink, GstCaps * caps)
         GST_VIDEO_SINK_HEIGHT (xvimagesink));
   }
 
+  if (xvimagesink->pending_render_rect) {
+    xvimagesink->pending_render_rect = FALSE;
+    gst_xwindow_set_render_rectangle (xvimagesink->xwindow,
+        xvimagesink->render_rect.x, xvimagesink->render_rect.y,
+        xvimagesink->render_rect.w, xvimagesink->render_rect.h);
+  }
+
   xvimagesink->info = info;
 
   /* After a resize, we want to redraw the borders in case the new frame size
@@ -1271,9 +1279,16 @@ gst_xv_image_sink_set_render_rectangle (GstVideoOverlay * overlay, gint x,
   GstXvImageSink *xvimagesink = GST_XV_IMAGE_SINK (overlay);
 
   g_mutex_lock (&xvimagesink->flow_lock);
-  if (G_LIKELY (xvimagesink->xwindow))
+  if (G_LIKELY (xvimagesink->xwindow)) {
     gst_xwindow_set_render_rectangle (xvimagesink->xwindow, x, y, width,
         height);
+  } else {
+    xvimagesink->render_rect.x = x;
+    xvimagesink->render_rect.y = y;
+    xvimagesink->render_rect.w = width;
+    xvimagesink->render_rect.h = height;
+    xvimagesink->pending_render_rect = TRUE;
+  }
   g_mutex_unlock (&xvimagesink->flow_lock);
 }
 
@@ -1623,7 +1638,8 @@ gst_xv_image_sink_set_property (GObject * object, guint prop_id,
       xvimagesink->draw_borders = g_value_get_boolean (value);
       break;
     default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      if (!gst_video_overlay_set_property (object, PROP_LAST, prop_id, value))
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
   }
 }
@@ -1933,6 +1949,9 @@ gst_xv_image_sink_class_init (GstXvImageSinkClass * klass)
       g_param_spec_string ("device-name", "Adaptor name",
           "The name of the video adaptor", NULL,
           G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+  gst_video_overlay_install_properties (gobject_class, PROP_LAST);
+
   /**
    * GstXvImageSink:handle-expose
    *
index 1177903..9bf4d79 100644 (file)
@@ -120,6 +120,10 @@ struct _GstXvImageSink
 
   /* stream metadata */
   gchar *media_title;
+
+  /* saved render rectangle until we have a window */
+  gboolean pending_render_rect;
+  GstVideoRectangle render_rect;
 };
 
 struct _GstXvImageSinkClass