傳回目錄
Superblock
Superblock,暫且就叫它“超級塊”吧。
從上一節我們知道,在AV1中,一幀先是分為一個或多個tile,然後由tile再進行細分為Superblock,超級塊的大小,以灰階成分為基準,可以有128x128和64x64兩種尺寸的選擇。AV1中的Superblock與HEVC中的CTU(Coding Tree Unit)是同樣的概念。如果是4:2:0的分量采樣後得到的Y,U,V分量大小如下:
Superblock 大小 | Y成分大小 | U/V成分大小 |
---|---|---|
64x64 | 64x64 | 32x32 |
128x128 | 128x128 | 64x64 |
若一個tile的大小為128x128,那麼它分為四個Superblock的情況可以如下圖
在參考軟體av1的源碼中,一個tile分割成若幹個superblock,然後以光栅順序(raster scan order)進行解碼。(代碼有簡化)
void decode_tile(AV1Decoder *pbi, ThreadData *const td, int tile_row, int tile_col)
{
for (int mi_row = tile_info.mi_row_start; mi_row < tile_info.mi_row_end; mi_row += cm->seq_params.mib_size) // 行
{
for (int mi_col = tile_info.mi_col_start; mi_col < tile_info.mi_col_end; mi_col += cm->seq_params.mib_size) // 列
{
// Bit-stream parsing and decoding of the superblock
decode_partition(pbi, td, mi_row, mi_col, td->bit_reader, cm->seq_params.sb_size, 0x3);
}
}
}
複制
掃描順序如下圖所示
Block
AV1的快劃分方式一共有十種,包括
- 不劃分 (2NX2N)
- 矩形劃分 Rectangular (NX2N, 2NXN)
- 遞歸劃分 Recursive (NXN)
- AB 劃分(partition) (HORZ_A, HORZ_B, VERT_A, VERT_B)
- 1to4 劃分(partition) (HORZ_4, VERT_4)
具體的劃分情況如下圖:
AV1中的Superblock有128x128和64x64兩種尺寸,但是當Superblock是128x128大小的時候,10 種劃分方式中僅有8種劃分适用于128的塊。這就意味着不存在128X32 或者 32X128 的塊。然後128x128的所有劃分方式中,2Nx2N的Recursive劃分方式得到四個等尺寸的64x64的塊,這四個64x64的話可以繼續各有10種的劃分方式,除此之外,其他的劃分方式不能繼續向下劃分。
一直到16x16,通過recursive partition獲得8x8的塊,然後8x8的塊進進行一次recursive 劃分到4x4即最小的塊了,與8x8同一級的還有8x4和4x8的劃分。
在AV1的代碼中,對各種的劃分有相應的MACRO定義。
Partition | Name of partition |
---|---|
PARTITION_NONE | |
1 | PARTITION_HORZ |
2 | PARTITION_VERT |
3 | PARTITION_SPLIT |
4 | PARTITION_HORZ_A |
5 | PARTITION_HORZ_B |
6 | PARTITION_VERT_A |
7 | PARTITION_VERT_B |
8 | PARTITION_HORZ_4 |
9 | PARTITION_VERT_4 |