Nikolay Sivov : mfplat: Add IMFGetService stub for 2D memory buffer.

Alexandre Julliard julliard at winehq.org
Tue Oct 27 16:43:50 CDT 2020


Module: wine
Branch: master
Commit: 77d1701b99f0a9fdfe95f9412246a8d008875591
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=77d1701b99f0a9fdfe95f9412246a8d008875591

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue Oct 27 20:50:19 2020 +0300

mfplat: Add IMFGetService stub for 2D memory buffer.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mfplat/buffer.c       | 44 ++++++++++++++++++++++++++++++++++++++++++++
 dlls/mfplat/tests/mfplat.c | 13 +++++++++++++
 2 files changed, 57 insertions(+)

diff --git a/dlls/mfplat/buffer.c b/dlls/mfplat/buffer.c
index a3311bc10f1..5e969e14ec9 100644
--- a/dlls/mfplat/buffer.c
+++ b/dlls/mfplat/buffer.c
@@ -31,6 +31,7 @@ struct memory_buffer
 {
     IMFMediaBuffer IMFMediaBuffer_iface;
     IMF2DBuffer2 IMF2DBuffer2_iface;
+    IMFGetService IMFGetService_iface;
     LONG refcount;
 
     BYTE *data;
@@ -88,6 +89,11 @@ static struct memory_buffer *impl_from_IMF2DBuffer2(IMF2DBuffer2 *iface)
     return CONTAINING_RECORD(iface, struct memory_buffer, IMF2DBuffer2_iface);
 }
 
+static struct memory_buffer *impl_from_IMFGetService(IMFGetService *iface)
+{
+    return CONTAINING_RECORD(iface, struct memory_buffer, IMFGetService_iface);
+}
+
 static inline struct sample *impl_from_IMFSample(IMFSample *iface)
 {
     return CONTAINING_RECORD(iface, struct sample, IMFSample_iface);
@@ -240,6 +246,10 @@ static HRESULT WINAPI memory_1d_2d_buffer_QueryInterface(IMFMediaBuffer *iface,
     {
         *out = &buffer->IMF2DBuffer2_iface;
     }
+    else if (IsEqualIID(riid, &IID_IMFGetService))
+    {
+        *out = &buffer->IMFGetService_iface;
+    }
     else
     {
         WARN("Unsupported interface %s.\n", debugstr_guid(riid));
@@ -511,6 +521,39 @@ static const IMF2DBuffer2Vtbl memory_2d_buffer_vtbl =
     memory_2d_buffer_Copy2DTo,
 };
 
+static HRESULT WINAPI memory_2d_buffer_gs_QueryInterface(IMFGetService *iface, REFIID riid, void **obj)
+{
+    struct memory_buffer *buffer = impl_from_IMFGetService(iface);
+    return IMFMediaBuffer_QueryInterface(&buffer->IMFMediaBuffer_iface, riid, obj);
+}
+
+static ULONG WINAPI memory_2d_buffer_gs_AddRef(IMFGetService *iface)
+{
+    struct memory_buffer *buffer = impl_from_IMFGetService(iface);
+    return IMFMediaBuffer_AddRef(&buffer->IMFMediaBuffer_iface);
+}
+
+static ULONG WINAPI memory_2d_buffer_gs_Release(IMFGetService *iface)
+{
+    struct memory_buffer *buffer = impl_from_IMFGetService(iface);
+    return IMFMediaBuffer_Release(&buffer->IMFMediaBuffer_iface);
+}
+
+static HRESULT WINAPI memory_2d_buffer_gs_GetService(IMFGetService *iface, REFGUID service, REFIID riid, void **obj)
+{
+    TRACE("%p, %s, %s, %p.\n", iface, debugstr_guid(service), debugstr_guid(riid), obj);
+
+    return E_NOTIMPL;
+}
+
+static const IMFGetServiceVtbl memory_2d_buffer_gs_vtbl =
+{
+    memory_2d_buffer_gs_QueryInterface,
+    memory_2d_buffer_gs_AddRef,
+    memory_2d_buffer_gs_Release,
+    memory_2d_buffer_gs_GetService,
+};
+
 static HRESULT memory_buffer_init(struct memory_buffer *buffer, DWORD max_length, DWORD alignment,
         const IMFMediaBufferVtbl *vtbl)
 {
@@ -620,6 +663,7 @@ static HRESULT create_2d_buffer(DWORD width, DWORD height, DWORD fourcc, BOOL bo
     }
 
     object->IMF2DBuffer2_iface.lpVtbl = &memory_2d_buffer_vtbl;
+    object->IMFGetService_iface.lpVtbl = &memory_2d_buffer_gs_vtbl;
     object->_2d.plane_size = plane_size;
     object->_2d.width = stride;
     object->_2d.height = height;
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index 971469ec574..906454851a8 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -1818,6 +1818,7 @@ static void test_system_memory_buffer(void)
     HRESULT hr;
     DWORD length, max;
     BYTE *data, *data2;
+    IUnknown *unk;
 
     hr = MFCreateMemoryBuffer(1024, NULL);
     ok(hr == E_INVALIDARG || hr == E_POINTER, "got 0x%08x\n", hr);
@@ -1836,6 +1837,9 @@ static void test_system_memory_buffer(void)
     hr = MFCreateMemoryBuffer(1024, &buffer);
     ok(hr == S_OK, "got 0x%08x\n", hr);
 
+    hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMFGetService, (void **)&unk);
+    ok(hr == E_NOINTERFACE, "Unexpected hr %#x.\n", hr);
+
     hr = IMFMediaBuffer_GetMaxLength(buffer, NULL);
     ok(hr == E_INVALIDARG || hr == E_POINTER, "got 0x%08x\n", hr);
 
@@ -5155,6 +5159,7 @@ static void test_MFCreate2DMediaBuffer(void)
     IMF2DBuffer *_2dbuffer;
     IMFMediaBuffer *buffer;
     int i, pitch, pitch2;
+    IUnknown *unk;
     HRESULT hr;
     BOOL ret;
 
@@ -5177,6 +5182,10 @@ static void test_MFCreate2DMediaBuffer(void)
     hr = pMFCreate2DMediaBuffer(2, 3, MAKEFOURCC('N','V','1','2'), FALSE, &buffer);
     ok(hr == S_OK, "Failed to create a buffer, hr %#x.\n", hr);
 
+    hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMFGetService, (void **)&unk);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    IUnknown_Release(unk);
+
     /* Full backing buffer size, with 64 bytes per row alignment.  */
     hr = IMFMediaBuffer_GetMaxLength(buffer, &max_length);
     ok(hr == S_OK, "Failed to get length, hr %#x.\n", hr);
@@ -5405,6 +5414,7 @@ static void test_MFCreateMediaBufferFromMediaType(void)
     HRESULT hr;
     IMFMediaType *media_type;
     unsigned int i;
+    IUnknown *unk;
 
     if (!pMFCreateMediaBufferFromMediaType)
     {
@@ -5437,6 +5447,9 @@ static void test_MFCreateMediaBufferFromMediaType(void)
         if (FAILED(hr))
             break;
 
+        hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMFGetService, (void **)&unk);
+        ok(hr == E_NOINTERFACE, "Unexpected hr %#x.\n", hr);
+
         hr = IMFMediaBuffer_GetMaxLength(buffer, &length);
         ok(hr == S_OK, "Failed to get length, hr %#x.\n", hr);
         ok(ptr->buffer_length == length, "%d: unexpected buffer length %u, expected %u.\n", i, length, ptr->buffer_length);




More information about the wine-cvs mailing list