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. layui-时间选择器-时间范围选择

    HTML: JS: layui.use(['laydate'],function{ }); start:就为你选择的开始日期; end:就为你选择的结束日期 此方式可选择任意范围的时间,时间格式可任意 ...

  2. Tomcat、MySQL的安装与配置

    JAVA环境配置 下载安装jdk(Java Development Kit) 配置安装环境 右键计算机——>属性——>高级系统设置——>环境变量——>新建 变量名:  JAVA ...

  3. 转:关于使用ImageMagick和Tesseract进行简单数字图像识别

    据说Tesseract可是世界排名第三的OCR神器,2010年又更新了3.0版本.Tesseract原先是HP写的,现在Open Source了. 下面介绍怎么用Tesseract配合ImageMag ...

  4. Android handler 内存泄露分析及解决方法

    1. 什么是内存泄露? Java使用有向图机制,通过GC自动检查内存中的对象(什么时候检查由虚拟机决定),如果GC发现一个或一组对象为不可到达状态,则将该对象从内存中回收.也就是说,一个对象不被任何引 ...

  5. 第六讲_图像分割Image Segmentation

    第六讲_图像分割Image Segmentation 语义分割(semantic segmentation) 常用神经网络介绍对比-FCN SegNet U-net DeconvNet 目录 +三大数 ...

  6. 深入理解Java中的HashMap的实现原理

    HashMap继承自抽象类AbstractMap,抽象类AbstractMap实现了Map接口.关系图例如以下所看到的: Java中的Map<key, value>接口同意我们将一个对象作 ...

  7. live555client连多路1080P视频流花屏问题

    硬件和软件环境是这种: DM8168 + linux. 解码器是DM8168自带的 视频来源: ipc通过live555做的的rtsp sever发送过来的 其它測试: 通过VLC在pc连4路1080 ...

  8. web图片转换小工具制作

    HTML <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...

  9. JavaScript闭包其一:闭包概论 函数式编程中一些基本定义

    http://www.nowamagic.net/librarys/veda/detail/1707前面介绍了作用域链和变量对象,现在再讲闭包就容易理解了.闭包其实大家都已经谈烂了.尽管如此,这里还是 ...

  10. MyEclipse的html/JSP编辑器添加代码自动提示

    http://lusterfly.iteye.com/blog/1872627 在myeclipse 9以前的版本中,我们如果要为html编辑器添加自动的代码提示可以这样操作: windows--&g ...