diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2006-04-23 10:28:54 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2006-04-23 10:28:54 +0000 |
commit | fdb3a3415688efdc1e03b43c7ed6f6bcb95da3e5 (patch) | |
tree | 44446b05d697101465bd4f7cdb0793a9743e55d8 /libavutil/mathematics.c | |
parent | 176c142abcbfda1cc161ca8614ab07dffe505349 (diff) | |
download | ffmpeg-fdb3a3415688efdc1e03b43c7ed6f6bcb95da3e5.tar.gz |
avoid AVInteger usage in av_rescale
disable integer.* (unused)
libavutil.a 45k -> 32k
Originally committed as revision 5311 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavutil/mathematics.c')
-rw-r--r-- | libavutil/mathematics.c | 60 |
1 files changed, 54 insertions, 6 deletions
diff --git a/libavutil/mathematics.c b/libavutil/mathematics.c index 3cd47a8ac0..54698b7ab1 100644 --- a/libavutil/mathematics.c +++ b/libavutil/mathematics.c @@ -22,7 +22,6 @@ */ #include "common.h" -#include "integer.h" #include "mathematics.h" const uint8_t ff_sqrt_tab[128]={ @@ -49,7 +48,6 @@ int64_t ff_gcd(int64_t a, int64_t b){ } int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd){ - AVInteger ai; int64_t r=0; assert(c > 0); assert(b >=0); @@ -65,12 +63,40 @@ int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd){ return (a * b + r)/c; else return a/c*b + (a%c*b + r)/c; - } + }else{ +#if 1 + uint64_t a0= a&0xFFFFFFFF; + uint64_t a1= a>>32; + uint64_t b0= b&0xFFFFFFFF; + uint64_t b1= b>>32; + uint64_t t1= a0*b1 + a1*b0; + uint64_t t1a= t1<<32; + int i; + + a0 = a0*b0 + t1a; + a1 = a1*b1 + (t1>>32) + (a0<t1a); + a0 += r; + a1 += a0<r; - ai= av_mul_i(av_int2i(a), av_int2i(b)); - ai= av_add_i(ai, av_int2i(r)); + for(i=63; i>=0; i--){ +// int o= a1 & 0x8000000000000000ULL; + a1+= a1 + ((a0>>i)&1); + t1+=t1; + if(/*o || */c >= a1){ + a1 -= c; + t1++; + } + } + return t1; + } +#else + AVInteger ai; + ai= av_mul_i(av_int2i(a), av_int2i(b)); + ai= av_add_i(ai, av_int2i(r)); - return av_i2int(av_div_i(ai, av_int2i(c))); + return av_i2int(av_div_i(ai, av_int2i(c))); + } +#endif } int64_t av_rescale(int64_t a, int64_t b, int64_t c){ @@ -82,3 +108,25 @@ int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq){ int64_t c= cq.num * (int64_t)bq.den; return av_rescale_rnd(a, b, c, AV_ROUND_NEAR_INF); } +#if 0 +main(){ + int64_t a,b,c,d,e; + + for(a=7; a<256*256*256*128LL; a=(a*3)+1){ + for(b=3; b<256*256*256*128LL; b=(b*5)/4+1){ + for(c=9; c<256*256*256*128LL; c=(c*7)/5+3 ){ + int64_t r= c/2; + AVInteger ai; + ai= av_mul_i(av_int2i(a), av_int2i(b)); + ai= av_add_i(ai, av_int2i(r)); + + d= av_i2int(av_div_i(ai, av_int2i(c))); + + e= av_rescale(a,b,c); + + if(d!=e) printf("%Ld*%Ld/%Ld= %Ld=%Ld\n"L, a, b, c, d, e); + } + } + } +} +#endif
\ No newline at end of file |