From d3211cfaedcc0abf30e3a40c246237090ad95b6d Mon Sep 17 00:00:00 2001 From: Timothy Gu Date: Fri, 1 Nov 2013 19:43:24 -0700 Subject: [PATCH] avcodec/libmp3lame: add ABR support Signed-off-by: Timothy Gu Signed-off-by: Michael Niedermayer --- doc/encoders.texi | 7 ++++++- libavcodec/libmp3lame.c | 11 +++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/doc/encoders.texi b/doc/encoders.texi index d8583a52e2..92b0548d27 100644 --- a/doc/encoders.texi +++ b/doc/encoders.texi @@ -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 diff --git a/libavcodec/libmp3lame.c b/libavcodec/libmp3lame.c index 0fb9c6a3b1..14fbb9ec56 100644 --- a/libavcodec/libmp3lame.c +++ b/libavcodec/libmp3lame.c @@ -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 }, };