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_PI_2       =  1.57079632679489661923;  /* pi/2 */
32 enum M_SQRT1_2    =  0.70710678118654752440;  /* 1/sqrt(2) */
33 enum M_SQRT2      =  1.41421356237309504880; /* sqrt(2) */
34 enum NAN          =  av_int2float(0x7fc00000);
35 enum INFINITY     =  av_int2float(0x7f800000);
36 
37 @nogc nothrow extern(C):
38 
39 /**
40  * @addtogroup lavu_math
41  * @{
42  */
43 enum AVRounding {
44     AV_ROUND_ZERO     = 0, ///< Round toward zero.
45     AV_ROUND_INF      = 1, ///< Round away from zero.
46     AV_ROUND_DOWN     = 2, ///< Round toward -infinity.
47     AV_ROUND_UP       = 3, ///< Round toward +infinity.
48     AV_ROUND_NEAR_INF = 5, ///< Round to nearest and halfway cases away from zero.
49     AV_ROUND_PASS_MINMAX = 8192 ///< Flag to pass INT64_MIN/MAX through instead of rescaling, this avoids special cases for AV_NOPTS_VALUE
50 }
51 
52 /**
53  * Compute the greatest common divisor of a and b.
54  *
55  * @return gcd of a and b up to sign; if a >= 0 and b >= 0, return value is >= 0;
56  * if a == 0 and b == 0, returns 0.
57  */
58 int64_t av_gcd(int64_t a, int64_t b);
59 
60 /**
61  * Rescale a 64-bit integer with rounding to nearest.
62  * A simple a*b/c isn't possible as it can overflow.
63  */
64 int64_t av_rescale(int64_t a, int64_t b, int64_t c);
65 
66 /**
67  * Rescale a 64-bit integer with specified rounding.
68  * A simple a*b/c isn't possible as it can overflow.
69  *
70  * @return rescaled value a, or if AV_ROUND_PASS_MINMAX is set and a is
71  *         INT64_MIN or INT64_MAX then a is passed through unchanged.
72  */
73 int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, AVRounding);
74 
75 /**
76  * Rescale a 64-bit integer by 2 rational numbers.
77  */
78 int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq);
79 
80 /**
81  * Rescale a 64-bit integer by 2 rational numbers with specified rounding.
82  *
83  * @return rescaled value a, or if AV_ROUND_PASS_MINMAX is set and a is
84  *         INT64_MIN or INT64_MAX then a is passed through unchanged.
85  */
86 int64_t av_rescale_q_rnd(int64_t a, AVRational bq, AVRational cq,
87                          AVRounding);
88 
89 /**
90  * Compare 2 timestamps each in its own timebases.
91  * The result of the function is undefined if one of the timestamps
92  * is outside the int64_t range when represented in the others timebase.
93  * @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
94  */
95 int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b);
96 
97 /**
98  * Compare 2 integers modulo mod.
99  * That is we compare integers a and b for which only the least
100  * significant log2(mod) bits are known.
101  *
102  * @param mod must be a power of 2
103  * @return a negative value if a is smaller than b
104  *         a positive value if a is greater than b
105  *         0                if a equals          b
106  */
107 int64_t av_compare_mod(uint64_t a, uint64_t b, uint64_t mod);
108 
109 /**
110  * Rescale a timestamp while preserving known durations.
111  *
112  * @param in_ts Input timestamp
113  * @param in_tb Input timesbase
114  * @param fs_tb Duration and *last timebase
115  * @param duration duration till the next call
116  * @param out_tb Output timesbase
117  */
118 int64_t av_rescale_delta(AVRational in_tb, int64_t in_ts,  AVRational fs_tb, int duration, int64_t *last, AVRational out_tb);
119 
120 
121 /**
122  * Add a value to a timestamp.
123  *
124  * This function guarantees that when the same value is repeatly added that
125  * no accumulation of rounding errors occurs.
126  *
127  * @param ts Input timestamp
128  * @param ts_tb Input timestamp timebase
129  * @param inc value to add to ts
130  * @param inc_tb inc timebase
131  */
132 int64_t av_add_stable(AVRational ts_tb, int64_t ts, AVRational inc_tb, int64_t inc);
133 
134 /**
135  * @}
136  */