FFplay文档解读-3-表达评估

发布于:2022-11-09 ⋅ 阅读:(11) ⋅ 点赞:(0) ⋅ 评论:(0)

5.表达评估

在计算算术表达式时,FFmpeg使用内部公式求值程序,通过'libavutil / eval.h'接口实现。

表达式可以包含一元二元运算符,常量和函数。

可以组合两个表达式expr1expr2以形成另一个表达式expr1; expr2。 依次计算expr1expr2,新表达式的计算结果为expr2的值。

可以使用以下二元运算符:+, - ,*,/,^

可以使用以下一元运算符:+, -

可以使用以下函数:

函数 解释
‘abs(x)’ 计算x的绝对值。
‘acos(x)’ 计算x的反余弦。
‘asin(x)’ 计算x的反正弦。
‘atan(x)’ 计算x的反正切值。
‘atan2(x, y)’ 计算y / x的反正切的主值。
‘between(x, min, max)’ 如果x大于或等于min且小于或等于max,则返回1,否则返回0
‘bitand(x, y)’
‘bitor(x, y)’ xy上计算按位和/或运算。

在执行按位运算之前,将xy的评估结果转换为整数。

请注意,转换为整数和转换回浮点都会丢失精度。 注意大数字(通常是和更大)的意外结果。
‘ceil(expr)’ 将表达式expr的值向上舍入到最接近的整数。 例如,ceil(1.5)2.0
‘clip(x, min, max)’ 返回在minmax之间剪切的x的值。
‘cos(x)’ 计算x的余弦值。
‘cosh(x)’ 计算x的双曲余弦值。
‘eq(x, y)’ 如果xy相等则返回1,否则返回0
‘exp(x)’ 计算x的指数(带基数e,欧拉数)。
‘floor(expr)’ 将表达式expr的值向下舍入到最接近的整数。 例如,floor(-1.5-2.0
‘gauss(x)’ 计算x的高斯函数,对应于exp(-x * x / 2)/ sqrt(2 * PI)
‘gcd(x, y)’ 返回xy的最大公约数。 如果xy都为0或者其中一个或两个都小于零,则行为未定义。
‘gt(x, y)’ 如果x大于y则返回1,否则返回0
‘gte(x, y)’ 如果x大于或等于y则返回1,否则返回0
‘hypot(x, y)’ 此函数类似于具有相同名称的C函数; 它返回sqrt(x * x + y * y),右边三角形的斜边长度,边长xy,或点(x,y)距原点的距离。
‘if(x, y)’ 求值x,如果结果为非零,则返回y的求值结果,否则返回0
‘if(x, y, z)’ 评估x,如果结果为非零,则返回y的评估结果,否则返回z的评估结果。
‘ifnot(x, y)’ 求值x,如果结果为零,则返回y的求值结果,否则返回0
‘ifnot(x, y, z)’ 评估x,如果结果为零,则返回y的评估结果,否则返回z的评估结果。
‘isinf(x)’ 如果x+/- INFINITY则返回1.0,否则返回0.0
‘isnan(x)’ 如果x是NAN则返回1.0,否则返回0.0
‘ld(var)’ 使用数字var加载内部变量的值,该值先前存储为st(var,expr)。 该函数返回加载的值。
‘lerp(x, y, z)’ 通过z的量返回xy之间的线性插值。
‘log(x)’ 计算x的自然对数。
‘lt(x, y)’ 如果x小于y则返回1,否则返回0
‘max(x, y)’ 返回xy之间的最大值。
‘min(x, y)’ 返回xy之间的最小值。
‘mod(x, y)’ 计算x除以y的余数。
‘not(expr)’ 如果expr为零则返回1.0,否则返回0.0
‘pow(x, y)’ 计算x提升y的幂,它相当于"(x)^(y)"
‘print(t)’
‘print(t, l)’ 使用loglevel l打印表达式t的值。 如果未指定l,则使用默认日志级别。 返回打印表达式的值。

使用loglevel l打印t
‘random(x)’ 返回介于0.01.0之间的伪随机值。x是将用于保存种子/状态的内部变量的索引。
‘root(expr, max)’ 在区间0..max中查找由参数ld(0)表示的函数为0的输入值。
expr中的表达式必须表示连续函数或结果未定义。
ld(0)用于表示函数输入值,这意味着将使用表达式可以通过ld(0)访问的各种输入值多次计算给定表达式。 当表达式求值为0时,将返回相应的输入值。
‘round(expr)’ 将表达式expr的值舍入为最接近的整数。 例如,round(1.5)2.0
‘sin(x)’ 计算x的正弦值。
‘sinh(x)’ 计算x的双曲正弦值。
‘sqrt(expr)’
‘squish(x)’
‘st(var, expr)’ 将表达式expr的值存储在内部变量中。 var指定存储值的变量的编号,它是一个介于09之间的值。该函数返回存储在内部变量中的值。 注意,变量目前不在表达式之间共享。
‘tan(x)’ 计算x的正切值。
‘tanh(x)’ 计算x的双曲正切。
‘taylor(expr, x)’
‘taylor(expr, x, id)’
‘time(0)’ 以秒为单位返回当前(挂钟)时间。
‘trunc(expr)’ 将表达式expr的值向零舍入为最接近的整数。 例如,trunc(-1.5)-1.0
‘while(cond, expr)’ 在表达式cond为非零时计算表达式expr,并返回最后一次expr求值的值,如果cond始终为false,则返回NAN

 免费学习地址:https://ke.qq.com/course/3202131?flowToken=1042495
【文章福利】免费领取更多音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击1079654574加群领取哦~

可以使用以下常量:

解释
‘PI’ 单位圆盘的面积,约3.14
‘E’
‘PHI’

 

 

假设表达式如果具有非零值则被视为true,请注意:

*功能类似于AND
+功能类似于OR

示例代码如下:

示例代码
if (A AND B) then C

相当于:

示例代码
if(A*B, C)

C代码中,可以扩展一元和二元函数的列表,并定义已识别的常量,以便它们可用于表达式。

评估者还识别国际系统单位前缀。 如果在前缀后附加'i',则使用二进制前缀,它基于1024的幂而不是1000的幂.'B'后缀将值乘以8,并且可以在单位前缀后附加或单独使用。 这允许使用例如'KB''MiB''G''B'作为数字后缀。

下面是可用的国际系统前缀列表,其中显示相应的102的幂。

解释
‘y’ 10^-24 / 2^-80
‘z’ 10^-21 / 2^-70
‘a’ 10^-18 / 2^-60
‘f’ 10^-15 / 2^-50
‘p’ 10^-12 / 2^-40
‘n’ 10^-9 / 2^-30
‘u’ 10^-6 / 2^-20
‘m’ 10^-3 / 2^-10
‘c’ 10^-2
‘d’ 10^-1
‘h’ 10^2
‘k’ 10^3 / 2^10
‘K’ 10^3 / 2^10
‘M’ 10^6 / 2^20
‘G’ 10^9 / 2^30
‘T’ 10^12 / 2^40
‘P’ 10^15 / 2^40
‘E’ 10^18 / 2^50
‘Z’ 10^21 / 2^60
‘Y’ 10^24 / 2^70