summaryrefslogtreecommitdiff
path: root/ext/speex
diff options
context:
space:
mode:
authorSebastian Dröge <slomo@circular-chaos.org>2008-09-02 08:51:04 +0000
committerSebastian Dröge <slomo@circular-chaos.org>2008-09-02 08:51:04 +0000
commit3fa17e67a45c2362e741dfa0047388035e1f589f (patch)
tree3e4f97795d8b95ad869af013d1d2c8d6ea6057fe /ext/speex
parent1ebf38c9592572c2cea05cc0a06644f558c0139b (diff)
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.
Diffstat (limited to 'ext/speex')
-rw-r--r--ext/speex/gstspeexdec.c44
-rw-r--r--ext/speex/gstspeexdec.h2
-rw-r--r--ext/speex/gstspeexenc.c14
-rw-r--r--ext/speex/gstspeexenc.h2
4 files changed, 25 insertions, 37 deletions
diff --git a/ext/speex/gstspeexdec.c b/ext/speex/gstspeexdec.c
index a38814519..0987d865e 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) {
diff --git a/ext/speex/gstspeexdec.h b/ext/speex/gstspeexdec.h
index 18ba8d5bb..0d95171ab 100644
--- a/ext/speex/gstspeexdec.h
+++ b/ext/speex/gstspeexdec.h
@@ -63,8 +63,6 @@ struct _GstSpeexDec {
SpeexCallback callback;
SpeexBits bits;
- gfloat output[DEC_MAX_FRAME_SIZE];
-
gboolean enh;
gint frame_size;
diff --git a/ext/speex/gstspeexenc.c b/ext/speex/gstspeexenc.c
index a7059edf2..963d56070 100644
--- a/ext/speex/gstspeexenc.c
+++ b/ext/speex/gstspeexenc.c
@@ -867,25 +867,21 @@ gst_speex_enc_encode (GstSpeexEnc * enc, gboolean flush)
while (gst_adapter_available (enc->adapter) >= bytes) {
gint16 *data;
- gint i;
gint outsize, written;
GstBuffer *outbuf;
- data = (gint16 *) gst_adapter_peek (enc->adapter, bytes);
-
- for (i = 0; i < frame_size * enc->channels; i++) {
- enc->input[i] = (gfloat) data[i];
- }
- gst_adapter_flush (enc->adapter, bytes);
+ data = (gint16 *) gst_adapter_take (enc->adapter, bytes);
enc->samples_in += frame_size;
GST_DEBUG_OBJECT (enc, "encoding %d samples (%d bytes)", frame_size, bytes);
if (enc->channels == 2) {
- speex_encode_stereo (enc->input, frame_size, &enc->bits);
+ speex_encode_stereo_int (data, frame_size, &enc->bits);
}
- speex_encode (enc->state, enc->input, &enc->bits);
+ speex_encode_int (enc->state, data, &enc->bits);
+
+ g_free (data);
enc->frameno++;
enc->frameno_out++;
diff --git a/ext/speex/gstspeexenc.h b/ext/speex/gstspeexenc.h
index a5bfb3660..99e0086b2 100644
--- a/ext/speex/gstspeexenc.h
+++ b/ext/speex/gstspeexenc.h
@@ -107,8 +107,6 @@ struct _GstSpeexEnc {
guint8 *comments;
gint comment_len;
- gfloat input[MAX_FRAME_SIZE];
-
/* Timestamp and granulepos tracking */
GstClockTime start_ts;
GstClockTime next_ts;