deinterlace: Simplify setcaps

The current code never uses upstream negotiation so the code can be
significantly simplified.
This commit is contained in:
Robert Swain 2010-11-08 14:25:59 +01:00
parent 6402556157
commit 6607cdcc08
2 changed files with 30 additions and 55 deletions

View 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;
}

View 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;