/src/ffmpeg/libavutil/lfg.h
Line | Count | Source |
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 | | #ifndef AVUTIL_LFG_H |
23 | | #define AVUTIL_LFG_H |
24 | | |
25 | | #include <stdint.h> |
26 | | |
27 | | /** |
28 | | * Context structure for the Lagged Fibonacci PRNG. |
29 | | * The exact layout, types and content of this struct may change and should |
30 | | * not be accessed directly. Only its `sizeof()` is guaranteed to stay the same |
31 | | * to allow easy instantiation. |
32 | | */ |
33 | | typedef struct AVLFG { |
34 | | unsigned int state[64]; |
35 | | int index; |
36 | | } AVLFG; |
37 | | |
38 | | void av_lfg_init(AVLFG *c, unsigned int seed); |
39 | | |
40 | | /** |
41 | | * Seed the state of the ALFG using binary data. |
42 | | * |
43 | | * @return 0 on success, negative value (AVERROR) on failure. |
44 | | */ |
45 | | int av_lfg_init_from_data(AVLFG *c, const uint8_t *data, unsigned int length); |
46 | | |
47 | | /** |
48 | | * Get the next random unsigned 32-bit number using an ALFG. |
49 | | * |
50 | | * Please also consider a simple LCG like state= state*1664525+1013904223, |
51 | | * it may be good enough and faster for your specific use case. |
52 | | */ |
53 | 375M | static inline unsigned int av_lfg_get(AVLFG *c){ |
54 | 375M | unsigned a = c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63]; |
55 | 375M | c->index += 1U; |
56 | 375M | return a; |
57 | 375M | } Unexecuted instantiation: atrac9dec.c:av_lfg_get Line | Count | Source | 53 | 2.06M | static inline unsigned int av_lfg_get(AVLFG *c){ | 54 | 2.06M | unsigned a = c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63]; | 55 | 2.06M | c->index += 1U; | 56 | 2.06M | return a; | 57 | 2.06M | } |
ac3dec_float.c:av_lfg_get Line | Count | Source | 53 | 50.3M | static inline unsigned int av_lfg_get(AVLFG *c){ | 54 | 50.3M | unsigned a = c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63]; | 55 | 50.3M | c->index += 1U; | 56 | 50.3M | return a; | 57 | 50.3M | } |
Line | Count | Source | 53 | 3.60M | static inline unsigned int av_lfg_get(AVLFG *c){ | 54 | 3.60M | unsigned a = c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63]; | 55 | 3.60M | c->index += 1U; | 56 | 3.60M | return a; | 57 | 3.60M | } |
Unexecuted instantiation: mpc.c:av_lfg_get Unexecuted instantiation: cinepakenc.c:av_lfg_get Line | Count | Source | 53 | 7.62M | static inline unsigned int av_lfg_get(AVLFG *c){ | 54 | 7.62M | unsigned a = c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63]; | 55 | 7.62M | c->index += 1U; | 56 | 7.62M | return a; | 57 | 7.62M | } |
Unexecuted instantiation: roqvideoenc.c:av_lfg_get nellymoserdec.c:av_lfg_get Line | Count | Source | 53 | 42.7M | static inline unsigned int av_lfg_get(AVLFG *c){ | 54 | 42.7M | unsigned a = c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63]; | 55 | 42.7M | c->index += 1U; | 56 | 42.7M | return a; | 57 | 42.7M | } |
Line | Count | Source | 53 | 2.98M | static inline unsigned int av_lfg_get(AVLFG *c){ | 54 | 2.98M | unsigned a = c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63]; | 55 | 2.98M | c->index += 1U; | 56 | 2.98M | return a; | 57 | 2.98M | } |
Unexecuted instantiation: a64multienc.c:av_lfg_get Unexecuted instantiation: msvideo1enc.c:av_lfg_get Line | Count | Source | 53 | 129M | static inline unsigned int av_lfg_get(AVLFG *c){ | 54 | 129M | unsigned a = c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63]; | 55 | 129M | c->index += 1U; | 56 | 129M | return a; | 57 | 129M | } |
ac3dec_fixed.c:av_lfg_get Line | Count | Source | 53 | 32.4M | static inline unsigned int av_lfg_get(AVLFG *c){ | 54 | 32.4M | unsigned a = c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63]; | 55 | 32.4M | c->index += 1U; | 56 | 32.4M | return a; | 57 | 32.4M | } |
Line | Count | Source | 53 | 49.4M | static inline unsigned int av_lfg_get(AVLFG *c){ | 54 | 49.4M | unsigned a = c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63]; | 55 | 49.4M | c->index += 1U; | 56 | 49.4M | return a; | 57 | 49.4M | } |
Line | Count | Source | 53 | 54.3M | static inline unsigned int av_lfg_get(AVLFG *c){ | 54 | 54.3M | unsigned a = c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63]; | 55 | 54.3M | c->index += 1U; | 56 | 54.3M | return a; | 57 | 54.3M | } |
|
58 | | |
59 | | /** |
60 | | * Get the next random unsigned 32-bit number using a MLFG. |
61 | | * |
62 | | * Please also consider av_lfg_get() above, it is faster. |
63 | | */ |
64 | 0 | static inline unsigned int av_mlfg_get(AVLFG *c){ |
65 | 0 | unsigned int a= c->state[(c->index-55) & 63]; |
66 | 0 | unsigned int b= c->state[(c->index-24) & 63]; |
67 | 0 | a = c->state[c->index & 63] = 2*a*b+a+b; |
68 | 0 | c->index += 1U; |
69 | 0 | return a; |
70 | 0 | } Unexecuted instantiation: atrac9dec.c:av_mlfg_get Unexecuted instantiation: lfg.c:av_mlfg_get Unexecuted instantiation: ac3dec_float.c:av_mlfg_get Unexecuted instantiation: mpc8.c:av_mlfg_get Unexecuted instantiation: mpc.c:av_mlfg_get Unexecuted instantiation: cinepakenc.c:av_mlfg_get Unexecuted instantiation: elbg.c:av_mlfg_get Unexecuted instantiation: roqvideoenc.c:av_mlfg_get Unexecuted instantiation: nellymoserdec.c:av_mlfg_get Unexecuted instantiation: mpc7.c:av_mlfg_get Unexecuted instantiation: a64multienc.c:av_mlfg_get Unexecuted instantiation: msvideo1enc.c:av_mlfg_get Unexecuted instantiation: cngdec.c:av_mlfg_get Unexecuted instantiation: ac3dec_fixed.c:av_mlfg_get Unexecuted instantiation: amrwbdec.c:av_mlfg_get Unexecuted instantiation: cook.c:av_mlfg_get |
71 | | |
72 | | /** |
73 | | * Get the next two numbers generated by a Box-Muller Gaussian |
74 | | * generator using the random numbers issued by lfg. |
75 | | * |
76 | | * @param lfg pointer to the context structure |
77 | | * @param out array where the two generated numbers are placed |
78 | | */ |
79 | | void av_bmg_get(AVLFG *lfg, double out[2]); |
80 | | |
81 | | #endif /* AVUTIL_LFG_H */ |