优化 Dav1D
来源:Global Video Tech Meetup:New York 主讲:来自 Two Orioles 的 Ronald S. Bultje 翻译整理:钟宏成 本次演讲介绍了 AV1 的软件解码器 dav1d 的一些优化进展,关于特定编码工具的解码优化、HDR/10bit 内容的优化、更好的多线程优化。最后,在 Q&A 中提到,软件解码器基本上是启动生态系统,希望一年或两年后,我们都将使用硬件解码器。
目录
- 介绍
- 案例1:特定编码工具的解码优化
- 案例2:HDR/10-bit 的优化
- 案例3:更好的多线程
- Q&A
介绍
Dav1d 是一个 AV1 软件解码器,AV1 是开放媒体联盟在2018年发布的一个视频编码标准,用于互联网视频流,包括视频聊天、视频直播、视频点播等。
Dav1d 是一个 videoLan 的项目,在 2-clause BSD 许可下开源。Dav1d 的目标是快速、高效,包含帧级、tile级、后处理滤波的多线程,以及平台优化包括 Arm(Neon), x86(AVX2/SSSE3)。
案例1:特定编码工具的解码优化
AOM 的一个工作组 SIWG 的 Victor Cherepanov 进行了编码工具的解码复杂度实验,实验通过在编码时每次关闭一个特定编码工具,然后检测解码器的解码时间变化,从而反映编码工具在解码复杂度中的贡献。通过分析该图可以发现 dav1d 的实现中显著慢于 gav1 实现的部分,从而优化解决。
案例2:HDR/10-bit 的优化
reddit 上的一个用户 post 了 AV1 HDR 播放的性能问题,事实上这就是 HDR/10-bit 的优化问题,半年多前我们开始为 dav1d 加入 HDR/10-bit 的 SIMD 优化,ARM 上的大部分工作都已经完成;最近在对 x86 平台进行优化,AVX2 的代码从 rav1e 的代码开始,已经完成了大部分工作,SSSE3 的还在 TODO 列表中。
SIMD 优化的加速效果是分明显,从基本无法播放加速到性能接近 8bit 内容。具体来说,相同内容的 10bit 解码比 8bit 解码慢 25% 左右,这是预期中的,因为 10bit 解码需要更多内存。
案例3:更好的多线程
Dav1d 包含帧级、tile 级、后处理滤波的多线程。来自程序员的建议通常是同时使用所有多线程优化,但这事实上是困难的。
- 使用全部的这三个线程类型有很多选项需要用户配置,但这些在理想中应该是由程序自动完成的,尤其是这些配置是与内容相关的(设置多少tile,多少后处理滤波线程?)。
- 以帧级多线程为例,实际上需要很多线程来饱和特定的核心数,所以添加新线程的系统负载倍数相对较低。这意味着,使用所有这些线程类型最终会产生大量的线程,而这些线程大部分时间都在休眠。
- 在移动系统(大小核系统)上有额外的问题,因为线程会分布在大小核心上,解码器有内在的期望,即这些线程的每一个都有类似的输入,在大小核心系统上,小核心上的任务将拖慢整个解码过程。
因此我们希望能够改进这个过程,我们创建了一些 tasks,与之前的不同多线程机制类似。一些并行的工作线程从全局的 task 池中获取任务并执行。因此,并发的种类不再是多个类型的多线程,而是变成 task 的并行。这带来下列的好处:
- 相比之前的每个多线程类型都有一个配置,现在我们只有单一的配置;
- 可以添加新的多线程类型,而不会添加或更改任何 API;
- 现在可以达到目标的核占用,而与内容类型无关了(比如内容没有分tile,没有后处理滤镜的时候无法使用这些类型的多线程)
- 可以更好地伸缩,特别是在移动平台上。
以上就是所有分享的内容,如果你想知道如何使用 dav1d,或者它如何适用于你?答案是你可能已经在使用它了。比如多媒体框架 FFmpeg,GStreamer,播放器 VLC,或者浏览器 Firefox,Chrome。
Q&A
Q: 我们看到 AV1 在三星电视或 Roku 电视中被推出,它们的解码器将是硬件解码器。
A: 我认为在短期内,他们将使用 dav1d 作为后备软件解码器,但这真的应该被视为 placeholder。正如你提到的,用户最终使用硬解码是非常理想的,因为它在回报吞吐量方面给予更多保证、使用更少的能量,所以这对环境更好,等等。软件解码器基本上是启动生态系统,希望一年或两年后,他们都将使用硬件解码器。
附上演讲视频:
相关文章
- 开源项目丨ChengYing 1.1版本重磅发布:新增超多功能,全新优化体验!
- 03 uniapp/微信小程序 项目day03
- MatrixOne从入门到实践03——部署MatrixOne
- HTML介绍
- 9 个美观大气的后台管理系统
- 浏览器渲染和原理
- Linux 利用Cgroup 资源控制
- 面试 考察网络请求HTTP相关知识(第六天!)
- 开源公开课丨大数据调度系统Taier任务调度介绍
- Hadoop常见的文件格式及压缩算法
- 在windows上用docker desktop安装StoneDB
- 浏览器同源策略
- 【StoneDB Class】入门第二课:StoneDB整体架构解析
- 用HTTP服务的方式集成 learned cardinality estimation 方法进 Postgresql
- 【StoneDB研发日志】union功能bug记录
- 前端首屏渲染时间的极致优化
- Vue项目打包成docker镜像部署
- VS Code For Web 深入浅出 -- 导读篇
- <video>poster属性不生效问题
- HTTP协议及状态码