[PATCH] mf: Added MFCreateTopology and stub IMFTopology implementation

Nikolay Sivov nsivov at codeweavers.com
Wed May 31 01:56:27 CDT 2017


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 configure.ac              |   3 +-
 dlls/mf/Makefile.in       |   4 +-
 dlls/mf/mf.spec           |   2 +-
 dlls/mf/tests/Makefile.in |   5 +
 dlls/mf/tests/mf.c        |  49 +++++
 dlls/mf/topology.c        | 524 ++++++++++++++++++++++++++++++++++++++++++++++
 include/mfidl.idl         |   1 +
 7 files changed, 585 insertions(+), 3 deletions(-)
 create mode 100644 dlls/mf/tests/Makefile.in
 create mode 100644 dlls/mf/tests/mf.c
 create mode 100644 dlls/mf/topology.c

diff --git a/configure.ac b/configure.ac
index 365e61fa0a..129a8f62c7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3181,7 +3181,8 @@ WINE_CONFIG_DLL(mcicda)
 WINE_CONFIG_DLL(mciqtz32)
 WINE_CONFIG_DLL(mciseq)
 WINE_CONFIG_DLL(mciwave)
-WINE_CONFIG_DLL(mf)
+WINE_CONFIG_DLL(mf,,[implib])
+WINE_CONFIG_TEST(dlls/mf/tests)
 WINE_CONFIG_DLL(mf3216)
 WINE_CONFIG_DLL(mfplat,,[implib])
 WINE_CONFIG_TEST(dlls/mfplat/tests)
diff --git a/dlls/mf/Makefile.in b/dlls/mf/Makefile.in
index d7fdb61c09..6725d5bf14 100644
--- a/dlls/mf/Makefile.in
+++ b/dlls/mf/Makefile.in
@@ -1,4 +1,6 @@
 MODULE    = mf.dll
+IMPORTLIB = mf
 
 C_SRCS = \
-	main.c
+	main.c \
+	topology.c
diff --git a/dlls/mf/mf.spec b/dlls/mf/mf.spec
index e04c471e63..cd6d3dcab7 100644
--- a/dlls/mf/mf.spec
+++ b/dlls/mf/mf.spec
@@ -60,7 +60,7 @@
 @ stdcall MFCreateSourceResolver(ptr) mfplat.MFCreateSourceResolver
 @ stub MFCreateStandardQualityManager
 @ stub MFCreateTopoLoader
-@ stub MFCreateTopology
+@ stdcall MFCreateTopology(ptr)
 @ stub MFCreateTopologyNode
 @ stub MFCreateTranscodeProfile
 @ stub MFCreateTranscodeSinkActivate
