deinterlace: implement accept-caps
authorThiago Santos <thiagoss@osg.samsung.com>
Mon, 19 Oct 2015 20:50:28 +0000 (17:50 -0300)
committerThiago Santos <thiagoss@osg.samsung.com>
Sun, 25 Oct 2015 14:01:45 +0000 (11:01 -0300)
Implement accept-caps handler to avoid doing a full caps query
downstream to handle it.

This commit implements accept-caps as a simplification of the _getcaps
function, so it exposes the same limitations that getcaps would.
For example, not accepting renegotiation to caps with capsfeatures when
it was last configured to a caps that it has to deinterlace.

gst/deinterlace/gstdeinterlace.c

index 0c46a42..e4aeafa 100644 (file)
@@ -2123,6 +2123,32 @@ gst_fraction_double (gint * n_out, gint * d_out, gboolean half)
   return TRUE;
 }
 
+static gboolean
+gst_deinterlace_acceptcaps (GstDeinterlace * self, GstPad * pad, GstCaps * caps)
+{
+  gboolean ret;
+  GstCaps *ourcaps;
+  GstVideoInterlaceMode interlacing_mode;
+
+  interlacing_mode = GST_VIDEO_INFO_INTERLACE_MODE (&self->vinfo);
+
+  if (self->mode == GST_DEINTERLACE_MODE_INTERLACED ||
+      (self->mode == GST_DEINTERLACE_MODE_AUTO &&
+          interlacing_mode != GST_VIDEO_INTERLACE_MODE_PROGRESSIVE)) {
+    ourcaps = gst_caps_from_string (DEINTERLACE_CAPS);
+  } else {
+    ourcaps = gst_pad_get_pad_template_caps (pad);
+  }
+
+  ret = gst_caps_can_intersect (caps, ourcaps);
+  gst_caps_unref (ourcaps);
+
+  GST_DEBUG_OBJECT (pad, "accept-caps result:%d for caps %" GST_PTR_FORMAT,
+      ret, caps);
+
+  return ret;
+}
+
 static GstCaps *
 gst_deinterlace_getcaps (GstDeinterlace * self, GstPad * pad, GstCaps * filter)
 {
@@ -2675,6 +2701,17 @@ gst_deinterlace_sink_query (GstPad * pad, GstObject * parent, GstQuery * query)
       res = TRUE;
       break;
     }
+    case GST_QUERY_ACCEPT_CAPS:
+    {
+      GstCaps *caps;
+      gboolean ret;
+
+      gst_query_parse_accept_caps (query, &caps);
+      ret = gst_deinterlace_acceptcaps (self, pad, caps);
+      gst_query_set_accept_caps_result (query, ret);
+      res = TRUE;
+      break;
+    }
     case GST_QUERY_ALLOCATION:
       if (self->passthrough)
         res = gst_pad_peer_query (self->srcpad, query);