[FFmpeg-devel] [PATCH] Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder

Michael Niedermayer michaelni
Thu Mar 12 02:25:42 CET 2009


On Wed, Mar 11, 2009 at 05:47:57PM -0400, Daniel Verkamp wrote:
> On Tue, Mar 10, 2009 at 6:14 PM, Stefan Gehrer <stefan.gehrer at gmx.de> wrote:
> > Daniel Verkamp wrote:
> > + ? ?n_bytes_per_row = (avctx->width * bit_count) >> 3;
> > + ? ?pad_bytes_per_row = (4 - n_bytes_per_row) & 3;
> > + ? ?n_bytes_image = avctx->height * (n_bytes_per_row + pad_bytes_per_row);
> >
> > For the case of PIX_FMT_MONOBLACK, a picture that is e.g. 36 pixels
> > wide would only get 32 bit allocated for a line. Could that become
> > a problem?
> >
> > Maybe
> >
> > n_bytes_per_row = (avctx->width * bit_count + 7) >> 3;
> >
> > would be enough to fix that.
> >
> > Stefan
> 
> Indeed, I didn't think the < 8 bit case through thoroughly enough -
> fixed as you said.
> 
> Also changed in this round: masked palette entries to avoid any alpha
> bits in the high byte leaking out, removed trailing whitespace from
> one line.
[...]

> @@ -37,19 +41,52 @@ static int bmp_encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_s
>      AVFrame *pict = data;
>      AVFrame * const p= (AVFrame*)&s->picture;
>      int n_bytes_image, n_bytes_per_row, n_bytes, i, n, hsize;
> +    const uint32_t *pal = NULL;
> +    int pad_bytes_per_row, bit_count, pal_entries = 0, compression = BMP_RGB;
>      uint8_t *ptr;
>      unsigned char* buf0 = buf;
>      *p = *pict;
>      p->pict_type= FF_I_TYPE;
>      p->key_frame= 1;
> -    n_bytes_per_row = (avctx->width*3 + 3) & ~3;
> -    n_bytes_image = avctx->height*n_bytes_per_row;
> +    switch (avctx->pix_fmt) {
> +    case PIX_FMT_BGR24:
> +        bit_count = 24;
> +        break;
> +    case PIX_FMT_RGB555:
> +        bit_count = 16;
> +        break;
> +    case PIX_FMT_RGB565:
> +        bit_count = 16;
> +        compression = BMP_BITFIELDS;
> +        pal = rgb565_masks; // abuse pal to hold color masks
> +        pal_entries = 3;
> +        break;
> +    case PIX_FMT_RGB8:
> +    case PIX_FMT_BGR8:
> +    case PIX_FMT_RGB4_BYTE:
> +    case PIX_FMT_BGR4_BYTE:
> +    case PIX_FMT_GRAY8:
> +    case PIX_FMT_PAL8:
> +        bit_count = 8;
> +        pal = (uint32_t *)p->data[1];
> +        break;
> +    case PIX_FMT_MONOBLACK:
> +        bit_count = 1;
> +        pal = monoblack_pal;
> +        break;
> +    default:
> +        return -1;
> +    }
> +    if (pal && !pal_entries) pal_entries = 1 << bit_count;

> +    n_bytes_per_row = (avctx->width * bit_count + 7) >> 3;

must be done in 64bit to be sure it doesnt overflow

also is the available space checked to avoid buffer overflows?


[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Republics decline into democracies and democracies degenerate into
despotisms. -- Aristotle
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20090312/6e05b5f4/attachment.pgp>



More information about the ffmpeg-devel mailing list