mirror of https://git.ffmpeg.org/ffmpeg.git
drawtext: introduce rand(min, max)
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
This commit is contained in:
parent
73585620b8
commit
f5edfc9e92
|
@ -34,9 +34,11 @@
|
||||||
#include "libavutil/eval.h"
|
#include "libavutil/eval.h"
|
||||||
#include "libavutil/opt.h"
|
#include "libavutil/opt.h"
|
||||||
#include "libavutil/mathematics.h"
|
#include "libavutil/mathematics.h"
|
||||||
|
#include "libavutil/random_seed.h"
|
||||||
#include "libavutil/parseutils.h"
|
#include "libavutil/parseutils.h"
|
||||||
#include "libavutil/pixdesc.h"
|
#include "libavutil/pixdesc.h"
|
||||||
#include "libavutil/tree.h"
|
#include "libavutil/tree.h"
|
||||||
|
#include "libavutil/lfg.h"
|
||||||
#include "avfilter.h"
|
#include "avfilter.h"
|
||||||
#include "drawutils.h"
|
#include "drawutils.h"
|
||||||
|
|
||||||
|
@ -62,6 +64,22 @@ static const char *var_names[] = {
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const char *fun2_names[] = {
|
||||||
|
"rand",
|
||||||
|
};
|
||||||
|
|
||||||
|
static double drand(void *opaque, double min, double max)
|
||||||
|
{
|
||||||
|
return val = min + (max-min) / UINT_MAX * av_lfg_get(opaque);
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef double (*eval_func2)(void *, double a, double b);
|
||||||
|
|
||||||
|
static const eval_func2 fun2[] = {
|
||||||
|
drand,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
enum var_name {
|
enum var_name {
|
||||||
VAR_E,
|
VAR_E,
|
||||||
VAR_PHI,
|
VAR_PHI,
|
||||||
|
@ -119,6 +137,7 @@ typedef struct {
|
||||||
char *d_expr;
|
char *d_expr;
|
||||||
AVExpr *d_pexpr;
|
AVExpr *d_pexpr;
|
||||||
int draw; ///< set to zero to prevent drawing
|
int draw; ///< set to zero to prevent drawing
|
||||||
|
AVLFG prng; ///< random
|
||||||
} DrawTextContext;
|
} DrawTextContext;
|
||||||
|
|
||||||
#define OFFSET(x) offsetof(DrawTextContext, x)
|
#define OFFSET(x) offsetof(DrawTextContext, x)
|
||||||
|
@ -559,13 +578,14 @@ static int config_input(AVFilterLink *inlink)
|
||||||
dtext->var_values[VAR_N] = 0;
|
dtext->var_values[VAR_N] = 0;
|
||||||
dtext->var_values[VAR_T] = NAN;
|
dtext->var_values[VAR_T] = NAN;
|
||||||
|
|
||||||
|
av_lfg_init(&dtext->prng, av_get_random_seed());
|
||||||
|
|
||||||
if ((ret = av_expr_parse(&dtext->x_pexpr, dtext->x_expr, var_names,
|
if ((ret = av_expr_parse(&dtext->x_pexpr, dtext->x_expr, var_names,
|
||||||
NULL, NULL, NULL, NULL, 0, ctx)) < 0 ||
|
NULL, NULL, fun2_names, fun2, 0, ctx)) < 0 ||
|
||||||
(ret = av_expr_parse(&dtext->y_pexpr, dtext->y_expr, var_names,
|
(ret = av_expr_parse(&dtext->y_pexpr, dtext->y_expr, var_names,
|
||||||
NULL, NULL, NULL, NULL, 0, ctx)) < 0 ||
|
NULL, NULL, fun2_names, fun2, 0, ctx)) < 0 ||
|
||||||
(ret = av_expr_parse(&dtext->d_pexpr, dtext->d_expr, var_names,
|
(ret = av_expr_parse(&dtext->d_pexpr, dtext->d_expr, var_names,
|
||||||
NULL, NULL, NULL, NULL, 0, ctx)) < 0)
|
NULL, NULL, fun2_names, fun2, 0, ctx)) < 0)
|
||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
|
|
||||||
if ((ret =
|
if ((ret =
|
||||||
|
@ -792,14 +812,14 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
|
||||||
dtext->var_values[VAR_T] = inpicref->pts == AV_NOPTS_VALUE ?
|
dtext->var_values[VAR_T] = inpicref->pts == AV_NOPTS_VALUE ?
|
||||||
NAN : inpicref->pts * av_q2d(inlink->time_base);
|
NAN : inpicref->pts * av_q2d(inlink->time_base);
|
||||||
dtext->var_values[VAR_X] =
|
dtext->var_values[VAR_X] =
|
||||||
av_expr_eval(dtext->x_pexpr, dtext->var_values, NULL);
|
av_expr_eval(dtext->x_pexpr, dtext->var_values, &dtext->prng);
|
||||||
dtext->var_values[VAR_Y] =
|
dtext->var_values[VAR_Y] =
|
||||||
av_expr_eval(dtext->y_pexpr, dtext->var_values, NULL);
|
av_expr_eval(dtext->y_pexpr, dtext->var_values, &dtext->prng);
|
||||||
dtext->var_values[VAR_X] =
|
dtext->var_values[VAR_X] =
|
||||||
av_expr_eval(dtext->x_pexpr, dtext->var_values, NULL);
|
av_expr_eval(dtext->x_pexpr, dtext->var_values, &dtext->prng);
|
||||||
|
|
||||||
dtext->draw = fail ? 0 :
|
dtext->draw = fail ? 0 :
|
||||||
av_expr_eval(dtext->d_pexpr, dtext->var_values, NULL);
|
av_expr_eval(dtext->d_pexpr, dtext->var_values, &dtext->prng);
|
||||||
|
|
||||||
normalize_double(&dtext->x, dtext->var_values[VAR_X]);
|
normalize_double(&dtext->x, dtext->var_values[VAR_X]);
|
||||||
normalize_double(&dtext->y, dtext->var_values[VAR_Y]);
|
normalize_double(&dtext->y, dtext->var_values[VAR_Y]);
|
||||||
|
|
Loading…
Reference in New Issue