Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
Luca Barbato authored on 2011/12/05 08:56:21... | ... |
@@ -34,9 +34,11 @@ |
34 | 34 |
#include "libavutil/eval.h" |
35 | 35 |
#include "libavutil/opt.h" |
36 | 36 |
#include "libavutil/mathematics.h" |
37 |
+#include "libavutil/random_seed.h" |
|
37 | 38 |
#include "libavutil/parseutils.h" |
38 | 39 |
#include "libavutil/pixdesc.h" |
39 | 40 |
#include "libavutil/tree.h" |
41 |
+#include "libavutil/lfg.h" |
|
40 | 42 |
#include "avfilter.h" |
41 | 43 |
#include "drawutils.h" |
42 | 44 |
|
... | ... |
@@ -62,6 +64,22 @@ static const char *var_names[] = { |
62 | 62 |
NULL |
63 | 63 |
}; |
64 | 64 |
|
65 |
+static const char *fun2_names[] = { |
|
66 |
+ "rand", |
|
67 |
+}; |
|
68 |
+ |
|
69 |
+static double drand(void *opaque, double min, double max) |
|
70 |
+{ |
|
71 |
+ return val = min + (max-min) / UINT_MAX * av_lfg_get(opaque); |
|
72 |
+} |
|
73 |
+ |
|
74 |
+typedef double (*eval_func2)(void *, double a, double b); |
|
75 |
+ |
|
76 |
+static const eval_func2 fun2[] = { |
|
77 |
+ drand, |
|
78 |
+ NULL |
|
79 |
+}; |
|
80 |
+ |
|
65 | 81 |
enum var_name { |
66 | 82 |
VAR_E, |
67 | 83 |
VAR_PHI, |
... | ... |
@@ -119,6 +137,7 @@ typedef struct { |
119 | 119 |
char *d_expr; |
120 | 120 |
AVExpr *d_pexpr; |
121 | 121 |
int draw; ///< set to zero to prevent drawing |
122 |
+ AVLFG prng; ///< random |
|
122 | 123 |
} DrawTextContext; |
123 | 124 |
|
124 | 125 |
#define OFFSET(x) offsetof(DrawTextContext, x) |
... | ... |
@@ -559,13 +578,14 @@ static int config_input(AVFilterLink *inlink) |
559 | 559 |
dtext->var_values[VAR_N] = 0; |
560 | 560 |
dtext->var_values[VAR_T] = NAN; |
561 | 561 |
|
562 |
+ av_lfg_init(&dtext->prng, av_get_random_seed()); |
|
562 | 563 |
|
563 | 564 |
if ((ret = av_expr_parse(&dtext->x_pexpr, dtext->x_expr, var_names, |
564 |
- NULL, NULL, NULL, NULL, 0, ctx)) < 0 || |
|
565 |
+ NULL, NULL, fun2_names, fun2, 0, ctx)) < 0 || |
|
565 | 566 |
(ret = av_expr_parse(&dtext->y_pexpr, dtext->y_expr, var_names, |
566 |
- NULL, NULL, NULL, NULL, 0, ctx)) < 0 || |
|
567 |
+ NULL, NULL, fun2_names, fun2, 0, ctx)) < 0 || |
|
567 | 568 |
(ret = av_expr_parse(&dtext->d_pexpr, dtext->d_expr, var_names, |
568 |
- NULL, NULL, NULL, NULL, 0, ctx)) < 0) |
|
569 |
+ NULL, NULL, fun2_names, fun2, 0, ctx)) < 0) |
|
569 | 570 |
return AVERROR(EINVAL); |
570 | 571 |
|
571 | 572 |
if ((ret = |
... | ... |
@@ -792,14 +812,14 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref) |
792 | 792 |
dtext->var_values[VAR_T] = inpicref->pts == AV_NOPTS_VALUE ? |
793 | 793 |
NAN : inpicref->pts * av_q2d(inlink->time_base); |
794 | 794 |
dtext->var_values[VAR_X] = |
795 |
- av_expr_eval(dtext->x_pexpr, dtext->var_values, NULL); |
|
795 |
+ av_expr_eval(dtext->x_pexpr, dtext->var_values, &dtext->prng); |
|
796 | 796 |
dtext->var_values[VAR_Y] = |
797 |
- av_expr_eval(dtext->y_pexpr, dtext->var_values, NULL); |
|
797 |
+ av_expr_eval(dtext->y_pexpr, dtext->var_values, &dtext->prng); |
|
798 | 798 |
dtext->var_values[VAR_X] = |
799 |
- av_expr_eval(dtext->x_pexpr, dtext->var_values, NULL); |
|
799 |
+ av_expr_eval(dtext->x_pexpr, dtext->var_values, &dtext->prng); |
|
800 | 800 |
|
801 | 801 |
dtext->draw = fail ? 0 : |
802 |
- av_expr_eval(dtext->d_pexpr, dtext->var_values, NULL); |
|
802 |
+ av_expr_eval(dtext->d_pexpr, dtext->var_values, &dtext->prng); |
|
803 | 803 |
|
804 | 804 |
normalize_double(&dtext->x, dtext->var_values[VAR_X]); |
805 | 805 |
normalize_double(&dtext->y, dtext->var_values[VAR_Y]); |