diff options
Diffstat (limited to 'contrib/ffmpeg/libavcodec/bmp.c')
-rw-r--r-- | contrib/ffmpeg/libavcodec/bmp.c | 74 |
1 files changed, 37 insertions, 37 deletions
diff --git a/contrib/ffmpeg/libavcodec/bmp.c b/contrib/ffmpeg/libavcodec/bmp.c index 2a4d83393..d1cfdce6d 100644 --- a/contrib/ffmpeg/libavcodec/bmp.c +++ b/contrib/ffmpeg/libavcodec/bmp.c @@ -1,5 +1,5 @@ /* - * BMP image format + * BMP image format decoder * Copyright (c) 2005 Mans Rullgard * * This file is part of FFmpeg. @@ -20,20 +20,8 @@ */ #include "avcodec.h" -#include "bitstream.h" -#include "bswap.h" - -typedef struct BMPContext { - AVFrame picture; -} BMPContext; - -#define BMP_RGB 0 -#define BMP_RLE8 1 -#define BMP_RLE4 2 -#define BMP_BITFIELDS 3 - -#define read16(bits) bswap_16(get_bits(bits, 16)) -#define read32(bits) bswap_32(get_bits_long(bits, 32)) +#include "bytestream.h" +#include "bmp.h" static int bmp_decode_init(AVCodecContext *avctx){ BMPContext *s = avctx->priv_data; @@ -51,64 +39,63 @@ static int bmp_decode_frame(AVCodecContext *avctx, BMPContext *s = avctx->priv_data; AVFrame *picture = data; AVFrame *p = &s->picture; - GetBitContext bits; unsigned int fsize, hsize; int width, height; unsigned int depth; - unsigned int comp; + BiCompression comp; unsigned int ihsize; int i, j, n, linesize; uint32_t rgb[3]; uint8_t *ptr; int dsize; + uint8_t *buf0 = buf; if(buf_size < 14){ av_log(avctx, AV_LOG_ERROR, "buf size too small (%d)\n", buf_size); return -1; } - init_get_bits(&bits, buf, buf_size); - - if(get_bits(&bits, 16) != 0x424d){ /* 'BM' */ + if(bytestream_get_byte(&buf) != 'B' || + bytestream_get_byte(&buf) != 'M') { av_log(avctx, AV_LOG_ERROR, "bad magic number\n"); return -1; } - fsize = read32(&bits); + fsize = bytestream_get_le32(&buf); if(buf_size < fsize){ av_log(avctx, AV_LOG_ERROR, "not enough data (%d < %d)\n", buf_size, fsize); return -1; } - skip_bits(&bits, 16); /* reserved1 */ - skip_bits(&bits, 16); /* reserved2 */ + buf += 2; /* reserved1 */ + buf += 2; /* reserved2 */ - hsize = read32(&bits); /* header size */ + hsize = bytestream_get_le32(&buf); /* header size */ if(fsize <= hsize){ av_log(avctx, AV_LOG_ERROR, "not enough data (%d < %d)\n", fsize, hsize); return -1; } - ihsize = read32(&bits); /* more header size */ + ihsize = bytestream_get_le32(&buf); /* more header size */ if(ihsize + 14 > hsize){ av_log(avctx, AV_LOG_ERROR, "invalid header size %d\n", hsize); return -1; } - width = read32(&bits); - height = read32(&bits); + width = bytestream_get_le32(&buf); + height = bytestream_get_le32(&buf); - if(read16(&bits) != 1){ /* planes */ + if(bytestream_get_le16(&buf) != 1){ /* planes */ av_log(avctx, AV_LOG_ERROR, "invalid BMP header\n"); return -1; } - depth = read16(&bits); + depth = bytestream_get_le16(&buf); if(ihsize > 16) - comp = read32(&bits); + comp = bytestream_get_le32(&buf); else comp = BMP_RGB; @@ -118,10 +105,10 @@ static int bmp_decode_frame(AVCodecContext *avctx, } if(comp == BMP_BITFIELDS){ - skip_bits(&bits, 20 * 8); - rgb[0] = read32(&bits); - rgb[1] = read32(&bits); - rgb[2] = read32(&bits); + buf += 20; + rgb[0] = bytestream_get_le32(&buf); + rgb[1] = bytestream_get_le32(&buf); + rgb[2] = bytestream_get_le32(&buf); } avctx->codec_id = CODEC_ID_BMP; @@ -166,6 +153,9 @@ static int bmp_decode_frame(AVCodecContext *avctx, return -1; } + if(p->data[0]) + avctx->release_buffer(avctx, p); + p->reference = 0; if(avctx->get_buffer(avctx, p) < 0){ av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); @@ -174,7 +164,7 @@ static int bmp_decode_frame(AVCodecContext *avctx, p->pict_type = FF_I_TYPE; p->key_frame = 1; - buf += hsize; + buf = buf0 + hsize; dsize = buf_size - hsize; /* Line size in file multiple of 4 */ @@ -197,7 +187,7 @@ static int bmp_decode_frame(AVCodecContext *avctx, switch(depth){ case 24: for(i = 0; i < avctx->height; i++){ - memcpy(ptr, buf, n); + memcpy(ptr, buf, avctx->width*(depth>>3)); buf += n; ptr += linesize; } @@ -242,6 +232,16 @@ static int bmp_decode_frame(AVCodecContext *avctx, return buf_size; } +static int bmp_decode_end(AVCodecContext *avctx) +{ + BMPContext* c = avctx->priv_data; + + if (c->picture.data[0]) + avctx->release_buffer(avctx, &c->picture); + + return 0; +} + AVCodec bmp_decoder = { "bmp", CODEC_TYPE_VIDEO, @@ -249,6 +249,6 @@ AVCodec bmp_decoder = { sizeof(BMPContext), bmp_decode_init, NULL, - NULL, + bmp_decode_end, bmp_decode_frame }; |