[PATCH v3 5/8] mfplat/buffer: Redirect all Lock2D() implementations to Lock2DSize().

Giovanni Mascellani gmascellani at codeweavers.com
Tue Jun 14 10:15:48 CDT 2022


Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>
---
v2:
* Remove the trace in memory_2d_buffer_Lock2D()
v3:
* Redirect all invocations to helper functions.
---
 dlls/mfplat/buffer.c | 140 ++++++++++++++++---------------------------
 1 file changed, 50 insertions(+), 90 deletions(-)

diff --git a/dlls/mfplat/buffer.c b/dlls/mfplat/buffer.c
index a7ba306223d..5a447817145 100644
--- a/dlls/mfplat/buffer.c
+++ b/dlls/mfplat/buffer.c
@@ -485,11 +485,17 @@ static ULONG WINAPI memory_2d_buffer_Release(IMF2DBuffer2 *iface)
     return IMFMediaBuffer_Release(&buffer->IMFMediaBuffer_iface);
 }
 
-static HRESULT memory_2d_buffer_lock(struct buffer *buffer, BYTE **scanline0, LONG *pitch,
-        BYTE **buffer_start, DWORD *buffer_length)
+static HRESULT memory_2d_buffer_lock2d(IMF2DBuffer2 *iface, MF2DBuffer_LockFlags flags, BYTE **scanline0,
+        LONG *pitch, BYTE **buffer_start, DWORD *buffer_length)
 {
+    struct buffer *buffer = impl_from_IMF2DBuffer2(iface);
     HRESULT hr = S_OK;
 
+    if (!scanline0 || !pitch || !buffer_start || !buffer_length)
+        return E_POINTER;
+
+    EnterCriticalSection(&buffer->cs);
+
     if (buffer->_2d.linear_buffer)
         hr = MF_E_UNEXPECTED;
     else
@@ -503,26 +509,19 @@ static HRESULT memory_2d_buffer_lock(struct buffer *buffer, BYTE **scanline0, LO
             *buffer_length = buffer->max_length;
     }
 
+    LeaveCriticalSection(&buffer->cs);
+
     return hr;
 }
 
 static HRESULT WINAPI memory_2d_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **scanline0, LONG *pitch)
 {
-    struct buffer *buffer = impl_from_IMF2DBuffer2(iface);
-    HRESULT hr;
+    DWORD buffer_length;
+    BYTE *buffer_start;
 
     TRACE("%p, %p, %p.\n", iface, scanline0, pitch);
 
-    if (!scanline0 || !pitch)
-        return E_POINTER;
-
-    EnterCriticalSection(&buffer->cs);
-
-    hr = memory_2d_buffer_lock(buffer, scanline0, pitch, NULL, NULL);
-
-    LeaveCriticalSection(&buffer->cs);
-
-    return hr;
+    return memory_2d_buffer_lock2d(iface, MF2DBuffer_LockFlags_ReadWrite, scanline0, pitch, &buffer_start, &buffer_length);
 }
 
 static HRESULT WINAPI memory_2d_buffer_Unlock2D(IMF2DBuffer2 *iface)
@@ -615,21 +614,9 @@ static HRESULT WINAPI memory_2d_buffer_ContiguousCopyFrom(IMF2DBuffer2 *iface, c
 static HRESULT WINAPI memory_2d_buffer_Lock2DSize(IMF2DBuffer2 *iface, MF2DBuffer_LockFlags flags, BYTE **scanline0,
         LONG *pitch, BYTE **buffer_start, DWORD *buffer_length)
 {
-    struct buffer *buffer = impl_from_IMF2DBuffer2(iface);
-    HRESULT hr;
-
     TRACE("%p, %#x, %p, %p, %p, %p.\n", iface, flags, scanline0, pitch, buffer_start, buffer_length);
 
-    if (!scanline0 || !pitch || !buffer_start || !buffer_length)
-        return E_POINTER;
-
-    EnterCriticalSection(&buffer->cs);
-
-    hr = memory_2d_buffer_lock(buffer, scanline0, pitch, buffer_start, buffer_length);
-
-    LeaveCriticalSection(&buffer->cs);
-
-    return hr;
+    return memory_2d_buffer_lock2d(iface, flags, scanline0, pitch, buffer_start, buffer_length);
 }
 
 static HRESULT WINAPI memory_2d_buffer_Copy2DTo(IMF2DBuffer2 *iface, IMF2DBuffer2 *dest_buffer)
@@ -655,14 +642,13 @@ static const IMF2DBuffer2Vtbl memory_2d_buffer_vtbl =
     memory_2d_buffer_Copy2DTo,
 };
 
