Generalize drawtext utilities to make them usable in other filters. This will be needed to introduce the QR code source and filter without duplicating functionality.
		
			
				
	
	
		
			230 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			230 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * This file is part of FFmpeg.
 | |
|  *
 | |
|  * FFmpeg is free software; you can redistribute it and/or
 | |
|  * modify it under the terms of the GNU Lesser General Public
 | |
|  * License as published by the Free Software Foundation; either
 | |
|  * version 2.1 of the License, or (at your option) any later version.
 | |
|  *
 | |
|  * FFmpeg is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
|  * Lesser General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU Lesser General Public
 | |
|  * License along with FFmpeg; if not, write to the Free Software
 | |
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * @file
 | |
|  * text utilities
 | |
|  */
 | |
| 
 | |
| #ifndef AVFILTER_TEXTUTILS_H
 | |
| #define AVFILTER_TEXTUTILS_H
 | |
| 
 | |
| #include "libavutil/bprint.h"
 | |
| #include "libavutil/eval.h"
 | |
| #include "libavutil/log.h"
 | |
| #include "libavutil/parseutils.h"
 | |
| 
 | |
| /**
 | |
|  * Function used to expand a template sequence in the format
 | |
|  * %{FUNCTION_NAME[:PARAMS]}, defined in the TextExpander object.
 | |
|  */
 | |
| typedef struct FFExpandTextFunction {
 | |
|     /**
 | |
|      * name of the function
 | |
|      */
 | |
|     const char *name;
 | |
| 
 | |
|     /**
 | |
|      * minimum and maximum number of arguments accepted by the
 | |
|      * function in the PARAMS
 | |
|      */
 | |
|     unsigned argc_min, argc_max;
 | |
| 
 | |
|     /**
 | |
|      * actual function used to perform the expansion
 | |
|      */
 | |
|     int (*func)(void *ctx, AVBPrint *bp, const char *function_name, unsigned argc, char **args);
 | |
| } FFExpandTextFunction;
 | |
| 
 | |
| /**
 | |
|  * Text expander context, used to encapsulate the logic to expand a
 | |
|  * given text template.
 | |
|  *
 | |
|  * A backslash character @samp{\} in a text template, followed by any
 | |
|  * character, always expands to the second character.
 | |
|  * Sequences of the form %{FUNCTION_NAME[:PARAMS]} are expanded using a
 | |
|  * function defined in the object. The text between the braces is a
 | |
|  * function name, possibly followed by arguments separated by ':'. If
 | |
|  * the arguments contain special characters or delimiters (':' or
 | |
|  * '}'), they should be escaped.
 | |
|  */
 | |
| typedef struct FFExpandTextContext {
 | |
|     /**
 | |
|      * log context to pass to the function, used for logging and for
 | |
|      * accessing the context for the function
 | |
|      */
 | |
|     void *log_ctx;
 | |
| 
 | |
|     /**
 | |
|      * list of functions to use to expand sequences in the format
 | |
|      * FUNCTION_NAME{PARAMS}
 | |
|      */
 | |
|     FFExpandTextFunction *functions;
 | |
| 
 | |
|     /**
 | |
|      * number of functions
 | |
|      */
 | |
|     unsigned int functions_nb;
 | |
| } FFExpandTextContext;
 | |
| 
 | |
| /**
 | |
|  * Expand text template.
 | |
|  *
 | |
|  * Expand text template defined in text using the logic defined in a text
 | |
|  * expander object.
 | |
|  *
 | |
|  * @param expand_text text expansion context used to expand the text
 | |
|  * @param text template text to expand
 | |
|  * @param bp   BPrint object where the expanded text is written to
 | |
|  * @return negative value corresponding to an AVERROR error code in case of
 | |
|  * errors, a non-negative value otherwise
 | |
|  */
 | |
| int ff_expand_text(FFExpandTextContext *expand_text, char *text, AVBPrint *bp);
 | |
| 
 | |
| /**
 | |
|  * Print PTS representation to an AVBPrint object.
 | |
|  *
 | |
|  * @param log_ctx pointer to av_log object
 | |
|  * @param bp  AVBPrint object where the PTS textual representation is written to
 | |
|  * @param pts PTS value expressed as a double to represent
 | |
|  * @param delta delta time parsed by av_parse_time(), added to the PTS
 | |
|  * @param fmt string representing the format to use for printing, can be
 | |
|  *        "flt" - use a float representation with 6 decimal digits,
 | |
|  *        "hms" - use HH:MM:SS.MMM format,
 | |
|  *        "hms24hh" - same as "hms" but wraps the hours in 24hh format
 | |
|  *        (so that it is expressed in the range 00-23),
 | |
|  *        "localtime" or "gmtime" - expand the PTS according to the
 | |
|  *        @code{strftime()} function rules, using either the corresponding
 | |
|  *        @code{localtime()} or @code{gmtime()} time
 | |
|  * @param strftime_fmt: @code{strftime()} format to use to represent the PTS in
 | |
|  *       case the format "localtime" or "gmtime" was selected, if not specified
 | |
|  *       defaults to "%Y-%m-%d %H:%M:%S"
 | |
|  * @return negative value corresponding to an AVERROR error code in case of
 | |
|  * errors, a non-negative value otherwise
 | |
|  */
 | |
| int ff_print_pts(void *log_ctx, AVBPrint *bp, double pts, const char *delta,
 | |
|                  const char *fmt, const char *strftime_fmt);
 | |
| 
 | |
