Nikolay Sivov : mf: Add IMFTopoLoader stub.
Alexandre Julliard
julliard at winehq.org
Mon Feb 25 15:10:34 CST 2019
Module: wine
Branch: master
Commit: 202e9592d5db228f04337d06ff697f67e2287c97
URL: https://source.winehq.org/git/wine.git/?a=commit;h=202e9592d5db228f04337d06ff697f67e2287c97
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Mon Feb 25 11:33:53 2019 +0300
mf: Add IMFTopoLoader stub.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mf/mf.spec | 2 +-
dlls/mf/tests/mf.c | 15 +++++++++
dlls/mf/topology.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
include/mfidl.idl | 12 +++++++
4 files changed, 121 insertions(+), 1 deletion(-)
diff --git a/dlls/mf/mf.spec b/dlls/mf/mf.spec
index b2e0b9b..64f0b1d 100644
--- a/dlls/mf/mf.spec
+++ b/dlls/mf/mf.spec
@@ -59,7 +59,7 @@
@ stub MFCreateSimpleTypeHandler
@ stdcall MFCreateSourceResolver(ptr) mfplat.MFCreateSourceResolver
@ stub MFCreateStandardQualityManager
-@ stub MFCreateTopoLoader
+@ stdcall MFCreateTopoLoader(ptr)
@ stdcall MFCreateTopology(ptr)
@ stdcall MFCreateTopologyNode(long ptr)
@ stub MFCreateTranscodeProfile
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index 1503149..91ddd60 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -469,9 +469,24 @@ static void test_media_session(void)
ok(hr == S_OK, "Shutdown failure, hr %#x.\n", hr);
}
+static void test_topology_loader(void)
+{
+ IMFTopoLoader *loader;
+ HRESULT hr;
+
+ hr = MFCreateTopoLoader(NULL);
+ ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
+
+ hr = MFCreateTopoLoader(&loader);
+ ok(hr == S_OK, "Failed to create topology loader, hr %#x.\n", hr);
+
+ IMFTopoLoader_Release(loader);
+}
+
START_TEST(mf)
{
test_topology();
+ test_topology_loader();
test_MFGetService();
test_MFCreateSequencerSource();
test_media_session();
diff --git a/dlls/mf/topology.c b/dlls/mf/topology.c
index 3b4a2e1a..84387ae 100644
--- a/dlls/mf/topology.c
+++ b/dlls/mf/topology.c
@@ -52,6 +52,12 @@ struct topology_node
TOPOID id;
};
+struct topology_loader
+{
+ IMFTopoLoader IMFTopoLoader_iface;
+ LONG refcount;
+};
+
struct seq_source
{
IMFSequencerSource IMFSequencerSource_iface;
@@ -68,6 +74,11 @@ static struct topology_node *impl_from_IMFTopologyNode(IMFTopologyNode *iface)
return CONTAINING_RECORD(iface, struct topology_node, IMFTopologyNode_iface);
}
+static struct topology_loader *impl_from_IMFTopoLoader(IMFTopoLoader *iface)
+{
+ return CONTAINING_RECORD(iface, struct topology_loader, IMFTopoLoader_iface);
+}
+
static struct seq_source *impl_from_IMFSequencerSource(IMFSequencerSource *iface)
{
return CONTAINING_RECORD(iface, struct seq_source, IMFSequencerSource_iface);
@@ -1212,6 +1223,88 @@ HRESULT WINAPI MFCreateTopologyNode(MF_TOPOLOGY_TYPE node_type, IMFTopologyNode
return S_OK;
}
+static HRESULT WINAPI topology_loader_QueryInterface(IMFTopoLoader *iface, REFIID riid, void **out)
+{
+ TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), out);
+
+ if (IsEqualIID(riid, &IID_IMFTopoLoader) ||
+ IsEqualIID(riid, &IID_IUnknown))
+ {
+ *out = iface;
+ IMFTopoLoader_AddRef(iface);
+ return S_OK;
+ }
+
+ WARN("Unsupported %s.\n", debugstr_guid(riid));
+ *out = NULL;
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI topology_loader_AddRef(IMFTopoLoader *iface)
+{
+ struct topology_loader *loader = impl_from_IMFTopoLoader(iface);
+ ULONG refcount = InterlockedIncrement(&loader->refcount);
+
+ TRACE("(%p) refcount=%u\n", iface, refcount);
+
+ return refcount;
+}
+
+static ULONG WINAPI topology_loader_Release(IMFTopoLoader *iface)
+{
+ struct topology_loader *loader = impl_from_IMFTopoLoader(iface);
+ ULONG refcount = InterlockedDecrement(&loader->refcount);
+
+ TRACE("(%p) refcount=%u\n", iface, refcount);
+
+ if (!refcount)
+ {
+ heap_free(loader);
+ }
+
+ return refcount;
+}
+
+static HRESULT WINAPI topology_loader_Load(IMFTopoLoader *iface, IMFTopology *input_topology,
+ IMFTopology **output_topology, IMFTopology *current_topology)
+{
+ FIXME("%p, %p, %p, %p.\n", iface, input_topology, output_topology, current_topology);
+
+ return E_NOTIMPL;
+}
+
+static const IMFTopoLoaderVtbl topologyloadervtbl =
+{
+ topology_loader_QueryInterface,
+ topology_loader_AddRef,
+ topology_loader_Release,
+ topology_loader_Load,
+};
+
+/***********************************************************************
+ * MFCreateTopoLoader (mf.@)
+ */
+HRESULT WINAPI MFCreateTopoLoader(IMFTopoLoader **loader)
+{
+ struct topology_loader *object;
+
+ TRACE("%p.\n", loader);
+
+ if (!loader)
+ return E_POINTER;
+
+ object = heap_alloc(sizeof(*object));
+ if (!object)
+ return E_OUTOFMEMORY;
+
+ object->IMFTopoLoader_iface.lpVtbl = &topologyloadervtbl;
+ object->refcount = 1;
+
+ *loader = &object->IMFTopoLoader_iface;
+
+ return S_OK;
+}
+
static HRESULT WINAPI seq_source_QueryInterface(IMFSequencerSource *iface, REFIID riid, void **out)
{
struct seq_source *seq_source = impl_from_IMFSequencerSource(iface);
diff --git a/include/mfidl.idl b/include/mfidl.idl
index 82a87ba..831bc35 100644
--- a/include/mfidl.idl
+++ b/include/mfidl.idl
@@ -118,6 +118,17 @@ interface IMFTopology : IMFAttributes
[
object,
+ uuid(de9a6157-f660-4643-b56a-df9f7998c7cd),
+ local,
+]
+interface IMFTopoLoader : IUnknown
+{
+ HRESULT Load([in] IMFTopology *input_topology, [out] IMFTopology **output_topology,
+ [in] IMFTopology *current_topology);
+}
+
+[
+ object,
uuid(90377834-21d0-4dee-8214-ba2e3e6c1127),
]
interface IMFMediaSession : IMFMediaEventGenerator
@@ -313,6 +324,7 @@ cpp_quote("HRESULT WINAPI MFCreateStreamDescriptor(DWORD identifier, DWORD cMedi
cpp_quote(" IMFMediaType **types, IMFStreamDescriptor **descriptor);")
cpp_quote("HRESULT WINAPI MFCreateTopology(IMFTopology **topology);")
cpp_quote("HRESULT WINAPI MFCreateTopologyNode(MF_TOPOLOGY_TYPE node_type, IMFTopologyNode **node);")
+cpp_quote("HRESULT WINAPI MFCreateTopoLoader(IMFTopoLoader **loader);")
cpp_quote("HRESULT WINAPI MFGetSupportedMimeTypes(PROPVARIANT *array);")
cpp_quote("HRESULT WINAPI MFGetService(IUnknown *object, REFGUID service, REFIID iid, void **obj);")
cpp_quote("MFTIME WINAPI MFGetSystemTime(void);")
More information about the wine-cvs
mailing list