VVC代码:帧内预测学习之角度的映射

当前VVC代码中支持的帧内预测方向有93个,具体如下图所示:

相关映射代码如下:
// global variables
static const int DIA_IDX = 34;
static const int HOR_IDX = 18;
static const int VER_IDX = 50;

// get prediction angle
int predMode = useISP ? getWideAngle( cuSize.width, cuSize.height, dirMode ) : \
getWideAngle( width,height, dirMode);	

// map table
static const int angTable[32] = { 0,  1,  2,  3,  4,  6,  8, 10, 12, 14,  16,  18, \
 20, 23,  26,  29,  32,   35,   39, 45,  51,  57,  \
 64,  73,  86, 102, 128, 171, 256, 341, 512, 1024 };		
 
// (256 * 32) / Angle, inverted number of angle
static const int invAngTable[32] = { 0, 8192, 4096, 2731, 2048, 1365,  1024,  819,  683,  585, 
 512,  455,  410,  356,  315,  282,  256,  234,  210, 182, \
 160, 144, 128, 112,  95,  80,  64,  48,  32,  24,  16,    8 }; 

const bool       bIsModeVer         = predMode >= DIA_IDX;
const int        intraPredAngleMode = (bIsModeVer) ? predMode - VER_IDX : \ 
-(predMode - HOR_IDX);
const int        absAngMode         = abs(intraPredAngleMode);
const int        signAng            = intraPredAngleMode < 0 ? -1 : 1;

int invAngle                    = invAngTable[absAngMode];
int absAng                      = angTable   [absAngMode];
int intraPredAngle              = signAng * absAng;

映射关系如下表所示:

映射表具有一定的规律,其中有3个特殊的predModeIntra值:18,34和50。

  1. 当predModeIntra为18或50时,intraPredAngle=0,两边的映射值呈反对称关系(即大小相等,正负相反)。
  2. 当predModeIntra为34时,intraPredAngle的值最小,两边的映射值呈对称关系。

代码构思十分巧妙,值得学习。

猜你喜欢

转载自blog.csdn.net/allen_sdz/article/details/88175281