[PATCH 6/6] winegstreamer: Seek to the beginning of the range in wm_reader_set_output_props().

Zebediah Figura zfigura at codeweavers.com
Sun Oct 31 19:03:37 CDT 2021


Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/winegstreamer/gst_private.h |  2 ++
 dlls/winegstreamer/wm_reader.c   | 18 ++++++++++++++++++
 2 files changed, 20 insertions(+)

diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
index d330716b8f9..109ce6ab28f 100644
--- a/dlls/winegstreamer/gst_private.h
+++ b/dlls/winegstreamer/gst_private.h
@@ -136,6 +136,8 @@ struct wm_reader
     LONG refcount;
     CRITICAL_SECTION cs;
 
+    QWORD start_time;
+
     IStream *source_stream;
     HANDLE read_thread;
     bool read_thread_shutdown;
diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c
index 24fd11f652d..82f74318062 100644
--- a/dlls/winegstreamer/wm_reader.c
+++ b/dlls/winegstreamer/wm_reader.c
@@ -1543,6 +1543,22 @@ HRESULT wm_reader_set_output_props(struct wm_reader *reader, DWORD output,
     stream->format = format;
     wg_parser_stream_enable(stream->wg_stream, &format);
 
+    /* Re-decode any buffers that might have been generated with the old format.
+     *
+     * FIXME: Seeking in-place will cause some buffers to be dropped.
+     * Unfortunately, we can't really store the last received PTS and seek there
+     * either: since seeks are inexact and we aren't guaranteed to receive
+     * samples in order, some buffers might be duplicated or dropped anyway.
+     * In order to really seamlessly allow for format changes, we need
+     * cooperation from each individual GStreamer stream, to be able to tell
+     * upstream exactly which buffers they need resent...
+     *
+     * In all likelihood this function is being called not mid-stream but rather
+     * while setting the stream up, before consuming any events. Accordingly
+     * let's just seek back to the beginning. */
+    wg_parser_stream_seek(reader->streams[0].wg_stream, 1.0, reader->start_time, 0,
+            AM_SEEKING_AbsolutePositioning, AM_SEEKING_NoPositioning);
+
     LeaveCriticalSection(&reader->cs);
     return S_OK;
 }
@@ -1643,6 +1659,8 @@ void wm_reader_seek(struct wm_reader *reader, QWORD start, LONGLONG duration)
 
     EnterCriticalSection(&reader->cs);
 
+    reader->start_time = start;
+
     wg_parser_stream_seek(reader->streams[0].wg_stream, 1.0, start, start + duration,
             AM_SEEKING_AbsolutePositioning, duration ? AM_SEEKING_AbsolutePositioning : AM_SEEKING_NoPositioning);
 
-- 
2.33.0




More information about the wine-devel mailing list