summaryrefslogtreecommitdiff
path: root/libavcodec/wmadec.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-10-15 14:04:35 +0200
committerMichael Niedermayer <michaelni@gmx.at>2012-10-15 14:09:35 +0200
commitae237a117acbe958bea798e32249f4c2baeca5f9 (patch)
treec45fc400e59ab03d5346a82580bfc2054b9efe0f /libavcodec/wmadec.c
parent4f5e5a05132be4946a655b991850bf81b7497893 (diff)
parent95cd815c3663603871a1f2da95846e8f72d4ea96 (diff)
Merge remote-tracking branch 'qatar/master'
* qatar/master: swscale: try to use mmap only if available configure: check for mprotect wmapro: use planar sample format wmalossless: output in planar sample format wmadec: use float planar sample format output shorten: use planar sample format lavc: update documentation for AVFrame.extended_data Conflicts: libavcodec/shorten.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/wmadec.c')
-rw-r--r--libavcodec/wmadec.c65
1 files changed, 28 insertions, 37 deletions
diff --git a/libavcodec/wmadec.c b/libavcodec/wmadec.c
index 1bcf0da453..ca12d24031 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;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)
{
int i;
@@ -112,7 +98,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),
@@ -128,7 +114,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;
@@ -774,10 +760,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);
@@ -794,20 +780,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;
}
@@ -819,7 +804,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");
@@ -852,7 +838,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);
@@ -886,9 +873,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--;
}
@@ -903,9 +890,9 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data,
s->reset_block_lengths = 1;
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;
- samples += s->nb_channels * s->frame_len;
+ samples_offset += s->frame_len;
}
/* we copy the end of the frame in the last frame buffer */
@@ -921,9 +908,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",
@@ -960,6 +947,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 },
};
#endif
#if CONFIG_WMAV2_DECODER
@@ -974,5 +963,7 @@ 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 },
};
#endif