Commit 7ebfe5b4 authored by Justin Ruggles's avatar Justin Ruggles

wmadec: use float planar sample format output

parent 977eb7d5
...@@ -48,20 +48,6 @@ ...@@ -48,20 +48,6 @@
static void wma_lsp_to_curve_init(WMACodecContext *s, int frame_len); static void wma_lsp_to_curve_init(WMACodecContext *s, int frame_len);
#ifdef TRACE #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;i<n;i++) {
if ((i & 7) == 0)
tprintf(s->avctx, "%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) static void dump_floats(WMACodecContext *s, const char *name, int prec, const float *tab, int n)
{ {
int i; int i;
...@@ -105,7 +91,7 @@ static int wma_decode_init(AVCodecContext * avctx) ...@@ -105,7 +91,7 @@ static int wma_decode_init(AVCodecContext * avctx)
/* init MDCT */ /* init MDCT */
for(i = 0; i < s->nb_block_sizes; i++) 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) { if (s->use_noise_coding) {
init_vlc(&s->hgain_vlc, HGAINVLCBITS, sizeof(ff_wma_hgain_huffbits), init_vlc(&s->hgain_vlc, HGAINVLCBITS, sizeof(ff_wma_hgain_huffbits),
...@@ -121,7 +107,7 @@ static int wma_decode_init(AVCodecContext * avctx) ...@@ -121,7 +107,7 @@ static int wma_decode_init(AVCodecContext * avctx)
wma_lsp_to_curve_init(s, s->frame_len); 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); avcodec_get_frame_defaults(&s->frame);
avctx->coded_frame = &s->frame; avctx->coded_frame = &s->frame;
...@@ -762,10 +748,10 @@ next: ...@@ -762,10 +748,10 @@ next:
} }
/* decode a frame of frame_len samples */ /* 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; int ret, ch;
const float *output[MAX_CHANNELS];
#ifdef TRACE #ifdef TRACE
tprintf(s->avctx, "***decode_frame: %d size=%d\n", s->frame_count++, s->frame_len); 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) ...@@ -782,20 +768,19 @@ static int wma_decode_frame(WMACodecContext *s, int16_t *samples)
break; break;
} }
/* convert frame to integer */ for (ch = 0; ch < s->nb_channels; ch++) {
n = s->frame_len; /* copy current block to output */
incr = s->nb_channels; memcpy(samples[ch] + samples_offset, s->frame_out[ch],
for (ch = 0; ch < MAX_CHANNELS; ch++) s->frame_len * sizeof(*s->frame_out[ch]));
output[ch] = s->frame_out[ch];
s->fmt_conv.float_to_int16_interleave(samples, output, n, incr);
for (ch = 0; ch < incr; ch++) {
/* prepare for next block */ /* 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 #ifdef TRACE
dump_shorts(s, "samples", samples, n * s->nb_channels); dump_floats(s, "samples", 6, samples[ch] + samples_offset, s->frame_len);
#endif #endif
}
return 0; return 0;
} }
...@@ -807,7 +792,8 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data, ...@@ -807,7 +792,8 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data,
WMACodecContext *s = avctx->priv_data; WMACodecContext *s = avctx->priv_data;
int nb_frames, bit_offset, i, pos, len, ret; int nb_frames, bit_offset, i, pos, len, ret;
uint8_t *q; uint8_t *q;
int16_t *samples; float **samples;
int samples_offset;
tprintf(avctx, "***decode_superframe:\n"); tprintf(avctx, "***decode_superframe:\n");
...@@ -839,7 +825,8 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data, ...@@ -839,7 +825,8 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data,
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
return ret; return ret;
} }
samples = (int16_t *)s->frame.data[0]; samples = (float **)s->frame.extended_data;
samples_offset = 0;
if (s->use_bit_reservoir) { if (s->use_bit_reservoir) {
bit_offset = get_bits(&s->gb, s->byte_offset_bits + 3); bit_offset = get_bits(&s->gb, s->byte_offset_bits + 3);
...@@ -873,9 +860,9 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data, ...@@ -873,9 +860,9 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data,
skip_bits(&s->gb, s->last_bitoffset); skip_bits(&s->gb, s->last_bitoffset);
/* this frame is stored in the last superframe and in the /* this frame is stored in the last superframe and in the
current one */ current one */
if (wma_decode_frame(s, samples) < 0) if (wma_decode_frame(s, samples, samples_offset) < 0)
goto fail; goto fail;
samples += s->nb_channels * s->frame_len; samples_offset += s->frame_len;
nb_frames--; nb_frames--;
} }
...@@ -890,9 +877,9 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data, ...@@ -890,9 +877,9 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data,
s->reset_block_lengths = 1; s->reset_block_lengths = 1;
for(i=0;i<nb_frames;i++) { for(i=0;i<nb_frames;i++) {
if (wma_decode_frame(s, samples) < 0) if (wma_decode_frame(s, samples, samples_offset) < 0)
goto fail; goto fail;
samples += s->nb_channels * s->frame_len; samples_offset += s->frame_len;
} }
/* we copy the end of the frame in the last frame buffer */ /* 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, ...@@ -908,9 +895,9 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data,
memcpy(s->last_superframe, buf + pos, len); memcpy(s->last_superframe, buf + pos, len);
} else { } else {
/* single frame decode */ /* single frame decode */
if (wma_decode_frame(s, samples) < 0) if (wma_decode_frame(s, samples, samples_offset) < 0)
goto fail; 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", av_dlog(s->avctx, "%d %d %d %d outbytes:%td eaten:%d\n",
...@@ -946,6 +933,8 @@ AVCodec ff_wmav1_decoder = { ...@@ -946,6 +933,8 @@ AVCodec ff_wmav1_decoder = {
.flush = flush, .flush = flush,
.capabilities = CODEC_CAP_DR1, .capabilities = CODEC_CAP_DR1,
.long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 1"), .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 = { AVCodec ff_wmav2_decoder = {
...@@ -959,4 +948,6 @@ AVCodec ff_wmav2_decoder = { ...@@ -959,4 +948,6 @@ AVCodec ff_wmav2_decoder = {
.flush = flush, .flush = flush,
.capabilities = CODEC_CAP_DR1, .capabilities = CODEC_CAP_DR1,
.long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 2"), .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 2"),
.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
AV_SAMPLE_FMT_NONE },
}; };
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment