[libav-commits] wmaenc: use float planar sample format

Justin Ruggles git at libav.org
Sat Oct 6 19:27:36 CEST 2012


Module: libav
Branch: master
Commit: 31b2262dca9cc77709d20c45610ec8030e7f9257

Author:    Justin Ruggles <justin.ruggles at gmail.com>
Committer: Justin Ruggles <justin.ruggles at gmail.com>
Date:      Sat Aug 25 13:44:30 2012 -0400

wmaenc: use float planar sample format

---

 libavcodec/wma.c    |    1 +
 libavcodec/wma.h    |    2 ++
 libavcodec/wmaenc.c |   32 ++++++++++++++++----------------
 3 files changed, 19 insertions(+), 16 deletions(-)

diff --git a/libavcodec/wma.c b/libavcodec/wma.c
index 43714e7..f9ba9c3 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 15838eb..f81e095 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 b439548..8abb55b 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;
-
-    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);
+    float n = 2.0 * 32768.0 / window_len;
+
+    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"),
 };



More information about the libav-commits mailing list