当前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。
- 当predModeIntra为18或50时,intraPredAngle=0,两边的映射值呈反对称关系(即大小相等,正负相反)。
- 当predModeIntra为34时,intraPredAngle的值最小,两边的映射值呈对称关系。
代码构思十分巧妙,值得学习。
2019-03-25
内容源自《新一代高校视频编码H.265/HEVC:原理、标准与实现》P122-123
参考HEVC的对应部分,发现映射表中数据的含义是角度模式相对于水平和垂直方向的偏移值。在角度预测中,映射值为负数的部分对应的角度预测需要同时用到左侧和上方的参考像素,在预测过程中会使用“投影像素”法将需要用到的参考像素映射为一维形式。