FFmpeg  4.0
Data Structures | Macros | Functions | Variables
eval.c File Reference

simple arithmetic expression evaluator. More...

#include <float.h>
#include "attributes.h"
#include "avutil.h"
#include "common.h"
#include "eval.h"
#include "ffmath.h"
#include "internal.h"
#include "log.h"
#include "mathematics.h"
#include "time.h"
#include "avstring.h"
#include "timer.h"
#include "reverse.h"

Go to the source code of this file.

Data Structures

struct  Parser
 
struct  AVExpr
 

Macros

#define VARS   10
 
#define IS_IDENTIFIER_CHAR(c)   ((c) - '0' <= 9U || (c) - 'a' <= 25U || (c) - 'A' <= 25U || (c) == '_')
 

Functions

double av_strtod (const char *numstr, char **tail)
 Parse the string in numstr and return its value as a double. More...
 
static int strmatch (const char *s, const char *prefix)
 
static double etime (double v)
 
static double eval_expr (Parser *p, AVExpr *e)
 
static int parse_expr (AVExpr **e, Parser *p)
 
void av_expr_free (AVExpr *e)
 Free a parsed expression previously created with av_expr_parse(). More...
 
static int parse_primary (AVExpr **e, Parser *p)
 
static AVExprmake_eval_expr (int type, int value, AVExpr *p0, AVExpr *p1)
 
static int parse_pow (AVExpr **e, Parser *p, int *sign)
 
static int parse_dB (AVExpr **e, Parser *p, int *sign)
 
static int parse_factor (AVExpr **e, Parser *p)
 
static int parse_term (AVExpr **e, Parser *p)
 
static int parse_subexpr (AVExpr **e, Parser *p)
 
static int verify_expr (AVExpr *e)
 
int av_expr_parse (AVExpr **expr, const char *s, const char *const *const_names, const char *const *func1_names, double(*const *funcs1)(void *, double), const char *const *func2_names, double(*const *funcs2)(void *, double, double), int log_offset, void *log_ctx)
 Parse an expression. More...
 
double av_expr_eval (AVExpr *e, const double *const_values, void *opaque)
 Evaluate a previously parsed expression. More...
 
int av_expr_parse_and_eval (double *d, const char *s, const char *const *const_names, const double *const_values, const char *const *func1_names, double(*const *funcs1)(void *, double), const char *const *func2_names, double(*const *funcs2)(void *, double, double), void *opaque, int log_offset, void *log_ctx)
 Parse and evaluate an expression. More...
 

Variables

static const AVClass eval_class
 
struct {
   double   bin_val
 
   double   dec_val
 
   int8_t   exp
 
si_prefixes [ 'z' - 'E'+1]
 
struct {
   const char *   name
 
