天天看點

[AV1] Superblock and Block

傳回目錄

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] Superblock and Block

在參考軟體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);
      	}
    }
}           

複制

掃描順序如下圖所示

[AV1] Superblock and Block

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 and Block

AV1中的Superblock有128x128和64x64兩種尺寸,但是當Superblock是128x128大小的時候,10 種劃分方式中僅有8種劃分适用于128的塊。這就意味着不存在128X32 或者 32X128 的塊。然後128x128的所有劃分方式中,2Nx2N的Recursive劃分方式得到四個等尺寸的64x64的塊,這四個64x64的話可以繼續各有10種的劃分方式,除此之外,其他的劃分方式不能繼續向下劃分。

[AV1] Superblock and Block

一直到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