summaryrefslogtreecommitdiffstats
path: root/gst/law
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@gmail.com>2008-08-25 09:48:06 +0000
committerWim Taymans <wim.taymans@gmail.com>2008-08-25 09:48:06 +0000
commitc0826dc21d0ee5c7119354fe1da9a499cef44905 (patch)
treeb6b49edeb69af322a87ed643478ad6644e8c7da5 /gst/law
parent4cefe7e94477e1b097638b30718b4f99640de7b3 (diff)
gst/law/: The encoder can't really renegotiate at the time they perform a pad-alloc so make the srcpads use fixed caps.
Original commit message from CVS: * 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.
Diffstat (limited to 'gst/law')
-rw-r--r--gst/law/alaw-encode.c17
-rw-r--r--gst/law/mulaw-conversion.c2
-rw-r--r--gst/law/mulaw-encode.c19
3 files changed, 26 insertions, 12 deletions
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 */