當前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的對應部分,發現映射表中數據的含義是角度模式相對於水平和垂直方向的偏移值。在角度預測中,映射值爲負數的部分對應的角度預測需要同時用到左側和上方的參考像素,在預測過程中會使用“投影像素”法將需要用到的參考像素映射爲一維形式。