📄 umc_h264_segment_decoder_deblocking_mbaff.cpp
字号:
// select neighbour addres
nNeighbour = pParams->nLeft[i];
// when neighbour macroblock isn't intra
if (!IS_INTRA_MBTYPE((m_gmbinfo->mbs + nNeighbour)->mbtype))
{
H264DecoderMacroblockLocalInfo *pNeighbour;
Ipp32s idx;
// select neighbour
pNeighbour = m_mbinfo.mbs + nNeighbour;
// cicle on blocks
for (idx = 0;idx < 4;idx += 1)
{
Ipp32s blkQ, blkP;
blkQ = EXTERNAL_BLOCK_MASK[VERTICAL_DEBLOCKING][CURRENT_BLOCK][idx];
blkP = EXTERNAL_BLOCK_MASK[VERTICAL_DEBLOCKING][NEIGHBOUR_BLOCK][idx / 2 + nNeighbourBlockInc];
// when one of couple of blocks has coeffs
if ((cbp4x4_luma & blkQ) ||
(pNeighbour->cbp4x4_luma & blkP))
pStrength[idx] = 2;
// when blocks have no coeffs
// set strength is 1
else
pStrength[idx] = 1;
}
}
// external edge required in strong filtering
else
SetEdgeStrength(pStrength + 0, 4);
pStrength += 4;
}
} // void H264SegmentDecoder::PrepareDeblockingParametersPSlice4MBAFFComplexFrameExternalEdge(DeblockingParametersMBAFF *pParams)
void H264SegmentDecoder::PrepareDeblockingParametersPSlice4MBAFFComplexFieldExternalEdge(DeblockingParametersMBAFF *pParams)
{
Ipp32s MBAddr = pParams->nMBAddr;
Ipp32u cbp4x4_luma = (m_mbinfo.mbs + MBAddr)->cbp4x4_luma;
Ipp8u *pStrength = pParams->StrengthComplex;
Ipp32s i;
// mixed edge is always deblocked
{
Ipp32s *pDeblockingFlag = &(pParams->DeblockingFlag[VERTICAL_DEBLOCKING]);
*pDeblockingFlag = 1;
}
// we fill parameters using 2 passes
for (i = 0;i < 2;i += 1)
{
Ipp32s nNeighbour;
// select neighbour addres
nNeighbour = pParams->nLeft[i];
// when neighbour macroblock isn't intra
if (!IS_INTRA_MBTYPE((m_gmbinfo->mbs + nNeighbour)->mbtype))
{
H264DecoderMacroblockLocalInfo *pNeighbour;
Ipp32s idx;
// select neighbour
pNeighbour = m_mbinfo.mbs + nNeighbour;
// cicle on blocks
for (idx = 0;idx < 4;idx += 1)
{
Ipp32s blkQ, blkP;
blkQ = EXTERNAL_BLOCK_MASK[VERTICAL_DEBLOCKING][CURRENT_BLOCK][idx / 2 + i * 2];
blkP = EXTERNAL_BLOCK_MASK[VERTICAL_DEBLOCKING][NEIGHBOUR_BLOCK][idx];
// when one of couple of blocks has coeffs
if ((cbp4x4_luma & blkQ) ||
(pNeighbour->cbp4x4_luma & blkP))
pStrength[idx] = 2;
// when blocks have no coeffs
// set strength is 1
else
pStrength[idx] = 1;
}
}
// external edge required in strong filtering
else
SetEdgeStrength(pStrength + 0, 4);
pStrength += 4;
}
} // void H264SegmentDecoder::PrepareDeblockingParametersPSlice4MBAFFComplexFieldExternalEdge(DeblockingParametersMBAFF *pParams)
void H264SegmentDecoder::PrepareDeblockingParametersPSlice4MBAFFField(Ipp32u dir, DeblockingParameters *pParams)
{
Ipp32s MBAddr = pParams->nMBAddr;
Ipp32u cbp4x4_luma = (m_mbinfo.mbs + MBAddr)->cbp4x4_luma;
Ipp8u *pStrength = pParams->Strength[dir];
Ipp32s *pDeblockingFlag = &(pParams->DeblockingFlag[dir]);
//
// external edge
//
if (pParams->ExternalEdgeFlag[dir])
{
Ipp32s nNeighbour;
// select neighbour addres
nNeighbour = pParams->nNeighbour[dir];
// when neighbour macroblock isn't intra
if (!IS_INTRA_MBTYPE((m_gmbinfo->mbs + nNeighbour)->mbtype))
{
H264DecoderMacroblockLocalInfo *pNeighbour;
Ipp32s idx;
// select neighbour
pNeighbour = m_mbinfo.mbs + nNeighbour;
// cicle on blocks
for (idx = 0;idx < 4;idx += 1)
{
Ipp32s blkQ, blkP;
blkQ = EXTERNAL_BLOCK_MASK[dir][CURRENT_BLOCK][idx];
blkP = EXTERNAL_BLOCK_MASK[dir][NEIGHBOUR_BLOCK][idx];
// when one of couple of blocks has coeffs
if ((cbp4x4_luma & blkQ) ||
(pNeighbour->cbp4x4_luma & blkP))
{
pStrength[idx] = 2;
*pDeblockingFlag = 1;
}
// compare motion vectors & reference indexes
else
{
Ipp32s nBlock, nNeighbourBlock;
Ipp32s iRefQ, iRefP;
// calc block and neighbour block number
if (VERTICAL_DEBLOCKING == dir)
{
nBlock = idx * 4;
nNeighbourBlock = idx * 4 + 3;
}
else
{
nBlock = idx;
nNeighbourBlock = idx + 12;
}
{
H264DecoderFrame **pRefPicList;
Ipp32s index;
// select reference index for current block
index = m_gmbinfo->RefIdxs[0][MBAddr].RefIdxs[nBlock];
if (0 <= index)
{
pRefPicList = m_pCurrentFrame->GetRefPicList((m_gmbinfo->mbs + MBAddr)->slice_id, 0)->m_RefPicList;
iRefQ = pRefPicList[index >> 1]->DeblockPicID(index & 1);
}
else
iRefQ = -1;
// select reference index for previous block
index = m_gmbinfo->RefIdxs[0][nNeighbour].RefIdxs[nNeighbourBlock];
if (0 <= index)
{
pRefPicList = m_pCurrentFrame->GetRefPicList((m_gmbinfo->mbs + nNeighbour)->slice_id, 0)->m_RefPicList;
iRefP = pRefPicList[index >> 1]->DeblockPicID(index & 1);
}
else
iRefP = -1;
}
VM_ASSERT((iRefP != -1) || (iRefQ != -1));
// when reference indexes are equal
if (iRefQ == iRefP)
{
H264DecoderMotionVector *pVectorQ, *pVectorP;
pVectorQ = m_gmbinfo->MV[0][MBAddr].MotionVectors + nBlock;
pVectorP = m_gmbinfo->MV[0][nNeighbour].MotionVectors + nNeighbourBlock;
// compare motion vectors
if ((4 <= abs(pVectorQ->mvx - pVectorP->mvx)) ||
(2 <= abs(pVectorQ->mvy - pVectorP->mvy)))
{
pStrength[idx] = 1;
*pDeblockingFlag = 1;
}
else
pStrength[idx] = 0;
}
// when reference indexes are different
else
{
pStrength[idx] = 1;
*pDeblockingFlag = 1;
}
}
}
}
// external edge required in strong filtering
else
{
if (HORIZONTAL_DEBLOCKING == dir)
SetEdgeStrength(pStrength + 0, 3);
else
SetEdgeStrength(pStrength + 0, 4);
*pDeblockingFlag = 1;
}
}
//
// internal edge(s)
//
{
Ipp32s idx;
// cicle of edge(s)
// we do all edges in one cicle
for (idx = 4;idx < 16;idx += 1)
{
Ipp32s blkQ;
blkQ = INTERNAL_BLOCKS_MASK[dir][idx - 4];
if (cbp4x4_luma & blkQ)
{
pStrength[idx] = 2;
*pDeblockingFlag = 1;
}
// compare motion vectors & reference indexes
else
{
Ipp32s nBlock, nNeighbourBlock;
Ipp32s iRefQ, iRefP;
// calc block and neighbour block number
if (VERTICAL_DEBLOCKING == dir)
{
nBlock = (idx & 3) * 4 + (idx >> 2);
nNeighbourBlock = nBlock - 1;
}
else
{
nBlock = idx;
nNeighbourBlock = idx - 4;
}
VM_ASSERT(-1 == m_gmbinfo->RefIdxs[1][MBAddr].RefIdxs[nBlock]);
VM_ASSERT(-1 == m_gmbinfo->RefIdxs[1][MBAddr].RefIdxs[nNeighbourBlock]);
{
H264DecoderFrame **pRefPicList;
Ipp32s index;
pRefPicList = m_pCurrentFrame->GetRefPicList((m_gmbinfo->mbs + MBAddr)->slice_id, 0)->m_RefPicList;
// select reference index for current block
index = m_gmbinfo->RefIdxs[0][MBAddr].RefIdxs[nBlock];
iRefQ = (index < 0) ?
(-1) :
(pRefPicList[index >> 1]->DeblockPicID(index & 1));
// select reference index for previous block
index = m_gmbinfo->RefIdxs[0][MBAddr].RefIdxs[nNeighbourBlock];
iRefP = (index < 0) ?
(-1) :
pRefPicList[index >> 1]->DeblockPicID(index & 1);
}
VM_ASSERT((iRefP != -1) || (iRefQ != -1));
// when reference indexes are equal
if (iRefQ == iRefP)
{
H264DecoderMotionVector *pVectorQ, *pVectorP;
pVectorQ = m_gmbinfo->MV[0][MBAddr].MotionVectors + nBlock;
pVectorP = m_gmbinfo->MV[0][MBAddr].MotionVectors + nNeighbourBlock;
// compare motion vectors
if ((4 <= abs(pVectorQ->mvx - pVectorP->mvx)) ||
(2 <= abs(pVectorQ->mvy - pVectorP->mvy)))
{
pStrength[idx] = 1;
*pDeblockingFlag = 1;
}
else
pStrength[idx] = 0;
}
// when reference indexes are different
else
{
pStrength[idx] = 1;
*pDeblockingFlag = 1;
}
}
}
}
} // void H264SegmentDecoder::PrepareDeblockingParametersPSlice4MBAFFField(Ipp32u dir, DeblockingParameters *pParams)
void H264SegmentDecoder::PrepareDeblockingParametersBSlice4MBAFFField(Ipp32u dir, DeblockingParameters *pParams)
{
Ipp32s MBAddr = pParams->nMBAddr;
Ipp32u cbp4x4_luma = (m_mbinfo.mbs + MBAddr)->cbp4x4_luma;
Ipp8u *pStrength = pParams->Strength[dir];
Ipp32s *pDeblockingFlag = &(pParams->DeblockingFlag[dir]);
//
// external edge
//
if (pParams->ExternalEdgeFlag[dir])
{
Ipp32s nNeighbour;
// select neighb
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -