[PATCH resend 1/2] winegstreamer: Also use GST_QOS_TYPE_OVERFLOW for samples that arrive on time.
Signed-off-by: Zebediah Figura <zfigura(a)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"); -- 2.25.1
Signed-off-by: Zebediah Figura <zfigura(a)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"); -- 2.25.1
participants (1)
-
Zebediah Figura