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

📄 umc_h264_dec_deblocking_mbaff.cpp

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                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 iRefQFrw, iRefPFrw, iRefQBck, iRefPBck;                    // calc block and neighbour block number                    if (VERTICAL_DEBLOCKING == dir)                    {                        nBlock = idx * 4;                        nNeighbourBlock = nBlock + 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;                            iRefQFrw = pRefPicList[index >> 1]->DeblockPicID(index & 1);                        }                        else                            iRefQFrw = -1;                        index = m_pCurrentFrame->m_mbinfo.RefIdxs[1][MBAddr].RefIdxs[nBlock];                        if (0 <= index)                        {                            pRefPicList = m_pCurrentFrame->GetRefPicList((m_pCurrentFrame->m_mbinfo.mbs + MBAddr)->slice_id, 1)->m_RefPicList;                            iRefQBck = pRefPicList[index >> 1]->DeblockPicID(index & 1);                        }                        else                            iRefQBck = -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;                            iRefPFrw = pRefPicList[index >> 1]->DeblockPicID(index & 1);                        }                        else                            iRefPFrw = -1;                        index = m_pCurrentFrame->m_mbinfo.RefIdxs[1][nNeighbour].RefIdxs[nNeighbourBlock];                        if (0 <= index)                        {                            pRefPicList = m_pCurrentFrame->GetRefPicList((m_pCurrentFrame->m_mbinfo.mbs + nNeighbour)->slice_id, 1)->m_RefPicList;                            iRefPBck = pRefPicList[index >> 1]->DeblockPicID(index & 1);                        }                        else                            iRefPBck = -1;                    }                    // when reference indexes are equal                    if (((iRefQFrw == iRefPFrw) && (iRefQBck == iRefPBck)) ||                        ((iRefQFrw == iRefPBck) && (iRefQBck == iRefPFrw)))                    {                        // set initial value of strength                        pStrength[idx] = 0;                        // when forward and backward reference pictures of previous block are different                        if (iRefPFrw != iRefPBck)                        {                            H264DecoderMotionVector *pVectorQFrw, *pVectorQBck;                            H264DecoderMotionVector *pVectorPFrw, *pVectorPBck;                            // select current block motion vectors                            pVectorQFrw = m_pCurrentFrame->m_mbinfo.MV[0][MBAddr].MotionVectors + nBlock;                            pVectorQBck = m_pCurrentFrame->m_mbinfo.MV[1][MBAddr].MotionVectors + nBlock;                            // select previous block motion vectors                            if (iRefQFrw == iRefPFrw)                            {                                pVectorPFrw = m_pCurrentFrame->m_mbinfo.MV[0][nNeighbour].MotionVectors + nNeighbourBlock;                                pVectorPBck = m_pCurrentFrame->m_mbinfo.MV[1][nNeighbour].MotionVectors + nNeighbourBlock;                            }                            else                            {                                pVectorPFrw = m_pCurrentFrame->m_mbinfo.MV[1][nNeighbour].MotionVectors + nNeighbourBlock;                                pVectorPBck = m_pCurrentFrame->m_mbinfo.MV[0][nNeighbour].MotionVectors + nNeighbourBlock;                            }                            // compare motion vectors                            if ((4 <= abs(pVectorQFrw->mvx - pVectorPFrw->mvx)) ||                                (2 <= abs(pVectorQFrw->mvy - pVectorPFrw->mvy)) ||                                (4 <= abs(pVectorQBck->mvx - pVectorPBck->mvx)) ||                                (2 <= 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_pCurrentFrame->m_mbinfo.MV[0][MBAddr].MotionVectors + nBlock;                            pVectorQBck = m_pCurrentFrame->m_mbinfo.MV[1][MBAddr].MotionVectors + nBlock;                            // select previous block motion vectors                            pVectorPFrw = m_pCurrentFrame->m_mbinfo.MV[0][nNeighbour].MotionVectors + nNeighbourBlock;                            pVectorPBck = m_pCurrentFrame->m_mbinfo.MV[1][nNeighbour].MotionVectors + nNeighbourBlock;                            // compare motion vectors                            if ((4 <= abs(pVectorQFrw->mvx - pVectorPFrw->mvx)) ||                                (2 <= abs(pVectorQFrw->mvy - pVectorPFrw->mvy)) ||                                (4 <= abs(pVectorQBck->mvx - pVectorPBck->mvx)) ||                                (2 <= abs(pVectorQBck->mvy - pVectorPBck->mvy)))                            {                                if ((4 <= abs(pVectorQFrw->mvx - pVectorPBck->mvx)) ||                                    (2 <= abs(pVectorQFrw->mvy - pVectorPBck->mvy)) ||                                    (4 <= abs(pVectorQBck->mvx - pVectorPFrw->mvx)) ||                                    (2 <= abs(pVectorQBck->mvy - pVectorPFrw->mvy)))                                {                                    pStrength[idx] = 1;                                    *pDeblockingFlag = 1;                                }                            }                        }                    }                    // 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 iRefQFrw, iRefQBck, iRefPFrw, iRefPBck;                // 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;                }                {                    H264DecoderFrame **pRefPicList;                    Ipp32s index;                    // select forward reference pictures list                    pRefPicList = m_pCurrentFrame->GetRefPicList((m_pCurrentFrame->m_mbinfo.mbs + MBAddr)->slice_id, 0)->m_RefPicList;                    // select forward reference index for block(s)                    index = m_pCurrentFrame->m_mbinfo.RefIdxs[0][MBAddr].RefIdxs[nBlock];                    iRefQFrw = (index < 0) ?                            (-1) :                            (pRefPicList[index >> 1]->DeblockPicID(index & 1));                    index = m_pCurrentFrame->m_mbinfo.RefIdxs[0][MBAddr].RefIdxs[nNeighbourBlock];                    iRefPFrw = (index < 0) ?                            (-1) :                            pRefPicList[index >> 1]->DeblockPicID(index & 1);                    // select backward reference pictures list                    pRefPicList = m_pCurrentFrame->GetRefPicList((m_pCurrentFrame->m_mbinfo.mbs + MBAddr)->slice_id, 1)->m_RefPicList;                    // select backward reference index for block(s)                    index = m_pCurrentFrame->m_mbinfo.RefIdxs[1][MBAddr].RefIdxs[nBlock];                    iRefQBck = (index < 0) ?                            (-1) :                            (pRefPicList[index >> 1]->DeblockPicID(index & 1));                    index = m_pCurrentFrame->m_mbinfo.RefIdxs[1][MBAddr].RefIdxs[nNeighbourBlock];                    iRefPBck = (index < 0) ?                            (-1) :                            pRefPicList[index >> 1]->DeblockPicID(index & 1);                }                // when reference indexes are equal                if (((iRefQFrw == iRefPFrw) && (iRefQBck == iRefPBck)) ||                    ((iRefQFrw == iRefPBck) && (iRefQBck == iRefPFrw)))                {                    // set initial value of strength                    pStrength[idx] = 0;                    // when forward and backward reference pictures of previous block are different                    if (iRefPFrw != iRefPBck)                    {                        H264DecoderMotionVector *pVectorQFrw, *pVectorQBck;                        H264DecoderMotionVector *pVectorPFrw, *pVectorPBck;                        // select current block motion vectors                        pVectorQFrw = m_pCurrentFrame->m_mbinfo.MV[0][MBAddr].MotionVectors + nBlock;                        pVectorQBck = m_pCurrentFrame->m_mbinfo.MV[1][MBAddr].MotionVectors + nBlock;                        // select previous block motion vectors                        if (iRefQFrw == iRefPFrw)                        {                            pVectorPFrw = m_pCurrentFrame->m_mbinfo.MV[0][MBAddr].MotionVectors + nNeighbourBlock;                            pVectorPBck = m_pCurrentFrame->m_mbinfo.MV[1][MBAddr].MotionVectors + nNeighbourBlock;                        }                        else                        {                            pVectorPFrw = m_pCurrentFrame->m_mbinfo.MV[1][MBAddr].MotionVectors + nNeighbourBlock;                            pVectorPBck = m_pCurrentFrame->m_mbinfo.MV[0][MBAddr].MotionVectors + nNeighbourBlock;                        }                        // compare motion vectors                        if ((4 <= abs(pVectorQFrw->mvx - pVectorPFrw->mvx)) ||                            (2 <= abs(pVectorQFrw->mvy - pVectorPFrw->mvy)) ||                            (4 <= abs(pVectorQBck->mvx - pVectorPBck->mvx)) ||                            (2 <= 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_pCurrentFrame->m_mbinfo.MV[0][MBAddr].MotionVectors + nBlock;                        pVectorQBck = m_pCurrentFrame->m_mbinfo.MV[1][MBAddr].MotionVectors + nBlock;                        // select previous block motion vectors                        pVectorPFrw = m_pCurrentFrame->m_mbinfo.MV[0][MBAddr].MotionVectors + nNeighbourBlock;                        pVectorPBck = m_pCurrentFrame->m_mbinfo.MV[1][MBAddr].MotionVectors + nNeighbourBlock;                        // compare motion vectors                        if ((4 <= abs(pVectorQFrw->mvx - pVectorPFrw->mvx)) ||                            (2 <= abs(pVectorQFrw->mvy - pVectorPFrw->mvy)) ||                            (4 <= abs(pVectorQBck->mvx - pVectorPBck->mvx)) ||                            (2 <= abs(pVectorQBck->mvy - pVectorPBck->mvy)))                        {                            if ((4 <= abs(pVectorQFrw->mvx - pVectorPBck->mvx)) ||                                (2 <= abs(pVectorQFrw->mvy - pVectorPBck->mvy)) ||                                (4 <= abs(pVectorQBck->mvx - pVectorPFrw->mvx)) ||                                (2 <= abs(pVectorQBck->mvy - pVectorPFrw->mvy)))                            {                                pStrength[idx] = 1;                                *pDeblockingFlag = 1;                            }                        }                    }                }                // when reference indexes are different                else                {                    pStrength[idx] = 1;                    *pDeblockingFlag = 1;                }            }        }    }} // void H264VideoDecoder::PrepareDeblockingParametersBSlice4MBAFFField(Ipp32u dir, DeblockingParameters *pParams)} // end namespace UMC

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -