deinterlace: Implement reconfiguration a bit better
authorSebastian Dröge <sebastian@centricular.com>
Tue, 26 Jan 2016 16:50:30 +0000 (17:50 +0100)
committerSebastian Dröge <sebastian@centricular.com>
Wed, 27 Jan 2016 15:45:29 +0000 (16:45 +0100)
And e.g. consider reconfiguration caused by RECONFIGURE events too.

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

gst/deinterlace/gstdeinterlace.c

index 2aae805..f01efd9 100644 (file)
  * </refsect2>
  */
 
-/* FIXME PORTING 0.11:
- *  - reconfiguration needs to be done differently
- */
-
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
@@ -847,7 +843,6 @@ gst_deinterlace_set_property (GObject * object, guint prop_id,
 
       GST_OBJECT_LOCK (self);
       new_mode = g_value_get_enum (value);
-      /* FIXME: reconfiguration should probably be done differently */
       if (self->mode != new_mode && gst_pad_has_current_caps (self->srcpad)) {
         self->reconfigure = TRUE;
         self->new_mode = new_mode;
@@ -866,7 +861,6 @@ gst_deinterlace_set_property (GObject * object, guint prop_id,
 
       GST_OBJECT_LOCK (self);
       new_fields = g_value_get_enum (value);
-      /* FIXME: reconfiguration should probably be done differently */
       if (self->fields != new_fields && gst_pad_has_current_caps (self->srcpad)) {
         self->reconfigure = TRUE;
         self->new_fields = new_fields;
@@ -1550,7 +1544,11 @@ restart:
 
       /* setcaps on sink and src pads */
       sinkcaps = gst_pad_get_current_caps (self->sinkpad);
-      gst_deinterlace_setcaps (self, self->sinkpad, sinkcaps);  // FIXME
+      if (!gst_deinterlace_setcaps (self, self->sinkpad, sinkcaps)) {
+        gst_caps_unref (sinkcaps);
+        return GST_FLOW_NOT_NEGOTIATED;
+      }
+
       gst_caps_unref (sinkcaps);
 
       if (flush_one && self->drop_orphans) {
@@ -2014,7 +2012,7 @@ gst_deinterlace_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
   GstFlowReturn ret = GST_FLOW_OK;
 
   GST_OBJECT_LOCK (self);
-  if (self->reconfigure) {      /* FIXME: reconfigure should probably work differently */
+  if (self->reconfigure || gst_pad_check_reconfigure (self->srcpad)) {
     GstCaps *caps;
 
     if ((gint) self->new_fields != -1)
@@ -2028,8 +2026,13 @@ gst_deinterlace_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
     GST_OBJECT_UNLOCK (self);
     caps = gst_pad_get_current_caps (self->sinkpad);
     if (caps != NULL) {
-      gst_deinterlace_setcaps (self, self->sinkpad, caps);      // FIXME
+      if (!gst_deinterlace_setcaps (self, self->sinkpad, caps)) {
+        gst_caps_unref (caps);
+        return GST_FLOW_NOT_NEGOTIATED;
+      }
       gst_caps_unref (caps);
+    } else {
+      return GST_FLOW_FLUSHING;
     }
   } else {
     GST_OBJECT_UNLOCK (self);