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 @nogc nothrow extern(C):
37 
38 /**
39  * @addtogroup lavu_math
40  * @{
41  */
42 enum AVRounding {
43     AV_ROUND_ZERO     = 0, ///< Round toward zero.
44     AV_ROUND_INF      = 1, ///< Round away from zero.
45     AV_ROUND_DOWN     = 2, ///< Round toward -infinity.
46     AV_ROUND_UP       = 3, ///< Round toward +infinity.
47     AV_ROUND_NEAR_INF = 5, ///< Round to nearest and halfway cases away from zero.
48     AV_ROUND_PASS_MINMAX = 8192, ///< Flag to pass INT64_MIN/MAX through instead of rescaling, this avoids special cases for AV_NOPTS_VALUE
49 }
50 
51 /**
52  * Return the greatest common divisor of a and b.
53  * If both a and b are 0 or either or both are <0 then behavior is
54  * undefined.
55  */
56 int64_t av_gcd(int64_t a, int64_t b);
57 
58 /**
59  * Rescale a 64-bit integer with rounding to nearest.
60  * A simple a*b/c isn't possible as it can overflow.
61  */
62 int64_t av_rescale(int64_t a, int64_t b, int64_t c);
63 
64 /**
65  * Rescale a 64-bit integer with specified rounding.
66  * A simple a*b/c isn't possible as it can overflow.
67  */
68 int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, AVRounding);
69 
70 /**
71  * Rescale a 64-bit integer by 2 rational numbers.
72  */
73 int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq);
74 
75 /**
76  * Rescale a 64-bit integer by 2 rational numbers with specified rounding.
77  */
78 int64_t av_rescale_q_rnd(int64_t a, AVRational bq, AVRational cq,
79                          AVRounding);
80 
81 /**
82  * Compare 2 timestamps each in its own timebases.
83  * The result of the function is undefined if one of the timestamps
84  * is outside the int64_t range when represented in the others timebase.
85  * @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
86  */
87 int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b);
88 
89 /**
90  * Compare 2 integers modulo mod.
91  * That is we compare integers a and b for which only the least
92  * significant log2(mod) bits are known.
93  *
94  * @param mod must be a power of 2
95  * @return a negative value if a is smaller than b
96  *         a positive value if a is greater than b
97  *         0                if a equals          b
98  */
99 int64_t av_compare_mod(uint64_t a, uint64_t b, uint64_t mod);
100 
101 
102 /**
103  * Rescale a timestamp while preserving known durations.
104  *
105  * @param in_ts Input timestamp
106  * @param in_tb Input timesbase
107  * @param fs_tb Duration and *last timebase
108  * @param duration duration till the next call
109  * @param out_tb Output timesbase
110  */
111 int64_t av_rescale_delta(AVRational in_tb, int64_t in_ts,  AVRational fs_tb, int duration, int64_t *last, AVRational out_tb);
112 
113 /**
114  * @}
115  */