| /**
 | |
|  * Print time representation to an AVBPrint object.
 | |
|  *
 | |
|  * @param log_ctx pointer to av_log object
 | |
|  * @param bp AVBPrint object where the time textual representation is written to
 | |
|  * @param strftime_fmt: strftime() format to use to represent the time in case
 | |
|  *        if not specified defaults to "%Y-%m-%d %H:%M:%S". The format string is
 | |
|  *        extended to support the %[1-6]N after %S which prints fractions of the
 | |
|  *        second with optionally specified number of digits, if not specified
 | |
|  *        defaults to 3.
 | |
|  * @param localtime use local time to compute the time if non-zero, otherwise
 | |
|  *        use UTC
 | |
|  * @return negative value corresponding to an AVERROR error code in case of
 | |
|  * errors, a non-negative value otherwise
 | |
|  */
 | |
| int ff_print_time(void *log_ctx, AVBPrint *bp, const char *strftime_fmt, char localtime);
 | |
| 
 | |
| typedef double (*ff_eval_func2)(void *, double a, double b);
 | |
| 
 | |
| /**
 | |
|  * Evaluate and print expression to an AVBprint object.
 | |
|  * The output is written as a double representation.
 | |
|  *
 | |
|  * This is a wrapper around av_expr_parse_and_eval() and following the
 | |
|  * same rules.
 | |
|  *
 | |
|  * @param log_ctx pointer to av_log object
 | |
|  * @param bp AVBPrint object where the evaluated expression is written to
 | |
|  * @param expr the expression to be evaluated
 | |
|  * @param fun_names names of the ff_eval_func2 functions used to evaluate the expression
 | |
|  * @param fun_values values of the ff_eval_func2 functions used to evaluate the expression
 | |
|  * @param var_names names of the variables used in the expression
 | |
|  * @param var_values values of the variables used in the expression
 | |
|  * @param eval_ctx evaluation context to be passed to some functions
 | |
|  *
 | |
|  * @return negative value corresponding to an AVERROR error code in case of
 | |
|  * errors, a non-negative value otherwise
 | |
|  */
 | |
| int ff_print_eval_expr(void *log_ctx, AVBPrint *bp,
 | |
|                        const char *expr,
 | |
|                        const char * const *fun_names, const ff_eval_func2 *fun_values,
 | |
|                        const char * const *var_names, const double *var_values,
 | |
|                        void *eval_ctx);
 | |
| 
 | |
| /**
 | |
|  * Evaluate and print expression to an AVBprint object, using the
 | |
|  * specified format.
 | |
|  *
 | |
|  * This is a wrapper around av_expr_parse_and_eval() and following the
 | |
|  * same rules.
 | |
|  *
 | |
|  * The format is specified as a printf format character, optionally
 | |
|  * preceded by the positions numbers for zero-padding.
 | |
|  *
 | |
|  * The following formats are accepted:
 | |
|  * - x: use lowercase hexadecimal representation
 | |
|  * - X: use uppercase hexadecimal representation
 | |
|  * - d: use decimal representation
 | |
|  * - u: use unsigned decimal representation
 | |
|  *
 | |
|  * @param log_ctx pointer to av_log object
 | |
|  * @param bp AVBPrint object where the evaluated expression is written to
 | |
|  * @param expr the expression to be evaluated
 | |
|  * @param fun_names names of the ff_eval_func2 functions used to evaluate the expression
 | |
|  * @param fun_values values of the ff_eval_func2 functions used to evaluate the expression
 | |
|  * @param var_names names of the variables used in the expression
 | |
|  * @param var_values values of the variables used in the expression
 | |
|  * @param eval_ctx evaluation context to be passed to some functions
 | |
|  * @param format a character representing the format, to be chosen in xXdu
 | |
|  * @param positions final size of the value representation with 0-padding
 | |
|  * @return negative value corresponding to an AVERROR error code in case of
 | |
|  * errors, a non-negative value otherwise
 | |
|  */
 | |
| int ff_print_formatted_eval_expr(void *log_ctx, AVBPrint *bp,
 | |
|                                  const char *expr,
 | |
|                                  const char * const *fun_names, const ff_eval_func2 *fun_values,
 | |
|                                  const char * const *var_names, const double *var_values,
 | |
|                                  void *eval_ctx,
 | |
|                                  const char format, int positions);
 | |
| 
 | |
| /**
 | |
|  * Check if the character is a newline.
 | |
|  *
 | |
|  * @param c character to check
 | |
|  * @return non-negative value in case c is a newline, 0 otherwise
 | |
|  */
 | |
| static inline int ff_is_newline(uint32_t c)
 | |
| {
 | |
|     return c == '\n' || c == '\r' || c == '\f' || c == '\v';
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Load text file into the buffer pointed by text.
 | |
|  *
 | |
|  * @param log_ctx   pointer to av_log object
 | |
|  * @param textfile  filename containing the text to load
 | |
|  * @param text      pointer to the text buffer where the loaded text will be
 | |
|  *                  loaded
 | |
|  * @param text_size pointer to the value to set with the loaded text data,
 | |
|  *                  including the terminating 0 character
 | |
|  * @return negative value corresponding to an AVERROR error code in case of
 | |
|  * errors, a non-negative value otherwise
 | |
|  */
 | |
| int ff_load_textfile(void *log_ctx, const char *textfile,
 | |
|                      unsigned char **text, size_t *text_size);
 | |
| 
 | |
| #endif /* AVFILTER_TEXTUTILS__H */
 |