[vlc-devel] [PATCH] Fix date_Increment when i_divider_den > 1
Jean-Baptiste Kempf
jb at videolan.org
Mon Aug 11 18:15:46 CEST 2008
On Thu, Aug 07, 2008 at 07:39:02PM +0000, David Flynn wrote :
> From: David Flynn <davidf at rd.bbc.co.uk>
>
> Previously, calling date_Increment(d,1) with divider_den > 1 would cause:
> - Uncorrectable rounding error due to ordering of / followed by *
> - Incorrect calculation of i_remainder
> - If i_divider_num / i_divider_den is not integral, a remainder is
> accumulated, but not divided by i_divider_num when added to date.
> => First&last cases are evident with num=30000, den=1001.
>
> This fixes above issues.
Applied in [8ee69aa072883ab2659e707152c11fc5ddf22777]
>
> Signed-off-by: David Flynn <davidf at rd.bbc.co.uk>
> ---
> src/misc/mtime.c | 9 ++++++---
> 1 files changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/src/misc/mtime.c b/src/misc/mtime.c
> index d9af9fd..2203034 100644
> --- a/src/misc/mtime.c
> +++ b/src/misc/mtime.c
> @@ -425,6 +425,8 @@ void date_Init( date_t *p_date, uint32_t i_divider_n, uint32_t i_divider_d )
>
> void date_Change( date_t *p_date, uint32_t i_divider_n, uint32_t i_divider_d )
> {
> + /* change time scale of remainder */
> + p_date->i_remainder = p_date->i_remainder * i_divider_n / p_date->i_divider_num;
> p_date->i_divider_num = i_divider_n;
> p_date->i_divider_den = i_divider_d;
> }
> @@ -473,14 +475,15 @@ void date_Move( date_t *p_date, mtime_t i_difference )
> */
> mtime_t date_Increment( date_t *p_date, uint32_t i_nb_samples )
> {
> - mtime_t i_dividend = (mtime_t)i_nb_samples * 1000000;
> - p_date->date += i_dividend / p_date->i_divider_num * p_date->i_divider_den;
> + 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;
> p_date->i_remainder += (int)(i_dividend % p_date->i_divider_num);
>
> if( p_date->i_remainder >= p_date->i_divider_num )
> {
> /* This is Bresenham algorithm. */
> - p_date->date += p_date->i_divider_den;
> + /* It is guaranteed that: assert(i_remainder < 2*i_divider_num) */
> + p_date->date += 1;
> p_date->i_remainder -= p_date->i_divider_num;
> }
>
> --
> 1.5.6
>
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> http://mailman.videolan.org/listinfo/vlc-devel
--
Best Regards,
--
Jean-Baptiste Kempf
http://www.jbkempf.com/
More information about the vlc-devel
mailing list