X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Flibmp3lame.c;h=31190cc5d055de281b48d7815d21dbc013e37beb;hb=11491503c492f3a3ce190e2ee8cec660d3b91e1d;hp=6fbf2e23d3944e81843e1f3035ce2836ef489853;hpb=f1618fd939be124555c98f453fc3a8f36e02fc37;p=ffmpeg diff --git a/libavcodec/libmp3lame.c b/libavcodec/libmp3lame.c index 6fbf2e23d39..31190cc5d05 100644 --- a/libavcodec/libmp3lame.c +++ b/libavcodec/libmp3lame.c @@ -20,7 +20,7 @@ */ /** - * @file mp3lameaudio.c + * @file libavcodec/libmp3lame.c * Interface to libmp3lame for mp3 encoding. */ @@ -28,7 +28,7 @@ #include "mpegaudio.h" #include -#define BUFFER_SIZE (7200 + MPA_FRAME_SIZE + MPA_FRAME_SIZE/4) +#define BUFFER_SIZE (7200 + 2*MPA_FRAME_SIZE + MPA_FRAME_SIZE/4) typedef struct Mp3AudioContext { lame_global_flags *gfp; int stereo; @@ -36,7 +36,7 @@ typedef struct Mp3AudioContext { int buffer_index; } Mp3AudioContext; -static int MP3lame_encode_init(AVCodecContext *avctx) +static av_cold int MP3lame_encode_init(AVCodecContext *avctx) { Mp3AudioContext *s = avctx->priv_data; @@ -50,8 +50,11 @@ static int MP3lame_encode_init(AVCodecContext *avctx) lame_set_in_samplerate(s->gfp, avctx->sample_rate); lame_set_out_samplerate(s->gfp, avctx->sample_rate); lame_set_num_channels(s->gfp, avctx->channels); - /* lame 3.91 dies on quality != 5 */ - lame_set_quality(s->gfp, 5); + if(avctx->compression_level == FF_COMPRESSION_DEFAULT) { + lame_set_quality(s->gfp, 5); + } else { + lame_set_quality(s->gfp, avctx->compression_level); + } /* lame 3.91 doesn't work in mono */ lame_set_mode(s->gfp, JOINT_STEREO); lame_set_brate(s->gfp, avctx->bit_rate/1000); @@ -171,10 +174,12 @@ static int MP3lame_encode_frame(AVCodecContext *avctx, ); } - if(lame_result==-1) { - /* output buffer too small */ - av_log(avctx, AV_LOG_ERROR, "lame: output buffer too small (buffer index: %d, free bytes: %d)\n", s->buffer_index, BUFFER_SIZE - s->buffer_index); - return 0; + if(lame_result < 0){ + if(lame_result==-1) { + /* output buffer too small */ + av_log(avctx, AV_LOG_ERROR, "lame: output buffer too small (buffer index: %d, free bytes: %d)\n", s->buffer_index, BUFFER_SIZE - s->buffer_index); + } + return -1; } s->buffer_index += lame_result; @@ -182,23 +187,23 @@ static int MP3lame_encode_frame(AVCodecContext *avctx, if(s->buffer_index<4) return 0; - len= mp3len(s->buffer, NULL, NULL); + len= mp3len(s->buffer, NULL, NULL); //av_log(avctx, AV_LOG_DEBUG, "in:%d packet-len:%d index:%d\n", avctx->frame_size, len, s->buffer_index); - if(len <= s->buffer_index){ - memcpy(frame, s->buffer, len); - s->buffer_index -= len; + if(len <= s->buffer_index){ + memcpy(frame, s->buffer, len); + s->buffer_index -= len; - memmove(s->buffer, s->buffer+len, s->buffer_index); + memmove(s->buffer, s->buffer+len, s->buffer_index); //FIXME fix the audio codec API, so we do not need the memcpy() /*for(i=0; ipriv_data; @@ -211,11 +216,13 @@ static int MP3lame_encode_close(AVCodecContext *avctx) AVCodec libmp3lame_encoder = { "libmp3lame", - CODEC_TYPE_AUDIO, + AVMEDIA_TYPE_AUDIO, CODEC_ID_MP3, sizeof(Mp3AudioContext), MP3lame_encode_init, MP3lame_encode_frame, MP3lame_encode_close, .capabilities= CODEC_CAP_DELAY, + .sample_fmts = (const enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE}, + .long_name= NULL_IF_CONFIG_SMALL("libmp3lame MP3 (MPEG audio layer 3)"), };