diff options
author | Matt Oliver <protogonoi@gmail.com> | 2015-10-05 20:00:37 +1100 |
---|---|---|
committer | Matt Oliver <protogonoi@gmail.com> | 2015-10-31 23:08:02 +1100 |
commit | e82883aa88bfccf2669e914eab9deef6cecfd0db (patch) | |
tree | 4d2c983a6f6f89e3cc7e43d93750bbe347f4b4bc /libavdevice/gdigrab.c | |
parent | 8d9f86bd3791d4448460faee03f07751d0202c32 (diff) | |
download | ffmpeg-e82883aa88bfccf2669e914eab9deef6cecfd0db.tar.gz |
gdigrab: grab right desktop size if DPI in use, based on patch from Alexander Brotzge
Signed-off-by: Matt Oliver <protogonoi@gmail.com>
Diffstat (limited to 'libavdevice/gdigrab.c')
-rw-r--r-- | libavdevice/gdigrab.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/libavdevice/gdigrab.c b/libavdevice/gdigrab.c index 9a185d4c79..4428a34ee7 100644 --- a/libavdevice/gdigrab.c +++ b/libavdevice/gdigrab.c @@ -235,6 +235,8 @@ gdigrab_read_header(AVFormatContext *s1) AVStream *st = NULL; int bpp; + int vertres; + int desktopvertres; RECT virtual_rect; RECT clip_rect; BITMAP bmp; @@ -263,13 +265,26 @@ gdigrab_read_header(AVFormatContext *s1) goto error; } + /* This will get the device context for the selected window, or if + * none, the primary screen */ + source_hdc = GetDC(hwnd); + if (!source_hdc) { + WIN32_API_ERROR("Couldn't get window device context"); + ret = AVERROR(EIO); + goto error; + } + bpp = GetDeviceCaps(source_hdc, BITSPIXEL); + if (hwnd) { GetClientRect(hwnd, &virtual_rect); } else { + /* desktop -- get the right height and width for scaling DPI */ + vertres = GetDeviceCaps(source_hdc, VERTRES); + desktopvertres = GetDeviceCaps(source_hdc, DESKTOPVERTRES); virtual_rect.left = GetSystemMetrics(SM_XVIRTUALSCREEN); virtual_rect.top = GetSystemMetrics(SM_YVIRTUALSCREEN); - virtual_rect.right = virtual_rect.left + GetSystemMetrics(SM_CXVIRTUALSCREEN); - virtual_rect.bottom = virtual_rect.top + GetSystemMetrics(SM_CYVIRTUALSCREEN); + virtual_rect.right = (virtual_rect.left + GetSystemMetrics(SM_CXVIRTUALSCREEN)) * desktopvertres / vertres; + virtual_rect.bottom = (virtual_rect.top + GetSystemMetrics(SM_CYVIRTUALSCREEN)) * desktopvertres / vertres; } /* If no width or height set, use full screen/window area */ @@ -299,15 +314,6 @@ gdigrab_read_header(AVFormatContext *s1) goto error; } - /* This will get the device context for the selected window, or if - * none, the primary screen */ - source_hdc = GetDC(hwnd); - if (!source_hdc) { - WIN32_API_ERROR("Couldn't get window device context"); - ret = AVERROR(EIO); - goto error; - } - bpp = GetDeviceCaps(source_hdc, BITSPIXEL); if (name) { av_log(s1, AV_LOG_INFO, |