美文网首页FFPlay专辑
FFplay文档解读-3-表达评估

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

作者: 张芳涛 | 来源:发表于2018-11-15 14:29 被阅读2次

    前言

    Github地址:Github
    简书地址:简书
    专辑地址:FFplay专辑

    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的评估结果转换为整数。

    请注意,转换为整数和转换回浮点都会丢失精度。 注意大数字(通常是2^{53}和更大)的意外结果。
    ‘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)’ 计算expr的平方根。 这相当于(expr)^.5
    ‘squish(x)’ 计算表达式1 /(1 + exp(4 * x))
    ‘st(var, expr)’ 将表达式expr的值存储在内部变量中。 var指定存储值的变量的编号,它是一个介于09之间的值。该函数返回存储在内部变量中的值。 注意,变量目前不在表达式之间共享。
    ‘tan(x)’ 计算x的正切值。
    ‘tanh(x)’ 计算x的双曲正切。
    ‘taylor(expr, x)’
    ‘taylor(expr, x, id)’ 在给定表示函数的ld(id) -导数为0的表达式的情况下,在x处评估泰勒级数。

    当系列没有收敛时,结果是不确定的。

    ld(id)用于表示expr中的派生顺序,这意味着将使用表达式可以通过ld(id)访问的各种输入值多次计算给定表达式。 如果未指定id,则假定为0

    注意,当你的导数在y而不是0时,可以使用taylor(expr,x-y)
    ‘time(0)’ 以秒为单位返回当前(挂钟)时间。
    ‘trunc(expr)’ 将表达式expr的值向零舍入为最接近的整数。 例如,trunc(-1.5)-1.0
    ‘while(cond, expr)’ 在表达式cond为非零时计算表达式expr,并返回最后一次expr求值的值,如果cond始终为false,则返回NAN

    可以使用以下常量:

    解释
    ‘PI’ 单位圆盘的面积,约3.14
    ‘E’ exp(1)(欧拉数),约2.718
    ‘PHI’ 黄金比例(1 + sqrt(5))/ 2,约1.618

    假设表达式如果具有非零值则被视为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

    相关文章

      网友评论

        本文标题:FFplay文档解读-3-表达评估

        本文链接:https://www.haomeiwen.com/subject/yiryfqtx.html