Nikolay Sivov : mf: Implement presentation clock methods for sample grabber.

Alexandre Julliard julliard at winehq.org
Tue May 28 15:06:51 CDT 2019


Module: wine
Branch: master
Commit: 2407a0f53b0e4805406fae0bd578c06fef4d9f02
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=2407a0f53b0e4805406fae0bd578c06fef4d9f02

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue May 28 15:08:28 2019 +0300

mf: Implement presentation clock methods for sample grabber.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mf/samplegrabber.c | 51 +++++++++++++++++++++++++++++++++++++++++++++----
 dlls/mf/tests/mf.c      | 18 +++++++++++------
 2 files changed, 59 insertions(+), 10 deletions(-)

diff --git a/dlls/mf/samplegrabber.c b/dlls/mf/samplegrabber.c
index 86dcb13..755d80f 100644
--- a/dlls/mf/samplegrabber.c
+++ b/dlls/mf/samplegrabber.c
@@ -50,6 +50,7 @@ struct sample_grabber
     BOOL is_shut_down;
     IMFStreamSink *stream;
     IMFMediaEventQueue *event_queue;
+    IMFPresentationClock *clock;
     CRITICAL_SECTION cs;
 };
 
@@ -430,6 +431,8 @@ static ULONG WINAPI sample_grabber_sink_Release(IMFMediaSink *iface)
             IMFMediaEventQueue_Shutdown(grabber->event_queue);
             IMFMediaEventQueue_Release(grabber->event_queue);
         }
+        if (grabber->clock)
+            IMFPresentationClock_Release(grabber->clock);
         DeleteCriticalSection(&grabber->cs);
         heap_free(grabber);
     }
@@ -539,16 +542,56 @@ static HRESULT WINAPI sample_grabber_sink_GetStreamSinkById(IMFMediaSink *iface,
 
 static HRESULT WINAPI sample_grabber_sink_SetPresentationClock(IMFMediaSink *iface, IMFPresentationClock *clock)
 {
-    FIXME("%p, %p.\n", iface, clock);
+    struct sample_grabber *grabber = impl_from_IMFMediaSink(iface);
+    HRESULT hr;
 
-    return E_NOTIMPL;
+    TRACE("%p, %p.\n", iface, clock);
+
+    EnterCriticalSection(&grabber->cs);
+
+    if (SUCCEEDED(hr = IMFSampleGrabberSinkCallback_OnSetPresentationClock(grabber->callback, clock)))
+    {
+        if (grabber->clock)
+        {
+            IMFPresentationClock_RemoveClockStateSink(grabber->clock, &grabber->IMFClockStateSink_iface);
+            IMFPresentationClock_Release(grabber->clock);
+        }
+        grabber->clock = clock;
+        if (grabber->clock)
+        {
+            IMFPresentationClock_AddRef(grabber->clock);
+            IMFPresentationClock_AddClockStateSink(grabber->clock, &grabber->IMFClockStateSink_iface);
+        }
+    }
+
+    LeaveCriticalSection(&grabber->cs);
+
+    return hr;
 }
 
 static HRESULT WINAPI sample_grabber_sink_GetPresentationClock(IMFMediaSink *iface, IMFPresentationClock **clock)
 {
-    FIXME("%p, %p.\n", iface, clock);
+    struct sample_grabber *grabber = impl_from_IMFMediaSink(iface);
+    HRESULT hr = S_OK;
 
-    return E_NOTIMPL;
+    TRACE("%p, %p.\n", iface, clock);
+
+    if (!clock)
+        return E_POINTER;
+
+    EnterCriticalSection(&grabber->cs);
+
+    if (grabber->clock)
+    {
+        *clock = grabber->clock;
+        IMFPresentationClock_AddRef(*clock);
+    }
+    else
+        hr = MF_E_NO_CLOCK;
+
+    LeaveCriticalSection(&grabber->cs);
+
+    return hr;
 }
 
 static HRESULT WINAPI sample_grabber_sink_Shutdown(IMFMediaSink *iface)
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index b381daf..2285eb8 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -1605,7 +1605,7 @@ static HRESULT WINAPI grabber_callback_OnClockSetRate(IMFSampleGrabberSinkCallba
 static HRESULT WINAPI grabber_callback_OnSetPresentationClock(IMFSampleGrabberSinkCallback *iface,
         IMFPresentationClock *clock)
 {
-    return E_NOTIMPL;
+    return S_OK;
 }
 
 static HRESULT WINAPI grabber_callback_OnProcessSample(IMFSampleGrabberSinkCallback *iface, REFGUID major_type,
@@ -1641,9 +1641,9 @@ static void test_sample_grabber(void)
     IMFMediaType *media_type, *media_type2, *media_type3;
     IMFMediaTypeHandler *handler, *handler2;
     IMFPresentationTimeSource *time_source;
+    IMFPresentationClock *clock, *clock2;
     IMFStreamSink *stream, *stream2;
     IMFClockStateSink *clocksink;
-    IMFPresentationClock *clock;
     IMFMediaEventGenerator *eg;
     IMFMediaSink *sink, *sink2;
     DWORD flags, count, id;
@@ -1742,8 +1742,17 @@ static void test_sample_grabber(void)
     hr = MFCreatePresentationClock(&clock);
     ok(hr == S_OK, "Failed to create clock object, hr %#x.\n", hr);
 
+    hr = IMFMediaSink_GetPresentationClock(sink, NULL);
+    ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFMediaSink_GetPresentationClock(sink, &clock2);
+    ok(hr == MF_E_NO_CLOCK, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFMediaSink_SetPresentationClock(sink, NULL);
+    ok(hr == S_OK, "Failed to set presentation clock, hr %#x.\n", hr);
+
     hr = IMFMediaSink_SetPresentationClock(sink, clock);
-    ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
+    ok(hr == S_OK, "Failed to set presentation clock, hr %#x.\n", hr);
 
     hr = MFCreateSystemTimeSource(&time_source);
     ok(hr == S_OK, "Failed to create time source, hr %#x.\n", hr);
@@ -1752,9 +1761,6 @@ static void test_sample_grabber(void)
     ok(hr == S_OK, "Failed to set time source, hr %#x.\n", hr);
     IMFPresentationTimeSource_Release(time_source);
 
-    hr = IMFMediaSink_SetPresentationClock(sink, clock);
-    ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
-
     IMFPresentationClock_Release(clock);
 
     hr = IMFActivate_ShutdownObject(activate);




More information about the wine-cvs mailing list