aboutsummaryrefslogtreecommitdiffstats
path: root/libavdevice/gdigrab.c
diff options
context:
space:
mode:
authorMatt Oliver <protogonoi@gmail.com>2015-10-05 20:00:37 +1100
committerMatt Oliver <protogonoi@gmail.com>2015-10-31 23:08:02 +1100
commite82883aa88bfccf2669e914eab9deef6cecfd0db (patch)
tree4d2c983a6f6f89e3cc7e43d93750bbe347f4b4bc /libavdevice/gdigrab.c
parent8d9f86bd3791d4448460faee03f07751d0202c32 (diff)
downloadffmpeg-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.c28
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,