* BMP image format decoder
* Copyright (c) 2005 Mans Rullgard
*
- * This file is part of FFmpeg.
+ * This file is part of Libav.
*
- * FFmpeg is free software; you can redistribute it and/or
+ * Libav is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
- * FFmpeg is distributed in the hope that it will be useful,
+ * Libav is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with FFmpeg; if not, write to the Free Software
+ * License along with Libav; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
static int bmp_decode_frame(AVCodecContext *avctx,
void *data, int *data_size,
- const uint8_t *buf, int buf_size)
+ AVPacket *avpkt)
{
+ const uint8_t *buf = avpkt->data;
+ int buf_size = avpkt->size;
BMPContext *s = avctx->priv_data;
AVFrame *picture = data;
AVFrame *p = &s->picture;
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
return -1;
}
- p->pict_type = FF_I_TYPE;
+ p->pict_type = AV_PICTURE_TYPE_I;
p->key_frame = 1;
buf = buf0 + hsize;
}
if(avctx->pix_fmt == PIX_FMT_PAL8){
+ int colors = 1 << depth;
+ if(ihsize >= 36){
+ int t;
+ buf = buf0 + 46;
+ t = bytestream_get_le32(&buf);
+ if(t < 0 || t > (1 << depth)){
+ av_log(avctx, AV_LOG_ERROR, "Incorrect number of colors - %X for bitdepth %d\n", t, depth);
+ }else if(t){
+ colors = t;
+ }
+ }
buf = buf0 + 14 + ihsize; //palette location
- if((hsize-ihsize-14)>>depth < 4){ // OS/2 bitmap, 3 bytes per palette entry
- for(i = 0; i < (1 << depth); i++)
+ if((hsize-ihsize-14) < (colors << 2)){ // OS/2 bitmap, 3 bytes per palette entry
+ for(i = 0; i < colors; i++)
((uint32_t*)p->data[1])[i] = bytestream_get_le24(&buf);
}else{
- for(i = 0; i < (1 << depth); i++)
+ for(i = 0; i < colors; i++)
((uint32_t*)p->data[1])[i] = bytestream_get_le32(&buf);
}
buf = buf0 + hsize;
}
if(comp == BMP_RLE4 || comp == BMP_RLE8){
+ if(height < 0){
+ p->data[0] += p->linesize[0] * (avctx->height - 1);
+ p->linesize[0] = -p->linesize[0];
+ }
ff_msrle_decode(avctx, (AVPicture*)p, depth, buf, dsize);
+ if(height < 0){
+ p->data[0] += p->linesize[0] * (avctx->height - 1);
+ p->linesize[0] = -p->linesize[0];
+ }
}else{
switch(depth){
case 1:
uint16_t *dst = (uint16_t *) ptr;
for(j = 0; j < avctx->width; j++)
- *dst++ = le2me_16(*src++);
+ *dst++ = av_le2ne16(*src++);
buf += n;
ptr += linesize;
return 0;
}
-AVCodec bmp_decoder = {
- "bmp",
- CODEC_TYPE_VIDEO,
- CODEC_ID_BMP,
- sizeof(BMPContext),
- bmp_decode_init,
- NULL,
- bmp_decode_end,
- bmp_decode_frame,
+AVCodec ff_bmp_decoder = {
+ .name = "bmp",
+ .type = AVMEDIA_TYPE_VIDEO,
+ .id = CODEC_ID_BMP,
+ .priv_data_size = sizeof(BMPContext),
+ .init = bmp_decode_init,
+ .close = bmp_decode_end,
+ .decode = bmp_decode_frame,
+ .capabilities = CODEC_CAP_DR1,
.long_name = NULL_IF_CONFIG_SMALL("BMP image"),
};