deinterlace: Simplify setcaps
authorRobert Swain <robert.swain@collabora.co.uk>
Mon, 8 Nov 2010 13:25:59 +0000 (14:25 +0100)
committerRobert Swain <robert.swain@collabora.co.uk>
Wed, 23 Feb 2011 12:09:19 +0000 (13:09 +0100)
The current code never uses upstream negotiation so the code can be
significantly simplified.

gst/deinterlace/gstdeinterlace.c
gst/deinterlace/gstdeinterlace.h

index f10f1bc..12b1dd6 100644 (file)
@@ -564,8 +564,6 @@ gst_deinterlace_init (GstDeinterlace * self, GstDeinterlaceClass * klass)
       GST_DEBUG_FUNCPTR (gst_deinterlace_src_query));
   gst_pad_set_getcaps_function (self->srcpad,
       GST_DEBUG_FUNCPTR (gst_deinterlace_getcaps));
-  gst_pad_set_setcaps_function (self->srcpad,
-      GST_DEBUG_FUNCPTR (gst_deinterlace_setcaps));
   gst_element_add_pad (GST_ELEMENT (self), self->srcpad);
 
   self->mode = DEFAULT_MODE;
@@ -645,14 +643,6 @@ gst_deinterlace_reset (GstDeinterlace * self)
 
   gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED);
 
-  if (self->sink_caps)
-    gst_caps_unref (self->sink_caps);
-  self->sink_caps = NULL;
-
-  if (self->src_caps)
-    gst_caps_unref (self->src_caps);
-  self->src_caps = NULL;
-
   if (self->request_caps)
     gst_caps_unref (self->request_caps);
   self->request_caps = NULL;
@@ -1002,13 +992,15 @@ gst_deinterlace_output_frame (GstDeinterlace * self, gboolean flushing)
       GST_DEBUG_OBJECT (self, "deinterlacing top field");
 
       /* create new buffer */
-      ret = gst_pad_alloc_buffer (self->srcpad,
-          GST_BUFFER_OFFSET_NONE, self->frame_size, self->src_caps, &outbuf);
+      ret =
+          gst_pad_alloc_buffer (self->srcpad, GST_BUFFER_OFFSET_NONE,
+          self->frame_size, GST_PAD_CAPS (self->srcpad), &outbuf);
       if (ret != GST_FLOW_OK)
         return ret;
 
