Nikolay Sivov : mf: Implement ProcessSample() for unclocked mode.

Alexandre Julliard julliard at winehq.org
Thu May 30 16:27:13 CDT 2019


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu May 30 14:46:15 2019 +0300

mf: Implement ProcessSample() for unclocked mode.

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

---

 dlls/mf/samplegrabber.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 69 insertions(+), 2 deletions(-)

diff --git a/dlls/mf/samplegrabber.c b/dlls/mf/samplegrabber.c
index e2766c0..d19496d 100644
--- a/dlls/mf/samplegrabber.c
+++ b/dlls/mf/samplegrabber.c
@@ -58,6 +58,7 @@ struct sample_grabber
     IMFMediaEventQueue *event_queue;
     IMFPresentationClock *clock;
     enum sink_state state;
+    UINT32 ignore_clock;
     CRITICAL_SECTION cs;
 };
 
@@ -245,11 +246,76 @@ static HRESULT WINAPI sample_grabber_stream_GetMediaTypeHandler(IMFStreamSink *i
     return S_OK;
 }
 
+static HRESULT sample_grabber_report_sample(struct sample_grabber *grabber, IMFSample *sample)
+{
+    LONGLONG sample_time, sample_duration = 0;
+    IMFMediaBuffer *buffer;
+    DWORD flags, size;
+    GUID major_type;
+    BYTE *data;
+    HRESULT hr;
+
+    hr = IMFMediaType_GetMajorType(grabber->media_type, &major_type);
+
+    if (SUCCEEDED(hr))
+        hr = IMFSample_GetSampleTime(sample, &sample_time);
+
+    if (FAILED(IMFSample_GetSampleDuration(sample, &sample_duration)))
+        sample_duration = 0;
+
+    if (SUCCEEDED(hr))
+        hr = IMFSample_GetSampleFlags(sample, &flags);
+
+    if (SUCCEEDED(hr))
+    {
+        if (FAILED(IMFSample_ConvertToContiguousBuffer(sample, &buffer)))
+            return E_UNEXPECTED;
+
+        if (SUCCEEDED(hr = IMFMediaBuffer_Lock(buffer, &data, NULL, &size)))
+        {
+            hr = IMFSampleGrabberSinkCallback_OnProcessSample(grabber->callback, &major_type, flags, sample_time,
+                        sample_duration, data, size);
+            IMFMediaBuffer_Unlock(buffer);
+        }
+
+        IMFMediaBuffer_Release(buffer);
+    }
+
+    return hr;
+}
+
 static HRESULT WINAPI sample_grabber_stream_ProcessSample(IMFStreamSink *iface, IMFSample *sample)
 {
-    FIXME("%p, %p.\n", iface, sample);
+    struct sample_grabber_stream *stream = impl_from_IMFStreamSink(iface);
+    LONGLONG sampletime;
+    HRESULT hr = S_OK;
 
-    return E_NOTIMPL;
+    TRACE("%p, %p.\n", iface, sample);
+
+    if (!sample)
+        return S_OK;
+
+    if (!stream->sink)
+        return MF_E_STREAMSINK_REMOVED;
+
+    EnterCriticalSection(&stream->sink->cs);
+
+    if (stream->sink->state == SINK_STATE_RUNNING)
+    {
+        hr = IMFSample_GetSampleTime(sample, &sampletime);
+
+        if (SUCCEEDED(hr))
+        {
+            if (stream->sink->ignore_clock)
+                hr = sample_grabber_report_sample(stream->sink, sample);
+            else
+                FIXME("Sample scheduling is not implemented.\n");
+        }
+    }
+
+    LeaveCriticalSection(&stream->sink->cs);
+
+    return hr;
 }
 
 static HRESULT WINAPI sample_grabber_stream_PlaceMarker(IMFStreamSink *iface, MFSTREAMSINK_MARKER_TYPE marker_type,
@@ -905,6 +971,7 @@ static HRESULT sample_grabber_create_object(IMFAttributes *attributes, void *use
     IMFSampleGrabberSinkCallback_AddRef(object->callback);
     object->media_type = context->media_type;
     IMFMediaType_AddRef(object->media_type);
+    IMFAttributes_GetUINT32(attributes, &MF_SAMPLEGRABBERSINK_IGNORE_CLOCK, &object->ignore_clock);
     InitializeCriticalSection(&object->cs);
 
     if (FAILED(hr = sample_grabber_create_stream(object, &object->stream)))




More information about the wine-cvs mailing list