sys/oss/gstosssink.c: get_delay() may return values lower than 0. In those cases...
authorRonald S. Bultje <rbultje@ronald.bitfreak.net>
Sun, 7 Mar 2004 02:09:45 +0000 (02:09 +0000)
committerRonald S. Bultje <rbultje@ronald.bitfreak.net>
Sun, 7 Mar 2004 02:09:45 +0000 (02:09 +0000)
Original commit message from CVS:
* sys/oss/gstosssink.c: (gst_osssink_get_delay),
(gst_osssink_get_time):
get_delay() may return values lower than 0. In those cases, we
should not actually cast to *unsigned* int64, that will break
stuff horribly. In my case, it screwed up A/V sync in movies
in totem rather badly.

ChangeLog
sys/oss/gstosssink.c

index 9e1a5c6..3663c1f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2004-03-06  Ronald Bultje  <rbultje@ronald.bitfreak.net>
+
+       * sys/oss/gstosssink.c: (gst_osssink_get_delay),
+       (gst_osssink_get_time):
+         get_delay() may return values lower than 0. In those cases, we
+         should not actually cast to *unsigned* int64, that will break
+         stuff horribly. In my case, it screwed up A/V sync in movies
+         in totem rather badly.
+
 2004-03-06  Christophe Fergeau  <teuf@gnome.org>
 
        * ext/faac/gstfaac.c: (gst_faac_chain):
index dd01b28..6e91bdb 100644 (file)
@@ -257,7 +257,7 @@ gst_osssink_sinkconnect (GstPad *pad, const GstCaps *caps)
   return GST_PAD_LINK_OK;
 }
 
-static inline gint64 
+static inline gint
 gst_osssink_get_delay (GstOssSink *osssink) 
 {
   gint delay = 0;
@@ -280,6 +280,7 @@ gst_osssink_get_delay (GstOssSink *osssink)
       delay = (info.fragstotal * info.fragsize) - info.bytes;    
     }
   }
+
   return delay;
 }
 
@@ -298,7 +299,9 @@ gst_osssink_get_time (GstClock *clock, gpointer data)
   /* sometimes delay is bigger than the number of bytes sent to the device, 
    * which screws up this calculation, we assume that everything is still 
    * in the device then */
-  if (((guint64)delay) > osssink->handled) {
+  if (delay < 0) {
+    delay = 0;
+  } else if (((guint64) delay) > osssink->handled) {
     delay = osssink->handled;
   }
   res =  (osssink->handled - delay) * GST_SECOND / GST_OSSELEMENT (osssink)->bps;