00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00027
00028 #include <limits.h>
00029
00030 #include "common.h"
00031 #include "avcodec.h"
00032 #include "rational.h"
00033
00037 AVRational av_mul_q(AVRational b, AVRational c){
00038 av_reduce(&b.num, &b.den, b.num * (int64_t)c.num, b.den * (int64_t)c.den, INT_MAX);
00039 return b;
00040 }
00041
00045 AVRational av_div_q(AVRational b, AVRational c){
00046 av_reduce(&b.num, &b.den, b.num * (int64_t)c.den, b.den * (int64_t)c.num, INT_MAX);
00047 return b;
00048 }
00049
00053 AVRational av_add_q(AVRational b, AVRational c){
00054 av_reduce(&b.num, &b.den, b.num * (int64_t)c.den + c.num * (int64_t)b.den, b.den * (int64_t)c.den, INT_MAX);
00055 return b;
00056 }
00057
00061 AVRational av_sub_q(AVRational b, AVRational c){
00062 av_reduce(&b.num, &b.den, b.num * (int64_t)c.den - c.num * (int64_t)b.den, b.den * (int64_t)c.den, INT_MAX);
00063 return b;
00064 }
00065
00070 AVRational av_d2q(double d, int max){
00071 AVRational a;
00072 int exponent= FFMAX( (int)(log(ABS(d) + 1e-20)/log(2)), 0);
00073 int64_t den= 1LL << (61 - exponent);
00074 av_reduce(&a.num, &a.den, (int64_t)(d * den + 0.5), den, max);
00075
00076 return a;
00077 }