From: Michael Niedermayer Date: Sat, 26 Aug 2006 18:56:24 +0000 (+0000) Subject: dont copy frame if the whole mp1/2/3 frame is available in one piece in the input X-Git-Tag: v0.5~12008 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4e2d6a456d0c72b374abc1c9903969134b7c0304;p=platform%2Fupstream%2Flibav.git dont copy frame if the whole mp1/2/3 frame is available in one piece in the input Originally committed as revision 6103 to svn://svn.ffmpeg.org/ffmpeg/trunk --- diff --git a/libavcodec/parser.c b/libavcodec/parser.c index 59087cd..9c50770 100644 --- a/libavcodec/parser.c +++ b/libavcodec/parser.c @@ -634,9 +634,7 @@ static int mpegaudio_parse(AVCodecParserContext *s1, } /* no header seen : find one. We need at least MPA_HEADER_SIZE bytes to parse it */ - len = MPA_HEADER_SIZE - len; - if (len > buf_size) - len = buf_size; + len = FFMIN(MPA_HEADER_SIZE - len, buf_size); if (len > 0) { memcpy(s->inbuf_ptr, buf_ptr, len); buf_ptr += len; @@ -736,14 +734,25 @@ static int mpegaudio_parse(AVCodecParserContext *s1, if (len < s->frame_size) { if (s->frame_size > MPA_MAX_CODED_FRAME_SIZE) s->frame_size = MPA_MAX_CODED_FRAME_SIZE; - len = s->frame_size - len; - if (len > buf_size) - len = buf_size; + len = FFMIN(s->frame_size - len, buf_size); memcpy(s->inbuf_ptr, buf_ptr, len); buf_ptr += len; s->inbuf_ptr += len; buf_size -= len; } + + if(s->frame_size > 0 && buf_ptr - buf == s->inbuf_ptr - s->inbuf + && buf_size + buf_ptr - buf >= s->frame_size){ + if(s->header_count > 0){ + *poutbuf = buf; + *poutbuf_size = s->frame_size; + } + buf_ptr = buf + s->frame_size; + s->inbuf_ptr = s->inbuf; + s->frame_size = 0; + break; + } + // next_data: if (s->frame_size > 0 && (s->inbuf_ptr - s->inbuf) >= s->frame_size) {