-static HRESULT WINAPI d3d9_surface_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **scanline0, LONG *pitch)
+static HRESULT d3d9_surface_buffer_lock2d(IMF2DBuffer2 *iface, MF2DBuffer_LockFlags flags, BYTE **scanline0,
+        LONG *pitch, BYTE **buffer_start, DWORD *buffer_length)
 {
     struct buffer *buffer = impl_from_IMF2DBuffer2(iface);
     HRESULT hr = S_OK;
 
-    TRACE("%p, %p, %p.\n", iface, scanline0, pitch);
-
-    if (!scanline0 || !pitch)
+    if (!scanline0 || !pitch || !buffer_start || !buffer_length)
         return E_POINTER;
 
     EnterCriticalSection(&buffer->cs);
@@ -679,6 +665,10 @@ static HRESULT WINAPI d3d9_surface_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **sca
         buffer->_2d.locks++;
         *scanline0 = buffer->d3d9_surface.rect.pBits;
         *pitch = buffer->d3d9_surface.rect.Pitch;
+        if (buffer_start)
+            *buffer_start = *scanline0;
+        if (buffer_length)
+            *buffer_length = buffer->d3d9_surface.rect.Pitch * buffer->_2d.height;
     }
 
     LeaveCriticalSection(&buffer->cs);
@@ -686,6 +676,16 @@ static HRESULT WINAPI d3d9_surface_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **sca
     return hr;
 }
 
