]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/vorbisenc.c
mpegvideo_enc: do not modify the input frame.
[ffmpeg] / libavcodec / vorbisenc.c
index 0b0caccb7cb28ef59100eb781ae2405647855ebc..42713f98cc4e8bc7b6b0f2843dbd1ff5d1836138 100644 (file)
@@ -340,7 +340,8 @@ static int create_vorbis_context(vorbis_enc_context *venc,
         };
         fc->list[i].x = a[i - 2];
     }
-    ff_vorbis_ready_floor1_list(fc->list, fc->values);
+    if (ff_vorbis_ready_floor1_list(avccontext, fc->list, fc->values))
+        return AVERROR_BUG;
 
     venc->nresidues = 1;
     venc->residues  = av_malloc(sizeof(vorbis_enc_residue) * venc->nresidues);
@@ -962,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.;
@@ -987,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++)
@@ -1004,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 {
@@ -1020,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;
@@ -1179,10 +1178,11 @@ static av_cold int vorbis_encode_init(AVCodecContext *avccontext)
     if ((ret = create_vorbis_context(venc, avccontext)) < 0)
         goto error;
 
+    avccontext->bit_rate = 0;
     if (avccontext->flags & CODEC_FLAG_QSCALE)
-        venc->quality = avccontext->global_quality / (float)FF_QP2LAMBDA / 10.;
+        venc->quality = avccontext->global_quality / (float)FF_QP2LAMBDA;
     else
-        venc->quality = 0.03;
+        venc->quality = 3.0;
     venc->quality *= venc->quality;
 
     if ((ret = put_main_header(venc, (uint8_t**)&avccontext->extradata)) < 0)
@@ -1208,13 +1208,13 @@ error:
 AVCodec ff_vorbis_encoder = {
     .name           = "vorbis",
     .type           = AVMEDIA_TYPE_AUDIO,
-    .id             = CODEC_ID_VORBIS,
+    .id             = AV_CODEC_ID_VORBIS,
     .priv_data_size = sizeof(vorbis_enc_context),
     .init           = vorbis_encode_init,
     .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"),
 };