diff options
| author | Tim-Philipp Müller <tim@centricular.net> | 2006-08-08 14:40:47 +0000 | 
|---|---|---|
| committer | Tim-Philipp Müller <tim@centricular.net> | 2006-08-08 14:40:47 +0000 | 
| commit | 7e522c28c2fb424db73bbc96292e6bf6b1e12c7c (patch) | |
| tree | 47a53deeba5a3f7f5b6bcdc1361ec09f9207f687 | |
| parent | 7fbf85ea547a9242837f24f3156c1cd8a5ec7004 (diff) | |
ext/jpeg/: Refuse sink caps in the encoder if width or height is not a multiple of 16, the encoder does not support t...
Original commit message from CVS:
* ext/jpeg/gstsmokedec.c: (gst_smokedec_chain):
* ext/jpeg/gstsmokeenc.c: (gst_smokeenc_setcaps),
(gst_smokeenc_resync), (gst_smokeenc_chain):
Refuse sink caps in the encoder if width or height is not a
multiple of 16, the encoder does not support that yet; along the
same lines, check the return value of the encoder setup function;
also remove some debug log clutter.
| -rw-r--r-- | ChangeLog | 10 | ||||
| -rw-r--r-- | ext/jpeg/gstsmokedec.c | 10 | ||||
| -rw-r--r-- | ext/jpeg/gstsmokeenc.c | 56 | 
3 files changed, 51 insertions, 25 deletions
@@ -1,3 +1,13 @@ +2006-08-08  Tim-Philipp Müller  <tim at centricular dot net> + +	* ext/jpeg/gstsmokedec.c: (gst_smokedec_chain): +	* ext/jpeg/gstsmokeenc.c: (gst_smokeenc_setcaps), +	(gst_smokeenc_resync), (gst_smokeenc_chain): +	  Refuse sink caps in the encoder if width or height is not a +	  multiple of 16, the encoder does not support that yet; along the +	  same lines, check the return value of the encoder setup function; +	  also remove some debug log clutter. +  2006-08-04  Andy Wingo  <wingo@pobox.com>  	* ext/ladspa/gstsignalprocessor.h: Add infrastructure for storing diff --git a/ext/jpeg/gstsmokedec.c b/ext/jpeg/gstsmokedec.c index 133763ee..c1958178 100644 --- a/ext/jpeg/gstsmokedec.c +++ b/ext/jpeg/gstsmokedec.c @@ -171,9 +171,7 @@ gst_smokedec_chain (GstPad * pad, GstBuffer * buf)    size = GST_BUFFER_SIZE (buf);    time = GST_BUFFER_TIMESTAMP (buf); -  GST_DEBUG_OBJECT (smokedec, -      "gst_smokedec_chain: got buffer of %ld bytes in '%s'", size, -      GST_OBJECT_NAME (smokedec)); +  GST_LOG_OBJECT (smokedec, "got buffer of %u bytes", size);    /* have the ID packet. */    if (data[0] == SMOKECODEC_TYPE_ID) { @@ -186,8 +184,7 @@ gst_smokedec_chain (GstPad * pad, GstBuffer * buf)    }    /* now handle data packets */ -  GST_DEBUG_OBJECT (smokedec, "gst_smokedec_chain: reading header %08lx", -      *(gulong *) data); +  GST_DEBUG_OBJECT (smokedec, "reading header %08lx", *(gulong *) data);    smokecodec_parse_header (smokedec->info, data, size, &flags, &width, &height,        &fps_num, &fps_denom); @@ -195,6 +192,9 @@ gst_smokedec_chain (GstPad * pad, GstBuffer * buf)        smokedec->fps_num != fps_num || smokedec->fps_denom != fps_denom) {      GstCaps *caps; +    GST_DEBUG_OBJECT (smokedec, "parameter change: %dx%d @ %d/%dfps", +        width, height, fps_num, fps_denom); +      smokedec->height = height;      smokedec->width = width; diff --git a/ext/jpeg/gstsmokeenc.c b/ext/jpeg/gstsmokeenc.c index 42c0b021..7cadd985 100644 --- a/ext/jpeg/gstsmokeenc.c +++ b/ext/jpeg/gstsmokeenc.c @@ -67,7 +67,7 @@ static GstFlowReturn gst_smokeenc_chain (GstPad * pad, GstBuffer * buf);  static gboolean gst_smokeenc_setcaps (GstPad * pad, GstCaps * caps);  static GstCaps *gst_smokeenc_getcaps (GstPad * pad); -static void gst_smokeenc_resync (GstSmokeEnc * smokeenc); +static gboolean gst_smokeenc_resync (GstSmokeEnc * smokeenc);  static void gst_smokeenc_set_property (GObject * object, guint prop_id,      const GValue * value, GParamSpec * pspec);  static void gst_smokeenc_get_property (GObject * object, guint prop_id, @@ -255,6 +255,9 @@ gst_smokeenc_setcaps (GstPad * pad, GstCaps * caps)    gst_structure_get_int (structure, "width", &smokeenc->width);    gst_structure_get_int (structure, "height", &smokeenc->height); +  if ((smokeenc->width & 0x0f) != 0 || (smokeenc->height & 0x0f) != 0) +    goto width_or_height_notx16; +    othercaps = gst_caps_copy (gst_pad_get_pad_template_caps (otherpad));    gst_caps_set_simple (othercaps, @@ -267,26 +270,42 @@ gst_smokeenc_setcaps (GstPad * pad, GstCaps * caps)    ret = gst_pad_set_caps (otherpad, othercaps);    gst_caps_unref (othercaps); -  if (GST_PAD_LINK_SUCCESSFUL (ret)) { -    gst_smokeenc_resync (smokeenc); +  if (ret) { +    ret = gst_smokeenc_resync (smokeenc);    }    gst_object_unref (smokeenc);    return ret; + +width_or_height_notx16: +  { +    GST_WARNING_OBJECT (smokeenc, "width and height must be multiples of 16" +        ", %dx%d not allowed", smokeenc->width, smokeenc->height); +    return FALSE; +  }  } -static void +static gboolean  gst_smokeenc_resync (GstSmokeEnc * smokeenc)  { -  GST_DEBUG ("gst_smokeenc_resync: resync"); +  int ret; -  smokecodec_encode_new (&smokeenc->info, smokeenc->width, smokeenc->height, +  GST_DEBUG ("resync: %dx%d@%d/%dfps", smokeenc->width, smokeenc->height,        smokeenc->fps_num, smokeenc->fps_denom); + +  ret = smokecodec_encode_new (&smokeenc->info, smokeenc->width, +      smokeenc->height, smokeenc->fps_num, smokeenc->fps_denom); +  if (ret != SMOKECODEC_OK) { +    GST_WARNING_OBJECT (smokeenc, "smokecodec_encode_new() failed: %d", ret); +    return FALSE; +  } +    smokecodec_set_quality (smokeenc->info, smokeenc->min_quality,        smokeenc->max_quality); -  GST_DEBUG ("gst_smokeenc_resync: resync done"); +  GST_DEBUG ("resync done"); +  return TRUE;  }  static GstFlowReturn @@ -300,31 +319,27 @@ gst_smokeenc_chain (GstPad * pad, GstBuffer * buf)    GstBuffer *outbuf;    SmokeCodecFlags flags;    GstFlowReturn ret; -  GstCaps *caps;    smokeenc = GST_SMOKEENC (GST_OBJECT_PARENT (pad));    data = GST_BUFFER_DATA (buf);    size = GST_BUFFER_SIZE (buf); -  GST_DEBUG ("gst_smokeenc_chain: got buffer of %ld bytes in '%s'", size, -      GST_OBJECT_NAME (smokeenc)); +  GST_LOG_OBJECT (smokeenc, "got buffer of %u bytes", size);    if (smokeenc->need_header) { -    outbuf = gst_buffer_new (); -    outsize = 256; -    outdata = g_malloc (outsize); -    GST_BUFFER_DATA (outbuf) = outdata; -    GST_BUFFER_MALLOCDATA (outbuf) = outdata; +    outbuf = gst_buffer_new_and_alloc (256); +    gst_buffer_set_caps (outbuf, GST_PAD_CAPS (smokeenc->srcpad));      GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf);      GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buf); -    caps = GST_PAD_CAPS (smokeenc->srcpad); -    gst_buffer_set_caps (outbuf, caps); -    smokecodec_encode_id (smokeenc->info, outdata, &encsize); + +    smokecodec_encode_id (smokeenc->info, GST_BUFFER_DATA (outbuf), &encsize);      GST_BUFFER_SIZE (outbuf) = encsize;      ret = gst_pad_push (smokeenc->srcpad, outbuf); +    if (ret != GST_FLOW_OK) +      goto done;      smokeenc->need_header = FALSE;    } @@ -337,8 +352,7 @@ gst_smokeenc_chain (GstPad * pad, GstBuffer * buf)    GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf);    GST_BUFFER_DURATION (outbuf) =        smokeenc->fps_denom * GST_SECOND / smokeenc->fps_num; -  caps = GST_PAD_CAPS (smokeenc->srcpad); -  gst_buffer_set_caps (outbuf, caps); +  gst_buffer_set_caps (outbuf, GST_PAD_CAPS (smokeenc->srcpad));    flags = 0;    if ((smokeenc->frame % smokeenc->keyframe) == 0) { @@ -358,6 +372,8 @@ gst_smokeenc_chain (GstPad * pad, GstBuffer * buf)    smokeenc->frame++; +done: +    return ret;  }  | 
