ffmpeg | branch: master | Matt Oliver <[email protected]> | Mon Oct 5 20:00:37 2015 +1100| [e82883aa88bfccf2669e914eab9deef6cecfd0db] | committer: Matt Oliver
gdigrab: grab right desktop size if DPI in use, based on patch from Alexander Brotzge Signed-off-by: Matt Oliver <[email protected]> > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=e82883aa88bfccf2669e914eab9deef6cecfd0db --- libavdevice/gdigrab.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/libavdevice/gdigrab.c b/libavdevice/gdigrab.c index 9a185d4..4428a34 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, _______________________________________________ ffmpeg-cvslog mailing list [email protected] http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
