[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