On 5 October 2015 at 19:29, Matt Oliver <protogo...@gmail.com> wrote:
> On 30 September 2015 at 02:48, wm4 <nfx...@googlemail.com> wrote: > >> On Wed, 23 Sep 2015 12:04:43 -0600 >> Roger Pack <rogerdpa...@gmail.com> wrote: >> >> > From 6a972dda58bd5ab31524cd4e5326b4bcdeaeaa8c Mon Sep 17 00:00:00 2001 >> > From: rogerdpack <rogerpack2...@gmail.com> >> > Date: Wed, 23 Sep 2015 12:03:27 -0600 >> > Subject: [PATCH] gdigrab: grab right desktop size if DPI in use, based >> on >> > patch from Alexander Brotzge >> > >> > Signed-off-by: rogerdpack <rogerpack2...@gmail.com> >> > --- >> > libavdevice/gdigrab.c | 44 +++++++++++++++++++++++++++++--------------- >> > 1 file changed, 29 insertions(+), 15 deletions(-) >> > >> > diff --git a/libavdevice/gdigrab.c b/libavdevice/gdigrab.c >> > index 9a185d4..b0faf45 100644 >> > --- a/libavdevice/gdigrab.c >> > +++ b/libavdevice/gdigrab.c >> > @@ -235,6 +235,9 @@ gdigrab_read_header(AVFormatContext *s1) >> > AVStream *st = NULL; >> > >> > int bpp; >> > + int vertres; >> > + int desktopvertres; >> > + float scale; >> > RECT virtual_rect; >> > RECT clip_rect; >> > BITMAP bmp; >> > @@ -263,14 +266,34 @@ gdigrab_read_header(AVFormatContext *s1) >> > goto error; >> > } >> > >> > - if (hwnd) { >> > - GetClientRect(hwnd, &virtual_rect); >> > - } else { >> > + /* 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); >> > + >> > + scale = 1.0; >> > + if (hwnd == NULL) { >> > + /* desktop -- get the right height and width for scaling DPI */ >> > + vertres = GetDeviceCaps(source_hdc, VERTRES); >> > + desktopvertres = GetDeviceCaps(source_hdc, DESKTOPVERTRES); >> > + scale = (float) desktopvertres / (float) vertres; >> > + } >> > > This seems a little redundant as scale is only being set when hwnd is null > however in the below lines its then being used in the opposite conditional. > Since this checks for hwnd essentially being non null then scale is always > going to be the inital value of 1. > > >> > + if (hwnd) { >> > + GetClientRect(hwnd, &virtual_rect); >> > + virtual_rect.right = virtual_rect.right * scale; >> > + virtual_rect.bottom = virtual_rect.bottom * scale; >> > + } else { >> > 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)) * scale; >> > + virtual_rect.bottom = (virtual_rect.top + >> GetSystemMetrics(SM_CYVIRTUALSCREEN)) * scale; >> > + } >> > > This if else could be combined with the above if as scale is only a value > different to 1 in the 'else' case. Also as wm4 said it would probably be > better to keep the scale factors as ints. > > >> > >> > /* If no width or height set, use full screen/window area */ >> > if (!gdigrab->width || !gdigrab->height) { >> > @@ -299,15 +322,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, > > > However I think the basic dpi scaling technique is correct. However I > would think it should be more along the lines of the modifications Ive > attached. > Woops, allow me to try that again without windows messing up the patches line endings.
0001-gdigrab-grab-right-desktop-size-if-DPI-in-use-based-.patch
Description: Binary data
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel