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

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

2018-4-23 09:39

从上个世纪本腾I电脑播放VCD,通过巧妙的算法优化,可以在损失部分效果的情况下在低性能的电脑上播放VCD。时至今日,硬件性能大幅飙升,许多算法近乎“失传”了。但对于充满好奇心的程序员,研究这些算法能够更加了解多媒体底层实现原理。本文是资深多媒体开发工程师鲍金龙在《移动音视频开发进阶暨新书分享会》上的分享整理而成。谨以此文向鲍金龙这样还在一线开发的多媒体老兵致敬。


文 / 鲍金龙

整理 / LiveVideoStack


大家好,我是第二次参加LiveVideoStack举办的活动,第一次参加的时候我准备了两部分内容:程序化和流行的VR、AR。当时出品人陆老师(陆其明)谈到单纯地讲程序化太偏,可能整体效果不好,于是我临时改换了演讲主题,讲另外一个也就是VR、AR的案例。但是在参会时有人向我反映,在这种纯粹的讲代码讲技术的特殊行业,只讲例子反而不如今天讲的这个,所以我的思想发生了变化。这次来分享,我就迫不及待的把之前准备的东西拿出来,今天的内容也比较适合,短小精悍。我会与大家分享几个小例子和编码中一些小的技巧,而最近火热的区块链播放器,AI增强的另外一些编码器主题可能太大,需要更多的时间与大家讨论。我认为这些话题有可能在今年10月份有可能有结果,现在定论为时尚早。程序开发就是如此,等到大家出结果的时候,可能风口已经过去,大家也已经不追了,这是一种趋势。


我今天想与大家分享的有关程序化的最基本原则,如果你写C代码的话应该会对以下内容略知一二。



但接下来我要着重介绍的内容也许你之前并未有所了解。因为在10年前,业界还没有出现像LiveVideoStack这样的技术交流社区。当时在音视频这样一个特殊的技术领域,这种中立开放的技术交流平台是非常少的。当时国内的CSDN也不聚焦在音视频上,所以分享想法与观点就比较困难。我在CSDN确实分享过这些东西,但是,听众也不多。


这些话题是什么呢?



第一个话题是上古时代的SIMD技术。我们知道,英特尔SIMD技术是在1997年发布的。但是在那之前,在奔腾处理器的时代,大家也有使用视频播放器的需求。那时候程序员想了很多的办法,实现了类似于SIMD的技术,也就是单指令多数据技术,用普通指令模拟执行 。当时的这个代码现在不太能找到,其最经典的作者是梁肇新先生,一位令人尊敬的前辈。


第二个话题是上古时代的机器学习。这里介绍一种比较原始的机器学习和统计分析的例子。如果探讨DCT编码中DCT系数的分布规律,非零系数的分布是很稀疏的,换句话说当你看到一个8*8的块,看到图像的数值范围分布是非常少的,并不是分布在所有的数据范围内的,那么当你看到这种分布之后便有可能会得出一种很实用的快速算法。当时这个算法用于IDCT变换时创造了一个奇迹,其性能大幅领先于当时所有的著名算法200%以上。


第三个话题是快速开平方和并行查表。近些年这些技术在移动互联网、软件、手机、ARM等平台上复活了。因为在2005年时,这些技术我准备放弃了,因为当时大家都在用GPU CUDA、DSP,可能永远用不到这些了。但是马上到了2007~2009年,以 IOS、安卓为代表的移动互联网终端操作系统诞生,手机芯片性能很弱需要大幅优化;而且当时这些手机SoC中也没有GPU加速。也正因为这样快速开平方与并行查表再次被重视,得以快速发展,使用的效果也非常好。


第四个话题是使用动态代码做快速重采样。动态代码之前多被用于嵌入设备,包括图形处理,尤其在显卡的驱动上都在被使用。但是在移动平台,或者对于下一代的编解码技术,在仿射变化等技术上需要大量的重采样计算,那么当需要极度的性能优化时我们可以使用动态代码进行快速重采样。


一、上古时代的SIMD技术

1、极端应用



关于这个话题的例子是视频YUV转RGB。上个世纪还没有YUV加速,显卡最多是65536色,16位色,甚至是256色,性能上十分捉襟见肘,如何让用户看上VCD?有人提出一种极端的堪称世界纪录的方法以满足这种需求,直接用数值计算 :r=g=b=y。这就使得我们不需要任何加速,和memcpy一样直接进行拷贝。



虽然因此导致了视频画面发红(紫),但这种算法至少改进了无法观看或

观看卡顿的现象。但是很快有人思考其实不需要如此极端,并进行了稍微改进。也就是做一个查表。


2、查表



以上是详细算法。对y进行详细计算,实际上是用整数计算再做一个裁减。这种算法显示的是黑白电影,效果比较好,画面没有了色差,几乎与原画一致,但处理速度只是稍微慢了一点点。这就是所谓的在VCD时代处理大家看的黑白视频的一些技术。


3、进阶



接下来,如果大家想观看彩色视频该怎么办?当然不能是直接复制了。如果按照标准进行计算,那时还没有SIMD技术,只能常规进行一次一次的乘法,计算量浩大;加之那时CPU性能有限,即使算一个320*240分辨率的视频硬件也无法应对。面对这种困境有些人提出了新的算法,这种算法不仅在X86计算机上存在:例如在一个32位寄存器中储存两个小于等于255的无符号短整数时,可以给它乘上一个小于等于128的无符号整数,这个效果等于并行做了两次短整数乘法。如果从C语言开发的角度理解这个例子应该不难。用32位寄存器保存2个无符号的16位整数,要保证计算结果不会越界。


为了计算方便我们可以把这个式子稍微转换一下,调整常数,把乘法提出来。





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