From 3fa17e67a45c2362e741dfa0047388035e1f589f Mon Sep 17 00:00:00 2001 From: Sebastian Dröge Date: Tue, 2 Sep 2008 08:51:04 +0000 Subject: ext/speex/: Use integer encoding and decoding functions instead of converting the integer input to float in the eleme... Original commit message from CVS: * ext/speex/gstspeexdec.c: (speex_dec_chain_parse_data): * ext/speex/gstspeexdec.h: * ext/speex/gstspeexenc.c: (gst_speex_enc_encode): * ext/speex/gstspeexenc.h: Use integer encoding and decoding functions instead of converting the integer input to float in the element. The libspeex integer functions are doing this for us already or, if libspeex was compiled in integer mode, they're doing everything using integer arithmetics. Also saves some copying around. --- ext/speex/gstspeexdec.c | 44 ++++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 24 deletions(-) (limited to 'ext/speex/gstspeexdec.c') diff --git a/ext/speex/gstspeexdec.c b/ext/speex/gstspeexdec.c index a3881451..0987d865 100644 --- a/ext/speex/gstspeexdec.c +++ b/ext/speex/gstspeexdec.c @@ -685,47 +685,43 @@ speex_dec_chain_parse_data (GstSpeexDec * dec, GstBuffer * buf, for (i = 0; i < fpp; i++) { GstBuffer *outbuf; gint16 *out_data; - gint ret, j; + gint ret; GST_LOG_OBJECT (dec, "decoding frame %d/%d", i, fpp); - ret = speex_decode (dec->state, bits, dec->output); + res = gst_pad_alloc_buffer_and_set_caps (dec->srcpad, + GST_BUFFER_OFFSET_NONE, dec->frame_size * dec->header->nb_channels * 2, + GST_PAD_CAPS (dec->srcpad), &outbuf); + + if (res != GST_FLOW_OK) { + GST_DEBUG_OBJECT (dec, "buf alloc flow: %s", gst_flow_get_name (res)); + return res; + } + + out_data = (gint16 *) GST_BUFFER_DATA (outbuf); + + ret = speex_decode_int (dec->state, bits, out_data); if (ret == -1) { /* uh? end of stream */ GST_WARNING_OBJECT (dec, "Unexpected end of stream found"); + gst_buffer_unref (outbuf); + outbuf = NULL; break; } else if (ret == -2) { GST_WARNING_OBJECT (dec, "Decoding error: corrupted stream?"); + gst_buffer_unref (outbuf); + outbuf = NULL; break; } if (bits && speex_bits_remaining (bits) < 0) { GST_WARNING_OBJECT (dec, "Decoding overflow: corrupted stream?"); + gst_buffer_unref (outbuf); + outbuf = NULL; break; } if (dec->header->nb_channels == 2) - speex_decode_stereo (dec->output, dec->frame_size, &dec->stereo); - - res = gst_pad_alloc_buffer_and_set_caps (dec->srcpad, - GST_BUFFER_OFFSET_NONE, dec->frame_size * dec->header->nb_channels * 2, - GST_PAD_CAPS (dec->srcpad), &outbuf); - - if (res != GST_FLOW_OK) { - GST_DEBUG_OBJECT (dec, "buf alloc flow: %s", gst_flow_get_name (res)); - return res; - } - - out_data = (gint16 *) GST_BUFFER_DATA (outbuf); - - /*PCM saturation (just in case) */ - for (j = 0; j < dec->frame_size * dec->header->nb_channels; j++) { - if (dec->output[j] > 32767.0) - out_data[j] = 32767; - else if (dec->output[i] < -32768.0) - out_data[j] = -32768; - else - out_data[j] = (gint16) dec->output[j]; - } + speex_decode_stereo_int (out_data, dec->frame_size, &dec->stereo); if (dec->granulepos == -1) { if (dec->segment.format != GST_FORMAT_TIME) { -- cgit