* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include "config.h"
+
+#if HAVE_UNISTD_H
#include <unistd.h>
+#endif
+#if HAVE_CRYPTGENRANDOM
+#include <windows.h>
+#include <wincrypt.h>
+#endif
#include <fcntl.h>
+#include <math.h>
+#include <time.h>
#include "timer.h"
-#include "time.h"
#include "random_seed.h"
-#include "avutil.h"
static int read_random(uint32_t *dst, const char *file)
{
+#if HAVE_UNISTD_H
int fd = open(file, O_RDONLY);
int err = -1;
close(fd);
return err;
+#else
+ return -1;
+#endif
}
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();
random ^= clock();
#endif
- random += random>>32;
+ random += random >> 32;
return random;
}
{
uint32_t seed;
+#if HAVE_CRYPTGENRANDOM
+ HCRYPTPROV provider;
+ if (CryptAcquireContext(&provider, NULL, NULL, PROV_RSA_FULL,
+ CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) {
+ BOOL ret = CryptGenRandom(provider, sizeof(seed), (PBYTE) &seed);
+ CryptReleaseContext(provider, 0);
+ if (ret)
+ return seed;
+ }
+#endif
+
if (read_random(&seed, "/dev/urandom") == sizeof(seed))
return seed;
if (read_random(&seed, "/dev/random") == sizeof(seed))
return seed;
return get_generic_seed();
}
-
-#if LIBAVUTIL_VERSION_MAJOR < 51
-attribute_deprecated uint32_t ff_random_get_seed(void);
-uint32_t ff_random_get_seed(void)
-{
- return av_get_random_seed();
-}
-#endif