From ff056c3f86b3c0d582b4bf41bc74571dbf1ff6d8 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Wed, 24 Mar 2021 12:37:18 +0300 Subject: [PATCH] mfplat: Fix SetCurrentLength() for d3d9 buffer. Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- dlls/mfplat/buffer.c | 13 ++++++++++++- dlls/mfplat/tests/mfplat.c | 18 +++++++++++++----- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/dlls/mfplat/buffer.c b/dlls/mfplat/buffer.c index 6a4f4605450..8dd076c1e9f 100644 --- a/dlls/mfplat/buffer.c +++ b/dlls/mfplat/buffer.c @@ -406,6 +406,17 @@ static HRESULT WINAPI d3d9_surface_buffer_Unlock(IMFMediaBuffer *iface) return hr; } +static HRESULT WINAPI d3d9_surface_buffer_SetCurrentLength(IMFMediaBuffer *iface, DWORD current_length) +{ + struct memory_buffer *buffer = impl_from_IMFMediaBuffer(iface); + + TRACE("%p, %u.\n", iface, current_length); + + buffer->current_length = current_length; + + return S_OK; +} + static const IMFMediaBufferVtbl d3d9_surface_1d_buffer_vtbl = { memory_1d_2d_buffer_QueryInterface, @@ -414,7 +425,7 @@ static const IMFMediaBufferVtbl d3d9_surface_1d_buffer_vtbl = d3d9_surface_buffer_Lock, d3d9_surface_buffer_Unlock, memory_buffer_GetCurrentLength, - memory_buffer_SetCurrentLength, + d3d9_surface_buffer_SetCurrentLength, memory_buffer_GetMaxLength, }; diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 879240ae1a4..8355be18b9f 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -5852,6 +5852,7 @@ static void test_MFCreateDXSurfaceBuffer(void) { IDirect3DSurface9 *backbuffer = NULL, *surface; IDirect3DSwapChain9 *swapchain; + DWORD length, max_length; IDirect3DDevice9 *device; IMF2DBuffer2 *_2dbuffer2; IMFMediaBuffer *buffer; @@ -5859,7 +5860,6 @@ static void test_MFCreateDXSurfaceBuffer(void) BYTE *data, *data2; IMFGetService *gs; IDirect3D9 *d3d; - DWORD length; HWND window; HRESULT hr; LONG pitch; @@ -5904,17 +5904,25 @@ static void test_MFCreateDXSurfaceBuffer(void) IDirect3DSurface9_Release(surface); IMFGetService_Release(gs); - length = 0; - hr = IMFMediaBuffer_GetMaxLength(buffer, &length); + max_length = 0; + hr = IMFMediaBuffer_GetMaxLength(buffer, &max_length); ok(hr == S_OK, "Unexpected hr %#x.\n", hr); - ok(!!length, "Unexpected length %u.\n", length); + ok(!!max_length, "Unexpected length %u.\n", max_length); hr = IMFMediaBuffer_GetCurrentLength(buffer, &length); ok(hr == S_OK, "Failed to get length, hr %#x.\n", hr); ok(!length, "Unexpected length %u.\n", length); - hr = IMFMediaBuffer_Lock(buffer, &data, NULL, NULL); + hr = IMFMediaBuffer_SetCurrentLength(buffer, 2 * max_length); + ok(hr == S_OK, "Failed to get length, hr %#x.\n", hr); + + hr = IMFMediaBuffer_GetCurrentLength(buffer, &length); + ok(hr == S_OK, "Failed to get length, hr %#x.\n", hr); + ok(length == 2 * max_length, "Unexpected length %u.\n", length); + + hr = IMFMediaBuffer_Lock(buffer, &data, NULL, &length); ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(length == max_length, "Unexpected length.\n"); /* Unlock twice. */ hr = IMFMediaBuffer_Unlock(buffer);