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