[PATCH 6/6] qcap/videocapture: Remove unnecessary code for resizing.

Jactry Zeng jzeng at codeweavers.com
Thu Apr 23 00:29:30 CDT 2020


If I understand it correctly, it is impossible for application to set
a resolution which isn't supported by the device now, since SetFormat()
will fail when an invalid is given. Hence we don't need to handle this
case anymore.

Signed-off-by: Jactry Zeng <jzeng at codeweavers.com>
---
 dlls/qcap/v4l.c | 80 +++++++++----------------------------------------
 1 file changed, 14 insertions(+), 66 deletions(-)

diff --git a/dlls/qcap/v4l.c b/dlls/qcap/v4l.c
index b264203bcc..eab9ecd2e2 100644
--- a/dlls/qcap/v4l.c
+++ b/dlls/qcap/v4l.c
@@ -103,11 +103,9 @@ struct capabilitie
 
 struct _Capture
 {
-    UINT outputwidth, outputheight;
     struct capabilitie *current_cap;
     struct capabilitie **caps;
     LONG caps_count;
-    BOOL swresize;
 
     struct strmbase_source *pin;
     int fd, mmap;
@@ -206,8 +204,6 @@ HRESULT qcap_driver_set_format(Capture *device, AM_MEDIA_TYPE *mt)
             || format.fmt.pix.height != newheight)
         ERR("Failed to set pixel format: %s.\n", strerror(errno));
 
-    device->outputwidth = format.fmt.pix.width;
-    device->outputheight = format.fmt.pix.height;
     return S_OK;
 }
 
@@ -297,61 +293,22 @@ HRESULT qcap_driver_set_prop(Capture *device, VideoProcAmpProperty property,
 
 static void Resize(const Capture * capBox, LPBYTE output, const BYTE *input)
 {
-    UINT width, height, bitdepth, depth;
+    int inoffset, outoffset, ow;
+    struct capabilitie *cap;
 
-    width = capBox->current_cap->width;
-    height = capBox->current_cap->height;
-    bitdepth = capBox->current_cap->depth;
-    depth = bitdepth / 8;
+    cap = capBox->current_cap;
+    outoffset = cap->width * cap->height * cap->depth / 8;
+    ow = cap->width * cap->depth / 8;
+    inoffset = 0;
     /* the whole image needs to be reversed,
        because the dibs are messed up in windows */
-    if (!capBox->swresize)
+    while (outoffset > 0)
     {
-        int inoffset = 0, outoffset = height * width * depth;
-        int ow = width * depth;
-        while (outoffset > 0)
-        {
-            int x;
-            outoffset -= ow;
-            for (x = 0; x < ow; x++)
-                output[outoffset + x] = input[inoffset + x];
-            inoffset += ow;
-        }
-    }
-    else
-    {
-        HDC dc_s, dc_d;
-        HBITMAP bmp_s, bmp_d;
-        int inoffset = 0, outoffset = (capBox->outputheight) * capBox->outputwidth * depth;
-        int ow = capBox->outputwidth * depth;
-        LPBYTE myarray;
-
-        /* FIXME: Improve software resizing: add error checks and optimize */
-
-        myarray = CoTaskMemAlloc(capBox->outputwidth * capBox->outputheight * depth);
-        dc_s = CreateCompatibleDC(NULL);
-        dc_d = CreateCompatibleDC(NULL);
-        bmp_s = CreateBitmap(width, height, 1, bitdepth, input);
-        bmp_d = CreateBitmap(capBox->outputwidth, capBox->outputheight, 1, bitdepth, NULL);
-        SelectObject(dc_s, bmp_s);
-        SelectObject(dc_d, bmp_d);
-        StretchBlt(dc_d, 0, 0, capBox->outputwidth, capBox->outputheight,
-                   dc_s, 0, 0, width, height, SRCCOPY);
-        GetBitmapBits(bmp_d, capBox->outputwidth * capBox->outputheight * depth, myarray);
-        while (outoffset > 0)
-        {
-            int i;
-
-            outoffset -= ow;
-            for (i = 0; i < ow; i++)
-                output[outoffset + i] = myarray[inoffset + i];
-            inoffset += ow;
-        }
-        CoTaskMemFree(myarray);
-        DeleteObject(dc_s);
-        DeleteObject(dc_d);
-        DeleteObject(bmp_s);
-        DeleteObject(bmp_d);
+        int x;
+        outoffset -= ow;
+        for (x = 0; x < ow; x++)
+            output[outoffset + x] = input[inoffset + x];
+        inoffset += ow;
     }
 }
 
@@ -385,10 +342,7 @@ static DWORD WINAPI ReadThread(LPVOID lParam)
         {
             int len;
             
-            if (!capBox->swresize)
-                len = height * width * depth;
-            else
-                len = capBox->outputheight * capBox->outputwidth * depth;
+            len = height * width * depth;
             IMediaSample_SetActualDataLength(pSample, len);
 
             len = IMediaSample_GetActualDataLength(pSample);
@@ -427,10 +381,7 @@ void qcap_driver_init_stream(Capture *device)
     HRESULT hr;
 
     req_props.cBuffers = 3;
-    if (!device->swresize)
-        req_props.cbBuffer = device->current_cap->width * device->current_cap->height;
-    else
-        req_props.cbBuffer = device->outputwidth * device->outputheight;
+    req_props.cbBuffer = device->current_cap->width * device->current_cap->height;
     req_props.cbBuffer = (req_props.cbBuffer * device->current_cap->depth) / 8;
     req_props.cbAlign = 1;
     req_props.cbPrefix = 0;
@@ -685,9 +636,6 @@ Capture *qcap_driver_init(struct strmbase_source *pin, USHORT card)
         goto error;
     }
 
-    device->outputwidth = format.fmt.pix.width;
-    device->outputheight = format.fmt.pix.height;
-    device->swresize = FALSE;
     device->pin = pin;
     device->state = State_Stopped;
     device->run_event = CreateEventW(NULL, TRUE, FALSE, NULL);
-- 
2.26.1



More information about the wine-devel mailing list