vorbisenc: use float planar sample format
authorJustin Ruggles <justin.ruggles@gmail.com>
Mon, 20 Aug 2012 17:25:27 +0000 (13:25 -0400)
committerJustin Ruggles <justin.ruggles@gmail.com>
Sat, 6 Oct 2012 16:25:32 +0000 (12:25 -0400)
libavcodec/vorbisenc.c

index b0e0e68c2f7c6d5aaa4b85e38e7badb35cc9752f..42713f98cc4e8bc7b6b0f2843dbd1ff5d1836138 100644 (file)
@@ -963,10 +963,10 @@ static int residue_encode(vorbis_enc_context *venc, vorbis_enc_residue *rc,
     return 0;
 }
 
-static int apply_window_and_mdct(vorbis_enc_context *venc, const signed short *audio,
-                                 int samples)
+static int apply_window_and_mdct(vorbis_enc_context *venc,
+                                 float **audio, int samples)
 {
-    int i, j, channel;
+    int i, channel;
     const float * win = venc->win[0];
     int window_len = 1 << (venc->log2_blocksize[0] - 1);
     float n = (float)(1 << venc->log2_blocksize[0]) / 4.;
@@ -988,9 +988,8 @@ static int apply_window_and_mdct(vorbis_enc_context *venc, const signed short *a
     if (samples) {
         for (channel = 0; channel < venc->channels; channel++) {
             float * offset = venc->samples + channel*window_len*2 + window_len;
-            j = channel;
-            for (i = 0; i < samples; i++, j += venc->channels)
-                offset[i] = audio[j] / 32768. / n * win[window_len - i - 1];
+            for (i = 0; i < samples; i++)
+                offset[i] = audio[channel][i] / n * win[window_len - i - 1];
         }
     } else {
         for (channel = 0; channel < venc->channels; channel++)
@@ -1005,9 +1004,8 @@ static int apply_window_and_mdct(vorbis_enc_context *venc, const signed short *a
     if (samples) {
         for (channel = 0; channel < venc->channels; channel++) {
             float *offset = venc->saved + channel * window_len;
-            j = channel;
-            for (i = 0; i < samples; i++, j += venc->channels)
-                offset[i] = audio[j] / 32768. / n * win[i];
+            for (i = 0; i < samples; i++)
+                offset[i] = audio[channel][i] / n * win[i];
         }
         venc->have_saved = 1;
     } else {
@@ -1021,7 +1019,7 @@ static int vorbis_encode_frame(AVCodecContext *avccontext, AVPacket *avpkt,
                                const AVFrame *frame, int *got_packet_ptr)
 {
     vorbis_enc_context *venc = avccontext->priv_data;
-    const int16_t *audio = frame ? (const int16_t *)frame->data[0] : NULL;
+    float **audio = frame ? (float **)frame->extended_data : NULL;
     int samples = frame ? frame->nb_samples : 0;
     vorbis_enc_mode *mode;
     vorbis_enc_mapping *mapping;
@@ -1216,7 +1214,7 @@ AVCodec ff_vorbis_encoder = {
     .encode2        = vorbis_encode_frame,
     .close          = vorbis_encode_close,
     .capabilities   = CODEC_CAP_DELAY | CODEC_CAP_EXPERIMENTAL,
-    .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("Vorbis"),
 };