本节简单认识AV1的码流结构。
1. 码流OBU
OBU(open bitstream units)是AV1码流组成的基本单元,不同OBU序列按照解码顺序组成码流。
OBU由OBU Header和OBU Playload组成,其中header声明了OBU的类型和大小。
OBU的类型及功能如下:
bitstream
OBU | 说明 |
---|---|
sequence_header_obu | 一段编码序列的共用信息,标识profile、frame_width_bits_minus_1、frame_height_bits_minus_1、use_128x128_superblock、enable_filter_intra、enable_intra_edge_filter等信息,类似SPS。 |
temporal_delimiter_obu | 仅作为时间分割作用的obu,不包含playload, 代表帧的pts,所有跟在这个obu后面的帧可以使用这个PTS |
frame_header_obu | 帧信息如帧内/帧间类型,参考帧, 屏幕内容编码、MV精度控制、tile划分、量化参数、滤波参数、frame_size等信息,可以说frame_header中存有解码所需要的大部分功能控制类信息。类似PPS |
tile_group_obu | 包含一个或多个tile(及tile内SB)的码流信息,每个tile可以被单独解码。 |
frame_obu | 含frame_header_obu和tile_group_obu。 |
metadata_obu | HDR、SVC等。 |
tile_list | 用于large scale。 |
padding_obu | 一个填充数据OBU,可以被AV1标准解码器忽略。 |
reserved_obu | 若一个OBU的obu_type与上述所有OBU都不相同的话,则该OBU为reserved_obu。 |
2. 帧类型:
- KEY_FRAME 类同IDR帧
- INTER_FRAME 类同P/B帧
- INTRA_ONLY_FRAME 类同I帧
- S_FRAME 类264 SI/SP帧,或265的IRAP,是一种新的随机接入点,解码器可以从它开始解码,它具备IDR帧的优点,IDR帧的缺点是所包含的数据量巨大,因此,S_FRAME在解决就近快速接入解码的同时,用来提高了码流压缩率。
3. Superblock与Tile:
- Superblock
超级编码块是AV1支持的最大编码块,luminace最大尺度是128x128,chroma最大是64x64,大小由Sequence Header Obu定义,Superblock仅依赖左、上侧的Superblock。
superblockSuperblock可进一步递归划分为更小的块,划分方式如上图。使用较大的块,如128×128 Luma块可以避免如4K场景下的预测模式信息冗余,同时为更好的提升复杂画面的质量,最小支持4x4的Luma块。
- Tile
Tile是由多个Superblock组成的矩形块,Tile边界限制了帧内预测和概率模型的更新,因此,Tile的特征是支持单独解码,为多线程编解码提供了支持。TIle最小就是1个Superblock,最大tile对应4096x2304个Luma灰度采样数据。一个帧最大支持512个TIle单元。
AV1支持2种方式定义Tile的大小,一种是全部统一大小,一种是对大小是否一致不做限制。之所以有大小不统一的Tile划分的原因是,不同Tile的编码运算复杂度随着图像内容不同而不同,对于复杂度较高的tile倾向使用较小尺寸的Tile,进而平衡不同线程运行在不同CPU核上的运算负担,尤其是面对其中存在巨大计算量的Tile上,这样还可以减少计算延时。
值得注意的是,为避免出现编码块边界振铃效应,Tile边界需要进行图像后处理,类似Deblock Filter和SAO滤波。
tile未经声明,禁止转载,喜欢的给个赞吧!
网友评论