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

📄 umc_h264_segment_decoder_deblocking_mbaff.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    //
    // step 1. Perform complex deblocking on external edge
    //
    {
        Ipp32s MBAddr = pParams->nMBAddr;
        Ipp8u Clipping[16];
        Ipp8u Alpha[2];
        Ipp8u Beta[2];
        Ipp32s AlphaC0Offset = pParams->nAlphaC0Offset;
        Ipp32s BetaOffset = pParams->nBetaOffset;
        Ipp32s pmq_QP = m_mbinfo.mbs[MBAddr].QP;
        Ipp32s pmp_QP;
        Ipp8u *pClipTab;
        Ipp32s QP;
        Ipp32s index;
        Ipp8u *pStrength = pParams->StrengthComplex;
        Ipp32s i;

        // prepare variables
        for (i = 0;i < 2;i += 1)
        {
            // get upper neighbour block QP
            pmp_QP = m_mbinfo.mbs[pParams->nLeft[i]].QP;

            // luma variables
            QP = (pmp_QP + pmq_QP + 1) >> 1 ;

            // external edge variables
            index = IClip(0, 51, QP + BetaOffset);
            Beta[i] = (Ipp8u)(BETA_TABLE[index]);

            index = IClip(0, 51, QP + AlphaC0Offset);
            Alpha[i] = (Ipp8u)(ALPHA_TABLE[index]);
            pClipTab = CLIP_TAB[index];

            // create clipping values
            Clipping[i * 4 + 0] = (Ipp8u)(pClipTab[pStrength[i * 4 + 0]]);
            Clipping[i * 4 + 1] = (Ipp8u)(pClipTab[pStrength[i * 4 + 1]]);
            Clipping[i * 4 + 2] = (Ipp8u)(pClipTab[pStrength[i * 4 + 2]]);
            Clipping[i * 4 + 3] = (Ipp8u)(pClipTab[pStrength[i * 4 + 3]]);
        }

        // perform deblocking
        if (0 == GetMBFieldDecodingFlag(m_gmbinfo->mbs[MBAddr]))
        {
            if (pParams->bitDepthLuma > 8)
            {
                IppDeblocking16u[8]((Ipp16u*)pParams->pLuma,
                                    pParams->pitch_luma * 2,
                                    &Alpha[0],
                                    &Beta[0],
                                    Clipping,
                                    pStrength,
                                    pParams->bitDepthLuma);
                IppDeblocking16u[8]((Ipp16u*)pParams->pLuma + pParams->pitch_luma,
                                    pParams->pitch_luma * 2,
                                    &Alpha[1],
                                    &Beta[1],
                                    Clipping + 4,
                                    pStrength + 4,
                                    pParams->bitDepthLuma);
            }
            else
            {
                IppDeblocking[8](pParams->pLuma,
                                 pParams->pitch_luma * 2,
                                 &Alpha[0],
                                 &Beta[0],
                                 Clipping,
                                 pStrength,
                                 pParams->bitDepthLuma);
                IppDeblocking[8](pParams->pLuma + pParams->pitch_luma,
                                 pParams->pitch_luma * 2,
                                 &Alpha[1],
                                 &Beta[1],
                                 Clipping + 4,
                                 pStrength + 4,
                                 pParams->bitDepthLuma);
            }
        }
        else
        {
            if (pParams->bitDepthLuma > 8)
            {
                IppDeblocking16u[8]((Ipp16u*)pParams->pLuma,
                                    pParams->pitch_luma,
                                    &Alpha[0],
                                    &Beta[0],
                                    Clipping,
                                    pStrength,
                                    pParams->bitDepthLuma);
                IppDeblocking16u[8]((Ipp16u*)pParams->pLuma + pParams->pitch_luma * 8,
                                    pParams->pitch_luma,
                                    &Alpha[1],
                                    &Beta[1],
                                    Clipping + 4,
                                    pStrength + 4,
                                    pParams->bitDepthLuma);
            }
            else
            {
                IppDeblocking[8](pParams->pLuma,
                                 pParams->pitch_luma,
                                 &Alpha[0],
                                 &Beta[0],
                                 Clipping,
                                 pStrength,
                                 pParams->bitDepthLuma);
                IppDeblocking[8](pParams->pLuma + pParams->pitch_luma * 8,
                                 pParams->pitch_luma,
                                 &Alpha[1],
                                 &Beta[1],
                                 Clipping + 4,
                                 pStrength + 4,
                                 pParams->bitDepthLuma);
            }
        }
    }

    //
    // step 2. Perform complex deblocking on internal edges
    //
    DeblockLuma(VERTICAL_DEBLOCKING, pParams);

} // void H264SegmentDecoder::DeblockLumaVerticalMBAFF(DeblockingParametersMBAFF *pParams)

