http://blog.csdn.net/fireroll/article/details/8485482

一、函数声明:

int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd); 

直接看代码, 它的作用是计算 "a * b / c" 的值并分五种方式来取整.

用在FFmpeg中,

则是将以 "时钟基c" 表示的 数值a 转换成以 "时钟基b" 来表示。

一共有5种方式:

二、函数定义(见于libavutil/mathematics.c):

 int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd){
int64_t r=;
av_assert2(c > );
av_assert2(b >=);
av_assert2((unsigned)(rnd&~AV_ROUND_PASS_MINMAX)<= && (rnd&~AV_ROUND_PASS_MINMAX)!=); if (c <= || b < || !((unsigned)(rnd&~AV_ROUND_PASS_MINMAX)<= && (rnd&~AV_ROUND_PASS_MINMAX)!=))
return INT64_MIN; if (rnd & AV_ROUND_PASS_MINMAX) {
if (a == INT64_MIN || a == INT64_MAX)
return a;
rnd -= AV_ROUND_PASS_MINMAX;
} if(a< && a != INT64_MIN) return -av_rescale_rnd(-a, b, c, rnd ^ ((rnd>>)&)); if(rnd==AV_ROUND_NEAR_INF) r= c/;
else if(rnd&) r= c-; if(b<=INT_MAX && c<=INT_MAX){
if(a<=INT_MAX)
return (a * b + r)/c;
else
return a/c*b + (a%c*b + r)/c;
}else{
#if 1
uint64_t a0= a&0xFFFFFFFF;
uint64_t a1= a>>;
uint64_t b0= b&0xFFFFFFFF;
uint64_t b1= b>>;
uint64_t t1= a0*b1 + a1*b0;
uint64_t t1a= t1<<;
int i; a0 = a0*b0 + t1a;
a1 = a1*b1 + (t1>>) + (a0<t1a);
a0 += r;
a1 += a0<r; for(i=; i>=; i--){
// int o= a1 & 0x8000000000000000ULL;
a1+= a1 + ((a0>>i)&);
t1+=t1;
if(/*o || */c <= a1){
a1 -= c;
t1++;
}
}
return t1;
}
#else
AVInteger ai;
ai= av_mul_i(av_int2i(a), av_int2i(b));
ai= av_add_i(ai, av_int2i(r)); return av_i2int(av_div_i(ai, av_int2i(c)));
}
#endif
}

三、实例分析
将以"1MHz时钟基" 表示的 "PTS/DTS值a" 转换成以 "90kHz时钟基" 表示。

 av_rescale_q(a=-,
bq={num=, den=},
cq={num=, den=))
{
int64_t b= bq.num * (int64_t)cq.den; // = 1 * 90000 = 90000;
int64_t c= cq.num * (int64_t)bq.den; // = 1 * 1000000 = 1000000
return av_rescale_rnd(a, b, c, );
} av_rescale_rnd(a=, b=, c=, rnd=)
{
if (rnd==)
r = c / ; // r =500000; if (b<=INT_MAX && c<=INT_MAX)
{
if (a<=INT_MAX)
return (a * b + r)/c;
else
return a/c*b + (a%c*b + r)/c; // = 10949117256 / 1000000 * 90000 +
// (10949117256 % 1000000 * 90000 + 500000) / 1000000
// = 985420553
}
else
{
...
}
}

