Mercurial > libavutil.hg
annotate lfg.c @ 1028:5dbb12a37c3d libavutil tip
Move av_set_options_string() from libavfilter to libavutil.
author | stefano |
---|---|
date | Mon, 27 Sep 2010 22:09:53 +0000 |
parents | 3d83c38f150e |
children |
rev | line source |
---|---|
533 | 1 /* |
2 * Lagged Fibonacci PRNG | |
3 * Copyright (c) 2008 Michael Niedermayer | |
4 * | |
5 * This file is part of FFmpeg. | |
6 * | |
7 * FFmpeg is free software; you can redistribute it and/or | |
8 * modify it under the terms of the GNU Lesser General Public | |
9 * License as published by the Free Software Foundation; either | |
10 * version 2.1 of the License, or (at your option) any later version. | |
11 * | |
12 * FFmpeg is distributed in the hope that it will be useful, | |
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
18 * License along with FFmpeg; if not, write to the Free Software | |
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
20 */ | |
21 | |
22 #include <inttypes.h> | |
990 | 23 #include <limits.h> |
24 #include <math.h> | |
533 | 25 #include "lfg.h" |
26 #include "md5.h" | |
27 #include "intreadwrite.h" | |
873
4d9ad0ed07d0
Replace many includes of libavutil/common.h with what is actually needed
mru
parents:
798
diff
changeset
|
28 #include "attributes.h" |
533 | 29 |
30 void av_cold av_lfg_init(AVLFG *c, unsigned int seed){ | |
31 uint8_t tmp[16]={0}; | |
32 int i; | |
33 | |
34 for(i=8; i<64; i+=4){ | |
35 AV_WL32(tmp, seed); tmp[4]=i; | |
36 av_md5_sum(tmp, tmp, 16); | |
37 c->state[i ]= AV_RL32(tmp); | |
38 c->state[i+1]= AV_RL32(tmp+4); | |
39 c->state[i+2]= AV_RL32(tmp+8); | |
40 c->state[i+3]= AV_RL32(tmp+12); | |
41 } | |
42 c->index=0; | |
43 } | |
44 | |
798
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
45 void av_bmg_get(AVLFG *lfg, double out[2]) |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
46 { |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
47 double x1, x2, w; |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
48 |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
49 do { |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
50 x1 = 2.0/UINT_MAX*av_lfg_get(lfg) - 1.0; |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
51 x2 = 2.0/UINT_MAX*av_lfg_get(lfg) - 1.0; |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
52 w = x1*x1 + x2*x2; |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
53 } while (w >= 1.0); |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
54 |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
55 w = sqrt((-2.0 * log(w)) / w); |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
56 out[0] = x1 * w; |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
57 out[1] = x2 * w; |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
58 } |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
59 |
533 | 60 #ifdef TEST |
61 #include "log.h" | |
873
4d9ad0ed07d0
Replace many includes of libavutil/common.h with what is actually needed
mru
parents:
798
diff
changeset
|
62 #include "timer.h" |
533 | 63 |
64 int main(void) | |
65 { | |
66 int x=0; | |
67 int i, j; | |
68 AVLFG state; | |
69 | |
70 av_lfg_init(&state, 0xdeadbeef); | |
71 for (j = 0; j < 10000; j++) { | |
72 START_TIMER | |
73 for (i = 0; i < 624; i++) { | |
74 // av_log(NULL,AV_LOG_ERROR, "%X\n", av_lfg_get(&state)); | |
75 x+=av_lfg_get(&state); | |
76 } | |
702
ef2c3d23d344
Fix reference to av_random where av_lfg_get was meant.
diego
parents:
533
diff
changeset
|
77 STOP_TIMER("624 calls of av_lfg_get"); |
533 | 78 } |
79 av_log(NULL, AV_LOG_ERROR, "final value:%X\n", x); | |
798
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
80 |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
81 /* BMG usage example */ |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
82 { |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
83 double mean = 1000; |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
84 double stddev = 53; |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
85 |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
86 av_lfg_init(&state, 42); |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
87 |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
88 for (i = 0; i < 1000; i += 2) { |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
89 double bmg_out[2]; |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
90 av_bmg_get(&state, bmg_out); |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
91 av_log(NULL, AV_LOG_INFO, |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
92 "%f\n%f\n", |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
93 bmg_out[0] * stddev + mean, |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
94 bmg_out[1] * stddev + mean); |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
95 } |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
96 } |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
97 |
533 | 98 return 0; |
99 } | |
100 #endif |