fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)

Originally committed as revision 3020 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Hauke Duden 2004-04-16 01:48:05 +00:00 committed by Michael Niedermayer
parent 365e75f89b
commit 0f5c3f2132

View File

@ -57,7 +57,7 @@ static int MP3lame_encode_init(AVCodecContext *avctx)
if (lame_init_params(s->gfp) < 0) if (lame_init_params(s->gfp) < 0)
goto err_close; goto err_close;
avctx->frame_size = MPA_FRAME_SIZE; avctx->frame_size = lame_get_framesize(s->gfp);
avctx->coded_frame= avcodec_alloc_frame(); avctx->coded_frame= avcodec_alloc_frame();
avctx->coded_frame->key_frame= 1; avctx->coded_frame->key_frame= 1;
@ -133,31 +133,41 @@ int MP3lame_encode_frame(AVCodecContext *avctx,
{ {
Mp3AudioContext *s = avctx->priv_data; Mp3AudioContext *s = avctx->priv_data;
int len, i; int len, i;
int lame_result;
/* lame 3.91 dies on '1-channel interleaved' data */ /* lame 3.91 dies on '1-channel interleaved' data */
if (s->stereo) { if (s->stereo) {
s->buffer_index += lame_encode_buffer_interleaved( lame_result = lame_encode_buffer_interleaved(
s->gfp, s->gfp,
data, data,
MPA_FRAME_SIZE, avctx->frame_size,
s->buffer + s->buffer_index, s->buffer + s->buffer_index,
BUFFER_SIZE - s->buffer_index BUFFER_SIZE - s->buffer_index
); );
} else { } else {
s->buffer_index += lame_encode_buffer( lame_result = lame_encode_buffer(
s->gfp, s->gfp,
data, data,
data, data,
MPA_FRAME_SIZE, avctx->frame_size,
s->buffer + s->buffer_index, s->buffer + s->buffer_index,
BUFFER_SIZE - s->buffer_index BUFFER_SIZE - s->buffer_index
); );
} }
if(s->buffer_index<4)
return 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 0;
}
s->buffer_index += lame_result;
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", MPA_FRAME_SIZE, len, s->buffer_index); //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){ if(len <= s->buffer_index){
memcpy(frame, s->buffer, len); memcpy(frame, s->buffer, len);
s->buffer_index -= len; s->buffer_index -= len;