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