From 27c3f9c03e1d0290dfd6e185b75acdf463bdb7b2 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Sun, 30 Sep 2012 22:14:10 -0400 Subject: libspeexdec: set channel_layout --- libavcodec/libspeexdec.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'libavcodec/libspeexdec.c') diff --git a/libavcodec/libspeexdec.c b/libavcodec/libspeexdec.c index b9d9149ee2..21c9d05428 100644 --- a/libavcodec/libspeexdec.c +++ b/libavcodec/libspeexdec.c @@ -22,8 +22,10 @@ #include #include #include -#include "avcodec.h" + +#include "libavutil/audioconvert.h" #include "libavutil/common.h" +#include "avcodec.h" typedef struct { AVFrame frame; @@ -76,6 +78,8 @@ static av_cold int libspeex_decode_init(AVCodecContext *avctx) "Decoding as stereo.\n", avctx->channels); avctx->channels = 2; } + avctx->channel_layout = avctx->channels == 2 ? AV_CH_LAYOUT_STEREO : + AV_CH_LAYOUT_MONO; speex_bits_init(&s->bits); s->dec_state = speex_decoder_init(mode); -- cgit v1.2.1 From 892695c851a427beef314841ea54b01be40dd0e8 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Sun, 30 Sep 2012 22:45:55 -0400 Subject: libspeexdec: simplify setting of frame_size --- libavcodec/libspeexdec.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) (limited to 'libavcodec/libspeexdec.c') diff --git a/libavcodec/libspeexdec.c b/libavcodec/libspeexdec.c index 21c9d05428..d1180931d5 100644 --- a/libavcodec/libspeexdec.c +++ b/libavcodec/libspeexdec.c @@ -49,7 +49,6 @@ static av_cold int libspeex_decode_init(AVCodecContext *avctx) avctx->sample_fmt = AV_SAMPLE_FMT_S16; if (s->header) { avctx->channels = s->header->nb_channels; - s->frame_size = s->header->frame_size; spx_mode = s->header->mode; } else { switch (avctx->sample_rate) { @@ -71,6 +70,7 @@ static av_cold int libspeex_decode_init(AVCodecContext *avctx) return AVERROR_INVALIDDATA; } avctx->sample_rate = 8000 << spx_mode; + s->frame_size = 160 << spx_mode; if (avctx->channels < 1 || avctx->channels > 2) { /* libspeex can handle mono or stereo if initialized as stereo */ @@ -88,10 +88,6 @@ static av_cold int libspeex_decode_init(AVCodecContext *avctx) return -1; } - if (!s->header) { - speex_decoder_ctl(s->dec_state, SPEEX_GET_FRAME_SIZE, &s->frame_size); - } - if (avctx->channels == 2) { SpeexCallback callback; callback.callback_id = SPEEX_INBAND_STEREO; -- cgit v1.2.1 From 908e22b93a9532948d62e43b700d5c91ea37db2a Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Sun, 30 Sep 2012 23:09:19 -0400 Subject: libspeexdec: move the SpeexHeader from LibSpeexContext to where it is used --- libavcodec/libspeexdec.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) (limited to 'libavcodec/libspeexdec.c') diff --git a/libavcodec/libspeexdec.c b/libavcodec/libspeexdec.c index d1180931d5..1916fea2d1 100644 --- a/libavcodec/libspeexdec.c +++ b/libavcodec/libspeexdec.c @@ -32,7 +32,6 @@ typedef struct { SpeexBits bits; SpeexStereoState stereo; void *dec_state; - SpeexHeader *header; int frame_size; } LibSpeexContext; @@ -43,13 +42,13 @@ static av_cold int libspeex_decode_init(AVCodecContext *avctx) const SpeexMode *mode; int spx_mode; - if (avctx->extradata_size >= 80) - s->header = speex_packet_to_header(avctx->extradata, avctx->extradata_size); - avctx->sample_fmt = AV_SAMPLE_FMT_S16; - if (s->header) { - avctx->channels = s->header->nb_channels; - spx_mode = s->header->mode; + if (avctx->extradata && avctx->extradata_size >= 80) { + SpeexHeader *header = speex_packet_to_header(avctx->extradata, + avctx->extradata_size); + avctx->channels = header->nb_channels; + spx_mode = header->mode; + speex_header_free(header); } else { switch (avctx->sample_rate) { case 8000: spx_mode = 0; break; @@ -153,7 +152,6 @@ static av_cold int libspeex_decode_close(AVCodecContext *avctx) { LibSpeexContext *s = avctx->priv_data; - speex_header_free(s->header); speex_bits_destroy(&s->bits); speex_decoder_destroy(s->dec_state); -- cgit v1.2.1 From 45e5d0c3ac0d144cf4dc7fb3d852ee05814bbd2b Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Sun, 30 Sep 2012 23:11:43 -0400 Subject: libspeexdec: properly handle DTX for multiple frames-per-packet --- libavcodec/libspeexdec.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'libavcodec/libspeexdec.c') diff --git a/libavcodec/libspeexdec.c b/libavcodec/libspeexdec.c index 1916fea2d1..760bfe2e49 100644 --- a/libavcodec/libspeexdec.c +++ b/libavcodec/libspeexdec.c @@ -119,10 +119,12 @@ static int libspeex_decode_frame(AVCodecContext *avctx, void *data, } output = (int16_t *)s->frame.data[0]; - /* if there is not enough data left for the smallest possible frame, - reset the libspeex buffer using the current packet, otherwise ignore - the current packet and keep decoding frames from the libspeex buffer. */ - if (speex_bits_remaining(&s->bits) < 43) { + /* if there is not enough data left for the smallest possible frame or the + next 5 bits are a terminator code, reset the libspeex buffer using the + current packet, otherwise ignore the current packet and keep decoding + frames from the libspeex buffer. */ + if (speex_bits_remaining(&s->bits) < 5 || + speex_bits_peek_unsigned(&s->bits, 5) == 0x1F) { /* check for flush packet */ if (!buf || !buf_size) { *got_frame_ptr = 0; -- cgit v1.2.1 From c9df48909e03031aeb90facf9f307f3103691792 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Wed, 3 Oct 2012 17:26:16 -0400 Subject: libspeexdec: handle NULL return value from speex_packet_to_header() This will happen when the extradata is not a valid Speex header. --- libavcodec/libspeexdec.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'libavcodec/libspeexdec.c') diff --git a/libavcodec/libspeexdec.c b/libavcodec/libspeexdec.c index 760bfe2e49..0c93f05a1b 100644 --- a/libavcodec/libspeexdec.c +++ b/libavcodec/libspeexdec.c @@ -40,12 +40,17 @@ static av_cold int libspeex_decode_init(AVCodecContext *avctx) { LibSpeexContext *s = avctx->priv_data; const SpeexMode *mode; + SpeexHeader *header = NULL; int spx_mode; avctx->sample_fmt = AV_SAMPLE_FMT_S16; if (avctx->extradata && avctx->extradata_size >= 80) { - SpeexHeader *header = speex_packet_to_header(avctx->extradata, - avctx->extradata_size); + header = speex_packet_to_header(avctx->extradata, + avctx->extradata_size); + if (!header) + av_log(avctx, AV_LOG_WARNING, "Invalid Speex header\n"); + } + if (header) { avctx->channels = header->nb_channels; spx_mode = header->mode; speex_header_free(header); -- cgit v1.2.1