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 \ ...@@ -777,6 +777,7 @@ OBJS-$(CONFIG_MPEGAUDIO_PARSER) += mpegaudio_parser.o \
mpegaudiodecheader.o mpegaudiodata.o mpegaudiodecheader.o mpegaudiodata.o
OBJS-$(CONFIG_MPEGVIDEO_PARSER) += mpegvideo_parser.o \ OBJS-$(CONFIG_MPEGVIDEO_PARSER) += mpegvideo_parser.o \
mpeg12.o mpeg12data.o mpeg12.o mpeg12data.o
OBJS-$(CONFIG_PNG_PARSER) += png_parser.o
OBJS-$(CONFIG_PNM_PARSER) += pnm_parser.o pnm.o OBJS-$(CONFIG_PNM_PARSER) += pnm_parser.o pnm.o
OBJS-$(CONFIG_RV30_PARSER) += rv34_parser.o OBJS-$(CONFIG_RV30_PARSER) += rv34_parser.o
OBJS-$(CONFIG_RV40_PARSER) += rv34_parser.o OBJS-$(CONFIG_RV40_PARSER) += rv34_parser.o
......
...@@ -27,12 +27,11 @@ ...@@ -27,12 +27,11 @@
#include "parser.h" #include "parser.h"
#include "png.h" #include "png.h"
typedef struct PNGParseContext typedef struct PNGParseContext {
{
ParseContext pc; ParseContext pc;
uint32_t index; uint32_t chunk_pos; ///< position inside current chunk
uint32_t chunk_length; uint32_t chunk_length; ///< length of the current chunk
uint32_t remaining_size; uint32_t remaining_size; ///< remaining size of the current chunk
} PNGParseContext; } PNGParseContext;
static int png_parse(AVCodecParserContext *s, AVCodecContext *avctx, static int png_parse(AVCodecParserContext *s, AVCodecContext *avctx,
...@@ -60,38 +59,37 @@ static int png_parse(AVCodecParserContext *s, AVCodecContext *avctx, ...@@ -60,38 +59,37 @@ static int png_parse(AVCodecParserContext *s, AVCodecContext *avctx,
} }
} }
ppc->pc.state64 = state64; ppc->pc.state64 = state64;
} else } else if (ppc->remaining_size) {
if (ppc->remaining_size) { i = FFMIN(ppc->remaining_size, buf_size);
i = FFMIN(ppc->remaining_size, buf_size); ppc->remaining_size -= i;
ppc->remaining_size -= i; if (ppc->remaining_size)
if (ppc->remaining_size) goto flush;
goto flush; if (ppc->chunk_pos == -1) {
if (ppc->index == -1) { next = i;
next = i; goto flush;
goto flush;
}
} }
}
for (;ppc->pc.frame_start_found && i < buf_size; i++) { for (; ppc->pc.frame_start_found && i < buf_size; i++) {
ppc->pc.state = (ppc->pc.state<<8) | buf[i]; ppc->pc.state = (ppc->pc.state << 8) | buf[i];
if (ppc->index == 3) { if (ppc->chunk_pos == 3) {
ppc->chunk_length = ppc->pc.state; ppc->chunk_length = ppc->pc.state;
if (ppc->chunk_length > 0x7fffffff) { if (ppc->chunk_length > 0x7fffffff) {
ppc->index = ppc->pc.frame_start_found = 0; ppc->chunk_pos = ppc->pc.frame_start_found = 0;
goto flush; goto flush;
} }
ppc->chunk_length += 4; ppc->chunk_length += 4;
} else if (ppc->index == 7) { } else if (ppc->chunk_pos == 7) {
if (ppc->chunk_length >= buf_size - i) 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->pc.state == MKBETAG('I', 'E', 'N', 'D')) {
if (ppc->remaining_size) if (ppc->remaining_size)
ppc->index = -1; ppc->chunk_pos = -1;
else else
next = ppc->chunk_length + i + 1; next = ppc->chunk_length + i + 1;
break; break;
} else { } else {
ppc->index = 0; ppc->chunk_pos = 0;
if (ppc->remaining_size) if (ppc->remaining_size)
break; break;
else else
...@@ -99,13 +97,14 @@ static int png_parse(AVCodecParserContext *s, AVCodecContext *avctx, ...@@ -99,13 +97,14 @@ static int png_parse(AVCodecParserContext *s, AVCodecContext *avctx,
continue; continue;
} }
} }
ppc->index++; ppc->chunk_pos++;
} }
flush: flush:
if (ff_combine_frame(&ppc->pc, next, &buf, &buf_size) < 0) if (ff_combine_frame(&ppc->pc, next, &buf, &buf_size) < 0)
return buf_size; return buf_size;
ppc->index = ppc->pc.frame_start_found = 0; ppc->chunk_pos = ppc->pc.frame_start_found = 0;
*poutbuf = buf; *poutbuf = buf;
*poutbuf_size = buf_size; *poutbuf_size = buf_size;
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
#define LIBAVCODEC_VERSION_MAJOR 55 #define LIBAVCODEC_VERSION_MAJOR 55
#define LIBAVCODEC_VERSION_MINOR 45 #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, \ #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
LIBAVCODEC_VERSION_MINOR, \ 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