4d586dc89baf17479df381ac54b3cbe6e765e3e2
2 * BMP image format decoder
3 * Copyright (c) 2005 Mans Rullgard
5 * This file is part of Libav.
7 * Libav 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 * Libav 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 Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 #include "bytestream.h"
27 static av_cold
int bmp_decode_init(AVCodecContext
*avctx
){
28 BMPContext
*s
= avctx
->priv_data
;
30 avcodec_get_frame_defaults(&s
->picture
);
31 avctx
->coded_frame
= &s
->picture
;
36 static int bmp_decode_frame(AVCodecContext
*avctx
,
37 void *data
, int *data_size
,
40 const uint8_t *buf
= avpkt
->data
;
41 int buf_size
= avpkt
->size
;
42 BMPContext
*s
= avctx
->priv_data
;
43 AVFrame
*picture
= data
;
44 AVFrame
*p
= &s
->picture
;
45 unsigned int fsize
, hsize
;
50 int i
, j
, n
, linesize
;
54 const uint8_t *buf0
= buf
;
57 av_log(avctx
, AV_LOG_ERROR
, "buf size too small (%d)\n", buf_size
);
61 if(bytestream_get_byte(&buf
) != 'B' ||
62 bytestream_get_byte(&buf
) != 'M') {
63 av_log(avctx
, AV_LOG_ERROR
, "bad magic number\n");
67 fsize
= bytestream_get_le32(&buf
);
69 av_log(avctx
, AV_LOG_ERROR
, "not enough data (%d < %d), trying to decode anyway\n",
74 buf
+= 2; /* reserved1 */
75 buf
+= 2; /* reserved2 */
77 hsize
= bytestream_get_le32(&buf
); /* header size */
78 ihsize
= bytestream_get_le32(&buf
); /* more header size */
79 if(ihsize
+ 14 > hsize
){
80 av_log(avctx
, AV_LOG_ERROR
, "invalid header size %d\n", hsize
);
84 /* sometimes file size is set to some headers size, set a real size in that case */
85 if(fsize
== 14 || fsize
== ihsize
+ 14)
89 av_log(avctx
, AV_LOG_ERROR
, "declared file size is less than header size (%d < %d)\n",
97 case 108: // windib v4
98 case 124: // windib v5
99 width
= bytestream_get_le32(&buf
);
100 height
= bytestream_get_le32(&buf
);
103 width
= bytestream_get_le16(&buf
);
104 height
= bytestream_get_le16(&buf
);
107 av_log(avctx
, AV_LOG_ERROR
, "unsupported BMP file, patch welcome\n");
111 if(bytestream_get_le16(&buf
) != 1){ /* planes */
112 av_log(avctx
, AV_LOG_ERROR
, "invalid BMP header\n");
116 depth
= bytestream_get_le16(&buf
);
119 comp
= bytestream_get_le32(&buf
);
123 if(comp
!= BMP_RGB
&& comp
!= BMP_BITFIELDS
&& comp
!= BMP_RLE4
&& comp
!= BMP_RLE8
){
124 av_log(avctx
, AV_LOG_ERROR
, "BMP coding %d not supported\n", comp
);
128 if(comp
== BMP_BITFIELDS
){
130 rgb
[0] = bytestream_get_le32(&buf
);
131 rgb
[1] = bytestream_get_le32(&buf
);
132 rgb
[2] = bytestream_get_le32(&buf
);
135 avctx
->width
= width
;
136 avctx
->height
= height
> 0? height
: -height
;
138 avctx
->pix_fmt
= PIX_FMT_NONE
;
142 if(comp
== BMP_BITFIELDS
){
143 rgb
[0] = (rgb
[0] >> 15) & 3;
144 rgb
[1] = (rgb
[1] >> 15) & 3;
145 rgb
[2] = (rgb
[2] >> 15) & 3;
147 if(rgb
[0] + rgb
[1] + rgb
[2] != 3 ||
148 rgb
[0] == rgb
[1] || rgb
[0] == rgb
[2] || rgb
[1] == rgb
[2]){
157 avctx
->pix_fmt
= PIX_FMT_BGR24
;
160 avctx
->pix_fmt
= PIX_FMT_BGR24
;
164 avctx
->pix_fmt
= PIX_FMT_RGB555
;
165 else if (comp
== BMP_BITFIELDS
) {
166 if (rgb
[0] == 0xF800 && rgb
[1] == 0x07E0 && rgb
[2] == 0x001F)
167 avctx
->pix_fmt
= PIX_FMT_RGB565
;
168 else if (rgb
[0] == 0x7C00 && rgb
[1] == 0x03E0 && rgb
[2] == 0x001F)
169 avctx
->pix_fmt
= PIX_FMT_RGB555
;
170 else if (rgb
[0] == 0x0F00 && rgb
[1] == 0x00F0 && rgb
[2] == 0x000F)
171 avctx
->pix_fmt
= PIX_FMT_RGB444
;
173 av_log(avctx
, AV_LOG_ERROR
, "Unknown bitfields %0X %0X %0X\n", rgb
[0], rgb
[1], rgb
[2]);
174 return AVERROR(EINVAL
);
179 if(hsize
- ihsize
- 14 > 0)
180 avctx
->pix_fmt
= PIX_FMT_PAL8
;
182 avctx
->pix_fmt
= PIX_FMT_GRAY8
;
186 if(hsize
- ihsize
- 14 > 0){
187 avctx
->pix_fmt
= PIX_FMT_PAL8
;
189 av_log(avctx
, AV_LOG_ERROR
, "Unknown palette for %d-colour BMP\n", 1<<depth
);
194 av_log(avctx
, AV_LOG_ERROR
, "depth %d not supported\n", depth
);
198 if(avctx
->pix_fmt
== PIX_FMT_NONE
){
199 av_log(avctx
, AV_LOG_ERROR
, "unsupported pixel format\n");
204 avctx
->release_buffer(avctx
, p
);
207 if(avctx
->get_buffer(avctx
, p
) < 0){
208 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
211 p
->pict_type
= AV_PICTURE_TYPE_I
;
215 dsize
= buf_size
- hsize
;
217 /* Line size in file multiple of 4 */
218 n
= ((avctx
->width
* depth
) / 8 + 3) & ~3;
220 if(n
* avctx
->height
> dsize
&& comp
!= BMP_RLE4
&& comp
!= BMP_RLE8
){
221 av_log(avctx
, AV_LOG_ERROR
, "not enough data (%d < %d)\n",
222 dsize
, n
* avctx
->height
);
226 // RLE may skip decoding some picture areas, so blank picture before decoding
227 if(comp
== BMP_RLE4
|| comp
== BMP_RLE8
)
228 memset(p
->data
[0], 0, avctx
->height
* p
->linesize
[0]);
230 if(depth
== 4 || depth
== 8)
231 memset(p
->data
[1], 0, 1024);
234 ptr
= p
->data
[0] + (avctx
->height
- 1) * p
->linesize
[0];
235 linesize
= -p
->linesize
[0];
238 linesize
= p
->linesize
[0];
241 if(avctx
->pix_fmt
== PIX_FMT_PAL8
){
242 int colors
= 1 << depth
;
246 t
= bytestream_get_le32(&buf
);
247 if(t
< 0 || t
> (1 << depth
)){
248 av_log(avctx
, AV_LOG_ERROR
, "Incorrect number of colors - %X for bitdepth %d\n", t
, depth
);
253 buf
= buf0
+ 14 + ihsize
; //palette location
254 if((hsize
-ihsize
-14) < (colors
<< 2)){ // OS/2 bitmap, 3 bytes per palette entry
255 for(i
= 0; i
< colors
; i
++)
256 ((uint32_t*)p
->data
[1])[i
] = bytestream_get_le24(&buf
);
258 for(i
= 0; i
< colors
; i
++)
259 ((uint32_t*)p
->data
[1])[i
] = bytestream_get_le32(&buf
);
263 if(comp
== BMP_RLE4
|| comp
== BMP_RLE8
){
265 p
->data
[0] += p
->linesize
[0] * (avctx
->height
- 1);
266 p
->linesize
[0] = -p
->linesize
[0];
268 ff_msrle_decode(avctx
, (AVPicture
*)p
, depth
, buf
, dsize
);
270 p
->data
[0] += p
->linesize
[0] * (avctx
->height
- 1);
271 p
->linesize
[0] = -p
->linesize
[0];
276 for (i
= 0; i
< avctx
->height
; i
++) {
278 for (j
= 0; j
< n
; j
++) {
279 ptr
[j
*8+0] = buf
[j
] >> 7;
280 ptr
[j
*8+1] = (buf
[j
] >> 6) & 1;
281 ptr
[j
*8+2] = (buf
[j
] >> 5) & 1;
282 ptr
[j
*8+3] = (buf
[j
] >> 4) & 1;
283 ptr
[j
*8+4] = (buf
[j
] >> 3) & 1;
284 ptr
[j
*8+5] = (buf
[j
] >> 2) & 1;
285 ptr
[j
*8+6] = (buf
[j
] >> 1) & 1;
286 ptr
[j
*8+7] = buf
[j
] & 1;
294 for(i
= 0; i
< avctx
->height
; i
++){
301 for(i
= 0; i
< avctx
->height
; i
++){
303 for(j
= 0; j
< n
; j
++){
304 ptr
[j
*2+0] = (buf
[j
] >> 4) & 0xF;
305 ptr
[j
*2+1] = buf
[j
] & 0xF;
312 for(i
= 0; i
< avctx
->height
; i
++){
313 const uint16_t *src
= (const uint16_t *) buf
;
314 uint16_t *dst
= (uint16_t *) ptr
;
316 for(j
= 0; j
< avctx
->width
; j
++)
317 *dst
++ = av_le2ne16(*src
++);
324 for(i
= 0; i
< avctx
->height
; i
++){
325 const uint8_t *src
= buf
;
328 for(j
= 0; j
< avctx
->width
; j
++){
329 dst
[0] = src
[rgb
[2]];
330 dst
[1] = src
[rgb
[1]];
331 dst
[2] = src
[rgb
[0]];
341 av_log(avctx
, AV_LOG_ERROR
, "BMP decoder is broken\n");
346 *picture
= s
->picture
;
347 *data_size
= sizeof(AVPicture
);
352 static av_cold
int bmp_decode_end(AVCodecContext
*avctx
)
354 BMPContext
* c
= avctx
->priv_data
;
356 if (c
->picture
.data
[0])
357 avctx
->release_buffer(avctx
, &c
->picture
);
362 AVCodec ff_bmp_decoder
= {
364 .type
= AVMEDIA_TYPE_VIDEO
,
366 .priv_data_size
= sizeof(BMPContext
),
367 .init
= bmp_decode_init
,
368 .close
= bmp_decode_end
,
369 .decode
= bmp_decode_frame
,
370 .capabilities
= CODEC_CAP_DR1
,
371 .long_name
= NULL_IF_CONFIG_SMALL("BMP image"),