Commit 47cc6168 authored by Michael Niedermayer's avatar Michael Niedermayer

Merge commit '6fd99e78'

* commit '6fd99e78':
  png: add a standalone parser

Conflicts:
	Changelog
	libavcodec/png_parser.c
	libavcodec/version.h

See: 2ee6dca3Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents c90f3114 6fd99e78
......@@ -777,6 +777,7 @@ OBJS-$(CONFIG_MPEGAUDIO_PARSER) += mpegaudio_parser.o \
mpegaudiodecheader.o mpegaudiodata.o
OBJS-$(CONFIG_MPEGVIDEO_PARSER) += mpegvideo_parser.o \
mpeg12.o mpeg12data.o
OBJS-$(CONFIG_PNG_PARSER) += png_parser.o
OBJS-$(CONFIG_PNM_PARSER) += pnm_parser.o pnm.o
OBJS-$(CONFIG_RV30_PARSER) += rv34_parser.o
OBJS-$(CONFIG_RV40_PARSER) += rv34_parser.o
......
......@@ -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;
......
......@@ -30,7 +30,7 @@
#define LIBAVCODEC_VERSION_MAJOR 55
#define LIBAVCODEC_VERSION_MINOR 45
#define LIBAVCODEC_VERSION_MICRO 101
#define LIBAVCODEC_VERSION_MICRO 102
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
LIBAVCODEC_VERSION_MINOR, \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment