[PATCH 3/3] evr/tests: Add a mixer tests for clearing output in idle state.

Nikolay Sivov nsivov at codeweavers.com
Thu Oct 15 08:19:55 CDT 2020


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/evr/tests/evr.c | 103 +++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 100 insertions(+), 3 deletions(-)

diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c
index d0e39cb47c9..9124109c07f 100644
--- a/dlls/evr/tests/evr.c
+++ b/dlls/evr/tests/evr.c
@@ -1994,16 +1994,82 @@ static void test_mixer_zorder(void)
     IMFTransform_Release(mixer);
 }
 
+static IDirect3DSurface9 * create_surface(IDirect3DDeviceManager9 *manager, unsigned int width,
+        unsigned int height)
+{
+    IDirectXVideoAccelerationService *service;
+    IDirect3DSurface9 *surface = NULL;
+    IDirect3DDevice9 *device;
+    HANDLE handle;
+    HRESULT hr;
+
+    hr = IDirect3DDeviceManager9_OpenDeviceHandle(manager, &handle);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = IDirect3DDeviceManager9_LockDevice(manager, handle, &device, TRUE);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = IDirect3DDeviceManager9_GetVideoService(manager, handle, &IID_IDirectXVideoProcessorService,
+            (void **)&service);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = IDirectXVideoAccelerationService_CreateSurface(service, width, height, 0, D3DFMT_A8R8G8B8,
+            D3DPOOL_DEFAULT, 0, DXVA2_VideoProcessorRenderTarget, &surface, NULL);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    IDirectXVideoAccelerationService_Release(service);
+
+    hr = IDirect3DDevice9_ColorFill(device, surface, NULL, D3DCOLOR_ARGB(0x10, 0xff, 0x00, 0x00));
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    IDirect3DDevice9_Release(device);
+
+    hr = IDirect3DDeviceManager9_UnlockDevice(manager, handle, FALSE);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = IDirect3DDeviceManager9_CloseDeviceHandle(manager, handle);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    return surface;
+}
+
+/* Format is assumed as 32bpp */
+static DWORD get_surface_color(IDirect3DSurface9 *surface, unsigned int x, unsigned int y)
+{
+    D3DLOCKED_RECT locked_rect = { 0 };
+    D3DSURFACE_DESC desc;
+    DWORD *row, color;
+    HRESULT hr;
+
+    hr = IDirect3DSurface9_GetDesc(surface, &desc);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(x < desc.Width && y < desc.Height, "Invalid coordinate.\n");
+    if (x >= desc.Width || y >= desc.Height) return 0;
+
+    hr = IDirect3DSurface9_LockRect(surface, &locked_rect, NULL, 0);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    row = (DWORD *)((char *)locked_rect.pBits + y * locked_rect.Pitch);
+    color = row[x];
+
+    hr = IDirect3DSurface9_UnlockRect(surface);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    return color;
+}
+
 static void test_mixer_samples(void)
 {
     IDirect3DDeviceManager9 *manager;
     MFT_OUTPUT_DATA_BUFFER buffer;
+    IDirect3DSurface9 *surface;
+    IMFDesiredSample *desired;
     IDirect3DDevice9 *device;
     IMFMediaType *video_type;
+    DWORD color, status;
     IMFTransform *mixer;
     IMFSample *sample;
     IDirect3D9 *d3d;
-    DWORD status;
     HWND window;
     UINT token;
     HRESULT hr;
@@ -2030,8 +2096,6 @@ static void test_mixer_samples(void)
     hr = IMFTransform_ProcessMessage(mixer, MFT_MESSAGE_SET_D3D_MANAGER, (ULONG_PTR)manager);
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
 
-    IDirect3DDeviceManager9_Release(manager);
-
     video_type = create_video_type(&MFVideoFormat_RGB32);
 
     hr = IMFMediaType_SetUINT64(video_type, &MF_MT_FRAME_SIZE, (UINT64)640 << 32 | 480);
@@ -2052,6 +2116,7 @@ static void test_mixer_samples(void)
 todo_wine
     ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
 
+    /* It needs a sample with a backing surface. */
     hr = MFCreateSample(&sample);
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
 
@@ -2062,9 +2127,41 @@ todo_wine
 
     IMFSample_Release(sample);
 
+    surface = create_surface(manager, 64, 64);
+
+    hr = MFCreateVideoSampleFromSurface((IUnknown *)surface, &sample);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFSample_QueryInterface(sample, &IID_IMFDesiredSample, (void **)&desired);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    buffer.pSample = sample;
+    hr = IMFTransform_ProcessOutput(mixer, 0, 1, &buffer, &status);
+todo_wine
+    ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "Unexpected hr %#x.\n", hr);
+
+    color = get_surface_color(surface, 0, 0);
+    ok(color == D3DCOLOR_ARGB(0x10, 0xff, 0x00, 0x00), "Unexpected color %#x.\n", color);
+
+    /* Streaming is not started yet. Output is colored black, but only if desired timestamps were set. */
+    IMFDesiredSample_SetDesiredSampleTimeAndDuration(desired, 100, 0);
+
+    hr = IMFTransform_ProcessOutput(mixer, 0, 1, &buffer, &status);
+todo_wine
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    color = get_surface_color(surface, 0, 0);
+todo_wine
+    ok(!color, "Unexpected color %#x.\n", color);
+
+    IMFSample_Release(sample);
+
+    IDirect3DSurface9_Release(surface);
+
     IMFTransform_Release(mixer);
 
     IDirect3DDevice9_Release(device);
+    IDirect3DDeviceManager9_Release(manager);
 
 done:
     IDirect3D9_Release(d3d);
-- 
2.28.0




More information about the wine-devel mailing list