[PATCH 1/5] quartz/tests: Add some tests for IBasicVideo::GetCurrentImage().

Zebediah Figura z.figura12 at gmail.com
Mon Feb 10 19:22:16 CST 2020


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/quartz/tests/videorenderer.c |  76 ++++++++++++++++++++++
 dlls/quartz/tests/vmr7.c          | 101 ++++++++++++++++++++++++++++++
 dlls/quartz/tests/vmr9.c          |  98 +++++++++++++++++++++++++++++
 3 files changed, 275 insertions(+)

diff --git a/dlls/quartz/tests/videorenderer.c b/dlls/quartz/tests/videorenderer.c
index 4e26a18f83..f0c84c60e3 100644
--- a/dlls/quartz/tests/videorenderer.c
+++ b/dlls/quartz/tests/videorenderer.c
@@ -1071,6 +1071,81 @@ static void test_eos(IPin *pin, IMemInputPin *input, IFilterGraph2 *graph)
     IMediaControl_Release(control);
 }
 
+static void test_current_image(IBaseFilter *filter, IMemInputPin *input,
+        IFilterGraph2 *graph, const BITMAPINFOHEADER *expect_bih)
+{
+    LONG buffer[(sizeof(BITMAPINFOHEADER) + 32 * 16 * 2) / 4];
+    const BITMAPINFOHEADER *bih = (BITMAPINFOHEADER *)buffer;
+    IMediaControl *control;
+    OAFilterState state;
+    IBasicVideo *video;
+    unsigned int i;
+    HANDLE thread;
+    HRESULT hr;
+    LONG size;
+
+    IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control);
+    IBaseFilter_QueryInterface(filter, &IID_IBasicVideo, (void **)&video);
+
+    hr = IBasicVideo_GetCurrentImage(video, NULL, NULL);
+    ok(hr == E_POINTER, "Got hr %#x.\n", hr);
+
+    hr = IBasicVideo_GetCurrentImage(video, NULL, buffer);
+    ok(hr == E_POINTER, "Got hr %#x.\n", hr);
+
+    size = 0xdeadbeef;
+    hr = IBasicVideo_GetCurrentImage(video, &size, NULL);
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    todo_wine ok(size == sizeof(BITMAPINFOHEADER) + 32 * 16 * 2, "Got size %d.\n", size);
+
+    size = 0xdeadbeef;
+    hr = IBasicVideo_GetCurrentImage(video, &size, buffer);
+    ok(hr == VFW_E_NOT_PAUSED, "Got hr %#x.\n", hr);
+    ok(size == 0xdeadbeef, "Got size %d.\n", size);
+
+    hr = IMediaControl_Pause(control);
+    ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+    size = 0xdeadbeef;
+    hr = IBasicVideo_GetCurrentImage(video, &size, buffer);
+    ok(hr == E_UNEXPECTED, "Got hr %#x.\n", hr);
+    ok(size == 0xdeadbeef, "Got size %d.\n", size);
+
+    thread = send_frame(input);
+    hr = IMediaControl_GetState(control, 1000, &state);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    size = sizeof(BITMAPINFOHEADER) + 32 * 16 * 2 - 1;
+    hr = IBasicVideo_GetCurrentImage(video, &size, buffer);
+    todo_wine ok(hr == E_OUTOFMEMORY, "Got hr %#x.\n", hr);
+    todo_wine ok(size == sizeof(BITMAPINFOHEADER) + 32 * 16 * 2 - 1, "Got size %d.\n", size);
+
+    size = sizeof(BITMAPINFOHEADER) + 32 * 16 * 2;
+    memset(buffer, 0xcc, sizeof(buffer));
+    hr = IBasicVideo_GetCurrentImage(video, &size, buffer);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(size == sizeof(BITMAPINFOHEADER) + 32 * 16 * 2, "Got size %d.\n", size);
+    ok(!memcmp(bih, expect_bih, sizeof(BITMAPINFOHEADER)), "Bitmap headers didn't match.\n");
+    for (i = 0; i < 32 * 16 * 2; ++i)
+    {
+        const unsigned char *data = (unsigned char *)buffer + sizeof(BITMAPINFOHEADER);
+        ok(data[i] == 0x55, "Got unexpected byte %02x at %u.\n", data[i], i);
+    }
+
+    hr = IMediaControl_Run(control);
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    join_thread(thread);
+
+    hr = IBasicVideo_GetCurrentImage(video, &size, buffer);
+    ok(hr == VFW_E_NOT_PAUSED, "Got hr %#x.\n", hr);
+
+    hr = IMediaControl_Stop(control);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    IBasicVideo_Release(video);
+    IMediaControl_Release(control);
+}
+
 static void test_connect_pin(void)
 {
     VIDEOINFOHEADER vih =
@@ -1178,6 +1253,7 @@ static void test_connect_pin(void)
     test_flushing(pin, input, graph);
     test_sample_time(pin, input, graph);
     test_eos(pin, input, graph);
+    test_current_image(filter, input, graph, &vih.bmiHeader);
 
     hr = IFilterGraph2_Disconnect(graph, pin);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
diff --git a/dlls/quartz/tests/vmr7.c b/dlls/quartz/tests/vmr7.c
index bb793741e9..32b2ae7bef 100644
--- a/dlls/quartz/tests/vmr7.c
+++ b/dlls/quartz/tests/vmr7.c
@@ -1223,6 +1223,106 @@ static void test_flushing(IPin *pin, IMemInputPin *input, IFilterGraph2 *graph)
     IMediaControl_Release(control);
 }
 
