diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2013-12-17 17:58:06 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-12-17 17:58:53 +0100 |
commit | 47cc6168649485837b1e4fdd5f33f16c275933bd (patch) | |
tree | 2b79b9d31fc0bb8cece748cb595564bc1eb13cfe /libavcodec/png_parser.c | |
parent | c90f31146e8b1407a4a5808d0d904d85baeed5d4 (diff) | |
parent | 6fd99e78def3c795bdd0bc31f3ae0998d24bc94c (diff) | |
download | ffmpeg-47cc6168649485837b1e4fdd5f33f16c275933bd.tar.gz |
Merge commit '6fd99e78def3c795bdd0bc31f3ae0998d24bc94c'
* commit '6fd99e78def3c795bdd0bc31f3ae0998d24bc94c':
png: add a standalone parser
Conflicts:
Changelog
libavcodec/png_parser.c
libavcodec/version.h
See: 2ee6dca3b8f40132be5c8b77e3700a9e3f26c382
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/png_parser.c')
-rw-r--r-- | libavcodec/png_parser.c | 49 |
1 files changed, 24 insertions, 25 deletions
diff --git a/libavcodec/png_parser.c b/libavcodec/png_parser.c index 6f153d91d6..530d5a0bad 100644 --- a/libavcodec/png_parser.c +++ b/libavcodec/png_parser.c @@ -27,12 +27,11 @@ #include "parser.h" #include "png.h" -typedef struct PNGParseContext -{ +typedef struct PNGParseContext { ParseContext pc; - uint32_t index; - uint32_t chunk_length; - uint32_t remaining_size; + uint32_t chunk_pos; ///< position inside current chunk + uint32_t chunk_length; ///< length of the current chunk + uint32_t remaining_size; ///< remaining size of the current chunk } PNGParseContext; static int png_parse(AVCodecParserContext *s, AVCodecContext *avctx, @@ -60,38 +59,37 @@ static int png_parse(AVCodecParserContext *s, AVCodecContext *avctx, } } ppc->pc.state64 = state64; - } else - if (ppc->remaining_size) { - i = FFMIN(ppc->remaining_size, buf_size); - ppc->remaining_size -= i; - if (ppc->remaining_size) - goto flush; - if (ppc->index == -1) { - next = i; - goto flush; - } + } else if (ppc->remaining_size) { + i = FFMIN(ppc->remaining_size, buf_size); + ppc->remaining_size -= i; + if (ppc->remaining_size) + goto flush; + if (ppc->chunk_pos == -1) { + next = i; + goto flush; } + } - for (;ppc->pc.frame_start_found && i < buf_size; i++) { - ppc->pc.state = (ppc->pc.state<<8) | buf[i]; - if (ppc->index == 3) { + for (; ppc->pc.frame_start_found && i < buf_size; i++) { + ppc->pc.state = (ppc->pc.state << 8) | buf[i]; + if (ppc->chunk_pos == 3) { ppc->chunk_length = ppc->pc.state; if (ppc->chunk_length > 0x7fffffff) { - ppc->index = ppc->pc.frame_start_found = 0; + ppc->chunk_pos = ppc->pc.frame_start_found = 0; goto flush; } ppc->chunk_length += 4; - } else if (ppc->index == 7) { + } else if (ppc->chunk_pos == 7) { if (ppc->chunk_length >= buf_size - i) - ppc->remaining_size = ppc->chunk_length - buf_size + i + 1; + ppc->remaining_size = ppc->chunk_length - buf_size + i + 1; if (ppc->pc.state == MKBETAG('I', 'E', 'N', 'D')) { if (ppc->remaining_size) - ppc->index = -1; + ppc->chunk_pos = -1; else next = ppc->chunk_length + i + 1; break; } else { - ppc->index = 0; + ppc->chunk_pos = 0; if (ppc->remaining_size) break; else @@ -99,13 +97,14 @@ static int png_parse(AVCodecParserContext *s, AVCodecContext *avctx, continue; } } - ppc->index++; + ppc->chunk_pos++; } + flush: if (ff_combine_frame(&ppc->pc, next, &buf, &buf_size) < 0) return buf_size; - ppc->index = ppc->pc.frame_start_found = 0; + ppc->chunk_pos = ppc->pc.frame_start_found = 0; *poutbuf = buf; *poutbuf_size = buf_size; |