diff options
Diffstat (limited to 'libavcodec/nellymoserdec.c')
-rw-r--r-- | libavcodec/nellymoserdec.c | 36 |
1 files changed, 21 insertions, 15 deletions
diff --git a/libavcodec/nellymoserdec.c b/libavcodec/nellymoserdec.c index 8d9af5f..b0deb79 100644 --- a/libavcodec/nellymoserdec.c +++ b/libavcodec/nellymoserdec.c @@ -38,8 +38,8 @@ #define BITSTREAM_READER_LE #include "avcodec.h" -#include "bitstream.h" #include "fft.h" +#include "get_bits.h" #include "internal.h" #include "nellymoser.h" #include "sinewin.h" @@ -48,9 +48,9 @@ typedef struct NellyMoserDecodeContext { AVCodecContext* avctx; AVLFG random_state; - BitstreamContext bc; + GetBitContext gb; float scale_bias; - AVFloatDSPContext fdsp; + AVFloatDSPContext *fdsp; FFTContext imdct_ctx; DECLARE_ALIGNED(32, float, imdct_buf)[2][NELLY_BUF_LEN]; float *imdct_out; @@ -67,15 +67,15 @@ static void nelly_decode_block(NellyMoserDecodeContext *s, int bits[NELLY_BUF_LEN]; unsigned char v; - bitstream_init8(&s->bc, block, NELLY_BLOCK_LEN); + init_get_bits(&s->gb, block, NELLY_BLOCK_LEN * 8); bptr = buf; pptr = pows; - val = ff_nelly_init_table[bitstream_read(&s->bc, 6)]; + val = ff_nelly_init_table[get_bits(&s->gb, 6)]; for (i=0 ; i<NELLY_BANDS ; i++) { if (i > 0) - val += ff_nelly_delta_table[bitstream_read(&s->bc, 5)]; - pval = -pow(2, val/2048) * s->scale_bias; + val += ff_nelly_delta_table[get_bits(&s->gb, 5)]; + pval = -exp2(val/2048) * s->scale_bias; for (j = 0; j < ff_nelly_band_sizes_table[i]; j++) { *bptr++ = val; *pptr++ = pval; @@ -88,8 +88,8 @@ static void nelly_decode_block(NellyMoserDecodeContext *s, for (i = 0; i < 2; i++) { aptr = audio + i * NELLY_BUF_LEN; - bitstream_init8(&s->bc, block, NELLY_BLOCK_LEN); - bitstream_skip(&s->bc, NELLY_HEADER_BITS + i * NELLY_DETAIL_BITS); + init_get_bits(&s->gb, block, NELLY_BLOCK_LEN * 8); + skip_bits_long(&s->gb, NELLY_HEADER_BITS + i*NELLY_DETAIL_BITS); for (j = 0; j < NELLY_FILL_LEN; j++) { if (bits[j] <= 0) { @@ -97,7 +97,7 @@ static void nelly_decode_block(NellyMoserDecodeContext *s, if (av_lfg_get(&s->random_state) & 1) aptr[j] *= -1.0; } else { - v = bitstream_read(&s->bc, bits[j]); + v = get_bits(&s->gb, bits[j]); aptr[j] = ff_nelly_dequantization_table[(1<<bits[j])-1+v]*pows[j]; } } @@ -105,7 +105,7 @@ static void nelly_decode_block(NellyMoserDecodeContext *s, (NELLY_BUF_LEN - NELLY_FILL_LEN) * sizeof(float)); s->imdct_ctx.imdct_half(&s->imdct_ctx, s->imdct_out, aptr); - s->fdsp.vector_fmul_window(aptr, s->imdct_prev + NELLY_BUF_LEN / 2, + s->fdsp->vector_fmul_window(aptr, s->imdct_prev + NELLY_BUF_LEN / 2, s->imdct_out, ff_sine_128, NELLY_BUF_LEN / 2); FFSWAP(float *, s->imdct_out, s->imdct_prev); @@ -121,7 +121,9 @@ static av_cold int decode_init(AVCodecContext * avctx) { av_lfg_init(&s->random_state, 0); ff_mdct_init(&s->imdct_ctx, 8, 1, 1.0); - avpriv_float_dsp_init(&s->fdsp, avctx->flags & AV_CODEC_FLAG_BITEXACT); + s->fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT); + if (!s->fdsp) + return AVERROR(ENOMEM); s->scale_bias = 1.0/(32768*8); avctx->sample_fmt = AV_SAMPLE_FMT_FLT; @@ -141,16 +143,19 @@ static int decode_tag(AVCodecContext *avctx, void *data, { AVFrame *frame = data; const uint8_t *buf = avpkt->data; + const uint8_t *side=av_packet_get_side_data(avpkt, 'F', NULL); int buf_size = avpkt->size; NellyMoserDecodeContext *s = avctx->priv_data; int blocks, i, ret; float *samples_flt; blocks = buf_size / NELLY_BLOCK_LEN; + if (blocks <= 0) { av_log(avctx, AV_LOG_ERROR, "Packet is too small\n"); return AVERROR_INVALIDDATA; } + if (buf_size % NELLY_BLOCK_LEN) { av_log(avctx, AV_LOG_WARNING, "Leftover bytes: %d.\n", buf_size % NELLY_BLOCK_LEN); @@ -162,13 +167,13 @@ static int decode_tag(AVCodecContext *avctx, void *data, * 22050 Hz - 4 * 44100 Hz - 8 */ + if(side && blocks>1 && avctx->sample_rate%11025==0 && (1<<((side[0]>>2)&3)) == blocks) + avctx->sample_rate= 11025*(blocks/2); /* get output buffer */ frame->nb_samples = NELLY_SAMPLES * blocks; - if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) { - av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); + if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) return ret; - } samples_flt = (float *)frame->data[0]; for (i=0 ; i<blocks ; i++) { @@ -186,6 +191,7 @@ static av_cold int decode_end(AVCodecContext * avctx) { NellyMoserDecodeContext *s = avctx->priv_data; ff_mdct_end(&s->imdct_ctx); + av_freep(&s->fdsp); return 0; } |