diff --git a/libavutil/random_seed.c b/libavutil/random_seed.c index 86c60f3838..f8e7f83d3c 100644 --- a/libavutil/random_seed.c +++ b/libavutil/random_seed.c @@ -21,6 +21,7 @@ #include #include #include "timer.h" +#include "time.h" #include "random_seed.h" #include "avutil.h" @@ -37,6 +38,38 @@ static int read_random(uint32_t *dst, const char *file) return err; } +static uint32_t get_generic_seed(void) +{ + int last_t=0; + int bits=0; + uint64_t random=0; + int i; + int s=0; + + for(i=0;bits<64;i++){ + int t= clock()>>s; + if(last_t && t != last_t){ + if(i<10000U && s<24){ + s++; + i=t=0; + }else{ + random= 2*random + (i&1); + bits++; + } + } + last_t= t; + } +#ifdef AV_READ_TIME + random ^= AV_READ_TIME(); +#else + random ^= clock(); +#endif + + random += random>>32; + + return random; +} + uint32_t av_get_random_seed(void) { uint32_t seed; @@ -45,12 +78,7 @@ uint32_t av_get_random_seed(void) return seed; if (read_random(&seed, "/dev/random") == sizeof(seed)) return seed; - -#ifdef AV_READ_TIME - seed = AV_READ_TIME(); -#endif - // XXX what to do ? - return seed; + return get_generic_seed(); } #if LIBAVUTIL_VERSION_MAJOR < 51