Browse code

drawtext: introduce rand(min, max)

Signed-off-by: Luca Barbato <lu_zero@gentoo.org>

Luca Barbato authored on 2011/12/05 08:56:21
Showing 1 changed files
... ...
@@ -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]);