X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fbmp.c;h=21ebeec6949b8e2d635bbd78880ae6fae85f113a;hb=581810f5024dbb9df8e794dc0f5beac30d3a5fd4;hp=cadaeee543e57b50cdf8cee38c6c8836f00cfde1;hpb=4a89072833113e41df20ead631a9f695dcbc7244;p=ffmpeg diff --git a/libavcodec/bmp.c b/libavcodec/bmp.c index cadaeee543e..21ebeec6949 100644 --- a/libavcodec/bmp.c +++ b/libavcodec/bmp.c @@ -2,20 +2,20 @@ * BMP image format decoder * Copyright (c) 2005 Mans Rullgard * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * 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. * - * FFmpeg is distributed in the hope that it will be useful, + * 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 FFmpeg; if not, write to the Free Software + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -200,7 +200,7 @@ static int bmp_decode_frame(AVCodecContext *avctx, av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return -1; } - p->pict_type = FF_I_TYPE; + p->pict_type = AV_PICTURE_TYPE_I; p->key_frame = 1; buf = buf0 + hsize; @@ -231,18 +231,37 @@ static int bmp_decode_frame(AVCodecContext *avctx, } if(avctx->pix_fmt == PIX_FMT_PAL8){ + int colors = 1 << depth; + if(ihsize >= 36){ + int t; + buf = buf0 + 46; + t = bytestream_get_le32(&buf); + if(t < 0 || t > (1 << depth)){ + av_log(avctx, AV_LOG_ERROR, "Incorrect number of colors - %X for bitdepth %d\n", t, depth); + }else if(t){ + colors = t; + } + } buf = buf0 + 14 + ihsize; //palette location - if((hsize-ihsize-14)>>depth < 4){ // OS/2 bitmap, 3 bytes per palette entry - for(i = 0; i < (1 << depth); i++) + if((hsize-ihsize-14) < (colors << 2)){ // OS/2 bitmap, 3 bytes per palette entry + for(i = 0; i < colors; i++) ((uint32_t*)p->data[1])[i] = bytestream_get_le24(&buf); }else{ - for(i = 0; i < (1 << depth); i++) + for(i = 0; i < colors; i++) ((uint32_t*)p->data[1])[i] = bytestream_get_le32(&buf); } buf = buf0 + hsize; } if(comp == BMP_RLE4 || comp == BMP_RLE8){ + if(height < 0){ + p->data[0] += p->linesize[0] * (avctx->height - 1); + p->linesize[0] = -p->linesize[0]; + } ff_msrle_decode(avctx, (AVPicture*)p, depth, buf, dsize); + if(height < 0){ + p->data[0] += p->linesize[0] * (avctx->height - 1); + p->linesize[0] = -p->linesize[0]; + } }else{ switch(depth){ case 1: @@ -271,7 +290,7 @@ static int bmp_decode_frame(AVCodecContext *avctx, uint16_t *dst = (uint16_t *) ptr; for(j = 0; j < avctx->width; j++) - *dst++ = le2me_16(*src++); + *dst++ = av_le2ne16(*src++); buf += n; ptr += linesize; @@ -316,15 +335,14 @@ static av_cold int bmp_decode_end(AVCodecContext *avctx) return 0; } -AVCodec bmp_decoder = { - "bmp", - CODEC_TYPE_VIDEO, - CODEC_ID_BMP, - sizeof(BMPContext), - bmp_decode_init, - NULL, - bmp_decode_end, - bmp_decode_frame, - CODEC_CAP_DR1, +AVCodec ff_bmp_decoder = { + .name = "bmp", + .type = AVMEDIA_TYPE_VIDEO, + .id = CODEC_ID_BMP, + .priv_data_size = sizeof(BMPContext), + .init = bmp_decode_init, + .close = bmp_decode_end, + .decode = bmp_decode_frame, + .capabilities = CODEC_CAP_DR1, .long_name = NULL_IF_CONFIG_SMALL("BMP image"), };