📄 umc_h264_dec_deblocking_mbaff.cpp
字号:
// external edge required in strong filtering else SetEdgeStrength(pStrength + 0, 4); pStrength += 4; }} // void H264VideoDecoder::PrepareDeblockingParametersPSlice4MBAFFComplexFrameExternalEdge(DeblockingParametersMBAFF *pParams)void H264VideoDecoder::PrepareDeblockingParametersPSlice4MBAFFComplexFieldExternalEdge(DeblockingParametersMBAFF *pParams){ Ipp32u MBAddr = pParams->nMBAddr; Ipp32u cbp4x4 = (m_mbinfo.mbs + MBAddr)->cbp4x4; Ipp8u *pStrength = pParams->StrengthComplex; Ipp32u i; // mixed edge is always deblocked { Ipp32u *pDeblockingFlag = &(pParams->DeblockingFlag[VERTICAL_DEBLOCKING]); *pDeblockingFlag = 1; } // we fill parameters using 2 passes for (i = 0;i < 2;i += 1) { Ipp32u nNeighbour; // select neighbour addres nNeighbour = pParams->nLeft[i]; // when neighbour macroblock isn't intra if (!IS_INTRA_MBTYPE((m_pCurrentFrame->m_mbinfo.mbs + nNeighbour)->mbtype)) { H264DecoderMacroblockLocalInfo *pNeighbour; Ipp32u idx; // select neighbour pNeighbour = m_mbinfo.mbs + nNeighbour; // cicle on blocks for (idx = 0;idx < 4;idx += 1) { Ipp32u 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 & blkQ) || (pNeighbour->cbp4x4 & 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 H264VideoDecoder::PrepareDeblockingParametersPSlice4MBAFFComplexFieldExternalEdge(DeblockingParametersMBAFF *pParams)void H264VideoDecoder::PrepareDeblockingParametersPSlice4MBAFFField(Ipp32u dir, DeblockingParameters *pParams){ Ipp32u MBAddr = pParams->nMBAddr; Ipp32u cbp4x4 = (m_mbinfo.mbs + MBAddr)->cbp4x4; Ipp8u *pStrength = pParams->Strength[dir]; Ipp32u *pDeblockingFlag = &(pParams->DeblockingFlag[dir]); // // external edge // if (pParams->ExternalEdgeFlag[dir]) { Ipp32u nNeighbour; // select neighbour addres nNeighbour = pParams->nNeighbour[dir]; // when neighbour macroblock isn't intra if (!IS_INTRA_MBTYPE((m_pCurrentFrame->m_mbinfo.mbs + nNeighbour)->mbtype)) { H264DecoderMacroblockLocalInfo *pNeighbour; Ipp32u idx; // select neighbour pNeighbour = m_mbinfo.mbs + nNeighbour; // cicle on blocks for (idx = 0;idx < 4;idx += 1) { Ipp32u 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 & blkQ) || (pNeighbour->cbp4x4 & blkP)) { pStrength[idx] = 2; *pDeblockingFlag = 1; } // compare motion vectors & reference indexes else { Ipp32u 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_pCurrentFrame->m_mbinfo.RefIdxs[0][MBAddr].RefIdxs[nBlock]; if (0 <= index) { pRefPicList = m_pCurrentFrame->GetRefPicList((m_pCurrentFrame->m_mbinfo.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_pCurrentFrame->m_mbinfo.RefIdxs[0][nNeighbour].RefIdxs[nNeighbourBlock]; if (0 <= index) { pRefPicList = m_pCurrentFrame->GetRefPicList((m_pCurrentFrame->m_mbinfo.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_pCurrentFrame->m_mbinfo.MV[0][MBAddr].MotionVectors + nBlock; pVectorP = m_pCurrentFrame->m_mbinfo.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) // { Ipp32u idx; // cicle of edge(s) // we do all edges in one cicle for (idx = 4;idx < 16;idx += 1) { Ipp32u blkQ; blkQ = INTERNAL_BLOCKS_MASK[dir][idx - 4]; if (cbp4x4 & blkQ) { pStrength[idx] = 2; *pDeblockingFlag = 1; } // compare motion vectors & reference indexes else { Ipp32u 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_pCurrentFrame->m_mbinfo.RefIdxs[1][MBAddr].RefIdxs[nBlock]); VM_ASSERT(-1 == m_pCurrentFrame->m_mbinfo.RefIdxs[1][MBAddr].RefIdxs[nNeighbourBlock]); { H264DecoderFrame **pRefPicList; Ipp32s index; pRefPicList = m_pCurrentFrame->GetRefPicList((m_pCurrentFrame->m_mbinfo.mbs + MBAddr)->slice_id, 0)->m_RefPicList; // select reference index for current block index = m_pCurrentFrame->m_mbinfo.RefIdxs[0][MBAddr].RefIdxs[nBlock]; iRefQ = (index < 0) ? (-1) : (pRefPicList[index >> 1]->DeblockPicID(index & 1)); // select reference index for previous block index = m_pCurrentFrame->m_mbinfo.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_pCurrentFrame->m_mbinfo.MV[0][MBAddr].MotionVectors + nBlock; pVectorP = m_pCurrentFrame->m_mbinfo.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 H264VideoDecoder::PrepareDeblockingParametersPSlice4MBAFFField(Ipp32u dir, DeblockingParameters *pParams)void H264VideoDecoder::PrepareDeblockingParametersBSlice4MBAFFField(Ipp32u dir, DeblockingParameters *pParams){ Ipp32u MBAddr = pParams->nMBAddr; Ipp32u cbp4x4 = (m_mbinfo.mbs + MBAddr)->cbp4x4; Ipp8u *pStrength = pParams->Strength[dir]; Ipp32u *pDeblockingFlag = &(pParams->DeblockingFlag[dir]); // // external edge // if (pParams->ExternalEdgeFlag[dir]) { Ipp32u nNeighbour; // select neighbour addres nNeighbour = pParams->nNeighbour[dir]; // when neighbour macroblock isn't intra if (!IS_INTRA_MBTYPE((m_pCurrentFrame->m_mbinfo.mbs + nNeighbour)->mbtype)) { H264DecoderMacroblockLocalInfo *pNeighbour; Ipp32u idx; // select neighbour pNeighbour = m_mbinfo.mbs + nNeighbour; // cicle on blocks for (idx = 0;idx < 4;idx += 1) { Ipp32u blkQ, blkP;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -