📄 umc_h264_segment_decoder_deblocking_prepare.cpp
字号:
else
{
pVectorPFrw = m_gmbinfo->MV[1][MBAddr].MotionVectors + nNeighbourBlock;
pVectorPBck = m_gmbinfo->MV[0][MBAddr].MotionVectors + nNeighbourBlock;
}
// compare motion vectors
if ((4 <= abs(pVectorQFrw->mvx - pVectorPFrw->mvx)) ||
(nVectorDiffLimit <= abs(pVectorQFrw->mvy - pVectorPFrw->mvy)) ||
(4 <= abs(pVectorQBck->mvx - pVectorPBck->mvx)) ||
(nVectorDiffLimit <= abs(pVectorQBck->mvy - pVectorPBck->mvy)))
{
pStrength[idx] = 1;
*pDeblockingFlag = 1;
}
}
// when forward and backward reference pictures of previous block are equal
else
{
H264DecoderMotionVector *pVectorQFrw, *pVectorQBck;
H264DecoderMotionVector *pVectorPFrw, *pVectorPBck;
// select current block motion vectors
pVectorQFrw = m_gmbinfo->MV[0][MBAddr].MotionVectors + nBlock;
pVectorQBck = m_gmbinfo->MV[1][MBAddr].MotionVectors + nBlock;
// select previous block motion vectors
pVectorPFrw = m_gmbinfo->MV[0][MBAddr].MotionVectors + nNeighbourBlock;
pVectorPBck = m_gmbinfo->MV[1][MBAddr].MotionVectors + nNeighbourBlock;
// compare motion vectors
if ((4 <= abs(pVectorQFrw->mvx - pVectorPFrw->mvx)) ||
(nVectorDiffLimit <= abs(pVectorQFrw->mvy - pVectorPFrw->mvy)) ||
(4 <= abs(pVectorQBck->mvx - pVectorPBck->mvx)) ||
(nVectorDiffLimit <= abs(pVectorQBck->mvy - pVectorPBck->mvy)))
{
if ((4 <= abs(pVectorQFrw->mvx - pVectorPBck->mvx)) ||
(nVectorDiffLimit <= abs(pVectorQFrw->mvy - pVectorPBck->mvy)) ||
(4 <= abs(pVectorQBck->mvx - pVectorPFrw->mvx)) ||
(nVectorDiffLimit <= abs(pVectorQBck->mvy - pVectorPFrw->mvy)))
{
pStrength[idx] = 1;
*pDeblockingFlag = 1;
}
}
}
}
// when reference indexes are different
else
{
pStrength[idx] = 1;
*pDeblockingFlag = 1;
}
}
}
}
} // void H264SegmentDecoder::PrepareDeblockingParametersBSlice4(Ipp32u dir, DeblockingParameters *pParams)
#define SET_DEBLOCKING_STRENGTH_B_SLICE_VERTICAL(block_num0, block_num1) \
{ \
Ipp32s refPrev[2]; \
Ipp32s iRefPrevNum; \
iRefPrevNum = GetReferencesBSlice(nNeighbour, block_num0 * 4 + 3, refPrev); \
if ((iRefPrevNum == pParams->iReferenceNum[0]) && \
(0 == (refPrev[0] ^ refPrev[1] ^ refCurFwd ^ refCurBwd)) && \
((refPrev[0] == refCurFwd) || (refPrev[0] == refCurBwd))) \
{ \
if (0 == (VERTICAL_OUTER_EDGE_BLOCK_##block_num0 & uMask)) \
{ \
if (refCurFwd != refCurBwd) \
{ \
/* exchange reference for direct equality */ \
if (refCurFwd != refPrev[0]) \
{ \
H264DecoderMotionVector mvTmp = mvCurFwd; \
mvCurFwd = mvCurBwd; \
mvCurBwd = mvTmp; \
refCurFwd ^= refCurBwd; \
refCurBwd ^= refCurFwd; \
refCurFwd ^= refCurBwd; \
} \
/* compare motion vectors */ \
if (IsVectorDifferenceBig(mvCurFwd, pMVPrevFwd[block_num0 * 4 + 3], pParams->nMaxMVector) || \
IsVectorDifferenceBig(mvCurBwd, pMVPrevBwd[block_num0 * 4 + 3], pParams->nMaxMVector)) \
{ \
pStrength[block_num0] = 1; \
iDeblockingFlag = 1; \
} \
else \
pStrength[block_num0] = 0; \
} \
else \
{ \
/* compare motion vectors */ \
if ((IsVectorDifferenceBig(mvCurFwd, pMVPrevFwd[block_num0 * 4 + 3], pParams->nMaxMVector) || \
IsVectorDifferenceBig(mvCurBwd, pMVPrevBwd[block_num0 * 4 + 3], pParams->nMaxMVector)) && \
(IsVectorDifferenceBig(mvCurFwd, pMVPrevBwd[block_num0 * 4 + 3], pParams->nMaxMVector) || \
IsVectorDifferenceBig(mvCurBwd, pMVPrevFwd[block_num0 * 4 + 3], pParams->nMaxMVector))) \
{ \
pStrength[block_num0] = 1; \
iDeblockingFlag = 1; \
} \
else \
pStrength[block_num0] = 0; \
} \
} \
else \
{ \
pStrength[block_num0] = 2; \
iDeblockingFlag = 1; \
} \
if (0 == (VERTICAL_OUTER_EDGE_BLOCK_##block_num1 & uMask)) \
{ \
if (refCurFwd != refCurBwd) \
{ \
/* exchange reference for direct equality */ \
if (refCurFwd != refPrev[0]) \
{ \
H264DecoderMotionVector mvTmp = mvCurFwd; \
mvCurFwd = mvCurBwd; \
mvCurBwd = mvTmp; \
refCurFwd ^= refCurBwd; \
refCurBwd ^= refCurFwd; \
refCurFwd ^= refCurBwd; \
} \
/* compare motion vectors */ \
if (IsVectorDifferenceBig(mvCurFwd, pMVPrevFwd[block_num1 * 4 + 3], pParams->nMaxMVector) || \
IsVectorDifferenceBig(mvCurBwd, pMVPrevBwd[block_num1 * 4 + 3], pParams->nMaxMVector)) \
{ \
pStrength[block_num1] = 1; \
iDeblockingFlag = 1; \
} \
else \
pStrength[block_num1] = 0; \
} \
else \
{ \
/* compare motion vectors */ \
if ((IsVectorDifferenceBig(mvCurFwd, pMVPrevFwd[block_num1 * 4 + 3], pParams->nMaxMVector) || \
IsVectorDifferenceBig(mvCurBwd, pMVPrevBwd[block_num1 * 4 + 3], pParams->nMaxMVector)) && \
(IsVectorDifferenceBig(mvCurFwd, pMVPrevBwd[block_num1 * 4 + 3], pParams->nMaxMVector) || \
IsVectorDifferenceBig(mvCurBwd, pMVPrevFwd[block_num1 * 4 + 3], pParams->nMaxMVector))) \
{ \
pStrength[block_num1] = 1; \
iDeblockingFlag = 1; \
} \
else \
pStrength[block_num1] = 0; \
} \
} \
else \
{ \
pStrength[block_num1] = 2; \
iDeblockingFlag = 1; \
} \
} \
else \
{ \
pStrength[block_num0] = (Ipp8u) (1 + ((VERTICAL_OUTER_EDGE_BLOCK_##block_num0 & uMask) ? (1) : (0))); \
pStrength[block_num1] = (Ipp8u) (1 + ((VERTICAL_OUTER_EDGE_BLOCK_##block_num1 & uMask) ? (1) : (0))); \
iDeblockingFlag = 1; \
} \
}
#define SET_DEBLOCKING_STRENGTH_B_SLICE_HORIZONTAL(block_num0, block_num1) \
{ \
Ipp32s refPrev[2]; \
Ipp32s iRefPrevNum; \
iRefPrevNum = GetReferencesBSlice(nNeighbour, block_num0 + 12, refPrev); \
if ((iRefPrevNum == pParams->iReferenceNum[0]) && \
(0 == (refPrev[0] ^ refPrev[1] ^ refCurFwd ^ refCurBwd)) && \
((refPrev[0] == refCurFwd) || (refPrev[0] == refCurBwd))) \
{ \
if (0 == (HORIZONTAL_OUTER_EDGE_BLOCK_##block_num0 & uMask)) \
{ \
if (refCurFwd != refCurBwd) \
{ \
/* exchange reference for direct equality */ \
if (refCurFwd != refPrev[0]) \
{ \
H264DecoderMotionVector mvTmp = mvCurFwd; \
mvCurFwd = mvCurBwd; \
mvCurBwd = mvTmp; \
refCurFwd ^= refCurBwd; \
refCurBwd ^= refCurFwd; \
refCurFwd ^= refCurBwd; \
} \
/* compare motion vectors */ \
if (IsVectorDifferenceBig(mvCurFwd, pMVPrevFwd[block_num0 + 12], pParams->nMaxMVector) || \
IsVectorDifferenceBig(mvCurBwd, pMVPrevBwd[block_num0 + 12], pParams->nMaxMVector)) \
{ \
pStrength[block_num0] = 1; \
iDeblockingFlag = 1; \
} \
else \
pStrength[block_num0] = 0; \
} \
else \
{ \
/* compare motion vectors */ \
if ((IsVectorDifferenceBig(mvCurFwd, pMVPrevFwd[block_num0 + 12], pParams->nMaxMVector) || \
IsVectorDifferenceBig(mvCurBwd, pMVPrevBwd[block_num0 + 12], pParams->nMaxMVector)) && \
(IsVectorDifferenceBig(mvCurFwd, pMVPrevBwd[block_num0 + 12], pParams->nMaxMVector) || \
IsVectorDifferenceBig(mvCurBwd, pMVPrevFwd[block_num0 + 12], pParams->nMaxMVector))) \
{ \
pStrength[block_num0] = 1; \
iDeblockingFlag = 1; \
} \
else \
pStrength[block_num0] = 0; \
} \
} \
else \
{ \
pStrength[block_num0] = 2; \
iDeblockingFlag = 1; \
} \
if (0 == (HORIZONTAL_OUTER_EDGE_BLOCK_##block_num1 & uMask)) \
{ \
if (refCurFwd != refCurBwd) \
{ \
/* exchange reference for direct equality */ \
if (refCurFwd != refPrev[0]) \
{ \
H264DecoderMotionVector mvTmp = mvCurFwd; \
mvCurFwd = mvCurBwd; \
mvCurBwd = mvTmp; \
refCurFwd ^= refCurBwd; \
refCurBwd ^= refCurFwd; \
refCurFwd ^= refCurBwd; \
} \
/* compare motion vectors */ \
if (IsVectorDifferenceBig(mvCurFwd, pMVPrevFwd[block_num1 + 12], pParams->nMaxMVector) || \
IsVectorDifferenceBig(mvCurBwd, pMVPrevBwd[block_num1 + 12], pParams->nMaxMVector)) \
{ \
pStrength[block_num1] = 1; \
iDeblockingFlag = 1; \
} \
else \
pStrength[block_num1] = 0; \
} \
else \
{ \
/* compare motion vectors */ \
if ((IsVectorDifferenceBig(mvCurFwd, pMVPrevFwd[block_num1 + 12], pParams->nMaxMVector) || \
IsVectorDifferenceBig(mvCurBwd, pMVPrevBwd[block_num1 + 12], pParams->nMaxMVector)) && \
(IsVectorDifferenceBig(mvCurFwd, pMVPrevBwd[block_num1 + 12], pParams->nMaxMVector) || \
IsVectorDifferenceBig(mvCurBwd, pMVPrevFwd[block_num1 + 12], pParams->nMaxMVector))) \
{ \
pStrength[block_num1] = 1; \
iDeblockingFlag = 1; \
} \
else \
pStrength[block_num1] = 0; \
} \
} \
else \
{ \
pStrength[block_num1] = 2; \
iDeblockingFlag = 1; \
} \
} \
else \
{ \
pStrength[block_num0] = (Ipp8u) (1 + ((HORIZONTAL_OUTER_EDGE_BLOCK_##block_num0 & uMask) ? (1) : (0))); \
pStrength[block_num1] = (Ipp8u) (1 + ((HORIZONTAL_OUTER_EDGE_BLOCK_##block_num1 & uMask) ? (1) : (0))); \
iDeblockingFlag = 1; \
} \
}
void H264SegmentDecoder::PrepareDeblockingParametersBSlice16x16Vert(DeblockingParameters *pParams)
{
Ipp32s MBAddr = pParams->nMBAddr;
Ipp32u cbp4x4_luma = (m_mbinfo.mbs + MBAddr)->cbp4x4_luma;
Ipp8u *pStrength = pParams->Strength[VERTICAL_DEBLOCKING];
Ipp32s iDeblockingFlag = 0;
//
// precalculating of reference numbers of current macroblock.
// it is more likely we have to compare reference numbers.
// we will use it also in horizontal deblocking
//
pParams->iReferenceNum[0] = GetReferencesBSlice(MBAddr, 0, pParams->iReferences[0]);
//
// external edge
//
if (pParams->ExternalEdgeFlag[VERTICAL_DEBLOCKING])
{
Ipp32s nNeighbour;
// select neighbour addres
nNeighbour = pParams->nNeighbour[VERTICAL_DEBLOCKING];
// when neighbour macroblock isn't intra
if (!IS_INTRA_MBTYPE((m_gmbinfo->mbs + nNeighbour)->mbtype))
{
H264DecoderMacroblockLocalInfo *pNeighbour;
Ipp32u uMask;
// select neighbour
pNeighbour = m_mbinfo.mbs + nNeighbour;
// create special mask
uMask = cbp4x4_luma | (pNeighbour->cbp4x4_luma >> 5);
// when at least one from a couple of blocks has coeffs
if (VERTICAL_OUTER_EDGE_MASK != (uMask & VERTICAL_OUTER_EDGE_MASK))
{
Ipp32s refCurFwd, refCurBwd;
H264DecoderMotionVector mvCurFwd, mvCurBwd;
H264DecoderMotionVector *pMVPrevFwd, *pMVPrevBwd;
// obtain current block parameters
refCurFwd = pParams->iReferences[0][0];
refCurBwd = pParams->iReferences[0][1];
mvCurFwd = m_gmbinfo->MV[0][MBAddr].MotionVectors[0];
mvCurBwd = m_gmbinf
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -