On Mon, Dec 1, 2014 at 3:20 PM, Vittorio Giovara <[email protected]> wrote: > From: Paul B Mahol <[email protected]> > > Additional improvements and fixes by Michael Niedermayer <[email protected]>. > > Signed-off-by: Vittorio Giovara <[email protected]> > --- > libavcodec/Makefile | 1 + > libavcodec/allcodecs.c | 1 + > libavcodec/dpx_parser.c | 116 > ++++++++++++++++++++++++++++++++++++++++++++++++ > libavcodec/version.h | 2 +- > 4 files changed, 119 insertions(+), 1 deletion(-) > create mode 100644 libavcodec/dpx_parser.c > > diff --git a/libavcodec/Makefile b/libavcodec/Makefile > index 66aa0ce..092e2fd 100644 > --- a/libavcodec/Makefile > +++ b/libavcodec/Makefile > @@ -653,6 +653,7 @@ OBJS-$(CONFIG_COOK_PARSER) += cook_parser.o > OBJS-$(CONFIG_DCA_PARSER) += dca_parser.o dca.o > OBJS-$(CONFIG_DIRAC_PARSER) += dirac_parser.o > OBJS-$(CONFIG_DNXHD_PARSER) += dnxhd_parser.o > +OBJS-$(CONFIG_DPX_PARSER) += dpx_parser.o > OBJS-$(CONFIG_DVBSUB_PARSER) += dvbsub_parser.o > OBJS-$(CONFIG_DVDSUB_PARSER) += dvdsub_parser.o > OBJS-$(CONFIG_FLAC_PARSER) += flac_parser.o flacdata.o flac.o > diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c > index 6a71b2c..62735e2 100644 > --- a/libavcodec/allcodecs.c > +++ b/libavcodec/allcodecs.c > @@ -471,6 +471,7 @@ void avcodec_register_all(void) > REGISTER_PARSER(DCA, dca); > REGISTER_PARSER(DIRAC, dirac); > REGISTER_PARSER(DNXHD, dnxhd); > + REGISTER_PARSER(DPX, dpx); > REGISTER_PARSER(DVBSUB, dvbsub); > REGISTER_PARSER(DVDSUB, dvdsub); > REGISTER_PARSER(FLAC, flac); > diff --git a/libavcodec/dpx_parser.c b/libavcodec/dpx_parser.c > new file mode 100644 > index 0000000..e3a7ac5 > --- /dev/null > +++ b/libavcodec/dpx_parser.c > @@ -0,0 +1,116 @@ > +/* > + * DPX parser > + * Copyright (c) 2013 Paul B Mahol > + * > + * This file is part of Libav. > + * > + * Libav is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Lesser General Public > + * License as published by the Free Software Foundation; either > + * version 2.1 of the License, or (at your option) any later version. > + * > + * Libav is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with Libav; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 > USA > + */ > + > +/** > + * @file > + * DPX parser > + */ > + > +#include "libavutil/bswap.h" > +#include "libavutil/common.h" > + > +#include "parser.h" > + > +typedef struct DPXParseContext { > + ParseContext pc; > + uint32_t index; > + uint32_t fsize; > + uint32_t remaining_size; > + int is_be; > +} DPXParseContext; > + > +static int dpx_parse(AVCodecParserContext *s, AVCodecContext *avctx, > + const uint8_t **poutbuf, int *poutbuf_size, > + const uint8_t *buf, int buf_size) > +{ > + DPXParseContext *d = s->priv_data; > + uint32_t state = d->pc.state; > + int next = END_NOT_FOUND; > + int i = 0; > + > + s->pict_type = AV_PICTURE_TYPE_I; > + > + *poutbuf_size = 0; > + if (buf_size == 0) > + next = 0; > + > + if (!d->pc.frame_start_found) { > + for (; i < buf_size; i++) { > + state = (state << 8) | buf[i]; > + if (state == MKBETAG('S','D','P','X') || > + state == MKTAG('S','D','P','X')) { > + d->pc.frame_start_found = 1; > + d->is_be = state == MKBETAG('S','D','P','X'); > + d->index = 0; > + break; > + } > + } > + d->pc.state = state; > + } else { > + if (d->remaining_size) { > + i = FFMIN(d->remaining_size, buf_size); > + d->remaining_size -= i; > + if (d->remaining_size) > + goto flush; > + } > + } > + > + for (; d->pc.frame_start_found && i < buf_size; i++) { > + d->pc.state = (d->pc.state << 8) | buf[i]; > + d->index++; > + if (d->index == 17) { > + d->fsize = d->is_be ? d->pc.state : av_bswap32(d->pc.state); > + if (d->fsize <= 1664) { > + d->pc.frame_start_found = 0; > + goto flush; > + } > + if (d->fsize > buf_size - i + 19) > + d->remaining_size = d->fsize - buf_size + i - 19; > + else > + i += d->fsize - 19; > + > + break; > + } else if (d->index > 17) { > + if (d->pc.state == MKBETAG('S','D','P','X') || > + d->pc.state == MKTAG('S','D','P','X')) { > + next = i - 3; > + break; > + } > + } > + } > + > +flush: > + if (ff_combine_frame(&d->pc, next, &buf, &buf_size) < 0) > + return buf_size; > + > + d->pc.frame_start_found = 0; > + > + *poutbuf = buf; > + *poutbuf_size = buf_size; > + return next; > +} > + > +AVCodecParser ff_dpx_parser = { > + .codec_ids = { AV_CODEC_ID_DPX }, > + .priv_data_size = sizeof(DPXParseContext), > + .parser_parse = dpx_parse, > + .parser_close = ff_parse_close, > +}; > diff --git a/libavcodec/version.h b/libavcodec/version.h > index fd774a7..f51c9d7 100644 > --- a/libavcodec/version.h > +++ b/libavcodec/version.h > @@ -29,7 +29,7 @@ > #include "libavutil/version.h" > > #define LIBAVCODEC_VERSION_MAJOR 56 > -#define LIBAVCODEC_VERSION_MINOR 6 > +#define LIBAVCODEC_VERSION_MINOR 7 > #define LIBAVCODEC_VERSION_MICRO 0 > > #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ > -- > 1.9.3 (Apple Git-50) >
Does anyone have any more comments on the set? -- Vittorio _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
