diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2011-12-08 00:23:37 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2011-12-08 00:23:37 +0100 |
commit | 8e2bab5d4bddb4029503c0f90623854948ddb3c5 (patch) | |
tree | 33a095ce0e92ed353c96c9b25b746ee45a2a00c7 /libavfilter | |
parent | 7023fb81c78e10a6a7af6e6bc8902f99da81c458 (diff) | |
parent | 78212cefe14a2086dc1ea3778b76623b949e5d0c (diff) | |
download | ffmpeg-8e2bab5d4bddb4029503c0f90623854948ddb3c5.tar.gz |
Merge remote-tracking branch 'qatar/master'
* qatar/master:
drawtext: remove typo
pcm-mpeg: implement new audio decoding api
w32thread: port fixes to pthread_cond_broadcast() from x264.
doc: add editor configuration section with Vim and Emacs settings
dxva2.h: include d3d9.h to define LPDIRECT3DSURFACE9
avformat/utils: Drop unused goto label.
doxygen: Replace '\' by '@' in Doxygen markup tags.
cosmetics: drop some completely pointless parentheses
cljr: simplify CLJRContext
drawtext: introduce rand(min, max)
drawtext: introduce explicit draw/hide variable
rtmp: Use nb_invokes for all invoke commands
Conflicts:
libavcodec/mpegvideo.c
libavfilter/vf_drawtext.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavfilter')
-rw-r--r-- | libavfilter/vf_drawtext.c | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/libavfilter/vf_drawtext.c b/libavfilter/vf_drawtext.c index 900c803d5f..912a8547bb 100644 --- a/libavfilter/vf_drawtext.c +++ b/libavfilter/vf_drawtext.c @@ -33,9 +33,11 @@ #include "libavutil/file.h" #include "libavutil/eval.h" #include "libavutil/opt.h" +#include "libavutil/random_seed.h" #include "libavutil/parseutils.h" #include "libavutil/pixdesc.h" #include "libavutil/tree.h" +#include "libavutil/lfg.h" #include "avfilter.h" #include "drawutils.h" @@ -67,6 +69,22 @@ static const char * const var_names[] = { NULL }; +static const char *fun2_names[] = { + "rand", +}; + +static double drand(void *opaque, double min, double max) +{ + return 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 { VAR_MAIN_W, VAR_w, VAR_W, VAR_MAIN_H, VAR_h, VAR_H, @@ -132,6 +150,10 @@ typedef struct { AVExpr *x_pexpr, *y_pexpr; ///< parsed expressions for x and y int64_t basetime; ///< base pts time in the real world for display double var_values[VAR_VARS_NB]; + char *d_expr; + AVExpr *d_pexpr; + int draw; ///< set to zero to prevent drawing + AVLFG prng; ///< random } DrawTextContext; #define OFFSET(x) offsetof(DrawTextContext, x) @@ -151,7 +173,7 @@ static const AVOption drawtext_options[]= { {"shadowy", "set y", OFFSET(shadowy), AV_OPT_TYPE_INT, {.dbl=0}, INT_MIN, INT_MAX }, {"tabsize", "set tab size", OFFSET(tabsize), AV_OPT_TYPE_INT, {.dbl=4}, 0, INT_MAX }, {"basetime", "set base time", OFFSET(basetime), AV_OPT_TYPE_INT64, {.dbl=AV_NOPTS_VALUE}, INT64_MIN, INT64_MAX }, - +{"draw", "if false do not draw", OFFSET(d_expr), AV_OPT_TYPE_STRING, {.str="1"}, CHAR_MIN, CHAR_MAX }, /* FT_LOAD_* flags */ {"ft_load_flags", "set font loading flags for libfreetype", OFFSET(ft_load_flags), AV_OPT_TYPE_FLAGS, {.dbl=FT_LOAD_DEFAULT|FT_LOAD_RENDER}, 0, INT_MAX, 0, "ft_load_flags" }, @@ -470,10 +492,15 @@ static int config_input(AVFilterLink *inlink) dtext->var_values[VAR_N] = 0; 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, - 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, - 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, + NULL, NULL, fun2_names, fun2, 0, ctx)) < 0) + return AVERROR(EINVAL); return 0; @@ -761,9 +788,13 @@ static int draw_text(AVFilterContext *ctx, AVFilterBufferRef *picref, dtext->var_values[VAR_LINE_H] = dtext->var_values[VAR_LH] = dtext->max_glyph_h; - dtext->x = dtext->var_values[VAR_X] = av_expr_eval(dtext->x_pexpr, dtext->var_values, NULL); - dtext->y = dtext->var_values[VAR_Y] = av_expr_eval(dtext->y_pexpr, dtext->var_values, NULL); - dtext->x = dtext->var_values[VAR_X] = av_expr_eval(dtext->x_pexpr, dtext->var_values, NULL); + dtext->x = dtext->var_values[VAR_X] = av_expr_eval(dtext->x_pexpr, dtext->var_values, &dtext->prng); + dtext->y = dtext->var_values[VAR_Y] = av_expr_eval(dtext->y_pexpr, dtext->var_values, &dtext->prng); + dtext->x = dtext->var_values[VAR_X] = av_expr_eval(dtext->x_pexpr, dtext->var_values, &dtext->prng); + dtext->draw = av_expr_eval(dtext->d_pexpr, dtext->var_values, &dtext->prng); + + if(!dtext->draw) + return 0; dtext->x &= ~((1 << dtext->hsub) - 1); dtext->y &= ~((1 << dtext->vsub) - 1); |