diff --git a/dlls/mf/tests/Makefile.in b/dlls/mf/tests/Makefile.in
new file mode 100644
index 0000000000..f989baa230
--- /dev/null
+++ b/dlls/mf/tests/Makefile.in
@@ -0,0 +1,5 @@
+TESTDLL   = mf.dll
+IMPORTS   = mf
+
+C_SRCS = \
+	mf.c
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
new file mode 100644
index 0000000000..f28c6e048d
--- /dev/null
+++ b/dlls/mf/tests/mf.c
@@ -0,0 +1,49 @@
+/*
+ * Unit tests for mf.dll.
+ *
+ * Copyright 2017 Nikolay Sivov
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdarg.h>
+#include <string.h>
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+
+#include "mfidl.h"
+
+#include "wine/test.h"
+
+static void test_topology(void)
+{
+    IMFTopology *topology;
+    HRESULT hr;
+
+    hr = MFCreateTopology(NULL);
+    ok(hr == E_POINTER, "got %#x\n", hr);
+
+    hr = MFCreateTopology(&topology);
+    ok(hr == S_OK, "got %#x\n", hr);
+    IMFTopology_Release(topology);
+}
+
+START_TEST(mf)
+{
+    test_topology();
+}
diff --git a/dlls/mf/topology.c b/dlls/mf/topology.c
new file mode 100644
index 0000000000..4ddc61b8a3
--- /dev/null
+++ b/dlls/mf/topology.c
@@ -0,0 +1,524 @@
+/*
+ * Copyright 2017 Nikolay Sivov
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+#include "config.h"
+
+#include <stdarg.h>
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "initguid.h"
+#include "mfidl.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(mfplat);
+
+typedef struct mftopology
+{
+    IMFTopology IMFTopology_iface;
+    LONG ref;
+} mftopology;
+
+static inline mftopology *impl_from_IMFTopology(IMFTopology *iface)
+{
+    return CONTAINING_RECORD(iface, mftopology, IMFTopology_iface);
+}
+
+static HRESULT WINAPI mftopology_QueryInterface(IMFTopology *iface, REFIID riid, void **out)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), out);
+
+    if (IsEqualIID(riid, &IID_IMFTopology) ||
+            IsEqualIID(riid, &IID_IMFAttributes) ||
+            IsEqualIID(riid, &IID_IUnknown))
+    {
+        *out = &This->IMFTopology_iface;
+    }
+    else
+    {
+        FIXME("(%s, %p)\n", debugstr_guid(riid), out);
+        *out = NULL;
+        return E_NOINTERFACE;
+    }
+
+    IUnknown_AddRef((IUnknown*)*out);
+    return S_OK;
+}
+
+static ULONG WINAPI mftopology_AddRef(IMFTopology *iface)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+    ULONG ref = InterlockedIncrement(&This->ref);
+
+    TRACE("(%p) ref=%u\n", This, ref);
+
+    return ref;
+}
+
+static ULONG WINAPI mftopology_Release(IMFTopology *iface)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+    ULONG ref = InterlockedDecrement(&This->ref);
+
+    TRACE("(%p) ref=%u\n", This, ref);
+
+    if (!ref)
+    {
+        HeapFree(GetProcessHeap(), 0, This);
+    }
+
+    return ref;
+}
+
+static HRESULT WINAPI mftopology_GetItem(IMFTopology *iface, REFGUID key, PROPVARIANT *value)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%s, %p)\n", This, debugstr_guid(key), value);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_GetItemType(IMFTopology *iface, REFGUID key, MF_ATTRIBUTE_TYPE *type)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%s, %p)\n", This, debugstr_guid(key), type);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_CompareItem(IMFTopology *iface, REFGUID key, REFPROPVARIANT value, BOOL *result)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%s, %p, %p)\n", This, debugstr_guid(key), value, result);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_Compare(IMFTopology *iface, IMFAttributes *theirs, MF_ATTRIBUTES_MATCH_TYPE type,
+                BOOL *result)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%p, %d, %p)\n", This, theirs, type, result);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_GetUINT32(IMFTopology *iface, REFGUID key, UINT32 *value)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%s, %p)\n", This, debugstr_guid(key), value);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_GetUINT64(IMFTopology *iface, REFGUID key, UINT64 *value)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%s, %p)\n", This, debugstr_guid(key), value);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_GetDouble(IMFTopology *iface, REFGUID key, double *value)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%s, %p)\n", This, debugstr_guid(key), value);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_GetGUID(IMFTopology *iface, REFGUID key, GUID *value)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%s, %p)\n", This, debugstr_guid(key), value);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_GetStringLength(IMFTopology *iface, REFGUID key, UINT32 *length)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%s, %p)\n", This, debugstr_guid(key), length);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_GetString(IMFTopology *iface, REFGUID key, WCHAR *value,
+                UINT32 size, UINT32 *length)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%s, %p, %d, %p)\n", This, debugstr_guid(key), value, size, length);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_GetAllocatedString(IMFTopology *iface, REFGUID key,
+                                      WCHAR **value, UINT32 *length)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%s, %p, %p)\n", This, debugstr_guid(key), value, length);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_GetBlobSize(IMFTopology *iface, REFGUID key, UINT32 *size)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%s, %p)\n", This, debugstr_guid(key), size);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_GetBlob(IMFTopology *iface, REFGUID key, UINT8 *buf,
+                UINT32 bufsize, UINT32 *blobsize)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%s, %p, %d, %p)\n", This, debugstr_guid(key), buf, bufsize, blobsize);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_GetAllocatedBlob(IMFTopology *iface, REFGUID key, UINT8 **buf, UINT32 *size)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%s, %p, %p)\n", This, debugstr_guid(key), buf, size);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_GetUnknown(IMFTopology *iface, REFGUID key, REFIID riid, void **ppv)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%s, %s, %p)\n", This, debugstr_guid(key), debugstr_guid(riid), ppv);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_SetItem(IMFTopology *iface, REFGUID key, REFPROPVARIANT Value)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%s, %p)\n", This, debugstr_guid(key), Value);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_DeleteItem(IMFTopology *iface, REFGUID key)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%s)\n", This, debugstr_guid(key));
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_DeleteAllItems(IMFTopology *iface)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)\n", This);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_SetUINT32(IMFTopology *iface, REFGUID key, UINT32 value)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%s, %d)\n", This, debugstr_guid(key), value);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_SetUINT64(IMFTopology *iface, REFGUID key, UINT64 value)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%s, %s)\n", This, debugstr_guid(key), wine_dbgstr_longlong(value));
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_SetDouble(IMFTopology *iface, REFGUID key, double value)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%s, %f)\n", This, debugstr_guid(key), value);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_SetGUID(IMFTopology *iface, REFGUID key, REFGUID value)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%s, %s)\n", This, debugstr_guid(key), debugstr_guid(value));
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_SetString(IMFTopology *iface, REFGUID key, const WCHAR *value)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%s, %s)\n", This, debugstr_guid(key), debugstr_w(value));
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_SetBlob(IMFTopology *iface, REFGUID key, const UINT8 *buf, UINT32 size)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%s, %p, %d)\n", This, debugstr_guid(key), buf, size);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_SetUnknown(IMFTopology *iface, REFGUID key, IUnknown *unknown)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%s, %p)\n", This, debugstr_guid(key), unknown);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_LockStore(IMFTopology *iface)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)\n", This);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_UnlockStore(IMFTopology *iface)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)\n", This);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_GetCount(IMFTopology *iface, UINT32 *count)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%p)\n", This, count);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_GetItemByIndex(IMFTopology *iface, UINT32 index, GUID *key, PROPVARIANT *value)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%u, %p, %p)\n", This, index, key, value);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_CopyAllItems(IMFTopology *iface, IMFAttributes *dest)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%p)\n", This, dest);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_GetTopologyID(IMFTopology *iface, TOPOID *id)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%p)\n", This, id);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_AddNode(IMFTopology *iface, IMFTopologyNode *node)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%p)\n", This, node);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_RemoveNode(IMFTopology *iface, IMFTopologyNode *node)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%p)\n", This, node);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_GetNodeCount(IMFTopology *iface, WORD *count)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%p)\n", This, count);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_GetNode(IMFTopology *iface, WORD index, IMFTopologyNode **node)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%u, %p)\n", This, index, node);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_Clear(IMFTopology *iface)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)\n", This);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_CloneFrom(IMFTopology *iface, IMFTopology *topology)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%p)\n", This, topology);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_GetNodeByID(IMFTopology *iface, TOPOID id, IMFTopologyNode **node)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%p)\n", This, node);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_GetSourceNodeCollection(IMFTopology *iface, IMFCollection **collection)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%p)\n", This, collection);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mftopology_GetOutputNodeCollection(IMFTopology *iface, IMFCollection **collection)
+{
+    mftopology *This = impl_from_IMFTopology(iface);
+
+    FIXME("(%p)->(%p)\n", This, collection);
+
+    return E_NOTIMPL;
+}
+
+static const IMFTopologyVtbl mftopologyvtbl =
+{
+    mftopology_QueryInterface,
+    mftopology_AddRef,
+    mftopology_Release,
+    mftopology_GetItem,
+    mftopology_GetItemType,
+    mftopology_CompareItem,
+    mftopology_Compare,
+    mftopology_GetUINT32,
+    mftopology_GetUINT64,
+    mftopology_GetDouble,
+    mftopology_GetGUID,
+    mftopology_GetStringLength,
+    mftopology_GetString,
+    mftopology_GetAllocatedString,
+    mftopology_GetBlobSize,
+    mftopology_GetBlob,
+    mftopology_GetAllocatedBlob,
+    mftopology_GetUnknown,
+    mftopology_SetItem,
+    mftopology_DeleteItem,
+    mftopology_DeleteAllItems,
+    mftopology_SetUINT32,
+    mftopology_SetUINT64,
+    mftopology_SetDouble,
+    mftopology_SetGUID,
+    mftopology_SetString,
+    mftopology_SetBlob,
+    mftopology_SetUnknown,
+    mftopology_LockStore,
+    mftopology_UnlockStore,
+    mftopology_GetCount,
+    mftopology_GetItemByIndex,
+    mftopology_CopyAllItems,
+    mftopology_GetTopologyID,
+    mftopology_AddNode,
+    mftopology_RemoveNode,
+    mftopology_GetNodeCount,
+    mftopology_GetNode,
+    mftopology_Clear,
+    mftopology_CloneFrom,
+    mftopology_GetNodeByID,
+    mftopology_GetSourceNodeCollection,
+    mftopology_GetOutputNodeCollection,
+};
+
+/***********************************************************************
+ *      MFCreateTopology (mf.@)
+ */
+HRESULT WINAPI MFCreateTopology(IMFTopology **topology)
+{
+    mftopology *object;
+
+    if (!topology)
+        return E_POINTER;
+
+    object = HeapAlloc(GetProcessHeap(), 0, sizeof(*object));
+    if (!object)
+        return E_OUTOFMEMORY;
+
+    object->IMFTopology_iface.lpVtbl = &mftopologyvtbl;
+    object->ref = 1;
+
+    *topology = &object->IMFTopology_iface;
+
+    return S_OK;
+}
+
diff --git a/include/mfidl.idl b/include/mfidl.idl
index 925fbcc4fa..767ff4229e 100644
--- a/include/mfidl.idl
+++ b/include/mfidl.idl
@@ -164,3 +164,4 @@ interface IMFSourceResolver : IUnknown
 }
 
 cpp_quote("HRESULT WINAPI MFCreateSourceResolver(IMFSourceResolver **resolver);")
+cpp_quote("HRESULT WINAPI MFCreateTopology(IMFTopology **topology);")
-- 
2.11.0




More information about the wine-patches mailing list