1 /*
2 * rational numbers
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */21 22 /**
23 * @file
24 * @ingroup lavu_math_rational
25 * Utilties for rational number calculation.
26 * @author Michael Niedermayer <michaelni@gmx.at>
27 */28 29 moduleffmpeg.libavutil.rational;
30 31 extern (C):
32 importffmpeg; @nogcnothrow:
33 34 /**
35 * @defgroup lavu_math_rational AVRational
36 * @ingroup lavu_math
37 * Rational number calculation.
38 *
39 * While rational numbers can be expressed as floating-point numbers, the
40 * conversion process is a lossy one, so are floating-point operations. On the
41 * other hand, the nature of FFmpeg demands highly accurate calculation of
42 * timestamps. This set of rational number utilities serves as a generic
43 * interface for manipulating rational numbers as pairs of numerators and
44 * denominators.
45 *
46 * Many of the functions that operate on AVRational's have the suffix `_q`, in
47 * reference to the mathematical symbol "ℚ" (Q) which denotes the set of all
48 * rational numbers.
49 *
50 * @{
51 */52 53 /**
54 * Rational number (pair of numerator and denominator).
55 */56 structAVRational57 {
58 intnum; ///< Numerator59 intden; ///< Denominator60 }
61 62 /**
63 * Create an AVRational.
64 *
65 * Useful for compilers that do not support compound literals.
66 *
67 * @note The return value is not reduced.
68 * @see av_reduce()
69 */70 AVRationalav_make_q (intnum, intden);
71 72 /**
73 * Compare two rationals.
74 *
75 * @param a First rational
76 * @param b Second rational
77 *
78 * @return One of the following values:
79 * - 0 if `a == b`
80 * - 1 if `a > b`
81 * - -1 if `a < b`
82 * - `INT_MIN` if one of the values is of the form `0 / 0`
83 */84 intav_cmp_q (AVRationala, AVRationalb);
85 86 /**
87 * Convert an AVRational to a `double`.
88 * @param a AVRational to convert
89 * @return `a` in floating-point form
90 * @see av_d2q()
91 */92 doubleav_q2d (AVRationala);
93 94 /**
95 * Reduce a fraction.
96 *
97 * This is useful for framerate calculations.
98 *
99 * @param[out] dst_num Destination numerator
100 * @param[out] dst_den Destination denominator
101 * @param[in] num Source numerator
102 * @param[in] den Source denominator
103 * @param[in] max Maximum allowed values for `dst_num` & `dst_den`
104 * @return 1 if the operation is exact, 0 otherwise
105 */106 intav_reduce (int* dst_num, int* dst_den, longnum, longden, longmax);
107 108 /**
109 * Multiply two rationals.
110 * @param b First rational
111 * @param c Second rational
112 * @return b*c
113 */114 AVRationalav_mul_q (AVRationalb, AVRationalc);
115 116 /**
117 * Divide one rational by another.
118 * @param b First rational
119 * @param c Second rational
120 * @return b/c
121 */122 AVRationalav_div_q (AVRationalb, AVRationalc);
123 124 /**
125 * Add two rationals.
126 * @param b First rational
127 * @param c Second rational
128 * @return b+c
129 */130 AVRationalav_add_q (AVRationalb, AVRationalc);
131 132 /**
133 * Subtract one rational from another.
134 * @param b First rational
135 * @param c Second rational
136 * @return b-c
137 */138 AVRationalav_sub_q (AVRationalb, AVRationalc);
139 140 /**
141 * Invert a rational.
142 * @param q value
143 * @return 1 / q
144 */145 AVRationalav_inv_q (AVRationalq);
146 147 /**
148 * Convert a double precision floating point number to a rational.
149 *
150 * In case of infinity, the returned value is expressed as `{1, 0}` or
151 * `{-1, 0}` depending on the sign.
152 *
153 * @param d `double` to convert
154 * @param max Maximum allowed numerator and denominator
155 * @return `d` in AVRational form
156 * @see av_q2d()
157 */158 AVRationalav_d2q (doubled, intmax);
159 160 /**
161 * Find which of the two rationals is closer to another rational.
162 *
163 * @param q Rational to be compared against
164 * @param q1,q2 Rationals to be tested
165 * @return One of the following values:
166 * - 1 if `q1` is nearer to `q` than `q2`
167 * - -1 if `q2` is nearer to `q` than `q1`
168 * - 0 if they have the same distance
169 */170 intav_nearer_q (AVRationalq, AVRationalq1, AVRationalq2);
171 172 /**
173 * Find the value in a list of rationals nearest a given reference rational.
174 *
175 * @param q Reference rational
176 * @param q_list Array of rationals terminated by `{0, 0}`
177 * @return Index of the nearest value found in the array
178 */179 intav_find_nearest_q_idx (AVRationalq, const(AVRational)* q_list);
180 181 /**
182 * Convert an AVRational to a IEEE 32-bit `float` expressed in fixed-point
183 * format.
184 *
185 * @param q Rational to be converted
186 * @return Equivalent floating-point value, expressed as an unsigned 32-bit
187 * integer.
188 * @note The returned value is platform-indepedant.
189 */190 uintav_q2intfloat (AVRationalq);
191 192 /**
193 * @}
194 */195 196 /* AVUTIL_RATIONAL_H */