⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 umc_h264_dec_deblocking_mbaff.cpp

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        // 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 + -