annotate lfg.h @ 822:a1680eca3e52 libavutil

DECLARE_ALIGNED macro for TMS470 compiler This compiler supports gcc-style alignment attributes for struct, but not for global variables. For the latter, alignment can be specified with a pragma, which does not work for struct members or local variables. By using both pragma and attribute, one or the other will always take effect. Unfortunately, no means exists for aligning stack variables.
author mru
date Fri, 22 Jan 2010 03:25:25 +0000
parents 41da9d9d39b7
children e34e8d654ded
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
533
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
1 /*
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
2 * Lagged Fibonacci PRNG
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
3 * Copyright (c) 2008 Michael Niedermayer
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
4 *
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
5 * This file is part of FFmpeg.
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
6 *
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
11 *
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
15 * Lesser General Public License for more details.
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
16 *
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
20 */
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
21
567
bd4052d9050c Globally rename the header inclusion guard names.
stefano
parents: 538
diff changeset
22 #ifndef AVUTIL_LFG_H
bd4052d9050c Globally rename the header inclusion guard names.
stefano
parents: 538
diff changeset
23 #define AVUTIL_LFG_H
533
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
24
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
25 typedef struct {
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
26 unsigned int state[64];
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
27 int index;
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
28 } AVLFG;
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
29
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
30 void av_lfg_init(AVLFG *c, unsigned int seed);
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
31
535
4ea718352036 Document av_lfg_get().
michael
parents: 533
diff changeset
32 /**
633
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 567
diff changeset
33 * Gets the next random unsigned 32-bit number using an ALFG.
535
4ea718352036 Document av_lfg_get().
michael
parents: 533
diff changeset
34 *
4ea718352036 Document av_lfg_get().
michael
parents: 533
diff changeset
35 * Please also consider a simple LCG like state= state*1664525+1013904223,
4ea718352036 Document av_lfg_get().
michael
parents: 533
diff changeset
36 * it may be good enough and faster for your specific use case.
4ea718352036 Document av_lfg_get().
michael
parents: 533
diff changeset
37 */
533
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
38 static inline unsigned int av_lfg_get(AVLFG *c){
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
39 c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63];
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
40 return c->state[c->index++ & 63];
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
41 }
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
42
537
2862fa9da110 Add a multiplicative LFG for those thinking the additive is not good
michael
parents: 535
diff changeset
43 /**
633
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 567
diff changeset
44 * Gets the next random unsigned 32-bit number using a MLFG.
537
2862fa9da110 Add a multiplicative LFG for those thinking the additive is not good
michael
parents: 535
diff changeset
45 *
633
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 567
diff changeset
46 * Please also consider av_lfg_get() above, it is faster.
537
2862fa9da110 Add a multiplicative LFG for those thinking the additive is not good
michael
parents: 535
diff changeset
47 */
2862fa9da110 Add a multiplicative LFG for those thinking the additive is not good
michael
parents: 535
diff changeset
48 static inline unsigned int av_mlfg_get(AVLFG *c){
2862fa9da110 Add a multiplicative LFG for those thinking the additive is not good
michael
parents: 535
diff changeset
49 unsigned int a= c->state[(c->index-55) & 63];
2862fa9da110 Add a multiplicative LFG for those thinking the additive is not good
michael
parents: 535
diff changeset
50 unsigned int b= c->state[(c->index-24) & 63];
538
cdbdd48471aa 1000l typo my new PRNG converged to -1.
michael
parents: 537
diff changeset
51 return c->state[c->index++ & 63] = 2*a*b+a+b;
537
2862fa9da110 Add a multiplicative LFG for those thinking the additive is not good
michael
parents: 535
diff changeset
52 }
2862fa9da110 Add a multiplicative LFG for those thinking the additive is not good
michael
parents: 535
diff changeset
53
798
41da9d9d39b7 Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents: 633
diff changeset
54 /**
41da9d9d39b7 Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents: 633
diff changeset
55 * Gets the next two numbers generated by a Box-Muller Gaussian
41da9d9d39b7 Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents: 633
diff changeset
56 * generator using the random numbers issued by lfg.
41da9d9d39b7 Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents: 633
diff changeset
57 *
41da9d9d39b7 Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents: 633
diff changeset
58 * @param out[2] array where are placed the two generated numbers
41da9d9d39b7 Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents: 633
diff changeset
59 */
41da9d9d39b7 Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents: 633
diff changeset
60 void av_bmg_get(AVLFG *lfg, double out[2]);
41da9d9d39b7 Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents: 633
diff changeset
61
567
bd4052d9050c Globally rename the header inclusion guard names.
stefano
parents: 538
diff changeset
62 #endif /* AVUTIL_LFG_H */