+static HRESULT WINAPI d3d9_surface_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **scanline0, LONG *pitch)
+{
+    DWORD buffer_length;
+    BYTE *buffer_start;
+
+    TRACE("%p, %p, %p.\n", iface, scanline0, pitch);
+
+    return d3d9_surface_buffer_lock2d(iface, MF2DBuffer_LockFlags_ReadWrite, scanline0, pitch, &buffer_start, &buffer_length);
+}
+
 static HRESULT WINAPI d3d9_surface_buffer_Unlock2D(IMF2DBuffer2 *iface)
 {
     struct buffer *buffer = impl_from_IMF2DBuffer2(iface);
@@ -743,37 +743,9 @@ static HRESULT WINAPI d3d9_surface_buffer_GetScanline0AndPitch(IMF2DBuffer2 *ifa
 static HRESULT WINAPI d3d9_surface_buffer_Lock2DSize(IMF2DBuffer2 *iface, MF2DBuffer_LockFlags flags, BYTE **scanline0,
         LONG *pitch, BYTE **buffer_start, DWORD *buffer_length)
 {
-    struct buffer *buffer = impl_from_IMF2DBuffer2(iface);
-    HRESULT hr = S_OK;
-
     TRACE("%p, %#x, %p, %p, %p, %p.\n", iface, flags, scanline0, pitch, buffer_start, buffer_length);
 
-    if (!scanline0 || !pitch || !buffer_start || !buffer_length)
-        return E_POINTER;
-
-    EnterCriticalSection(&buffer->cs);
-
-    if (buffer->_2d.linear_buffer)
-        hr = MF_E_UNEXPECTED;
-    else if (!buffer->_2d.locks)
-    {
-        hr = IDirect3DSurface9_LockRect(buffer->d3d9_surface.surface, &buffer->d3d9_surface.rect, NULL, 0);
-    }
-
-    if (SUCCEEDED(hr))
-    {
-        buffer->_2d.locks++;
-        *scanline0 = buffer->d3d9_surface.rect.pBits;
-        *pitch = buffer->d3d9_surface.rect.Pitch;
-        if (buffer_start)
-            *buffer_start = *scanline0;
-        if (buffer_length)
-            *buffer_length = buffer->d3d9_surface.rect.Pitch * buffer->_2d.height;
-    }
-
-    LeaveCriticalSection(&buffer->cs);
-
-    return hr;
+    return d3d9_surface_buffer_lock2d(iface, flags, scanline0, pitch, buffer_start, buffer_length);
 }
 
 static const IMF2DBuffer2Vtbl d3d9_surface_buffer_vtbl =
@@ -1030,14 +1002,13 @@ static HRESULT WINAPI dxgi_surface_buffer_SetCurrentLength(IMFMediaBuffer *iface
     return S_OK;
 }
 
-static HRESULT WINAPI dxgi_surface_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **scanline0, LONG *pitch)
+static HRESULT dxgi_surface_buffer_lock2d(IMF2DBuffer2 *iface, MF2DBuffer_LockFlags flags,
+        BYTE **scanline0, LONG *pitch, BYTE **buffer_start, DWORD *buffer_length)
 {
     struct buffer *buffer = impl_from_IMF2DBuffer2(iface);
     HRESULT hr = S_OK;
 
-    TRACE("%p, %p, %p.\n", iface, scanline0, pitch);
-
-    if (!scanline0 || !pitch)
+    if (!scanline0 || !pitch || !buffer_start || !buffer_length)
         return E_POINTER;
 
     EnterCriticalSection(&buffer->cs);
@@ -1051,6 +1022,10 @@ static HRESULT WINAPI dxgi_surface_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **sca
     {
         *scanline0 = buffer->dxgi_surface.map_desc.pData;
         *pitch = buffer->dxgi_surface.map_desc.RowPitch;
+        if (buffer_start)
+            *buffer_start = *scanline0;
+        if (buffer_length)
+            *buffer_length = buffer->dxgi_surface.map_desc.RowPitch * buffer->_2d.height;
     }
 
     LeaveCriticalSection(&buffer->cs);
@@ -1058,6 +1033,16 @@ static HRESULT WINAPI dxgi_surface_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **sca
     return hr;
 }
 
+static HRESULT WINAPI dxgi_surface_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **scanline0, LONG *pitch)
+{
+    DWORD buffer_length;
+    BYTE *buffer_start;
+
+    TRACE("%p, %p, %p.\n", iface, scanline0, pitch);
+
+    return dxgi_surface_buffer_lock2d(iface, MF2DBuffer_LockFlags_ReadWrite, scanline0, pitch, &buffer_start, &buffer_length);
+}
+
 static HRESULT WINAPI dxgi_surface_buffer_Unlock2D(IMF2DBuffer2 *iface)
 {
     struct buffer *buffer = impl_from_IMF2DBuffer2(iface);
@@ -1112,34 +1097,9 @@ static HRESULT WINAPI dxgi_surface_buffer_GetScanline0AndPitch(IMF2DBuffer2 *ifa
 static HRESULT WINAPI dxgi_surface_buffer_Lock2DSize(IMF2DBuffer2 *iface, MF2DBuffer_LockFlags flags,
         BYTE **scanline0, LONG *pitch, BYTE **buffer_start, DWORD *buffer_length)
 {
-    struct buffer *buffer = impl_from_IMF2DBuffer2(iface);
-    HRESULT hr = S_OK;
-
     TRACE("%p, %#x, %p, %p, %p, %p.\n", iface, flags, scanline0, pitch, buffer_start, buffer_length);
 
-    if (!scanline0 || !pitch || !buffer_start || !buffer_length)
-        return E_POINTER;
-
-    EnterCriticalSection(&buffer->cs);
-
-    if (buffer->_2d.linear_buffer)
-        hr = MF_E_UNEXPECTED;
-    else if (!buffer->_2d.locks++)
-        hr = dxgi_surface_buffer_map(buffer);
-
-    if (SUCCEEDED(hr))
-    {
-        *scanline0 = buffer->dxgi_surface.map_desc.pData;
-        *pitch = buffer->dxgi_surface.map_desc.RowPitch;
-        if (buffer_start)
-            *buffer_start = *scanline0;
-        if (buffer_length)
-            *buffer_length = buffer->dxgi_surface.map_desc.RowPitch * buffer->_2d.height;
-    }
-
-    LeaveCriticalSection(&buffer->cs);
-
-    return hr;
+    return dxgi_surface_buffer_lock2d(iface, flags, scanline0, pitch, buffer_start, buffer_length);
 }
 
 static HRESULT WINAPI dxgi_buffer_QueryInterface(IMFDXGIBuffer *iface, REFIID riid, void **obj)
-- 
2.36.1




More information about the wine-devel mailing list