Merge commit '65e78a2e4b111627c0ebdf2c9baec95e5e21560d'
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 3 Sep 2014 11:58:41 +0000 (13:58 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 3 Sep 2014 11:58:41 +0000 (13:58 +0200)
* commit '65e78a2e4b111627c0ebdf2c9baec95e5e21560d':
  x11grab: Refactor pixel format parsing

Conflicts:
libavdevice/x11grab.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavdevice/x11grab.c

@@@ -172,6 -168,59 +172,63 @@@ static int setup_shm(AVFormatContext *s
      return 0;
  }
  
 -        *pix_fmt = AV_PIX_FMT_RGB32;
+ static int pixfmt_from_image(AVFormatContext *s, XImage *image, int *pix_fmt)
+ {
+     av_log(s, AV_LOG_DEBUG,
+            "Image r 0x%.6lx g 0x%.6lx b 0x%.6lx and depth %i\n",
+            image->red_mask,
+            image->green_mask,
+            image->blue_mask,
+            image->bits_per_pixel);
+     switch (image->bits_per_pixel) {
+     case 8:
+         *pix_fmt =  AV_PIX_FMT_PAL8;
+         break;
+     case 16:
+         if (image->red_mask   == 0xf800 &&
+             image->green_mask == 0x07e0 &&
+             image->blue_mask  == 0x001f) {
+             *pix_fmt = AV_PIX_FMT_RGB565;
+         } else if (image->red_mask   == 0x7c00 &&
+                    image->green_mask == 0x03e0 &&
+                    image->blue_mask  == 0x001f) {
+             *pix_fmt = AV_PIX_FMT_RGB555;
+         }
+         break;
+     case 24:
+         if (image->red_mask   == 0xff0000 &&
+             image->green_mask == 0x00ff00 &&
+             image->blue_mask  == 0x0000ff) {
+             *pix_fmt = AV_PIX_FMT_BGR24;
+         } else if (image->red_mask   == 0x0000ff &&
+                    image->green_mask == 0x00ff00 &&
+                    image->blue_mask  == 0xff0000) {
+             *pix_fmt = AV_PIX_FMT_RGB24;
+         }
+         break;
+     case 32:
++        if (image->red_mask   == 0xff0000 &&
++            image->green_mask == 0x00ff00 &&
++            image->blue_mask  == 0x0000ff ) {
++            *pix_fmt = AV_PIX_FMT_0RGB32;
++        }
+         break;
+     default:
+         av_log(s, AV_LOG_ERROR,
+                "XImages with RGB mask 0x%.6lx 0x%.6lx 0x%.6lx and depth %i "
+                "are currently not supported.\n",
+                image->red_mask,
+                image->green_mask,
+                image->blue_mask,
+                image->bits_per_pixel);
+         return AVERROR_PATCHWELCOME;
+     }
+     return 0;
+ }
  /**
   * Initialize the x11 grab device demuxer (public device demuxer API).
   *
@@@ -187,27 -236,19 +244,26 @@@ static int x11grab_read_header(AVFormat
      X11GrabContext *x11grab = s1->priv_data;
      Display *dpy;
      AVStream *st = NULL;
-     enum AVPixelFormat input_pixfmt;
      XImage *image;
 -    int x_off = 0, y_off = 0, ret = 0, screen, use_shm;
 -    char *param, *offset;
 -    AVRational framerate;
 -
 -    param = av_strdup(s1->filename);
 -    if (!param)
 +    int x_off = 0, y_off = 0, ret = 0, screen, use_shm = 0;
 +    char *dpyname, *offset;
 +    Colormap color_map;
 +    XColor color[256];
 +    int i;
 +
 +    dpyname = av_strdup(s1->filename);
 +    if (!dpyname)
          goto out;
  
 -    offset = strchr(param, '+');
 +    offset = strchr(dpyname, '+');
      if (offset) {
          sscanf(offset, "%d,%d", &x_off, &y_off);
 -        x11grab->draw_mouse = !strstr(offset, "nomouse");
 +        if (strstr(offset, "nomouse")) {
 +            av_log(s1, AV_LOG_WARNING,
 +                   "'nomouse' specification in argument is deprecated: "
 +                   "use 'draw_mouse' option with value 0 instead\n");
 +            x11grab->draw_mouse = 0;
 +        }
          *offset = 0;
      }
  
                            AllPlanes, ZPixmap);
      }
  
-     switch (image->bits_per_pixel) {
-     case 8:
-         av_log(s1, AV_LOG_DEBUG, "8 bit palette\n");
-         input_pixfmt = AV_PIX_FMT_PAL8;
+     x11grab->frame_size = x11grab->width * x11grab->height * image->bits_per_pixel / 8;
+     x11grab->dpy        = dpy;
 -    x11grab->time_base  = (AVRational) { framerate.den, framerate.num };
++    x11grab->time_base  = av_inv_q(x11grab->framerate);
+     x11grab->time_frame = av_gettime() / av_q2d(x11grab->time_base);
+     x11grab->x_off      = x_off;
+     x11grab->y_off      = y_off;
+     x11grab->image      = image;
+     x11grab->use_shm    = use_shm;
+     ret = pixfmt_from_image(s1, image, &st->codec->pix_fmt);
+     if (ret < 0)
+         goto out;
++    if (st->codec->pix_fmt == AV_PIX_FMT_PAL8) {
 +        color_map = DefaultColormap(dpy, screen);
 +        for (i = 0; i < 256; ++i)
 +            color[i].pixel = i;
 +        XQueryColors(dpy, color_map, color, 256);
 +        for (i = 0; i < 256; ++i)
 +            x11grab->palette[i] = (color[i].red   & 0xFF00) << 8 |
 +                                  (color[i].green & 0xFF00)      |
 +                                  (color[i].blue  & 0xFF00) >> 8;
 +        x11grab->palette_changed = 1;
-         break;
-     case 16:
-         if (image->red_mask   == 0xf800 &&
-             image->green_mask == 0x07e0 &&
-             image->blue_mask  == 0x001f) {
-             av_log(s1, AV_LOG_DEBUG, "16 bit RGB565\n");
-             input_pixfmt = AV_PIX_FMT_RGB565;
-         } else if (image->red_mask   == 0x7c00 &&
-                    image->green_mask == 0x03e0 &&
-                    image->blue_mask  == 0x001f) {
-             av_log(s1, AV_LOG_DEBUG, "16 bit RGB555\n");
-             input_pixfmt = AV_PIX_FMT_RGB555;
-         } else {
-             av_log(s1, AV_LOG_ERROR,
-                    "RGB ordering at image depth %i not supported ... aborting\n",
-                    image->bits_per_pixel);
-             av_log(s1, AV_LOG_ERROR,
-                    "color masks: r 0x%.6lx g 0x%.6lx b 0x%.6lx\n",
-                    image->red_mask, image->green_mask, image->blue_mask);
-             ret = AVERROR_PATCHWELCOME;
-             goto out;
-         }
-         break;
-     case 24:
-         if (image->red_mask   == 0xff0000 &&
-             image->green_mask == 0x00ff00 &&
-             image->blue_mask  == 0x0000ff) {
-             input_pixfmt = AV_PIX_FMT_BGR24;
-         } else if (image->red_mask   == 0x0000ff &&
-                    image->green_mask == 0x00ff00 &&
-                    image->blue_mask  == 0xff0000) {
-             input_pixfmt = AV_PIX_FMT_RGB24;
-         } else {
-             av_log(s1, AV_LOG_ERROR,
-                    "rgb ordering at image depth %i not supported ... aborting\n",
-                    image->bits_per_pixel);
-             av_log(s1, AV_LOG_ERROR,
-                    "color masks: r 0x%.6lx g 0x%.6lx b 0x%.6lx\n",
-                    image->red_mask, image->green_mask, image->blue_mask);
-             ret = AVERROR_PATCHWELCOME;
-             goto out;
-         }
-         break;
-     case 32:
-         if (        image->red_mask   == 0xff0000 &&
-                     image->green_mask == 0x00ff00 &&
-                     image->blue_mask  == 0x0000ff ) {
-             input_pixfmt = AV_PIX_FMT_0RGB32;
-         } else {
-             av_log(s1, AV_LOG_ERROR,"rgb ordering at image depth %i not supported ... aborting\n", image->bits_per_pixel);
-             av_log(s1, AV_LOG_ERROR, "color masks: r 0x%.6lx g 0x%.6lx b 0x%.6lx\n", image->red_mask, image->green_mask, image->blue_mask);
-             ret = AVERROR_PATCHWELCOME;
-             goto out;
-         }
-         break;
-     default:
-         av_log(s1, AV_LOG_ERROR,
-                "image depth %i not supported ... aborting\n",
-                image->bits_per_pixel);
-         ret = AVERROR_PATCHWELCOME;
-         goto out;
 +    }
 +
-     x11grab->frame_size = x11grab->width * x11grab->height * image->bits_per_pixel / 8;
-     x11grab->dpy        = dpy;
-     x11grab->time_base  = av_inv_q(x11grab->framerate);
-     x11grab->time_frame = av_gettime() / av_q2d(x11grab->time_base);
-     x11grab->x_off      = x_off;
-     x11grab->y_off      = y_off;
-     x11grab->image      = image;
-     x11grab->use_shm    = use_shm;
 +
      st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
      st->codec->codec_id   = AV_CODEC_ID_RAWVIDEO;
      st->codec->width      = x11grab->width;