Zebediah Figura : winegstreamer: Manually send new segment events.
Alexandre Julliard
julliard at winehq.org
Tue Feb 22 16:06:49 CST 2022
Module: wine
Branch: master
Commit: f7a5bf7be1b43ff295723c15c296c94321e3a653
URL: https://source.winehq.org/git/wine.git/?a=commit;h=f7a5bf7be1b43ff295723c15c296c94321e3a653
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Mon Feb 21 23:13:20 2022 -0600
winegstreamer: Manually send new segment events.
Instead of translating them from GST_EVENT_SEGMENT.
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/winegstreamer/quartz_parser.c | 20 ++++++++++++++++++--
1 file changed, 18 insertions(+), 2 deletions(-)
diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c
index e06c55ccfe0..eab94aca004 100644
--- a/dlls/winegstreamer/quartz_parser.c
+++ b/dlls/winegstreamer/quartz_parser.c
@@ -75,6 +75,12 @@ struct parser_source
CRITICAL_SECTION flushing_cs;
HANDLE thread;
+
+ /* This variable is read and written by both the streaming thread and
+ * application threads. However, it is only written by the application
+ * thread when the streaming thread is not running, or when it is blocked
+ * by flushing_cs. */
+ bool need_segment;
};
static inline struct parser *impl_from_strmbase_filter(struct strmbase_filter *iface)
@@ -750,6 +756,14 @@ static void send_buffer(struct parser_source *pin, const struct wg_parser_event
HRESULT hr;
IMediaSample *sample;
+ if (pin->need_segment)
+ {
+ if (FAILED(hr = IPin_NewSegment(pin->pin.pin.peer,
+ pin->seek.llCurrent, pin->seek.llStop, pin->seek.dRate)))
+ WARN("Failed to deliver new segment, hr %#lx.\n", hr);
+ pin->need_segment = false;
+ }
+
if (IsEqualGUID(&pin->pin.pin.mt.formattype, &FORMAT_WaveFormatEx)
&& (IsEqualGUID(&pin->pin.pin.mt.subtype, &MEDIASUBTYPE_PCM)
|| IsEqualGUID(&pin->pin.pin.mt.subtype, &MEDIASUBTYPE_IEEE_FLOAT)))
@@ -828,8 +842,6 @@ static DWORD CALLBACK stream_thread(void *arg)
break;
case WG_PARSER_EVENT_SEGMENT:
- IPin_NewSegment(pin->pin.pin.peer, event.u.segment.position,
- event.u.segment.stop, event.u.segment.rate);
break;
case WG_PARSER_EVENT_NONE:
@@ -972,6 +984,8 @@ static HRESULT parser_init_stream(struct strmbase_filter *iface)
if (FAILED(hr = IMemAllocator_Commit(filter->sources[i]->pin.pAllocator)))
ERR("Failed to commit allocator, hr %#lx.\n", hr);
+ filter->sources[i]->need_segment = true;
+
filter->sources[i]->thread = CreateThread(NULL, 0, stream_thread, filter->sources[i], 0, NULL);
}
@@ -1359,6 +1373,8 @@ static HRESULT WINAPI GST_Seeking_SetPositions(IMediaSeeking *iface,
{
struct parser_source *flush_pin = filter->sources[i];
+ flush_pin->need_segment = true;
+
if (flush_pin->pin.pin.peer)
LeaveCriticalSection(&flush_pin->flushing_cs);
}
More information about the wine-cvs
mailing list