   double   value
 
constants []
 

Detailed Description

simple arithmetic expression evaluator.

see http://joe.hotchkiss.com/programming/eval/eval.html

Definition in file eval.c.

Macro Definition Documentation

◆ VARS

#define VARS   10

Definition at line 56 of file eval.c.

Referenced by av_expr_parse(), and eval_expr().

◆ IS_IDENTIFIER_CHAR

#define IS_IDENTIFIER_CHAR (   c)    ((c) - '0' <= 9U || (c) - 'a' <= 25U || (c) - 'A' <= 25U || (c) == '_')

Definition at line 145 of file eval.c.

Referenced by strmatch().

Function Documentation

◆ av_strtod()

double av_strtod ( const char *  numstr,
char **  tail 
)

Parse the string in numstr and return its value as a double.

If the string is empty, contains only whitespaces, or does not contain an initial substring that has the expected syntax for a floating-point number, no conversion is performed. In this case, returns a value of zero and the value returned in tail is the value of numstr.

Parameters
numstra string representing a number, may contain one of the International System number postfixes, for example 'K', 'M', 'G'. If 'i' is appended after the postfix, powers of 2 are used instead of powers of 10. The 'B' postfix multiplies the value by 8, and can be appended after another postfix or used alone. This allows using for example 'KB', 'MiB', 'G' and 'B' as postfix.
tailif non-NULL puts here the pointer to the char next after the last parsed character

Definition at line 106 of file eval.c.

Referenced by ff_parse_sample_rate(), open_output_file(), parse_number_or_die(), parse_points_str(), parse_primary(), set_param(), var_read_float(), X264_init(), and yae_set_tempo().

◆ strmatch()

static int strmatch ( const char *  s,
const char *  prefix 
)
static

Definition at line 147 of file eval.c.

Referenced by parse_primary().

◆ etime()

static double etime ( double  v)
static

Definition at line 178 of file eval.c.

Referenced by parse_primary().

◆ eval_expr()

static double eval_expr ( Parser p,
AVExpr e 
)
static

Definition at line 183 of file eval.c.

Referenced by av_expr_eval().

◆ parse_expr()

static int parse_expr ( AVExpr **  e,
Parser p 
)
static

Definition at line 610 of file eval.c.

Referenced by av_expr_parse(), eval_expr(), and parse_primary().

◆ av_expr_free()

void av_expr_free ( AVExpr e)

◆ parse_primary()

static int parse_primary ( AVExpr **  e,
Parser p 
)
static

Definition at line 344 of file eval.c.

Referenced by parse_dB(), and parse_pow().

◆ make_eval_expr()

static AVExpr* make_eval_expr ( int  type,
int  value,
AVExpr p0,
AVExpr p1 
)
static

Definition at line 501 of file eval.c.

Referenced by parse_expr(), parse_factor(), parse_subexpr(), and parse_term().

◆ parse_pow()

static int parse_pow ( AVExpr **  e,
Parser p,
int sign 
)
static

Definition at line 513 of file eval.c.

Referenced by parse_dB().

◆ parse_dB()

static int parse_dB ( AVExpr **  e,
Parser p,
int sign 
)
static

Definition at line 520 of file eval.c.

Referenced by parse_factor().

◆ parse_factor()

static int parse_factor ( AVExpr **  e,
Parser p 
)
static

Definition at line 535 of file eval.c.

Referenced by parse_term().

◆ parse_term()

static int parse_term ( AVExpr **  e,
Parser p 
)
static

Definition at line 562 of file eval.c.

Referenced by parse_subexpr().

◆ parse_subexpr()

static int parse_subexpr ( AVExpr **  e,
Parser p 
)
static

Definition at line 586 of file eval.c.

Referenced by parse_expr().

◆ verify_expr()

static int verify_expr ( AVExpr e)
static

Definition at line 640 of file eval.c.

Referenced by av_expr_parse().

◆ av_expr_parse()

int av_expr_parse ( AVExpr **  expr,
const char *  s,
const char *const *  const_names,
const char *const *  func1_names,
double(**)(void *, double)  funcs1,
const char *const *  func2_names,
double(**)(void *, double, double)  funcs2,
int  log_offset,
void log_ctx 
)

Parse an expression.

Parameters
expra pointer where is put an AVExpr containing the parsed value in case of successful parsing, or NULL otherwise. The pointed to AVExpr must be freed with av_expr_free() by the user when it is not needed anymore.
sexpression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)"
const_namesNULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0}
func1_namesNULL terminated array of zero terminated strings of funcs1 identifiers
funcs1NULL terminated array of function pointers for functions which take 1 argument
func2_namesNULL terminated array of zero terminated strings of funcs2 identifiers
funcs2NULL terminated array of function pointers for functions which take 2 arguments
log_ctxparent logging context
Returns
>= 0 in case of success, a negative value corresponding to an AVERROR code otherwise

Definition at line 679 of file eval.c.

Referenced by av_expr_parse_and_eval(), config_input(), config_output(), config_props(), ff_rate_control_init(), generate_kernel(), geq_init(), init(), init_axis_color(), init_cqt(), init_output_stream_encode(), init_volume(), initialize(), modplug_read_header(), parse_fontsize(), process_command(), set_enable_expr(), and set_expr().

◆ av_expr_eval()

double av_expr_eval ( AVExpr e,
const double *  const_values,
void opaque 
)

Evaluate a previously parsed expression.

Parameters
const_valuesa zero terminated array of values for the identifiers from av_expr_parse() const_names
opaquea pointer which will be passed to all functions from funcs1 and funcs2
Returns
the value of the expression

Definition at line 734 of file eval.c.

