专栏首页音视频技术Dav1d移动端解码高清视频达30FPS

Dav1d移动端解码高清视频达30FPS

LiveVideoStack 招募

LiveVideoStack正在招募编辑/记者/运营,与全球顶尖多媒及技术专家和LiveVideoStack年轻的伙伴一起,推动多媒体技术生态发展。了解岗位信息请在BOSS直聘上搜索“LiveVideoStack”,或通过微信“Tony_Bao_”与主编包研交流。

开源AV1解码器Dav1d 0.3.0版性能进一步提升,在SSSE3指令集上快24%、在SSE4.1上为26%、在AVX2(所有PC)上为4%,在ARM64上快12%。目前已知使用的解码器 VLC media player 3.0.6 应该还是相对较旧的版本,未来最新的4.0会采用最新解码库。但MPC-BE(beta)和PotPlayer最新版本已更新0.2.x以上的解码库。

文:Ewout ter Hoeven

翻译:蒋默邱泽

原文:

https://medium.com/@ewoutterhoeven/dav1d-0-3-0-sailfish-armed-to-the-teeth-af5bbf845a16

开源AV1解码器Dav1d近日更新版本0.3.0,在发布的第三个版本中,新的汇编代码在PC和移动平台上都提供了一些重要的性能提升。(访问这里了解详细的测试数据https://docs.google.com/spreadsheets/d/1kokRutDAZmIMHa7EHxMNefhezDVozkcHwXIK_7X6g1w/edit#gid=1963224812)

个人电脑

在x86方面,此版本主要改进了Dav1d的SSSE3性能。Jiang Xuefeng对亮度和Paeth帧内预测函数的色度预测做出了贡献,分别提高了0.8%和0.4%的全局性能。

Liwei Wang继续他的逆变换工作,针对更大的8x32,32x16和32x32以及高达64x64的块,提供了这个版本的最大速度优化,在一些视频上超过10%。

Dav1d 0.3.0还新增了第一个SSE4.1程序集。在大多数情况下添加的SSE4.1指令除了SSSE3之外没有太多利用上,但Victorien Le Couviour - Tuffet近一个月还在优化SSE4。他对CDEF约束方向增强滤波器滤波器进行了优化,使模块级别的速度提高了115倍,整体提升了1.5%。

与此同时,Henrik Gramner编写了一些非常聪明的SSE2代码来加速熵解码/码流读取,刚开始会占用大部分解码时间,尤其是在AVX2指令上。汇编代码为所有64位x86平台带来了加速,AVX2约为4%、SSSE3和SSE4.1约提升2%。

总的来看,这些测试使得SSSE3上的Dav1d 0.3.0快24%,SSE4.1快26%,AVX2 CPU快4%。

虽然单线程aomdec仍然非常强大,但是多线程Dav1d 0.3.0使libaom在下面对比图中的位置更微小。

Arm64

MartinStorsjö提供了两个非常好的提交,使用NEON汇编代码加速了loopfilter(NEON环路过滤器)和自导环路恢复。这两项功能都加速了大约3倍,使性能提升了7%到36%。不仅可以实现更高的分辨率、帧率和码率,还可以降低相同画面内容的硬件功耗。

在高通骁龙835上单核解码1080p视频突破25FPS,使用多个线程稳定30 FPS,某些内容甚至达到60FPS。

总结以上结果,我们看到《RED》的测试结果提升明显,因为它很大程度上依赖于loopfilter。单线程增益介于11%和36%之间(平均19%),多线程介于7%和16%之间。

应用现状

Dav1d的应用进行得非常顺利,重大新闻是Chrome浏览器和新的Microsoft Edge背后的开源项目Chromium现在也用了Dav1d,默认情况下将在Chrome 74中集成。

Firefox 67也在最新版本里使用了Dav1d,Dav1d已更新为0.2.1并使用了多线程。 除了Windows之外,默认情况下还在Linux和macOS上启用Dav1d解码。

FFmpeg和 VLC 自然也使用了Dav1d,一旦FFmpeg 4.2发布,Handbrake,自然也会考虑集成Dav1d。

Youtube越来越多的使用AV1编码,他们甚至编码了一些4K和8K分辨率高达60fps的视频,在这里了解如何让Youtube启用AV1。(https://www.youtube.com/testtube)

参考:

https://code.videolan.org/videolan/dav1d

https://code.videolan.org/videolan/dav1d/blob/master/NEWS

https://www.videohelp.com/software/PotPlayer

https://www.videohelp.com/software/MPC-BE

http://lazybing.github.io/blog/2019/01/28/av1-cdef-filter/

https://aomediacodec.github.io/av1-spec/av1-spec.pdf

本文分享自微信公众号 - LiveVideoStack(livevideostack)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • x64汇编第三讲,64位调用约定与函数传参.

    1.传参方式 首先说明一下,在X64下,是寄存器传参. 前4个参数分别是 rcx rdx r8 r9进行传参.多余的通过栈传参.从右向左入栈. 2.申请参数...

    IBinary
  • Go语言学习——彻底弄懂return和defer的微妙关系

      最近在写代码的时候经常遇到在return后,还要在defer里面做一些收尾工作,比如事务的提交或回滚。所以想弄清楚这个return和defer到底是什么关系...

    JackieZheng
  • 深入理解defer(上)defer基础

    f() 函数首先通过调用 getResource() 获取了某种资源(比如打开文件,加锁等),然后进行了一些我们不太关心的操作,但这些操作可能会导致 f() ...

    阿波张
  • go语言调度器源代码情景分析之五:汇编指令

    汇编语言是每位后端程序员都应该掌握的一门语言,因为学会了汇编语言,不管是对我们调试程序还是研究与理解计算机底层的一些运行原理都具有非常重要的作用,所以建议有兴趣...

    阿波张
  • 【C语言笔记】C语言编译的过程

    如果你使用的是集成开发环境,那么你点击编译按钮就可生成可执行文件,然后点击运行即可运行。那么,你知道从源代码到可执行文件经历了哪些过程吗。仅仅是编译?

    正念君
  • go语言调度器源代码情景分析之三:内存

    内存由大量内存单元组成,内存单元大小为1个字节(1字节包含8个二进制位), 每个内存单元都有一个编号,更专业的说法是每一个内存单元都有一个地址,我们在编写汇编代...

    阿波张
  • go语言调度器源代码情景分析之六:go汇编语言

    go语言runtime(包括调度器)源代码中有部分代码是用汇编语言编写的,不过这些汇编代码并非针对特定体系结构的汇编代码,而是go语言引入的一种伪汇编,它同样也...

    阿波张
  • x64汇编第四讲,c / C++中调用x64汇编

    在x86下,我们的C/C++调用汇编可以直接 __asm进行内联. 或者也可以直接静态链接

    IBinary
  • go语言调度器源代码情景分析之二:CPU寄存器

    寄存器是CPU内部的存储单元,用于存放从内存读取而来的数据(包括指令)和CPU运算的中间结果,之所以要使用寄存器来临时存放数据而不是直接操作内存,一是因为CPU...

    阿波张
  • 雷军的贵人,剑网3,WPS,武当弟子:求伯君传奇

    1991年11月4日,在一个计算机展览会上,求伯君和雷军第一次相遇,求伯君邀请雷军加入公司,雷军从武汉大学毕业创立公司刚失败,正好有这个机会就加入了,雷军回忆说...

    IT大咖说

扫码关注云+社区

领取腾讯云代金券