summaryrefslogtreecommitdiff
path: root/libavcodec/png_parser.c
diff options
context:
space:
mode:
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;