36 int64_t num, int64_t den, int64_t
max)
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;
54 int64_t a2n = x *
a1.num +
a0.num;
55 int64_t a2d = x *
a1.den +
a0.den;
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;
83 b.num * (int64_t)
c.num,
84 b.den * (int64_t)
c.den, INT_MAX);
95 b.num * (int64_t)
c.den +
96 c.num * (int64_t)
b.den,
97 b.den * (int64_t)
c.den, INT_MAX);
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)
130 int64_t
a =
q1.num * (int64_t)q2.
den + q2.
num * (int64_t)
q1.den;
131 int64_t
b = 2 * (int64_t)
q1.den * q2.
den;
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.
int64_t av_gcd(int64_t a, int64_t b)
Compute the greatest common divisor of two integer operands.
@ AV_ROUND_DOWN
Round toward -infinity.
@ AV_ROUND_UP
Round toward +infinity.
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]