找回密码
 立即注册
LiveVideoStack 首页 资讯 查看内容
  • QQ空间
  • 回复
  • 收藏

从奔腾I的VCD播放到AI区块链播放器——程序优化的魔法(3)

2018-4-23 11:03

如果是快速变化的话需要进行两次,先进行水平变化再进行垂直变化。这使得运算量被大幅减小,同时预先生成的参数表体积小很多。这些改进带来的实际性能提升可达到3倍以上,可以说是巨大提升了。一般我们现在看到的,不论哪里的代码,做一个拉伸都是做两次而不是做一次;当然也有特殊情况下迫不得已做一次的,比如当我们进行旋转或者一些特殊变换时,做两次变化实在不方便。最后面的例子会讲做两次变化会有多么复杂。



以这种情况为例,例如黑方块中存储了原始图像的数据。因为是拉伸,一定要在中间要插入一些数据,插入数据时基本遵循两点:第一是根据它的位置计算相应乘法的四个系数,以此对应的原始的像素就是四个像素;第二个是做乘法时先查表,查表之后load四个像素进来,然后做四个乘加。



做两趟虽然优化了很多,但还是不够的。例如以此方法对1080p的视频进行拉伸处理,做两趟拉伸的时候按照现在的CPU性能还是非常慢,一般来说单核心也需要二三十毫秒;如果是4K就更不行了。能不能更快一点?分析一下不难得出,查表有天然的劣势:第一是两个点四个像素一样,但写静态代码、查表是无法预先判断出来这一点的,于是就会重复地读取源像素;第二会造成大量的地址不对齐情况。以下是解决办法:


1、动态代码



动态代码可以解决以上两个问题。什么是动态代码呢?这个函数在执行的时候,我们获取了原始宽和高和目的宽和高,可以立刻编译生成一对代码,在编译的时候我们就可以把这个宽高信息完全写进代码。这样这个代码可以做得很短小精悍,避免任何重新读取的情况。下面是具体过程:首先输入拉伸参数,将参数写在内存里面;根据拉伸比生成参数数组。每条指令都要判断,如果这个像素点需要重复使用的时候,可以PUSH或者MOVE,储存以便于下次运算时使用。在这之后用SIMD指令一次读取多字节进来,读取数据时候地址对齐。我们需要哪些的时候,通过一类PSRLQ指令,PSLLQ、或者是其他的一些类似的指令,一次将其读取出来,这样读取的次数就少很多了。这两点上的改进十分明显,通过一个保守的测试可以看出,使用双三次b样条拉伸的动态代码,SSESE3的版本提高了15%,neon版本提高了30%。一般情况下动态代码等于全展开。如果是写静态代码可能4个像素一展开,8个像素一展开,动态代码简单一点的则是全展开。这一个函数没有循环而是把这一行全部做完。这个代码很大,有可能一个函数一兆多,而且在更夸张的情况下,例如如果我们将来涉及到仿射变换,或者是VR防变形技术,这个函数可能更庞大,写完一个有16兆大小。但是没有关系,有CPU预读取技术的存在,尽管函数大但跑起来依旧是很快的。其实我们可以计算出一个周期,也可以添加循环进去,但是做完这个带来的提升效果不显著,所以后来我写这些代码的时候一律全展开。



接下来是旋转。大家知道旋转是仿射变换的一种,旋转可以通过两步实现的,先做一个水平位移,再做一个垂直位移。图像基本就是这样进行旋转操作,先可以水平向上拉伸,拉伸为一个平行四边形再水平剪切,相当于旋转。这个计算量相对来说是降低了非常多。但这种情况非常复杂,跟其他的两个点阵点都是整数直接相对应的情况相比差别很大。


2、垂直变换



第一步是垂直变换。第一次变化的目的是內接矩形,这个线是「浮点」的。在做变换时候,如果想完全覆盖阴影,那么用的时候必须在点阵上采集数据,所以应当先逆向把点阵数据映射到原来的面积上,这一步相当于做了一个反锯齿。目视的是平行四边形,但在计算的时候并没有算实际上平行四边形的浮点数据,而是临近的一个整数上的位置数据,也就是进行重采样。这个过程跟以前任何一个重采样算法相比都是很相似的。一般来说旋转或者是仿射变换都有一种比较简单的甚至可以用临近点法;但如果是要编解码,要求最小的残差,这个时候还是要B样条。在HEVC, 264的时候大家都看到了,它在分数像素的时候,基本都是用四阶B样条来做的。


3、水平变换



第二步是水平变换。和之前垂直变化相似,只不过这里有三个明显的部分:a1d1是一对相似三角形,中间b是一个平行四边形的拉伸,但这种拉伸不是等距的,每个点的拉伸的比例都不一样,所以每个点都要重新算。这样做两次就会造成动态代码非常大的同时运算量少很多,这种情况下运算速度也会非常快。用这种方法处理完成后,基本上处理速度会有一倍左右的提升。


4、结果



两次变化本身就比一次单个变换快。使用动态代码计算量也会非常小。下一代的编解码器例如H.266或者AV1都会加入仿射变换。做编码器时快速仿射变换必不可少。


以上是我今天为大家带来的分享内容,如果将来有机会我非常想跟大家分享以区块链播放器为代表的新兴技术。这些作为当今音视频领域的研究重点,相信在未来会有进一步的研究成果。


WebRTCon 2018


继2017年第一届LiveVideoStackCon音视频技术大会之后,LiveVideoStack又一次出发——WebRTCon 2018,将于5月在上海举行,这是一次对过去几年WebRTC技术实践与应用落地的总结。


WebRTCon 2018设立了主题演讲,WebRTC与前端,行业应用专场,测试监控和服务保障,娱乐多媒体开发应用实践,WebRTC深度开发,解决方案专场,WebRTC服务端开发,新技术跨界,WebRTC与Codec等多个专场。邀请30余位全球领先的WebRTC技术专家,为参会者带来全球同步的技术实践与趋势解读。


原作者: 鲍金龙 来自: LiveVideoStack
文章点评
相关文章