Mercurial > libavutil.hg
changeset 983:eda110cd55c0 libavutil
get_generic_seed() for the cases without /dev/random and AV_READ_TIME
author | michael |
---|---|
date | Wed, 07 Jul 2010 23:47:48 +0000 |
parents | da1b5110dbd0 |
children | d7cafb07ae9f |
files | random_seed.c |
diffstat | 1 files changed, 34 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/random_seed.c Wed Jul 07 23:41:42 2010 +0000 +++ b/random_seed.c Wed Jul 07 23:47:48 2010 +0000 @@ -21,6 +21,7 @@ #include <unistd.h> #include <fcntl.h> #include "timer.h" +#include "time.h" #include "random_seed.h" #include "avutil.h" @@ -37,6 +38,38 @@ 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 @@ 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