annotate ffmpeg/libavcodec/bmp.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * BMP image format decoder
yading@10 3 * Copyright (c) 2005 Mans Rullgard
yading@10 4 *
yading@10 5 * This file is part of FFmpeg.
yading@10 6 *
yading@10 7 * FFmpeg is free software; you can redistribute it and/or
yading@10 8 * modify it under the terms of the GNU Lesser General Public
yading@10 9 * License as published by the Free Software Foundation; either
yading@10 10 * version 2.1 of the License, or (at your option) any later version.
yading@10 11 *
yading@10 12 * FFmpeg is distributed in the hope that it will be useful,
yading@10 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 15 * Lesser General Public License for more details.
yading@10 16 *
yading@10 17 * You should have received a copy of the GNU Lesser General Public
yading@10 18 * License along with FFmpeg; if not, write to the Free Software
yading@10 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 20 */
yading@10 21
yading@10 22 #include "avcodec.h"
yading@10 23 #include "bytestream.h"
yading@10 24 #include "bmp.h"
yading@10 25 #include "internal.h"
yading@10 26 #include "msrledec.h"
yading@10 27
yading@10 28 static int bmp_decode_frame(AVCodecContext *avctx,
yading@10 29 void *data, int *got_frame,
yading@10 30 AVPacket *avpkt)
yading@10 31 {
yading@10 32 const uint8_t *buf = avpkt->data;
yading@10 33 int buf_size = avpkt->size;
yading@10 34 AVFrame *p = data;
yading@10 35 unsigned int fsize, hsize;
yading@10 36 int width, height;
yading@10 37 unsigned int depth;
yading@10 38 BiCompression comp;
yading@10 39 unsigned int ihsize;
yading@10 40 int i, j, n, linesize, ret;
yading@10 41 uint32_t rgb[3] = {0};
yading@10 42 uint32_t alpha = 0;
yading@10 43 uint8_t *ptr;
yading@10 44 int dsize;
yading@10 45 const uint8_t *buf0 = buf;
yading@10 46 GetByteContext gb;
yading@10 47
yading@10 48 if (buf_size < 14) {
yading@10 49 av_log(avctx, AV_LOG_ERROR, "buf size too small (%d)\n", buf_size);
yading@10 50 return AVERROR_INVALIDDATA;
yading@10 51 }
yading@10 52
yading@10 53 if (bytestream_get_byte(&buf) != 'B' ||
yading@10 54 bytestream_get_byte(&buf) != 'M') {
yading@10 55 av_log(avctx, AV_LOG_ERROR, "bad magic number\n");
yading@10 56 return AVERROR_INVALIDDATA;
yading@10 57 }
yading@10 58
yading@10 59 fsize = bytestream_get_le32(&buf);
yading@10 60 if (buf_size < fsize) {
yading@10 61 av_log(avctx, AV_LOG_ERROR, "not enough data (%d < %d), trying to decode anyway\n",
yading@10 62 buf_size, fsize);
yading@10 63 fsize = buf_size;
yading@10 64 }
yading@10 65
yading@10 66 buf += 2; /* reserved1 */
yading@10 67 buf += 2; /* reserved2 */
yading@10 68
yading@10 69 hsize = bytestream_get_le32(&buf); /* header size */
yading@10 70 ihsize = bytestream_get_le32(&buf); /* more header size */
yading@10 71 if (ihsize + 14 > hsize) {
yading@10 72 av_log(avctx, AV_LOG_ERROR, "invalid header size %d\n", hsize);
yading@10 73 return AVERROR_INVALIDDATA;
yading@10 74 }
yading@10 75
yading@10 76 /* sometimes file size is set to some headers size, set a real size in that case */
yading@10 77 if (fsize == 14 || fsize == ihsize + 14)
yading@10 78 fsize = buf_size - 2;
yading@10 79
yading@10 80 if (fsize <= hsize) {
yading@10 81 av_log(avctx, AV_LOG_ERROR, "declared file size is less than header size (%d < %d)\n",
yading@10 82 fsize, hsize);
yading@10 83 return AVERROR_INVALIDDATA;
yading@10 84 }
yading@10 85
yading@10 86 switch (ihsize) {
yading@10 87 case 40: // windib
yading@10 88 case 56: // windib v3
yading@10 89 case 64: // OS/2 v2
yading@10 90 case 108: // windib v4
yading@10 91 case 124: // windib v5
yading@10 92 width = bytestream_get_le32(&buf);
yading@10 93 height = bytestream_get_le32(&buf);
yading@10 94 break;
yading@10 95 case 12: // OS/2 v1
yading@10 96 width = bytestream_get_le16(&buf);
yading@10 97 height = bytestream_get_le16(&buf);
yading@10 98 break;
yading@10 99 default:
yading@10 100 av_log(avctx, AV_LOG_ERROR, "unsupported BMP file, patch welcome\n");
yading@10 101 return AVERROR_PATCHWELCOME;
yading@10 102 }
yading@10 103
yading@10 104 /* planes */
yading@10 105 if (bytestream_get_le16(&buf) != 1) {
yading@10 106 av_log(avctx, AV_LOG_ERROR, "invalid BMP header\n");
yading@10 107 return AVERROR_INVALIDDATA;
yading@10 108 }
yading@10 109
yading@10 110 depth = bytestream_get_le16(&buf);
yading@10 111
yading@10 112 if (ihsize >= 40)
yading@10 113 comp = bytestream_get_le32(&buf);
yading@10 114 else
yading@10 115 comp = BMP_RGB;
yading@10 116
yading@10 117 if (comp != BMP_RGB && comp != BMP_BITFIELDS && comp != BMP_RLE4 &&
yading@10 118 comp != BMP_RLE8) {
yading@10 119 av_log(avctx, AV_LOG_ERROR, "BMP coding %d not supported\n", comp);
yading@10 120 return AVERROR_INVALIDDATA;
yading@10 121 }
yading@10 122
yading@10 123 if (comp == BMP_BITFIELDS) {
yading@10 124 buf += 20;
yading@10 125 rgb[0] = bytestream_get_le32(&buf);
yading@10 126 rgb[1] = bytestream_get_le32(&buf);
yading@10 127 rgb[2] = bytestream_get_le32(&buf);
yading@10 128 alpha = bytestream_get_le32(&buf);
yading@10 129 }
yading@10 130
yading@10 131 avctx->width = width;
yading@10 132 avctx->height = height > 0 ? height : -height;
yading@10 133
yading@10 134 avctx->pix_fmt = AV_PIX_FMT_NONE;
yading@10 135
yading@10 136 switch (depth) {
yading@10 137 case 32:
yading@10 138 if (comp == BMP_BITFIELDS) {
yading@10 139 if (rgb[0] == 0xFF000000 && rgb[1] == 0x00FF0000 && rgb[2] == 0x0000FF00)
yading@10 140 avctx->pix_fmt = alpha ? AV_PIX_FMT_ABGR : AV_PIX_FMT_0BGR;
yading@10 141 else if (rgb[0] == 0x00FF0000 && rgb[1] == 0x0000FF00 && rgb[2] == 0x000000FF)
yading@10 142 avctx->pix_fmt = alpha ? AV_PIX_FMT_BGRA : AV_PIX_FMT_BGR0;
yading@10 143 else if (rgb[0] == 0x0000FF00 && rgb[1] == 0x00FF0000 && rgb[2] == 0xFF000000)
yading@10 144 avctx->pix_fmt = alpha ? AV_PIX_FMT_ARGB : AV_PIX_FMT_0RGB;
yading@10 145 else if (rgb[0] == 0x000000FF && rgb[1] == 0x0000FF00 && rgb[2] == 0x00FF0000)
yading@10 146 avctx->pix_fmt = alpha ? AV_PIX_FMT_RGBA : AV_PIX_FMT_RGB0;
yading@10 147 else {
yading@10 148 av_log(avctx, AV_LOG_ERROR, "Unknown bitfields %0X %0X %0X\n", rgb[0], rgb[1], rgb[2]);
yading@10 149 return AVERROR(EINVAL);
yading@10 150 }
yading@10 151 } else {
yading@10 152 avctx->pix_fmt = AV_PIX_FMT_BGRA;
yading@10 153 }
yading@10 154 break;
yading@10 155 case 24:
yading@10 156 avctx->pix_fmt = AV_PIX_FMT_BGR24;
yading@10 157 break;
yading@10 158 case 16:
yading@10 159 if (comp == BMP_RGB)
yading@10 160 avctx->pix_fmt = AV_PIX_FMT_RGB555;
yading@10 161 else if (comp == BMP_BITFIELDS) {
yading@10 162 if (rgb[0] == 0xF800 && rgb[1] == 0x07E0 && rgb[2] == 0x001F)
yading@10 163 avctx->pix_fmt = AV_PIX_FMT_RGB565;
yading@10 164 else if (rgb[0] == 0x7C00 && rgb[1] == 0x03E0 && rgb[2] == 0x001F)
yading@10 165 avctx->pix_fmt = AV_PIX_FMT_RGB555;
yading@10 166 else if (rgb[0] == 0x0F00 && rgb[1] == 0x00F0 && rgb[2] == 0x000F)
yading@10 167 avctx->pix_fmt = AV_PIX_FMT_RGB444;
yading@10 168 else {
yading@10 169 av_log(avctx, AV_LOG_ERROR, "Unknown bitfields %0X %0X %0X\n", rgb[0], rgb[1], rgb[2]);
yading@10 170 return AVERROR(EINVAL);
yading@10 171 }
yading@10 172 }
yading@10 173 break;
yading@10 174 case 8:
yading@10 175 if (hsize - ihsize - 14 > 0)
yading@10 176 avctx->pix_fmt = AV_PIX_FMT_PAL8;
yading@10 177 else
yading@10 178 avctx->pix_fmt = AV_PIX_FMT_GRAY8;
yading@10 179 break;
yading@10 180 case 1:
yading@10 181 case 4:
yading@10 182 if (hsize - ihsize - 14 > 0) {
yading@10 183 avctx->pix_fmt = AV_PIX_FMT_PAL8;
yading@10 184 } else {
yading@10 185 av_log(avctx, AV_LOG_ERROR, "Unknown palette for %d-colour BMP\n", 1<<depth);
yading@10 186 return AVERROR_INVALIDDATA;
yading@10 187 }
yading@10 188 break;
yading@10 189 default:
yading@10 190 av_log(avctx, AV_LOG_ERROR, "depth %d not supported\n", depth);
yading@10 191 return AVERROR_INVALIDDATA;
yading@10 192 }
yading@10 193
yading@10 194 if (avctx->pix_fmt == AV_PIX_FMT_NONE) {
yading@10 195 av_log(avctx, AV_LOG_ERROR, "unsupported pixel format\n");
yading@10 196 return AVERROR_INVALIDDATA;
yading@10 197 }
yading@10 198
yading@10 199 if ((ret = ff_get_buffer(avctx, p, 0)) < 0)
yading@10 200 return ret;
yading@10 201 p->pict_type = AV_PICTURE_TYPE_I;
yading@10 202 p->key_frame = 1;
yading@10 203
yading@10 204 buf = buf0 + hsize;
yading@10 205 dsize = buf_size - hsize;
yading@10 206
yading@10 207 /* Line size in file multiple of 4 */
yading@10 208 n = ((avctx->width * depth + 31) / 8) & ~3;
yading@10 209
yading@10 210 if (n * avctx->height > dsize && comp != BMP_RLE4 && comp != BMP_RLE8) {
yading@10 211 av_log(avctx, AV_LOG_ERROR, "not enough data (%d < %d)\n",
yading@10 212 dsize, n * avctx->height);
yading@10 213 return AVERROR_INVALIDDATA;
yading@10 214 }
yading@10 215
yading@10 216 // RLE may skip decoding some picture areas, so blank picture before decoding
yading@10 217 if (comp == BMP_RLE4 || comp == BMP_RLE8)
yading@10 218 memset(p->data[0], 0, avctx->height * p->linesize[0]);
yading@10 219
yading@10 220 if (height > 0) {
yading@10 221 ptr = p->data[0] + (avctx->height - 1) * p->linesize[0];
yading@10 222 linesize = -p->linesize[0];
yading@10 223 } else {
yading@10 224 ptr = p->data[0];
yading@10 225 linesize = p->linesize[0];
yading@10 226 }
yading@10 227
yading@10 228 if (avctx->pix_fmt == AV_PIX_FMT_PAL8) {
yading@10 229 int colors = 1 << depth;
yading@10 230
yading@10 231 memset(p->data[1], 0, 1024);
yading@10 232
yading@10 233 if (ihsize >= 36) {
yading@10 234 int t;
yading@10 235 buf = buf0 + 46;
yading@10 236 t = bytestream_get_le32(&buf);
yading@10 237 if (t < 0 || t > (1 << depth)) {
yading@10 238 av_log(avctx, AV_LOG_ERROR, "Incorrect number of colors - %X for bitdepth %d\n", t, depth);
yading@10 239 } else if (t) {
yading@10 240 colors = t;
yading@10 241 }
yading@10 242 }
yading@10 243 buf = buf0 + 14 + ihsize; //palette location
yading@10 244 // OS/2 bitmap, 3 bytes per palette entry
yading@10 245 if ((hsize-ihsize-14) < (colors << 2)) {
yading@10 246 if ((hsize-ihsize-14) < colors * 3) {
yading@10 247 av_log(avctx, AV_LOG_ERROR, "palette doesnt fit in packet\n");
yading@10 248 return AVERROR_INVALIDDATA;
yading@10 249 }
yading@10 250 for (i = 0; i < colors; i++)
yading@10 251 ((uint32_t*)p->data[1])[i] = (0xFFU<<24) | bytestream_get_le24(&buf);
yading@10 252 } else {
yading@10 253 for (i = 0; i < colors; i++)
yading@10 254 ((uint32_t*)p->data[1])[i] = 0xFFU << 24 | bytestream_get_le32(&buf);
yading@10 255 }
yading@10 256 buf = buf0 + hsize;
yading@10 257 }
yading@10 258 if (comp == BMP_RLE4 || comp == BMP_RLE8) {
yading@10 259 if (height < 0) {
yading@10 260 p->data[0] += p->linesize[0] * (avctx->height - 1);
yading@10 261 p->linesize[0] = -p->linesize[0];
yading@10 262 }
yading@10 263 bytestream2_init(&gb, buf, dsize);
yading@10 264 ff_msrle_decode(avctx, (AVPicture*)p, depth, &gb);
yading@10 265 if (height < 0) {
yading@10 266 p->data[0] += p->linesize[0] * (avctx->height - 1);
yading@10 267 p->linesize[0] = -p->linesize[0];
yading@10 268 }
yading@10 269 } else {
yading@10 270 switch (depth) {
yading@10 271 case 1:
yading@10 272 for (i = 0; i < avctx->height; i++) {
yading@10 273 int j;
yading@10 274 for (j = 0; j < n; j++) {
yading@10 275 ptr[j*8+0] = buf[j] >> 7;
yading@10 276 ptr[j*8+1] = (buf[j] >> 6) & 1;
yading@10 277 ptr[j*8+2] = (buf[j] >> 5) & 1;
yading@10 278 ptr[j*8+3] = (buf[j] >> 4) & 1;
yading@10 279 ptr[j*8+4] = (buf[j] >> 3) & 1;
yading@10 280 ptr[j*8+5] = (buf[j] >> 2) & 1;
yading@10 281 ptr[j*8+6] = (buf[j] >> 1) & 1;
yading@10 282 ptr[j*8+7] = buf[j] & 1;
yading@10 283 }
yading@10 284 buf += n;
yading@10 285 ptr += linesize;
yading@10 286 }
yading@10 287 break;
yading@10 288 case 8:
yading@10 289 case 24:
yading@10 290 case 32:
yading@10 291 for (i = 0; i < avctx->height; i++) {
yading@10 292 memcpy(ptr, buf, n);
yading@10 293 buf += n;
yading@10 294 ptr += linesize;
yading@10 295 }
yading@10 296 break;
yading@10 297 case 4:
yading@10 298 for (i = 0; i < avctx->height; i++) {
yading@10 299 int j;
yading@10 300 for (j = 0; j < n; j++) {
yading@10 301 ptr[j*2+0] = (buf[j] >> 4) & 0xF;
yading@10 302 ptr[j*2+1] = buf[j] & 0xF;
yading@10 303 }
yading@10 304 buf += n;
yading@10 305 ptr += linesize;
yading@10 306 }
yading@10 307 break;
yading@10 308 case 16:
yading@10 309 for (i = 0; i < avctx->height; i++) {
yading@10 310 const uint16_t *src = (const uint16_t *) buf;
yading@10 311 uint16_t *dst = (uint16_t *) ptr;
yading@10 312
yading@10 313 for (j = 0; j < avctx->width; j++)
yading@10 314 *dst++ = av_le2ne16(*src++);
yading@10 315
yading@10 316 buf += n;
yading@10 317 ptr += linesize;
yading@10 318 }
yading@10 319 break;
yading@10 320 default:
yading@10 321 av_log(avctx, AV_LOG_ERROR, "BMP decoder is broken\n");
yading@10 322 return AVERROR_INVALIDDATA;
yading@10 323 }
yading@10 324 }
yading@10 325
yading@10 326 *got_frame = 1;
yading@10 327
yading@10 328 return buf_size;
yading@10 329 }
yading@10 330
yading@10 331 AVCodec ff_bmp_decoder = {
yading@10 332 .name = "bmp",
yading@10 333 .type = AVMEDIA_TYPE_VIDEO,
yading@10 334 .id = AV_CODEC_ID_BMP,
yading@10 335 .decode = bmp_decode_frame,
yading@10 336 .capabilities = CODEC_CAP_DR1,
yading@10 337 .long_name = NULL_IF_CONFIG_SMALL("BMP (Windows and OS/2 bitmap)"),
yading@10 338 };