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