Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/winegstreamer/gstdemux.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c index 9d7f85b82d9..2e3fbd29253 100644 --- a/dlls/winegstreamer/gstdemux.c +++ b/dlls/winegstreamer/gstdemux.c @@ -1964,6 +1964,7 @@ static ULONG WINAPI GST_QualityControl_Release(IQualityControl *iface) static HRESULT WINAPI GST_QualityControl_Notify(IQualityControl *iface, IBaseFilter *sender, Quality qm) { struct gstdemux_source *pin = impl_from_IQualityControl(iface); + GstQOSType type = GST_QOS_TYPE_OVERFLOW; GstEvent *evt;
TRACE("(%p)->(%p, { 0x%x %u %s %s })\n", pin, sender, @@ -1976,8 +1977,13 @@ static HRESULT WINAPI GST_QualityControl_Notify(IQualityControl *iface, IBaseFil if (qm.Type == Flood) qm.Late = 0;
- evt = gst_event_new_qos(qm.Type == Famine ? GST_QOS_TYPE_UNDERFLOW : GST_QOS_TYPE_OVERFLOW, - qm.Proportion / 1000., qm.Late * 100, qm.TimeStamp * 100); + /* GSTQOS_TYPE_OVERFLOW is also used for buffers that arrive on time, but + * DirectShow filters might use Famine, so check that there actually is an + * underrun. */ + if (qm.Type == Famine && qm.Proportion > 1000) + type = GST_QOS_TYPE_UNDERFLOW; + + evt = gst_event_new_qos(type, qm.Proportion / 1000.0, qm.Late * 100, qm.TimeStamp * 100);
if (!evt) { WARN("Failed to create QOS event\n");
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/winegstreamer/gstdemux.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c index 2e3fbd29253..d2f50722354 100644 --- a/dlls/winegstreamer/gstdemux.c +++ b/dlls/winegstreamer/gstdemux.c @@ -1965,6 +1965,8 @@ static HRESULT WINAPI GST_QualityControl_Notify(IQualityControl *iface, IBaseFil { struct gstdemux_source *pin = impl_from_IQualityControl(iface); GstQOSType type = GST_QOS_TYPE_OVERFLOW; + GstClockTime timestamp; + GstClockTimeDiff diff; GstEvent *evt;
TRACE("(%p)->(%p, { 0x%x %u %s %s })\n", pin, sender, @@ -1974,16 +1976,23 @@ static HRESULT WINAPI GST_QualityControl_Notify(IQualityControl *iface, IBaseFil
mark_wine_thread();
- if (qm.Type == Flood) - qm.Late = 0; - /* GSTQOS_TYPE_OVERFLOW is also used for buffers that arrive on time, but * DirectShow filters might use Famine, so check that there actually is an * underrun. */ if (qm.Type == Famine && qm.Proportion > 1000) type = GST_QOS_TYPE_UNDERFLOW;
- evt = gst_event_new_qos(type, qm.Proportion / 1000.0, qm.Late * 100, qm.TimeStamp * 100); + /* DirectShow filters sometimes pass negative timestamps (Audiosurf uses the + * current time instead of the time of the last buffer). GstClockTime is + * unsigned, so clamp it to 0. */ + timestamp = max(qm.TimeStamp * 100, 0); + + /* The documentation specifies that timestamp + diff must be nonnegative. */ + diff = qm.Late * 100; + if (timestamp < -diff) + diff = -timestamp; + + evt = gst_event_new_qos(type, qm.Proportion / 1000.0, diff, timestamp);
if (!evt) { WARN("Failed to create QOS event\n");