void H264SegmentDecoder::DeblockChromaVerticalMBAFF400(DeblockingParametersMBAFF *)
{
    // there is nothing to do

} // void H264SegmentDecoder::DeblockChromaVerticalMBAFF400(DeblockingParametersMBAFF *)

void H264SegmentDecoder::DeblockChromaVerticalMBAFF420(DeblockingParametersMBAFF *pParams)
{
    //
    // step 1. Perform complex deblocking on external edge
    //
    {
        Ipp32s MBAddr = pParams->nMBAddr;
        Ipp8u Clipping[16];
        Ipp8u Alpha[2];
        Ipp8u Beta[2];
        Ipp32s AlphaC0Offset = pParams->nAlphaC0Offset;
        Ipp32s BetaOffset = pParams->nBetaOffset;
        Ipp32s pmq_QP = m_mbinfo.mbs[MBAddr].QP;
        Ipp32s pmp_QP;
        Ipp8u *pClipTab;
        Ipp32s QP;
        Ipp32s index;
        Ipp8u *pStrength = pParams->StrengthComplex;
        Ipp32s nPlane;
        Ipp32s chroma_qp_offset = ~(m_pPicParamSet->chroma_qp_index_offset[0]);

        for (nPlane = 0; nPlane < 2; nPlane += 1)
        {
            // prepare variables
            if (chroma_qp_offset != m_pPicParamSet->chroma_qp_index_offset[nPlane])
            {
                Ipp32s i;

                chroma_qp_offset = m_pPicParamSet->chroma_qp_index_offset[nPlane];

                // prepare variables
                for (i = 0;i < 2;i += 1)
                {
                    // get upper neighbour block QP
                    pmp_QP = m_mbinfo.mbs[pParams->nLeft[i]].QP;

                    // external edge variables
                    QP = (QP_SCALE_CR[IClip(0, 51, pmp_QP + chroma_qp_offset)] +
                            QP_SCALE_CR[IClip(0, 51, pmq_QP + chroma_qp_offset)] + 1) >> 1;

                    // external edge variables
                    index = IClip(0, 51, QP + BetaOffset);
                    Beta[i] = (Ipp8u)(BETA_TABLE[index]);

                    index = IClip(0, 51, QP + AlphaC0Offset);
                    Alpha[i] = (Ipp8u)(ALPHA_TABLE[index]);
                    pClipTab = CLIP_TAB[index];

                    // create clipping values
                    Clipping[i * 4 + 0] = (Ipp8u)(pClipTab[pStrength[i * 4 + 0]]);
                    Clipping[i * 4 + 1] = (Ipp8u)(pClipTab[pStrength[i * 4 + 1]]);
                    Clipping[i * 4 + 2] = (Ipp8u)(pClipTab[pStrength[i * 4 + 2]]);
                    Clipping[i * 4 + 3] = (Ipp8u)(pClipTab[pStrength[i * 4 + 3]]);
                }
            }

            // perform deblocking
            if (0 == GetMBFieldDecodingFlag(m_gmbinfo->mbs[MBAddr]))
            {
                if (pParams->bitDepthChroma > 8)
                {
                    IppDeblocking16u[9]((Ipp16u*)pParams->pChroma[nPlane],
                                        pParams->pitch_chroma * 2,
                                        &Alpha[0],
                                        &Beta[0],
                                        Clipping,
                                        pStrength,
                                        pParams->bitDepthChroma);
                    IppDeblocking16u[9]((Ipp16u*)pParams->pChroma[nPlane] + pParams->pitch_chroma,
                                        pParams->pitch_chroma * 2,
                                        &Alpha[1],
                                        &Beta[1],
                                        Clipping + 4,
                                        pStrength + 4,
                                        pParams->bitDepthChroma);
                }
                else
                {
                    IppDeblocking[9](pParams->pChroma[nPlane],
                                     pParams->pitch_chroma * 2,
                                     &Alpha[0],
                                     &Beta[0],
                                     Clipping,
                                     pStrength,
                                     pParams->bitDepthChroma);
                    IppDeblocking[9](pParams->pChroma[nPlane] + pParams->pitch_chroma,
                                     pParams->pitch_chroma * 2,
                                     &Alpha[1],
                                     &Beta[1],
                                     Clipping + 4,
                                     pStrength + 4,
                                     pParams->bitDepthChroma);
                }
            }
            else
            {
                if (pParams->bitDepthChroma > 8)
                {
                    IppDeblocking16u[9]((Ipp16u*)pParams->pChroma[nPlane],
                                        pParams->pitch_chroma,
                                        &Alpha[0],
                                        &Beta[0],
                                        Clipping,
                                        pStrength,
                                        pParams->bitDepthChroma);
                    IppDeblocking16u[9]((Ipp16u*)pParams->pChroma[nPlane] + pParams->pitch_chroma * 4,
                                        pParams->pitch_chroma,
                                        &Alpha[1],
                                        &Beta[1],
                                        Clipping + 4,
                                        pStrength + 4,
                                        pParams->bitDepthChroma);
                }
                else
                {
                    IppDeblocking[9](pParams->pChroma[nPlane],
                                     pParams->pitch_chroma,
                                     &Alpha[0],
                                     &Beta[0],
                                     Clipping,
                                     pStrength,
                                     pParams->bitDepthChroma);
                    IppDeblocking[9](pParams->pChroma[nPlane] + pParams->pitch_chroma * 4,
                                     pParams->pitch_chroma,
                                     &Alpha[1],
                                     &Beta[1],
                                     Clipping + 4,
                                     pStrength + 4,
                                     pParams->bitDepthChroma);
                }
            }
        }
    }

    //
    // step 2. Perform complex deblocking on internal edges
    //
    (this->*DeblockChroma[CHROMA_FORMAT_420])(VERTICAL_DEBLOCKING, pParams);

} // void H264SegmentDecoder::DeblockChromaVerticalMBAFF420(DeblockingParametersMBAFF *pParams)

