/*
* WMA compatible decoder
- * Copyright (c) 2002 The FFmpeg Project
+ * Copyright (c) 2002 The Libav Project
*
- * This file is part of FFmpeg.
+ * This file is part of Libav.
*
- * FFmpeg is free software; you can redistribute it and/or
+ * Libav is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
- * FFmpeg is distributed in the hope that it will be useful,
+ * Libav is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with FFmpeg; if not, write to the Free Software
+ * License along with Libav; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/**
- * @file libavcodec/wmadec.c
+ * @file
* WMA compatible decoder.
* This decoder handles Microsoft Windows Media Audio data, versions 1 & 2.
* WMA v1 is identified by audio format 0x160 in Microsoft media files
}
if (s->use_exp_vlc) {
- init_vlc(&s->exp_vlc, EXPVLCBITS, sizeof(ff_wma_scale_huffbits), //FIXME move out of context
- ff_wma_scale_huffbits, 1, 1,
- ff_wma_scale_huffcodes, 4, 4, 0);
+ init_vlc(&s->exp_vlc, EXPVLCBITS, sizeof(ff_aac_scalefactor_bits), //FIXME move out of context
+ ff_aac_scalefactor_bits, 1, 1,
+ ff_aac_scalefactor_code, 4, 4, 0);
} else {
wma_lsp_to_curve_init(s, s->frame_len);
}
- avctx->sample_fmt = SAMPLE_FMT_S16;
+ avctx->sample_fmt = AV_SAMPLE_FMT_S16;
return 0;
}
int coef_nb_bits, total_gain;
int nb_coefs[MAX_CHANNELS];
float mdct_norm;
+ FFTContext *mdct;
#ifdef TRACE
tprintf(s->avctx, "***decode_block: %d:%d\n", s->frame_count - 1, s->block_num);
}
next:
+ mdct = &s->mdct_ctx[bsize];
+
for(ch = 0; ch < s->nb_channels; ch++) {
int n4, index;
n4 = s->block_len / 2;
if(s->channel_coded[ch]){
- ff_imdct_calc(&s->mdct_ctx[bsize], s->output, s->coefs[ch]);
+ mdct->imdct_calc(mdct, s->output, s->coefs[ch]);
}else if(!(s->ms_stereo && ch==1))
memset(s->output, 0, sizeof(s->output));
/* decode a frame of frame_len samples */
static int wma_decode_frame(WMACodecContext *s, int16_t *samples)
{
- int ret, i, n, ch, incr;
- int16_t *ptr;
- float *iptr;
+ int ret, n, ch, incr;
+ const float *output[MAX_CHANNELS];
#ifdef TRACE
tprintf(s->avctx, "***decode_frame: %d size=%d\n", s->frame_count++, s->frame_len);
/* convert frame to integer */
n = s->frame_len;
incr = s->nb_channels;
- for(ch = 0; ch < s->nb_channels; ch++) {
- ptr = samples + ch;
- iptr = s->frame_out[ch];
-
- for(i=0;i<n;i++) {
- *ptr = av_clip_int16(lrintf(*iptr++));
- ptr += incr;
- }
+ 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++) {
/* prepare for next block */
- memmove(&s->frame_out[ch][0], &s->frame_out[ch][s->frame_len],
- s->frame_len * sizeof(float));
+ memmove(&s->frame_out[ch][0], &s->frame_out[ch][n], n * sizeof(float));
}
#ifdef TRACE
return -1;
}
-AVCodec wmav1_decoder =
+static av_cold void flush(AVCodecContext *avctx)
+{
+ WMACodecContext *s = avctx->priv_data;
+
+ s->last_bitoffset=
+ s->last_superframe_len= 0;
+}
+
+AVCodec ff_wmav1_decoder =
{
"wmav1",
- CODEC_TYPE_AUDIO,
+ AVMEDIA_TYPE_AUDIO,
CODEC_ID_WMAV1,
sizeof(WMACodecContext),
wma_decode_init,
NULL,
ff_wma_end,
wma_decode_superframe,
+ .flush=flush,
.long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 1"),
};
-AVCodec wmav2_decoder =
+AVCodec ff_wmav2_decoder =
{
"wmav2",
- CODEC_TYPE_AUDIO,
+ AVMEDIA_TYPE_AUDIO,
CODEC_ID_WMAV2,
sizeof(WMACodecContext),
wma_decode_init,
NULL,
ff_wma_end,
wma_decode_superframe,
+ .flush=flush,
.long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 2"),
};