[PATCH 1/4] quartz/vmr9: Factor out plane data copying.

Anton Baskanov baskanov at gmail.com
Sun Aug 29 08:31:38 CDT 2021


Signed-off-by: Anton Baskanov <baskanov at gmail.com>
---
 dlls/quartz/vmr9.c | 60 +++++++++++++++++++++++++++-------------------
 1 file changed, 35 insertions(+), 25 deletions(-)

diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c
index 2562b74932a..546af3d2a39 100644
--- a/dlls/quartz/vmr9.c
+++ b/dlls/quartz/vmr9.c
@@ -206,6 +206,37 @@ static inline struct quartz_vmr *impl_from_IBaseFilter(IBaseFilter *iface)
     return CONTAINING_RECORD(iface, struct quartz_vmr, renderer.filter.IBaseFilter_iface);
 }
 
+static void copy_plane(int height, int row_size, int src_pitch, int dst_pitch, BYTE *src, BYTE *dst)
+{
+    BYTE *row_src;
+    BYTE *row_dst;
+    int row;
+
+    if (src_pitch >= 0)
+    {
+        if (src_pitch == dst_pitch)
+        {
+            memcpy(dst, src, src_pitch * height);
+            return;
+        }
+        TRACE("Source pitch %d does not match dest pitch %d; copying manually.\n",
+                src_pitch, dst_pitch);
+    }
+    else
+    {
+        TRACE("Inverting image.\n");
+    }
+
+    row_src = src;
+    row_dst = dst;
+    for (row = 0; row < height; ++row)
+    {
+        memcpy(row_dst, row_src, row_size);
+        row_src += src_pitch;
+        row_dst += dst_pitch;
+    }
+}
+
 static HRESULT vmr_render(struct strmbase_renderer *iface, IMediaSample *sample)
 {
     struct quartz_vmr *filter = impl_from_IBaseFilter(&iface->filter.IBaseFilter_iface);
@@ -273,34 +304,13 @@ static HRESULT vmr_render(struct strmbase_renderer *iface, IMediaSample *sample)
 
     if (height > 0 && bitmap_header->biCompression == BI_RGB)
     {
-        BYTE *dst = (BYTE *)locked_rect.pBits + (height * locked_rect.Pitch);
-        const BYTE *src = data;
-
-        TRACE("Inverting image.\n");
-
-        while (height--)
-        {
-            dst -= locked_rect.Pitch;
-            memcpy(dst, src, width * depth / 8);
-            src += src_pitch;
-        }
+        copy_plane(height, width * depth / 8, -(int)src_pitch, locked_rect.Pitch,
+                data + src_pitch * (height - 1), locked_rect.pBits);
     }
     else if (locked_rect.Pitch != src_pitch)
     {
-        BYTE *dst = locked_rect.pBits;
-        const BYTE *src = data;
-
-        height = abs(height);
-
-        TRACE("Source pitch %u does not match dest pitch %u; copying manually.\n",
-                src_pitch, locked_rect.Pitch);
-
-        while (height--)
-        {
-            memcpy(dst, src, width * depth / 8);
-            src += src_pitch;
-            dst += locked_rect.Pitch;
-        }
+        copy_plane(abs(height), width * depth / 8, src_pitch, locked_rect.Pitch,
+                data, locked_rect.pBits);
     }
     else
     {
-- 
2.25.1




More information about the wine-devel mailing list