[vlc-commits] vout:win32: use the vout_display_place_t instead of RECT rect_dest

Steve Lhomme git at videolan.org
Mon Apr 1 16:50:10 CEST 2019


vlc | branch: master | Steve Lhomme <robux4 at ycbcr.xyz> | Mon Mar 25 13:06:55 2019 +0100| [997fd36589bc10ef554f7d6477a39c9037606ab5] | committer: Steve Lhomme

vout:win32: use the vout_display_place_t instead of RECT rect_dest

This way we know we deal with the result of PlacePicture().

We don't need macros anymore to hide the field.

Only log when the placement actually changed.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=997fd36589bc10ef554f7d6477a39c9037606ab5
---

 modules/video_output/win32/common.c     | 55 ++++++++++++++-------------------
 modules/video_output/win32/common.h     |  6 ++--
 modules/video_output/win32/direct3d11.c | 32 ++++++++++---------
 modules/video_output/win32/direct3d9.c  | 23 ++++++++------
 modules/video_output/win32/glwin32.c    |  4 +--
 modules/video_output/win32/wingdi.c     | 10 +++---
 6 files changed, 63 insertions(+), 67 deletions(-)

diff --git a/modules/video_output/win32/common.c b/modules/video_output/win32/common.c
index 303ab5c433..269b471ae1 100644
--- a/modules/video_output/win32/common.c
+++ b/modules/video_output/win32/common.c
@@ -80,7 +80,7 @@ int CommonInit(vout_display_t *vd, vout_display_sys_win32_t *sys, bool b_windowl
     sys->hvideownd = NULL;
     sys->hparent   = NULL;
     sys->hfswnd    = NULL;
-    sys->rect_dest_changed = false;
+    sys->place_changed = false;
     sys->b_windowless = b_windowless;
     sys->is_first_placement = true;
     sys->is_on_top        = false;
@@ -184,13 +184,31 @@ void UpdateRects(vout_display_t *vd, vout_display_sys_win32_t *sys, bool is_forc
         place_cfg.align.vertical = VLC_VIDEO_ALIGN_TOP;
 #endif
 
-    vout_display_place_t place;
-    vout_display_PlacePicture(&place, source, &place_cfg);
+    vout_display_place_t before_place = sys->place;
+    vout_display_PlacePicture(&sys->place, source, &place_cfg);
+
+    /* Signal the change in size/position */
+    if (!vout_display_PlaceEquals(&before_place, &sys->place))
+    {
+        sys->place_changed |= true;
+
+#ifndef NDEBUG
+        msg_Dbg(vd, "DirectXUpdateRects source"
+            " offset: %i,%i visible: %ix%i decoded: %ix%i",
+            source->i_x_offset, source->i_y_offset,
+            source->i_visible_width, source->i_visible_height,
+            source->i_width, source->i_height);
+        msg_Dbg(vd, "DirectXUpdateRects image_dst"
+            " coords: %i,%i,%i,%i",
+            sys->place.x, sys->place.y,
+            sys->place.x + sys->place.width, sys->place.y + sys->place.height);
+#endif
+    }
 
 #if !VLC_WINSTORE_APP
     if (!sys->b_windowless)
     {
-        EventThreadUpdateSourceAndPlace(sys->event, source, &place);
+        EventThreadUpdateSourceAndPlace(sys->event, source, &sys->place);
 
         UINT swpFlags = SWP_NOCOPYBITS | SWP_NOZORDER | SWP_ASYNCWINDOWPOS;
         if (sys->is_first_placement)
@@ -199,37 +217,10 @@ void UpdateRects(vout_display_t *vd, vout_display_sys_win32_t *sys, bool is_forc
             sys->is_first_placement = false;
         }
         SetWindowPos(sys->hvideownd, 0,
-            place.x, place.y, place.width, place.height,
+            sys->place.x, sys->place.y, sys->place.width, sys->place.height,
             swpFlags);
     }
-#endif
 
-#define rect_dest           sys->rect_dest
-    RECT before_rect_dest = rect_dest;
-    /* Destination image position and dimensions */
-    rect_dest.left   = place.x;
-    rect_dest.right  = place.x + place.width;
-    rect_dest.top    = place.y;
-    rect_dest.bottom = place.y + place.height;
-
-    /* Signal the change in size/position */
-    if (!EqualRect(&before_rect_dest, &rect_dest))
-        sys->rect_dest_changed |= true;
-
-#ifndef NDEBUG
-    msg_Dbg(vd, "DirectXUpdateRects source"
-        " offset: %i,%i visible: %ix%i decoded: %ix%i",
-        source->i_x_offset, source->i_y_offset,
-        source->i_visible_width, source->i_visible_height,
-        source->i_width, source->i_height);
-    msg_Dbg(vd, "DirectXUpdateRects image_dst"
-        " coords: %li,%li,%li,%li",
-        rect_dest.left, rect_dest.top,
-        rect_dest.right, rect_dest.bottom);
-#endif
-#undef rect_dest
-
-#if !VLC_WINSTORE_APP
     CommonChangeThumbnailClip(VLC_OBJECT(vd), sys, true);
 #endif
 }
diff --git a/modules/video_output/win32/common.h b/modules/video_output/win32/common.h
index 025699adb7..e525161b43 100644
--- a/modules/video_output/win32/common.h
+++ b/modules/video_output/win32/common.h
@@ -60,14 +60,14 @@ typedef struct vout_display_sys_win32_t
     HINSTANCE     dxgidebug_dll;
 # endif
 
-    bool         rect_dest_changed;
+    bool         place_changed;
 
     /* Misc */
     bool is_first_placement;
     bool is_on_top;
 
-    /* Coordinates of src and dest images (used when blitting to display) */
-    RECT         rect_dest;
+    /* Coordinates of dest images (used when blitting to display) */
+    vout_display_place_t  place;
 
     vout_display_cfg_t vdcfg;
 
diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c
index ac12897a06..d710cce8b7 100644
--- a/modules/video_output/win32/direct3d11.c
+++ b/modules/video_output/win32/direct3d11.c
@@ -188,8 +188,8 @@ static HRESULT UpdateBackBuffer(vout_display_t *vd)
 {
     vout_display_sys_t *sys = vd->sys;
     UINT i_width, i_height;
-    i_width  = RECTWidth(sys->sys.rect_dest);
-    i_height = RECTHeight(sys->sys.rect_dest);
+    i_width  = sys->sys.place.width;
+    i_height = sys->sys.place.height;
 
     if (!sys->resizeCb(sys->outside_opaque, i_width, i_height))
         return E_FAIL;
@@ -200,8 +200,8 @@ static HRESULT UpdateBackBuffer(vout_display_t *vd)
 static void UpdateSize(vout_display_t *vd)
 {
     vout_display_sys_t *sys = vd->sys;
-    msg_Dbg(vd, "Detected size change %dx%d", RECTWidth(sys->sys.rect_dest),
-            RECTHeight(sys->sys.rect_dest));
+    msg_Dbg(vd, "Detected size change %dx%d", sys->sys.place.width,
+            sys->sys.place.height);
 
     UpdateBackBuffer(vd);
 
@@ -285,10 +285,10 @@ static bool StartRendering(void *opaque)
 
     CommonManage(vd, &sys->sys);
 
-    if ( sys->sys.rect_dest_changed )
+    if ( sys->sys.place_changed )
     {
         UpdateSize(vd);
-        sys->sys.rect_dest_changed =false;
+        sys->sys.place_changed =false;
     }
 
     D3D11_ClearRenderTargets( &sys->d3d_dev, sys->display.pixelFormat, sys->swapchainTargetView );
@@ -750,10 +750,10 @@ static int Control(vout_display_t *vd, int query, va_list args)
         }
     }
 
-    if ( sys->sys.rect_dest_changed )
+    if ( sys->sys.place_changed )
     {
         UpdateSize(vd);
-        sys->sys.rect_dest_changed =false;
+        sys->sys.place_changed =false;
     }
 
     return res;
@@ -1357,8 +1357,12 @@ static void UpdatePicQuadPosition(vout_display_t *vd)
 {
     vout_display_sys_t *sys = vd->sys;
 
-    RECT rect_dst = sys->sys.rect_dest;
-    OffsetRect(&rect_dst, -rect_dst.left, -rect_dst.top);
+    RECT rect_dst = {
+        .left   = 0,
+        .right  = sys->sys.place.width,
+        .top    = 0,
+        .bottom = sys->sys.place.height
+    };
 
     D3D11_UpdateViewport( &sys->picQuad, &rect_dst, sys->display.pixelFormat );
 
@@ -1802,10 +1806,10 @@ static int Direct3D11MapSubpicture(vout_display_t *vd, int *subpicture_region_co
         d3d_quad_t *quad = (d3d_quad_t *) quad_picture->p_sys;
 
         RECT spuViewport;
-        spuViewport.left   = (FLOAT) r->i_x * RECTWidth(sys->sys.rect_dest)  / subpicture->i_original_picture_width;
-        spuViewport.top    = (FLOAT) r->i_y * RECTHeight(sys->sys.rect_dest) / subpicture->i_original_picture_height;
-        spuViewport.right  = (FLOAT) (r->i_x + r->fmt.i_visible_width)  * RECTWidth(sys->sys.rect_dest)  / subpicture->i_original_picture_width;
-        spuViewport.bottom = (FLOAT) (r->i_y + r->fmt.i_visible_height) * RECTHeight(sys->sys.rect_dest) / subpicture->i_original_picture_height;
+        spuViewport.left   = (FLOAT) r->i_x * sys->sys.place.width  / subpicture->i_original_picture_width;
+        spuViewport.top    = (FLOAT) r->i_y * sys->sys.place.height / subpicture->i_original_picture_height;
+        spuViewport.right  = (FLOAT) (r->i_x + r->fmt.i_visible_width)  * sys->sys.place.width  / subpicture->i_original_picture_width;
+        spuViewport.bottom = (FLOAT) (r->i_y + r->fmt.i_visible_height) * sys->sys.place.height / subpicture->i_original_picture_height;
 
         if (r->zoom_h.num != 0 && r->zoom_h.den != 0)
         {
diff --git a/modules/video_output/win32/direct3d9.c b/modules/video_output/win32/direct3d9.c
index 90c06797b5..a64593844c 100644
--- a/modules/video_output/win32/direct3d9.c
+++ b/modules/video_output/win32/direct3d9.c
@@ -485,9 +485,9 @@ static int Direct3D9ImportPicture(vout_display_t *vd,
     };
     RECT rect_dst = {
         .left   = 0,
-        .right  = RECTWidth(sys->sys.rect_dest),
+        .right  = vd->sys->sys.place.width,
         .top    = 0,
-        .bottom = RECTHeight(sys->sys.rect_dest),
+        .bottom = vd->sys->sys.place.height,
     };
     Direct3D9SetupVertices(region->vertex, &rect_src, &copy_rect,
                            &rect_dst, 255, vd->source.orientation);
@@ -945,7 +945,7 @@ static void Manage (vout_display_t *vd)
         UpdateDesktopMode(vd);
 
     /* Position Change */
-    if (sys->sys.rect_dest_changed) {
+    if (sys->sys.place_changed) {
 #if 0 /* need that when bicubic filter is available */
         RECT rect;
         UINT width, height;
@@ -963,7 +963,7 @@ static void Manage (vout_display_t *vd)
         }
 #endif
         sys->clear_scene = true;
-        sys->sys.rect_dest_changed = false;
+        sys->sys.place_changed = false;
     }
 }
 
@@ -1060,10 +1060,9 @@ static void Direct3D9ImportSubpicture(vout_display_t *vd,
             msg_Err(vd, "Failed to lock the texture");
         }
 
-        /* Map the subpicture to sys->sys.rect_dest */
-        const RECT video = sys->sys.rect_dest;
-        const float scale_w = (float)(RECTWidth(video)) / subpicture->i_original_picture_width;
-        const float scale_h = (float)(RECTHeight(video))  / subpicture->i_original_picture_height;
+        /* Map the subpicture to sys->sys.sys.place */
+        const float scale_w = (float)(sys->sys.place.width)  / subpicture->i_original_picture_width;
+        const float scale_h = (float)(sys->sys.place.height) / subpicture->i_original_picture_height;
 
         RECT dst;
         dst.left   =            scale_w * r->i_x,
@@ -1337,8 +1336,12 @@ static void Swap(void *opaque)
 
     // Present the back buffer contents to the display
     // No stretching should happen here !
-    RECT src = sys->sys.rect_dest;
-    OffsetRect(&src, -src.left, -src.top);
+    RECT src = {
+        .left   = 0,
+        .right  = sys->sys.place.width,
+        .top    = 0,
+        .bottom = sys->sys.place.height
+    };
     
     HRESULT hr;
     if (sys->hd3d.use_ex) {
diff --git a/modules/video_output/win32/glwin32.c b/modules/video_output/win32/glwin32.c
index 838f27cc22..6bc321e717 100644
--- a/modules/video_output/win32/glwin32.c
+++ b/modules/video_output/win32/glwin32.c
@@ -247,8 +247,8 @@ static void Manage (vout_display_t *vd)
 
     CommonManage(vd, &sys->sys);
 
-    const int width  = RECTWidth(sys->sys.rect_dest);
-    const int height = RECTHeight(sys->sys.rect_dest);
+    const int width  = sys->sys.place.width;
+    const int height = sys->sys.place.height;
     vlc_gl_Resize (sys->gl, width, height);
     if (vlc_gl_MakeCurrent (sys->gl) != VLC_SUCCESS)
         return;
diff --git a/modules/video_output/win32/wingdi.c b/modules/video_output/win32/wingdi.c
index 734d0e8084..5c8e6de7ed 100644
--- a/modules/video_output/win32/wingdi.c
+++ b/modules/video_output/win32/wingdi.c
@@ -151,15 +151,14 @@ static void Display(vout_display_t *vd, picture_t *picture)
     vout_display_sys_t *sys = vd->sys;
     VLC_UNUSED(picture);
 
-#define rect_dest     sys->sys.rect_dest
     HDC hdc = GetDC(sys->sys.hvideownd);
 
     SelectObject(sys->off_dc, sys->off_bitmap);
 
-    if (RECTWidth(rect_dest)  != vd->source.i_visible_width ||
-        RECTHeight(rect_dest) != vd->source.i_visible_height) {
+    if (sys->sys.place.width  != vd->source.i_visible_width ||
+        sys->sys.place.height != vd->source.i_visible_height) {
         StretchBlt(hdc, 0, 0,
-                   RECTWidth(rect_dest), RECTHeight(rect_dest),
+                   sys->sys.place.width, sys->sys.place.height,
                    sys->off_dc,
                    vd->source.i_x_offset, vd->source.i_y_offset,
                    vd->source.i_x_offset + vd->source.i_visible_width,
@@ -167,14 +166,13 @@ static void Display(vout_display_t *vd, picture_t *picture)
                    SRCCOPY);
     } else {
         BitBlt(hdc, 0, 0,
-               RECTWidth(rect_dest), RECTHeight(rect_dest),
+               sys->sys.place.width, sys->sys.place.height,
                sys->off_dc,
                vd->source.i_x_offset, vd->source.i_y_offset,
                SRCCOPY);
     }
 
     ReleaseDC(sys->sys.hvideownd, hdc);
-#undef rect_dest
 
     CommonManage(vd, &sys->sys);
 }



More information about the vlc-commits mailing list