On Sun, 31 Jul 2011 00:27:46 +0800, Yu-Jie Lin <[email protected]> wrote:
> On Sat, Jul 30, 2011 at 21:15, Luca Barbato <[email protected]> wrote:
> >
> > Same comments as your previous patch:
> >
> > - using just the AVOption is enough (though it should be documented)
> > - please keep the vars aligned properly in the context struct
> 
> Updated. The parsing input filename is removed, now read from
> AVOption, show_region. And updated the doc accordingly.
> From bcc2bdab114b0ed859c651b58c63bf74f0ab3f0d Mon Sep 17 00:00:00 2001
> From: Yu-Jie Lin <[email protected]>
> Date: Sat, 30 Jul 2011 19:13:43 +0800
> Subject: [PATCH 2/2] x11grab: add show_region AVOption.
> 
> Draw the current grabbing region for indication.
> 
> Signed-off-by: Yu-Jie Lin <[email protected]>
> ---
>  doc/ffmpeg.texi       |   17 +++++++++
>  doc/indevs.texi       |   12 +++++++
>  libavdevice/x11grab.c |   89 
> +++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 118 insertions(+), 0 deletions(-)
> 
> diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi
> index 6da4cd6..161d44a 100644
> --- a/doc/ffmpeg.texi
> +++ b/doc/ffmpeg.texi
> @@ -920,6 +920,23 @@ ffmpeg -f x11grab -follow_mouse 100 -s cif -r 25 -i :0.0 
> /tmp/out.mpg
>  variable. Grabbing region follows the mouse pointer, but only when mouse
>  pointer reaches within 100 pixels to the edge of grabbing region.
>  
> +@example
> +ffmpeg -f x11grab -show_region 1 -s cif -r 25 -i :0.0+10,20 /tmp/out.mpg
> +@end example
> +
> +0.0 is display.screen number of your X11 server, same as the DISPLAY 
> environment
> +variable. 10 is the x-offset and 20 the y-offset for the grabbing, also a
> +grabbing region will be indicated on screen.
> +
> +@example
> +ffmpeg -f x11grab -follow_mouse -1 -show_region 1 -s cif -r 25 -i :0.0 
> /tmp/out.mpg
> +@end example
> +
> +0.0 is display.screen number of your X11 server, same as the DISPLAY 
> environment
> +variable. Grabbing region follows the mouse pointer and a grabbing region
> +will be indicated on screen.
> +
> +
>  @section Video and Audio file format conversion
>  
>  Any supported file format and protocol can serve as input to ffmpeg:
> diff --git a/doc/indevs.texi b/doc/indevs.texi
> index 74a0969..0caaf90 100644
> --- a/doc/indevs.texi
> +++ b/doc/indevs.texi
> @@ -267,4 +267,16 @@ ffmpeg -f x11grab -follow_mouse -1 -r 25 -s cif -i :0.0 
> out.mpg
>  ffmpeg -f x11grab -follow_mouse 100 -r 25 -s cif -i :0.0 out.mpg
>  @end example
>  
> +If @var{show_region} AVOption is specified with @var{1} as value, then the
> +grabbing region will be indicated on screen. With this option, it's easy to
> +know what is being grabbed if only grab a portion of the screen.
> +
> +For example:
> +@example
> +ffmpeg -f x11grab -show_region 1 -r 25 -s cif -i :0.0+10,20 out.mpg
> +
> +# With follow_mouse
> +ffmpeg -f x11grab -follow_mouse -1 -show_region 1  -r 25 -s cif -i :0.0 
> out.mpg
> +@end example
> +

As in the previous patch, there's no need to repeat what's been already
explained in the examples above.

