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 + @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); + XDrawRectangle(dpy, win, gc, + 1, 1, + s->width + REGION_WIN_BORDER * 2 - 1 * 2 - 1, + 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; if ((ret = av_parse_video_size(&x11grab->width, &x11grab->height, x11grab->video_size)) < 0) { av_log(s1, AV_LOG_ERROR, "Couldn't parse video size.\n"); @@ -453,6 +520,23 @@ x11grab_read_packet(AVFormatContext *s1, AVPacket *pkt) // adjust grabbing region position if it goes out of screen. s->x_off = x_off = FFMIN(FFMAX(x_off, 0), screen_w - s->width); s->y_off = y_off = FFMIN(FFMAX(y_off, 0), screen_h - s->height); + + if (s->show_region && s->region_win) + XMoveWindow(dpy, s->region_win, + s->x_off - REGION_WIN_BORDER, + s->y_off - REGION_WIN_BORDER); + } + + if (s->show_region) { + if (s->region_win) { + XEvent evt; + // clean up the events, and do the initinal draw or redraw. + for (evt.type = NoEventMask; XCheckMaskEvent(dpy, ExposureMask | StructureNotifyMask, &evt); ); + if (evt.type) + x11grab_draw_region_win(s); + } else { + x11grab_region_win_init(s); + } } if(s->use_shm) { @@ -496,6 +580,10 @@ x11grab_read_close(AVFormatContext *s1) x11grab->image = NULL; } + if (x11grab->region_win) { + XDestroyWindow(x11grab->dpy, x11grab->region_win); + } + /* Free X11 display */ XCloseDisplay(x11grab->dpy); return 0; @@ -508,6 +596,7 @@ static const AVOption options[] = { { "framerate", "", OFFSET(framerate), FF_OPT_TYPE_STRING, {.str = "ntsc"}, 0, 0, DEC }, { "draw_mouse", "Draw the mouse pointer.", OFFSET(draw_mouse), FF_OPT_TYPE_INT, { 1 }, 0, 1, DEC }, { "follow_mouse", "Follow the mouse pointer.", OFFSET(follow_mouse), FF_OPT_TYPE_INT, { 0 }, -1, INT_MAX, DEC }, + { "show_region", "Show the grabbing region.", OFFSET(show_region), FF_OPT_TYPE_INT, { 0 }, 0, 1, DEC }, { NULL }, }; -- 1.7.3.4
_______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
