From fb5cf145b6bcfa4f83af94398e5560c1132cc410 Mon Sep 17 00:00:00 2001 From: Paul B Mahol Date: Sun, 5 Aug 2012 23:46:41 +0000 Subject: [PATCH] bmp: add a standalone parser Signed-off-by: Vittorio Giovara --- Changelog | 1 + libavcodec/Makefile | 1 + libavcodec/allcodecs.c | 1 + libavcodec/bmp_parser.c | 91 +++++++++++++++++++++++++++++++++++++++++ libavcodec/version.h | 2 +- 5 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 libavcodec/bmp_parser.c diff --git a/Changelog b/Changelog index c7f4ca6331..e8864be1c1 100644 --- a/Changelog +++ b/Changelog @@ -9,6 +9,7 @@ version : - BRender PIX image decoder - Amazing Studio PAF playback support - XBM decoder +- bmp standalone parser version 10: diff --git a/libavcodec/Makefile b/libavcodec/Makefile index cb5962330b..cc29cbdd8d 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -621,6 +621,7 @@ OBJS-$(CONFIG_AAC_LATM_PARSER) += latm_parser.o OBJS-$(CONFIG_AC3_PARSER) += ac3_parser.o ac3tab.o \ aac_ac3_parser.o OBJS-$(CONFIG_ADX_PARSER) += adx_parser.o adx.o +OBJS-$(CONFIG_BMP_PARSER) += bmp_parser.o OBJS-$(CONFIG_CAVSVIDEO_PARSER) += cavs_parser.o OBJS-$(CONFIG_COOK_PARSER) += cook_parser.o OBJS-$(CONFIG_DCA_PARSER) += dca_parser.o dca.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index a435b17c78..a069694142 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -454,6 +454,7 @@ void avcodec_register_all(void) REGISTER_PARSER(AAC_LATM, aac_latm); REGISTER_PARSER(AC3, ac3); REGISTER_PARSER(ADX, adx); + REGISTER_PARSER(BMP, bmp); REGISTER_PARSER(CAVSVIDEO, cavsvideo); REGISTER_PARSER(COOK, cook); REGISTER_PARSER(DCA, dca); diff --git a/libavcodec/bmp_parser.c b/libavcodec/bmp_parser.c new file mode 100644 index 0000000000..b85dd8bcb5 --- /dev/null +++ b/libavcodec/bmp_parser.c @@ -0,0 +1,91 @@ +/* + * BMP parser + * Copyright (c) 2012 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 + * BMP parser + */ + +#include "libavutil/bswap.h" +#include "libavutil/common.h" + +#include "parser.h" + +typedef struct BMPParseContext { + ParseContext pc; + uint32_t fsize; + uint32_t remaining_size; +} BMPParseContext; + +static int bmp_parse(AVCodecParserContext *s, AVCodecContext *avctx, + const uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size) +{ + BMPParseContext *bpc = s->priv_data; + uint64_t state = bpc->pc.state64; + int next = END_NOT_FOUND; + int i = 0; + + *poutbuf_size = 0; + if (buf_size == 0) + return 0; + + if (!bpc->pc.frame_start_found) { + for (; i < buf_size; i++) { + state = (state << 8) | buf[i]; + if ((state >> 48) == (('B' << 8) | 'M')) { + bpc->fsize = av_bswap32(state >> 16); + bpc->pc.frame_start_found = 1; + if (bpc->fsize > buf_size - i + 7) + bpc->remaining_size = bpc->fsize - buf_size + i - 7; + else + next = bpc->fsize + i - 7; + break; + } + } + bpc->pc.state64 = state; + } else { + if (bpc->remaining_size) { + i = FFMIN(bpc->remaining_size, buf_size); + bpc->remaining_size -= i; + if (bpc->remaining_size) + goto flush; + next = i; + } + } + +flush: + if (ff_combine_frame(&bpc->pc, next, &buf, &buf_size) < 0) + return buf_size; + + bpc->pc.frame_start_found = 0; + + *poutbuf = buf; + *poutbuf_size = buf_size; + return next; +} + +AVCodecParser ff_bmp_parser = { + .codec_ids = { AV_CODEC_ID_BMP }, + .priv_data_size = sizeof(BMPParseContext), + .parser_parse = bmp_parse, + .parser_close = ff_parse_close, +}; diff --git a/libavcodec/version.h b/libavcodec/version.h index dc6e2e903f..3b1f65bd77 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -29,7 +29,7 @@ #include "libavutil/version.h" #define LIBAVCODEC_VERSION_MAJOR 55 -#define LIBAVCODEC_VERSION_MINOR 40 +#define LIBAVCODEC_VERSION_MINOR 41 #define LIBAVCODEC_VERSION_MICRO 0 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \