[vlc-devel] [PATCH] bmp: fix demuxing for some BMP formats

Tristan Matthews tmatth at videolan.org
Thu Apr 14 23:28:21 CEST 2016


See broken samples in the directory "g": http://entropymine.com/jason/bmpsuite/

On Thu, Apr 14, 2016 at 5:26 PM, Tristan Matthews <tmatth at videolan.org> wrote:
> ---
>  modules/demux/image.c | 42 ++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 42 insertions(+)
>
> diff --git a/modules/demux/image.c b/modules/demux/image.c
> index 43c4847..033627f 100644
> --- a/modules/demux/image.c
> +++ b/modules/demux/image.c
> @@ -603,6 +603,42 @@ static const image_format_t formats[] = {
>      { .codec = 0 }
>  };
>
> +static int parse_bmp(stream_t *stream, video_format_t *fmt)
> +{
> +/* See:
> +   https://en.wikipedia.org/wiki/BMP_file_format#DIB_header_.28bitmap_information_header.29
> + */
> +    const uint8_t *header;
> +    if (stream_Peek(stream, &header, 18 + 12) < 18 + 12)
> +        return VLC_EGENERIC;
> +    uint32_t header_size = GetDWLE(&header[14]);
> +    switch (header_size) {
> +        case  12: { /* BITMAPCOREHEADER, OS21XBITMAPHEADER */
> +            if( stream_Peek(stream, &header, 18 + 12) < 18 + 12 )
> +                return VLC_EGENERIC;
> +            fmt->i_width = fmt->i_visible_width = GetWLE(&header[18]);
> +            fmt->i_height = fmt->i_visible_height = GetWLE(&header[20]);
> +            fmt->i_bits_per_pixel = GetWLE(&header[24]);
> +            break;
> +        }
> +        case  40: /* BITMAPINFOHEADER */
> +        case  52: /* BITMAPV2INFOHEADER */
> +        case  56: /* BITMAPV3INFOHEADER */
> +        case  64: /* OS22XBITMAPHEADER */
> +        case 108: /* BITMAPV4HEADER */
> +        case 124: /* BITMAPV5HEADER */
> +        {
> +            fmt->i_width = fmt->i_visible_width = GetDWLE(&header[18]);
> +            fmt->i_height = fmt->i_visible_height = GetDWLE(&header[22]);
> +            fmt->i_bits_per_pixel = GetWLE(&header[28]);
> +            break;
> +        }
> +        default:
> +            return VLC_EGENERIC;
> +    }
> +    return VLC_SUCCESS;
> +}
> +
>  static int Open(vlc_object_t *object)
>  {
>      demux_t *demux = (demux_t*)object;
> @@ -641,6 +677,12 @@ static int Open(vlc_object_t *object)
>      es_format_Init(&fmt, VIDEO_ES, img->codec);
>      fmt.video.i_chroma = fmt.i_codec;
>
> +    if( img->codec == VLC_CODEC_BMP )
> +    {
> +        if (parse_bmp(demux->s, &fmt.video) < 0)
> +            return VLC_EGENERIC; /* let avformat demux this file */
> +    }
> +
>      block_t *data = Load(demux);
>      if (data && var_InheritBool(demux, "image-decode")) {
>          char *string = var_InheritString(demux, "image-chroma");
> --
> 1.9.1
>


More information about the vlc-devel mailing list