void H264SegmentDecoder::DeblockChromaVerticalMBAFF422(DeblockingParametersMBAFF *pParams)
{
    //
    // step 1. Perform complex deblocking on external edge
    //
    {
        Ipp32s MBAddr = pParams->nMBAddr;
        Ipp8u Clipping[16];
        Ipp8u Alpha[2];
        Ipp8u Beta[2];
        Ipp32s AlphaC0Offset = pParams->nAlphaC0Offset;
        Ipp32s BetaOffset = pParams->nBetaOffset;
        Ipp32s pmq_QP = m_mbinfo.mbs[MBAddr].QP;
        Ipp32s pmp_QP;
        Ipp8u *pClipTab;
        Ipp32s QP;
        Ipp32s index;
        Ipp8u *pStrength = pParams->StrengthComplex;
        Ipp32s nPlane;
        Ipp32s chroma_qp_offset = ~(m_pPicParamSet->chroma_qp_index_offset[0]);

        for (nPlane = 0; nPlane < 2; nPlane += 1)
        {
            // prepare variables
            if (chroma_qp_offset != m_pPicParamSet->chroma_qp_index_offset[nPlane])
            {
                Ipp32s i;

                chroma_qp_offset = m_pPicParamSet->chroma_qp_index_offset[nPlane];

                // prepare variables
                for (i = 0;i < 2;i += 1)
                {
                    // get upper neighbour block QP
                    pmp_QP = m_mbinfo.mbs[pParams->nLeft[i]].QP;

                    // external edge variables
                    QP = (QP_SCALE_CR[IClip(0, 51, pmp_QP + chroma_qp_offset)] +
                          QP_SCALE_CR[IClip(0, 51, pmq_QP + chroma_qp_offset)] + 1) >> 1;

                    // external edge variables
                    index = IClip(0, 51, QP + BetaOffset);
                    Beta[i] = (Ipp8u)(BETA_TABLE[index]);

                    index = IClip(0, 51, QP + AlphaC0Offset);
                    Alpha[i] = (Ipp8u)(ALPHA_TABLE[index]);
                    pClipTab = CLIP_TAB[index];

                    // create clipping values
                    Clipping[i * 4 + 0] = (Ipp8u)(pClipTab[pStrength[i * 4 + 0]]);
                    Clipping[i * 4 + 1] = (Ipp8u)(pClipTab[pStrength[i * 4 + 1]]);
                    Clipping[i * 4 + 2] = (Ipp8u)(pClipTab[pStrength[i * 4 + 2]]);
                    Clipping[i * 4 + 3] = (Ipp8u)(pClipTab[pStrength[i * 4 + 3]]);
                }
            }

            // perform deblocking

⌨️ 快捷键说明

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