-      if (self->src_caps != GST_BUFFER_CAPS (outbuf) &&
-          !gst_caps_is_equal (self->src_caps, GST_BUFFER_CAPS (outbuf))) {
+      if (GST_PAD_CAPS (self->srcpad) != GST_BUFFER_CAPS (outbuf)
+          && !gst_caps_is_equal (GST_PAD_CAPS (self->srcpad),
+              GST_BUFFER_CAPS (outbuf))) {
         gst_caps_replace (&self->request_caps, GST_BUFFER_CAPS (outbuf));
         GST_DEBUG_OBJECT (self, "Upstream wants new caps %" GST_PTR_FORMAT,
             self->request_caps);
@@ -1019,7 +1011,7 @@ gst_deinterlace_output_frame (GstDeinterlace * self, gboolean flushing)
         if (!outbuf)
           return GST_FLOW_ERROR;
 
-        gst_buffer_set_caps (outbuf, self->src_caps);
+        gst_buffer_set_caps (outbuf, GST_PAD_CAPS (self->srcpad));
       }
 
       g_return_val_if_fail (self->history_count - 1 -
@@ -1080,13 +1072,15 @@ gst_deinterlace_output_frame (GstDeinterlace * self, gboolean flushing)
       GST_DEBUG_OBJECT (self, "deinterlacing bottom field");
 
       /* create new buffer */
-      ret = gst_pad_alloc_buffer (self->srcpad,
-          GST_BUFFER_OFFSET_NONE, self->frame_size, self->src_caps, &outbuf);
+      ret =
+          gst_pad_alloc_buffer (self->srcpad, GST_BUFFER_OFFSET_NONE,
+          self->frame_size, GST_PAD_CAPS (self->srcpad), &outbuf);
       if (ret != GST_FLOW_OK)
         return ret;
 
-      if (self->src_caps != GST_BUFFER_CAPS (outbuf) &&
-          !gst_caps_is_equal (self->src_caps, GST_BUFFER_CAPS (outbuf))) {
+      if (GST_PAD_CAPS (self->srcpad) != GST_BUFFER_CAPS (outbuf)
+          && !gst_caps_is_equal (GST_PAD_CAPS (self->srcpad),
+              GST_BUFFER_CAPS (outbuf))) {
         gst_caps_replace (&self->request_caps, GST_BUFFER_CAPS (outbuf));
         GST_DEBUG_OBJECT (self, "Upstream wants new caps %" GST_PTR_FORMAT,
             self->request_caps);
@@ -1097,7 +1091,7 @@ gst_deinterlace_output_frame (GstDeinterlace * self, gboolean flushing)
         if (!outbuf)
           return GST_FLOW_ERROR;
 
-        gst_buffer_set_caps (outbuf, self->src_caps);
+        gst_buffer_set_caps (outbuf, GST_PAD_CAPS (self->srcpad));
       }
 
       g_return_val_if_fail (self->history_count - 1 -
@@ -1391,10 +1385,7 @@ gst_deinterlace_setcaps (GstPad * pad, GstCaps * caps)
 {
   gboolean res = TRUE;
   GstDeinterlace *self = GST_DEINTERLACE (gst_pad_get_parent (pad));
-  GstPad *otherpad;
-  GstCaps *othercaps;
-
-  otherpad = (pad == self->srcpad) ? self->sinkpad : self->srcpad;
+  GstCaps *srccaps;
 
   res =
       gst_video_format_parse_caps (caps, &self->format, &self->width,
@@ -1410,57 +1401,45 @@ gst_deinterlace_setcaps (GstPad * pad, GstCaps * caps)
   if (!self->passthrough && self->fields == GST_DEINTERLACE_ALL) {
     gint fps_n = self->fps_n, fps_d = self->fps_d;
 
-    if (!gst_fraction_double (&fps_n, &fps_d, otherpad != self->srcpad))
+    if (!gst_fraction_double (&fps_n, &fps_d, FALSE))
       goto invalid_caps;
 
-    othercaps = gst_caps_copy (caps);
+    srccaps = gst_caps_copy (caps);
 
-    gst_caps_set_simple (othercaps, "framerate", GST_TYPE_FRACTION, fps_n,
+    gst_caps_set_simple (srccaps, "framerate", GST_TYPE_FRACTION, fps_n,
         fps_d, NULL);
   } else {
-    othercaps = gst_caps_ref (caps);
+    srccaps = gst_caps_ref (caps);
   }
 
-  if (otherpad == self->srcpad && self->mode != GST_DEINTERLACE_MODE_DISABLED) {
-    othercaps = gst_caps_make_writable (othercaps);
-    gst_caps_set_simple (othercaps, "interlaced", G_TYPE_BOOLEAN, FALSE, NULL);
+  if (self->mode != GST_DEINTERLACE_MODE_DISABLED) {
+    srccaps = gst_caps_make_writable (srccaps);
+    gst_caps_set_simple (srccaps, "interlaced", G_TYPE_BOOLEAN, FALSE, NULL);
   }
 
   gst_deinterlace_reset_history (self, FALSE);
 
-  if (!gst_pad_set_caps (otherpad, othercaps))
+  if (!gst_pad_set_caps (self->srcpad, srccaps))
     goto caps_not_accepted;
 
   self->frame_size =
       gst_video_format_get_size (self->format, self->width, self->height);
 
   if (G_LIKELY (self->fps_n != 0)) {
-    if (self->fields == GST_DEINTERLACE_ALL && otherpad == self->srcpad)
-      self->field_duration =
-          gst_util_uint64_scale (GST_SECOND, self->fps_d, self->fps_n);
-    else
-      self->field_duration =
-          gst_util_uint64_scale (GST_SECOND, self->fps_d, 2 * self->fps_n);
+    self->field_duration =
+        gst_util_uint64_scale (GST_SECOND, self->fps_d, 2 * self->fps_n);
   } else {
     self->field_duration = 0;
   }
 
-  if (pad == self->sinkpad) {
-    gst_caps_replace (&self->sink_caps, caps);
-    gst_caps_replace (&self->src_caps, othercaps);
-  } else {
-    gst_caps_replace (&self->src_caps, caps);
-    gst_caps_replace (&self->sink_caps, othercaps);
-  }
-
   gst_deinterlace_set_method (self, self->method_id);
   gst_deinterlace_method_setup (self->method, self->format, self->width,
       self->height);
 
-  GST_DEBUG_OBJECT (pad, "Set caps: %" GST_PTR_FORMAT, caps);
-  GST_DEBUG_OBJECT (pad, "Other caps: %" GST_PTR_FORMAT, othercaps);
+  GST_DEBUG_OBJECT (pad, "Sink caps: %" GST_PTR_FORMAT, caps);
+  GST_DEBUG_OBJECT (pad, "Src  caps: %" GST_PTR_FORMAT, srccaps);
 
-  gst_caps_unref (othercaps);
+  gst_caps_unref (srccaps);
 
 done:
 
@@ -1474,8 +1453,8 @@ invalid_caps:
 
 caps_not_accepted:
   res = FALSE;
-  GST_ERROR_OBJECT (pad, "Caps not accepted: %" GST_PTR_FORMAT, othercaps);
-  gst_caps_unref (othercaps);
+  GST_ERROR_OBJECT (pad, "Caps not accepted: %" GST_PTR_FORMAT, srccaps);
+  gst_caps_unref (srccaps);
   goto done;
 }
 
index 6641da2..df996f8 100644 (file)
@@ -129,10 +129,6 @@ struct _GstDeinterlace
   gdouble proportion;
   GstClockTime earliest_time;
 
-  /* Upstream negotiation stuff */
-  GstCaps *sink_caps;
-  GstCaps *src_caps;
-
   GstCaps *request_caps;
 
   gboolean reconfigure;