Nikolay Sivov : mf: Subscribe standard quality manager to clock state change events.
Alexandre Julliard
julliard at winehq.org
Mon Feb 1 16:13:08 CST 2021
Module: wine
Branch: master
Commit: 144dcc1a26f3c2689c80d261ade7c3d036104dde
URL: https://source.winehq.org/git/wine.git/?a=commit;h=144dcc1a26f3c2689c80d261ade7c3d036104dde
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Mon Feb 1 13:22:07 2021 +0300
mf: Subscribe standard quality manager to clock state change events.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mf/session.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++---
dlls/mf/tests/mf.c | 3 --
2 files changed, 87 insertions(+), 8 deletions(-)
diff --git a/dlls/mf/session.c b/dlls/mf/session.c
index af58a47ed7a..36e0c901d80 100644
--- a/dlls/mf/session.c
+++ b/dlls/mf/session.c
@@ -328,6 +328,7 @@ enum quality_manager_state
struct quality_manager
{
IMFQualityManager IMFQualityManager_iface;
+ IMFClockStateSink IMFClockStateSink_iface;
LONG refcount;
IMFPresentationClock *clock;
@@ -425,6 +426,11 @@ static struct quality_manager *impl_from_IMFQualityManager(IMFQualityManager *if
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);
@@ -4751,19 +4757,28 @@ HRESULT WINAPI MFCreatePresentationClock(IMFPresentationClock **clock)
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;
- IMFQualityManager_AddRef(iface);
- return S_OK;
+ }
+ else if (IsEqualIID(riid, &IID_IMFClockStateSink))
+ {
+ *out = &manager->IMFClockStateSink_iface;
+ }
+ else
+ {
+ WARN("Unsupported %s.\n", debugstr_guid(riid));
+ *out = NULL;
+ return E_NOINTERFACE;
}
- 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)
@@ -4804,7 +4819,10 @@ static HRESULT WINAPI standard_quality_manager_NotifyTopology(IMFQualityManager
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;
}
@@ -4826,6 +4844,8 @@ static HRESULT WINAPI standard_quality_manager_NotifyPresentationClock(IMFQualit
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);
@@ -4886,6 +4906,67 @@ static IMFQualityManagerVtbl standard_quality_manager_vtbl =
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;
@@ -4897,6 +4978,7 @@ HRESULT WINAPI MFCreateStandardQualityManager(IMFQualityManager **manager)
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);
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index aad1564c3f0..ba313adc15c 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -3661,7 +3661,6 @@ static void test_quality_manager(void)
ok(hr == S_OK, "Failed to create quality manager, hr %#x.\n", hr);
check_interface(manager, &IID_IMFQualityManager, TRUE);
-todo_wine
check_interface(manager, &IID_IMFClockStateSink, TRUE);
hr = IMFQualityManager_NotifyPresentationClock(manager, NULL);
@@ -3673,7 +3672,6 @@ todo_wine
hr = IMFQualityManager_NotifyPresentationClock(manager, clock);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
EXPECT_REF(clock, 2);
-todo_wine
EXPECT_REF(manager, 2);
hr = IMFQualityManager_Shutdown(manager);
@@ -3701,7 +3699,6 @@ todo_wine
EXPECT_REF(clock, 2);
IMFQualityManager_Release(manager);
-todo_wine
EXPECT_REF(clock, 2);
IMFPresentationClock_Release(clock);
More information about the wine-cvs
mailing list