ffmpeg / libav / tick.h @ c25fdfc6
History  View  Annotate  Download (1.25 KB)
1 
/* tick.h  Compute successive integer multiples of a rational


2 
* number without longterm rounding error.

3 
* (c)2002 by Lennert Buytenhek <buytenh@gnu.org>

4 
* File licensed under the GPL, see http://www.fsf.org/ for more info.

5 
* Dedicated to Marija Kulikova.

6 
*/

7  
8 
#include "avcodec.h" 
9  
10 
typedef struct Ticker { 
11 
int value;

12 
int inrate;

13 
int outrate;

14 
int div;

15 
int mod;

16 
} Ticker; 
17  
18 
extern void ticker_init(Ticker *tick, INT64 inrate, INT64 outrate); 
19  
20 
static inline int ticker_tick(Ticker *tick, int num) 
21 
{ 
22 
int n = num * tick>div;

23  
24 
tick>value += num * tick>mod; 
25 
#if 1 
26 
if (tick>value > 0) { 
27 
n += (tick>value / tick>inrate); 
28 
tick>value = tick>value % tick>inrate; 
29 
if (tick>value > 0) { 
30 
tick>value = tick>inrate; 
31 
n++; 
32 
} 
33 
} 
34 
#else

35 
while (tick>value > 0) { 
36 
tick>value = tick>inrate; 
37 
n++; 
38 
} 
39 
#endif

40 
return n;

41 
} 
42  
43 
static inline INT64 ticker_abs(Ticker *tick, int num) 
44 
{ 
45 
INT64 n = (INT64) num * tick>div; 
46 
INT64 value = (INT64) num * tick>mod; 
47  
48 
if (value > 0) { 
49 
n += (value / tick>inrate); 
50 
value = value % tick>inrate; 
51 
if (value > 0) { 
52 
/* value = tick>inrate; */

53 
n++; 
54 
} 
55 
} 
56 
return n;

57 
} 