Rémi Bernon : qasf: Implement ASF Reader filter IWMReaderCallback_OnSample.

Alexandre Julliard julliard at winehq.org
Tue Aug 16 16:02:12 CDT 2022


Module: wine
Branch: master
Commit: fa41879fb08c445a85a9f7d06c9fc1b2d5ea1979
URL:    https://gitlab.winehq.org/wine/wine/-/commit/fa41879fb08c445a85a9f7d06c9fc1b2d5ea1979

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Tue May 24 09:38:01 2022 +0200

qasf: Implement ASF Reader filter IWMReaderCallback_OnSample.

---

 dlls/qasf/asfreader.c | 36 ++++++++++++++++++++++++++++++++++--
 1 file changed, 34 insertions(+), 2 deletions(-)

diff --git a/dlls/qasf/asfreader.c b/dlls/qasf/asfreader.c
index 0fdf4a23e12..29a695de77f 100644
--- a/dlls/qasf/asfreader.c
+++ b/dlls/qasf/asfreader.c
@@ -150,6 +150,12 @@ static HRESULT buffer_create(IMediaSample *sample, INSSBuffer **out)
     return S_OK;
 }
 
+static struct buffer *unsafe_impl_from_INSSBuffer(INSSBuffer *iface)
+{
+    if (iface->lpVtbl != &buffer_vtbl) return NULL;
+    return impl_from_INSSBuffer(iface);
+}
+
 struct asf_stream
 {
     struct strmbase_source source;
@@ -746,9 +752,35 @@ static HRESULT WINAPI reader_callback_OnStatus(IWMReaderCallback *iface, WMT_STA
 static HRESULT WINAPI reader_callback_OnSample(IWMReaderCallback *iface, DWORD output, QWORD time,
         QWORD duration, DWORD flags, INSSBuffer *sample, void *context)
 {
-    FIXME("iface %p, output %lu, time %I64u, duration %I64u, flags %#lx, sample %p, context %p stub!\n",
+    struct asf_reader *filter = impl_from_IWMReaderCallback(iface)->filter;
+    REFERENCE_TIME start_time = time, end_time = time + duration;
+    struct asf_stream *stream = filter->streams + output;
+    struct buffer *buffer;
+    HRESULT hr = S_OK;
+
+    TRACE("iface %p, output %lu, time %I64u, duration %I64u, flags %#lx, sample %p, context %p.\n",
             iface, output, time, duration, flags, sample, context);
-    return E_NOTIMPL;
+
+    if (!stream->source.pin.peer)
+    {
+        WARN("Output %lu pin is not connected, discarding %p.\n", output, sample);
+        return S_OK;
+    }
+
+    if (!(buffer = unsafe_impl_from_INSSBuffer(sample)))
+        WARN("Unexpected buffer iface %p, discarding.\n", sample);
+    else
+    {
+        IMediaSample_SetTime(buffer->sample, &start_time, &end_time);
+        IMediaSample_SetDiscontinuity(buffer->sample, !!(flags & WM_SF_DISCONTINUITY));
+        IMediaSample_SetSyncPoint(buffer->sample, !!(flags & WM_SF_CLEANPOINT));
+
+        hr = IMemInputPin_Receive(stream->source.pMemInputPin, buffer->sample);
+
+        TRACE("Receive returned hr %#lx.\n", hr);
+    }
+
+    return hr;
 }
 
 static const IWMReaderCallbackVtbl reader_callback_vtbl =




More information about the wine-cvs mailing list