diff --git a/ChangeLog b/ChangeLog index 3663c1fe45..da7e7e3d4d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2004-03-06 Ronald Bultje + + * sys/oss/gstosssink.c: (gst_osssink_chain): + And another caller that couldn't handle delay < 0 (unsigned + integer overflow). Video now continues playing on an audio + buffer underrun, and the clock continues working. Audio still + stalls. + 2004-03-06 Ronald Bultje * sys/oss/gstosssink.c: (gst_osssink_get_delay), diff --git a/sys/oss/gstosssink.c b/sys/oss/gstosssink.c index 6e91bdba44..839321f351 100644 --- a/sys/oss/gstosssink.c +++ b/sys/oss/gstosssink.c @@ -337,6 +337,7 @@ gst_osssink_chain (GstPad *pad, GstData *_data) GstClockTime buftime, elementtime, soundtime; guchar *data; guint to_write; + gint delay; /* this has to be an audio buffer */ osssink = GST_OSSSINK (gst_pad_get_parent (pad)); @@ -367,7 +368,10 @@ gst_osssink_chain (GstPad *pad, GstData *_data) to_write = GST_BUFFER_SIZE (buf); /* sync audio with buffers timestamp */ elementtime = gst_element_get_time (GST_ELEMENT (osssink)); - soundtime = elementtime + gst_osssink_get_delay (osssink) * GST_SECOND / GST_OSSELEMENT (osssink)->bps; + delay = gst_osssink_get_delay (osssink); + if (delay < 0) + delay = 0; + soundtime = elementtime + delay * GST_SECOND / GST_OSSELEMENT (osssink)->bps; if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { buftime = GST_BUFFER_TIMESTAMP (buf); } else { @@ -381,9 +385,9 @@ gst_osssink_chain (GstPad *pad, GstData *_data) elementtime, soundtime, buftime); if (soundtime > buftime) { /* full frames */ - guint throw_away = (soundtime - buftime) * GST_OSSELEMENT (osssink)->bps / GST_SECOND - / GST_OSSELEMENT (osssink)->width / GST_OSSELEMENT (osssink)->channels - * GST_OSSELEMENT (osssink)->width * GST_OSSELEMENT (osssink)->channels; + guint throw_away = (soundtime - buftime) * GST_OSSELEMENT (osssink)->bps / GST_SECOND; + throw_away &= ~(GST_OSSELEMENT (osssink)->width * GST_OSSELEMENT (osssink)->channels); + osssink->handled += throw_away; if (throw_away >= GST_BUFFER_SIZE (buf)) { gst_data_unref (_data); return;