diff options
| -rw-r--r-- | ChangeLog | 12 | ||||
| -rw-r--r-- | gst/law/alaw-encode.c | 17 | ||||
| -rw-r--r-- | gst/law/mulaw-conversion.c | 2 | ||||
| -rw-r--r-- | gst/law/mulaw-encode.c | 19 | 
4 files changed, 38 insertions, 12 deletions
@@ -1,3 +1,15 @@ +2008-08-25  Wim Taymans  <wim.taymans@collabora.co.uk> + +	* gst/law/alaw-encode.c: (gst_alaw_enc_init), (gst_alaw_enc_chain): +	* gst/law/mulaw-conversion.c: +	* gst/law/mulaw-encode.c: (gst_mulawenc_init), +	(gst_mulawenc_chain): +	The encoder can't really renegotiate at the time they perform a +	pad-alloc so make the srcpads use fixed caps. +	Check the buffer size after a pad-alloc because the returned size might +	not be right when the downstream element does not know the size of the +	new buffer (capsfilter). Fixes #549073. +  2008-08-23  Sebastian Dröge  <sebastian.droege@collabora.co.uk>          Patch by: Filippo Argiolas <filippo dot argiolas at gmail dot com> diff --git a/gst/law/alaw-encode.c b/gst/law/alaw-encode.c index 215b6691..2585eb64 100644 --- a/gst/law/alaw-encode.c +++ b/gst/law/alaw-encode.c @@ -421,6 +421,7 @@ gst_alaw_enc_init (GstALawEnc * alawenc, GstALawEncClass * klass)        GST_DEBUG_FUNCPTR (gst_alaw_enc_setcaps));    gst_pad_set_getcaps_function (alawenc->srcpad,        GST_DEBUG_FUNCPTR (gst_alaw_enc_getcaps)); +  gst_pad_use_fixed_caps (alawenc->srcpad);    gst_element_add_pad (GST_ELEMENT (alawenc), alawenc->srcpad);    /* init rest */ @@ -457,11 +458,6 @@ gst_alaw_enc_chain (GstPad * pad, GstBuffer * buffer)    GST_LOG_OBJECT (alawenc, "buffer with ts=%" GST_TIME_FORMAT,        GST_TIME_ARGS (timestamp)); -  if (duration == GST_CLOCK_TIME_NONE) { -    duration = gst_util_uint64_scale_int (alaw_size, -        GST_SECOND, alawenc->rate * alawenc->channels); -  } -    ret =        gst_pad_alloc_buffer_and_set_caps (alawenc->srcpad,        GST_BUFFER_OFFSET_NONE, alaw_size, GST_PAD_CAPS (alawenc->srcpad), @@ -469,6 +465,17 @@ gst_alaw_enc_chain (GstPad * pad, GstBuffer * buffer)    if (ret != GST_FLOW_OK)      goto done; +  if (duration == GST_CLOCK_TIME_NONE) { +    duration = gst_util_uint64_scale_int (alaw_size, +        GST_SECOND, alawenc->rate * alawenc->channels); +  } + +  if (GST_BUFFER_SIZE (outbuf) < alaw_size) { +    /* pad-alloc can return a smaller buffer */ +    gst_buffer_unref (outbuf); +    outbuf = gst_buffer_new_and_alloc (alaw_size); +  } +    alaw_data = (guint8 *) GST_BUFFER_DATA (outbuf);    /* copy discont flag */ diff --git a/gst/law/mulaw-conversion.c b/gst/law/mulaw-conversion.c index 5cee8436..23e53a1d 100644 --- a/gst/law/mulaw-conversion.c +++ b/gst/law/mulaw-conversion.c @@ -25,7 +25,7 @@  #include <glib.h> -/* #define ZEROTRAP *//* turn on the trap as per the MIL-STD */ +#undef ZEROTRAP                 /* turn on the trap as per the MIL-STD */  #define BIAS 0x84               /* define the add-in bias for 16 bit samples */  #define CLIP 32635 diff --git a/gst/law/mulaw-encode.c b/gst/law/mulaw-encode.c index e926b992..033665e4 100644 --- a/gst/law/mulaw-encode.c +++ b/gst/law/mulaw-encode.c @@ -194,6 +194,7 @@ gst_mulawenc_init (GstMuLawEnc * mulawenc)    mulawenc->srcpad = gst_pad_new_from_template (mulawenc_src_template, "src");    gst_pad_set_setcaps_function (mulawenc->srcpad, mulawenc_setcaps);    gst_pad_set_getcaps_function (mulawenc->srcpad, mulawenc_getcaps); +  gst_pad_use_fixed_caps (mulawenc->srcpad);    gst_element_add_pad (GST_ELEMENT (mulawenc), mulawenc->srcpad);    /* init rest */ @@ -225,18 +226,24 @@ gst_mulawenc_chain (GstPad * pad, GstBuffer * buffer)    timestamp = GST_BUFFER_TIMESTAMP (buffer);    duration = GST_BUFFER_DURATION (buffer); -  if (duration == -1) { -    duration = gst_util_uint64_scale_int (mulaw_size, -        GST_SECOND, mulawenc->rate * mulawenc->channels); -  } -  ret = -      gst_pad_alloc_buffer_and_set_caps (mulawenc->srcpad, +  ret = gst_pad_alloc_buffer_and_set_caps (mulawenc->srcpad,        GST_BUFFER_OFFSET_NONE, mulaw_size, GST_PAD_CAPS (mulawenc->srcpad),        &outbuf);    if (ret != GST_FLOW_OK)      goto alloc_failed; +  if (duration == -1) { +    duration = gst_util_uint64_scale_int (mulaw_size, +        GST_SECOND, mulawenc->rate * mulawenc->channels); +  } + +  if (GST_BUFFER_SIZE (outbuf) < mulaw_size) { +    /* pad-alloc can suggest a smaller size */ +    gst_buffer_unref (outbuf); +    outbuf = gst_buffer_new_and_alloc (mulaw_size); +  } +    mulaw_data = (guint8 *) GST_BUFFER_DATA (outbuf);    /* copy discont flag */  | 
