其他分享
首页 > 其他分享> > H264/AVC-宏块类型

H264/AVC-宏块类型

作者:互联网

基本概念

H264中常见的几种宏块有I、P、B宏块,宏块类型由宏块头中的mb_type确定。其中I slice中只允许存在I宏块,P slice允许存在P宏块和I宏块,B slice允许存在I宏块和B宏块。
在这里插入图片描述
为节省编码码流,mb_type包含了多个信息,比如该宏块的划分方式,子块预测方式,cbp等。

1.1 宏块划分方式

1.2 CodedBlockPatternLuma

CodedBlockPatternLuma是4bit数据,宏块中16x16亮度块分为4个8x8大小的块,每一个bit对应一个8x8亮度块,表示该8x8亮度块残差系数是否编码。

1.3 CodedBlockPatternChroma

所有预测模式宏块中8x8色度块都会划分为4个4x4块,分别DCT变换后,将4个DC系数进行hadamard变换
在这里插入图片描述

CodedBlockPatternChroma表示该宏块色度块DCT系数是否编码。

在这里插入图片描述

2. I slice中mb_type对应的宏块类型

下表中transform_size_8x8_flag表示该宏块是否使用8x8大小的DCT变换,MbPartPredMode(mb_type, 0)表示宏块中第一个划分块的预测方式,Intra16x16PredMode表示帧内16x16块大小预测方式(一共4中预测方式)。
在这里插入图片描述

3. P slice中mb_type对应的宏块类型

P slice中的宏块可以是P宏块也可以是I宏块,其中mb_type值为0-4表示P宏块,可参考下表,mb_type值为5-30表示I宏块,参考I宏块表,序号为mb_type的值减5.
在这里插入图片描述

需要注意的一点是:在JM代码中P slice中的I宏块值与标准文档有些出入,mbmode比mb_type值大1.

static void interpret_mb_mode_P(Macroblock *currMB)
{
  static const short ICBPTAB[6] = {0,16,32,15,31,47};
  short  mbmode = currMB->mb_type;

  if(mbmode < 4)
  {
    currMB->mb_type = mbmode;
    memset(currMB->b8mode, mbmode, 4 * sizeof(char));
    memset(currMB->b8pdir, 0, 4 * sizeof(char));
  }
  else if((mbmode == 4 || mbmode == 5))
  {
    currMB->mb_type = P8x8;
    currMB->p_Slice->allrefzero = (mbmode == 5);
  }
  else if(mbmode == 6)
  {
    currMB->is_intra_block = TRUE;
    currMB->mb_type = I4MB;
    memset(currMB->b8mode, IBLOCK, 4 * sizeof(char));
    memset(currMB->b8pdir,     -1, 4 * sizeof(char));
  }
  else if(mbmode == 31)
  {
    currMB->is_intra_block = TRUE;
    currMB->mb_type = IPCM;
    currMB->cbp = -1;
    currMB->i16mode = 0;

    memset(currMB->b8mode, 0, 4 * sizeof(char));
    memset(currMB->b8pdir,-1, 4 * sizeof(char));
  }
  else
  {
    currMB->is_intra_block = TRUE;
    currMB->mb_type = I16MB;
    currMB->cbp = ICBPTAB[((mbmode-7))>>2];
    currMB->i16mode = ((mbmode-7)) & 0x03;
    memset(currMB->b8mode, 0, 4 * sizeof(char));
    memset(currMB->b8pdir,-1, 4 * sizeof(char));
  }
}

3.1 P_8x8子宏块类型

对于每个P_8x8块还可以继续划分为sub-block,划分方式由sub_mb_type决定。如下表所示,
1)sub_mb_type=0,表示划分为1个8x8块
2)sub_mb_type=1,表示划分为2个8x4块
3)sub_mb_type=2,表示划分为2个4x8块
4)sub_mb_type=3,表示划分为4个4x4块

在这里插入图片描述

4. B slice中mb_type对应的宏块类型

B slice中可以存在I宏块和B宏块,其中mb_type值为0-22表示B 宏块,如下表所示;mb_type值为23-48表示I宏块
在这里插入图片描述

4.1 B_8x8子宏块划分方式

对于每个B_8x8块还可以继续划分为sub-block,划分方式由sub_mb_type决定。如下表所示,
1)sub_mb_type=0-3,表示划分为1个8x8块,分别使用direct、前向、后向、双向方式预测
2)sub_mb_type=4-9,表示划分方式为4x8或8x4,预测方式可以为前向、后向、双向
3)sub_mb_type=10-12,表示划分为4个4x4块,预测方式分别为前向、后向、双向
在这里插入图片描述

标签:currMB,mb,H264,8x8,划分,宏块,type,AVC
来源: https://blog.csdn.net/qq_42139383/article/details/116308383