]> git.sesse.net Git - vlc/blobdiff - src/misc/mtime.c
Moved date_Decrement to libvlc core from dirac.
[vlc] / src / misc / mtime.c
index 0dbb4df578308b38e6e3ff9487b0e9143f11853b..c735bdfcaafa6721488226f8ea347f9662ec142e 100644 (file)
@@ -536,6 +536,33 @@ mtime_t date_Increment( date_t *p_date, uint32_t i_nb_samples )
     return p_date->date;
 }
 
+/**
+ * Decrement the date and return the result, taking into account
+ * rounding errors.
+ *
+ * \param date to decrement
+ * \param decrementation in number of samples
+ * \return date value
+ */
+mtime_t date_Decrement( date_t *p_date, uint32_t i_nb_samples )
+{
+    mtime_t i_dividend = (mtime_t)i_nb_samples * 1000000 * p_date->i_divider_den;
+    p_date->date -= i_dividend / p_date->i_divider_num;
+    unsigned i_rem_adjust = i_dividend % p_date->i_divider_num;
+
+    if( p_date->i_remainder < i_rem_adjust )
+    {
+        /* This is Bresenham algorithm. */
+        assert( p_date->i_remainder > -p_date->i_divider_num);
+        p_date->date -= 1;
+        p_date->i_remainder += p_date->i_divider_num;
+    }
+
+    p_date->i_remainder -= i_rem_adjust;
+
+    return p_date->date;
+}
+
 #ifndef HAVE_GETTIMEOFDAY
 
 #ifdef WIN32