|
|
|
@@ -101,3 +101,28 @@ AVRational av_d2q(double d, int max){ |
|
|
|
|
|
|
|
return a; |
|
|
|
} |
|
|
|
|
|
|
|
int av_nearer_q(AVRational q, AVRational q1, AVRational q2) |
|
|
|
{ |
|
|
|
/* n/d is q, a/b is the median between q1 and q2 */ |
|
|
|
int64_t a = q1.num * (int64_t)q2.den + q2.num * (int64_t)q1.den; |
|
|
|
int64_t b = 2 * (int64_t)q1.den * q2.den; |
|
|
|
|
|
|
|
/* rnd_up(a*d/b) > n => a*d/b > n */ |
|
|
|
int64_t x_up = av_rescale_rnd(a, q.den, b, AV_ROUND_UP); |
|
|
|
|
|
|
|
/* rnd_down(a*d/b) < n => a*d/b < n */ |
|
|
|
int64_t x_down = av_rescale_rnd(a, q.den, b, AV_ROUND_DOWN); |
|
|
|
|
|
|
|
return ((x_up > q.num) - (x_down < q.num)) * av_cmp_q(q2, q1); |
|
|
|
} |
|
|
|
|
|
|
|
int av_find_nearest_q_idx(AVRational q, const AVRational* q_list) |
|
|
|
{ |
|
|
|
int i, nearest_q_idx = 0; |
|
|
|
for(i=0; q_list[i].den; i++) |
|
|
|
if (av_nearer_q(q, q_list[i], q_list[nearest_q_idx]) > 0) |
|
|
|
nearest_q_idx = i; |
|
|
|
|
|
|
|
return nearest_q_idx; |
|
|
|
} |