这篇文章介绍下研究AV1必须要熟悉的AV1 Specification,也称为AV1 标准文档。
AV1 标准文档
AV1的标准文档是可以通过AOM的官方Github页面拿到最新版本的。这里是链接。如果因为某些原因访问不到网站的话,可以在CSDN下载频道下载。
下载下来的文档首页为
我没有记错的话,全文应该是681页。从首页图中也可以看出,发布的时间正是参考软件libaom-av1的Version 1.0.0 Errata 1发布的时候,具体关于Reference Software的内容参考我的另一篇博文 [AV1] AV1 Reference Software
How to 阅读标准文档
标准文档一共分为六个部分,共计15章如下:
- Scope
- Terms and definitions
- Symbols and abbreviated terms
- Conventions
- Syntax structures
- Syntax structures semantics
- Decoding process
- Parsing process
- Additional tables
- 10章之后的内容 Annex
第一章我们一般跳过,就是说的这本标准所定义的内容。
从第二章开始就有点内容了,第二章可以看看术语,了解关于AV1的一些名词的解释,这些术语大部分都是视频编解码的标准间所通用的,比如说 luma,chroma,block等用语。
第三章也是一些术语,但这些术语是代码中的定义,一般是宏定义,这些量都是定死了的,一般声明为C++中的const常量或者直接预处理define出来,看这些有利于进一步读懂源码。
第四章是一些约定俗成的符号定义,这些一般过一遍就好,这些符号会在后面的semantics部分解释每一个syntax的时候,如果要计算,那么就会用到,用到的时候再回来翻就行了。
第五章就真正来到了重要的地方了,这是语法结构部分,解码器解析的时候就是按照这个表来进行一个个地读取syntax,这个过程叫做parsing,我们挑一个条目来看看:
这是OBU的头部语法(OBU是啥?看看 [AV1] Open Bitstream Unit)这里代码的写法与实际代码中相对应。
从这里我们可以看出,解析一个obu_header,需要一共解析五个syntax,这里的syntax就是用黑体表示,并且右边Type中有值的项目,五个syntax分别为
- obu_forbidden_bit
- obu_type
- obu_extension_flag
- obu_has_size_field
- obu_reserved_1bit
那右边的 f(1)是什么意思呢?我们可以看到第4.8节,4.9节,4.10节,这里告诉你这些个表达到底是什么意思。(这里的f(1)代表从流中读出一个比特,解析为unsigned number)
第六章就是针对第五章中的每一个syntax的含义解释了,这个含义解释的专业术语叫semantic,称为语义,
在这里,我们可以看到第五章的几个syntax的具体含义。
第七章是解码过程,就是利用我们第五章parsing出来的syntax,然后正式进入解码流程,最终还原为reconstructed frame/sequence的过程描述。
第八章是parsing过程,这章主要讲解我们之前说的syntax所说的读取一个比特,读取多个比特,或者使用算数编码读取比特的这些熵编码过程的逆向过程的实现。
第九章就是一些表格,包含标准里根据经验或者大量实验得出的一些固定的预设值,这些值(table)都可以直接在代码里找到。
第十章开始就是附录了,包括profile,level,比特流格式等材料。
做视频编解码,这本标准,肯定是少不了的。