FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavutil
lfg.c
Go to the documentation of this file.
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>
23
#include <
limits.h
>
24
#include <math.h>
25
#include "
lfg.h
"
26
#include "
md5.h
"
27
#include "
intreadwrite.h
"
28
#include "
attributes.h
"
29
30
av_cold
void
av_lfg_init
(
AVLFG
*
c
,
unsigned
int
seed
)
31
{
32
uint8_t
tmp[16] = { 0 };
33
int
i
;
34
35
for
(i = 8; i < 64; i += 4) {
36
AV_WL32
(tmp, seed);
37
tmp[4] =
i
;
38
av_md5_sum
(tmp, tmp, 16);
39
c->
state
[
i
] =
AV_RL32
(tmp);
40
c->
state
[i + 1] =
AV_RL32
(tmp + 4);
41
c->
state
[i + 2] =
AV_RL32
(tmp + 8);
42
c->
state
[i + 3] =
AV_RL32
(tmp + 12);
43
}
44
c->
index
= 0;
45
}
46
47
void
av_bmg_get
(
AVLFG
*lfg,
double
out
[2])
48
{
49
double
x1, x2, w;
50
51
do
{
52
x1 = 2.0 / UINT_MAX *
av_lfg_get
(lfg) - 1.0;
53
x2 = 2.0 / UINT_MAX *
av_lfg_get
(lfg) - 1.0;
54
w = x1 * x1 + x2 * x2;
55
}
while
(w >= 1.0);
56
57
w = sqrt((-2.0 * log(w)) / w);
58
out[0] = x1 * w;
59
out[1] = x2 * w;
60
}
61
62
#ifdef TEST
63
#include "
log.h
"
64
#include "timer.h"
65
66
int
main
(
void
)
67
{
68
int
x = 0;
69
int
i
, j;
70
AVLFG
state
;
71
72
av_lfg_init
(&state, 0xdeadbeef);
73
for
(j = 0; j < 10000; j++) {
74
START_TIMER
75
for
(i = 0; i < 624; i++) {
76
//av_log(NULL, AV_LOG_ERROR, "%X\n", av_lfg_get(&state));
77
x +=
av_lfg_get
(&state);
78
}
79
STOP_TIMER
(
"624 calls of av_lfg_get"
);
80
}
81
av_log
(
NULL
,
AV_LOG_ERROR
,
"final value:%X\n"
, x);
82
83
/* BMG usage example */
84
{
85
double
mean = 1000;
86
double
stddev = 53;
87
88
av_lfg_init
(&state, 42);
89
90
for
(i = 0; i < 1000; i += 2) {
91
double
bmg_out[2];
92
av_bmg_get
(&state, bmg_out);
93
av_log
(
NULL
,
AV_LOG_INFO
,
94
"%f\n%f\n"
,
95
bmg_out[0] * stddev + mean,
96
bmg_out[1] * stddev + mean);
97
}
98
}
99
100
return
0;
101
}
102
#endif
AVLFG
Definition:
lfg.h:25
NULL
#define NULL
Definition:
coverity.c:32
AVLFG::index
int index
Definition:
lfg.h:27
av_intfloat64::i
uint64_t i
Definition:
intfloat.h:33
attributes.h
Macro definitions for various function/variable attributes.
uint8_t
uint8_t
Definition:
audio_convert.c:194
av_cold
#define av_cold
Definition:
attributes.h:82
av_md5_sum
void av_md5_sum(uint8_t *dst, const uint8_t *src, const int len)
Hash an array of data.
Definition:
md5.c:198
av_bmg_get
void av_bmg_get(AVLFG *lfg, double out[2])
Get the next two numbers generated by a Box-Muller Gaussian generator using the random numbers issued...
Definition:
lfg.c:47
av_log
#define av_log(a,...)
Definition:
tableprint_vlc.h:28
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition:
log.h:176
intreadwrite.h
lfg.h
out
FILE * out
Definition:
movenc-test.c:54
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition:
log.h:187
START_TIMER
#define START_TIMER
Definition:
timer.h:94
seed
static unsigned int seed
Definition:
videogen.c:78
av_lfg_get
static unsigned int av_lfg_get(AVLFG *c)
Get the next random unsigned 32-bit number using an ALFG.
Definition:
lfg.h:38
av_lfg_init
av_cold void av_lfg_init(AVLFG *c, unsigned int seed)
Definition:
lfg.c:30
limits.h
AVLFG::state
unsigned int state[64]
Definition:
lfg.h:26
c
static double c[64]
Definition:
vsrc_mptestsrc.c:87
STOP_TIMER
#define STOP_TIMER(id)
Definition:
timer.h:95
log.h
md5.h
state
static struct @205 state
main
int main(int argc, char **argv)
Definition:
main.c:22
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition:
bytestream.h:87
AV_WL32
#define AV_WL32(p, v)
Definition:
intreadwrite.h:426
Generated on Mon Feb 15 2016 15:20:47 for FFmpeg by
1.8.6