gdkpixbufoverlay: update composition in _before_transform
authorMark Nauwelaerts <mnauw@users.sourceforge.net>
Sat, 21 Jan 2017 19:48:22 +0000 (20:48 +0100)
committerMark Nauwelaerts <mnauw@users.sourceforge.net>
Sun, 22 Jan 2017 09:18:27 +0000 (10:18 +0100)
... since we need to determine passthrough mode for buffer preparation before
calling into _transform_ip.

ext/gdk_pixbuf/gstgdkpixbufoverlay.c

index 635dd5f..9e31668 100644 (file)
@@ -610,29 +610,36 @@ gst_gdk_pixbuf_overlay_before_transform (GstBaseTransform * trans,
     GstBuffer * outbuf)
 {
   GstClockTime stream_time;
+  GstGdkPixbufOverlay *overlay = GST_GDK_PIXBUF_OVERLAY (trans);
+  gboolean set_passthrough = FALSE;
 
   stream_time = gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME,
       GST_BUFFER_TIMESTAMP (outbuf));
 
   if (GST_CLOCK_TIME_IS_VALID (stream_time))
     gst_object_sync_values (GST_OBJECT (trans), stream_time);
-}
-
-static GstFlowReturn
-gst_gdk_pixbuf_overlay_transform_frame_ip (GstVideoFilter * filter,
-    GstVideoFrame * frame)
-{
-  GstGdkPixbufOverlay *overlay = GST_GDK_PIXBUF_OVERLAY (filter);
 
+  /* now properties have been sync'ed; maybe need to update composition */
   GST_OBJECT_LOCK (overlay);
-
   if (G_UNLIKELY (overlay->update_composition)) {
     gst_gdk_pixbuf_overlay_update_composition (overlay);
     overlay->update_composition = FALSE;
+    set_passthrough = TRUE;
   }
-
   GST_OBJECT_UNLOCK (overlay);
 
+  /* determine passthrough mode so the buffer is writable if needed
+   * when passed into _transform_ip */
+  if (G_UNLIKELY (set_passthrough))
+    gst_base_transform_set_passthrough (trans, overlay->comp == NULL);
+}
+
+static GstFlowReturn
+gst_gdk_pixbuf_overlay_transform_frame_ip (GstVideoFilter * filter,
+    GstVideoFrame * frame)
+{
+  GstGdkPixbufOverlay *overlay = GST_GDK_PIXBUF_OVERLAY (filter);
+
   if (overlay->comp != NULL)
     gst_video_overlay_composition_blend (overlay->comp, frame);