AV1 Bitstream Decoding Process Specification--[8]: 语法结构语义-4
原文地址:https://aomediacodec.github.io/av1-spec/av1-spec.pdf
- 没有梯子的下载地址:AV1 Bitstream & Decoding Process Specification
- 摘要:这份文档定义了开放媒体联盟(Alliance for Open Media)AV1视频编解码器的比特流格式和解码过程。
- 规范:此文档规定了开放媒体联盟(Alliance for Open Media)AV1比特流格式和解码过程。
语法结构语义(Syntax structures semantics)
帧头OBU语义(Frame header OBU semantics)
参考帧标记语义(Reference frame marking semantics)
- RefValid 是一个数组,它通过参考图片槽位编号进行索引。数组中的值为1表示对应的参考图片槽位有效,可以作为参考图片使用;值为0则表示对应的参考图片槽位无效,不能作为参考图片使用。
- 注意:RefValid 仅在 frame_id_numbers_present_flag 等于1时用于定义有效的比特流。当帧距离过远,无法通过帧ID机制进行引用时,这些帧会被标记为无效。
帧大小语义(Frame size semantics)
- frame_width_minus_1 加一等于帧的宽度,以亮度样本为单位。
- frame_height_minus_1 加一等于帧的高度,以亮度样本为单位。
- 比特流一致性的要求是 frame_width_minus_1 必须小于或等于 max_frame_width_minus_1。
- 比特流一致性的要求是 frame_height_minus_1 必须小于或等于 max_frame_height_minus_1。
- 如果 FrameIsIntra 等于 0(表示该帧可能使用帧间预测),还必须满足第6.8.6节中描述的带有引用语义的帧大小的要求。
渲染大小语义(Render size semantics)
- 渲染尺寸是向应用程序提供的一个提示,关于期望的显示尺寸。它对解码过程没有影响。
- render_and_frame_size_different 等于 0 表示渲染宽度和高度是从帧宽度和高度推断出来的。render_and_frame_size_different 等于 1 表示渲染宽度和高度是明确编码的。
- 注意:即使渲染尺寸与帧尺寸完全匹配,也允许比特流在比特流中明确编码渲染尺寸。
- render_width_minus_1 加一等于帧的渲染宽度,以亮度样本为单位。render_height_minus_1 加一等于帧的渲染高度,以亮度样本为单位。
带有参考的帧大小语义(Frame size with refs semantics)
- 对于间隔帧,帧大小可以设置为等于参考帧的大小,或者可以显式发送。
- found_ref 等于 1 表示可以从参考帧 i 推断出帧尺寸,其中 i 是在 frame_size_with_refs`语法解析过程中的循环计数器。found_ref 等于 0 表示帧尺寸不能从参考帧 i 推断出来。
- 一旦为间隔帧计算出 FrameWidth 和 FrameHeight,对于所有 i 的值在 0…(REFS_PER_FRAME - 1) 的范围内,必须满足以下所有条件以符合比特流一致性要求:
- 2 * FrameWidth >= RefUpscaledWidth[ref_frame_idx[i]]
- 2 * FrameHeight >= RefFrameHeight[ref_frame_idx[i]]
- FrameWidth <= 16 * RefUpscaledWidth[ref_frame_idx[i]]
- FrameHeight <= 16 * RefFrameHeight[ref_frame_idx[i]]
- 注意:即使间隔帧中的所有块都使用内插预测进行编码,这也是一个要求。
超分参数语义(Superres params semantics)
- use_superres 等于 0 表示不需要进行上采样。use_superres 等于 1 表示需要进行上采样。
- coded_denom 用于计算上采样的量。
- SuperresDenom 是一个分数的分母,它指定了上采样前后超块宽度之间的比例。这个分数的分子等于常数 SUPERRES_NUM。
计算图像大小语义(Compute image size semantics)
- MiCols 是帧中 4x4 块列的数量。
- MiRows 是帧中 4x4 块行的数量。
插值滤波器语义(Interpolation filter semantics)
- is_filter_switchable 等于 1 表示滤波器选择在块级别进行信号传输;is_filter_switchable 等于 0 表示滤波器选择在帧级别进行信号传输。
- interpolation_filter 指定用于执行间隔预测的滤波器选择:
环路滤波器语义(Loop filter semantics)
- loop_filter_level 是一个包含循环滤波器强度值的数组。根据被过滤的图像平面和被过滤的边缘方向(垂直或水平),会使用数组中不同的循环滤波器强度值。
- loop_filter_sharpness 表示锐度水平。loop_filter_level 和 loop_filter_sharpness 共同决定何时对块边缘进行过滤,以及过滤可以改变样本值的程度。 循环滤波器的处理过程在第 7.14 节中描述。
- loop_filter_delta_enabled 等于 1 表示滤波器级别取决于用于预测块的模式和参考帧。loop_filter_delta_enabled 等于 0 表示滤波器级别不取决于模式和参考帧。
- loop_filter_delta_update 等于 1 表示存在额外的语法元素,这些元素指定哪些模式和参考帧增量需要更新。loop_filter_delta_update 等于 0 表示这些语法元素不存在。
- update_ref_delta 等于 1 表示存在语法元素 loop_filter_ref_delta;update_ref_delta 等于 0 表示这个语法元素不存在。
- loop_filter_ref_deltas 包含基于所选参考帧所需的滤波器级别调整。如果这个语法元素不存在,它保持其先前的值。
- update_mode_delta 等于 1 表示存在语法元素 loop_filter_mode_deltas;update_mode_delta 等于 0 表示这个语法元素不存在。
- loop_filter_mode_deltas 包含基于所选模式所需的滤波器级别调整。如果这个语法元素在帧中不存在,它保持其先前的值。
○ 注意:loop_filter_mode_deltas 和 loop_filter_ref_deltas 的先前值最初由 setup_past_independence 函数设置,并且可以由先前帧中编码的这些语法元素随后修改。
量化参数语义(Quantization params semantics)
- 残差通过解码系数指定,这些系数在应用逆变换之前会根据四个量化参数之一进行调整。选择哪个参数取决于平面(Y或UV)和系数位置(直流/交流系数)。去量化过程在第7.12节中指定。
- base_q_idx 表示基础帧的量化索引(qindex)。这用于Y交流系数,也是其他量化器的基准值。
- DeltaQYDc 表示相对于 base_q_idx 的Y直流量化器。
- diff_uv_delta 等于 1 表示U和V的增量量化器值分别编码。diff_uv_delta 等于 0 表示U和V的增量量化器值共享一个公共值。
- DeltaQUDc 表示相对于 base_q_idx 的U直流量化器。
- DeltaQUAc 表示相对于 base_q_idx 的U交流量化器。
- DeltaQVDc 表示相对于 base_q_idx 的V直流量化器。
- DeltaQVAc 表示相对于 base_q_idx 的V交流量化器。
- using_qmatrix 指定将使用量化器矩阵来计算量化器。
- qm_y 指定用于亮度平面解码的量化器矩阵中的级别。
- qm_u 指定用于色度U平面解码的量化器矩阵中的级别。
- qm_v 指定用于色度V平面解码的量化器矩阵中的级别。
Delta量化器语义(Delta quantizer semantics)
- delta_coded 指定是否存在 delta_q 语法元素。
- delta_q 指定了相对于基础量化指数(base_q_idx)的特定量化参数的偏移量。
段参数语义(Segmentation params semantics)
- AV1提供了一种将图像分割并在分段级别应用各种调整的方法。对于任何给定的帧,可以指定最多8个这样的分段。对于这些分段中的每一个,可以指定:
- 量化器(绝对值或增量值)。
- 循环滤波器强度(绝对值或增量值)。
- 预测参考帧。
- 块跳过模式,这意味着使用(0,0)运动矢量,并且不编码残差。
- 每个分段的这些数据值可以在帧级别单独更新。如果在给定帧中没有更新某个值,则保留上一帧的值。关键帧、仅内帧或其他需要从过去帧值独立的帧(例如,为了实现错误恢复)是这一规则的例外。在这些情况下,所有值都会按照setup_past_independence的语义进行重置。
- 分段隶属关系(分段图)以4x4块的分辨率存储。如果对块的分段隶属关系没有明确的更新,则它将从帧到帧地保持(直到通过调用setup_past_independence进行重置)。
- SegIdPreSkip 等于1表示在读取跳过语法元素之前将读取分段ID。SegIdPreSkip 等于0表示首先读取跳过语法元素。
- LastActiveSegId 表示具有某些启用功能的最高档分段ID。这用于解码分段ID时,只解码对应于已使用分段的选择。
- segmentation_enabled 等于1表示该帧使用了分段工具;segmentation_enabled 等于0表示该帧不使用分段。
- segmentation_update_map 等于1表示在解码该帧期间更新了分段图。segmentation_update_map 等于0表示使用上一帧的分段图。
- segmentation_temporal_update 等于1表示分段图的更新是相对于现有分段图编码的。segmentation_temporal_update 等于0表示新分段图的编码不参考现有分段图。
- segmentation_update_data 等于1表示即将为每个分段指定新的参数。segmentation_update_data 等于0表示分段参数应保持其现有值。
- feature_enabled 等于0表示相应的功能未被使用,并且其值为0。feature_enabled 等于1表示已编码了特征值。
- feature_value 指定了分段特征的特征数据。
瓦片信息语义(Tile info semantics)
- uniform_tile_spacing_flag 等于1表示帧上的瓦片均匀分布。(换句话说,除了右边和底部可能更小的瓦片外,所有瓦片大小相同。)uniform_tile_spacing_flag 等于0表示瓦片大小是编码的。
- increment_tile_cols_log2 用于计算 TileColsLog2。 TileColsLog2 指定帧横向瓦片数量的基数2对数。 TileCols 指定帧横向的瓦片数量。比特流一致性的要求是 TileCols 小于或等于 MAX_TILE_COLS。
- increment_tile_rows_log2 用于计算 TileRowsLog2。 TileRowsLog2 指定帧纵向瓦片数量的基数2对数。 注意:对于小尺寸的帧,由于瓦片大小向上取整到最大超块大小的倍数,实际瓦片数量可能小于期望数量。
- TileRows 指定帧纵向的瓦片数量。比特流一致性的要求是 TileRows 小于或等于 MAX_TILE_ROWS。
- tileWidthSb 用于指定每个瓦片的宽度,单位是超块。比特流一致性的要求是 tileWidthSb 小于 maxTileWidthSb。
- tileHeightSb 用于指定每个瓦片的高度,单位是超块。比特流一致性的要求是 tileWidthSb * tileHeightSb 小于 maxTileAreaSb。
- 如果 uniform_tile_spacing_flag 等于0,比特流一致性的要求是当循环写入 MiColStarts 退出时,startSb 等于 sbCols。
- 如果 uniform_tile_spacing_flag 等于0,比特流一致性的要求是当循环写入 MiRowStarts 退出时,startSb 等于 sbRows。
- 注意:对 startSb 的要求确保了每个瓦片的大小加起来等于帧的全尺寸,当以超块为单位测量时。
- MiColStarts 是一个数组,指定了图像中每个瓦片的起始列(单位是4x4亮度样本)。
- MiRowStarts 是一个数组,指定了图像中每个瓦片的起始行(单位是4x4亮度样本)。
- width_in_sbs_minus_1 指定瓦片宽度减1的单位是超块。
- height_in_sbs_minus_1 指定瓦片高度减1的单位是超块。
- maxTileHeightSb 指定瓦片可以使用的最大高度(单位是超块)(为了避免瓦片面积过大)。
- context_update_tile_id 指定用于CDF更新的瓦片。比特流一致性的要求是 context_update_tile_id 小于 TileCols * TileRows。
- tile_size_bytes_minus_1 用于计算 TileSizeBytes。
- TileSizeBytes 指定编码每个瓦片大小所需的字节数。
量化器索引 delta 参数语义(Quantizer index delta parameters semantics) - delta_q_present 指定是否存在量化指数增量值。
- delta_q_res 指定应该应用于解码后的量化指数增量值的左移位数。
环路滤波器 delta 参数语义(Loop filter delta parameters semantics) - delta_lf_present 指定是否存在循环滤波器增量值。
- delta_lf_res 指定应该应用于解码后的循环滤波器增量值的左移位数。
- delta_lf_multi 等于1表示为水平亮度边缘、垂直亮度边缘、U边缘和V边缘分别发送不同的循环滤波器增量值。delta_lf_multi 等于0表示所有边缘使用相同的循环滤波器增量值。
全局运动参数语义(Global motion params semantics)
- is_global 指定是否为特定的参考帧存在全局运动参数。
- is_rot_zoom 指定特定的参考帧是否使用旋转和缩放全局运动。
- is_translation 指定特定的参考帧是否使用平移全局运动。
全局参数语义(Global param semantics)
- absBits 用于计算可用于 gm_params[ref][idx] 的值的范围。允许的值在 -(1 << absBits) 到 (1 << absBits) 的范围内。
- precBits 指定用于表示 gm_params[ref][idx] 的分数位数。所有全局运动参数都以 WARPEDMODEL_PREC_BITS 分数位数存储在模型中,但参数的编码精度较低。
解码子指数语义(Decode subexp semantics)
- subexp_final_bits 提供了在确定了适当的范围之后读取的最终比特。
- subexp_more_bits 等于 0 表示参数在范围 mk 到 mk+a-1 内。subexp_more_bits 等于 1 表示参数大于 mk+a-1。
- subexp_bits 指定了参数的值减去 mk。
胶片颗粒参数语义(Film grain params semantics) - apply_grain 等于 1 表示应该在该帧添加电影颗粒。apply_grain 等于 0 表示不应该添加电影颗粒。
- reset_grain_params() 是一个函数调用,表示应该将 film_grain_params 中读取的所有语法元素设置为 0。
- grain_seed 指定用于电影颗粒合成过程中伪随机数的起始值。
- update_grain 等于 1 表示应该发送一组新的参数。update_grain 等于 0 表示应该使用之前的参数集。
- film_grain_params_ref_idx 指示哪个参考帧包含该帧要使用的的电影颗粒参数。 比特流一致性的要求是 film_grain_params_ref_idx 等于 ref_frame_idx[j],其中 j 的值在 0 到 REFS_PER_FRAME - 1 的范围内。
- 注意:这个要求意味着电影颗粒只能从当前帧作为参考帧的帧中预测。
- load_grain_params(idx) 是一个函数调用,表示应该将 film_grain_params 中读取的所有语法元素设置为由索引 idx 指定的内存区域中存储的值。
- tempGrainSeed 是一个临时变量,用于在调用 load_grain_params 时避免丢失 grain_seed 的值。当 update_grain 等于 0 时,应该使用之前的参数集,除了 grain_seed。
- num_y_points 指定亮度分量的分段线性缩放函数的点数。比特流一致性的要求是 num_y_points 小于或等于 14。
- point_y_value[i] 表示亮度分量的分段线性缩放函数的第 i 个点的 x(亮度值)坐标。这些值在 0…255 的尺度上信号化。(如果是10位视频,这些值对应于亮度值除以 4。如果是12位视频,这些值对应于亮度值除以 16。) 如果 i 大于 0,比特流一致性的要求是 point_y_value[i] 大于 point_y_value[i - 1](这确保了 x 坐标按递增顺序指定)。
- point_y_scaling[i] 表示亮度分量的分段线性缩放函数的第 i 个点的缩放(输出)值。
- chroma_scaling_from_luma 指定色度缩放是从亮度缩放推断出来的。
- num_cb_points 指定 cb 分量的分段线性缩放函数的点数。比特流一致性的要求是 num_cb_points 小于或等于 10。 注意:当 chroma_scaling_from_luma 等于 1 时,仍然允许 num_y_points 取值高达 14。这意味着色度缩放也需要支持高达 14 个点。
- point_cb_value[i] 表示 cb 分量的分段线性缩放函数的第 i 个点的 x 坐标。这些值在 0…255 的尺度上信号化。 如果 i 大于 0,比特流一致性的要求是 point_cb_value[i] 大于 point_cb_value[i - 1]。
- point_cb_scaling[i] 表示 cb 分量的分段线性缩放函数的第 i 个点的缩放(输出)值。
- num_cr_points 表示 cr 分量的分段线性缩放函数的点数。 比特流一致性的要求是 num_cr_points 小于或等于 10。 如果 subsampling_x 等于 1 并且 subsampling_y 等于 1 并且 num_cb_points 等于 0,比特流一致性的要求是 num_cr_points 等于 0。 如果 subsampling_x 等于 1 并且 subsampling_y 等于 1 并且 num_cb_points 不等于 0,比特流一致性的要求是 num_cr_points 不等于 0。
- 注意:这些要求确保了对于 4:2:0 色度子采样,电影颗粒噪声将应用于两个色度分量,或者都不适用。对于 4:2:2 或 4:4:4 色度子采样没有限制。
- point_cr_value[i] 表示 cr 分量的分段线性缩放函数的第 i 个点的 x 坐标。这些值在 0…255 的尺度上信号化。 如果 i 大于 0,比特流一致性的要求是 point_cr_value[i] 大于 point_cr_value[i - 1]。
- point_cr_scaling[i] 表示 cr 分量的分段线性缩放函数的第 i 个点的缩放(输出)值。
- grain_scaling_minus_8 表示应用于色度分量值的 -8 偏移。grain_scaling_minus_8 可以取值 0…3,决定了电影颗粒标准差的量程和量化步长。
- ar_coeff_lag 指定亮度和色度的自回归系数的数量。
- ar_coeffs_y_plus_128[i] 指定用于 Y 平面的自回归系数。
- ar_coeffs_cb_plus_128[i] 指定用于 U 平面的自回归系数。
- ar_coeffs_cr_plus_128[i] 指定用于 V 平面的自回归系数。
- ar_coeff_shift_minus_6 指定自回归系数的范围。值 0、1、2 和 3 分别对应于自回归系数的范围 [-2, 2)、[-1, 1)、[-0.5, 0.5) 和 [-0.25, 0.25)。
- grain_scale_shift 指定在颗粒合成过程中高斯随机数应该被缩小多少。
- cb_mult 表示用于推导 cb 分量缩放函数输入索引的 cb 分量乘数。
- cb_luma_mult 表示用于推导 cb 分量缩放函数输入索引的平均亮度分量乘数。
- cb_offset 表示用于推导 cb 分量缩放函数输入索引的偏移量。
- cr_mult 表示用于推导 cr 分量缩放函数输入索引的 cr 分量乘数。
- cr_luma_mult 表示用于推导 cr 分量缩放函数输入索引的平均亮度分量乘数。
- cr_offset 表示用于推导 cr 分量缩放函数输入索引的偏移量。
- overlap_flag 等于 1 表示应该应用电影颗粒块之间的重叠。overlap_flag 等于 0 表示不应该应用电影颗粒块之间的重叠。
- clip_to_restricted_range 等于 1 表示在添加电影颗粒后应该将样本值限制在限制(工作室)范围内(有关工作室摆动的解释,请参阅 color_range 的语义)。clip_to_restricted_range 等于 0 表示在添加电影颗粒后应该将样本值限制在全范围内。
变换模式语义(TX mode semantics)
- tx_mode_select 用于计算 TxMode。
- TxMode 指定如何确定变换大小:
- 对于 tx_mode 等于 TX_MODE_LARGEST,逆变换将使用能够适应块内的最大变换大小。
- 对于 tx_mode 等于 ONLY_4X4,逆变换将仅使用 4x4 的变换。
- 对于 tx_mode 等于 TX_MODE_SELECT,每个块的变换大小将被明确指定。
跳过模式语义(skip mode semantics)
- SkipModeFrame[list] 指定在 skip_mode 等于 1 时用于复合预测的帧。
- skip_mode_present 等于 1 表示语法元素 skip_mode 将存在。skip_mode_present 等于 0 表示该帧不使用 skip_mode。
- 注意:跳过模式尝试使用最近的前向和后向参考帧(根据 RefOrderHint 数组中的值进行测量)。如果未找到后向参考,则使用第二最近的前向参考。如果未找到前向参考,则禁用跳过模式。(前向预测是指使用被认为在当前帧之前输出的帧作为参考,后向预测是指使用尚未输出的帧作为参考。)
帧参考模式语义(Frame reference mode semantics)
- reference_select 等于 1 表示用于间隔块的模式信息包含语法元素 comp_mode,该元素指示是使用单一参考预测还是复合参考预测。reference_select 等于 0 表示所有间隔块将使用单一预测。
时间点信息语义(Temporal point info semantics)
- frame_presentation_time 指定了帧的呈现时间,这是从正在解码的运行点的最后一个随机访问点的移除时间开始,以时钟滴答(DispCT)计的。这个语法元素被信号化为一个固定长度的无符号整数,其长度(以比特为单位)由 frame_presentation_time_length_minus_1 + 1 决定。frame_presentation_time 是模 1 <<(frame_presentation_time_length_minus1+1) 计数器的余数。
帧OBU语义(Frame OBU semantics)
- 一个帧OBU由帧头OBU和瓦片组OBU组成,它们被打包进一个单一的OBU中。
- 注意:目的是为常见用例提供一个更紧凑的编码方式,在这种用例中,帧头紧随瓦片组数据之后。