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

📄 umc_h264_segment_decoder_deblocking_prepare.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                        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 + -