From 7ebfe5b44a55d7f2c510e6aaeaf767319c786b60 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Tue, 28 Aug 2012 23:12:49 -0400 Subject: [PATCH] wmadec: use float planar sample format output --- libavcodec/wmadec.c | 65 +++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 37 deletions(-) diff --git a/libavcodec/wmadec.c b/libavcodec/wmadec.c index 79401e21b6..bbb840212e 100644 --- a/libavcodec/wmadec.c +++ b/libavcodec/wmadec.c @@ -48,20 +48,6 @@ static void wma_lsp_to_curve_init(WMACodecContext *s, int frame_len); #ifdef TRACE -static void dump_shorts(WMACodecContext *s, const char *name, const short *tab, int n) -{ - int i; - - tprintf(s->avctx, "%s[%d]:\n", name, n); - for(i=0;iavctx, "%4d: ", i); - tprintf(s->avctx, " %5d.0", tab[i]); - if ((i & 7) == 7) - tprintf(s->avctx, "\n"); - } -} - static void dump_floats(WMACodecContext *s, const char *name, int prec, const float *tab, int n) { int i; @@ -105,7 +91,7 @@ static int wma_decode_init(AVCodecContext * avctx) /* init MDCT */ for(i = 0; i < s->nb_block_sizes; i++) - ff_mdct_init(&s->mdct_ctx[i], s->frame_len_bits - i + 1, 1, 1.0); + ff_mdct_init(&s->mdct_ctx[i], s->frame_len_bits - i + 1, 1, 1.0 / 32768.0); if (s->use_noise_coding) { init_vlc(&s->hgain_vlc, HGAINVLCBITS, sizeof(ff_wma_hgain_huffbits), @@ -121,7 +107,7 @@ static int wma_decode_init(AVCodecContext * avctx) wma_lsp_to_curve_init(s, s->frame_len); } - avctx->sample_fmt = AV_SAMPLE_FMT_S16; + avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; avcodec_get_frame_defaults(&s->frame); avctx->coded_frame = &s->frame; @@ -762,10 +748,10 @@ next: } /* decode a frame of frame_len samples */ -static int wma_decode_frame(WMACodecContext *s, int16_t *samples) +static int wma_decode_frame(WMACodecContext *s, float **samples, + int samples_offset) { - int ret, n, ch, incr; - const float *output[MAX_CHANNELS]; + int ret, ch; #ifdef TRACE tprintf(s->avctx, "***decode_frame: %d size=%d\n", s->frame_count++, s->frame_len); @@ -782,20 +768,19 @@ static int wma_decode_frame(WMACodecContext *s, int16_t *samples) break; } - /* convert frame to integer */ - n = s->frame_len; - incr = s->nb_channels; - for (ch = 0; ch < MAX_CHANNELS; ch++) - output[ch] = s->frame_out[ch]; - s->fmt_conv.float_to_int16_interleave(samples, output, n, incr); - for (ch = 0; ch < incr; ch++) { + for (ch = 0; ch < s->nb_channels; ch++) { + /* copy current block to output */ + memcpy(samples[ch] + samples_offset, s->frame_out[ch], + s->frame_len * sizeof(*s->frame_out[ch])); /* prepare for next block */ - memmove(&s->frame_out[ch][0], &s->frame_out[ch][n], n * sizeof(float)); - } + memmove(&s->frame_out[ch][0], &s->frame_out[ch][s->frame_len], + s->frame_len * sizeof(*s->frame_out[ch])); #ifdef TRACE - dump_shorts(s, "samples", samples, n * s->nb_channels); + dump_floats(s, "samples", 6, samples[ch] + samples_offset, s->frame_len); #endif + } + return 0; } @@ -807,7 +792,8 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data, WMACodecContext *s = avctx->priv_data; int nb_frames, bit_offset, i, pos, len, ret; uint8_t *q; - int16_t *samples; + float **samples; + int samples_offset; tprintf(avctx, "***decode_superframe:\n"); @@ -839,7 +825,8 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data, av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return ret; } - samples = (int16_t *)s->frame.data[0]; + samples = (float **)s->frame.extended_data; + samples_offset = 0; if (s->use_bit_reservoir) { bit_offset = get_bits(&s->gb, s->byte_offset_bits + 3); @@ -873,9 +860,9 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data, skip_bits(&s->gb, s->last_bitoffset); /* this frame is stored in the last superframe and in the current one */ - if (wma_decode_frame(s, samples) < 0) + if (wma_decode_frame(s, samples, samples_offset) < 0) goto fail; - samples += s->nb_channels * s->frame_len; + samples_offset += s->frame_len; nb_frames--; } @@ -890,9 +877,9 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data, s->reset_block_lengths = 1; for(i=0;inb_channels * s->frame_len; + samples_offset += s->frame_len; } /* we copy the end of the frame in the last frame buffer */ @@ -908,9 +895,9 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data, memcpy(s->last_superframe, buf + pos, len); } else { /* single frame decode */ - if (wma_decode_frame(s, samples) < 0) + if (wma_decode_frame(s, samples, samples_offset) < 0) goto fail; - samples += s->nb_channels * s->frame_len; + samples_offset += s->frame_len; } av_dlog(s->avctx, "%d %d %d %d outbytes:%td eaten:%d\n", @@ -946,6 +933,8 @@ AVCodec ff_wmav1_decoder = { .flush = flush, .capabilities = CODEC_CAP_DR1, .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 1"), + .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, + AV_SAMPLE_FMT_NONE }, }; AVCodec ff_wmav2_decoder = { @@ -959,4 +948,6 @@ AVCodec ff_wmav2_decoder = { .flush = flush, .capabilities = CODEC_CAP_DR1, .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 2"), + .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, + AV_SAMPLE_FMT_NONE }, };