summaryrefslogtreecommitdiff
path: root/libavcodec/png_parser.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-12-17 17:58:06 +0100
committerMichael Niedermayer <michaelni@gmx.at>2013-12-17 17:58:53 +0100
commit47cc6168649485837b1e4fdd5f33f16c275933bd (patch)
tree2b79b9d31fc0bb8cece748cb595564bc1eb13cfe /libavcodec/png_parser.c
parentc90f31146e8b1407a4a5808d0d904d85baeed5d4 (diff)
parent6fd99e78def3c795bdd0bc31f3ae0998d24bc94c (diff)
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.c49
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;