## ffmpeg / libavutil / random.h @ 0b006599

History | View | Annotate | Download (2.35 KB)

1 | fbabf1e0 | Michael Niedermayer | ```
/*
``` |
---|---|---|---|

2 | ```
* Mersenne Twister Random Algorithm
``` |
||

3 | ```
* Copyright (c) 2006 Ryan Martell.
``` |
||

4 | ```
* Based on A C-program for MT19937, with initialization improved 2002/1/26. Coded by
``` |
||

5 | ```
* Takuji Nishimura and Makoto Matsumoto.
``` |
||

6 | ```
*
``` |
||

7 | ```
* This file is part of FFmpeg.
``` |
||

8 | ```
*
``` |
||

9 | ```
* FFmpeg is free software; you can redistribute it and/or
``` |
||

10 | ```
* modify it under the terms of the GNU Lesser General Public
``` |
||

11 | ```
* License as published by the Free Software Foundation; either
``` |
||

12 | ```
* version 2.1 of the License, or (at your option) any later version.
``` |
||

13 | ```
*
``` |
||

14 | ```
* FFmpeg is distributed in the hope that it will be useful,
``` |
||

15 | ```
* but WITHOUT ANY WARRANTY; without even the implied warranty of
``` |
||

16 | ```
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
``` |
||

17 | ```
* Lesser General Public License for more details.
``` |
||

18 | ```
*
``` |
||

19 | ```
* You should have received a copy of the GNU Lesser General Public
``` |
||

20 | ```
* License along with FFmpeg; if not, write to the Free Software
``` |
||

21 | ```
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
``` |
||

22 | ```
*/
``` |
||

23 | |||

24 | ```
#ifndef AV_RANDOM_H
``` |
||

25 | ```
#define AV_RANDOM_H
``` |
||

26 | |||

27 | #define AV_RANDOM_N 624 |
||

28 | |||

29 | typedef struct { |
||

30 | unsigned int mt[AV_RANDOM_N]; ///< the array for the state vector |
||

31 | int index; ///< current untempered value we use as the base. |
||

32 | } AVRandomState; |
||

33 | |||

34 | |||

35 | void av_init_random(unsigned int seed, AVRandomState *state); ///< to be inlined, the struct must be visible, so it doesn't make sense to try and keep it opaque with malloc/free like calls |
||

36 | void av_random_generate_untempered_numbers(AVRandomState *state); ///< Regenerate the untempered numbers (must be done every 624 iterations, or it will loop) |
||

37 | |||

38 | ```
/** generates a random number on [0,0xffffffff]-interval */
``` |
||

39 | static inline unsigned int av_random(AVRandomState *state) |
||

40 | { |
||

41 | unsigned int y; |
||

42 | |||

43 | ```
// regenerate the untempered numbers if we should...
``` |
||

44 | ```
if (state->index >= AV_RANDOM_N)
``` |
||

45 | av_random_generate_untempered_numbers(state); |
||

46 | |||

47 | ```
// grab one...
``` |
||

48 | y = state->mt[state->index++]; |
||

49 | |||

50 | ```
/* Now temper (Mersenne Twister coefficients) The coefficients for MT19937 are.. */
``` |
||

51 | ```
y ^= (y >> 11);
``` |
||

52 | y ^= (y << 7) & 0x9d2c5680; |
||

53 | y ^= (y << 15) & 0xefc60000; |
||

54 | ```
y ^= (y >> 18);
``` |
||

55 | |||

56 | ```
return y;
``` |
||

57 | } |
||

58 | |||

59 | ```
/** return random in range [0-1] as double */
``` |
||

60 | static inline double av_random_real1(AVRandomState *state) |
||

61 | { |
||

62 | ```
/* divided by 2^32-1 */
``` |
||

63 | return av_random(state) * (1.0 / 4294967296.0); |
||

64 | } |
||

65 | |||

66 | ```
// only available if DEBUG is defined in the .c file
``` |
||

67 | void av_benchmark_random(void); |
||

68 | #endif // AV_RANDOM_H |