diff --git a/ChangeLog b/ChangeLog index 984f9cd319..448dc191ec 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2008-08-25 Wim Taymans + + * 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 Patch by: Filippo Argiolas diff --git a/gst/law/alaw-encode.c b/gst/law/alaw-encode.c index 215b6691f3..2585eb64f5 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 5cee843640..23e53a1d41 100644 --- a/gst/law/mulaw-conversion.c +++ b/gst/law/mulaw-conversion.c @@ -25,7 +25,7 @@ #include -/* #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 e926b9925b..033665e4df 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,17 +226,23 @@ gst_mulawenc_chain (GstPad * pad, GstBuffer * buffer) timestamp = GST_BUFFER_TIMESTAMP (buffer); duration = GST_BUFFER_DURATION (buffer); + + 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); } - 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 (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);