[FFmpeg-devel] PATCH: gdigrab work for DPI in windows

Matt Oliver protogonoi at gmail.com
Mon Oct 5 10:29:31 CEST 2015


On 30 September 2015 at 02:48, wm4 <nfxjfg at googlemail.com> wrote:

> On Wed, 23 Sep 2015 12:04:43 -0600
> Roger Pack <rogerdpack2 at gmail.com> wrote:
>
> > From 6a972dda58bd5ab31524cd4e5326b4bcdeaeaa8c Mon Sep 17 00:00:00 2001
> > From: rogerdpack <rogerpack2005 at 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 <rogerpack2005 at 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.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-gdigrab-grab-right-desktop-size-if-DPI-in-use-based-.patch
Type: application/octet-stream
Size: 2604 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20151005/6a9359c3/attachment.obj>


More information about the ffmpeg-devel mailing list