lavfi/drawtext: add support to expansion of generic expressions
This commit is contained in:
		
							parent
							
								
									2cfa6fd025
								
							
						
					
					
						commit
						2ac6a3d1bf
					
				| @ -2075,6 +2075,16 @@ The following functions are available: | |||||||
| 
 | 
 | ||||||
| @table @command | @table @command | ||||||
| 
 | 
 | ||||||
|  | @item expr, e | ||||||
|  | The expression evaluation result. | ||||||
|  | 
 | ||||||
|  | It must take one argument specifying the expression to be evaluated, | ||||||
|  | which accepts the same constants and functions as the @var{x} and | ||||||
|  | @var{y} values. Note that not all constants should be used, for | ||||||
|  | example the text size is not known when evaluating the expression, so | ||||||
|  | the constants @var{text_w} and @var{text_h} will have an undefined | ||||||
|  | value. | ||||||
|  | 
 | ||||||
| @item gmtime | @item gmtime | ||||||
| The time at which the filter is running, expressed in UTC. | The time at which the filter is running, expressed in UTC. | ||||||
| It can accept an argument: a strftime() format string. | It can accept an argument: a strftime() format string. | ||||||
|  | |||||||
| @ -30,7 +30,7 @@ | |||||||
| 
 | 
 | ||||||
| #define LIBAVFILTER_VERSION_MAJOR  3 | #define LIBAVFILTER_VERSION_MAJOR  3 | ||||||
| #define LIBAVFILTER_VERSION_MINOR  23 | #define LIBAVFILTER_VERSION_MINOR  23 | ||||||
| #define LIBAVFILTER_VERSION_MICRO 103 | #define LIBAVFILTER_VERSION_MICRO 104 | ||||||
| 
 | 
 | ||||||
| #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ | #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ | ||||||
|                                                LIBAVFILTER_VERSION_MINOR, \ |                                                LIBAVFILTER_VERSION_MINOR, \ | ||||||
|  | |||||||
| @ -643,12 +643,34 @@ static int func_strftime(AVFilterContext *ctx, AVBPrint *bp, | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static int func_eval_expr(AVFilterContext *ctx, AVBPrint *bp, | ||||||
|  |                           char *fct, unsigned argc, char **argv, int tag) | ||||||
|  | { | ||||||
|  |     DrawTextContext *dtext = ctx->priv; | ||||||
|  |     double res; | ||||||
|  |     int ret; | ||||||
|  | 
 | ||||||
|  |     ret = av_expr_parse_and_eval(&res, argv[0], var_names, dtext->var_values, | ||||||
|  |                                  NULL, NULL, fun2_names, fun2, | ||||||
|  |                                  &dtext->prng, 0, ctx); | ||||||
|  |     if (ret < 0) | ||||||
|  |         av_log(ctx, AV_LOG_ERROR, | ||||||
|  |                "Expression '%s' for the expr text expansion function is not valid\n", | ||||||
|  |                argv[0]); | ||||||
|  |     else | ||||||
|  |         av_bprintf(bp, "%f", res); | ||||||
|  | 
 | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static const struct drawtext_function { | static const struct drawtext_function { | ||||||
|     const char *name; |     const char *name; | ||||||
|     unsigned argc_min, argc_max; |     unsigned argc_min, argc_max; | ||||||
|     int tag; /** opaque argument to func */ |     int tag; /** opaque argument to func */ | ||||||
|     int (*func)(AVFilterContext *, AVBPrint *, char *, unsigned, char **, int); |     int (*func)(AVFilterContext *, AVBPrint *, char *, unsigned, char **, int); | ||||||
| } functions[] = { | } functions[] = { | ||||||
|  |     { "expr",      1, 1, 0,   func_eval_expr }, | ||||||
|  |     { "e",         1, 1, 0,   func_eval_expr }, | ||||||
|     { "pts",       0, 0, 0,   func_pts      }, |     { "pts",       0, 0, 0,   func_pts      }, | ||||||
|     { "gmtime",    0, 1, 'G', func_strftime }, |     { "gmtime",    0, 1, 'G', func_strftime }, | ||||||
|     { "localtime", 0, 1, 'L', func_strftime }, |     { "localtime", 0, 1, 'L', func_strftime }, | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user