[PATCH] mf: Move standard quality manager stub to a separate file.

Nikolay Sivov nsivov at codeweavers.com
Wed Jan 26 03:10:07 CST 2022


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mf/Makefile.in |   1 +
 dlls/mf/quality.c   | 311 ++++++++++++++++++++++++++++++++++++++++++++
 dlls/mf/session.c   | 283 ----------------------------------------
 3 files changed, 312 insertions(+), 283 deletions(-)
 create mode 100644 dlls/mf/quality.c

diff --git a/dlls/mf/Makefile.in b/dlls/mf/Makefile.in
index 77d85ad041b..36727d4d4e3 100644
--- a/dlls/mf/Makefile.in
+++ b/dlls/mf/Makefile.in
@@ -10,6 +10,7 @@ C_SRCS = \
 	copier.c \
 	evr.c \
 	main.c \
+	quality.c \
 	samplegrabber.c \
 	sar.c \
 	session.c \
diff --git a/dlls/mf/quality.c b/dlls/mf/quality.c
new file mode 100644
index 00000000000..6c71a5a71c6
--- /dev/null
+++ b/dlls/mf/quality.c
@@ -0,0 +1,311 @@
+/*
+ * Copyright 2022 Nikolay Sivov for CodeWeavers
+ *
+ * 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>
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "mf_private.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(mfplat);
+
+enum quality_manager_state
+{
+    QUALITY_MANAGER_READY = 0,
+    QUALITY_MANAGER_SHUT_DOWN,
+};
+
+struct quality_manager
+{
+    IMFQualityManager IMFQualityManager_iface;
+    IMFClockStateSink IMFClockStateSink_iface;
+    LONG refcount;
+
+    IMFTopology *topology;
+    IMFPresentationClock *clock;
+    unsigned int state;
+    CRITICAL_SECTION cs;
+};
+
+static struct quality_manager *impl_from_IMFQualityManager(IMFQualityManager *iface)
+{
+    return CONTAINING_RECORD(iface, struct quality_manager, IMFQualityManager_iface);
+}
+
+static struct quality_manager *impl_from_IMFClockStateSink(IMFClockStateSink *iface)
+{
+    return CONTAINING_RECORD(iface, struct quality_manager, IMFClockStateSink_iface);
+}
+
+static HRESULT WINAPI standard_quality_manager_QueryInterface(IMFQualityManager *iface, REFIID riid, void **out)
+{
+    struct quality_manager *manager = impl_from_IMFQualityManager(iface);
+
+    TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), out);
+
+    if (IsEqualIID(riid, &IID_IMFQualityManager) ||
+            IsEqualIID(riid, &IID_IUnknown))
+    {
+        *out = iface;
+    }
+    else if (IsEqualIID(riid, &IID_IMFClockStateSink))
+    {
+        *out = &manager->IMFClockStateSink_iface;
+    }
+    else
+    {
+        WARN("Unsupported %s.\n", debugstr_guid(riid));
+        *out = NULL;
+        return E_NOINTERFACE;
+    }
+
+    IUnknown_AddRef((IUnknown *)*out);
+    return S_OK;
+}
+
+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)
+    {
+        if (manager->clock)
+            IMFPresentationClock_Release(manager->clock);
+        if (manager->topology)
+            IMFTopology_Release(manager->topology);
+        DeleteCriticalSection(&manager->cs);
+        free(manager);
+    }
+
+    return refcount;
+}
+
+static void standard_quality_manager_set_topology(struct quality_manager *manager, IMFTopology *topology)
+{
+    if (manager->topology)
+        IMFTopology_Release(manager->topology);
+    manager->topology = topology;
+    if (manager->topology)
+        IMFTopology_AddRef(manager->topology);
+}
+
+static HRESULT WINAPI standard_quality_manager_NotifyTopology(IMFQualityManager *iface, IMFTopology *topology)
+{
+    struct quality_manager *manager = impl_from_IMFQualityManager(iface);
+    HRESULT hr = S_OK;
+
+    TRACE("%p, %p.\n", iface, topology);
+
+    EnterCriticalSection(&manager->cs);
+    if (manager->state == QUALITY_MANAGER_SHUT_DOWN)
+        hr = MF_E_SHUTDOWN;
+    else
+    {
+        standard_quality_manager_set_topology(manager, topology);
+    }
+    LeaveCriticalSection(&manager->cs);
+
+    return hr;
+}
+
+static void standard_quality_manager_release_clock(struct quality_manager *manager)
+{
+    if (manager->clock)
+    {
+        IMFPresentationClock_RemoveClockStateSink(manager->clock, &manager->IMFClockStateSink_iface);
+        IMFPresentationClock_Release(manager->clock);
+    }
+    manager->clock = NULL;
+}
+
+static HRESULT WINAPI standard_quality_manager_NotifyPresentationClock(IMFQualityManager *iface,
+        IMFPresentationClock *clock)
+{
+    struct quality_manager *manager = impl_from_IMFQualityManager(iface);
+    HRESULT hr = S_OK;
+
+    TRACE("%p, %p.\n", iface, clock);
+
+    EnterCriticalSection(&manager->cs);
+    if (manager->state == QUALITY_MANAGER_SHUT_DOWN)
+        hr = MF_E_SHUTDOWN;
+    else if (!clock)
+        hr = E_POINTER;
+    else
+    {
+        standard_quality_manager_release_clock(manager);
+        manager->clock = clock;
+        IMFPresentationClock_AddRef(manager->clock);
+        if (FAILED(IMFPresentationClock_AddClockStateSink(manager->clock, &manager->IMFClockStateSink_iface)))
+            WARN("Failed to set state sink.\n");
+    }
+    LeaveCriticalSection(&manager->cs);
+
+    return hr;
+}
+
+static HRESULT WINAPI standard_quality_manager_NotifyProcessInput(IMFQualityManager *iface, IMFTopologyNode *node,
+        LONG input_index, IMFSample *sample)
+{
+    TRACE("%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)
+{
+    TRACE("%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)
+{
+    struct quality_manager *manager = impl_from_IMFQualityManager(iface);
+
+    TRACE("%p.\n", iface);
+
+    EnterCriticalSection(&manager->cs);
+    if (manager->state != QUALITY_MANAGER_SHUT_DOWN)
+    {
+        standard_quality_manager_release_clock(manager);
+        standard_quality_manager_set_topology(manager, NULL);
+        manager->state = QUALITY_MANAGER_SHUT_DOWN;
+    }
+    LeaveCriticalSection(&manager->cs);
+
+    return S_OK;
+}
+
+static const 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,
+};
+
+static HRESULT WINAPI standard_quality_manager_sink_QueryInterface(IMFClockStateSink *iface,
+        REFIID riid, void **obj)
+{
+    struct quality_manager *manager = impl_from_IMFClockStateSink(iface);
+    return IMFQualityManager_QueryInterface(&manager->IMFQualityManager_iface, riid, obj);
+}
+
+static ULONG WINAPI standard_quality_manager_sink_AddRef(IMFClockStateSink *iface)
+{
+    struct quality_manager *manager = impl_from_IMFClockStateSink(iface);
+    return IMFQualityManager_AddRef(&manager->IMFQualityManager_iface);
+}
+
+static ULONG WINAPI standard_quality_manager_sink_Release(IMFClockStateSink *iface)
+{
+    struct quality_manager *manager = impl_from_IMFClockStateSink(iface);
+    return IMFQualityManager_Release(&manager->IMFQualityManager_iface);
+}
+
+static HRESULT WINAPI standard_quality_manager_sink_OnClockStart(IMFClockStateSink *iface,
+        MFTIME systime, LONGLONG offset)
+{
+    return S_OK;
+}
+
+static HRESULT WINAPI standard_quality_manager_sink_OnClockStop(IMFClockStateSink *iface,
+        MFTIME systime)
+{
+    return S_OK;
+}
+
+static HRESULT WINAPI standard_quality_manager_sink_OnClockPause(IMFClockStateSink *iface,
+        MFTIME systime)
+{
+    return S_OK;
+}
+
+static HRESULT WINAPI standard_quality_manager_sink_OnClockRestart(IMFClockStateSink *iface,
+        MFTIME systime)
+{
+    return S_OK;
+}
+
+static HRESULT WINAPI standard_quality_manager_sink_OnClockSetRate(IMFClockStateSink *iface,
+        MFTIME systime, float rate)
+{
+    return S_OK;
+}
+
+static const IMFClockStateSinkVtbl standard_quality_manager_sink_vtbl =
+{
+    standard_quality_manager_sink_QueryInterface,
+    standard_quality_manager_sink_AddRef,
+    standard_quality_manager_sink_Release,
+    standard_quality_manager_sink_OnClockStart,
+    standard_quality_manager_sink_OnClockStop,
+    standard_quality_manager_sink_OnClockPause,
+    standard_quality_manager_sink_OnClockRestart,
+    standard_quality_manager_sink_OnClockSetRate,
+};
+
+HRESULT WINAPI MFCreateStandardQualityManager(IMFQualityManager **manager)
+{
+    struct quality_manager *object;
+
+    TRACE("%p.\n", manager);
+
+    if (!(object = calloc(1, sizeof(*object))))
+        return E_OUTOFMEMORY;
+
+    object->IMFQualityManager_iface.lpVtbl = &standard_quality_manager_vtbl;
+    object->IMFClockStateSink_iface.lpVtbl = &standard_quality_manager_sink_vtbl;
+    object->refcount = 1;
+    InitializeCriticalSection(&object->cs);
+
+    *manager = &object->IMFQualityManager_iface;
+
+    return S_OK;
+}
diff --git a/dlls/mf/session.c b/dlls/mf/session.c
index c8ec1b5c33f..c365495ee48 100644
--- a/dlls/mf/session.c
+++ b/dlls/mf/session.c
@@ -254,24 +254,6 @@ struct media_session
     CRITICAL_SECTION cs;
 };
 
-enum quality_manager_state
-{
-    QUALITY_MANAGER_READY = 0,
-    QUALITY_MANAGER_SHUT_DOWN,
-};
-
-struct quality_manager
-{
-    IMFQualityManager IMFQualityManager_iface;
-    IMFClockStateSink IMFClockStateSink_iface;
-    LONG refcount;
-
-    IMFTopology *topology;
-    IMFPresentationClock *clock;
-    unsigned int state;
-    CRITICAL_SECTION cs;
-};
-
 static inline struct media_session *impl_from_IMFMediaSession(IMFMediaSession *iface)
 {
     return CONTAINING_RECORD(iface, struct media_session, IMFMediaSession_iface);
@@ -317,16 +299,6 @@ static struct session_op *impl_op_from_IUnknown(IUnknown *iface)
     return CONTAINING_RECORD(iface, struct session_op, IUnknown_iface);
 }
 
-static struct quality_manager *impl_from_IMFQualityManager(IMFQualityManager *iface)
-{
-    return CONTAINING_RECORD(iface, struct quality_manager, IMFQualityManager_iface);
-}
-
-static struct quality_manager *impl_from_qm_IMFClockStateSink(IMFClockStateSink *iface)
-{
-    return CONTAINING_RECORD(iface, struct quality_manager, IMFClockStateSink_iface);
-}
-
 static struct topo_node *impl_node_from_IMFVideoSampleAllocatorNotify(IMFVideoSampleAllocatorNotify *iface)
 {
     return CONTAINING_RECORD(iface, struct topo_node, u.sink.notify_cb);
@@ -3856,258 +3828,3 @@ failed:
     IMFMediaSession_Release(&object->IMFMediaSession_iface);
     return hr;
 }
-
-static HRESULT WINAPI standard_quality_manager_QueryInterface(IMFQualityManager *iface, REFIID riid, void **out)
-{
-    struct quality_manager *manager = impl_from_IMFQualityManager(iface);
-
-    TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), out);
-
-    if (IsEqualIID(riid, &IID_IMFQualityManager) ||
-            IsEqualIID(riid, &IID_IUnknown))
-    {
-        *out = iface;
-    }
-    else if (IsEqualIID(riid, &IID_IMFClockStateSink))
-    {
-        *out = &manager->IMFClockStateSink_iface;
-    }
-    else
-    {
-        WARN("Unsupported %s.\n", debugstr_guid(riid));
-        *out = NULL;
-        return E_NOINTERFACE;
-    }
-
-    IUnknown_AddRef((IUnknown *)*out);
-    return S_OK;
-}
-
-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)
-    {
-        if (manager->clock)
-            IMFPresentationClock_Release(manager->clock);
-        if (manager->topology)
-            IMFTopology_Release(manager->topology);
-        DeleteCriticalSection(&manager->cs);
-        free(manager);
-    }
-
-    return refcount;
-}
-
-static void standard_quality_manager_set_topology(struct quality_manager *manager, IMFTopology *topology)
-{
-    if (manager->topology)
-        IMFTopology_Release(manager->topology);
-    manager->topology = topology;
-    if (manager->topology)
-        IMFTopology_AddRef(manager->topology);
-}
-
-static HRESULT WINAPI standard_quality_manager_NotifyTopology(IMFQualityManager *iface, IMFTopology *topology)
-{
-    struct quality_manager *manager = impl_from_IMFQualityManager(iface);
-    HRESULT hr = S_OK;
-
-    TRACE("%p, %p.\n", iface, topology);
-
-    EnterCriticalSection(&manager->cs);
-    if (manager->state == QUALITY_MANAGER_SHUT_DOWN)
-        hr = MF_E_SHUTDOWN;
-    else
-    {
-        standard_quality_manager_set_topology(manager, topology);
-    }
-    LeaveCriticalSection(&manager->cs);
-
-    return hr;
-}
-
-static void standard_quality_manager_release_clock(struct quality_manager *manager)
-{
-    if (manager->clock)
-    {
-        IMFPresentationClock_RemoveClockStateSink(manager->clock, &manager->IMFClockStateSink_iface);
-        IMFPresentationClock_Release(manager->clock);
-    }
-    manager->clock = NULL;
-}
-
-static HRESULT WINAPI standard_quality_manager_NotifyPresentationClock(IMFQualityManager *iface,
-        IMFPresentationClock *clock)
-{
-    struct quality_manager *manager = impl_from_IMFQualityManager(iface);
-    HRESULT hr = S_OK;
-
-    TRACE("%p, %p.\n", iface, clock);
-
-    EnterCriticalSection(&manager->cs);
-    if (manager->state == QUALITY_MANAGER_SHUT_DOWN)
-        hr = MF_E_SHUTDOWN;
-    else if (!clock)
-        hr = E_POINTER;
-    else
-    {
-        standard_quality_manager_release_clock(manager);
-        manager->clock = clock;
-        IMFPresentationClock_AddRef(manager->clock);
-        if (FAILED(IMFPresentationClock_AddClockStateSink(manager->clock, &manager->IMFClockStateSink_iface)))
-            WARN("Failed to set state sink.\n");
-    }
-    LeaveCriticalSection(&manager->cs);
-
-    return hr;
-}
-
-static HRESULT WINAPI standard_quality_manager_NotifyProcessInput(IMFQualityManager *iface, IMFTopologyNode *node,
-        LONG input_index, IMFSample *sample)
-{
-    TRACE("%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)
-{
-    TRACE("%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)
-{
-    struct quality_manager *manager = impl_from_IMFQualityManager(iface);
-
-    TRACE("%p.\n", iface);
-
-    EnterCriticalSection(&manager->cs);
-    if (manager->state != QUALITY_MANAGER_SHUT_DOWN)
-    {
-        standard_quality_manager_release_clock(manager);
-        standard_quality_manager_set_topology(manager, NULL);
-        manager->state = QUALITY_MANAGER_SHUT_DOWN;
-    }
-    LeaveCriticalSection(&manager->cs);
-
-    return S_OK;
-}
-
-static const 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,
-};
-
-static HRESULT WINAPI standard_quality_manager_sink_QueryInterface(IMFClockStateSink *iface,
-        REFIID riid, void **obj)
-{
-    struct quality_manager *manager = impl_from_qm_IMFClockStateSink(iface);
-    return IMFQualityManager_QueryInterface(&manager->IMFQualityManager_iface, riid, obj);
-}
-
-static ULONG WINAPI standard_quality_manager_sink_AddRef(IMFClockStateSink *iface)
-{
-    struct quality_manager *manager = impl_from_qm_IMFClockStateSink(iface);
-    return IMFQualityManager_AddRef(&manager->IMFQualityManager_iface);
-}
-
-static ULONG WINAPI standard_quality_manager_sink_Release(IMFClockStateSink *iface)
-{
-    struct quality_manager *manager = impl_from_qm_IMFClockStateSink(iface);
-    return IMFQualityManager_Release(&manager->IMFQualityManager_iface);
-}
-
-static HRESULT WINAPI standard_quality_manager_sink_OnClockStart(IMFClockStateSink *iface,
-        MFTIME systime, LONGLONG offset)
-{
-    return S_OK;
-}
-
-static HRESULT WINAPI standard_quality_manager_sink_OnClockStop(IMFClockStateSink *iface,
-        MFTIME systime)
-{
-    return S_OK;
-}
-
-static HRESULT WINAPI standard_quality_manager_sink_OnClockPause(IMFClockStateSink *iface,
-        MFTIME systime)
-{
-    return S_OK;
-}
-
-static HRESULT WINAPI standard_quality_manager_sink_OnClockRestart(IMFClockStateSink *iface,
-        MFTIME systime)
-{
-    return S_OK;
-}
-
-static HRESULT WINAPI standard_quality_manager_sink_OnClockSetRate(IMFClockStateSink *iface,
-        MFTIME systime, float rate)
-{
-    return S_OK;
-}
-
-static const IMFClockStateSinkVtbl standard_quality_manager_sink_vtbl =
-{
-    standard_quality_manager_sink_QueryInterface,
-    standard_quality_manager_sink_AddRef,
-    standard_quality_manager_sink_Release,
-    standard_quality_manager_sink_OnClockStart,
-    standard_quality_manager_sink_OnClockStop,
-    standard_quality_manager_sink_OnClockPause,
-    standard_quality_manager_sink_OnClockRestart,
-    standard_quality_manager_sink_OnClockSetRate,
-};
-
-HRESULT WINAPI MFCreateStandardQualityManager(IMFQualityManager **manager)
-{
-    struct quality_manager *object;
-
-    TRACE("%p.\n", manager);
-
-    if (!(object = calloc(1, sizeof(*object))))
-        return E_OUTOFMEMORY;
-
-    object->IMFQualityManager_iface.lpVtbl = &standard_quality_manager_vtbl;
-    object->IMFClockStateSink_iface.lpVtbl = &standard_quality_manager_sink_vtbl;
-    object->refcount = 1;
-    InitializeCriticalSection(&object->cs);
-
-    *manager = &object->IMFQualityManager_iface;
-
-    return S_OK;
-}
-- 
2.34.1




More information about the wine-devel mailing list