AV1 OBU Frame解析
字段名 | bit数 | 意义 |
show_existing_frame | 1 | 解码器读取该帧的帧头,解析frame_to_show_map_idx字段,确定要显示的是DFB中的第几帧,根据frame_to_show_map_idx的索引值,在DFB中找到对应的已解码帧。直接将该帧送出以供显示,而不需要对当前OBU的负载进行常规的解码过程 |
frame_type | 1 | 指定帧的类型,如KYE_FRAME,INTER_FRAME或INTRA_ONLY_FRAME 仅帧内预测帧 |
show_frame | 1 | 指示该帧是否立即被显示show_frame=1 |
disable_cdf_update | 指定是否应在符号解码过程中禁用CDF更新 | |
allow_screen_content_tools | 1 | 控制是否允许编码器在压缩过程中使用针对屏幕内容的专用工具 |
force_integer_mv | 1 | 强制使用整像素运动矢量标志位,当设置为1时,视频流中,所有的运动矢量都必须使用整像素京都,禁止子像素精度运动矢量 |
frame_size_override_flag | 1 | 编码分辨率更新 |
order_hint | 是一个整数值,表示当前帧在显示顺序中的位置 | |
render_size() --> render_and_frame_size_different | 是AV1中用于指示是否显示指定渲染尺寸的标志位,配合render_size() 函数使用,不影响解码,仅影响显示 | |
allow_intrabc | 是AV1中用于控制是否启用帧内块复制IntraBC的标志位,仅适用于镇内帧,对屏幕内容压缩效果显著,但会禁用环路滤波器 | |
disable_frame_end_update_cdf | 用于控制是否在当前帧结束后更新CDF模型的标志位,用于错误恢复,并行处理或者特殊优化场景,不影响当前帧解码,只影响后续帧的上下文建模 | |
tile_info() ->uniform_tile_spacing_flag | AV1种用于指示Tile是否等于大小划分的标志位,为1时Tile均匀分布,为0时Tile大小需要逐个指定 | |
uniform_tile_spacing_flag | ||
increment_tile_cols_log2 | 是一个逐位递增的开关,用来均匀划分模式下,把水平Tile数量从最小允许值逐步调到编码器想要的2幂次 | |
increment_tile_rows_log2 | 行 | |
quantization_parames | 把帧级量化 + 可选的局部变量/滤波偏移打成一个包,解码端根据base_q_idx 算出全局qp,然后根据delta_q_ , delta_lf_,以及segmentation 做微调 | |
base_q_idx | 当前帧的基础量化步长索引,Y分量的AC系数量化步长由此决定 | |
delta_q_y_dc | Y分量DC系数量化偏移,用于计算Y分量DC系数的实际量化步长。DC系数通常允许有不同的量化精度 | |
delta_q_u_dc | U分量DC系数量化偏移&delta_q_u_dc | |
delta_q_u_ac | U分量AC系数量化偏移&delta_q_u_ac | |
using_qmatrix | 使用量化矩阵 含义:一个标志位,是否使用自定义量化矩阵,来代替默认的量化表, | |
segmentation_parames | ||
segmentation_enabled | 启用分段:总开关,1表示本帧使用分段功能,0表示不使用,如果为0,则后续所有分段参数都不存在。 | |
delta_q_present | 存在量化偏移 一个标志位,指示帧头部是否包含任何delta_q*字段(delta_q_y_dc, delta_q_u_dc) 如果为0,则所有delta_q*字段都不存在,其值被视为0 1 位标志,这是解析delta_q_*字段的前提条件 | |
loop_filter_params() | ||
loop_filter_level[0] | 含义,滤波器的强度级别。通常索引对应不同的方向/边界,水平边界亮度滤波强度 | |
loop_filter_level[1] | 垂直边界亮度滤波器强度 | |
loop_filter_level[2] | 水平边界色度滤波强度 | |
loop_filter_level[3] | 垂直边界色度滤波强度 | |
loop_filter_sharpness | 滤波锐度,控制滤波器在平滑块效应和保留细节之间权衡,值越大,保留的细节越多,但是块效应也可能更明显。 | |
loop_filter_delta_enabled | 启用环路滤波偏移 | |
loop_filter_delta_update | 是否允许根据参考帧和运动模式对基础滤波强度loop_filter_level进行微调 | |
update_ref_delta[0] | 如果loop_filter_delta_update为1,这些字段会提供具体的偏移值 | |
update_ref_delta[1] | 针对不同参考帧的偏移 | |
update_ref_delta[2] | ||
update_ref_delta[3] | ||
update_ref_delta[4] | ||
update_ref_delta[5] | ||
update_ref_delta[6] | ||
update_ref_delta[7] | ||
update_mode_delta[0] | ||
update_mode_delta[1] | ||
cdef_params | CDEF是一种减少振铃效应和增强边缘的滤波器,这些参数包括滤波器,阻尼系数等。 | |
lr_params | 超分辨率/循环滤波参数 | |
lr_type[0] | 指定每个参考帧使用的超分辨率类型 | |
lr_type[1] | ||
lr_type[2] | ||
lr_unit_extra_shift | 控制滤波过程中的位移操作 | |
lr_uv_shift | ||
tx_mode_select | 变换模式选择 | |
reduced_tx_set | 1 表示使用一个简化的,计算量更小的变换类型集合,0表示使用完整的变换类型集合 | |
tile_group_obu | 这不是一个字段,而是OBU的类型,OBU是AV1的基本语法单元,tile_group_obu 表示这个OBU包含的实际的帧数据Tile group, 而不是序列头,帧头,元数据等。 |
解析这些字段需要严格按照AV1比特流规范定义的语法表进行,这是一个上下文相关的过程。
1 首先解析 seq_header,获取全局配置
2 然后解析frame_header
3 在frame_header中,你会遇到一个标志delta_q_present
4 如果该标志位1,直到接下来解析delta_q_y_dc等字段,如果为0,则跳过
5 接着会遇到segmengtation_enabled 标志,根据它的值决定是否解析一大段segmentation_params
6 依此类推