annotate random_seed.c @ 992:a13125b5be3a libavutil

bswap: change ME to NE in macro names Other parts of FFmpeg use NE (native endian) rather than ME (machine). This makes it consistent.
author mru
date Sat, 10 Jul 2010 22:09:01 +0000
parents 093c69c7b752
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
678
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
1 /*
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
2 * Copyright (c) 2009 Baptiste Coudurier <baptiste.coudurier@gmail.com>
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
3 *
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
4 * This file is part of FFmpeg.
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
5 *
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
6 * FFmpeg is free software; you can redistribute it and/or
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
8 * License as published by the Free Software Foundation; either
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
9 * version 2.1 of the License, or (at your option) any later version.
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
10 *
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
11 * FFmpeg is distributed in the hope that it will be useful,
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
14 * Lesser General Public License for more details.
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
15 *
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
17 * License along with FFmpeg; if not, write to the Free Software
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
19 */
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
20
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
21 #include <unistd.h>
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
22 #include <fcntl.h>
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
23 #include "timer.h"
983
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
24 #include "time.h"
678
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
25 #include "random_seed.h"
925
1ff442f2660c Make ff_random_get_seed public, rename to av_get_random_seed, export the header
mstorsjo
parents: 876
diff changeset
26 #include "avutil.h"
678
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
27
956
2894d4c208dc Make av_get_random_seed() non-blocking
mru
parents: 925
diff changeset
28 static int read_random(uint32_t *dst, const char *file)
2894d4c208dc Make av_get_random_seed() non-blocking
mru
parents: 925
diff changeset
29 {
2894d4c208dc Make av_get_random_seed() non-blocking
mru
parents: 925
diff changeset
30 int fd = open(file, O_RDONLY);
2894d4c208dc Make av_get_random_seed() non-blocking
mru
parents: 925
diff changeset
31 int err = -1;
2894d4c208dc Make av_get_random_seed() non-blocking
mru
parents: 925
diff changeset
32
2894d4c208dc Make av_get_random_seed() non-blocking
mru
parents: 925
diff changeset
33 if (fd == -1)
2894d4c208dc Make av_get_random_seed() non-blocking
mru
parents: 925
diff changeset
34 return -1;
965
2acd85ae41ca Reindent
mru
parents: 964
diff changeset
35 err = read(fd, dst, sizeof(*dst));
956
2894d4c208dc Make av_get_random_seed() non-blocking
mru
parents: 925
diff changeset
36 close(fd);
2894d4c208dc Make av_get_random_seed() non-blocking
mru
parents: 925
diff changeset
37
2894d4c208dc Make av_get_random_seed() non-blocking
mru
parents: 925
diff changeset
38 return err;
2894d4c208dc Make av_get_random_seed() non-blocking
mru
parents: 925
diff changeset
39 }
2894d4c208dc Make av_get_random_seed() non-blocking
mru
parents: 925
diff changeset
40
983
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
41 static uint32_t get_generic_seed(void)
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
42 {
986
093c69c7b752 Fix infinite loop with clock() returning (clock_t)-1.
michael
parents: 985
diff changeset
43 clock_t last_t=0;
983
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
44 int bits=0;
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
45 uint64_t random=0;
985
e6d6b3506d76 Change i to unsigned in get_generic_seed()
michael
parents: 983
diff changeset
46 unsigned i;
986
093c69c7b752 Fix infinite loop with clock() returning (clock_t)-1.
michael
parents: 985
diff changeset
47 float s=0.000000000001;
983
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
48
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
49 for(i=0;bits<64;i++){
986
093c69c7b752 Fix infinite loop with clock() returning (clock_t)-1.
michael
parents: 985
diff changeset
50 clock_t t= clock();
093c69c7b752 Fix infinite loop with clock() returning (clock_t)-1.
michael
parents: 985
diff changeset
51 if(last_t && fabs(t-last_t)>s || t==(clock_t)-1){
093c69c7b752 Fix infinite loop with clock() returning (clock_t)-1.
michael
parents: 985
diff changeset
52 if(i<10000 && s<(1<<24)){
093c69c7b752 Fix infinite loop with clock() returning (clock_t)-1.
michael
parents: 985
diff changeset
53 s+=s;
983
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
54 i=t=0;
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
55 }else{
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
56 random= 2*random + (i&1);
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
57 bits++;
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
58 }
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
59 }
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
60 last_t= t;
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
61 }
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
62 #ifdef AV_READ_TIME
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
63 random ^= AV_READ_TIME();
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
64 #else
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
65 random ^= clock();
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
66 #endif
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
67
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
68 random += random>>32;
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
69
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
70 return random;
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
71 }
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
72
925
1ff442f2660c Make ff_random_get_seed public, rename to av_get_random_seed, export the header
mstorsjo
parents: 876
diff changeset
73 uint32_t av_get_random_seed(void)
678
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
74 {
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
75 uint32_t seed;
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
76
966
53644f5cd2f9 random_seed: simplify
mru
parents: 965
diff changeset
77 if (read_random(&seed, "/dev/urandom") == sizeof(seed))
53644f5cd2f9 random_seed: simplify
mru
parents: 965
diff changeset
78 return seed;
53644f5cd2f9 random_seed: simplify
mru
parents: 965
diff changeset
79 if (read_random(&seed, "/dev/random") == sizeof(seed))
956
2894d4c208dc Make av_get_random_seed() non-blocking
mru
parents: 925
diff changeset
80 return seed;
983
eda110cd55c0 get_generic_seed() for the cases without /dev/random and AV_READ_TIME
michael
parents: 966
diff changeset
81 return get_generic_seed();
678
bcd0e6fe83d8 add ff_random_get_seed to be used in conjunction with random functions
bcoudurier
parents:
diff changeset
82 }
925
1ff442f2660c Make ff_random_get_seed public, rename to av_get_random_seed, export the header
mstorsjo
parents: 876
diff changeset
83
1ff442f2660c Make ff_random_get_seed public, rename to av_get_random_seed, export the header
mstorsjo
parents: 876
diff changeset
84 #if LIBAVUTIL_VERSION_MAJOR < 51
1ff442f2660c Make ff_random_get_seed public, rename to av_get_random_seed, export the header
mstorsjo
parents: 876
diff changeset
85 attribute_deprecated uint32_t ff_random_get_seed(void);
1ff442f2660c Make ff_random_get_seed public, rename to av_get_random_seed, export the header
mstorsjo
parents: 876
diff changeset
86 uint32_t ff_random_get_seed(void)
1ff442f2660c Make ff_random_get_seed public, rename to av_get_random_seed, export the header
mstorsjo
parents: 876
diff changeset
87 {
1ff442f2660c Make ff_random_get_seed public, rename to av_get_random_seed, export the header
mstorsjo
parents: 876
diff changeset
88 return av_get_random_seed();
1ff442f2660c Make ff_random_get_seed public, rename to av_get_random_seed, export the header
mstorsjo
parents: 876
diff changeset
89 }
1ff442f2660c Make ff_random_get_seed public, rename to av_get_random_seed, export the header
mstorsjo
parents: 876
diff changeset
90 #endif