From f3122f2b3071ed8b5b3907096f22b7a06ae40dc3 Mon Sep 17 00:00:00 2001 From: Stefan Kost Date: Mon, 1 Feb 2010 17:46:29 +0200 Subject: [PATCH] jpegparse: provide a getcaps function for src pad and improve setcaps Previously jpegparse was failing in decodebin as the caps we were setting where not setting all caps fields. We need the own getcaps function to report what we actualy accept. --- gst/jpegformat/gstjpegparse.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/gst/jpegformat/gstjpegparse.c b/gst/jpegformat/gstjpegparse.c index 252d695122..b381b3054b 100644 --- a/gst/jpegformat/gstjpegparse.c +++ b/gst/jpegformat/gstjpegparse.c @@ -113,6 +113,7 @@ static void gst_jpeg_parse_dispose (GObject * object); static GstFlowReturn gst_jpeg_parse_chain (GstPad * pad, GstBuffer * buffer); static gboolean gst_jpeg_parse_sink_setcaps (GstPad * pad, GstCaps * caps); static gboolean gst_jpeg_parse_sink_event (GstPad * pad, GstEvent * event); +static GstCaps *gst_jpeg_parse_src_getcaps (GstPad * pad); static GstStateChangeReturn gst_jpeg_parse_change_state (GstElement * element, GstStateChange transition); @@ -176,6 +177,8 @@ gst_jpeg_parse_init (GstJpegParse * parse, GstJpegParseClass * g_class) parse->priv->srcpad = gst_pad_new_from_static_template (&gst_jpeg_parse_src_pad_template, "src"); + gst_pad_set_getcaps_function (parse->priv->srcpad, + GST_DEBUG_FUNCPTR (gst_jpeg_parse_src_getcaps)); gst_element_add_pad (GST_ELEMENT (parse), parse->priv->srcpad); parse->priv->next_ts = GST_CLOCK_TIME_NONE; @@ -219,6 +222,21 @@ gst_jpeg_parse_sink_setcaps (GstPad * pad, GstCaps * caps) return TRUE; } +static GstCaps * +gst_jpeg_parse_src_getcaps (GstPad * pad) +{ + GstCaps *result; + + if ((result = GST_PAD_CAPS (pad))) { + result = gst_caps_ref (result); + GST_DEBUG_OBJECT (pad, "using pad caps %" GST_PTR_FORMAT, result); + } else { + result = gst_caps_ref (GST_PAD_TEMPLATE_CAPS (GST_PAD_PAD_TEMPLATE (pad))); + GST_DEBUG_OBJECT (pad, "using pad template caps %" GST_PTR_FORMAT, result); + } + return result; +} + /* * gst_jpeg_parse_skip_to_jpeg_header: * @parse: the parser @@ -604,6 +622,7 @@ gst_jpeg_parse_set_new_caps (GstJpegParse * parse, gboolean header_ok) } else { /* unknown duration */ parse->priv->duration = GST_CLOCK_TIME_NONE; + gst_caps_set_simple (caps, "framerate", GST_TYPE_FRACTION, 1, 1, NULL); } GST_DEBUG_OBJECT (parse, @@ -611,7 +630,6 @@ gst_jpeg_parse_set_new_caps (GstJpegParse * parse, gboolean header_ok) GST_DEBUG_PAD_NAME (parse->priv->srcpad), caps); res = gst_pad_set_caps (parse->priv->srcpad, caps); gst_caps_unref (caps); - gst_pad_use_fixed_caps (parse->priv->srcpad); return res;