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

📄 umc_avs_dec_deblocker.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
        Ipp8u pStrengt[4] = {0,0,0,0};
        AVS_MB_INFO *pMbPrev = (direction == HorizontalEdge)?m_pMbInfoTop:m_pMbInfoLeft;

        Ipp32s QPprev;
        Ipp32s QPprevchr;
        Ipp8u Alpha[2];
        Ipp8u Beta[2];
        Ipp32s Treshold[2];

        if (AVS_B_PICTURE == m_debCtx.m_pPicHeader->picture_coding_type)
            GetStrengthsForBMb(pStrengt,m_pMbInfo,pMbPrev,direction);
        else
            GetStrengthsForPMb(pStrengt,m_pMbInfo,pMbPrev,direction);

        if (NULL != pMbPrev)
        {
            QPprev = (pMbPrev->QP + m_pMbInfo->QP + 1) >> 1;
            Alpha[0] = AVS_ALPHA_TABLE[ICLIP(0,63,QPprev + m_debCtx.m_pPicHeader->alpha_c_offset)];
            Beta[0]  = AVS_BETA_TABLE[ICLIP(0,63,QPprev + m_debCtx.m_pPicHeader->beta_offset)];
            Treshold[0] = AVS_CLIP_TABlE[ICLIP(0,63,QPprev + m_debCtx.m_pPicHeader->alpha_c_offset)];
        }


        Alpha[1] = AVS_ALPHA_TABLE[ICLIP(0,63,m_pMbInfo->QP + m_debCtx.m_pPicHeader->alpha_c_offset)];
        Beta[1]  = AVS_BETA_TABLE[ICLIP(0,63,m_pMbInfo->QP + m_debCtx.m_pPicHeader->beta_offset)];
        Treshold[1] = AVS_CLIP_TABlE[ICLIP(0,63,m_pMbInfo->QP + m_debCtx.m_pPicHeader->alpha_c_offset)];

        //luma deblocking
        (this->*(AVSDeblockingTbl[direction]))(pY,
                                               m_debCtx.m_iPitch,
                                               Alpha,
                                               Beta,
                                               pStrengt,
                                               Treshold,
                                               0);
        // no internal deblocking for chroma
        if (NULL != pMbPrev)
        {
            QPprevchr=(AVS_QP_SCALE_CR[pMbPrev->QP]+AVS_QP_SCALE_CR[m_pMbInfo->QP]+1) >> 1;
            // chroma deblocking
            Alpha[0] = AVS_ALPHA_TABLE[ICLIP(0,63,QPprevchr + m_debCtx.m_pPicHeader->alpha_c_offset)];
            Beta[0]  = AVS_BETA_TABLE[ICLIP(0,63,QPprevchr + m_debCtx.m_pPicHeader->beta_offset)];
            Treshold[0]  = AVS_CLIP_TABlE[ICLIP(0,63,QPprevchr + m_debCtx.m_pPicHeader->alpha_c_offset)];
            (this->*(AVSDeblockingTbl[2+direction]))(pU,
                                                     m_debCtx.m_iPitch,
                                                     Alpha,
                                                     Beta,
                                                     pStrengt,
                                                     Treshold,
                                                     0);
            (this->*(AVSDeblockingTbl[2+direction]))(pV,
                                                     m_debCtx.m_iPitch,
                                                     Alpha,
                                                     Beta,
                                                     pStrengt,
                                                     Treshold,
                                                     0);
        }
    }




    void AVSDeblocker::GetStrengthsForPMb(Ipp8u* pStrength,
                                          AVS_MB_INFO* pMbCurrent,
                                          AVS_MB_INFO* pMbPrev,
                                          Ipp32s direction)
    {
        Ipp32u i = 0;
        Ipp32u static BlkOrderTPrevHor[4] = {2,3,0,1};
        Ipp32u static BlkOrderTPrevVer[4] = {1,3,0,2};
        Ipp32u static BlkOrderTQurHor[4]  = {0,1,2,3};
        Ipp32u static BlkOrderTQurVer[4]  = {0,2,1,3};
        Ipp32u* blk_order_prev;
        Ipp32u* blk_order_curr;

        if (direction == HorizontalEdge)
        {
            blk_order_prev = BlkOrderTPrevHor;
            blk_order_curr = BlkOrderTQurHor;
        }
        else
        {
            blk_order_prev = BlkOrderTPrevVer;
            blk_order_curr = BlkOrderTQurVer;
        }

        if (NULL == pMbPrev)
        {
            pStrength[blk_order_curr[0]] = 0;
            pStrength[blk_order_curr[1]] = 0;
            i += 2;
        }

        for (i;i < 4; i++)
        {
            // interal edges
            if (i > 1)
                pMbPrev = pMbCurrent;

            if ((pMbPrev->MbType == I_8x8)||(pMbCurrent->MbType == I_8x8))
                pStrength[blk_order_curr[i]] = 2;
            else if (pMbPrev->refIdx[AVS_FORWARD][blk_order_prev[i]] != pMbCurrent->refIdx[AVS_FORWARD][blk_order_curr[i]])
                pStrength[blk_order_curr[i]] = 1;
            // Motion Vectors in 1/4 pixel units
            else if (((abs(pMbPrev->mv[AVS_FORWARD][blk_order_prev[i]].vector.x - pMbCurrent->mv[AVS_FORWARD][blk_order_curr[i]].vector.x) >= 4 ) ||
                      (abs(pMbPrev->mv[AVS_FORWARD][blk_order_prev[i]].vector.y - pMbCurrent->mv[AVS_FORWARD][blk_order_curr[i]].vector.y)) >= 4 ))
            pStrength[blk_order_curr[i]] = 1;
        }
    }
    void AVSDeblocker::GetStrengthsForBMb(Ipp8u* pStrength,
                                          AVS_MB_INFO* pMbCurrent,
                                          AVS_MB_INFO* pMbPrev,
                                          Ipp32s direction)
    {
        Ipp32u i = 0;
        Ipp32u static BlkOrderTPrevHor[4] = {2,3,0,1};
        Ipp32u static BlkOrderTPrevVer[4] = {1,3,0,2};
        Ipp32u static BlkOrderTQurHor[4]  = {0,1,2,3};
        Ipp32u static BlkOrderTQurVer[4]  = {0,2,1,3};
        Ipp32u* blk_order_prev;
        Ipp32u* blk_order_curr;

        if (direction == HorizontalEdge)
        {
            blk_order_prev = BlkOrderTPrevHor;
            blk_order_curr = BlkOrderTQurHor;
        }
        else
        {
            blk_order_prev = BlkOrderTPrevVer;
            blk_order_curr = BlkOrderTQurVer;
        }

        if (NULL == pMbPrev)
        {
            pStrength[blk_order_curr[0]] = 0;
            pStrength[blk_order_curr[1]] = 0;
            i += 2;
        }


        for (i;i < 4; i++)
        {
            // interal edges
            if (i > 1)
                pMbPrev = pMbCurrent;

            if (0 == (pMbPrev->predType[blk_order_prev[i]] & PredForward))
                pMbPrev->refIdx[AVS_FORWARD][blk_order_prev[i]] = 0xFF;

            if (0 == (pMbPrev->predType[blk_order_prev[i]] &PredBackward))
                pMbPrev->refIdx[AVS_BACKWARD][blk_order_prev[i]] = 0xFF;

            if (0 == (pMbCurrent->predType[blk_order_curr[i]] & PredForward))
                pMbCurrent->refIdx[AVS_FORWARD][blk_order_curr[i]] = 0xFF;

            if (0 == (pMbCurrent->predType[blk_order_curr[i]] &PredBackward))
                pMbCurrent->refIdx[AVS_BACKWARD][blk_order_curr[i]] = 0xFF;

            if ((pMbPrev->MbType == I_8x8)||(pMbCurrent->MbType == I_8x8))
                pStrength[blk_order_curr[i]] = 2;
            else if ((pMbPrev->refIdx[AVS_FORWARD][blk_order_prev[i]] != pMbCurrent->refIdx[AVS_FORWARD][blk_order_curr[i]])||
                     (pMbPrev->refIdx[AVS_BACKWARD][blk_order_prev[i]] != pMbCurrent->refIdx[AVS_BACKWARD][blk_order_curr[i]]))
                     pStrength[blk_order_curr[i]] = 1;
            // Motion Vectors in 1/4 pixel units
            else if ( (abs(pMbPrev->mv[AVS_FORWARD][blk_order_prev[i]].vector.x - pMbCurrent->mv[AVS_FORWARD][blk_order_curr[i]].vector.x) >= 4 ) ||
                      (abs(pMbPrev->mv[AVS_FORWARD][blk_order_prev[i]].vector.y - pMbCurrent->mv[AVS_FORWARD][blk_order_curr[i]].vector.y) >= 4 ) ||
                      (abs(pMbPrev->mv[AVS_BACKWARD][blk_order_prev[i]].vector.x - pMbCurrent->mv[AVS_BACKWARD][blk_order_curr[i]].vector.x) >= 4 ) ||
                      (abs(pMbPrev->mv[AVS_BACKWARD][blk_order_prev[i]].vector.y - pMbCurrent->mv[AVS_BACKWARD][blk_order_curr[i]].vector.y) >= 4 ))
            pStrength[blk_order_curr[i]] = 1;
        }
    }
    //prototypes for IPP
    IppStatus AVSDeblocker::FilterDeblockingLuma_VerEdge(Ipp8u* pSrcDst,
                                                         Ipp32s srcdstStep,
                                                         Ipp8u* pAlpha,
                                                         Ipp8u* pBeta,
                                                         Ipp8u* pBS,
                                                         Ipp32s* pThreshold,
                                                         Ipp32s /*bit_depth*/)
    {
        Ipp8u p2,p1,p0,q0,q1,q2;
        Ipp8u* pCurDst = pSrcDst;

        for (Ipp32u edgeCount = 0; edgeCount < 2; edgeCount++)
        {
            for (Ipp32u pixel = 0; pixel < 16; pixel++)
            {
                // get Strength of edge
                //  |-0   |-1
                //  |-2   |-3
                if (0 == pBS[((pixel >> 3) << 1)  + edgeCount])
                {
                    // go to next edge
                    pixel += 7;
                    pCurDst += 8*srcdstStep;
                }
                else
                {
                    p2 = pCurDst[-3];
                    p1 = pCurDst[-2];
                    p0 = pCurDst[-1];
                    q0 = pCurDst[0];
                    q1 = pCurDst[1];
                    q2 = pCurDst[2];
                    if ( (pAlpha[edgeCount] > abs(q0 - p0))&&
                         (pBeta[edgeCount] > abs(p1 - p0))&&
                         (pBeta[edgeCount] > abs(q1 - q0)))
                    {
                        Ipp32u ap = abs(p2-p0);
                        Ipp32u aq = abs(q2-q0);

                        if (2 == pBS[((pixel >> 3) << 1)  + edgeCount])
                        {

                            if (ap < pBeta[edgeCount] &&
                                abs(p0-q0) < ((pAlpha[edgeCount] >> 2)+2))
                            {
                                pCurDst[-1] = (p1 + 2*p0 + q0 + 2) >> 2;
                                pCurDst[-2] = (2*p1 + p0 + q0 + 2) >> 2;
                            }
                            else
                                pCurDst[-1] = (2*p1 + p0 + q0 + 2 ) >> 2;

                            if (aq < pBeta[edgeCount] &&
                                abs(p0-q0) < ((pAlpha[edgeCount] >> 2)+2))
                            {
                                pCurDst[0] = (q1 + 2*q0 + p0 + 2) >> 2;
                                pCurDst[1] = (2*q1 + q0 + p0 + 2) >> 2;
                            }
                            else
                                pCurDst[0] = (2*q1 + q0 + p0 + 2 ) >> 2;

                        }
                        else if (1 == pBS[((pixel >> 3) << 1)  + edgeCount])
                        {
                            Ipp32s delta = ICLIP( -pThreshold[edgeCount], pThreshold[edgeCount], ( (q0 - p0)*3 + (p1 - q1) + 4) >> 3 );
                            pCurDst[-1] = ICLIP<Ipp8u> (0, 255, p0 + delta);
                            pCurDst[0] = ICLIP<Ipp8u> (0, 255, q0 - delta);
                            p0 = pCurDst[-1];
                            q0 = pCurDst[0];
                            if (ap < pBeta[edgeCount]) // differ from reference
                            {
                                delta = ICLIP(-pThreshold[edgeCount], pThreshold[edgeCount], ( (p0 - p1)*3 + (p2 - q0) + 4) >> 3);
                                pCurDst[-2] = ICLIP<Ipp8u> (0, 255, p1 + delta);
                            }
                            if (aq < pBeta[edgeCount])
                            {
                                delta = ICLIP(-pThreshold[edgeCount], pThreshold[edgeCount], ( (q1 - q0)*3 + (p0 - q2) + 4) >> 3);
                                pCurDst[1] = ICLIP<Ipp8u> (0, 255, q1 - delta);
                            }
                        }
                    }
                    pCurDst += srcdstStep;
                }
            }
            pCurDst = pSrcDst + 8;
        }

⌨️ 快捷键说明

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