VP8 编解码器优化更新

五月份 WebM 发布以来,开发团队一直在努力提升 VP8 视频编解码器的速度。社区成员也贡献了改进,但在性能这么令人感兴趣的领域内还有很多工作要做,尤其是下文提到的这些方面。

编码器

VP8 编码器很适合速度优化。Scott LaVarnway 编写 x86 汇编版本 量化器 的努力对此目标大有裨益,因为量化器在编码器决定从图像中传递多少细节时将被频繁调用。

对你们当中急于参与的人而言,比较容易做出的成果之一是编写SIMD 版的 ARNR 临时过滤代码。此外,大多数汇编代码仅利用了 SSE2 指令汇编,还有更新的扩展有待利用。还有很多冗余代码清除和其他清理工作要做(Yaowu Xu 就此提交了一些变更)。

更高层次地,大家可以探索一下编码器中所谓的替补运动搜索策略。最终运动搜索可完全分离,让运动区域在其他地方计算(如由显卡计算)。

解码器

解码器优化可为性能较低的硬件提供更高的分辨率以及更平滑的回放。

Jeff Muizelaar 提交了可将 IDCT 和求和与预测块并为单一函数的 一些 变更 ,帮助我们免于储存中间结果,由此降低了内存传输并避免了缓存污染。这彻底更改了汇编代码,因此我们需要将其他平台同步,或者将他们切换到通用 C 实现并接受性能下降。 Johann Koenig 正努力在 ARM 处理器上实现这些变更,我们也将尽早将这些变更合并到主开发分支中。

此外,Tim Terriberry 正着手在“bool 解码器”中实现另一种边界检查法。bool 解码器对性能有决定性影响,因为它在处理输入流中每个 bit 时都要被多次调用。当前的代码在最内层的循环中通过简单的“夹子”(clamp)和稍不频繁地复制入循环缓冲器处理该检查。这在数据率较高时性能开支将非常可观。Tim 的 patch 移除了循环缓冲器,而在最内层的循环中采用了更复杂的“夹子”。这些内层循环在嵌入平台上一直非常棘手。

基于这些努力,我也 开始着手 重写解码器的更高层部分。我相信关注数据区域性(data locality)与缓存规划可带来提升性能的机会,并在整体上降低内存总线流量。我打算探索的另一个领域是通过从图像重构的其他部分分离位流,使用比单个宏块更大的工作单元,不将功能与特定线程绑定,来增强多线程解码器的应用。要参与这些领域,请订阅 codec-devel 邮件列表并提供代码反馈。

嵌入式处理器

我们希望优化多平台,而不仅是桌面平台。Fritz Koenig 已经开始着手研究 VP8 在 Intel Atom 平台上的性能。此平台值得关注,因为现有的 x86 汇编代码是根据想象中的处理器编写的,杂乱无章。Atom 是一款准备妥当的处理器(与原来的 Pentium 非常相似),所有指令 x86 汇编代码的指令安排需要重新检验。一个可能是为 Atom 处理器安排代码,然后看是否会影响其他 x86 平台,如 Via C3 与 AMD Geode 上的性能。这显然是非常繁重的工作,但执行它可提供收紧汇编代码的机会。

这些问题,以及希望更好利用 x86_64 上更大的堆栈(register file),可能会重新激起每位汇编程序员最(不?)喜欢的争论:是否使用内置函数(intrinsics)。Yunqing Wang 对此做了一些实验,但我们对初期结果不抱期望。如果您在处理略有不同的相似平台上的大量汇编代码方面有经验,您可能对此类维护性问题比较熟悉。希望您能与我们在 codec-devel 邮件列表分享您的想法和经验。

优化编解码器是个反复的(有人会说是无尽的)过程,所以敬请期待更多关于我们工作进度的博文,当然,也请您尽管亲自着手于 hacking

Google 以外的开发者处得到大量代码贡献非常振奋人心,希望随着 WebM 成长为强大的社区动力,会有更多这样的贡献。

John KoleszarGoogle 的软件工程师。

原文链接:VP8 Codec Optimization Update by John Luther
本文编译:@
xslidian

发表评论

电子邮件地址不会被公开。 必填项已用*标注