1 /*
2  * copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at>
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 module ffmpeg.libavutil.mathematics;
21 import std.stdint;
22 import ffmpeg.libavutil.rational;
23 import ffmpeg.libavutil.intfloat;
24 
25 enum M_E          =  2.7182818284590452354;   /* e */
26 enum M_LN2        =  0.69314718055994530942;  /* log_e 2 */
27 enum M_LN10       =  2.30258509299404568402;  /* log_e 10 */
28 enum M_LOG2_10    =  3.32192809488736234787;  /* log_2 10 */
29 enum M_PHI        =  1.61803398874989484820;   /* phi / golden ratio */
30 enum M_PI         =  3.14159265358979323846;  /* pi */
31 enum M_SQRT1_2    =  0.70710678118654752440;  /* 1/sqrt(2) */
32 enum M_SQRT2      =  1.41421356237309504880; /* sqrt(2) */
33 enum NAN          =  av_int2float(0x7fc00000);
34 enum INFINITY     =  av_int2float(0x7f800000);
35 
36 
37 extern (C):
38  /**
39  * @addtogroup lavu_math
40  * @{
41  */
42 enum AVRounding {
43       AV_ROUND_ZERO = 0,
44       AV_ROUND_INF = 1,
45       AV_ROUND_DOWN = 2,
46       AV_ROUND_UP = 3,
47       AV_ROUND_NEAR_INF = 5,
48 }
49 
50 /**
51  * Return the greatest common divisor of a and b.
52  * If both a and b are 0 or either or both are <0 then behavior is
53  * undefined.
54  */
55 int64_t av_gcd(int64_t a, int64_t b);
56 
57 /**
58  * Rescale a 64-bit integer with rounding to nearest.
59  * A simple a*b/c isn't possible as it can overflow.
60  */
61 int64_t av_rescale(int64_t a, int64_t b, int64_t c);
62 
63 /**
64  * Rescale a 64-bit integer with specified rounding.
65  * A simple a*b/c isn't possible as it can overflow.
66  */
67 int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, AVRounding);
68 
69 /**
70  * Rescale a 64-bit integer by 2 rational numbers.
71  */
72 int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq);
73 
74 /**
75  * Rescale a 64-bit integer by 2 rational numbers with specified rounding.
76  */
77 int64_t av_rescale_q_rnd(int64_t a, AVRational bq, AVRational cq,
78                          AVRounding);
79 
80 /**
81  * Compare 2 timestamps each in its own timebases.
82  * The result of the function is undefined if one of the timestamps
83  * is outside the int64_t range when represented in the others timebase.
84  * @return -1 if ts_a is before ts_b, 1 if ts_a is after ts_b or 0 if they represent the same position
85  */
86 int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b);
87 
88 /**
89  * Compare 2 integers modulo mod.
90  * That is we compare integers a and b for which only the least
91  * significant log2(mod) bits are known.
92  *
93  * @param mod must be a power of 2
94  * @return a negative value if a is smaller than b
95  *         a positive value if a is greater than b
96  *         0                if a equals          b
97  */
98 int64_t av_compare_mod(uint64_t a, uint64_t b, uint64_t mod);
99 
100 
101 /**
102  * Rescale a timestamp while preserving known durations.
103  *
104  * @param in_ts Input timestamp
105  * @param in_tb Input timesbase
106  * @param fs_tb Duration and *last timebase
107  * @param duration duration till the next call
108  * @param out_tb Output timesbase
109  */
110 int64_t av_rescale_delta(AVRational in_tb, int64_t in_ts,  AVRational fs_tb, int duration, int64_t *last, AVRational out_tb);
111 
112 /**
113  * @}
114  */