mfplat: Fix SetCurrentLength() for d3d9 buffer.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2021-03-24 12:37:18 +03:00 committed by Alexandre Julliard
parent e66bfc8351
commit ff056c3f86
2 changed files with 25 additions and 6 deletions

View File

@ -406,6 +406,17 @@ static HRESULT WINAPI d3d9_surface_buffer_Unlock(IMFMediaBuffer *iface)
return hr; 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 = static const IMFMediaBufferVtbl d3d9_surface_1d_buffer_vtbl =
{ {
memory_1d_2d_buffer_QueryInterface, memory_1d_2d_buffer_QueryInterface,
@ -414,7 +425,7 @@ static const IMFMediaBufferVtbl d3d9_surface_1d_buffer_vtbl =
d3d9_surface_buffer_Lock, d3d9_surface_buffer_Lock,
d3d9_surface_buffer_Unlock, d3d9_surface_buffer_Unlock,
memory_buffer_GetCurrentLength, memory_buffer_GetCurrentLength,
memory_buffer_SetCurrentLength, d3d9_surface_buffer_SetCurrentLength,
memory_buffer_GetMaxLength, memory_buffer_GetMaxLength,
}; };

View File

@ -5852,6 +5852,7 @@ static void test_MFCreateDXSurfaceBuffer(void)
{ {
IDirect3DSurface9 *backbuffer = NULL, *surface; IDirect3DSurface9 *backbuffer = NULL, *surface;
IDirect3DSwapChain9 *swapchain; IDirect3DSwapChain9 *swapchain;
DWORD length, max_length;
IDirect3DDevice9 *device; IDirect3DDevice9 *device;
IMF2DBuffer2 *_2dbuffer2; IMF2DBuffer2 *_2dbuffer2;
IMFMediaBuffer *buffer; IMFMediaBuffer *buffer;
@ -5859,7 +5860,6 @@ static void test_MFCreateDXSurfaceBuffer(void)
BYTE *data, *data2; BYTE *data, *data2;
IMFGetService *gs; IMFGetService *gs;
IDirect3D9 *d3d; IDirect3D9 *d3d;
DWORD length;
HWND window; HWND window;
HRESULT hr; HRESULT hr;
LONG pitch; LONG pitch;
@ -5904,17 +5904,25 @@ static void test_MFCreateDXSurfaceBuffer(void)
IDirect3DSurface9_Release(surface); IDirect3DSurface9_Release(surface);
IMFGetService_Release(gs); IMFGetService_Release(gs);
length = 0; max_length = 0;
hr = IMFMediaBuffer_GetMaxLength(buffer, &length); hr = IMFMediaBuffer_GetMaxLength(buffer, &max_length);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr); 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); hr = IMFMediaBuffer_GetCurrentLength(buffer, &length);
ok(hr == S_OK, "Failed to get length, hr %#x.\n", hr); ok(hr == S_OK, "Failed to get length, hr %#x.\n", hr);
ok(!length, "Unexpected length %u.\n", length); 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(hr == S_OK, "Unexpected hr %#x.\n", hr);
ok(length == max_length, "Unexpected length.\n");
/* Unlock twice. */ /* Unlock twice. */
hr = IMFMediaBuffer_Unlock(buffer); hr = IMFMediaBuffer_Unlock(buffer);