ffmpeg 中av_rescale_rnd 的含义的更多相关文章

  1. ffmpeg中av_log的实现分析

    [时间:2017-10] [状态:Open] [关键词:ffmpeg,avutil,av_log, 日志输出] 0 引言 FFmpeg的libavutil中的日志输出的接口整体比较少,但是功能还是不错 ...

  2. (转)ffmpeg 中 av_read_frame_internal分析

    作者: chenwei1983    时间: 2012-3-5 04:21 PM标题: ffmpeg 中 av_read_frame_internal分析                       ...

  3. ffmpeg中关于EAGAIN的理解及非阻塞IO

    ffmpeg为在linux下开发的开源音视频框架,所以经常会碰到很多错误(设置errno),其中EAGAIN是其中比较常见的一个错误(比如用在非阻塞操作中).  try again,从字面上来看,是提 ...

  4. FFmpeg 中AVPacket的使用

    AVPacket保存的是解码前的数据,也就是压缩后的数据.该结构本身不直接包含数据,其有一个指向数据域的指针,FFmpeg中很多的数据结构都使用这种方法来管理数据. AVPacket的使用通常离不开下 ...

  5. if [ "$变量1"x = "$变量2"x ]中x的含义

    问题:if [ "$变量1"x = "$变量2"x ]中x的含义是? 答:“x”字符可以为任意字符,用于防止变量为空时,某些版本的bash中会产生错误: 在一个 ...

  6. FFmpeg中HLS文件解析源码

    不少人都在找FFmpeg中是否有hls(m3u8)解析的源码,其实是有的.就是ffmpeg/libavformat/hlsproto.c,它依赖的文件也在那个目录中. 如果要是单纯想解析HLS的话,建 ...

  7. ffmpeg中的sws_scale算法性能测试

    经常用到ffmpeg中的sws_scale来进行图像缩放和格式转换,该函数可以使用各种不同算法来对图像进行处理.以前一直很懒,懒得测试和甄 别应该使用哪种算法,最近的工作时间,很多时候需要等待别人.忙 ...

  8. sturct stat 结构体中 st_mode 的含义

    工作中遇到 else if( (s_buf.st_mode&S_IFMT) == S_IFDIR) return 2; else if( !(s_buf.st_mode&S_IFREG ...

  9. TortoiseSVN中图标的含义

    今天在使用svn时发现有好多不认识了,所以查了下svn帮助手册.借此总结了下 svn 中图标的含义 一个新检出的工作复本使用绿色的勾做重载.表示Subversion状态 正常. 在开始编辑一个文件后, ...

随机推荐

  1. Extjs grid 单元格编辑

    实现grid勾选后出现编辑按钮,通过增加一个字段checked来控制 事件如下: selectionchange: function (thi, selected, eOpts) { for (var ...

  2. Chrom查看Flash缓存文件及Flash下载方法

    比如在优酷看视频时,或者熊猫直播,如果使用Flash进行播放的基本都会先缓存在本地,只不过这个缓存的名字后缀不叫flv,而是类似tmp这样:通常只要找到这个缓存文件,然后改为flv即可播放:如果出现文 ...

  3. AnsiString类型定义的时候可以直接指定代码页,比如950繁体字,936日文

    procedure TForm3.FormCreate(Sender: TObject); type AnsiStringForPage = type AnsiString(950);//代码页 va ...

  4. http://blog.csdn.net/zh521zh/article/details/52687922

    http://blog.csdn.net/zh521zh/article/details/52687922

  5. iOS -- SKPhysicsWorld类

    SKPhysicsWorld类 继承自 NSObject 符合 NSCodingNSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit. ...

  6. Ubuntu -- 下如何查看CPU信息, 包括位数和多核信息

    from: http://hi.baidu.com/sdusoul/blog/item/76f349508f74fb6e843524eb.html 查看当前操作系统内核信息# uname -a Lin ...

  7. Mac下export生效

    在Terminal下用export PS1=XXX   修改完后,本次生效,但是重新启动Teminal后又恢复到默认格式.如何才能永久保存自定义的提示符格式呢? 1,~下面本来没有 .bash_pro ...

  8. margin: 0 auto; 元素水平居中布局无效

    失效原因: 要给居中的元素一个宽度,否则无效. 该元素一定不能浮动或绝对定位,否则无效. 在HTML中使用<center></center>标签,需考虑好整体构架,否者全部元素 ...

  9. C#中异常处理和Java的区别

    捕获异常,同样是try...catch...,这个完全一样: 抛出异常,同样是throw,这个完全一样: 函数抛出怎样的异常,Java中可以用throws定义,而C#中不用定义,相当于throws E ...

  10. java性能监控工具jcmd-windows

    jcmd Sends diagnostic command requests to a running Java Virtual Machine (JVM). Synopsis jcmd [-l|-h ...