diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2012-02-17 00:04:54 -0500 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2012-02-20 12:32:30 -0500 |
commit | e2322252764daad55dfe977dc3dba3e4e5ab67e1 (patch) | |
tree | 4190265649309e9ee89b7aeacdb0f057ab891886 /libavcodec/libmp3lame.c | |
parent | 232e16dd02ff93e2d25e3d30d01961f98ee08c75 (diff) | |
download | ffmpeg-e2322252764daad55dfe977dc3dba3e4e5ab67e1.tar.gz |
libmp3lame: renaming, rearrangement, alignment, and comments
Diffstat (limited to 'libavcodec/libmp3lame.c')
-rw-r--r-- | libavcodec/libmp3lame.c | 86 |
1 files changed, 51 insertions, 35 deletions
diff --git a/libavcodec/libmp3lame.c b/libavcodec/libmp3lame.c index 79384b84db..365b6395f8 100644 --- a/libavcodec/libmp3lame.c +++ b/libavcodec/libmp3lame.c @@ -24,6 +24,8 @@ * Interface to libmp3lame for mp3 encoding. */ +#include <lame/lame.h> + #include "libavutil/intreadwrite.h" #include "libavutil/log.h" #include "libavutil/opt.h" @@ -31,21 +33,21 @@ #include "internal.h" #include "mpegaudio.h" #include "mpegaudiodecheader.h" -#include <lame/lame.h> #define BUFFER_SIZE (7200 + 2 * MPA_FRAME_SIZE + MPA_FRAME_SIZE / 4) -typedef struct Mp3AudioContext { + +typedef struct LAMEContext { AVClass *class; lame_global_flags *gfp; uint8_t buffer[BUFFER_SIZE]; int buffer_index; int reservoir; -} Mp3AudioContext; +} LAMEContext; -static av_cold int MP3lame_encode_close(AVCodecContext *avctx) +static av_cold int mp3lame_encode_close(AVCodecContext *avctx) { - Mp3AudioContext *s = avctx->priv_data; + LAMEContext *s = avctx->priv_data; av_freep(&avctx->coded_frame); @@ -53,25 +55,34 @@ static av_cold int MP3lame_encode_close(AVCodecContext *avctx) return 0; } -static av_cold int MP3lame_encode_init(AVCodecContext *avctx) +static av_cold int mp3lame_encode_init(AVCodecContext *avctx) { - Mp3AudioContext *s = avctx->priv_data; + LAMEContext *s = avctx->priv_data; int ret; - if (avctx->channels > 2) - return AVERROR(EINVAL); - + /* initialize LAME and get defaults */ if ((s->gfp = lame_init()) == NULL) return AVERROR(ENOMEM); - lame_set_in_samplerate(s->gfp, avctx->sample_rate); - lame_set_out_samplerate(s->gfp, avctx->sample_rate); + + /* channels */ + if (avctx->channels > 2) { + ret = AVERROR(EINVAL); + goto error; + } lame_set_num_channels(s->gfp, avctx->channels); - if (avctx->compression_level == FF_COMPRESSION_DEFAULT) { + lame_set_mode(s->gfp, avctx->channels > 1 ? JOINT_STEREO : MONO); + + /* sample rate */ + lame_set_in_samplerate (s->gfp, avctx->sample_rate); + lame_set_out_samplerate(s->gfp, avctx->sample_rate); + + /* algorithmic quality */ + if (avctx->compression_level == FF_COMPRESSION_DEFAULT) lame_set_quality(s->gfp, 5); - } else { + else lame_set_quality(s->gfp, avctx->compression_level); - } - lame_set_mode(s->gfp, avctx->channels > 1 ? JOINT_STEREO : MONO); + + /* rate control */ if (avctx->flags & CODEC_FLAG_QSCALE) { lame_set_VBR(s->gfp, vbr_default); lame_set_VBR_quality(s->gfp, avctx->global_quality / (float)FF_QP2LAMBDA); @@ -79,15 +90,21 @@ static av_cold int MP3lame_encode_init(AVCodecContext *avctx) if (avctx->bit_rate) lame_set_brate(s->gfp, avctx->bit_rate / 1000); } + + /* do not get a Xing VBR header frame from LAME */ lame_set_bWriteVbrTag(s->gfp,0); + + /* bit reservoir usage */ lame_set_disable_reservoir(s->gfp, !s->reservoir); + + /* set specified parameters */ if (lame_init_params(s->gfp) < 0) { ret = -1; goto error; } - avctx->frame_size = lame_get_framesize(s->gfp); - avctx->coded_frame = avcodec_alloc_frame(); + avctx->frame_size = lame_get_framesize(s->gfp); + avctx->coded_frame = avcodec_alloc_frame(); if (!avctx->coded_frame) { ret = AVERROR(ENOMEM); goto error; @@ -95,18 +112,14 @@ static av_cold int MP3lame_encode_init(AVCodecContext *avctx) return 0; error: - MP3lame_encode_close(avctx); + mp3lame_encode_close(avctx); return ret; } -static const int sSampleRates[] = { - 44100, 48000, 32000, 22050, 24000, 16000, 11025, 12000, 8000, 0 -}; - -static int MP3lame_encode_frame(AVCodecContext *avctx, unsigned char *frame, +static int mp3lame_encode_frame(AVCodecContext *avctx, unsigned char *frame, int buf_size, void *data) { - Mp3AudioContext *s = avctx->priv_data; + LAMEContext *s = avctx->priv_data; MPADecodeHeader hdr; int len; int lame_result; @@ -127,7 +140,6 @@ static int MP3lame_encode_frame(AVCodecContext *avctx, unsigned char *frame, lame_result = lame_encode_flush(s->gfp, s->buffer + s->buffer_index, BUFFER_SIZE - s->buffer_index); } - if (lame_result < 0) { if (lame_result == -1) { av_log(avctx, AV_LOG_ERROR, @@ -136,12 +148,13 @@ static int MP3lame_encode_frame(AVCodecContext *avctx, unsigned char *frame, } return -1; } - s->buffer_index += lame_result; + /* Move 1 frame from the LAME buffer to the output packet, if available. + We have to parse the first frame header in the output buffer to + determine the frame size. */ if (s->buffer_index < 4) return 0; - if (avpriv_mpegaudio_decode_header(&hdr, AV_RB32(s->buffer))) { av_log(avctx, AV_LOG_ERROR, "free format output not supported\n"); return -1; @@ -152,14 +165,13 @@ static int MP3lame_encode_frame(AVCodecContext *avctx, unsigned char *frame, if (len <= s->buffer_index) { memcpy(frame, s->buffer, len); s->buffer_index -= len; - memmove(s->buffer, s->buffer + len, s->buffer_index); return len; } else return 0; } -#define OFFSET(x) offsetof(Mp3AudioContext, x) +#define OFFSET(x) offsetof(LAMEContext, x) #define AE AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM static const AVOption options[] = { { "reservoir", "Use bit reservoir.", OFFSET(reservoir), AV_OPT_TYPE_INT, { 1 }, 0, 1, AE }, @@ -178,18 +190,22 @@ static const AVCodecDefault libmp3lame_defaults[] = { { NULL }, }; +static const int libmp3lame_sample_rates[] = { + 44100, 48000, 32000, 22050, 24000, 16000, 11025, 12000, 8000, 0 +}; + AVCodec ff_libmp3lame_encoder = { .name = "libmp3lame", .type = AVMEDIA_TYPE_AUDIO, .id = CODEC_ID_MP3, - .priv_data_size = sizeof(Mp3AudioContext), - .init = MP3lame_encode_init, - .encode = MP3lame_encode_frame, - .close = MP3lame_encode_close, + .priv_data_size = sizeof(LAMEContext), + .init = mp3lame_encode_init, + .encode = mp3lame_encode_frame, + .close = mp3lame_encode_close, .capabilities = CODEC_CAP_DELAY, .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE }, - .supported_samplerates = sSampleRates, + .supported_samplerates = libmp3lame_sample_rates, .long_name = NULL_IF_CONFIG_SMALL("libmp3lame MP3 (MPEG audio layer 3)"), .priv_class = &libmp3lame_class, .defaults = libmp3lame_defaults, |