[FFmpeg-devel] [PATCH] avdevice/gdigrab: client_only option to discard decorations such as titlebar or borders

Sergio Acereda sergio.acereda at gmail.com
Fri Jun 19 11:33:00 EEST 2020


---
libavdevice/gdigrab.c | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)

diff --git a/libavdevice/gdigrab.c b/libavdevice/gdigrab.c
index f4444406fa..b09c88d94d 100644
--- a/libavdevice/gdigrab.c
+++ b/libavdevice/gdigrab.c
@@ -52,6 +52,7 @@ struct gdigrab {
    int        height;      /**< Height of the grab frame (private option) */
    int        offset_x;    /**< Capture x offset (private option) */
    int        offset_y;    /**< Capture y offset (private option) */
+    int        client_only; /**< Discard decorations, such as titlebar (private option) */

    HWND       hwnd;        /**< Handle of the window for the grab */
    HDC        source_hdc;  /**< Source device context */
@@ -212,6 +213,20 @@ gdigrab_region_wnd_update(AVFormatContext *s1, struct gdigrab *gdigrab)
    }
}

+/**
+ * Fetch titlebar height from handle.
+ *
+ * @param hwnd Handle of the window.
+ * @return titlebar height
+ */
+static int
+calc_titlebar_height(HWND hwnd) {
+    TITLEBARINFOEX tinfo;
+    tinfo.cbSize = sizeof(tinfo);
+    SendMessage(hwnd, WM_GETTITLEBARINFOEX, 0, (LPARAM)&tinfo);
+    return tinfo.rcTitleBar.bottom - tinfo.rcTitleBar.top;
+}
+
/**
 * Initializes the gdi grab device demuxer (public device demuxer API).
 *
@@ -284,6 +299,15 @@ gdigrab_read_header(AVFormatContext *s1)

    if (hwnd) {
        GetClientRect(hwnd, &virtual_rect);
+        if (gdigrab->client_only) {
+            int cxborder = GetSystemMetrics(SM_CXBORDER);
+            int cyborder = GetSystemMetrics(SM_CYBORDER);
+            int titlebar_height = calc_titlebar_height(hwnd);
+            virtual_rect.left   += cxborder;
+            virtual_rect.right  += -cxborder;
+            virtual_rect.top    += cxborder + titlebar_height;
+            virtual_rect.bottom += -cyborder;
+        }
        /* window -- get the right height and width for scaling DPI */
        virtual_rect.left   = virtual_rect.left   * desktophorzres / horzres;
        virtual_rect.right  = virtual_rect.right  * desktophorzres / horzres;
@@ -639,6 +663,7 @@ static const AVOption options[] = {
    { "video_size", "set video frame size", OFFSET(width), AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL}, 0, 0, DEC },
    { "offset_x", "capture area x offset", OFFSET(offset_x), AV_OPT_TYPE_INT, {.i64 = 0}, INT_MIN, INT_MAX, DEC },
    { "offset_y", "capture area y offset", OFFSET(offset_y), AV_OPT_TYPE_INT, {.i64 = 0}, INT_MIN, INT_MAX, DEC },
+    { "client_only", "client only", OFFSET(client_only), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, DEC },
    { NULL },
};

-- 
2.27.0.windows.1


More information about the ffmpeg-devel mailing list