summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorHauke Duden <H.NS.Duden@gmx.net>2004-04-16 01:48:05 +0000
committerMichael Niedermayer <michaelni@gmx.at>2004-04-16 01:48:05 +0000
commit0f5c3f2132a44330ee2f9f66e68be5614bd7cb7a (patch)
tree1c26e38b670dce2c1926e37158d860612e43318e /libavcodec
parent365e75f89b069b23200c0cedb22eaa1e23076b96 (diff)
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
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/mp3lameaudio.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/libavcodec/mp3lameaudio.c b/libavcodec/mp3lameaudio.c
index 637c7271f4..f53aee9272 100644
--- a/libavcodec/mp3lameaudio.c
+++ b/libavcodec/mp3lameaudio.c
@@ -57,7 +57,7 @@ static int MP3lame_encode_init(AVCodecContext *avctx)
if (lame_init_params(s->gfp) < 0)
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->key_frame= 1;
@@ -133,31 +133,41 @@ int MP3lame_encode_frame(AVCodecContext *avctx,
{
Mp3AudioContext *s = avctx->priv_data;
int len, i;
+ int lame_result;
/* lame 3.91 dies on '1-channel interleaved' data */
if (s->stereo) {
- s->buffer_index += lame_encode_buffer_interleaved(
+ lame_result = lame_encode_buffer_interleaved(
s->gfp,
data,
- MPA_FRAME_SIZE,
+ avctx->frame_size,
s->buffer + s->buffer_index,
BUFFER_SIZE - s->buffer_index
);
} else {
- s->buffer_index += lame_encode_buffer(
+ lame_result = lame_encode_buffer(
s->gfp,
data,
data,
- MPA_FRAME_SIZE,
+ avctx->frame_size,
s->buffer + 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);
-//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){
memcpy(frame, s->buffer, len);
s->buffer_index -= len;