diff options
-rw-r--r-- | Changelog | 1 | ||||
-rw-r--r-- | doc/indevs.texi | 8 | ||||
-rw-r--r-- | libavdevice/gdigrab.c | 15 |
3 files changed, 21 insertions, 3 deletions
@@ -9,6 +9,7 @@ version <next>: - aap filter - demuxing, decoding, filtering, encoding, and muxing in the ffmpeg CLI now all run in parallel +- enable gdigrab device to grab a window using the hwnd=HANDLER syntax version 6.1: - libaribcaption decoder diff --git a/doc/indevs.texi b/doc/indevs.texi index 863536a34d..a0c684f545 100644 --- a/doc/indevs.texi +++ b/doc/indevs.texi @@ -722,7 +722,7 @@ Win32 GDI-based screen capture device. This device allows you to capture a region of the display on Windows. -There are two options for the input filename: +Amongst options for the imput filenames are such elements as: @example desktop @end example @@ -730,9 +730,13 @@ or @example title=@var{window_title} @end example +or +@example +hwnd=@var{window_hwnd} +@end example The first option will capture the entire desktop, or a fixed region of the -desktop. The second option will instead capture the contents of a single +desktop. The second and third options will instead capture the contents of a single window, regardless of its position on the screen. For example, to grab the entire desktop using @command{ffmpeg}: diff --git a/libavdevice/gdigrab.c b/libavdevice/gdigrab.c index c069232472..41ef370f2b 100644 --- a/libavdevice/gdigrab.c +++ b/libavdevice/gdigrab.c @@ -273,9 +273,22 @@ gdigrab_read_header(AVFormatContext *s1) } } else if (!strcmp(filename, "desktop")) { hwnd = NULL; + } else if (!strncmp(filename, "hwnd=", 5)) { + name = filename + 5; + char *p; + + hwnd = strtol(name, &p, 0); + + if (p == NULL || p == name || p[0] == '\0') + { + av_log(s1, AV_LOG_ERROR, + "Invalid window handle '%s', must be a valid integer.\n", name); + ret = AVERROR(EINVAL); + goto error; + } } else { av_log(s1, AV_LOG_ERROR, - "Please use \"desktop\" or \"title=<windowname>\" to specify your target.\n"); + "Please use \"desktop\", \"title=<windowname>\" or \"hwnd=<hwnd>\" to specify your target.\n"); ret = AVERROR(EIO); goto error; } |