From: Brendan McGrath <bmcgrath(a)codeweavers.com>
---
dlls/mfmediaengine/tests/mfmediaengine.c | 121 +++++++++++++++++++++++
1 file changed, 121 insertions(+)
diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c
b/dlls/mfmediaengine/tests/mfmediaengine.c
index f6f9c3f7993..7e3af1c658d 100644
--- a/dlls/mfmediaengine/tests/mfmediaengine.c
+++ b/dlls/mfmediaengine/tests/mfmediaengine.c
@@ -1386,6 +1386,126 @@ done:
IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface);
}
+static void test_OnVideoStreamTick(void)
+{
+ struct test_transfer_notify *notify;
+ ID3D11Texture2D *texture = NULL;
+ IMFMediaEngineEx *media_engine = NULL;
+ IMFDXGIDeviceManager *manager;
+ D3D11_TEXTURE2D_DESC desc;
+ IMFByteStream *stream;
+ ID3D11Device *device;
+ RECT dst_rect;
+ UINT token;
+ HRESULT hr;
+ DWORD res;
+ BSTR url;
+ LONGLONG pts;
+
+ stream = load_resource(L"i420-64x64.avi", L"video/avi");
+
+ notify = create_transfer_notify();
+
+ if (!(device = create_d3d11_device()))
+ {
+ skip("Failed to create a D3D11 device, skipping tests.\n");
+ goto done;
+ }
+
+ hr = pMFCreateDXGIDeviceManager(&token, &manager);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ hr = IMFDXGIDeviceManager_ResetDevice(manager, (IUnknown *)device, token);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+
+ create_media_engine(¬ify->IMFMediaEngineNotify_iface, manager,
DXGI_FORMAT_B8G8R8X8_UNORM,
+ &IID_IMFMediaEngineEx, (void **)&media_engine);
+
+ IMFDXGIDeviceManager_Release(manager);
+
+ if (!(notify->media_engine = media_engine))
+ goto done;
+
+ memset(&desc, 0, sizeof(desc));
+ desc.Width = 64;
+ desc.Height = 64;
+ desc.ArraySize = 1;
+ desc.Format = DXGI_FORMAT_B8G8R8X8_UNORM;
+ desc.BindFlags = D3D11_BIND_RENDER_TARGET;
+ desc.SampleDesc.Count = 1;
+ hr = ID3D11Device_CreateTexture2D(device, &desc, NULL, &texture);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+
+ url = SysAllocString(L"i420-64x64.avi");
+ hr = IMFMediaEngineEx_SetSourceFromByteStream(media_engine, stream, url);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ SysFreeString(url);
+
+ res = WaitForSingleObject(notify->frame_ready_event, 5000);
+ ok(!res, "Unexpected res %#lx.\n", res);
+
+ if (FAILED(notify->error))
+ {
+ win_skip("Media engine reported error %#lx, skipping tests.\n",
notify->error);
+ goto done;
+ }
+
+ res = 0;
+ hr = IMFMediaEngineEx_GetNumberOfStreams(media_engine, &res);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(res == 2, "Unexpected stream count %lu.\n", res);
+
+ hr = IMFMediaEngineEx_OnVideoStreamTick(notify->media_engine, &pts);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+
+ hr = IMFMediaEngineEx_OnVideoStreamTick(notify->media_engine, &pts);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+
+ SetRect(&dst_rect, 0, 0, desc.Width, desc.Height);
+ hr = IMFMediaEngineEx_TransferVideoFrame(notify->media_engine, (IUnknown
*)texture, NULL, &dst_rect, NULL);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+
+ hr = IMFMediaEngineEx_OnVideoStreamTick(notify->media_engine, &pts);
+ todo_wine
+ ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
+
+ /* sleep until second frame is ready */
+ while (IMFMediaEngineEx_GetCurrentTime(notify->media_engine) < 1./30.)
+ Sleep(1);
+
+ hr = IMFMediaEngineEx_OnVideoStreamTick(notify->media_engine, &pts);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+
+ hr = IMFMediaEngineEx_TransferVideoFrame(notify->media_engine, (IUnknown
*)texture, NULL, &dst_rect, NULL);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+
+ hr = IMFMediaEngineEx_OnVideoStreamTick(notify->media_engine, &pts);
+ todo_wine
+ ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
+
+ /* sleep until third frame is ready */
+ while (IMFMediaEngineEx_GetCurrentTime(notify->media_engine) < 2./30.)
+ Sleep(1);
+
+ hr = IMFMediaEngineEx_OnVideoStreamTick(notify->media_engine, &pts);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+
+done:
+ if (media_engine)
+ {
+ IMFMediaEngineEx_Shutdown(media_engine);
+ IMFMediaEngineEx_Release(media_engine);
+ }
+
+ if (texture)
+ ID3D11Texture2D_Release(texture);
+ if (device)
+ ID3D11Device_Release(device);
+
+ IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface);
+
+ IMFByteStream_Release(stream);
+}
+
struct test_transform
{
IMFTransform IMFTransform_iface;
@@ -2750,6 +2870,7 @@ START_TEST(mfmediaengine)
test_SetSourceFromByteStream();
test_audio_configuration();
test_TransferVideoFrame();
+ test_OnVideoStreamTick();
test_effect();
test_GetDuration();
test_GetSeekable();
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/5509