位置決定的幀內預測組合(Position dependent intra prediction combination,PDPC)是在幀內預測時使用未濾波和已濾波的參考像素的加權值作爲預測值。
PDPC在VTM5中有了很大改進,它可以應用於planar模式(模式0),DC模式(模式1),垂直模式(模式50),水平模式(模式18),左下角對角線模式和與其相鄰的8個模式(模式2~10),右上角對角線模式和與其相鄰的8個模式(模式58~66)。
預測值是由參考像素值與預測值再次加權求得,如下式:
如果PDPC用於planar、DC、水平、垂直模式則不需要額外的邊界濾波。
對於模式3~10和模式58~65其參考像素可能落到非整數像素位置,這時取其最近的整數像素位置的值作爲參考值。
下表是PDPC的權值計算方法:
預測模式 | wT | wL | wTL |
---|---|---|---|
右上對角線 | 16 >> ( ( y’<<1 ) >> shift) | 16 >> ( ( x’<<1 ) >> shift) | 0 |
左下對角線 | 16 >> ( ( y’<<1 ) >> shift ) | 16 >> ( ( x’<<1 ) >> shift ) | 0 |
右上對角線相鄰模式 | 32 >> ( ( y’<<1 ) >> shift ) | 0 | 0 |
左下對角線相鄰模式 | 0 | 32 >> ( ( x’<<1 ) >> shift ) | 0 |
以下代碼是VTM5內求PDPC的相關代碼:
if (m_ipaParam.applyPDPC)
{ //!<模式2或模式66
if (m_ipaParam.intraPredAngle == 32) // intra prediction modes: 2 and VDIA
{
int wT = 16 >> std::min(31, ((y << 1) >> scale));
for (int x = 0; x < width; x++)
{ //權值
int wL = 16 >> std::min(31, ((x << 1) >> scale));
if (wT + wL == 0) break;
int c = x + y + 1;
if (c >= 2 * height) { wL = 0; }
if (c >= 2 * width) { wT = 0; }
const Pel left = (wL != 0) ? refSide[c + 1] : 0;
const Pel top = (wT != 0) ? refMain[c + 1] : 0;
//!<加權
pDsty[x] = ClipPel((wL * left + wT * top + (64 - wL - wT) * pDsty[x] + 32) >> 6, clpRng);
}
}
else
{
int invAngleSum0 = 2;
for (int x = 0; x < width; x++)
{
invAngleSum0 += invAngle;
int deltaPos0 = invAngleSum0 >> 2;
int deltaFrac0 = deltaPos0 & 63;
int deltaInt0 = deltaPos0 >> 6;
int deltay = y + deltaInt0 + 1;
if (deltay >(bIsModeVer ? m_leftRefLength : m_topRefLength) - 1) break;
int wL = 32 >> std::min(31, ((x << 1) >> scale));
if (wL == 0) break;
Pel *p = refSide + deltay;
Pel left = p[deltaFrac0 >> 5];
pDsty[x] = ClipPel((wL * left + (64 - wL) * pDsty[x] + 32) >> 6, clpRng);
}
}
}
感興趣的請關注微信公衆號Video Coding