ffmpeg 中av_rescale_rnd 的含义
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 的含义的更多相关文章
- ffmpeg中av_log的实现分析
[时间:2017-10] [状态:Open] [关键词:ffmpeg,avutil,av_log, 日志输出] 0 引言 FFmpeg的libavutil中的日志输出的接口整体比较少,但是功能还是不错 ...
- (转)ffmpeg 中 av_read_frame_internal分析
作者: chenwei1983 时间: 2012-3-5 04:21 PM标题: ffmpeg 中 av_read_frame_internal分析 ...
- ffmpeg中关于EAGAIN的理解及非阻塞IO
ffmpeg为在linux下开发的开源音视频框架,所以经常会碰到很多错误(设置errno),其中EAGAIN是其中比较常见的一个错误(比如用在非阻塞操作中). try again,从字面上来看,是提 ...
- FFmpeg 中AVPacket的使用
AVPacket保存的是解码前的数据,也就是压缩后的数据.该结构本身不直接包含数据,其有一个指向数据域的指针,FFmpeg中很多的数据结构都使用这种方法来管理数据. AVPacket的使用通常离不开下 ...
- if [ "$变量1"x = "$变量2"x ]中x的含义
问题:if [ "$变量1"x = "$变量2"x ]中x的含义是? 答:“x”字符可以为任意字符,用于防止变量为空时,某些版本的bash中会产生错误: 在一个 ...
- FFmpeg中HLS文件解析源码
不少人都在找FFmpeg中是否有hls(m3u8)解析的源码,其实是有的.就是ffmpeg/libavformat/hlsproto.c,它依赖的文件也在那个目录中. 如果要是单纯想解析HLS的话,建 ...
- ffmpeg中的sws_scale算法性能测试
经常用到ffmpeg中的sws_scale来进行图像缩放和格式转换,该函数可以使用各种不同算法来对图像进行处理.以前一直很懒,懒得测试和甄 别应该使用哪种算法,最近的工作时间,很多时候需要等待别人.忙 ...
- sturct stat 结构体中 st_mode 的含义
工作中遇到 else if( (s_buf.st_mode&S_IFMT) == S_IFDIR) return 2; else if( !(s_buf.st_mode&S_IFREG ...
- TortoiseSVN中图标的含义
今天在使用svn时发现有好多不认识了,所以查了下svn帮助手册.借此总结了下 svn 中图标的含义 一个新检出的工作复本使用绿色的勾做重载.表示Subversion状态 正常. 在开始编辑一个文件后, ...
随机推荐
- 1007 Maximum Subsequence Sum
Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to ...
- Java并发容器,底层原理深入分析
ConcurrentHashMap ConcurrentHashMap底层具体实现 JDK 1.7底层实现 将数据分为一段一段的存储,然后给每一段数据配一把锁, 当一个线程占用锁访问其中一个段数据时, ...
- jdk1.8中nashorn不支持ECMAScript6的问题
背景 在项目中需要使用java调用javascript脚本,有两种方案,一种是faas,使用开源的openwhisk.另一种本地运行的方式,使用jdk的nashorn调用javascript,jdk版 ...
- 具体一些的博弈论 sqrstone
Description 你有n个盒子用来放石头,每个盒子都有最大容量与初始的石头数, 两个人轮流放石头,每次必须选择一个盒子往里放数量不超过当前盒子中石头数的平方的石头 比如一个盒子当前有3个石头,你 ...
- Ext grid单元格编辑时获取获取Ext.grid.column.Column
item2.width = 80; //item2.flex = 1; item2.align = 'center'; item2.menuDisabled = true; //禁止显示列头部右侧菜单 ...
- fastdfs-zyc监控系统的使用
原文:http://blog.csdn.net/foreversunshine/article/details/51907659 写在前面 前面有介绍过怎么安装与使用FastDFS来进行分布式的文件存 ...
- 实践认识--ANN
1. 常用激活函数 激活函数的选择是构建神经网络过程中的重要环节,下面简要介绍常用的激活函数. (1) 线性函数 ( Liner Function ) (2) 斜面函数 ( Ramp Functio ...
- hdu 5389 Zero Escape (dp)
题目:http://acm.hdu.edu.cn/showproblem.php? pid=5389 题意:定义数根:①把每一位上的数字加起来得到一个新的数,②反复①直到得到的数仅仅有1位.给定n,A ...
- 怎样高速启动Android模拟器(Android Emulator)
总所周知,每次我们启动Android Emulator,都须要花费非常长一段时间,几分钟甚至十几分钟.事实上,我们能够使用快照(Snapshot)功能,来高速启动Android模拟器. 首先.须要在A ...
- LNMPA遇到504 Gateway time-out错误的解决方法
Nginx的特点是处理静态很给力,Apache的特点是处理动态很稳定,两者结合起来便是LNMPA,nginx处理前端,apache处理后端,这样处理静态会很快,处理动态会很稳定. 当我以为安装完成以后 ...