39 int sign = (num < 0) ^ (den < 0);
43 num =
FFABS(num) / gcd;
44 den =
FFABS(den) / gcd;
46 if (num <=
max && den <=
max) {
52 uint64_t x = num / den;
53 int64_t next_den = num - den * x;
57 if (a2n >
max || a2d >
max) {
61 if (den * (2 * x *
a1.den +
a0.den) > num *
a1.den)
74 *dst_num = sign ? -
a1.num :
a1.num;
113 if (
fabs(d) > INT_MAX + 3LL)
116 exponent =
FFMAX(exponent-1, 0);
117 den = 1LL << (61 - exponent);
121 if ((!
a.num || !
a.den) && d &&
max>0 &&
max<INT_MAX)
144 int i, nearest_q_idx = 0;
145 for (
i = 0; q_list[
i].
den;
i++)
146 if (
av_nearer_q(q, q_list[
i], q_list[nearest_q_idx]) > 0)
149 return nearest_q_idx;
166 if (!q.
num && !q.
den)
return 0xFFC00000;
167 if (!q.
num)
return 0;
168 if (!q.
den)
return 0x7F800000 | (q.
num & 0x80000000);
174 shift -= n >= (1<<24);
175 shift += n < (1<<23);
183 return sign<<31 | (150-
shift)<<23 | (n - (1<<23));
191 lcm = (
a.den / gcd) *
b.den;
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
common internal and external API header
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
static __device__ float fabs(float a)
static __device__ float floor(float a)
int av_nearer_q(AVRational q, AVRational q1, AVRational q2)
Find which of the two rationals is closer to another rational.
AVRational av_add_q(AVRational b, AVRational c)
Add two rationals.
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
int av_find_nearest_q_idx(AVRational q, const AVRational *q_list)
Find the value in a list of rationals nearest a given reference rational.
AVRational av_gcd_q(AVRational a, AVRational b, int max_den, AVRational def)
Return the best rational so that a and b are multiple of it.
static AVRational av_make_q(int num, int den)
Create an AVRational.
AVRational av_d2q(double d, int max)
Convert a double precision floating point number to a rational.
static int av_cmp_q(AVRational a, AVRational b)
Compare two rationals.
AVRational av_sub_q(AVRational b, AVRational c)
Subtract one rational from another.
uint32_t av_q2intfloat(AVRational q)
Convert an AVRational to a IEEE 32-bit float expressed in fixed-point format.
AVRational av_div_q(AVRational b, AVRational c)
Divide one rational by another.
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd)
Rescale a 64-bit integer with specified rounding.
@ AV_ROUND_DOWN
Round toward -infinity.
@ AV_ROUND_UP
Round toward +infinity.
int64_t av_gcd(int64_t a, int64_t b)
Compute the greatest common divisor of two integer operands.
Utilties for rational number calculation.
static int shift(int a, int b)
Rational number (pair of numerator and denominator).
static const uint8_t q1[256]