- 原文地址:https://aomediacodec.github.io/av1-spec/av1-spec.pdf
- 没有梯子的下载地址:AV1 Bitstream & Decoding Process Specification
- 摘要:这份文档定义了开放媒体联盟(Alliance for Open Media)AV1视频编解码器的比特流格式和解码过程。
- 规范:此文档规定了开放媒体联盟(Alliance for Open Media)AV1比特流格式和解码过程。
语法结构
通用(General)
- 这一节以表格形式展示了语法结构。每个语法元素的含义在第6节中介绍。
低开销比特流格式(Low overhead bitstream format)
- 本规范定义了一种低开销比特流格式,它是由本节中定义的OBU(Object Based Unit)语法元素序列构成的。使用此格式时,obu_has_size_field必须等于1。对于需要更容易跳过帧或时间单元的格式的应用,附件B中定义了一种长度限定的比特流格式。
- 派生规范,例如使能存储AV1视频与音频或字幕一起的容器格式,应指明它们依赖于这些格式中的哪一种。也允许其他将OBUs打包成比特流格式的方法。
OBU语法(OBU syntax)
- 通用 OBU 语法( General OBU syntax)
- OBU 头部语法(OBU header syntax)
- OBU 扩展头部语法(OBU extension header syntax)
- 拖尾比特语法(Trailing bits syntax)
- 字节对齐语法(Byte alignment syntax)
保留 OBU 语法(Reserved OBU syntax)
- 注意:保留的OBUs没有定义的语法。obu_type的保留值是为将来使用而保留的。如果解码器不理解obu_type,应该忽略整个OBU。可以根据obu_size来忽略OBU。对于这种OBU类型的有效负载数据的有效内容的最后一字节被认为是不等于零的最后一字节。这个规则是为了防止系统将尾随的零字节解释为OBU中尾随位的延续而丢弃有效的字节。这意味着,当这种OBU类型有任何有效负载数据时,至少有一个字节的有效负载数据(包括尾随位)不应等于0。
序列头部 OBU 语法(Sequence header OBU syntax)
- 通用序列头部 OBU 语法(General sequence header OBU syntax)
- 颜色配置语法(Color config syntax)
- 时间信息语法(Timing info syntax)
- 解码器模式信息语法(Decoder model info syntax)
- 操作参数信息语法(Operating parameters info syntax)
时间分隔符 obu 语法(Temporal delimiter obu syntax)
- 注意:时间分隔符有一个空的有效载荷。
填充 OBU 语法(Padding OBU syntax)
- 注意:obu_padding_length(OBU填充长度)没有在比特流中编码,但可以根据obu_size(OBU大小)减去尾部字节的数量来计算。实际上,由于这是为了被跳过而添加的填充数据,解码器不需要确定该长度或尾部字节的数量。它们可以忽略整个OBU。可以根据obu_size忽略整个OBU。对于这种OBU类型的有效载荷数据,其有效内容的最后一个字节被认为是最后一个不为零的字节。这个规则是为了防止那些将尾部零字节解释为OBU中尾部位延续的系统错误地丢弃有效字节。这意味着,当这种OBU类型有任何有效载荷数据时,至少有一个字节的有效载荷数据(包括尾部位)不应等于0。
元数据OBU语法(Metadata OBU syntax)
- 通用元数据 OBU 语法(General metadata OBU syntax)
- 注意:当metadata_type(元数据类型)等于为将来使用或用户私有值保留的值时,此规范中并未定义metadata_obu(元数据OBU)的确切语法。如果解码器不理解metadata_type,应该忽略整个OBU。有效数据内容的最后一个字节被认为是最后一个不为零的字节。这个规则是为了防止那些将尾部零字节解释为OBU中尾部位延续的系统错误地丢弃有效字节。这意味着,当这种OBU类型有任何有效载荷数据时,至少有一个字节的有效载荷数据(包括尾部位)不应等于0。
- 注意:当metadata_type(元数据类型)等于为将来使用或用户私有值保留的值时,此规范中并未定义metadata_obu(元数据OBU)的确切语法。如果解码器不理解metadata_type,应该忽略整个OBU。有效数据内容的最后一个字节被认为是最后一个不为零的字节。这个规则是为了防止那些将尾部零字节解释为OBU中尾部位延续的系统错误地丢弃有效字节。这意味着,当这种OBU类型有任何有效载荷数据时,至少有一个字节的有效载荷数据(包括尾部位)不应等于0。
- 元数据 ITUT T35 语法(Metadata ITUT T35 syntax)
- 注意:itu_t_t35_payload_bytes 的确切语法在本规范中未定义。外部规范可以定义语法。如果解码器不理解它,应该忽略整个OBU。有效数据内容的最后一个字节被认为是最后一个不为零的字节。这个规则是为了防止那些将尾部零字节解释为OBU中尾部位延续的系统错误地丢弃有效字节。这意味着,当这种OBU类型有任何有效载荷数据时,至少有一个字节的有效载荷数据(包括尾部位)不应等于0。
- 注意:itu_t_t35_payload_bytes 的确切语法在本规范中未定义。外部规范可以定义语法。如果解码器不理解它,应该忽略整个OBU。有效数据内容的最后一个字节被认为是最后一个不为零的字节。这个规则是为了防止那些将尾部零字节解释为OBU中尾部位延续的系统错误地丢弃有效字节。这意味着,当这种OBU类型有任何有效载荷数据时,至少有一个字节的有效载荷数据(包括尾部位)不应等于0。
- 元数据高动态范围HDR内容光照水平语法(Metadata high dynamic range content light level syntax)
- 元数据高动态范围HDR主控显示色域体积语法(Metadata high dynamic range mastering display color volume syntax)
- 元数据可分层语法(Metadata scalability syntax)
- 可分层结构语法(Scalability structure syntax)
- 元数据时间码语法(Metadata timecode syntax)
帧头部 OBU 语法(Frame header OBU syntax)
- 通用帧头部 OBU 语法(General frame header OBU syntax)
- 未压缩头部语法(Uncompressed header syntax)
- 获取相对距离函数(Get relative distance function)
- 这个函数通过将两个顺序提示值相减的结果进行符号扩展,来计算它们之间的距离。
-
参考帧标记函数(Reference frame marking function)
-
帧大小语法( Frame size syntax)
-
渲染大小语法(Render size syntax)
-
有参考性的帧大小语法(Frame size with refs syntax)
-
超分辨率参数语法(Superres params syntax)
-
计算图像大小函数(Compute image size function)
-
插值滤波语法(Interpolation filter syntax)
-
环路滤波参数语法(Loop filter params syntax)
-
量化参数语法(Quantization params syntax)
-
量化增量语法(Delta quantizer syntax)
-
段参数语法(Segmentation params syntax)
- 在这种语法中使用的常量查找表被定义为:
- 在这种语法中使用的常量查找表被定义为:
-
瓦片 Tile 信息语法(Tile info syntax)
-
瓦片 Tile 大小计算函数(Tile size calculation function)
- tile_log2 返回最小的值 k,使得 blkSize << k 大于或等于目标值。
- tile_log2 返回最小的值 k,使得 blkSize << k 大于或等于目标值。
-
量化器索引增量参数语法(Quantizer index delta parameters syntax)
-
环路滤波增量参数语法(Loop filter delta parameters syntax)
-
CDEF 参数语法(CDEF params syntax)
- (Constrained Directional Enhancement Filter, 限制性方向增强滤波器)
-
环路恢复参数语法(Loop restoration params syntax)
- 其中 Remap_Lr_Type 是一个常量查找表,规定如下:
-
变换模式语法(TX mode syntax)
-
跳过模式参数语法(Skip mode params syntax)
-
帧参考模式语法(Frame reference mode syntax)
-
全局运动参数语法(Global motion params syntax)
-
全局参数语法(Global param syntax)
- 注意:当 force_integer_mv 等于 1 时,仍然会读取一些用于平移分量的小数位。然而,在设置全局运动矢量(Setup Global MV)的过程中,这些小数位将被丢弃。
-
解码带有引用的带符号下标指数语法(Decode signed subexp with ref syntax)
- 注意:decode_signed_subexp_with_ref 将返回一个在 low 到 high - 1(含)范围内的值。
- 注意:decode_signed_subexp_with_ref 将返回一个在 low 到 high - 1(含)范围内的值。
-
解码带有引用的无符号下标指数语法(Decode unsigned subexp with ref syntax)
- 注意:decode_unsigned_subex_with_ref 将返回一个在 0 到 mx - 1(含)范围内的值。
- 注意:decode_unsigned_subex_with_ref 将返回一个在 0 到 mx - 1(含)范围内的值。
-
解码下标语法(Decode subexp syntax)
-
逆中心化函数(Inverse recenter function)
-
电影颗粒参数语法(Film grain params syntax)
-
时间点信息语法(Temporal point info syntax)
帧 OBU 语法(Frame OBU syntax)
瓦片组 OBU 语法(Tile group OBU syntax)
-
通用瓦片组 OBU 语法( General tile group OBU syntax)
-
解码瓦片语法(Decode tile syntax)
其中 Sgrproj_Xqd_Mid 和 Wiener_Taps_Mid 是被规定为如下的常量查找表:
-
清除块解码标志函数(Clear block decoded flags function)
-
解码分区语法(Decode partition syntax)
-
解码块语法(Decode block syntax)
其中 reset_block_context() 被指定为:
-
模式信息语法(Mode info syntax)
-
帧内模式信息语法(Intra frame mode info syntax)
-
帧内段ID语法(Intra segment ID syntax)
-
读取段 ID 语法(Read segment ID syntax)
其中neg_deinterleave是一个函数,定义如下:
-
skip模式语法(Skip mode syntax)
-
skip语法(Skip syntax)
-
量化器索引增量语法(Quantizer index delta syntax)
-
环路滤波增量语法(Loop filter delta syntax)
-
段特征激活函数(Segmentation feature active function)
-
变换大小语法(TX size syntax)
Max_Tx_Depth 表指定了每个块大小的最大变换深度:
注意:Max_Tx_Depth 包含了变换必须分割的次数,以达到 4x4 变换大小。这个数字可以大于 MAX_TX_DEPTH。然而,不可能编码一个大于 MAX_TX_DEPTH 的变换深度,因为 tx_depth 只能编码范围在 0 到 2 之间的值。 -
块变换大小语法(Block TX size syntax)
-
可变变换大小语法(Var TX size syntax)
read_var_tx_size 用于读取变换大小树。
-
帧间模式信息语法(Inter frame mode info syntax)
-
帧间段ID语法(Inter segment ID syntax)
这在跳过语法元素被读取之前(preSkip 等于 1)和之后(preSkip 等于 0)被调用。
-
是帧间语法(Is inter syntax)
-
获取段ID函数(Get segment ID function)
预测的段ID是当前块覆盖的分割图中屏幕上的区域中找到的最小值。
-
帧内块模式信息语法(Intra block mode info syntax)
-
帧间模式信息语法(Inter block mode info syntax)
函数 has_nearmv 被定义为:
函数needs_interp_filter被定义为:
-
过滤帧内模式信息语法(Filter intra mode info syntax)
-
参考帧语法(Ref frames syntax)
-
分配运动矢量语法(Assign MV syntax)
-
读取运动模式语法(Read motion mode syntax)
其中 is_scaled 是一个函数,用于确定参考帧是否使用了缩放,并且被指定为:
-
读取帧间帧内语法(Read inter intra syntax)
-
读取复合类型语法(Read compound type syntax)
-
获取模式函数(Get mode function)
-
运动矢量语法(MV syntax)
-
运动矢量分量语法(MV component syntax)
-
计算预测语法(Compute prediction syntax)
-
残差语法(Residual syntax)
-
变换块语法(Transform block syntax)
-
变换树语法(Transform tree syntax)
transform_tree 用于读取以变换树形式排列的多个变换块。
其中 find_tx_size 用于找到与给定尺寸匹配的变换大小,其定义如下:
-
获取变换大小函数(Get TX size function)
-
获取平面残差尺寸函数(Get plane residual size function)
get_plane_residual_size 函数返回指定平面的残差块的大小。(残差块的宽度和高度至少都将等于4。)
Subsampled_Size 表被定义为:
-
系数语法(Coefficients syntax)
-
计算变换类型函数(Compute transform type function)
其中 Tx_Type_In_Set_Inter 和 Tx_Type_In_Set_Intra 两个表被如下指定:
-
获取扫描函数(Get scan function)
-
帧内角度信息亮度分量语法(Intra angle info luma syntax)
-
帧内角度信息色度分量语法(Intra angle info chroma syntax)
-
是否为方向模式函数(Is directional mode function)
-
读取 CFL alphas 语法(Read CFL alphas syntax)
-
调色板模式信息语法(Palette mode info syntax)
- 函数 sort(arr, i1, i2)会将数组 arr 中的子数组就地按升序排序。需要排序的子数组包含索引 i1 和 i2 之间的元素(包括索引 i1 和 i2)。
- 注意:调色板颜色是按升序生成的。调色板缓存也是按升序排列的。这意味着在实现中,排序函数可以通过合并两个已排序的列表来替代。
- 其中,函数 get_palette_cache,用于将上方和左侧的调色板合并形成一个缓存,其规定如下:
注意:get_palette_cache 函数的作用相当于将上方和左侧可用的调色板颜色一起排序,并去除任何重复项。
-
变换类型语法(Transform type syntax)
其中函数中使用的反转表被如下指定:
-
获取变换设置函数(Get transform set function)
-
调色板标记语法(Palette tokens syntax)
-
调色板颜色上下文函数(Palette color context function)
-
是否在内部函数(Is inside function)
is_inside 函数用于确定候选位置是否在当前瓦片内部。
-
是否在内部滤波器区域函数(Is inside filter region function)
is_inside_filter_region 函数用于确定候选位置是否在用于CDEF滤波的区域内。
-
限制运动矢量行函数(Clamp MV row function)
-
限制运动矢量列函数(Clamp MV col function)
-
清除 CDEF 函数(Clear CDEF function)
-
读取CDEF语法(Read CDEF syntax)
-
读取循环恢复语法(Read loop restoration syntax)
其中 count_units_in_frame 是一个被指定为的函数:
-
读取循环恢复单元语法(Read loop restoration unit syntax)
其中,Wiener_Taps_Min、Wiener_Taps_Max、Wiener_Taps_K、Sgrproj_Xqd_Min 和 Sgrproj_Xqd_Max 是固定的查找表:
Sgr_Params 是在第 7.17.3 节定义的固定查找表,而 decode_signed_subexp_with_ref_bool 是一个函数,其规定如下:
注意:decode_signed_subexp_with_ref_bool 函数与 decode_signed_subexp_with_ref 函数相似,不同之处在于用于表示符号的比特是使用算术编码而不是直接从比特流中读取。
瓦片列表 OBU 语法(Tile list OBU syntax)
-
通用瓦片列表 OBU 语法(General tile list OBU syntax)
-
瓦片列表头目语法(Tile list entry syntax)