mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2025-02-15 09:27:47 +00:00
bmpdec: support various bitfields for 32 bit depth
Fixes #740 Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
106f714d30
commit
7c4b397508
@ -141,21 +141,21 @@ static int bmp_decode_frame(AVCodecContext *avctx,
|
||||
switch(depth){
|
||||
case 32:
|
||||
if(comp == BMP_BITFIELDS){
|
||||
rgb[0] = (rgb[0] >> 15) & 3;
|
||||
rgb[1] = (rgb[1] >> 15) & 3;
|
||||
rgb[2] = (rgb[2] >> 15) & 3;
|
||||
|
||||
if(rgb[0] + rgb[1] + rgb[2] != 3 ||
|
||||
rgb[0] == rgb[1] || rgb[0] == rgb[2] || rgb[1] == rgb[2]){
|
||||
break;
|
||||
if (rgb[0] == 0xFF000000 && rgb[1] == 0x00FF0000 && rgb[2] == 0x0000FF00)
|
||||
avctx->pix_fmt = PIX_FMT_ABGR;
|
||||
else if (rgb[0] == 0x00FF0000 && rgb[1] == 0x0000FF00 && rgb[2] == 0x000000FF)
|
||||
avctx->pix_fmt = PIX_FMT_BGRA;
|
||||
else if (rgb[0] == 0x0000FF00 && rgb[1] == 0x00FF0000 && rgb[2] == 0xFF000000)
|
||||
avctx->pix_fmt = PIX_FMT_ARGB;
|
||||
else if (rgb[0] == 0x000000FF && rgb[1] == 0x0000FF00 && rgb[2] == 0x00FF0000)
|
||||
avctx->pix_fmt = PIX_FMT_RGBA;
|
||||
else {
|
||||
av_log(avctx, AV_LOG_ERROR, "Unknown bitfields %0X %0X %0X\n", rgb[0], rgb[1], rgb[2]);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
} else {
|
||||
rgb[0] = 2;
|
||||
rgb[1] = 1;
|
||||
rgb[2] = 0;
|
||||
avctx->pix_fmt = PIX_FMT_BGRA;
|
||||
}
|
||||
|
||||
avctx->pix_fmt = PIX_FMT_BGRA;
|
||||
break;
|
||||
case 24:
|
||||
avctx->pix_fmt = PIX_FMT_BGR24;
|
||||
@ -292,6 +292,7 @@ static int bmp_decode_frame(AVCodecContext *avctx,
|
||||
break;
|
||||
case 8:
|
||||
case 24:
|
||||
case 32:
|
||||
for(i = 0; i < avctx->height; i++){
|
||||
memcpy(ptr, buf, n);
|
||||
buf += n;
|
||||
@ -321,29 +322,6 @@ static int bmp_decode_frame(AVCodecContext *avctx,
|
||||
ptr += linesize;
|
||||
}
|
||||
break;
|
||||
case 32:
|
||||
for(i = 0; i < avctx->height; i++){
|
||||
const uint8_t *src = buf;
|
||||
uint8_t *dst = ptr;
|
||||
|
||||
for(j = 0; j < avctx->width; j++){
|
||||
dst[0] = src[rgb[2]];
|
||||
dst[1] = src[rgb[1]];
|
||||
dst[2] = src[rgb[0]];
|
||||
/* The Microsoft documentation states:
|
||||
* "The high byte in each DWORD is not used."
|
||||
* Both GIMP and ImageMagick store the alpha transparency value
|
||||
* in the high byte for 32bit bmp files.
|
||||
*/
|
||||
dst[3] = src[3];
|
||||
dst += 4;
|
||||
src += 4;
|
||||
}
|
||||
|
||||
buf += n;
|
||||
ptr += linesize;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
av_log(avctx, AV_LOG_ERROR, "BMP decoder is broken\n");
|
||||
return -1;
|
||||
|
Loading…
x
Reference in New Issue
Block a user