On 26/08/14 13:22, Diego Biurrun wrote:
> 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.

pixfmt_from_image(s1, image, &st->codec->pix_fmt)

Might be a better solution indeed.

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

Reply via email to