[PATCH 2/5] mf: Add stub implementation for standard quality manager.

Nikolay Sivov nsivov at codeweavers.com
Tue Sep 24 04:01:58 CDT 2019


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mf/mf.spec    |   2 +-
 dlls/mf/session.c  | 130 +++++++++++++++++++++++++++++++++++++++++++++
 dlls/mf/tests/mf.c |  12 +++++
 include/mfidl.idl  |  24 +++++++++
 4 files changed, 167 insertions(+), 1 deletion(-)

diff --git a/dlls/mf/mf.spec b/dlls/mf/mf.spec
index 6e64404ba6..f13a2451fb 100644
--- a/dlls/mf/mf.spec
+++ b/dlls/mf/mf.spec
@@ -58,7 +58,7 @@
 @ stub MFCreateSequencerSourceRemoteStream
 @ stub MFCreateSimpleTypeHandler
 @ stdcall MFCreateSourceResolver(ptr) mfplat.MFCreateSourceResolver
-@ stub MFCreateStandardQualityManager
+@ stdcall MFCreateStandardQualityManager(ptr)
 @ stdcall MFCreateTopoLoader(ptr)
 @ stdcall MFCreateTopology(ptr)
 @ stdcall MFCreateTopologyNode(long ptr)
diff --git a/dlls/mf/session.c b/dlls/mf/session.c
index 1276f2ec92..ecee112c3f 100644
--- a/dlls/mf/session.c
+++ b/dlls/mf/session.c
@@ -133,6 +133,12 @@ struct presentation_clock
     CRITICAL_SECTION cs;
 };
 
+struct quality_manager
+{
+    IMFQualityManager IMFQualityManager_iface;
+    LONG refcount;
+};
+
 static inline struct media_session *impl_from_IMFMediaSession(IMFMediaSession *iface)
 {
     return CONTAINING_RECORD(iface, struct media_session, IMFMediaSession_iface);
@@ -193,6 +199,11 @@ static struct sink_notification *impl_from_IUnknown(IUnknown *iface)
     return CONTAINING_RECORD(iface, struct sink_notification, IUnknown_iface);
 }
 
+static struct quality_manager *impl_from_IMFQualityManager(IMFQualityManager *iface)
+{
+    return CONTAINING_RECORD(iface, struct quality_manager, IMFQualityManager_iface);
+}
+
 static HRESULT WINAPI session_op_QueryInterface(IUnknown *iface, REFIID riid, void **obj)
 {
     if (IsEqualIID(riid, &IID_IUnknown))
@@ -1542,3 +1553,122 @@ HRESULT WINAPI MFCreatePresentationClock(IMFPresentationClock **clock)
 
     return S_OK;
 }
