From 31b2262dca9cc77709d20c45610ec8030e7f9257 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Sat, 25 Aug 2012 13:44:30 -0400 Subject: [PATCH] wmaenc: use float planar sample format --- libavcodec/wma.c | 1 + libavcodec/wma.h | 2 ++ libavcodec/wmaenc.c | 30 +++++++++++++++--------------- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/libavcodec/wma.c b/libavcodec/wma.c index 43714e7c84..f9ba9c3855 100644 --- a/libavcodec/wma.c +++ b/libavcodec/wma.c @@ -89,6 +89,7 @@ int ff_wma_init(AVCodecContext *avctx, int flags2) ff_dsputil_init(&s->dsp, avctx); ff_fmt_convert_init(&s->fmt_conv, avctx); + avpriv_float_dsp_init(&s->fdsp, avctx->flags & CODEC_FLAG_BITEXACT); if (avctx->codec->id == AV_CODEC_ID_WMAV1) { s->version = 1; diff --git a/libavcodec/wma.h b/libavcodec/wma.h index 15838eb685..f81e0950eb 100644 --- a/libavcodec/wma.h +++ b/libavcodec/wma.h @@ -22,6 +22,7 @@ #ifndef AVCODEC_WMA_H #define AVCODEC_WMA_H +#include "libavutil/float_dsp.h" #include "get_bits.h" #include "put_bits.h" #include "dsputil.h" @@ -137,6 +138,7 @@ typedef struct WMACodecContext { float lsp_pow_m_table2[(1 << LSP_POW_BITS)]; DSPContext dsp; FmtConvertContext fmt_conv; + AVFloatDSPContext fdsp; #ifdef TRACE int frame_count; diff --git a/libavcodec/wmaenc.c b/libavcodec/wmaenc.c index b439548829..8abb55bbd4 100644 --- a/libavcodec/wmaenc.c +++ b/libavcodec/wmaenc.c @@ -97,23 +97,24 @@ static int encode_init(AVCodecContext * avctx){ } -static void apply_window_and_mdct(AVCodecContext * avctx, const signed short * audio, int len) { +static void apply_window_and_mdct(AVCodecContext * avctx, const AVFrame *frame) +{ WMACodecContext *s = avctx->priv_data; + float **audio = (float **)frame->extended_data; + int len = frame->nb_samples; int window_index= s->frame_len_bits - s->block_len_bits; FFTContext *mdct = &s->mdct_ctx[window_index]; - int i, j, channel; + int ch; const float * win = s->windows[window_index]; int window_len = 1 << s->block_len_bits; - float n = window_len/2; + float n = 2.0 * 32768.0 / window_len; - for (channel = 0; channel < avctx->channels; channel++) { - memcpy(s->output, s->frame_out[channel], sizeof(float)*window_len); - j = channel; - for (i = 0; i < len; i++, j += avctx->channels){ - s->output[i+window_len] = audio[j] / n * win[window_len - i - 1]; - s->frame_out[channel][i] = audio[j] / n * win[i]; - } - mdct->mdct_calc(mdct, s->coefs[channel], s->output); + for (ch = 0; ch < avctx->channels; ch++) { + memcpy(s->output, s->frame_out[ch], window_len * sizeof(*s->output)); + s->dsp.vector_fmul_scalar(s->frame_out[ch], audio[ch], n, len); + s->dsp.vector_fmul_reverse(&s->output[window_len], s->frame_out[ch], win, len); + s->fdsp.vector_fmul(s->frame_out[ch], s->frame_out[ch], win, len); + mdct->mdct_calc(mdct, s->coefs[ch], s->output); } } @@ -349,13 +350,12 @@ static int encode_superframe(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr) { WMACodecContext *s = avctx->priv_data; - const int16_t *samples = (const int16_t *)frame->data[0]; int i, total_gain, ret; s->block_len_bits= s->frame_len_bits; //required by non variable block len s->block_len = 1 << s->block_len_bits; - apply_window_and_mdct(avctx, samples, frame->nb_samples); + apply_window_and_mdct(avctx, frame); if (s->ms_stereo) { float a, b; @@ -426,7 +426,7 @@ AVCodec ff_wmav1_encoder = { .init = encode_init, .encode2 = encode_superframe, .close = ff_wma_end, - .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16, + .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE }, .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 1"), }; @@ -439,7 +439,7 @@ AVCodec ff_wmav2_encoder = { .init = encode_init, .encode2 = encode_superframe, .close = ff_wma_end, - .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16, + .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE }, .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 2"), };