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_DEBUG_FUNCPTR (gst_deinterlace_src_query));
gst_pad_set_getcaps_function (self->srcpad, gst_pad_set_getcaps_function (self->srcpad,
GST_DEBUG_FUNCPTR (gst_deinterlace_getcaps)); 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); gst_element_add_pad (GST_ELEMENT (self), self->srcpad);
self->mode = DEFAULT_MODE; self->mode = DEFAULT_MODE;
@ -645,14 +643,6 @@ gst_deinterlace_reset (GstDeinterlace * self)
gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED); 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) if (self->request_caps)
gst_caps_unref (self->request_caps); gst_caps_unref (self->request_caps);
self->request_caps = NULL; self->request_caps = NULL;
@ -1002,13 +992,15 @@ gst_deinterlace_output_frame (GstDeinterlace * self, gboolean flushing)
GST_DEBUG_OBJECT (self, "deinterlacing top field"); GST_DEBUG_OBJECT (self, "deinterlacing top field");
/* create new buffer */ /* create new buffer */
ret = gst_pad_alloc_buffer (self->srcpad, ret =
GST_BUFFER_OFFSET_NONE, self->frame_size, self->src_caps, &outbuf); gst_pad_alloc_buffer (self->srcpad, GST_BUFFER_OFFSET_NONE,
self->frame_size, GST_PAD_CAPS (self->srcpad), &outbuf);
if (ret != GST_FLOW_OK) if (ret != GST_FLOW_OK)
return ret; return ret;
if (self->src_caps != GST_BUFFER_CAPS (outbuf) && if (GST_PAD_CAPS (self->srcpad) != GST_BUFFER_CAPS (outbuf)
!gst_caps_is_equal (self->src_caps, 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_caps_replace (&self->request_caps, GST_BUFFER_CAPS (outbuf));
GST_DEBUG_OBJECT (self, "Upstream wants new caps %" GST_PTR_FORMAT, GST_DEBUG_OBJECT (self, "Upstream wants new caps %" GST_PTR_FORMAT,
self->request_caps); self->request_caps);
@ -1019,7 +1011,7 @@ gst_deinterlace_output_frame (GstDeinterlace * self, gboolean flushing)
if (!outbuf) if (!outbuf)
return GST_FLOW_ERROR; 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 - 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"); GST_DEBUG_OBJECT (self, "deinterlacing bottom field");
/* create new buffer */ /* create new buffer */
ret = gst_pad_alloc_buffer (self->srcpad, ret =
GST_BUFFER_OFFSET_NONE, self->frame_size, self->src_caps, &outbuf); gst_pad_alloc_buffer (self->srcpad, GST_BUFFER_OFFSET_NONE,
self->frame_size, GST_PAD_CAPS (self->srcpad), &outbuf);
if (ret != GST_FLOW_OK) if (ret != GST_FLOW_OK)
return ret; return ret;
if (self->src_caps != GST_BUFFER_CAPS (outbuf) && if (GST_PAD_CAPS (self->srcpad) != GST_BUFFER_CAPS (outbuf)
!gst_caps_is_equal (self->src_caps, 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_caps_replace (&self->request_caps, GST_BUFFER_CAPS (outbuf));
GST_DEBUG_OBJECT (self, "Upstream wants new caps %" GST_PTR_FORMAT, GST_DEBUG_OBJECT (self, "Upstream wants new caps %" GST_PTR_FORMAT,
self->request_caps); self->request_caps);
@ -1097,7 +1091,7 @@ gst_deinterlace_output_frame (GstDeinterlace * self, gboolean flushing)
if (!outbuf) if (!outbuf)
return GST_FLOW_ERROR; 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 - g_return_val_if_fail (self->history_count - 1 -
@ -1391,10 +1385,7 @@ gst_deinterlace_setcaps (GstPad * pad, GstCaps * caps)
{ {
gboolean res = TRUE; gboolean res = TRUE;
GstDeinterlace *self = GST_DEINTERLACE (gst_pad_get_parent (pad)); GstDeinterlace *self = GST_DEINTERLACE (gst_pad_get_parent (pad));
GstPad *otherpad; GstCaps *srccaps;
GstCaps *othercaps;
otherpad = (pad == self->srcpad) ? self->sinkpad : self->srcpad;
res = res =
gst_video_format_parse_caps (caps, &self->format, &self->width, 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) { if (!self->passthrough && self->fields == GST_DEINTERLACE_ALL) {
gint fps_n = self->fps_n, fps_d = self->fps_d; 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; 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); fps_d, NULL);
} else { } else {
othercaps = gst_caps_ref (caps); srccaps = gst_caps_ref (caps);
} }
if (otherpad == self->srcpad && self->mode != GST_DEINTERLACE_MODE_DISABLED) { if (self->mode != GST_DEINTERLACE_MODE_DISABLED) {
othercaps = gst_caps_make_writable (othercaps); srccaps = gst_caps_make_writable (srccaps);
gst_caps_set_simple (othercaps, "interlaced", G_TYPE_BOOLEAN, FALSE, NULL); gst_caps_set_simple (srccaps, "interlaced", G_TYPE_BOOLEAN, FALSE, NULL);
} }
gst_deinterlace_reset_history (self, FALSE); 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; goto caps_not_accepted;
self->frame_size = self->frame_size =
gst_video_format_get_size (self->format, self->width, self->height); gst_video_format_get_size (self->format, self->width, self->height);
if (G_LIKELY (self->fps_n != 0)) { 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 = self->field_duration =
gst_util_uint64_scale (GST_SECOND, self->fps_d, 2 * self->fps_n); gst_util_uint64_scale (GST_SECOND, self->fps_d, 2 * self->fps_n);
} else { } else {
self->field_duration = 0; 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_set_method (self, self->method_id);
gst_deinterlace_method_setup (self->method, self->format, self->width, gst_deinterlace_method_setup (self->method, self->format, self->width,
self->height); self->height);
GST_DEBUG_OBJECT (pad, "Set caps: %" GST_PTR_FORMAT, caps); GST_DEBUG_OBJECT (pad, "Sink caps: %" GST_PTR_FORMAT, caps);
GST_DEBUG_OBJECT (pad, "Other caps: %" GST_PTR_FORMAT, othercaps); GST_DEBUG_OBJECT (pad, "Src caps: %" GST_PTR_FORMAT, srccaps);
gst_caps_unref (othercaps); gst_caps_unref (srccaps);
done: done:
@ -1474,8 +1453,8 @@ invalid_caps:
caps_not_accepted: caps_not_accepted:
res = FALSE; res = FALSE;
GST_ERROR_OBJECT (pad, "Caps not accepted: %" GST_PTR_FORMAT, othercaps); GST_ERROR_OBJECT (pad, "Caps not accepted: %" GST_PTR_FORMAT, srccaps);
gst_caps_unref (othercaps); gst_caps_unref (srccaps);
goto done; goto done;
} }

View file

@ -129,10 +129,6 @@ struct _GstDeinterlace
gdouble proportion; gdouble proportion;
GstClockTime earliest_time; GstClockTime earliest_time;
/* Upstream negotiation stuff */
GstCaps *sink_caps;
GstCaps *src_caps;
GstCaps *request_caps; GstCaps *request_caps;
gboolean reconfigure; gboolean reconfigure;