2 * BMP image format decoder
3 * Copyright (c) 2005 Mans Rullgard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 #include "bytestream.h"
30 static int bmp_decode_frame(AVCodecContext
*avctx
,
31 void *data
, int *got_frame
,
34 const uint8_t *buf
= avpkt
->data
;
35 int buf_size
= avpkt
->size
;
37 unsigned int fsize
, hsize
;
42 int i
, j
, n
, linesize
, ret
;
43 uint32_t rgb
[3] = {0};
47 const uint8_t *buf0
= buf
;
51 av_log(avctx
, AV_LOG_ERROR
, "buf size too small (%d)\n", buf_size
);
52 return AVERROR_INVALIDDATA
;
55 if (bytestream_get_byte(&buf
) != 'B' ||
56 bytestream_get_byte(&buf
) != 'M') {
57 av_log(avctx
, AV_LOG_ERROR
, "bad magic number\n");
58 return AVERROR_INVALIDDATA
;
61 fsize
= bytestream_get_le32(&buf
);
62 if (buf_size
< fsize
) {
63 av_log(avctx
, AV_LOG_ERROR
, "not enough data (%d < %u), trying to decode anyway\n",
68 buf
+= 2; /* reserved1 */
69 buf
+= 2; /* reserved2 */
71 hsize
= bytestream_get_le32(&buf
); /* header size */
72 ihsize
= bytestream_get_le32(&buf
); /* more header size */
73 if (ihsize
+ 14LL > hsize
) {
74 av_log(avctx
, AV_LOG_ERROR
, "invalid header size %u\n", hsize
);
75 return AVERROR_INVALIDDATA
;
78 /* sometimes file size is set to some headers size, set a real size in that case */
79 if (fsize
== 14 || fsize
== ihsize
+ 14)
83 av_log(avctx
, AV_LOG_ERROR
,
84 "Declared file size is less than header size (%u < %u)\n",
86 return AVERROR_INVALIDDATA
;
93 case 108: // windib v4
94 case 124: // windib v5
95 width
= bytestream_get_le32(&buf
);
96 height
= bytestream_get_le32(&buf
);
99 width
= bytestream_get_le16(&buf
);
100 height
= bytestream_get_le16(&buf
);
103 av_log(avctx
, AV_LOG_ERROR
, "unsupported BMP file, patch welcome\n");
104 return AVERROR_PATCHWELCOME
;
108 if (bytestream_get_le16(&buf
) != 1) {
109 av_log(avctx
, AV_LOG_ERROR
, "invalid BMP header\n");
110 return AVERROR_INVALIDDATA
;
113 depth
= bytestream_get_le16(&buf
);
116 comp
= bytestream_get_le32(&buf
);
120 if (comp
!= BMP_RGB
&& comp
!= BMP_BITFIELDS
&& comp
!= BMP_RLE4
&&
122 av_log(avctx
, AV_LOG_ERROR
, "BMP coding %d not supported\n", comp
);
123 return AVERROR_INVALIDDATA
;
126 if (comp
== BMP_BITFIELDS
) {
128 rgb
[0] = bytestream_get_le32(&buf
);
129 rgb
[1] = bytestream_get_le32(&buf
);
130 rgb
[2] = bytestream_get_le32(&buf
);
132 alpha
= bytestream_get_le32(&buf
);
135 avctx
->width
= width
;
136 avctx
->height
= height
> 0 ? height
: -height
;
138 avctx
->pix_fmt
= AV_PIX_FMT_NONE
;
142 if (comp
== BMP_BITFIELDS
) {
143 if (rgb
[0] == 0xFF000000 && rgb
[1] == 0x00FF0000 && rgb
[2] == 0x0000FF00)
144 avctx
->pix_fmt
= alpha
? AV_PIX_FMT_ABGR
: AV_PIX_FMT_0BGR
;
145 else if (rgb
[0] == 0x00FF0000 && rgb
[1] == 0x0000FF00 && rgb
[2] == 0x000000FF)
146 avctx
->pix_fmt
= alpha
? AV_PIX_FMT_BGRA
: AV_PIX_FMT_BGR0
;
147 else if (rgb
[0] == 0x0000FF00 && rgb
[1] == 0x00FF0000 && rgb
[2] == 0xFF000000)
148 avctx
->pix_fmt
= alpha
? AV_PIX_FMT_ARGB
: AV_PIX_FMT_0RGB
;
149 else if (rgb
[0] == 0x000000FF && rgb
[1] == 0x0000FF00 && rgb
[2] == 0x00FF0000)
150 avctx
->pix_fmt
= alpha
? AV_PIX_FMT_RGBA
: AV_PIX_FMT_RGB0
;
152 av_log(avctx
, AV_LOG_ERROR
, "Unknown bitfields %0X %0X %0X\n", rgb
[0], rgb
[1], rgb
[2]);
153 return AVERROR(EINVAL
);
156 avctx
->pix_fmt
= AV_PIX_FMT_BGRA
;
160 avctx
->pix_fmt
= AV_PIX_FMT_BGR24
;
164 avctx
->pix_fmt
= AV_PIX_FMT_RGB555
;
165 else if (comp
== BMP_BITFIELDS
) {
166 if (rgb
[0] == 0xF800 && rgb
[1] == 0x07E0 && rgb
[2] == 0x001F)
167 avctx
->pix_fmt
= AV_PIX_FMT_RGB565
;
168 else if (rgb
[0] == 0x7C00 && rgb
[1] == 0x03E0 && rgb
[2] == 0x001F)
169 avctx
->pix_fmt
= AV_PIX_FMT_RGB555
;
170 else if (rgb
[0] == 0x0F00 && rgb
[1] == 0x00F0 && rgb
[2] == 0x000F)
171 avctx
->pix_fmt
= AV_PIX_FMT_RGB444
;
173 av_log(avctx
, AV_LOG_ERROR
,
174 "Unknown bitfields %0"PRIX32
" %0"PRIX32
" %0"PRIX32
"\n",
175 rgb
[0], rgb
[1], rgb
[2]);
176 return AVERROR(EINVAL
);
181 if (hsize
- ihsize
- 14 > 0)
182 avctx
->pix_fmt
= AV_PIX_FMT_PAL8
;
184 avctx
->pix_fmt
= AV_PIX_FMT_GRAY8
;
188 if (hsize
- ihsize
- 14 > 0) {
189 avctx
->pix_fmt
= AV_PIX_FMT_PAL8
;
191 av_log(avctx
, AV_LOG_ERROR
, "Unknown palette for %u-colour BMP\n",
193 return AVERROR_INVALIDDATA
;
197 av_log(avctx
, AV_LOG_ERROR
, "depth %u not supported\n", depth
);
198 return AVERROR_INVALIDDATA
;
201 if (avctx
->pix_fmt
== AV_PIX_FMT_NONE
) {
202 av_log(avctx
, AV_LOG_ERROR
, "unsupported pixel format\n");
203 return AVERROR_INVALIDDATA
;
206 if ((ret
= ff_get_buffer(avctx
, p
, 0)) < 0)
208 p
->pict_type
= AV_PICTURE_TYPE_I
;
212 dsize
= buf_size
- hsize
;
214 /* Line size in file multiple of 4 */
215 n
= ((avctx
->width
* depth
+ 31) / 8) & ~3;
217 if (n
* avctx
->height
> dsize
&& comp
!= BMP_RLE4
&& comp
!= BMP_RLE8
) {
218 av_log(avctx
, AV_LOG_ERROR
, "not enough data (%d < %d)\n",
219 dsize
, n
* avctx
->height
);
220 return AVERROR_INVALIDDATA
;
223 // RLE may skip decoding some picture areas, so blank picture before decoding
224 if (comp
== BMP_RLE4
|| comp
== BMP_RLE8
)
225 memset(p
->data
[0], 0, avctx
->height
* p
->linesize
[0]);
228 ptr
= p
->data
[0] + (avctx
->height
- 1) * p
->linesize
[0];
229 linesize
= -p
->linesize
[0];
232 linesize
= p
->linesize
[0];
235 if (avctx
->pix_fmt
== AV_PIX_FMT_PAL8
) {
236 int colors
= 1 << depth
;
238 memset(p
->data
[1], 0, 1024);
243 t
= bytestream_get_le32(&buf
);
244 if (t
< 0 || t
> (1 << depth
)) {
245 av_log(avctx
, AV_LOG_ERROR
,
246 "Incorrect number of colors - %X for bitdepth %u\n",
252 colors
= FFMIN(256, (hsize
-ihsize
-14) / 3);
254 buf
= buf0
+ 14 + ihsize
; //palette location
255 // OS/2 bitmap, 3 bytes per palette entry
256 if ((hsize
-ihsize
-14) < (colors
<< 2)) {
257 if ((hsize
-ihsize
-14) < colors
* 3) {
258 av_log(avctx
, AV_LOG_ERROR
, "palette doesn't fit in packet\n");
259 return AVERROR_INVALIDDATA
;
261 for (i
= 0; i
< colors
; i
++)
262 ((uint32_t*)p
->data
[1])[i
] = (0xFFU
<<24) | bytestream_get_le24(&buf
);
264 for (i
= 0; i
< colors
; i
++)
265 ((uint32_t*)p
->data
[1])[i
] = 0xFFU
<< 24 | bytestream_get_le32(&buf
);
269 if (comp
== BMP_RLE4
|| comp
== BMP_RLE8
) {
270 if (comp
== BMP_RLE8
&& height
< 0) {
271 p
->data
[0] += p
->linesize
[0] * (avctx
->height
- 1);
272 p
->linesize
[0] = -p
->linesize
[0];
274 bytestream2_init(&gb
, buf
, dsize
);
275 ff_msrle_decode(avctx
, (AVPicture
*)p
, depth
, &gb
);
277 p
->data
[0] += p
->linesize
[0] * (avctx
->height
- 1);
278 p
->linesize
[0] = -p
->linesize
[0];
283 for (i
= 0; i
< avctx
->height
; i
++) {
285 for (j
= 0; j
< n
; j
++) {
286 ptr
[j
*8+0] = buf
[j
] >> 7;
287 ptr
[j
*8+1] = (buf
[j
] >> 6) & 1;
288 ptr
[j
*8+2] = (buf
[j
] >> 5) & 1;
289 ptr
[j
*8+3] = (buf
[j
] >> 4) & 1;
290 ptr
[j
*8+4] = (buf
[j
] >> 3) & 1;
291 ptr
[j
*8+5] = (buf
[j
] >> 2) & 1;
292 ptr
[j
*8+6] = (buf
[j
] >> 1) & 1;
293 ptr
[j
*8+7] = buf
[j
] & 1;
302 for (i
= 0; i
< avctx
->height
; i
++) {
309 for (i
= 0; i
< avctx
->height
; i
++) {
311 for (j
= 0; j
< n
; j
++) {
312 ptr
[j
*2+0] = (buf
[j
] >> 4) & 0xF;
313 ptr
[j
*2+1] = buf
[j
] & 0xF;
320 for (i
= 0; i
< avctx
->height
; i
++) {
321 const uint16_t *src
= (const uint16_t *) buf
;
322 uint16_t *dst
= (uint16_t *) ptr
;
324 for (j
= 0; j
< avctx
->width
; j
++)
325 *dst
++ = av_le2ne16(*src
++);
332 av_log(avctx
, AV_LOG_ERROR
, "BMP decoder is broken\n");
333 return AVERROR_INVALIDDATA
;
342 AVCodec ff_bmp_decoder
= {
344 .long_name
= NULL_IF_CONFIG_SMALL("BMP (Windows and OS/2 bitmap)"),
345 .type
= AVMEDIA_TYPE_VIDEO
,
346 .id
= AV_CODEC_ID_BMP
,
347 .decode
= bmp_decode_frame
,
348 .capabilities
= CODEC_CAP_DR1
,