avcodec/libmp3lame: add ABR support
Signed-off-by: Timothy Gu <timothygu99@gmail.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
67d1d06225
commit
d3211cfaed
@ -785,7 +785,7 @@ The following options are supported by the libmp3lame wrapper. The
|
|||||||
|
|
||||||
@table @option
|
@table @option
|
||||||
@item b (@emph{-b})
|
@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.
|
expressed in kilobits/s.
|
||||||
|
|
||||||
@item q (@emph{-V})
|
@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
|
Enable the encoder to use (on a frame by frame basis) either L/R
|
||||||
stereo or mid/side stereo. Default value is 1.
|
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
|
@end table
|
||||||
|
|
||||||
@section libopencore-amrnb
|
@section libopencore-amrnb
|
||||||
|
@ -49,6 +49,7 @@ typedef struct LAMEContext {
|
|||||||
int buffer_size;
|
int buffer_size;
|
||||||
int reservoir;
|
int reservoir;
|
||||||
int joint_stereo;
|
int joint_stereo;
|
||||||
|
int abr;
|
||||||
float *samples_flt[2];
|
float *samples_flt[2];
|
||||||
AudioFrameQueue afq;
|
AudioFrameQueue afq;
|
||||||
AVFloatDSPContext fdsp;
|
AVFloatDSPContext fdsp;
|
||||||
@ -119,9 +120,14 @@ static av_cold int mp3lame_encode_init(AVCodecContext *avctx)
|
|||||||
lame_set_VBR(s->gfp, vbr_default);
|
lame_set_VBR(s->gfp, vbr_default);
|
||||||
lame_set_VBR_quality(s->gfp, avctx->global_quality / (float)FF_QP2LAMBDA);
|
lame_set_VBR_quality(s->gfp, avctx->global_quality / (float)FF_QP2LAMBDA);
|
||||||
} else {
|
} else {
|
||||||
if (avctx->bit_rate) // CBR
|
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);
|
lame_set_brate(s->gfp, avctx->bit_rate / 1000);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* do not get a Xing VBR header frame from LAME */
|
/* do not get a Xing VBR header frame from LAME */
|
||||||
lame_set_bWriteVbrTag(s->gfp,0);
|
lame_set_bWriteVbrTag(s->gfp,0);
|
||||||
@ -265,6 +271,7 @@ static int mp3lame_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
|
|||||||
static const AVOption options[] = {
|
static const AVOption options[] = {
|
||||||
{ "reservoir", "use bit reservoir", OFFSET(reservoir), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, AE },
|
{ "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 },
|
{ "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 },
|
{ NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user