avcodec/libmp3lame: add ABR support
authorTimothy Gu <timothygu99@gmail.com>
Sat, 2 Nov 2013 02:43:24 +0000 (19:43 -0700)
committerMichael Niedermayer <michaelni@gmx.at>
Sat, 2 Nov 2013 17:44:20 +0000 (18:44 +0100)
Signed-off-by: Timothy Gu <timothygu99@gmail.com>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
doc/encoders.texi
libavcodec/libmp3lame.c

index d8583a5..92b0548 100644 (file)
@@ -785,7 +785,7 @@ The following options are supported by the libmp3lame wrapper. The
 
 @table @option
 @item b (@emph{-b})
-Set bitrate expressed in bits/s for CBR. LAME @code{bitrate} is
+Set bitrate expressed in bits/s for CBR or ABR. LAME @code{bitrate} is
 expressed in kilobits/s.
 
 @item q (@emph{-V})
@@ -807,6 +807,11 @@ has this enabled by default, but can be overriden by use
 Enable the encoder to use (on a frame by frame basis) either L/R
 stereo or mid/side stereo. Default value is 1.
 
+@item abr (@emph{--abr})
+Enable the encoder to use ABR when set to 1. The @command{lame}
+@option{--abr} sets the target bitrate, while this options only
+tells FFmpeg to use ABR still relies on @option{b} to set bitrate.
+
 @end table
 
 @section libopencore-amrnb
index 0fb9c6a..14fbb9e 100644 (file)
@@ -49,6 +49,7 @@ typedef struct LAMEContext {
     int buffer_size;
     int reservoir;
     int joint_stereo;
+    int abr;
     float *samples_flt[2];
     AudioFrameQueue afq;
     AVFloatDSPContext fdsp;
@@ -119,8 +120,13 @@ static av_cold int mp3lame_encode_init(AVCodecContext *avctx)
         lame_set_VBR(s->gfp, vbr_default);
         lame_set_VBR_quality(s->gfp, avctx->global_quality / (float)FF_QP2LAMBDA);
     } else {
-        if (avctx->bit_rate)                // CBR
-            lame_set_brate(s->gfp, avctx->bit_rate / 1000);
+        if (avctx->bit_rate) {
+            if (s->abr) {                   // ABR
+                lame_set_VBR(s->gfp, vbr_abr);
+                lame_set_VBR_mean_bitrate_kbps(s->gfp, avctx->bit_rate / 1000);
+            } else                          // CBR
+                lame_set_brate(s->gfp, avctx->bit_rate / 1000);
+        }
     }
 
     /* do not get a Xing VBR header frame from LAME */
@@ -265,6 +271,7 @@ static int mp3lame_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
 static const AVOption options[] = {
     { "reservoir",    "use bit reservoir", OFFSET(reservoir),    AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, AE },
     { "joint_stereo", "use joint stereo",  OFFSET(joint_stereo), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, AE },
+    { "abr",          "use ABR",           OFFSET(abr),          AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, AE },
     { NULL },
 };