>  @c man end INPUT DEVICES
> diff --git a/libavdevice/x11grab.c b/libavdevice/x11grab.c
> index 8023d7f..3c7547a 100644
> --- a/libavdevice/x11grab.c
> +++ b/libavdevice/x11grab.c
> @@ -47,6 +47,7 @@
>  #include <X11/Xproto.h>
>  #include <X11/Xutil.h>
>  #include <sys/shm.h>
> +#include <X11/extensions/shape.h>
>  #include <X11/extensions/XShm.h>
>  #include <X11/extensions/Xfixes.h>
>  
> @@ -72,9 +73,74 @@ struct x11_grab
>      XShmSegmentInfo shminfo; /**< When using XShm, keeps track of XShm infos 
> */
>      int  draw_mouse;         /**< Set by a private option. */
>      int  follow_mouse;       /**< Set by a private option. */
> +    int  show_region;        /**< set by a private option. */
>      char *framerate;         /**< Set by a private option. */
> +
> +    Window region_win;       /**< This is used by show_region option. */
>  };
>  
> +#define REGION_WIN_BORDER 3
> +/**
> + * Draw grabbing region window
> + *
> + * @param s x11_grab context
> + */
> +static void
> +x11grab_draw_region_win(struct x11_grab *s)
> +{
> +    Display *dpy = s->dpy;
> +    int screen;
> +    Window win = s->region_win;
> +    GC gc;
> +
> +    screen = DefaultScreen(dpy);
> +    gc = XCreateGC(dpy, win, 0, 0);
> +    XSetForeground(dpy, gc, WhitePixel(dpy, screen));
> +    XSetBackground(dpy, gc, BlackPixel(dpy, screen));
> +    XSetLineAttributes(dpy, gc, 3, LineDoubleDash, 0, 0);
                                   ^
Shouldn't this be REGION_WIN_BORDER?

> +    XDrawRectangle(dpy, win, gc,
> +                   1, 1,
> +                   s->width + REGION_WIN_BORDER * 2 - 1 * 2 - 1,
                                                   ^^^^^^^^^^^^^^^
It's not very clear to me what are those for. Can you explain?

> +                   s->height + REGION_WIN_BORDER * 2 - 1 * 2 - 1);
> +    XFreeGC(dpy, gc);
> +}
> +
> +/**
> + * Initialize grabbing region window
> + *
> + * @param s x11_grab context
> + */
> +static void
> +x11grab_region_win_init(struct x11_grab *s)
> +{
> +    Display *dpy = s->dpy;
> +    int screen;
> +    XSetWindowAttributes attribs;
> +    XRectangle rect;
> +
> +    screen = DefaultScreen(dpy);
> +    attribs.override_redirect = True;
> +    s->region_win = XCreateWindow(
> +        dpy, RootWindow(dpy, screen),
> +        s->x_off - REGION_WIN_BORDER,
> +        s->y_off - REGION_WIN_BORDER,
> +        s->width + REGION_WIN_BORDER * 2,
> +        s->height + REGION_WIN_BORDER * 2,
> +        0, CopyFromParent,
> +        InputOutput, CopyFromParent,
> +        CWOverrideRedirect, &attribs);
> +    rect.x = 0;
> +    rect.y = 0;
> +    rect.width = s->width;
> +    rect.height = s->height;
> +    XShapeCombineRectangles(dpy, s->region_win,
> +                            ShapeBounding, REGION_WIN_BORDER, 
> REGION_WIN_BORDER,
> +                            &rect, 1, ShapeSubtract, 0);
> +    XMapWindow(dpy, s->region_win);
> +    XSelectInput(dpy, s->region_win, ExposureMask | StructureNotifyMask);
> +    x11grab_draw_region_win(s);
> +}
> +
>  /**
>   * Initialize the x11 grab device demuxer (public device demuxer API).
>   *
> @@ -109,6 +175,7 @@ x11grab_read_header(AVFormatContext *s1, 
> AVFormatParameters *ap)
>          x11grab->draw_mouse = !strstr(offset, "nomouse");
>          *offset= 0;
>      }
> +    x11grab->region_win = 0;

No need for this, private contexts are initialised to 0.

Looks fine otherwise if tested.

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

Reply via email to