From 01059d5946575d245d814f4c8247d4bae19887be Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Thu, 25 Mar 2021 12:40:32 +0300 Subject: [PATCH] mfplat: Implement GetScanline0AndPitch() for d3d11 buffers. Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- dlls/mfplat/buffer.c | 26 ++++++++++++++++++++++++-- dlls/mfplat/tests/mfplat.c | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/dlls/mfplat/buffer.c b/dlls/mfplat/buffer.c index fbd3b7786b6..e6bf52662e8 100644 --- a/dlls/mfplat/buffer.c +++ b/dlls/mfplat/buffer.c @@ -985,9 +985,31 @@ static HRESULT WINAPI dxgi_surface_buffer_Unlock2D(IMF2DBuffer2 *iface) static HRESULT WINAPI dxgi_surface_buffer_GetScanline0AndPitch(IMF2DBuffer2 *iface, BYTE **scanline0, LONG *pitch) { - FIXME("%p, %p, %p.\n", iface, scanline0, pitch); + struct memory_buffer *buffer = impl_from_IMF2DBuffer2(iface); + HRESULT hr = S_OK; - return E_NOTIMPL; + TRACE("%p, %p, %p.\n", iface, scanline0, pitch); + + if (!scanline0 || !pitch) + return E_POINTER; + + EnterCriticalSection(&buffer->cs); + + if (!buffer->_2d.locks) + { + *scanline0 = NULL; + *pitch = 0; + hr = HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED); + } + else + { + *scanline0 = buffer->dxgi_surface.map_desc.pData; + *pitch = buffer->dxgi_surface.map_desc.RowPitch; + } + + LeaveCriticalSection(&buffer->cs); + + return hr; } static HRESULT WINAPI dxgi_surface_buffer_Lock2DSize(IMF2DBuffer2 *iface, MF2DBuffer_LockFlags flags, diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index dacad924ae9..18361d4d721 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -6346,11 +6346,11 @@ static void test_dxgi_surface_buffer(void) IMFMediaBuffer *buffer; ID3D11Device *device; BYTE buff[64 * 64 * 4]; + BYTE *data, *data2; + LONG pitch, pitch2; UINT index, size; IUnknown *obj; HRESULT hr; - BYTE *data; - LONG pitch; if (!pMFCreateDXGISurfaceBuffer) { @@ -6485,6 +6485,9 @@ todo_wine hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMF2DBuffer, (void **)&_2d_buffer); ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + hr = IMF2DBuffer_GetScanline0AndPitch(_2d_buffer, &data2, &pitch2); + ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED), "Unexpected hr %#x.\n", hr); + hr = IMF2DBuffer_Lock2D(_2d_buffer, &data, &pitch); ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!!data && pitch == desc.Width * 4, "Unexpected pitch %d.\n", pitch); @@ -6493,6 +6496,10 @@ todo_wine ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!!data && pitch == desc.Width * 4, "Unexpected pitch %d.\n", pitch); + hr = IMF2DBuffer_GetScanline0AndPitch(_2d_buffer, &data2, &pitch2); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(data2 == data && pitch2 == pitch, "Unexpected data/pitch.\n"); + hr = IMFMediaBuffer_Lock(buffer, &data, &max_length, &cur_length); todo_wine ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr); @@ -6509,6 +6516,27 @@ todo_wine IMF2DBuffer_Release(_2d_buffer); IMFMediaBuffer_Release(buffer); + /* Bottom up. */ + hr = pMFCreateDXGISurfaceBuffer(&IID_ID3D11Texture2D, (IUnknown *)texture, 0, TRUE, &buffer); + ok(hr == S_OK, "Failed to create a buffer, hr %#x.\n", hr); + + hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMF2DBuffer, (void **)&_2d_buffer); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + hr = IMF2DBuffer_Lock2D(_2d_buffer, &data, &pitch); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(!!data && pitch == desc.Width * 4, "Unexpected pitch %d.\n", pitch); + + hr = IMF2DBuffer_GetScanline0AndPitch(_2d_buffer, &data2, &pitch2); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(data2 == data && pitch2 == pitch, "Unexpected data/pitch.\n"); + + hr = IMF2DBuffer_Unlock2D(_2d_buffer); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + IMF2DBuffer_Release(_2d_buffer); + IMFMediaBuffer_Release(buffer); + ID3D11Texture2D_Release(texture); /* Subresource index 1. */