1/* 2 * BMP image format decoder 3 * Copyright (c) 2005 Mans Rullgard 4 * 5 * This file is part of FFmpeg. 6 * 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. 11 * 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. 16 * 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 20 */ 21 22#include "avcodec.h" 23#include "bytestream.h" 24#include "bmp.h" 25#include "msrledec.h" 26 27static av_cold int bmp_decode_init(AVCodecContext *avctx){ 28 BMPContext *s = avctx->priv_data; 29 30 avcodec_get_frame_defaults((AVFrame*)&s->picture); 31 avctx->coded_frame = (AVFrame*)&s->picture; 32 33 return 0; 34} 35 36static int bmp_decode_frame(AVCodecContext *avctx, 37 void *data, int *data_size, 38 AVPacket *avpkt) 39{ 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; 46 int width, height; 47 unsigned int depth; 48 BiCompression comp; 49 unsigned int ihsize; 50 int i, j, n, linesize; 51 uint32_t rgb[3]; 52 uint8_t *ptr; 53 int dsize; 54 const uint8_t *buf0 = buf; 55 56 if(buf_size < 14){ 57 av_log(avctx, AV_LOG_ERROR, "buf size too small (%d)\n", buf_size); 58 return -1; 59 } 60 61 if(bytestream_get_byte(&buf) != 'B' || 62 bytestream_get_byte(&buf) != 'M') { 63 av_log(avctx, AV_LOG_ERROR, "bad magic number\n"); 64 return -1; 65 } 66 67 fsize = bytestream_get_le32(&buf); 68 if(buf_size < fsize){ 69 av_log(avctx, AV_LOG_ERROR, "not enough data (%d < %d), trying to decode anyway\n", 70 buf_size, fsize); 71 fsize = buf_size; 72 } 73 74 buf += 2; /* reserved1 */ 75 buf += 2; /* reserved2 */ 76 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); 81 return -1; 82 } 83 84 /* sometimes file size is set to some headers size, set a real size in that case */ 85 if(fsize == 14 || fsize == ihsize + 14) 86 fsize = buf_size - 2; 87 88 if(fsize <= hsize){ 89 av_log(avctx, AV_LOG_ERROR, "declared file size is less than header size (%d < %d)\n", 90 fsize, hsize); 91 return -1; 92 } 93 94 switch(ihsize){ 95 case 40: // windib v3 96 case 64: // OS/2 v2 97 case 108: // windib v4 98 case 124: // windib v5 99 width = bytestream_get_le32(&buf); 100 height = bytestream_get_le32(&buf); 101 break; 102 case 12: // OS/2 v1 103 width = bytestream_get_le16(&buf); 104 height = bytestream_get_le16(&buf); 105 break; 106 default: 107 av_log(avctx, AV_LOG_ERROR, "unsupported BMP file, patch welcome\n"); 108 return -1; 109 } 110 111 if(bytestream_get_le16(&buf) != 1){ /* planes */ 112 av_log(avctx, AV_LOG_ERROR, "invalid BMP header\n"); 113 return -1; 114 } 115 116 depth = bytestream_get_le16(&buf); 117 118 if(ihsize == 40) 119 comp = bytestream_get_le32(&buf); 120 else 121 comp = BMP_RGB; 122 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); 125 return -1; 126 } 127 128 if(comp == BMP_BITFIELDS){ 129 buf += 20; 130 rgb[0] = bytestream_get_le32(&buf); 131 rgb[1] = bytestream_get_le32(&buf); 132 rgb[2] = bytestream_get_le32(&buf); 133 } 134 135 avctx->width = width; 136 avctx->height = height > 0? height: -height; 137 138 avctx->pix_fmt = PIX_FMT_NONE; 139 140 switch(depth){ 141 case 32: 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; 146 147 if(rgb[0] + rgb[1] + rgb[2] != 3 || 148 rgb[0] == rgb[1] || rgb[0] == rgb[2] || rgb[1] == rgb[2]){ 149 break; 150 } 151 } else { 152 rgb[0] = 2; 153 rgb[1] = 1; 154 rgb[2] = 0; 155 } 156 157 avctx->pix_fmt = PIX_FMT_BGR24; 158 break; 159 case 24: 160 avctx->pix_fmt = PIX_FMT_BGR24; 161 break; 162 case 16: 163 if(comp == BMP_RGB) 164 avctx->pix_fmt = PIX_FMT_RGB555; 165 if(comp == BMP_BITFIELDS) 166 avctx->pix_fmt = rgb[1] == 0x07E0 ? PIX_FMT_RGB565 : PIX_FMT_RGB555; 167 break; 168 case 8: 169 if(hsize - ihsize - 14 > 0) 170 avctx->pix_fmt = PIX_FMT_PAL8; 171 else 172 avctx->pix_fmt = PIX_FMT_GRAY8; 173 break; 174 case 4: 175 if(hsize - ihsize - 14 > 0){ 176 avctx->pix_fmt = PIX_FMT_PAL8; 177 }else{ 178 av_log(avctx, AV_LOG_ERROR, "Unknown palette for 16-colour BMP\n"); 179 return -1; 180 } 181 break; 182 case 1: 183 avctx->pix_fmt = PIX_FMT_MONOBLACK; 184 break; 185 default: 186 av_log(avctx, AV_LOG_ERROR, "depth %d not supported\n", depth); 187 return -1; 188 } 189 190 if(avctx->pix_fmt == PIX_FMT_NONE){ 191 av_log(avctx, AV_LOG_ERROR, "unsupported pixel format\n"); 192 return -1; 193 } 194 195 if(p->data[0]) 196 avctx->release_buffer(avctx, p); 197 198 p->reference = 0; 199 if(avctx->get_buffer(avctx, p) < 0){ 200 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); 201 return -1; 202 } 203 p->pict_type = FF_I_TYPE; 204 p->key_frame = 1; 205 206 buf = buf0 + hsize; 207 dsize = buf_size - hsize; 208 209 /* Line size in file multiple of 4 */ 210 n = ((avctx->width * depth) / 8 + 3) & ~3; 211 212 if(n * avctx->height > dsize && comp != BMP_RLE4 && comp != BMP_RLE8){ 213 av_log(avctx, AV_LOG_ERROR, "not enough data (%d < %d)\n", 214 dsize, n * avctx->height); 215 return -1; 216 } 217 218 // RLE may skip decoding some picture areas, so blank picture before decoding 219 if(comp == BMP_RLE4 || comp == BMP_RLE8) 220 memset(p->data[0], 0, avctx->height * p->linesize[0]); 221 222 if(depth == 4 || depth == 8) 223 memset(p->data[1], 0, 1024); 224 225 if(height > 0){ 226 ptr = p->data[0] + (avctx->height - 1) * p->linesize[0]; 227 linesize = -p->linesize[0]; 228 } else { 229 ptr = p->data[0]; 230 linesize = p->linesize[0]; 231 } 232 233 if(avctx->pix_fmt == PIX_FMT_PAL8){ 234 int colors = 1 << depth; 235 if(ihsize >= 36){ 236 int t; 237 buf = buf0 + 46; 238 t = bytestream_get_le32(&buf); 239 if(t < 0 || t > (1 << depth)){ 240 av_log(avctx, AV_LOG_ERROR, "Incorrect number of colors - %X for bitdepth %d\n", t, depth); 241 }else if(t){ 242 colors = t; 243 } 244 } 245 buf = buf0 + 14 + ihsize; //palette location 246 if((hsize-ihsize-14) < (colors << 2)){ // OS/2 bitmap, 3 bytes per palette entry 247 for(i = 0; i < colors; i++) 248 ((uint32_t*)p->data[1])[i] = bytestream_get_le24(&buf); 249 }else{ 250 for(i = 0; i < colors; i++) 251 ((uint32_t*)p->data[1])[i] = bytestream_get_le32(&buf); 252 } 253 buf = buf0 + hsize; 254 } 255 if(comp == BMP_RLE4 || comp == BMP_RLE8){ 256 if(height < 0){ 257 p->data[0] += p->linesize[0] * (avctx->height - 1); 258 p->linesize[0] = -p->linesize[0]; 259 } 260 ff_msrle_decode(avctx, (AVPicture*)p, depth, buf, dsize); 261 if(height < 0){ 262 p->data[0] += p->linesize[0] * (avctx->height - 1); 263 p->linesize[0] = -p->linesize[0]; 264 } 265 }else{ 266 switch(depth){ 267 case 1: 268 case 8: 269 case 24: 270 for(i = 0; i < avctx->height; i++){ 271 memcpy(ptr, buf, n); 272 buf += n; 273 ptr += linesize; 274 } 275 break; 276 case 4: 277 for(i = 0; i < avctx->height; i++){ 278 int j; 279 for(j = 0; j < n; j++){ 280 ptr[j*2+0] = (buf[j] >> 4) & 0xF; 281 ptr[j*2+1] = buf[j] & 0xF; 282 } 283 buf += n; 284 ptr += linesize; 285 } 286 break; 287 case 16: 288 for(i = 0; i < avctx->height; i++){ 289 const uint16_t *src = (const uint16_t *) buf; 290 uint16_t *dst = (uint16_t *) ptr; 291 292 for(j = 0; j < avctx->width; j++) 293 *dst++ = le2me_16(*src++); 294 295 buf += n; 296 ptr += linesize; 297 } 298 break; 299 case 32: 300 for(i = 0; i < avctx->height; i++){ 301 const uint8_t *src = buf; 302 uint8_t *dst = ptr; 303 304 for(j = 0; j < avctx->width; j++){ 305 dst[0] = src[rgb[2]]; 306 dst[1] = src[rgb[1]]; 307 dst[2] = src[rgb[0]]; 308 dst += 3; 309 src += 4; 310 } 311 312 buf += n; 313 ptr += linesize; 314 } 315 break; 316 default: 317 av_log(avctx, AV_LOG_ERROR, "BMP decoder is broken\n"); 318 return -1; 319 } 320 } 321 322 *picture = s->picture; 323 *data_size = sizeof(AVPicture); 324 325 return buf_size; 326} 327 328static av_cold int bmp_decode_end(AVCodecContext *avctx) 329{ 330 BMPContext* c = avctx->priv_data; 331 332 if (c->picture.data[0]) 333 avctx->release_buffer(avctx, &c->picture); 334 335 return 0; 336} 337 338AVCodec bmp_decoder = { 339 "bmp", 340 AVMEDIA_TYPE_VIDEO, 341 CODEC_ID_BMP, 342 sizeof(BMPContext), 343 bmp_decode_init, 344 NULL, 345 bmp_decode_end, 346 bmp_decode_frame, 347 CODEC_CAP_DR1, 348 .long_name = NULL_IF_CONFIG_SMALL("BMP image"), 349}; 350