+static void test_current_image(IBaseFilter *filter, IMemInputPin *input,
+        IFilterGraph2 *graph, const BITMAPINFOHEADER *req_bih)
+{
+    LONG buffer[(sizeof(BITMAPINFOHEADER) + 32 * 16 * 4) / 4];
+    const BITMAPINFOHEADER *bih = (BITMAPINFOHEADER *)buffer;
+    const DWORD *data = (DWORD *)((char *)buffer + sizeof(BITMAPINFOHEADER));
+    BITMAPINFOHEADER expect_bih = *req_bih;
+    IMemAllocator *allocator;
+    IMediaControl *control;
+    OAFilterState state;
+    IBasicVideo *video;
+    unsigned int i;
+    HANDLE thread;
+    HRESULT hr;
+    LONG size;
+
+    /* Note that the bitmap returned by GetCurrentImage() has a bit depth of
+     * 32 regardless of the format used for pin connection. */
+    expect_bih.biBitCount = 32;
+    expect_bih.biSizeImage = 32 * 16 * 4;
+
+    IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control);
+    IBaseFilter_QueryInterface(filter, &IID_IBasicVideo, (void **)&video);
+
+    hr = IBasicVideo_GetCurrentImage(video, NULL, NULL);
+    ok(hr == E_POINTER, "Got hr %#x.\n", hr);
+
+    hr = IBasicVideo_GetCurrentImage(video, NULL, buffer);
+    ok(hr == E_POINTER, "Got hr %#x.\n", hr);
+
+    size = 0xdeadbeef;
+    hr = IBasicVideo_GetCurrentImage(video, &size, NULL);
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    todo_wine ok(size == sizeof(BITMAPINFOHEADER) + 32 * 16 * 4, "Got size %d.\n", size);
+
+    size = sizeof(buffer);
+    hr = IBasicVideo_GetCurrentImage(video, &size, buffer);
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(size == sizeof(buffer), "Got size %d.\n", size);
+    todo_wine ok(!memcmp(bih, &expect_bih, sizeof(BITMAPINFOHEADER)), "Bitmap headers didn't match.\n");
+    /* The contents seem to reflect the last frame rendered. */
+
+    hr = IMemInputPin_GetAllocator(input, &allocator);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    hr = IMemAllocator_Commit(allocator);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    IMemAllocator_Release(allocator);
+
+    hr = IMediaControl_Pause(control);
+    ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+    size = sizeof(buffer);
+    hr = IBasicVideo_GetCurrentImage(video, &size, buffer);
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(size == sizeof(buffer), "Got size %d.\n", size);
+    todo_wine ok(!memcmp(bih, &expect_bih, sizeof(BITMAPINFOHEADER)), "Bitmap headers didn't match.\n");
+    /* The contents seem to reflect the last frame rendered. */
+
+    thread = send_frame(input);
+    hr = IMediaControl_GetState(control, 1000, &state);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    size = 1;
+    memset(buffer, 0xcc, sizeof(buffer));
+    hr = IBasicVideo_GetCurrentImage(video, &size, buffer);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    todo_wine ok(size == 1, "Got size %d.\n", size);
+
+    size = sizeof(buffer);
+    memset(buffer, 0xcc, sizeof(buffer));
+    hr = IBasicVideo_GetCurrentImage(video, &size, buffer);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(size == sizeof(buffer), "Got size %d.\n", size);
+    todo_wine ok(!memcmp(bih, &expect_bih, sizeof(BITMAPINFOHEADER)), "Bitmap headers didn't match.\n");
+    for (i = 0; i < 32 * 16; ++i)
+        ok((data[i] & 0xffffff) == 0x555555, "Got unexpected color %08x at %u.\n", data[i], i);
+
+    hr = IMediaControl_Run(control);
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    join_thread(thread);
+
+    size = sizeof(buffer);
+    memset(buffer, 0xcc, sizeof(buffer));
+    hr = IBasicVideo_GetCurrentImage(video, &size, buffer);
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(size == sizeof(buffer), "Got size %d.\n", size);
+    if (hr == S_OK)
+    {
+        ok(!memcmp(bih, &expect_bih, sizeof(BITMAPINFOHEADER)), "Bitmap headers didn't match.\n");
+        for (i = 0; i < 32 * 16; ++i)
+            ok((data[i] & 0xffffff) == 0x555555, "Got unexpected color %08x at %u.\n", data[i], i);
+    }
+
+    hr = IMediaControl_Stop(control);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    IBasicVideo_Release(video);
+    IMediaControl_Release(control);
+}
+
 static void test_connect_pin(void)
 {
     VIDEOINFOHEADER vih =
@@ -1361,6 +1461,7 @@ static void test_connect_pin(void)
 
     test_filter_state(input, graph);
     test_flushing(pin, input, graph);
+    test_current_image(filter, input, graph, &vih.bmiHeader);
 
     hr = IFilterGraph2_Disconnect(graph, pin);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
diff --git a/dlls/quartz/tests/vmr9.c b/dlls/quartz/tests/vmr9.c
index a800aaeb70..293cc6d959 100644
--- a/dlls/quartz/tests/vmr9.c
+++ b/dlls/quartz/tests/vmr9.c
@@ -1227,6 +1227,103 @@ static void test_flushing(IPin *pin, IMemInputPin *input, IFilterGraph2 *graph)
     IMediaControl_Release(control);
 }
 
