From cd397d1aa6140a21ab3dd1043238f815365b67fa Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Wed, 24 Mar 2021 12:37:22 +0300 Subject: [PATCH] mfplat: Use texture pointer for DXGI surface buffer. Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- dlls/mfplat/buffer.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/dlls/mfplat/buffer.c b/dlls/mfplat/buffer.c index abfb3e738d7..cf9ead7d809 100644 --- a/dlls/mfplat/buffer.c +++ b/dlls/mfplat/buffer.c @@ -63,7 +63,7 @@ struct memory_buffer } d3d9_surface; struct { - IUnknown *surface; + ID3D11Texture2D *texture; unsigned int subresource; struct attributes attributes; } dxgi_surface; @@ -131,9 +131,9 @@ static ULONG WINAPI memory_buffer_Release(IMFMediaBuffer *iface) { if (buffer->d3d9_surface.surface) IDirect3DSurface9_Release(buffer->d3d9_surface.surface); - if (buffer->dxgi_surface.surface) + if (buffer->dxgi_surface.texture) { - IUnknown_Release(buffer->dxgi_surface.surface); + ID3D11Texture2D_Release(buffer->dxgi_surface.texture); clear_attributes_object(&buffer->dxgi_surface.attributes); } DeleteCriticalSection(&buffer->cs); @@ -913,7 +913,7 @@ static HRESULT WINAPI dxgi_buffer_GetResource(IMFDXGIBuffer *iface, REFIID riid, TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj); - return IUnknown_QueryInterface(buffer->dxgi_surface.surface, riid, obj); + return ID3D11Texture2D_QueryInterface(buffer->dxgi_surface.texture, riid, obj); } static HRESULT WINAPI dxgi_buffer_GetSubresourceIndex(IMFDXGIBuffer *iface, UINT *index) @@ -1170,32 +1170,44 @@ static HRESULT create_dxgi_surface_buffer(IUnknown *surface, UINT subresource, B { struct memory_buffer *object; D3D11_TEXTURE2D_DESC desc; + ID3D11Texture2D *texture; unsigned int stride; D3DFORMAT format; GUID subtype; BOOL is_yuv; HRESULT hr; - ID3D11Texture2D_GetDesc((ID3D11Texture2D *)surface, &desc); + if (FAILED(hr = IUnknown_QueryInterface(surface, &IID_ID3D11Texture2D, (void **)&texture))) + { + WARN("Failed to get texture interface, hr %#x.\n", hr); + return hr; + } + + ID3D11Texture2D_GetDesc(texture, &desc); TRACE("format %#x, %u x %u.\n", desc.Format, desc.Width, desc.Height); memcpy(&subtype, &MFVideoFormat_Base, sizeof(subtype)); subtype.Data1 = format = MFMapDXGIFormatToDX9Format(desc.Format); if (!(stride = mf_format_get_stride(&subtype, desc.Width, &is_yuv))) + { + ID3D11Texture2D_Release(texture); return MF_E_INVALIDMEDIATYPE; + } object = heap_alloc_zero(sizeof(*object)); if (!object) + { + ID3D11Texture2D_Release(texture); return E_OUTOFMEMORY; + } object->IMFMediaBuffer_iface.lpVtbl = &dxgi_surface_1d_buffer_vtbl; object->IMF2DBuffer2_iface.lpVtbl = &dxgi_surface_buffer_vtbl; object->IMFDXGIBuffer_iface.lpVtbl = &dxgi_buffer_vtbl; object->refcount = 1; InitializeCriticalSection(&object->cs); - object->dxgi_surface.surface = surface; - IUnknown_AddRef(surface); + object->dxgi_surface.texture = texture; object->dxgi_surface.subresource = subresource; MFGetPlaneSize(format, desc.Width, desc.Height, &object->_2d.plane_size);