bmpdec: proper check for alpha
authorPaul B Mahol <onemda@gmail.com>
Thu, 12 Jan 2012 01:47:59 +0000 (01:47 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 12 Jan 2012 15:32:55 +0000 (16:32 +0100)
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavcodec/bmp.c

index e77360a..b7853d1 100644 (file)
@@ -49,6 +49,7 @@ static int bmp_decode_frame(AVCodecContext *avctx,
     unsigned int ihsize;
     int i, j, n, linesize;
     uint32_t rgb[3];
+    uint32_t alpha = 0;
     uint8_t *ptr;
     int dsize;
     const uint8_t *buf0 = buf;
@@ -131,6 +132,8 @@ static int bmp_decode_frame(AVCodecContext *avctx,
         rgb[0] = bytestream_get_le32(&buf);
         rgb[1] = bytestream_get_le32(&buf);
         rgb[2] = bytestream_get_le32(&buf);
+        if (ihsize >= 108)
+            alpha = bytestream_get_le32(&buf);
     }
 
     avctx->width = width;
@@ -142,13 +145,13 @@ static int bmp_decode_frame(AVCodecContext *avctx,
     case 32:
         if(comp == BMP_BITFIELDS){
             if (rgb[0] == 0xFF000000 && rgb[1] == 0x00FF0000 && rgb[2] == 0x0000FF00)
-                avctx->pix_fmt = PIX_FMT_ABGR;
+                avctx->pix_fmt = alpha ? PIX_FMT_ABGR : PIX_FMT_0BGR;
             else if (rgb[0] == 0x00FF0000 && rgb[1] == 0x0000FF00 && rgb[2] == 0x000000FF)
-                avctx->pix_fmt = PIX_FMT_BGRA;
+                avctx->pix_fmt = alpha ? PIX_FMT_BGRA : PIX_FMT_BGR0;
             else if (rgb[0] == 0x0000FF00 && rgb[1] == 0x00FF0000 && rgb[2] == 0xFF000000)
-                avctx->pix_fmt = PIX_FMT_ARGB;
+                avctx->pix_fmt = alpha ? PIX_FMT_ARGB : PIX_FMT_0RGB;
             else if (rgb[0] == 0x000000FF && rgb[1] == 0x0000FF00 && rgb[2] == 0x00FF0000)
-                avctx->pix_fmt = PIX_FMT_RGBA;
+                avctx->pix_fmt = alpha ? PIX_FMT_RGBA : PIX_FMT_RGB0;
             else {
                 av_log(avctx, AV_LOG_ERROR, "Unknown bitfields %0X %0X %0X\n", rgb[0], rgb[1], rgb[2]);
                 return AVERROR(EINVAL);