+
+static HRESULT WINAPI standard_quality_manager_QueryInterface(IMFQualityManager *iface, REFIID riid, void **out)
+{
+    TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), out);
+
+    if (IsEqualIID(riid, &IID_IMFQualityManager) ||
+            IsEqualIID(riid, &IID_IUnknown))
+    {
+        *out = iface;
+        IMFQualityManager_AddRef(iface);
+        return S_OK;
+    }
+
+    WARN("Unsupported %s.\n", debugstr_guid(riid));
+    *out = NULL;
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI standard_quality_manager_AddRef(IMFQualityManager *iface)
+{
+    struct quality_manager *manager = impl_from_IMFQualityManager(iface);
+    ULONG refcount = InterlockedIncrement(&manager->refcount);
+
+    TRACE("%p, refcount %u.\n", iface, refcount);
+
+    return refcount;
+}
+
+static ULONG WINAPI standard_quality_manager_Release(IMFQualityManager *iface)
+{
+    struct quality_manager *manager = impl_from_IMFQualityManager(iface);
+    ULONG refcount = InterlockedDecrement(&manager->refcount);
+
+    TRACE("%p, refcount %u.\n", iface, refcount);
+
+    if (!refcount)
+    {
+        heap_free(manager);
+    }
+
+    return refcount;
+}
+
+static HRESULT WINAPI standard_quality_manager_NotifyTopology(IMFQualityManager *iface, IMFTopology *topology)
+{
+    FIXME("%p, %p stub.\n", iface, topology);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI standard_quality_manager_NotifyPresentationClock(IMFQualityManager *iface,
+        IMFPresentationClock *clock)
+{
+    FIXME("%p, %p stub.\n", iface, clock);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI standard_quality_manager_NotifyProcessInput(IMFQualityManager *iface, IMFTopologyNode *node,
+        LONG input_index, IMFSample *sample)
+{
+    FIXME("%p, %p, %d, %p stub.\n", iface, node, input_index, sample);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI standard_quality_manager_NotifyProcessOutput(IMFQualityManager *iface, IMFTopologyNode *node,
+        LONG output_index, IMFSample *sample)
+{
+    FIXME("%p, %p, %d, %p stub.\n", iface, node, output_index, sample);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI standard_quality_manager_NotifyQualityEvent(IMFQualityManager *iface, IUnknown *object,
+        IMFMediaEvent *event)
+{
+    FIXME("%p, %p, %p stub.\n", iface, object, event);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI standard_quality_manager_Shutdown(IMFQualityManager *iface)
+{
+    FIXME("%p stub.\n", iface);
+
+    return E_NOTIMPL;
+}
+
+static IMFQualityManagerVtbl standard_quality_manager_vtbl =
+{
+    standard_quality_manager_QueryInterface,
+    standard_quality_manager_AddRef,
+    standard_quality_manager_Release,
+    standard_quality_manager_NotifyTopology,
+    standard_quality_manager_NotifyPresentationClock,
+    standard_quality_manager_NotifyProcessInput,
+    standard_quality_manager_NotifyProcessOutput,
+    standard_quality_manager_NotifyQualityEvent,
+    standard_quality_manager_Shutdown,
+};
+
+HRESULT WINAPI MFCreateStandardQualityManager(IMFQualityManager **manager)
+{
+    struct quality_manager *object;
+
+    TRACE("%p.\n", manager);
+
+    object = heap_alloc_zero(sizeof(*object));
+    if (!object)
+        return E_OUTOFMEMORY;
+
+    object->IMFQualityManager_iface.lpVtbl = &standard_quality_manager_vtbl;
+    object->refcount = 1;
+
+    *manager = &object->IMFQualityManager_iface;
+
+    return S_OK;
+}
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index 0a8a88d6c3..00dc2daed5 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -2398,6 +2398,17 @@ failed:
     CoUninitialize();
 }
 
+static void test_quality_manager(void)
+{
+    IMFQualityManager *manager;
+    HRESULT hr;
+
+    hr = MFCreateStandardQualityManager(&manager);
+    ok(hr == S_OK, "Failed to create quality manager, hr %#x.\n", hr);
+
+    IMFQualityManager_Release(manager);
+}
+
 START_TEST(mf)
 {
     test_topology();
@@ -2409,4 +2420,5 @@ START_TEST(mf)
     test_presentation_clock();
     test_sample_grabber();
     test_video_processor();
+    test_quality_manager();
 }
diff --git a/include/mfidl.idl b/include/mfidl.idl
index f40f16e480..ab6d0d9984 100644
--- a/include/mfidl.idl
+++ b/include/mfidl.idl
@@ -577,6 +577,7 @@ cpp_quote("HRESULT WINAPI MFCreateSampleGrabberSinkActivate(IMFMediaType *media_
 cpp_quote("        IMFSampleGrabberSinkCallback *callback, IMFActivate **activate);")
 cpp_quote("HRESULT WINAPI MFCreateSequencerSource(IUnknown *reserved, IMFSequencerSource **seq_source);" )
 cpp_quote("HRESULT WINAPI MFCreateSourceResolver(IMFSourceResolver **resolver);")
+cpp_quote("HRESULT WINAPI MFCreateStandardQualityManager(IMFQualityManager **manager);")
 cpp_quote("HRESULT WINAPI MFCreateStreamDescriptor(DWORD identifier, DWORD cMediaTypes,")
 cpp_quote("     IMFMediaType **types, IMFStreamDescriptor **descriptor);")
 cpp_quote("HRESULT WINAPI MFCreateSystemTimeSource(IMFPresentationTimeSource **time_source);")
@@ -738,6 +739,29 @@ interface IMFShutdown : IUnknown
     HRESULT GetShutdownStatus([out] MFSHUTDOWN_STATUS *status);
 }
 
+[
+    object,
+    uuid(8d009d86-5b9f-4115-b1fc-9f80d52ab8ab),
+    local
+]
+interface IMFQualityManager : IUnknown
+{
+    HRESULT NotifyTopology([in] IMFTopology *topology);
+    HRESULT NotifyPresentationClock([in] IMFPresentationClock *clock);
+    HRESULT NotifyProcessInput(
+        [in] IMFTopologyNode *node,
+        [in] LONG input_index,
+        [in] IMFSample *sample);
+    HRESULT NotifyProcessOutput(
+        [in] IMFTopologyNode *node,
+        [in] LONG output_index,
+        [in] IMFSample *sample);
+    HRESULT NotifyQualityEvent(
+        [in] IUnknown *object,
+        [in] IMFMediaEvent *event);
+    HRESULT Shutdown();
+}
+
 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")
-- 
2.23.0




More information about the wine-devel mailing list