av_rescale_rnd计算原理

av_rescale_rnd进行单位换算,

av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd)最基本的计算公式是:

 a*b/c;

计算原理:

对一实物用单位b度量出来的值是a,那么用单位c来度量其值是多少?

设实物的真实值为x,用单位c度量的值为y,则有如下式满足:

 x/a = b;

 x/c = y;

所以有:a*b = c*y。进而得出:y = a*b/c

 

对换算后的数据有五种处理方法:

 

    AV_ROUND_ZERO     = 0, ///向下取整

    AV_ROUND_INF      = 1, ///向上取整

    AV_ROUND_DOWN     = 2, ///同AV_ROUND_ZERO,用于负数处理

    AV_ROUND_UP       = 3, ///同AV_ROUND_INF,用于负数处理

AV_ROUND_NEAR_INF = 5, ///四舍五入

如果rnd == AV_ROUND_NEAR_INF,那么 return a*b/c + r/c;r = c / 2,也即 return a*b/c + 0.5。

a*b/c

a*b/c + 0.5

浮点类型变为整数类型

0.4

0.9

0

0.6

1.1

1

如果rnd == AV_ROUND_INF,那么 return a*b/c + (c-1)/c。这种计算方法很常见,如内存对齐。还有诸如一个篮子能盛2个鸡蛋,问你3个鸡蛋需要几个篮子。a*b + (c-1)计算会把a*b产生不足c的小数据部分扩展到c的1倍多。这样小数据部分就会占用一个篮子。 (c-1)减号后面的1要求a*b计算出来的小1的部分会被丢弃。

 

a*b/3

(a*b + (c-1))/3

浮点类型变为整数类型

1/3

(1+2)/3

1

3/3

(3+2)/3

1

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值