Opened 5 years ago
Closed 5 years ago
#1100 closed defect (invalid)
Mismatch spec/VTM in PDPC process for wT and wL calculation
| Reported by: | audrey.turquin | Owned by: | |
|---|---|---|---|
| Priority: | minor | Milestone: | |
| Component: | VTM | Version: | |
| Keywords: | Cc: | ksuehring, XiangLi, fbossen, jvet@… |
Description
In VTM, in IntraPrediction.cpp, in function predIntraAng, there is the following code :
if (m_ipaParam.applyPDPC)
{
PelBuf dstBuf = piPred;
const int scale = ((floorLog2(iWidth) - 2 + floorLog2(iHeight) - 2 + 2) >> 2);
CHECK(scale < 0 || scale > 31, "PDPC: scale < 0 || scale > 31");
if (uiDirMode == PLANAR_IDX || uiDirMode == DC_IDX)
{
for (int y = 0; y < iHeight; y++)
{
const int wT = 32 >> std::min(31, ((y << 1) >> scale));
const Pel left = srcBuf.at(y + 1, 1);
for (int x = 0; x < iWidth; x++)
{
const int wL = 32 >> std::min(31, ((x << 1) >> scale));
const Pel top = srcBuf.at(x + 1, 0);
const Pel val = dstBuf.at(x, y);
dstBuf.at(x, y) = val + ((wL * (left - val) + wT * (top - val) + 32) >> 6);
}
}
}
}
The calculation of wT and wL are not aligned with the one in the specification.
In the spec, in section 8.4.5.2.14, part where predModeIntra is equal to INTRA_PLANAR or INTRA_DC, it is :
wT[ y ] = 32 >> ( ( y << 1 ) >> nScale )
wL[ x ] = 32 >> ( ( x << 1 ) >> nScale )
Change history (2)
comment:1 Changed 5 years ago by geertv
comment:2 Changed 5 years ago by audrey.turquin
- Resolution set to invalid
- Status changed from new to closed
Ok, thanks for the clarification.
Note: See TracTickets for help on using tickets.
The right shift >> std::min(31,...) is a software implementation issue with >> operator having undefined behavior if value is > 31 for integer type. It is nonnormative.