Referenced by av_expr_parse_and_eval(), config_input(), config_output(), config_props(), do_eval(), do_video_out(), draw_text(), eval_expr(), ff_inlink_evaluate_timeline_at_frame(), filter_frame(), generate_kernel(), get_qscale(), init_axis_color(), init_cqt(), init_volume(), load_font_file(), modplug_read_packet(), output_single_frame(), parse_expr(), request_frame(), select_frame(), set_brightness(), set_contrast(), set_gamma(), set_saturation(), set_volume(), slice_geq_filter(), update_alpha(), update_context(), and update_fontsize().

◆ av_expr_parse_and_eval()

int av_expr_parse_and_eval ( double *  res,
const char *  s,
const char *const *  const_names,
const double *  const_values,
const char *const *  func1_names,
double(**)(void *, double)  funcs1,
const char *const *  func2_names,
double(**)(void *, double, double)  funcs2,
void opaque,
int  log_offset,
void log_ctx 
)

Parse and evaluate an expression.

Note, this is significantly slower than av_expr_eval().

Parameters
resa pointer to a double where is put the result value of the expression, or NAN in case of error
sexpression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)"
const_namesNULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0}
const_valuesa zero terminated array of values for the identifiers from const_names
func1_namesNULL terminated array of zero terminated strings of funcs1 identifiers
funcs1NULL terminated array of function pointers for functions which take 1 argument
func2_namesNULL terminated array of zero terminated strings of funcs2 identifiers
funcs2NULL terminated array of function pointers for functions which take 2 arguments
opaquea pointer which will be passed to all functions from funcs1 and funcs2
log_ctxparent logging context
Returns
>= 0 in case of success, a negative value corresponding to an AVERROR code otherwise

Definition at line 744 of file eval.c.

Referenced by activate(), av_parse_ratio(), calc_persp_luts(), config_input(), config_output_props(), config_props(), ff_scale_eval_dimensions(), filter_frame(), func_eval_expr(), func_eval_expr_int_format(), generate_kernel(), get_aspect_ratio(), main(), qsvscale_config_props(), and set_string_number().

Variable Documentation

◆ eval_class

const AVClass eval_class
static
Initial value:
= {
.class_name = "Eval",
.item_name = av_default_item_name,
.option = NULL,
.log_level_offset_offset = 0x42,
.parent_log_context_offset = 0x42,
}
#define NULL
Definition: coverity.c:32
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:191

Definition at line 60 of file eval.c.

Referenced by av_expr_parse().

◆ bin_val

double bin_val

Definition at line 70 of file eval.c.

◆ dec_val

double dec_val

Definition at line 71 of file eval.c.

◆ exp

int8_t exp

◆ si_prefixes

const { ... } si_prefixes['z' - 'E' + 1]
Initial value:
= {
['y'-'E']= { 8.271806125530276749e-25, 1e-24, -24 },
['z'-'E']= { 8.4703294725430034e-22, 1e-21, -21 },
['a'-'E']= { 8.6736173798840355e-19, 1e-18, -18 },
['f'-'E']= { 8.8817841970012523e-16, 1e-15, -15 },
['p'-'E']= { 9.0949470177292824e-13, 1e-12, -12 },
['n'-'E']= { 9.3132257461547852e-10, 1e-9, -9 },
['u'-'E']= { 9.5367431640625e-7, 1e-6, -6 },
['m'-'E']= { 9.765625e-4, 1e-3, -3 },
['c'-'E']= { 9.8431332023036951e-3, 1e-2, -2 },
['d'-'E']= { 9.921256574801246e-2, 1e-1, -1 },
['h'-'E']= { 1.0159366732596479e2, 1e2, 2 },
['k'-'E']= { 1.024e3, 1e3, 3 },
['K'-'E']= { 1.024e3, 1e3, 3 },
['M'-'E']= { 1.048576e6, 1e6, 6 },
['G'-'E']= { 1.073741824e9, 1e9, 9 },
['T'-'E']= { 1.099511627776e12, 1e12, 12 },
['P'-'E']= { 1.125899906842624e15, 1e15, 15 },
['E'-'E']= { 1.152921504606847e18, 1e18, 18 },
['Z'-'E']= { 1.1805916207174113e21, 1e21, 21 },
['Y'-'E']= { 1.2089258196146292e24, 1e24, 24 },
}

Referenced by av_strtod().

◆ name

const char* name

Definition at line 97 of file eval.c.

Referenced by parse_primary().

◆ value

