Mercurial > libavcodec.hg
comparison utils.c @ 2242:8f605c66d1d4 libavcodec
av_rescale with user specified rounding
author | michael |
---|---|
date | Sun, 19 Sep 2004 16:38:54 +0000 |
parents | c87bab25f89f |
children | 21f450be6cb5 |
comparison
equal
deleted
inserted
replaced
2241:c26038875ebc | 2242:8f605c66d1d4 |
---|---|
820 *dst_den = a1.den; | 820 *dst_den = a1.den; |
821 | 821 |
822 return den==0; | 822 return den==0; |
823 } | 823 } |
824 | 824 |
825 int64_t av_rescale(int64_t a, int64_t b, int64_t c){ | 825 int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd){ |
826 AVInteger ai, ci; | 826 AVInteger ai; |
827 int64_t r=0; | |
827 assert(c > 0); | 828 assert(c > 0); |
828 assert(b >=0); | 829 assert(b >=0); |
829 | 830 assert(rnd >=0 && rnd<=5 && rnd!=4); |
830 if(a<0) return -av_rescale(-a, b, c); | 831 |
831 | 832 if(a<0) return -av_rescale_rnd(-a, b, c, rnd ^ ((rnd>>1)&1)); |
833 | |
834 if(rnd==AV_ROUND_NEAR_INF) r= c/2; | |
835 else if(rnd&1) r= c-1; | |
836 | |
832 if(b<=INT_MAX && c<=INT_MAX){ | 837 if(b<=INT_MAX && c<=INT_MAX){ |
833 if(a<=INT_MAX) | 838 if(a<=INT_MAX) |
834 return (a * b + c/2)/c; | 839 return (a * b + r)/c; |
835 else | 840 else |
836 return a/c*b + (a%c*b + c/2)/c; | 841 return a/c*b + (a%c*b + r)/c; |
837 } | 842 } |
838 | 843 |
839 ai= av_mul_i(av_int2i(a), av_int2i(b)); | 844 ai= av_mul_i(av_int2i(a), av_int2i(b)); |
840 ci= av_int2i(c); | 845 ai= av_add_i(ai, av_int2i(r)); |
841 ai= av_add_i(ai, av_shr_i(ci,1)); | 846 |
842 | 847 return av_i2int(av_div_i(ai, av_int2i(c))); |
843 return av_i2int(av_div_i(ai, ci)); | 848 } |
849 | |
850 int64_t av_rescale(int64_t a, int64_t b, int64_t c){ | |
851 return av_rescale_rnd(a, b, c, AV_ROUND_NEAR_INF); | |
844 } | 852 } |
845 | 853 |
846 /* av_log API */ | 854 /* av_log API */ |
847 | 855 |
848 static int av_log_level = AV_LOG_DEBUG; | 856 static int av_log_level = AV_LOG_DEBUG; |