mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-25 04:30:02 +00:00
Merge commit '6fd99e78def3c795bdd0bc31f3ae0998d24bc94c'
* commit '6fd99e78def3c795bdd0bc31f3ae0998d24bc94c':
png: add a standalone parser
Conflicts:
Changelog
libavcodec/png_parser.c
libavcodec/version.h
See: 2ee6dca3b8
Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
47cc616864
@ -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, \
|
||||
|
Loading…
Reference in New Issue
Block a user