Nikolay Sivov : mf: Add IMFMediaSourceTopologyProvider for sequencer source stub.
Alexandre Julliard
julliard at winehq.org
Mon Oct 7 17:02:16 CDT 2019
Module: wine
Branch: master
Commit: eeed0262e2ab3139bd3c283393dedaf8168537cb
URL: https://source.winehq.org/git/wine.git/?a=commit;h=eeed0262e2ab3139bd3c283393dedaf8168537cb
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Mon Oct 7 15:57:02 2019 +0300
mf: Add IMFMediaSourceTopologyProvider for sequencer source stub.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mf/tests/mf.c | 9 ++++++--
dlls/mf/topology.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++------
include/mfidl.idl | 9 ++++++++
3 files changed, 73 insertions(+), 8 deletions(-)
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index 7cebb4c555..2a5efc99e8 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -785,8 +785,9 @@ static void test_MFGetService(void)
ok(unk == (void *)0xdeadbeef, "Unexpected out object.\n");
}
-static void test_MFCreateSequencerSource(void)
+static void test_sequencer_source(void)
{
+ IMFMediaSourceTopologyProvider *provider;
IMFSequencerSource *seq_source;
HRESULT hr;
@@ -796,6 +797,10 @@ static void test_MFCreateSequencerSource(void)
hr = MFCreateSequencerSource(NULL, &seq_source);
ok(hr == S_OK, "Failed to create sequencer source, hr %#x.\n", hr);
+ hr = IMFSequencerSource_QueryInterface(seq_source, &IID_IMFMediaSourceTopologyProvider, (void **)&provider);
+ ok(hr == S_OK, "Failed to get provider interface, hr %#x.\n", hr);
+ IMFMediaSourceTopologyProvider_Release(provider);
+
IMFSequencerSource_Release(seq_source);
hr = MFShutdown();
@@ -2455,7 +2460,7 @@ START_TEST(mf)
test_topology();
test_topology_loader();
test_MFGetService();
- test_MFCreateSequencerSource();
+ test_sequencer_source();
test_media_session();
test_MFShutdownObject();
test_presentation_clock();
diff --git a/dlls/mf/topology.c b/dlls/mf/topology.c
index 8d928ad3f9..ad89739d4a 100644
--- a/dlls/mf/topology.c
+++ b/dlls/mf/topology.c
@@ -89,6 +89,7 @@ struct topology_loader
struct seq_source
{
IMFSequencerSource IMFSequencerSource_iface;
+ IMFMediaSourceTopologyProvider IMFMediaSourceTopologyProvider_iface;
LONG refcount;
};
@@ -127,6 +128,11 @@ static struct seq_source *impl_from_IMFSequencerSource(IMFSequencerSource *iface
return CONTAINING_RECORD(iface, struct seq_source, IMFSequencerSource_iface);
}
+static struct seq_source *impl_from_IMFMediaSourceTopologyProvider(IMFMediaSourceTopologyProvider *iface)
+{
+ return CONTAINING_RECORD(iface, struct seq_source, IMFMediaSourceTopologyProvider_iface);
+}
+
static HRESULT topology_node_reserve_streams(struct node_streams *streams, DWORD index)
{
if (!mf_array_reserve((void **)&streams->streams, &streams->size, index + 1, sizeof(*streams->streams)))
@@ -1875,20 +1881,29 @@ static HRESULT WINAPI seq_source_QueryInterface(IMFSequencerSource *iface, REFII
{
struct seq_source *seq_source = impl_from_IMFSequencerSource(iface);
- TRACE("(%p)->(%s %p)\n", iface, debugstr_guid(riid), out);
+ TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), out);
+
+ *out = NULL;
if (IsEqualIID(riid, &IID_IMFSequencerSource) ||
IsEqualIID(riid, &IID_IUnknown))
{
*out = &seq_source->IMFSequencerSource_iface;
- IMFSequencerSource_AddRef(iface);
- return S_OK;
+ }
+ else if (IsEqualIID(riid, &IID_IMFMediaSourceTopologyProvider))
+ {
+ *out = &seq_source->IMFMediaSourceTopologyProvider_iface;
+ }
+ else
+ {
+ WARN("Unimplemented %s.\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
}
- WARN("Unimplemented %s.\n", debugstr_guid(riid));
- *out = NULL;
+ if (*out)
+ IUnknown_AddRef((IUnknown *)*out);
- return E_NOINTERFACE;
+ return S_OK;
}
static ULONG WINAPI seq_source_AddRef(IMFSequencerSource *iface)
@@ -1954,6 +1969,41 @@ static HRESULT WINAPI seq_source_UpdateTopologyFlags(IMFSequencerSource *iface,
return E_NOTIMPL;
}
+static HRESULT WINAPI seq_source_topology_provider_QueryInterface(IMFMediaSourceTopologyProvider *iface, REFIID riid,
+ void **obj)
+{
+ struct seq_source *seq_source = impl_from_IMFMediaSourceTopologyProvider(iface);
+ return IMFSequencerSource_QueryInterface(&seq_source->IMFSequencerSource_iface, riid, obj);
+}
+
+static ULONG WINAPI seq_source_topology_provider_AddRef(IMFMediaSourceTopologyProvider *iface)
+{
+ struct seq_source *seq_source = impl_from_IMFMediaSourceTopologyProvider(iface);
+ return IMFSequencerSource_AddRef(&seq_source->IMFSequencerSource_iface);
+}
+
+static ULONG WINAPI seq_source_topology_provider_Release(IMFMediaSourceTopologyProvider *iface)
+{
+ struct seq_source *seq_source = impl_from_IMFMediaSourceTopologyProvider(iface);
+ return IMFSequencerSource_Release(&seq_source->IMFSequencerSource_iface);
+}
+
+static HRESULT WINAPI seq_source_topology_provider_GetMediaSourceTopology(IMFMediaSourceTopologyProvider *iface,
+ IMFPresentationDescriptor *pd, IMFTopology **topology)
+{
+ FIXME("%p, %p, %p.\n", iface, pd, topology);
+
+ return E_NOTIMPL;
+}
+
+static const IMFMediaSourceTopologyProviderVtbl seq_source_topology_provider_vtbl =
+{
+ seq_source_topology_provider_QueryInterface,
+ seq_source_topology_provider_AddRef,
+ seq_source_topology_provider_Release,
+ seq_source_topology_provider_GetMediaSourceTopology,
+};
+
static const IMFSequencerSourceVtbl seqsourcevtbl =
{
seq_source_QueryInterface,
@@ -1983,6 +2033,7 @@ HRESULT WINAPI MFCreateSequencerSource(IUnknown *reserved, IMFSequencerSource **
return E_OUTOFMEMORY;
object->IMFSequencerSource_iface.lpVtbl = &seqsourcevtbl;
+ object->IMFMediaSourceTopologyProvider_iface.lpVtbl = &seq_source_topology_provider_vtbl;
object->refcount = 1;
*seq_source = &object->IMFSequencerSource_iface;
diff --git a/include/mfidl.idl b/include/mfidl.idl
index 908c659f1d..df48cb3ab9 100644
--- a/include/mfidl.idl
+++ b/include/mfidl.idl
@@ -783,6 +783,15 @@ interface IMFLocalMFTRegistration : IUnknown
HRESULT RegisterMFTs([in, size_is(count)] MFT_REGISTRATION_INFO *info, [in] DWORD count);
}
+[
+ object,
+ uuid(0e1d6009-c9f3-442d-8c51-a42d2d49452f),
+]
+interface IMFMediaSourceTopologyProvider : IUnknown
+{
+ HRESULT GetMediaSourceTopology([in] IMFPresentationDescriptor *pd, [out] IMFTopology **topology);
+}
+
cpp_quote("#define MF_RESOLUTION_MEDIASOURCE 0x00000001")
cpp_quote("#define MF_RESOLUTION_BYTESTREAM 0x00000002")
cpp_quote("#define MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE 0x00000010")
More information about the wine-cvs
mailing list