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;