}
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:
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;
return 0;
}
-AVCodec bmp_decoder = {
+AVCodec ff_bmp_decoder = {
"bmp",
- CODEC_TYPE_VIDEO,
+ AVMEDIA_TYPE_VIDEO,
CODEC_ID_BMP,
sizeof(BMPContext),
bmp_decode_init,
NULL,
bmp_decode_end,
bmp_decode_frame,
+ CODEC_CAP_DR1,
.long_name = NULL_IF_CONFIG_SMALL("BMP image"),
};