From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mfplat/tests/mfplat.c | 174 +++++++++++++++++++++++++++++++++++++ 1 file changed, 174 insertions(+)
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 4c1a5707f50..b05c2a7299d 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -493,6 +493,8 @@ static HRESULT (WINAPI *pMFCreate2DMediaBuffer)(DWORD width, DWORD height, DWORD IMFMediaBuffer **buffer); static HRESULT (WINAPI *pMFCreateMediaBufferFromMediaType)(IMFMediaType *media_type, LONGLONG duration, DWORD min_length, DWORD min_alignment, IMFMediaBuffer **buffer); +static HRESULT (WINAPI *pMFCreateLegacyMediaBufferOnMFMediaBuffer)(IMFSample *sample, IMFMediaBuffer *media_buffer, DWORD offset, + IMediaBuffer **obj); static HRESULT (WINAPI *pMFCreatePathFromURL)(const WCHAR *url, WCHAR **path); static HRESULT (WINAPI *pMFCreateDXSurfaceBuffer)(REFIID riid, IUnknown *surface, BOOL bottom_up, IMFMediaBuffer **buffer); static HRESULT (WINAPI *pMFCreateTrackedSample)(IMFTrackedSample **sample); @@ -1610,6 +1612,7 @@ static void init_functions(void) X(MFAllocateWorkQueueEx); X(MFCopyImage); X(MFCreate2DMediaBuffer); + X(MFCreateLegacyMediaBufferOnMFMediaBuffer); X(MFCreateDXGIDeviceManager); X(MFCreateDXGISurfaceBuffer); X(MFCreateDXSurfaceBuffer); @@ -3137,6 +3140,176 @@ static void test_system_memory_aligned_buffer(void) IMFMediaBuffer_Release(buffer); }
+static UINT expect_locks; +static UINT expect_unlocks; + +static HRESULT WINAPI test_buffer_QueryInterface(IMFMediaBuffer *iface, REFIID riid, void **obj) +{ + if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IMFMediaBuffer)) + { + IMFMediaBuffer_AddRef(iface); + *obj = iface; + return S_OK; + } + + ok(IsEqualIID(riid, &IID_IMF2DBuffer) || IsEqualIID(riid, &IID_IMF2DBuffer2), + "Unexpected riid %s\n", debugstr_guid(riid)); + *obj = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI test_buffer_AddRef(IMFMediaBuffer *iface) +{ + return 2; +} + +static ULONG WINAPI test_buffer_Release(IMFMediaBuffer *iface) +{ + return 1; +} + +static HRESULT WINAPI test_buffer_Lock(IMFMediaBuffer *iface, BYTE **data, DWORD *maxlength, DWORD *length) +{ + ok(expect_locks--, "Unexpected call\n"); + ok(!maxlength, "got maxlength\n"); + ok(!length, "got length\n"); + *data = (BYTE *)0xdeadbeef; + return S_OK; +} + +static HRESULT WINAPI test_buffer_Unlock(IMFMediaBuffer *iface) +{ + ok(expect_unlocks--, "Unexpected call\n"); + return S_OK; +} + +static HRESULT WINAPI test_buffer_GetCurrentLength(IMFMediaBuffer *iface, DWORD *length) +{ + *length = 0; + return S_OK; +} + +static HRESULT WINAPI test_buffer_SetCurrentLength(IMFMediaBuffer *iface, DWORD length) +{ + ok(0, "Unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI test_buffer_GetMaxLength(IMFMediaBuffer *iface, DWORD *length) +{ + *length = 0; + return S_OK; +} + +static const IMFMediaBufferVtbl test_buffer_vtbl = +{ + test_buffer_QueryInterface, + test_buffer_AddRef, + test_buffer_Release, + test_buffer_Lock, + test_buffer_Unlock, + test_buffer_GetCurrentLength, + test_buffer_SetCurrentLength, + test_buffer_GetMaxLength, +}; + +static IMFMediaBuffer test_buffer = {.lpVtbl = &test_buffer_vtbl}; + +static void test_MFCreateLegacyMediaBufferOnMFMediaBuffer(void) +{ + IMediaBuffer *media_buffer; + IMFMediaBuffer *buffer; + IMFSample *sample; + ULONG length; + BYTE *data; + HRESULT hr; + + if (!pMFCreateLegacyMediaBufferOnMFMediaBuffer) + { + win_skip("MFCreateLegacyMediaBufferOnMFMediaBuffer() is not available.\n"); + return; + } + + hr = pMFCreateLegacyMediaBufferOnMFMediaBuffer(NULL, NULL, 0, NULL); + todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + + if (0) /* crashes */ + { + hr = MFCreateSample(&sample); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = pMFCreateLegacyMediaBufferOnMFMediaBuffer(sample, NULL, 0, &media_buffer); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IMFSample_Release(sample); + } + + hr = pMFCreateLegacyMediaBufferOnMFMediaBuffer(NULL, &test_buffer, 0, &media_buffer); + todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (hr == S_OK) + { + expect_locks = 1; + hr = IMediaBuffer_GetBufferAndLength(media_buffer, &data, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(expect_locks == 0, "Unexpected Lock calls\n"); + + expect_locks = 1; + hr = IMediaBuffer_GetBufferAndLength(media_buffer, &data, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(expect_locks == 1, "Unexpected Lock calls\n"); + + expect_unlocks = 1; + IMediaBuffer_Release(media_buffer); + ok(expect_unlocks == 0, "Unexpected Unlock calls\n"); + } + + hr = MFCreateMemoryBuffer(0, &buffer); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = pMFCreateLegacyMediaBufferOnMFMediaBuffer(NULL, buffer, 0, &media_buffer); + todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IMFMediaBuffer_Release(buffer); + if (hr == S_OK) + { + check_interface(media_buffer, &IID_IMFMediaBuffer, FALSE); + check_interface(media_buffer, &IID_IMFGetService, FALSE); + check_interface(media_buffer, &IID_IMF2DBuffer, FALSE); + check_interface(media_buffer, &IID_IMFSample, FALSE); + IMediaBuffer_Release(media_buffer); + } + + hr = MFCreateSample(&sample); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = MFCreateMemoryBuffer(0, &buffer); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = pMFCreateLegacyMediaBufferOnMFMediaBuffer(sample, buffer, 0, &media_buffer); + todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IMFMediaBuffer_Release(buffer); + IMFSample_Release(sample); + if (hr == S_OK) + { + check_interface(media_buffer, &IID_IMFSample, TRUE); + IMediaBuffer_Release(media_buffer); + } + + if (pMFCreate2DMediaBuffer) + { + hr = MFCreateSample(&sample); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = pMFCreate2DMediaBuffer(1, 1, MAKEFOURCC('N','V','1','2'), FALSE, &buffer); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = pMFCreateLegacyMediaBufferOnMFMediaBuffer(sample, buffer, 0, &media_buffer); + todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IMFMediaBuffer_Release(buffer); + IMFSample_Release(sample); + if (hr == S_OK) + { + check_interface(media_buffer, &IID_IMFMediaBuffer, FALSE); + check_interface(media_buffer, &IID_IMF2DBuffer, TRUE); + check_interface(media_buffer, &IID_IMF2DBuffer2, TRUE); + check_interface(media_buffer, &IID_IMFSample, TRUE); + IMediaBuffer_Release(media_buffer); + } + } +} + static void test_sample(void) { static const DWORD test_pattern = 0x22222222; @@ -12812,6 +12985,7 @@ START_TEST(mfplat) test_MFCreateMFByteStreamOnStream(); test_system_memory_buffer(); test_system_memory_aligned_buffer(); + test_MFCreateLegacyMediaBufferOnMFMediaBuffer(); test_source_resolver(); test_MFCreateAsyncResult(); test_allocate_queue();