On Sun, Aug 24, 2014 at 02:18:21PM +0200, Luca Barbato wrote:
> --- a/libavdevice/x11grab.c
> +++ b/libavdevice/x11grab.c
> @@ -170,6 +170,58 @@ static int setup_shm(AVFormatContext *s, Display *dpy, 
> XImage **image)
> +static int pixfmt_from_image(AVFormatContext *s, XImage *image)
> +{
> +    switch (image->bits_per_pixel) {
> +    case 8:
> +        return AV_PIX_FMT_PAL8;
> +    case 16:
> +        if (image->red_mask == 0xf800 &&
> +            image->green_mask == 0x07e0 &&
> +            image->blue_mask == 0x001f) {
> +            return AV_PIX_FMT_RGB565;
> +        } else if (image->red_mask == 0x7c00 &&
> +                   image->green_mask == 0x03e0 &&
> +                   image->blue_mask == 0x001f) {
> +            return AV_PIX_FMT_RGB555;
> +        }
> +        break;
> +    case 24:
> +        if (image->red_mask == 0xff0000 &&
> +            image->green_mask == 0x00ff00 &&
> +            image->blue_mask == 0x0000ff) {
> +            return AV_PIX_FMT_BGR24;
> +        } else if (image->red_mask == 0x0000ff &&
> +                   image->green_mask == 0x00ff00 &&
> +                   image->blue_mask == 0xff0000) {
> +            return AV_PIX_FMT_RGB24;
> +        }
> +        break;
> +    case 32:
> +        return AV_PIX_FMT_RGB32;
> +        break;
> +    default:
> +        break;
> +    }
> +
> +    return AVERROR_PATCHWELCOME;
> +}
> +
> @@ -185,7 +237,6 @@ static int x11grab_read_header(AVFormatContext *s1)
>      AVStream *st = NULL;
> -    enum AVPixelFormat input_pixfmt;
>      XImage *image;
> @@ -336,11 +329,15 @@ static int x11grab_read_header(AVFormatContext *s1)
>  
> +    ret = pixfmt_from_image(s1, image);
> +    if (ret < 0)
> +        goto out;
> +
>      st->codec->width      = x11grab->width;
>      st->codec->height     = x11grab->height;
> -    st->codec->pix_fmt    = input_pixfmt;
> +    st->codec->pix_fmt    = ret;
>      st->codec->time_base  = x11grab->time_base;

IMO it would be cleaner if you returned an enum AVPixelFormat instead of
int above.

Diego
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to