diff options
author | Michael Chinen <m@roughsoft.com> | 2012-10-14 11:08:43 +0400 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-10-14 22:39:10 +0400 |
commit | c73b1a1d8010dac29653b41d39af9c18247179c3 (patch) | |
tree | d85a6774c9cc7657262811d63d918752cbbb32c3 /libavcodec | |
parent | 41bf943f709e7327601f5aa02599fdcb3c1ca59d (diff) |
flac_parser.c: fix issue with looping output for small files.
see trac 1345
https://ffmpeg.org/trac/ffmpeg/ticket/1345
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/flac_parser.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/libavcodec/flac_parser.c b/libavcodec/flac_parser.c index e37ca64be8..f38d7aae67 100644 --- a/libavcodec/flac_parser.c +++ b/libavcodec/flac_parser.c @@ -541,14 +541,18 @@ static int flac_parse(AVCodecParserContext *s, AVCodecContext *avctx, av_freep(&fpc->best_header); } - /* Find and score new headers. */ - while ((buf && read_end < buf + buf_size && + /* Find and score new headers. */ + /* buf_size is to zero when padding, so check for this since we do */ + /* not want to try to read more input once we have found the end. */ + /* Note that as (non-modified) parameters, buf can be non-NULL, */ + /* while buf_size is 0. */ + while ((buf && buf_size && read_end < buf + buf_size && fpc->nb_headers_buffered < FLAC_MIN_HEADERS) - || (!buf && !fpc->end_padded)) { + || ((!buf || !buf_size) && !fpc->end_padded)) { int start_offset; /* Pad the end once if EOF, to check the final region for headers. */ - if (!buf) { + if (!buf || !buf_size) { fpc->end_padded = 1; buf_size = MAX_FRAME_HEADER_SIZE; read_end = read_start + MAX_FRAME_HEADER_SIZE; @@ -569,7 +573,7 @@ static int flac_parse(AVCodecParserContext *s, AVCodecContext *avctx, goto handle_error; } - if (buf) { + if (buf && buf_size) { av_fifo_generic_write(fpc->fifo_buf, (void*) read_start, read_end - read_start, NULL); } else { |