From 011ce89dba5c0c764abc5f39acb6368f580742e3 Mon Sep 17 00:00:00 2001 From: Paul B Mahol Date: Sun, 5 Aug 2012 23:46:41 +0000 Subject: [PATCH] avcodec: add bmp parser Signed-off-by: Paul B Mahol --- 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 b7db8edde6..ce0d53c4e8 100644 --- a/Changelog +++ b/Changelog @@ -41,6 +41,7 @@ version next: - Canopus Lossless Codec decoder - bitmap subtitles in filters (experimental and temporary) - MP2 encoding via TwoLAME +- bmp parser version 0.11: diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 1cd44d42d7..bc6d430e4f 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -718,6 +718,7 @@ OBJS-$(CONFIG_AAC_PARSER) += aac_parser.o aac_ac3_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 8305bc278e..6b42c30d66 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -456,6 +456,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..d9d14e447e --- /dev/null +++ b/libavcodec/bmp_parser.c @@ -0,0 +1,91 @@ +/* + * BMP parser + * Copyright (c) 2012 Paul B Mahol + * + * This file is part of FFmpeg. + * + * FFmpeg 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. + * + * FFmpeg 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 FFmpeg; 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 "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; + + s->pict_type = AV_PICTURE_TYPE_NONE; + + *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 = { 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 6794d851a4..1f2af62246 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -27,7 +27,7 @@ */ #define LIBAVCODEC_VERSION_MAJOR 54 -#define LIBAVCODEC_VERSION_MINOR 49 +#define LIBAVCODEC_VERSION_MINOR 50 #define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \