Zebediah Figura : winegstreamer: Don't query the pad position in IMediaSeeking::SetPositions().
Alexandre Julliard
julliard at winehq.org
Mon Nov 23 15:43:23 CST 2020
Module: wine
Branch: master
Commit: 54d74a053b6540f3f3aeb4242f09dd02bc4e3ced
URL: https://source.winehq.org/git/wine.git/?a=commit;h=54d74a053b6540f3f3aeb4242f09dd02bc4e3ced
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Sat Nov 21 15:25:00 2020 -0600
winegstreamer: Don't query the pad position in IMediaSeeking::SetPositions().
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/winegstreamer/gstdemux.c | 80 ++++++++++++++++---------------------------
1 file changed, 30 insertions(+), 50 deletions(-)
diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c
index 6d66ddcb167..e227ed9331d 100644
--- a/dlls/winegstreamer/gstdemux.c
+++ b/dlls/winegstreamer/gstdemux.c
@@ -1897,63 +1897,43 @@ static ULONG WINAPI GST_Seeking_Release(IMediaSeeking *iface)
return IPin_Release(&This->pin.pin.IPin_iface);
}
-static GstSeekType type_from_flags(DWORD flags)
-{
- switch (flags & AM_SEEKING_PositioningBitsMask) {
- case AM_SEEKING_NoPositioning:
- return GST_SEEK_TYPE_NONE;
- case AM_SEEKING_AbsolutePositioning:
- case AM_SEEKING_RelativePositioning:
- return GST_SEEK_TYPE_SET;
- case AM_SEEKING_IncrementalPositioning:
- return GST_SEEK_TYPE_END;
- }
- return GST_SEEK_TYPE_NONE;
-}
-
static HRESULT WINAPI GST_Seeking_SetPositions(IMediaSeeking *iface,
- REFERENCE_TIME *pCur, DWORD curflags, REFERENCE_TIME *pStop,
- DWORD stopflags)
+ LONGLONG *current, DWORD current_flags, LONGLONG *stop, DWORD stop_flags)
{
- HRESULT hr;
- struct gstdemux_source *This = impl_from_IMediaSeeking(iface);
- GstSeekFlags f = 0;
- GstSeekType curtype, stoptype;
- GstEvent *e;
- gint64 stop_pos = 0, curr_pos = 0;
+ GstSeekType current_type = GST_SEEK_TYPE_SET, stop_type = GST_SEEK_TYPE_SET;
+ struct gstdemux_source *pin = impl_from_IMediaSeeking(iface);
+ GstSeekFlags flags = 0;
- TRACE("(%p)->(%p, 0x%x, %p, 0x%x)\n", This, pCur, curflags, pStop, stopflags);
+ TRACE("pin %p, current %s, current_flags %#x, stop %s, stop_flags %#x.\n",
+ pin, current ? debugstr_time(*current) : "<null>", current_flags,
+ stop ? debugstr_time(*stop) : "<null>", stop_flags);
mark_wine_thread();
- hr = SourceSeekingImpl_SetPositions(iface, pCur, curflags, pStop, stopflags);
- if (This->pin.pin.filter->state == State_Stopped)
- return hr;
-
- curtype = type_from_flags(curflags);
- stoptype = type_from_flags(stopflags);
- if (curflags & AM_SEEKING_SeekToKeyFrame)
- f |= GST_SEEK_FLAG_KEY_UNIT;
- if (curflags & AM_SEEKING_Segment)
- f |= GST_SEEK_FLAG_SEGMENT;
- if (!(curflags & AM_SEEKING_NoFlush))
- f |= GST_SEEK_FLAG_FLUSH;
-
- if (((curflags & AM_SEEKING_PositioningBitsMask) == AM_SEEKING_RelativePositioning) ||
- ((stopflags & AM_SEEKING_PositioningBitsMask) == AM_SEEKING_RelativePositioning)) {
- gint64 tmp_pos;
- gst_pad_query_position (This->my_sink, GST_FORMAT_TIME, &tmp_pos);
- if ((curflags & AM_SEEKING_PositioningBitsMask) == AM_SEEKING_RelativePositioning)
- curr_pos = tmp_pos;
- if ((stopflags & AM_SEEKING_PositioningBitsMask) == AM_SEEKING_RelativePositioning)
- stop_pos = tmp_pos;
- }
-
- e = gst_event_new_seek(This->seek.dRate, GST_FORMAT_TIME, f, curtype, pCur ? curr_pos + *pCur * 100 : -1, stoptype, pStop ? stop_pos + *pStop * 100 : -1);
- if (gst_pad_push_event(This->my_sink, e))
+ SourceSeekingImpl_SetPositions(iface, current, current_flags, stop, stop_flags);
+ if (pin->pin.pin.filter->state == State_Stopped)
return S_OK;
- else
- return E_NOTIMPL;
+
+ if (current_flags & AM_SEEKING_SeekToKeyFrame)
+ flags |= GST_SEEK_FLAG_KEY_UNIT;
+ if (current_flags & AM_SEEKING_Segment)
+ flags |= GST_SEEK_FLAG_SEGMENT;
+ if (!(current_flags & AM_SEEKING_NoFlush))
+ flags |= GST_SEEK_FLAG_FLUSH;
+
+ if ((current_flags & AM_SEEKING_PositioningBitsMask) == AM_SEEKING_NoPositioning)
+ current_type = GST_SEEK_TYPE_NONE;
+ if ((stop_flags & AM_SEEKING_PositioningBitsMask) == AM_SEEKING_NoPositioning)
+ stop_type = GST_SEEK_TYPE_NONE;
+
+ if (!gst_pad_push_event(pin->my_sink, gst_event_new_seek(pin->seek.dRate, GST_FORMAT_TIME, flags,
+ current_type, pin->seek.llCurrent * 100, stop_type, pin->seek.llStop * 100)))
+ {
+ ERR("Failed to seek (current %s, stop %s).\n",
+ debugstr_time(pin->seek.llCurrent), debugstr_time(pin->seek.llStop));
+ return E_FAIL;
+ }
+ return S_OK;
}
static const IMediaSeekingVtbl GST_Seeking_Vtbl =
More information about the wine-cvs
mailing list