comparison utils.c @ 2817:b128802eb77b libavcodec

libavutil: Utility code from libavcodec moved to a separate library.
author al
date Mon, 01 Aug 2005 20:07:05 +0000
parents af3a36e20010
children 22eec5a1b043
comparison
equal deleted inserted replaced
2816:c6ab4b91a5c5 2817:b128802eb77b
28 #include "dsputil.h" 28 #include "dsputil.h"
29 #include "mpegvideo.h" 29 #include "mpegvideo.h"
30 #include "integer.h" 30 #include "integer.h"
31 #include <stdarg.h> 31 #include <stdarg.h>
32 #include <limits.h> 32 #include <limits.h>
33
34 const uint8_t ff_sqrt_tab[128]={
35 0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5,
36 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
37 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
38 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11
39 };
40
41 const uint8_t ff_log2_tab[256]={
42 0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
43 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
44 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
45 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
46 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
47 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
48 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
49 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
50 };
51 33
52 const uint8_t ff_reverse[256]={ 34 const uint8_t ff_reverse[256]={
53 0x00,0x80,0x40,0xC0,0x20,0xA0,0x60,0xE0,0x10,0x90,0x50,0xD0,0x30,0xB0,0x70,0xF0, 35 0x00,0x80,0x40,0xC0,0x20,0xA0,0x60,0xE0,0x10,0x90,0x50,0xD0,0x30,0xB0,0x70,0xF0,
54 0x08,0x88,0x48,0xC8,0x28,0xA8,0x68,0xE8,0x18,0x98,0x58,0xD8,0x38,0xB8,0x78,0xF8, 36 0x08,0x88,0x48,0xC8,0x28,0xA8,0x68,0xE8,0x18,0x98,0x58,0xD8,0x38,0xB8,0x78,0xF8,
55 0x04,0x84,0x44,0xC4,0x24,0xA4,0x64,0xE4,0x14,0x94,0x54,0xD4,0x34,0xB4,0x74,0xF4, 37 0x04,0x84,0x44,0xC4,0x24,0xA4,0x64,0xE4,0x14,0x94,0x54,0xD4,0x34,0xB4,0x74,0xF4,
936 case SP_TYPE:return 'p'; 918 case SP_TYPE:return 'p';
937 default: return '?'; 919 default: return '?';
938 } 920 }
939 } 921 }
940 922
941 int av_reduce(int *dst_nom, int *dst_den, int64_t nom, int64_t den, int64_t max){
942 AVRational a0={0,1}, a1={1,0};
943 int sign= (nom<0) ^ (den<0);
944 int64_t gcd= ff_gcd(ABS(nom), ABS(den));
945
946 nom = ABS(nom)/gcd;
947 den = ABS(den)/gcd;
948 if(nom<=max && den<=max){
949 a1= (AVRational){nom, den};
950 den=0;
951 }
952
953 while(den){
954 int64_t x = nom / den;
955 int64_t next_den= nom - den*x;
956 int64_t a2n= x*a1.num + a0.num;
957 int64_t a2d= x*a1.den + a0.den;
958
959 if(a2n > max || a2d > max) break;
960
961 a0= a1;
962 a1= (AVRational){a2n, a2d};
963 nom= den;
964 den= next_den;
965 }
966 assert(ff_gcd(a1.num, a1.den) == 1);
967
968 *dst_nom = sign ? -a1.num : a1.num;
969 *dst_den = a1.den;
970
971 return den==0;
972 }
973
974 int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd){
975 AVInteger ai;
976 int64_t r=0;
977 assert(c > 0);
978 assert(b >=0);
979 assert(rnd >=0 && rnd<=5 && rnd!=4);
980
981 if(a<0 && a != INT64_MIN) return -av_rescale_rnd(-a, b, c, rnd ^ ((rnd>>1)&1));
982
983 if(rnd==AV_ROUND_NEAR_INF) r= c/2;
984 else if(rnd&1) r= c-1;
985
986 if(b<=INT_MAX && c<=INT_MAX){
987 if(a<=INT_MAX)
988 return (a * b + r)/c;
989 else
990 return a/c*b + (a%c*b + r)/c;
991 }
992
993 ai= av_mul_i(av_int2i(a), av_int2i(b));
994 ai= av_add_i(ai, av_int2i(r));
995
996 return av_i2int(av_div_i(ai, av_int2i(c)));
997 }
998
999 int64_t av_rescale(int64_t a, int64_t b, int64_t c){
1000 return av_rescale_rnd(a, b, c, AV_ROUND_NEAR_INF);
1001 }
1002
1003 int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq){
1004 int64_t b= bq.num * (int64_t)cq.den;
1005 int64_t c= cq.num * (int64_t)bq.den;
1006 return av_rescale_rnd(a, b, c, AV_ROUND_NEAR_INF);
1007 }
1008
1009 int64_t ff_gcd(int64_t a, int64_t b){
1010 if(b) return ff_gcd(b, a%b);
1011 else return a;
1012 }
1013
1014 double av_int2dbl(int64_t v){
1015 if(v+v > 0xFFELLU<<52)
1016 return 0.0/0.0;
1017 return ldexp(((v&(1LL<<52)-1) + (1LL<<52)) * (v>>63|1), (v>>52&0x7FF)-1075);
1018 }
1019
1020 float av_int2flt(int32_t v){
1021 if(v+v > 0xFF000000U)
1022 return 0.0/0.0;
1023 return ldexp(((v&0x7FFFFF) + (1<<23)) * (v>>31|1), (v>>23&0xFF)-150);
1024 }
1025
1026 int64_t av_dbl2int(double d){
1027 int e;
1028 if ( !d) return 0;
1029 else if(d-d) return 0x7FF0000000000000LL + ((int64_t)(d<0)<<63) + (d!=d);
1030 d= frexp(d, &e);
1031 return (int64_t)(d<0)<<63 | (e+1022LL)<<52 | (int64_t)((fabs(d)-0.5)*(1LL<<53));
1032 }
1033
1034 int32_t av_flt2int(float d){
1035 int e;
1036 if ( !d) return 0;
1037 else if(d-d) return 0x7F800000 + ((d<0)<<31) + (d!=d);
1038 d= frexp(d, &e);
1039 return (d<0)<<31 | (e+126)<<23 | (int64_t)((fabs(d)-0.5)*(1<<24));
1040 }
1041
1042 /* av_log API */ 923 /* av_log API */
1043 924
1044 static int av_log_level = AV_LOG_INFO; 925 static int av_log_level = AV_LOG_INFO;
1045 926
1046 static void av_log_default_callback(void* ptr, int level, const char* fmt, va_list vl) 927 static void av_log_default_callback(void* ptr, int level, const char* fmt, va_list vl)