--- libavutil/crc.c | 77 ++++++++++--------- libavutil/lfg.c | 35 +++++---- libavutil/log.c | 88 ++++++++++++---------- libavutil/random_seed.c | 36 +++++----- libavutil/rational.c | 114 +++++++++++++++------------- libavutil/tree.c | 194 +++++++++++++++++++++++++---------------------- 6 files changed, 292 insertions(+), 252 deletions(-)
diff --git a/libavutil/crc.c b/libavutil/crc.c index 44719ff..fadb05e 100644 --- a/libavutil/crc.c +++ b/libavutil/crc.c @@ -56,32 +56,34 @@ static AVCRC av_crc_table[AV_CRC_MAX][257]; * @param ctx_size size of ctx in bytes * @return <0 on failure */ -int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size){ +int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size) +{ unsigned i, j; uint32_t c; - if (bits < 8 || bits > 32 || poly >= (1LL<<bits)) + if (bits < 8 || bits > 32 || poly >= (1LL << bits)) return -1; - if (ctx_size != sizeof(AVCRC)*257 && ctx_size != sizeof(AVCRC)*1024) + if (ctx_size != sizeof(AVCRC) * 257 && ctx_size != sizeof(AVCRC) * 1024) return -1; for (i = 0; i < 256; i++) { if (le) { for (c = i, j = 0; j < 8; j++) - c = (c>>1)^(poly & (-(c&1))); + c = (c >> 1) ^(poly & (-(c&1))); ctx[i] = c; } else { for (c = i << 24, j = 0; j < 8; j++) - c = (c<<1) ^ ((poly<<(32-bits)) & (((int32_t)c)>>31) ); + c = (c << 1) ^((poly << (32-bits)) & (((int32_t)c) >> 31)); ctx[i] = av_bswap32(c); } } - ctx[256]=1; + ctx[256] = 1; #if !CONFIG_SMALL - if(ctx_size >= sizeof(AVCRC)*1024) + if (ctx_size >= sizeof(AVCRC) * 1024) for (i = 0; i < 256; i++) - for(j=0; j<3; j++) - ctx[256*(j+1) + i]= (ctx[256*j + i]>>8) ^ ctx[ ctx[256*j + i]&0xFF ]; + for (j = 0; j < 3; j++) + ctx[256 *(j + 1) + i] = (ctx[256 * j + i] >> 8) ^ctx[ + ctx[256 * j + i]&0xFF]; #endif return 0; @@ -92,15 +94,16 @@ int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size){ * @param crc_id ID of a standard CRC * @return a pointer to the CRC table or NULL on failure */ -const AVCRC *av_crc_get_table(AVCRCId crc_id){ +const AVCRC *av_crc_get_table(AVCRCId crc_id) +{ #if !CONFIG_HARDCODED_TABLES - if (!av_crc_table[crc_id][FF_ARRAY_ELEMS(av_crc_table[crc_id])-1]) + if (!av_crc_table[crc_id][FF_ARRAY_ELEMS(av_crc_table[crc_id]) - 1]) if (av_crc_init(av_crc_table[crc_id], av_crc_table_params[crc_id].le, av_crc_table_params[crc_id].bits, av_crc_table_params[crc_id].poly, - sizeof(av_crc_table[crc_id])) < 0) - return NULL; + sizeof(av_crc_table[crc_id])) < 0) + return NULL; #endif return av_crc_table[crc_id]; } @@ -112,46 +115,50 @@ const AVCRC *av_crc_get_table(AVCRCId crc_id){ * * @see av_crc_init() "le" parameter */ -uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length){ - const uint8_t *end= buffer+length; +uint32_t av_crc(const AVCRC *ctx, uint32_t crc, + const uint8_t *buffer, size_t length) +{ + const uint8_t *end = buffer + length; #if !CONFIG_SMALL - if(!ctx[256]) { - while(((intptr_t) buffer & 3) && buffer < end) - crc = ctx[((uint8_t)crc) ^ *buffer++] ^ (crc >> 8); + if (!ctx[256]) { + while (((intptr_t) buffer & 3) && buffer < end) + crc = ctx[((uint8_t)crc) ^ *buffer++] ^(crc >> 8); - while(buffer<end-3){ - crc ^= av_le2ne32(*(const uint32_t*)buffer); buffer+=4; - crc = ctx[3*256 + ( crc &0xFF)] - ^ctx[2*256 + ((crc>>8 )&0xFF)] - ^ctx[1*256 + ((crc>>16)&0xFF)] - ^ctx[0*256 + ((crc>>24) )]; + while (buffer < end - 3) { + crc ^= av_le2ne32(* (const uint32_t *) buffer); buffer += 4; + crc = ctx[3 * 256 + ( crc &0xFF)] + ^ctx[2 * 256 + ((crc >> 8 )&0xFF)] + ^ctx[1 * 256 + ((crc >> 16)&0xFF)] + ^ctx[0 * 256 + ((crc >> 24) )]; } } #endif - while(buffer<end) - crc = ctx[((uint8_t)crc) ^ *buffer++] ^ (crc >> 8); + while (buffer<end) + crc = ctx[((uint8_t)crc) ^ *buffer++] ^(crc >> 8); return crc; } #ifdef TEST #undef printf -int main(void){ +int main(void) +{ uint8_t buf[1999]; int i; - int p[4][3]={{AV_CRC_32_IEEE_LE, 0xEDB88320, 0x3D5CDD04}, - {AV_CRC_32_IEEE , 0x04C11DB7, 0xC0F5BAE0}, - {AV_CRC_16_ANSI , 0x8005, 0x1FBB }, - {AV_CRC_8_ATM , 0x07, 0xE3 },}; + int p[4][3] = { { AV_CRC_32_IEEE_LE, 0xEDB88320, 0x3D5CDD04 }, + { AV_CRC_32_IEEE , 0x04C11DB7, 0xC0F5BAE0 }, + { AV_CRC_16_ANSI , 0x8005 , 0x1FBB }, + { AV_CRC_8_ATM , 0x07 , 0xE3 } + }; const AVCRC *ctx; - for(i=0; i<sizeof(buf); i++) - buf[i]= i+i*i; + for (i = 0; i < sizeof(buf); i++) + buf[i] = i + i * i; - for(i=0; i<4; i++){ + for (i = 0; i < 4; i++){ ctx = av_crc_get_table(p[i][0]); - printf("crc %08X =%X\n", p[i][1], av_crc(ctx, 0, buf, sizeof(buf))); + printf("crc %08X = %X\n", p[i][1], av_crc(ctx, 0, buf, sizeof(buf))); } return 0; } diff --git a/libavutil/lfg.c b/libavutil/lfg.c index 7fab806..a6dfc3f 100644 --- a/libavutil/lfg.c +++ b/libavutil/lfg.c @@ -27,19 +27,20 @@ #include "intreadwrite.h" #include "attributes.h" -void av_cold av_lfg_init(AVLFG *c, unsigned int seed){ - uint8_t tmp[16]={0}; +void av_cold av_lfg_init(AVLFG *c, unsigned int seed) +{ + uint8_t tmp[16] = { 0 }; int i; - for(i=8; i<64; i+=4){ - AV_WL32(tmp, seed); tmp[4]=i; - av_md5_sum(tmp, tmp, 16); - c->state[i ]= AV_RL32(tmp); - c->state[i+1]= AV_RL32(tmp+4); - c->state[i+2]= AV_RL32(tmp+8); - c->state[i+3]= AV_RL32(tmp+12); + for(i = 8; i < 64; i += 4) { + AV_WL32(tmp, seed); tmp[4] = i; + av_md5_sum(tmp, tmp, 16); + c->state[i ] = AV_RL32(tmp); + c->state[i + 1] = AV_RL32(tmp + 4); + c->state[i + 2] = AV_RL32(tmp + 8); + c->state[i + 3] = AV_RL32(tmp + 12); } - c->index=0; + c->index = 0; } void av_bmg_get(AVLFG *lfg, double out[2]) @@ -47,9 +48,9 @@ void av_bmg_get(AVLFG *lfg, double out[2]) double x1, x2, w; do { - x1 = 2.0/UINT_MAX*av_lfg_get(lfg) - 1.0; - x2 = 2.0/UINT_MAX*av_lfg_get(lfg) - 1.0; - w = x1*x1 + x2*x2; + x1 = 2.0 / UINT_MAX * av_lfg_get(lfg) - 1.0; + x2 = 2.0 / UINT_MAX * av_lfg_get(lfg) - 1.0; + w = x1 * x1 + x2 * x2; } while (w >= 1.0); w = sqrt((-2.0 * log(w)) / w); @@ -61,9 +62,9 @@ void av_bmg_get(AVLFG *lfg, double out[2]) #include "log.h" #include "timer.h" -int main(void) +int main(void) { - int x=0; + int x = 0; int i, j; AVLFG state; @@ -71,8 +72,8 @@ int main(void) for (j = 0; j < 10000; j++) { START_TIMER for (i = 0; i < 624; i++) { -// av_log(NULL,AV_LOG_ERROR, "%X\n", av_lfg_get(&state)); - x+=av_lfg_get(&state); +// av_log(NULL,AV_LOG_ERROR, "%X\n", av_lfg_get(&state)); + x += av_lfg_get(&state); } STOP_TIMER("624 calls of av_lfg_get"); } diff --git a/libavutil/log.c b/libavutil/log.c index 4d2b539..1e2bfb8 100644 --- a/libavutil/log.c +++ b/libavutil/log.c @@ -35,129 +35,139 @@ static int flags; #if defined(_WIN32) && !defined(__MINGW32CE__) #include <windows.h> -static const uint8_t color[] = {12,12,12,14,7,7,7}; +static const uint8_t color[] = { 12, 12, 12, 14, 7, 7, 7 }; static int16_t background, attr_orig; static HANDLE con; #define set_color(x) SetConsoleTextAttribute(con, background | color[x]) #define reset_color() SetConsoleTextAttribute(con, attr_orig) #else -static const uint8_t color[]={0x41,0x41,0x11,0x03,9,9,9}; -#define set_color(x) fprintf(stderr, "\033[%d;3%dm", color[x]>>4, color[x]&15) +static const uint8_t color[] = { 0x41, 0x41, 0x11, 0x03, 9, 9, 9 }; +#define set_color(x) fprintf(stderr, "\033[%d;3%dm", color[x] >> 4, color[x]&15) #define reset_color() fprintf(stderr, "\033[0m") #endif -static int use_color=-1; +static int use_color =- 1; #undef fprintf -static void colored_fputs(int level, const char *str){ - if(use_color<0){ +static void colored_fputs(int level, const char *str) +{ + if (use_color < 0) { #if defined(_WIN32) && !defined(__MINGW32CE__) CONSOLE_SCREEN_BUFFER_INFO con_info; con = GetStdHandle(STD_ERROR_HANDLE); - use_color = (con != INVALID_HANDLE_VALUE) && !getenv("NO_COLOR") && !getenv("AV_LOG_FORCE_NOCOLOR"); + use_color = (con != INVALID_HANDLE_VALUE) && !getenv("NO_COLOR") + && !getenv("AV_LOG_FORCE_NOCOLOR"); if (use_color) { GetConsoleScreenBufferInfo(con, &con_info); attr_orig = con_info.wAttributes; background = attr_orig & 0xF0; } #elif HAVE_ISATTY - use_color= !getenv("NO_COLOR") && !getenv("AV_LOG_FORCE_NOCOLOR") && + use_color = !getenv("NO_COLOR") && !getenv("AV_LOG_FORCE_NOCOLOR") && (getenv("TERM") && isatty(2) || getenv("AV_LOG_FORCE_COLOR")); #else - use_color= getenv("AV_LOG_FORCE_COLOR") && !getenv("NO_COLOR") && !getenv("AV_LOG_FORCE_NOCOLOR"); + use_color = getenv("AV_LOG_FORCE_COLOR") && !getenv("NO_COLOR") + && !getenv("AV_LOG_FORCE_NOCOLOR"); #endif } - if(use_color){ + if (use_color) { set_color(level); } fputs(str, stderr); - if(use_color){ + if (use_color) { reset_color(); } } -const char* av_default_item_name(void* ptr){ - return (*(AVClass**)ptr)->class_name; +const char* av_default_item_name(void* ptr) +{ + return (* (AVClass**) ptr)->class_name; } void av_log_default_callback(void* ptr, int level, const char* fmt, va_list vl) { - static int print_prefix=1; + static int print_prefix = 1; static int count; static char prev[1024]; char line[1024]; static int is_atty; - AVClass* avc= ptr ? *(AVClass**)ptr : NULL; - if(level>av_log_level) + AVClass* avc = ptr ? *(AVClass**)ptr : NULL; + if (level>av_log_level) return; - line[0]=0; + line[0] = 0; #undef fprintf - if(print_prefix && avc) { + if (print_prefix && avc) { if (avc->parent_log_context_offset) { - AVClass** parent= *(AVClass***)(((uint8_t*)ptr) + avc->parent_log_context_offset); - if(parent && *parent){ - snprintf(line, sizeof(line), "[%s @ %p] ", (*parent)->item_name(parent), parent); + AVClass** parent = *(AVClass***)(( (uint8_t *) ptr) + + avc->parent_log_context_offset); + if (parent && *parent) { + snprintf(line, sizeof(line), "[%s @ %p] ", + ( *parent )->item_name(parent), parent); } } - snprintf(line + strlen(line), sizeof(line) - strlen(line), "[%s @ %p] ", avc->item_name(ptr), ptr); + snprintf(line + strlen(line), sizeof(line) - strlen(line), "[%s @ %p] ", + avc->item_name(ptr), ptr); } vsnprintf(line + strlen(line), sizeof(line) - strlen(line), fmt, vl); - print_prefix = strlen(line) && line[strlen(line)-1] == '\n'; + print_prefix = strlen(line) && line[strlen(line) - 1] == '\n'; #if HAVE_ISATTY - if(!is_atty) is_atty= isatty(2) ? 1 : -1; + if (!is_atty) is_atty= isatty(2) ? 1 : -1; #endif - if(print_prefix && (flags & AV_LOG_SKIP_REPEATED) && !strncmp(line, prev, sizeof line)){ + if (print_prefix && (flags & AV_LOG_SKIP_REPEATED) + && !strncmp(line, prev, sizeof line)) { count++; - if(is_atty==1) + if (is_atty == 1) fprintf(stderr, " Last message repeated %d times\r", count); return; } - if(count>0){ + if (count > 0) { fprintf(stderr, " Last message repeated %d times\n", count); - count=0; + count = 0; } - colored_fputs(av_clip(level>>3, 0, 6), line); + colored_fputs(av_clip(level >> 3, 0, 6), line); av_strlcpy(prev, line, sizeof line); } -static void (*av_log_callback)(void*, int, const char*, va_list) = av_log_default_callback; +static void ( *av_log_callback)(void* , int, const char* , va_list) + = av_log_default_callback; void av_log(void* avcl, int level, const char *fmt, ...) { - AVClass* avc= avcl ? *(AVClass**)avcl : NULL; + AVClass* avc = avcl ? *(AVClass**)avcl : NULL; va_list vl; va_start(vl, fmt); - if(avc && avc->version >= (50<<16 | 15<<8 | 2) && avc->log_level_offset_offset && level>=AV_LOG_FATAL) - level += *(int*)(((uint8_t*)avcl) + avc->log_level_offset_offset); + if (avc && avc->version >= (50 << 16 | 15 << 8 | 2) && + avc->log_level_offset_offset && level>=AV_LOG_FATAL) + level += *( int* )(( (uint8_t *) avcl) + avc->log_level_offset_offset); av_vlog(avcl, level, fmt, vl); va_end(vl); } -void av_vlog(void* avcl, int level, const char *fmt, va_list vl) +void av_vlog(void* avcl, int level, const char *fmt, va_list vl) { av_log_callback(avcl, level, fmt, vl); } -int av_log_get_level(void) +int av_log_get_level(void) { return av_log_level; } -void av_log_set_level(int level) +void av_log_set_level(int level) { av_log_level = level; } -void av_log_set_flags(int arg) +void av_log_set_flags(int arg) { - flags= arg; + flags = arg; } -void av_log_set_callback(void (*callback)(void*, int, const char*, va_list)) +void av_log_set_callback(void ( *callback )(void*, int, const char*, va_list)) { av_log_callback = callback; } diff --git a/libavutil/random_seed.c b/libavutil/random_seed.c index ee71542..8fc0cfb 100644 --- a/libavutil/random_seed.c +++ b/libavutil/random_seed.c @@ -25,39 +25,39 @@ #include "timer.h" #include "random_seed.h" -static int read_random(uint32_t *dst, const char *file) +static int read_random(uint32_t *dst, const char *file) { int fd = open(file, O_RDONLY); int err = -1; if (fd == -1) return -1; - err = read(fd, dst, sizeof(*dst)); + err = read(fd, dst, sizeof( *dst )); close(fd); return err; } -static uint32_t get_generic_seed(void) +static uint32_t get_generic_seed(void) { - clock_t last_t=0; - int bits=0; - uint64_t random=0; + clock_t last_t = 0; + int bits = 0; + uint64_t random = 0; unsigned i; - float s=0.000000000001; + float s = 0.000000000001; - for(i=0;bits<64;i++){ - clock_t t= clock(); - if(last_t && fabs(t-last_t)>s || t==(clock_t)-1){ - if(i<10000 && s<(1<<24)){ - s+=s; - i=t=0; - }else{ - random= 2*random + (i&1); + for (i = 0;bits < 64; i++) { + clock_t t = clock(); + if (last_t && fabs(t-last_t)>s || t == (clock_t) - 1) { + if (i < 10000 && s < (1 << 24)) { + s += s; + i = t = 0; + } else { + random = 2 * random + (i&1); bits++; } } - last_t= t; + last_t = t; } #ifdef AV_READ_TIME random ^= AV_READ_TIME(); @@ -65,12 +65,12 @@ static uint32_t get_generic_seed(void) random ^= clock(); #endif - random += random>>32; + random += random >> 32; return random; } -uint32_t av_get_random_seed(void) +uint32_t av_get_random_seed(void) { uint32_t seed; diff --git a/libavutil/rational.c b/libavutil/rational.c index ac5111b..89df749 100644 --- a/libavutil/rational.c +++ b/libavutil/rational.c @@ -33,75 +33,83 @@ #include "mathematics.h" #include "rational.h" -int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max){ - AVRational a0={0,1}, a1={1,0}; - int sign= (num<0) ^ (den<0); - int64_t gcd= av_gcd(FFABS(num), FFABS(den)); - - if(gcd){ - num = FFABS(num)/gcd; - den = FFABS(den)/gcd; +int av_reduce (int *dst_num, int *dst_den, + int64_t num, int64_t den, int64_t max) +{ + AVRational a0 = { 0, 1 }, a1 = { 1, 0 }; + int sign = (num < 0) ^ (den < 0); + int64_t gcd = av_gcd(FFABS(num), FFABS(den)); + + if (gcd) { + num = FFABS(num) / gcd; + den = FFABS(den) / gcd; } - if(num<=max && den<=max){ - a1= (AVRational){num, den}; - den=0; + if (num <= max && den <= max) { + a1 = (AVRational){ num, den }; + den = 0; } - while(den){ - uint64_t x = num / den; - int64_t next_den= num - den*x; - int64_t a2n= x*a1.num + a0.num; - int64_t a2d= x*a1.den + a0.den; + while (den) { + uint64_t x = num / den; + int64_t next_den = num - den * x; + int64_t a2n = x * a1.num + a0.num; + int64_t a2d = x * a1.den + a0.den; - if(a2n > max || a2d > max){ - if(a1.num) x= (max - a0.num) / a1.num; - if(a1.den) x= FFMIN(x, (max - a0.den) / a1.den); + if (a2n > max || a2d > max) { + if (a1.num) x = (max - a0.num) / a1.num; + if (a1.den) x = FFMIN(x, (max - a0.den) / a1.den); - if (den*(2*x*a1.den + a0.den) > num*a1.den) - a1 = (AVRational){x*a1.num + a0.num, x*a1.den + a0.den}; + if (den* (2 *x *a1.den + a0.den) > num *a1.den) + a1 = (AVRational){x * a1.num + a0.num, x * a1.den + a0.den}; break; } - a0= a1; - a1= (AVRational){a2n, a2d}; - num= den; - den= next_den; + a0 = a1; + a1 = (AVRational){ a2n, a2d }; + num = den; + den = next_den; } av_assert2(av_gcd(a1.num, a1.den) <= 1U); *dst_num = sign ? -a1.num : a1.num; *dst_den = a1.den; - return den==0; + return den == 0; } -AVRational av_mul_q(AVRational b, AVRational c){ - av_reduce(&b.num, &b.den, b.num * (int64_t)c.num, b.den * (int64_t)c.den, INT_MAX); +AVRational av_mul_q(AVRational b, AVRational c) +{ + av_reduce(&b.num, &b.den, b.num * + (int64_t)c.num, b.den * (int64_t)c.den, INT_MAX); return b; } -AVRational av_div_q(AVRational b, AVRational c){ - return av_mul_q(b, (AVRational){c.den, c.num}); +AVRational av_div_q(AVRational b, AVRational c) +{ + return av_mul_q(b, (AVRational){ c.den, c.num }); } -AVRational av_add_q(AVRational b, AVRational c){ - 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); +AVRational av_add_q(AVRational b, AVRational c) { + 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); return b; } -AVRational av_sub_q(AVRational b, AVRational c){ - return av_add_q(b, (AVRational){-c.num, c.den}); +AVRational av_sub_q(AVRational b, AVRational c) +{ + return av_add_q(b, (AVRational){ -c.num, c.den }); } -AVRational av_d2q(double d, int max){ +AVRational av_d2q(double d, int max) +{ AVRational a; #define LOG2 0.69314718055994530941723212145817656807550013436025 int exponent; int64_t den; if (isnan(d)) - return (AVRational){0,0}; + return (AVRational){ 0,0 }; if (isinf(d)) - return (AVRational){ d<0 ? -1:1, 0 }; + return (AVRational){ d<0 ? -1 : 1, 0 }; exponent = FFMAX( (int)(log(fabs(d) + 1e-20)/LOG2), 0); den = 1LL << (61 - exponent); av_reduce(&a.num, &a.den, (int64_t)(d * den + 0.5), den, max); @@ -109,7 +117,7 @@ AVRational av_d2q(double d, int max){ return a; } -int av_nearer_q(AVRational q, AVRational q1, AVRational q2) +int av_nearer_q(AVRational q, AVRational q1, AVRational q2) { /* n/d is q, a/b is the median between q1 and q2 */ int64_t a = q1.num * (int64_t)q2.den + q2.num * (int64_t)q1.den; @@ -124,30 +132,32 @@ int av_nearer_q(AVRational q, AVRational q1, AVRational q2) return ((x_up > q.num) - (x_down < q.num)) * av_cmp_q(q2, q1); } -int av_find_nearest_q_idx(AVRational q, const AVRational* q_list) +int av_find_nearest_q_idx(AVRational q, const AVRational* q_list) { int i, nearest_q_idx = 0; - for(i=0; q_list[i].den; i++) - if (av_nearer_q(q, q_list[i], q_list[nearest_q_idx]) > 0) + for(i = 0; q_list[i].den; i++) + if (av_nearer_q(q, q_list[i], q_list[nearest_q_idx]) > 0)f nearest_q_idx = i; return nearest_q_idx; } #ifdef TEST -int main(void) +int main(void) { AVRational a,b; - for(a.num=-2; a.num<=2; a.num++){ - for(a.den=-2; a.den<=2; a.den++){ - for(b.num=-2; b.num<=2; b.num++){ - for(b.den=-2; b.den<=2; b.den++){ - int c= av_cmp_q(a,b); - double d= av_q2d(a) == av_q2d(b) ? 0 : (av_q2d(a) - av_q2d(b)); - if(d>0) d=1; - else if(d<0) d=-1; - else if(d != d) d= INT_MIN; - if(c!=d) av_log(0, AV_LOG_ERROR, "%d/%d %d/%d, %d %f\n", a.num, a.den, b.num, b.den, c,d); + for (a.num = -2; a.num <= 2; a.num++) { + for (a.den = -2; a.den <= 2; a.den++) { + for (b.num = -2; b.num <= 2; b.num++) { + for (b.den = -2; b.den <=2 ; b.den++) { + int c = av_cmp_q(a,b); + double d = av_q2d(a) == av_q2d(b) ? 0 : + (av_q2d(a) - av_q2d(b)); + if (d > 0) d = 1; + else if (d < 0) d = -1; + else if (d != d) d = INT_MIN; + if (c != d) av_log(0, AV_LOG_ERROR, "%d/%d %d/%d, %d %f\n", + a.num, a.den, b.num, b.den, c,d); } } } diff --git a/libavutil/tree.c b/libavutil/tree.c index 067e5b0..7a8eab0 100644 --- a/libavutil/tree.c +++ b/libavutil/tree.c @@ -21,24 +21,26 @@ #include "log.h" #include "tree.h" -typedef struct AVTreeNode{ +typedef struct AVTreeNode { struct AVTreeNode *child[2]; void *elem; int state; -}AVTreeNode; +} AVTreeNode; const int av_tree_node_size = sizeof(AVTreeNode); -void *av_tree_find(const AVTreeNode *t, void *key, int (*cmp)(void *key, const void *b), void *next[2]){ - if(t){ - unsigned int v= cmp(key, t->elem); - if(v){ - if(next) next[v>>31]= t->elem; - return av_tree_find(t->child[(v>>31)^1], key, cmp, next); - }else{ - if(next){ - av_tree_find(t->child[0], key, cmp, next); - av_tree_find(t->child[1], key, cmp, next); +void *av_tree_find(const AVTreeNode *t, void *key, int ( *cmp )(void *key, + const void *b), void *next[2]) +{ + if (t) { + unsigned int v = cmp(key, t->elem); + if (v) { + if (next) next[v >> 31] = t->elem; + return av_tree_find(t->child[(v >> 31) ^ 1], key, cmp, next); + } else { + if (next) { + av_tree_find (t->child[0], key, cmp, next); + av_tree_find (t->child[1], key, cmp, next); } return t->elem; } @@ -46,34 +48,36 @@ void *av_tree_find(const AVTreeNode *t, void *key, int (*cmp)(void *key, const v return NULL; } -void *av_tree_insert(AVTreeNode **tp, void *key, int (*cmp)(void *key, const void *b), AVTreeNode **next){ - AVTreeNode *t= *tp; - if(t){ - unsigned int v= cmp(t->elem, key); +void *av_tree_insert(AVTreeNode **tp, void *key, int (*cmp)(void *key, + const void *b), AVTreeNode **next) +{ + AVTreeNode *t = *tp; + if (t) { + unsigned int v = cmp(t->elem, key); void *ret; - if(!v){ - if(*next) + if (!v) { + if (*next) return t->elem; - else if(t->child[0]||t->child[1]){ - int i= !t->child[0]; + else if (t->child[0] || t->child[1]){ + int i = !t->child[0]; void *next_elem[2]; av_tree_find(t->child[i], key, cmp, next_elem); - key= t->elem= next_elem[i]; - v= -i; - }else{ - *next= t; - *tp=NULL; + key = t->elem = next_elem[i]; + v = -i; + } else { + *next = t; + *tp = NULL; return NULL; } } - ret= av_tree_insert(&t->child[v>>31], key, cmp, next); - if(!ret){ - int i= (v>>31) ^ !!*next; - AVTreeNode **child= &t->child[i]; - t->state += 2*i - 1; - - if(!(t->state&1)){ - if(t->state){ + ret = av_tree_insert(&t->child[v >> 31], key, cmp, next); + if (!ret) { + int i = (v >> 31) ^ !! *next; + AVTreeNode **child = &t->child[i]; + t->state += 2 * i - 1; + + if (!(t->state&1)) { + if (t->state) { /* The following code is equivalent to if((*child)->state*2 == -t->state) rotate(child, i^1); @@ -92,54 +96,58 @@ void *av_tree_insert(AVTreeNode **tp, void *key, int (*cmp)(void *key, const voi } but such a rotate function is both bigger and slower */ - if((*child)->state*2 == -t->state){ - *tp= (*child)->child[i^1]; - (*child)->child[i^1]= (*tp)->child[i]; - (*tp)->child[i]= *child; - *child= (*tp)->child[i^1]; - (*tp)->child[i^1]= t; - - (*tp)->child[0]->state= -((*tp)->state>0); - (*tp)->child[1]->state= (*tp)->state<0 ; - (*tp)->state=0; - }else{ - *tp= *child; - *child= (*child)->child[i^1]; - (*tp)->child[i^1]= t; - if((*tp)->state) t->state = 0; - else t->state>>= 1; - (*tp)->state= -t->state; + if ((*child)->state * 2 == -t->state) { + *tp = ( *child )->child[i ^ 1]; + ( *child )->child[i ^ 1] = ( *tp )->child[i]; + ( *tp )->child[i] = *child; + *child = ( *tp )->child[i ^ 1]; + ( *tp )->child[i ^ 1] = t; + + ( *tp )->child[0]->state = -(( * tp)->state > 0); + ( *tp )->child[1]->state = ( * tp)->state < 0; + ( *tp )->state = 0; + } else { + *tp = *child; + *child = ( *child )->child[i ^ 1]; + ( *tp )->child[i ^ 1] = t; + if (( *tp )->state) t->state = 0; + else t->state >> = 1; + ( *tp )->state = -t->state; } } } - if(!(*tp)->state ^ !!*next) + if (!( *tp )->state ^ !!*next) return key; } return ret; - }else{ - *tp= *next; *next= NULL; - if(*tp){ - (*tp)->elem= key; + } else { + *tp = *next; + *next = NULL; + if ( *tp ) { + ( *tp )->elem = key; return NULL; - }else + } else return key; } } -void av_tree_destroy(AVTreeNode *t){ - if(t){ +void av_tree_destroy(AVTreeNode *t) +{ + if (t) { av_tree_destroy(t->child[0]); av_tree_destroy(t->child[1]); av_free(t); } } -void av_tree_enumerate(AVTreeNode *t, void *opaque, int (*cmp)(void *opaque, void *elem), int (*enu)(void *opaque, void *elem)){ - if(t){ - int v= cmp ? cmp(opaque, t->elem) : 0; - if(v>=0) av_tree_enumerate(t->child[0], opaque, cmp, enu); - if(v==0) enu(opaque, t->elem); - if(v<=0) av_tree_enumerate(t->child[1], opaque, cmp, enu); +void av_tree_enumerate(AVTreeNode *t, void *opaque, int ( *cmp )(void *opaque, + void *elem), int ( *enu )(void *opaque, void *elem)) +{ + if (t) { + int v = cmp ? cmp(opaque, t->elem) : 0; + if (v >= 0) av_tree_enumerate(t->child[0], opaque, cmp, enu); + if (v == 0) enu(opaque, t->elem); + if (v<=0) av_tree_enumerate(t->child[1], opaque, cmp, enu); } } @@ -147,64 +155,68 @@ void av_tree_enumerate(AVTreeNode *t, void *opaque, int (*cmp)(void *opaque, voi #include "lfg.h" -static int check(AVTreeNode *t){ - if(t){ - int left= check(t->child[0]); - int right= check(t->child[1]); +static int check(AVTreeNode *t) +{ + if (t) { + int left = check(t->child[0]); + int right = check(t->child[1]); - if(left>999 || right>999) + if (left>999 || right>999) return 1000; - if(right - left != t->state) + if (right - left != t->state) return 1000; - if(t->state>1 || t->state<-1) + if (t->state>1 || t->state<-1) return 1000; - return FFMAX(left, right)+1; + return FFMAX(left, right) + 1; } return 0; } -static void print(AVTreeNode *t, int depth){ +static void print(AVTreeNode *t, int depth) +{ int i; - for(i=0; i<depth*4; i++) av_log(NULL, AV_LOG_ERROR, " "); - if(t){ + for (i = 0; i < depth * 4; i++) av_log(NULL, AV_LOG_ERROR, " "); + if (t) { av_log(NULL, AV_LOG_ERROR, "Node %p %2d %p\n", t, t->state, t->elem); - print(t->child[0], depth+1); - print(t->child[1], depth+1); - }else + print(t->child[0], depth + 1); + print(t->child[1], depth + 1); + } else av_log(NULL, AV_LOG_ERROR, "NULL\n"); } -static int cmp(void *a, const void *b){ - return (uint8_t*)a-(const uint8_t*)b; +static int cmp(void *a, const void *b) +{ + return ( uint8_t* )a - ( const uint8_t* )b; } -int main(void){ +int main (void) +{ int i; void *k; - AVTreeNode *root= NULL, *node=NULL; + AVTreeNode *root = NULL, *node = NULL; AVLFG prng; av_lfg_init(&prng, 1); - for(i=0; i<10000; i++){ + for (i = 0; i < 10000; i++) { int j = av_lfg_get(&prng) % 86294; - if(check(root) > 999){ + if (check(root) > 999) { av_log(NULL, AV_LOG_ERROR, "FATAL error %d\n", i); print(root, 0); return -1; } av_log(NULL, AV_LOG_ERROR, "inserting %4d\n", j); - if(!node) - node= av_mallocz(av_tree_node_size); - av_tree_insert(&root, (void*)(j+1), cmp, &node); + if (!node) + node = av_mallocz(av_tree_node_size); + av_tree_insert(&root, ( void* )(j + 1), cmp, &node); j = av_lfg_get(&prng) % 86294; { - AVTreeNode *node2=NULL; + AVTreeNode *node2 = NULL; av_log(NULL, AV_LOG_ERROR, "removing %4d\n", j); - av_tree_insert(&root, (void*)(j+1), cmp, &node2); - k= av_tree_find(root, (void*)(j+1), cmp, NULL); - if(k) + av_tree_insert(&root, (void*)(j + 1), cmp, &node2); + k = av_tree_find(root, (void*)(j + 1), cmp, NULL); + if (k) av_log(NULL, AV_LOG_ERROR, "removal failure %d\n", i); } } -- 1.7.1 _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel