Mercurial > libavcodec.hg
changeset 10257:af449680f6ee libavcodec
Take into account real number of colours when reading BMP palette.
This fixes issue 1408
author | kostya |
---|---|
date | Thu, 24 Sep 2009 05:24:46 +0000 |
parents | 541055a030f3 |
children | 6829e70ef3aa |
files | bmp.c |
diffstat | 1 files changed, 14 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/bmp.c Wed Sep 23 15:30:38 2009 +0000 +++ b/bmp.c Thu Sep 24 05:24:46 2009 +0000 @@ -231,12 +231,23 @@ } 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;