+static void test_current_image(IBaseFilter *filter, IMemInputPin *input,
+        IFilterGraph2 *graph, const BITMAPINFOHEADER *req_bih)
+{
+    LONG buffer[(sizeof(BITMAPINFOHEADER) + 32 * 16 * 4) / 4];
+    const BITMAPINFOHEADER *bih = (BITMAPINFOHEADER *)buffer;
+    const DWORD *data = (DWORD *)((char *)buffer + sizeof(BITMAPINFOHEADER));
+    BITMAPINFOHEADER expect_bih = *req_bih;
+    IMemAllocator *allocator;
+    IMediaControl *control;
+    OAFilterState state;
+    IBasicVideo *video;
+    unsigned int i;
+    HANDLE thread;
+    HRESULT hr;
+    LONG size;
+
+    expect_bih.biSizeImage = 32 * 16 * 4;
+
+    IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control);
+    IBaseFilter_QueryInterface(filter, &IID_IBasicVideo, (void **)&video);
+
+    hr = IBasicVideo_GetCurrentImage(video, NULL, NULL);
+    ok(hr == E_POINTER, "Got hr %#x.\n", hr);
+
+    hr = IBasicVideo_GetCurrentImage(video, NULL, buffer);
+    ok(hr == E_POINTER, "Got hr %#x.\n", hr);
+
+    size = 0xdeadbeef;
+    hr = IBasicVideo_GetCurrentImage(video, &size, NULL);
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    todo_wine ok(size == sizeof(BITMAPINFOHEADER) + 32 * 16 * 4, "Got size %d.\n", size);
+
+    size = sizeof(buffer);
+    hr = IBasicVideo_GetCurrentImage(video, &size, buffer);
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(size == sizeof(buffer), "Got size %d.\n", size);
+    todo_wine ok(!memcmp(bih, &expect_bih, sizeof(BITMAPINFOHEADER)), "Bitmap headers didn't match.\n");
+    /* The contents seem to reflect the last frame rendered. */
+
+    hr = IMemInputPin_GetAllocator(input, &allocator);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    hr = IMemAllocator_Commit(allocator);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    IMemAllocator_Release(allocator);
+
+    hr = IMediaControl_Pause(control);
+    ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+    size = sizeof(buffer);
+    hr = IBasicVideo_GetCurrentImage(video, &size, buffer);
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(size == sizeof(buffer), "Got size %d.\n", size);
+    todo_wine ok(!memcmp(bih, &expect_bih, sizeof(BITMAPINFOHEADER)), "Bitmap headers didn't match.\n");
+    /* The contents seem to reflect the last frame rendered. */
+
+    thread = send_frame(input);
+    hr = IMediaControl_GetState(control, 1000, &state);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    size = 1;
+    memset(buffer, 0xcc, sizeof(buffer));
+    hr = IBasicVideo_GetCurrentImage(video, &size, buffer);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    todo_wine ok(size == 1, "Got size %d.\n", size);
+
+    size = sizeof(buffer);
+    memset(buffer, 0xcc, sizeof(buffer));
+    hr = IBasicVideo_GetCurrentImage(video, &size, buffer);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(size == sizeof(buffer), "Got size %d.\n", size);
+    todo_wine ok(!memcmp(bih, &expect_bih, sizeof(BITMAPINFOHEADER)), "Bitmap headers didn't match.\n");
+    for (i = 0; i < 32 * 16; ++i)
+        ok((data[i] & 0xffffff) == 0x555555, "Got unexpected color %08x at %u.\n", data[i], i);
+
+    hr = IMediaControl_Run(control);
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    join_thread(thread);
+
+    size = sizeof(buffer);
+    memset(buffer, 0xcc, sizeof(buffer));
+    hr = IBasicVideo_GetCurrentImage(video, &size, buffer);
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(size == sizeof(buffer), "Got size %d.\n", size);
+    if (hr == S_OK)
+    {
+        ok(!memcmp(bih, &expect_bih, sizeof(BITMAPINFOHEADER)), "Bitmap headers didn't match.\n");
+        for (i = 0; i < 32 * 16; ++i)
+            ok((data[i] & 0xffffff) == 0x555555, "Got unexpected color %08x at %u.\n", data[i], i);
+    }
+
+    hr = IMediaControl_Stop(control);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    IBasicVideo_Release(video);
+    IMediaControl_Release(control);
+}
+
 static void test_connect_pin(void)
 {
     VIDEOINFOHEADER vih =
@@ -1364,6 +1461,7 @@ static void test_connect_pin(void)
 
     test_filter_state(input, graph);
     test_flushing(pin, input, graph);
+    test_current_image(filter, input, graph, &vih.bmiHeader);
 
     hr = IFilterGraph2_Disconnect(graph, pin);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
-- 
2.25.0




More information about the wine-devel mailing list