double value

Definition at line 98 of file eval.c.

Referenced by ape_tag_read_field(), arith2_get_scaled_value(), asf_read_value(), asf_set_metadata(), asf_store_aspect_ratio(), asf_write_header1(), av_opt_set_from_string(), avi_read_tag(), avpriv_fits_header_parse_line(), blend_line16(), blend_pixel16(), cbs_read_se_golomb(), cbs_read_ue_golomb(), celt_decode_coarse_energy(), celt_stereo_merge(), check_4block_inter(), check_block(), check_lengths(), comp_adjust(), decode_block(), decode_byterun(), decode_delta_j(), decode_frame(), decode_info_header(), decode_macroblock(), decode_motion(), decode_skip_count(), decode_unit(), decode_value(), draw_scope(), dss_read_metadata_string(), dtshd_read_header(), dxv_decompress_dxt1(), dxv_decompress_dxt5(), encode_gbrp10(), encode_gbrp12(), encode_rgb48_10bit(), extract_line(), ff_bgmc_decode(), ff_cbs_read_unsigned(), ff_draw_round_to_sub(), ff_ebur128_set_channel(), ff_hevc_rem_intra_luma_pred_mode_decode(), ff_hevc_sao_band_position_decode(), ff_log2_q15(), ff_mjpeg_encode_huffman_increment(), ff_opus_rc_dec_laplace(), ff_opus_rc_get_raw(), ff_parse_fmtp(), ff_read_riff_info(), ff_rtsp_open_transport_ctx(), ff_svq1_packet_checksum(), ff_tadd_string_metadata(), ff_tak_parse_streaminfo(), fill_ltable(), filter_color(), filter_color2(), filter_frame(), filter_mono(), filter_units_make_type_list(), filterfn(), ftp_parse_entry_mlsd(), get_bucket(), get_duration_insec(), get_sockaddr(), get_tag(), gxf_material_tags(), gxf_track_tags(), handle_connect_error(), id3v2_3_metadata_split_date(), init_loop_filter(), intlist_read(), ivr_read_header(), last_significant_coeff_suffix_decode(), make_eval_expr(), mov_read_timecode_track(), mpegaudio_tableinit(), mxf_free_metadataset(), mxf_read_pixel_layout(), nist_read_header(), nsp_read_header(), nsv_parse_NSVf_header(), opt_preset(), opus_rc_tell_frac(), pack_float_sample(), parse_lfe_16(), parse_lfe_24(), parse_mantissas(), parse_multipart_header(), parse_set_cookie(), pcx_rle_decode(), pixscope_filter_frame(), plot_spectrum_column(), pow_2(), process_command(), process_float(), process_options(), put_bits(), put_bits32(), qdm2_decode(), qdm2_decode_fft_packets(), qdm2_get_se_vlc(), qdm2_get_vlc(), quantize(), quantize_value(), radix_sort_pass(), read_high_coeffs(), read_info_chunk(), read_low_coeffs(), read_sm_data(), read_string(), read_tag(), read_var_block_data(), reverse_decorr(), reverse_mono_decorr(), rtmp_write_amf_data(), scan_word(), set_control(), set_meta(), set_spdif(), silk_decode_excitation(), silk_decode_lpc(), silk_stabilize_lsf(), subviewer_read_header(), sunrast_decode_frame(), sunrast_image_write_image(), tgq_decode_block(), tiff_decode_tag(), tta_decode_frame(), tta_encode_frame(), update_band_masking(), v4l2_set_ext_ctrl(), vaapi_encode_config_attributes(), var_read_metadata(), vc1_decode_i_block(), vc1_decode_i_block_adv(), vc1_decode_intra_block(), vc1_decode_p_block(), vivo_read_header(), vlc_decode_block(), vp56_rac_gets(), vp8_rac_get_uint(), wv_get_value_float(), and xor_32_to_8().

◆ constants

const { ... } constants[]
Initial value:
= {
{ "E", M_E },
{ "PI", M_PI },
{ "PHI", M_PHI },
{ "QP2LAMBDA", FF_QP2LAMBDA },
}
#define M_E
Definition: mathematics.h:37
#define M_PHI
Definition: mathematics.h:49
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
Definition: avutil.h:227
#define M_PI
Definition: mathematics.h:52

Referenced by parse_primary().