[FFmpeg-devel] [PATCH] Fix segfault in x11grab when drawing Cursor on Xservers that don't support the XFixes extension

Måns Rullgård mans
Wed Jun 23 12:52:24 CEST 2010


Brenden Bain <brenden.bain at gmail.com> writes:

>> I'd just set nomouse here and carry on. ?If it failed once, it's
>> likely to fail again.
>
> Makes sense.
>
> Brenden.
>
> Index: libavdevice/x11grab.c
> ===================================================================
> --- libavdevice/x11grab.c	(revision 23733)
> +++ libavdevice/x11grab.c	(working copy)
> @@ -67,7 +67,7 @@
>      XImage *image;           /**< X11 image holding the grab */
>      int use_shm;             /**< !0 when using XShm extension */
>      XShmSegmentInfo shminfo; /**< When using XShm, keeps track of XShm infos */
> -    int nomouse;
> +    int nomouse;             /**< 0 when the mouse should be recoreded. */

Unrelated.

>  };
>  
>  /**
> @@ -91,7 +91,7 @@
>      XImage *image;
>      int x_off = 0;
>      int y_off = 0;
> -    int use_shm;
> +    int use_shm, ignore;
>      char *param, *offset;
>  
>      param = av_strdup(s1->filename);
> @@ -115,6 +115,11 @@
>          return AVERROR(EIO);
>      }
>  
> +    if (!XFixesQueryExtension(dpy, &ignore, &ignore)) {
> +        av_log(s1, AV_LOG_INFO, "Disabling cursor recording. Unable to query cursor shape.\n");
> +        x11grab->nomouse = 1;
> +    }
> +
>      st = av_new_stream(s1, 0);
>      if (!st) {
>          return AVERROR(ENOMEM);
> @@ -247,7 +252,7 @@
>   * @param y Mouse pointer coordinate
>   */
>  static void
> -paint_mouse_pointer(XImage *image, struct x11_grab *s)
> +paint_mouse_pointer(XImage *image, struct x11_grab *s, AVFormatContext *s1)

s1 is rather poor a name for that variable.

>  {
>      int x_off = s->x_off;
>      int y_off = s->y_off;
> @@ -262,6 +267,12 @@
>  
>      xcim = XFixesGetCursorImage(dpy);
>  
> +    if (xcim == NULL) {
> +        av_log(s1, AV_LOG_INFO, "Couldn't load mouse image. Unable to render cusor in video.\n");
> +        s->nomouse = 1;
> +        return;
> +    }
> +
>      x = xcim->x - xcim->xhot;
>      y = xcim->y - xcim->yhot;
>  
> @@ -388,7 +399,7 @@
>      }
>  
>      if(!s->nomouse){
> -        paint_mouse_pointer(image, s);
> +        paint_mouse_pointer(image, s, s1);

You could avoid passing the context around by having
paint_mouse_pointer() return an error code and handle it here.

-- 
M?ns Rullg?rd
mans at mansr.com



More information about the ffmpeg-devel mailing list