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) {
58 if (
a1.num) x = (max - a0.
num) /
a1.num;
61 if (den * (2 * x *
a1.den + a0.
den) > num *
a1.den)
73 *dst_num = sign ? -
a1.num :
a1.num;
83 b.
den * (int64_t) c.
den, INT_MAX);
96 b.
den * (int64_t) c.
den, INT_MAX);
108 #define LOG2 0.69314718055994530941723212145817656807550013436025
113 if (fabs(d) > INT_MAX + 3LL)
115 exponent =
FFMAX( (
int)(log(fabs(d) + 1e-20)/
LOG2), 0);
116 den = 1LL << (61 - exponent);
119 if ((!a.
num || !a.
den) && d && max>0 && max<INT_MAX)
128 int64_t
a = q1.
num * (int64_t)q2.
den + q2.
num * (int64_t)q1.
den;
129 int64_t
b = 2 * (int64_t)q1.
den * q2.
den;
142 int i, nearest_q_idx = 0;
143 for (i = 0; q_list[i].
den; i++)
144 if (
av_nearer_q(q, q_list[i], q_list[nearest_q_idx]) > 0)
147 return nearest_q_idx;
162 else if (d < 0) d = -1;
163 else if (d != d) d = INT_MIN;
int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding) av_const
Rescale a 64-bit integer with specified rounding.
void av_log(void *avcl, int level, const char *fmt,...) av_printf_format(3
Send the specified message to the log if the level is less than or equal to the current av_log_level...
static int av_cmp_q(AVRational a, AVRational b)
Compare two rationals.
if((e=av_dict_get(options,"", NULL, AV_DICT_IGNORE_SUFFIX)))
simple assert() macros that are a bit more flexible than ISO C assert().
static av_always_inline av_const int isnan(float x)
static double av_q2d(AVRational a)
Convert rational to double.
AVRational av_mul_q(AVRational b, AVRational c) av_const
Multiply two rationals.
AVRational av_add_q(AVRational b, AVRational c) av_const
Add two rationals.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
int av_nearer_q(AVRational q, AVRational q1, AVRational q2)
AVRational av_div_q(AVRational b, AVRational c) av_const
Divide one rational by another.
int64_t av_const av_gcd(int64_t a, int64_t b)
Return the greatest common divisor of a and b.
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
AVRational av_sub_q(AVRational b, AVRational c) av_const
Subtract one rational from another.
AVRational av_d2q(double d, int max) av_const
Convert a double precision floating point number to a rational.
int av_find_nearest_q_idx(AVRational q, const AVRational *q_list)
Find the nearest value in q_list to q.
rational number numerator/denominator
int main(int argc, char **argv)
common internal and external API header
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.