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

📄 umc_h264_segment_decoder_deblocking.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                    pClipTab = CLIP_TAB[index];

                    // create clipping values
                    Clipping[0] = (Ipp8u) (pClipTab[pStrength[0]]);
                    Clipping[1] = (Ipp8u) (pClipTab[pStrength[1]]);
                    Clipping[2] = (Ipp8u) (pClipTab[pStrength[2]]);
                    Clipping[3] = (Ipp8u) (pClipTab[pStrength[3]]);

                }

                // internal edge variables
                QP = QP_SCALE_CR[IClip(0, 51, pmq_QP + chroma_qp_offset)];

                index = IClip(0, 51, QP + BetaOffset);
                Beta[1] = (Ipp8u) (BETA_TABLE[index]);

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

                // create clipping values
                Clipping[4] = (Ipp8u) (pClipTab[pStrength[8]]);
                Clipping[5] = (Ipp8u) (pClipTab[pStrength[9]]);
                Clipping[6] = (Ipp8u) (pClipTab[pStrength[10]]);
                Clipping[7] = (Ipp8u) (pClipTab[pStrength[11]]);
            }

            if (pParams->bitDepthChroma > 8)
            {
                IppDeblocking16u[2 + dir]((Ipp16u*)pParams->pChroma[nPlane],
                                          pic_pitch,
                                          Alpha,
                                          Beta,
                                          Clipping,
                                          pStrength,
                                          pParams->bitDepthChroma);
            }
            else
            {
                IppDeblocking[2 + dir](pParams->pChroma[nPlane],
                                       pic_pitch,
                                       Alpha,
                                       Beta,
                                       Clipping,
                                       pStrength,
                                       pParams->bitDepthChroma);
            }
        }
    }

} // void H264SegmentDecoder::DeblockChroma420(Ipp32u dir, DeblockingParameters *pParams)

void H264SegmentDecoder::DeblockChroma422(Ipp32u dir, DeblockingParameters *pParams)
{
    if (pParams->DeblockingFlag[dir])
    {
        Ipp32s pic_pitch = pParams->pitch_chroma;
        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;
        Ipp8u *pClipTab;
        Ipp32s QP;
        Ipp32s index;
        Ipp8u *pStrength = pParams->Strength[dir];
        Ipp32s nPlane;
        Ipp32s chroma_qp_offset = ~(m_pPicParamSet->chroma_qp_index_offset[0]);

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

                if (pParams->ExternalEdgeFlag[dir])
                {
                    Ipp32s pmp_QP;

                    // get left block QP
                    pmp_QP = m_mbinfo.mbs[pParams->nNeighbour[dir]].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;

                    index = IClip(0, 51, QP + BetaOffset);
                    Beta[0] = (Ipp8u) (BETA_TABLE[index]);

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

                    // create clipping values
                    Clipping[0] = (Ipp8u) (pClipTab[pStrength[0]]);
                    Clipping[1] = (Ipp8u) (pClipTab[pStrength[1]]);
                    Clipping[2] = (Ipp8u) (pClipTab[pStrength[2]]);
                    Clipping[3] = (Ipp8u) (pClipTab[pStrength[3]]);

                }

                // internal edge variables
                QP = QP_SCALE_CR[IClip(0, 51, pmq_QP + chroma_qp_offset)];

                index = IClip(0, 51, QP + BetaOffset);
                Beta[1] = (Ipp8u) (BETA_TABLE[index]);

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

                if (HORIZONTAL_DEBLOCKING == dir)
                {
                    // create clipping values
                    Clipping[4] = (Ipp8u) (pClipTab[pStrength[4]]);
                    Clipping[5] = (Ipp8u) (pClipTab[pStrength[5]]);
                    Clipping[6] = (Ipp8u) (pClipTab[pStrength[6]]);
                    Clipping[7] = (Ipp8u) (pClipTab[pStrength[7]]);
                    Clipping[8] = (Ipp8u) (pClipTab[pStrength[8]]);
                    Clipping[9] = (Ipp8u) (pClipTab[pStrength[9]]);
                    Clipping[10] = (Ipp8u) (pClipTab[pStrength[10]]);
                    Clipping[11] = (Ipp8u) (pClipTab[pStrength[11]]);
                    Clipping[12] = (Ipp8u) (pClipTab[pStrength[12]]);
                    Clipping[13] = (Ipp8u) (pClipTab[pStrength[13]]);
                    Clipping[14] = (Ipp8u) (pClipTab[pStrength[14]]);
                    Clipping[15] = (Ipp8u) (pClipTab[pStrength[15]]);
                }
                else
                {
                    // create clipping values
                    Clipping[4] = (Ipp8u) (pClipTab[pStrength[8]]);
                    Clipping[5] = (Ipp8u) (pClipTab[pStrength[9]]);
                    Clipping[6] = (Ipp8u) (pClipTab[pStrength[10]]);
                    Clipping[7] = (Ipp8u) (pClipTab[pStrength[11]]);
                }
            }

            if (pParams->bitDepthChroma > 8)
            {
                IppDeblocking16u[4 + dir]((Ipp16u*)pParams->pChroma[nPlane],
                                          pic_pitch,
                                          Alpha,
                                          Beta,
                                          Clipping,
                                          pStrength,
                                          pParams->bitDepthChroma);
            }
            else
            {
                IppDeblocking[4 + dir](pParams->pChroma[nPlane],
                                       pic_pitch,
                                       Alpha,
                                       Beta,
                                       Clipping,
                                       pStrength,
                                       pParams->bitDepthChroma);
            }

        }
    }

} // void H264SegmentDecoder::DeblockChroma422(Ipp32u dir, DeblockingParameters *pParams)

void H264SegmentDecoder::DeblockChroma444(Ipp32u dir, DeblockingParameters *pParams)
{
    if (pParams->DeblockingFlag[dir])
    {
        Ipp32s pic_pitch = pParams->pitch_chroma;
        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;
        Ipp8u *pClipTab;
        Ipp32s QP;
        Ipp32s index;
        Ipp8u *pStrength = pParams->Strength[dir];
        Ipp32s nPlane;
        Ipp32s chroma_qp_offset = ~(m_pPicParamSet->chroma_qp_index_offset[0]);

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

                if (pParams->ExternalEdgeFlag[dir])
                {
                    Ipp32s pmp_QP;

                    // get left block QP
                    pmp_QP = m_mbinfo.mbs[pParams->nNeighbour[dir]].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;

                    index = IClip(0, 51, QP + BetaOffset);
                    Beta[0] = (Ipp8u) (BETA_TABLE[index]);

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

                    // create clipping values
                    Clipping[0] = (Ipp8u) (pClipTab[pStrength[0]]);
                    Clipping[1] = (Ipp8u) (pClipTab[pStrength[1]]);
                    Clipping[2] = (Ipp8u) (pClipTab[pStrength[2]]);
                    Clipping[3] = (Ipp8u) (pClipTab[pStrength[3]]);

                }

                // internal edge variables
                QP = QP_SCALE_CR[IClip(0, 51, pmq_QP + chroma_qp_offset)];

                index = IClip(0, 51, QP + BetaOffset);
                Beta[1] = (Ipp8u) (BETA_TABLE[index]);

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

                // create clipping values
                Clipping[4] = (Ipp8u) (pClipTab[pStrength[4]]);
                Clipping[5] = (Ipp8u) (pClipTab[pStrength[5]]);
                Clipping[6] = (Ipp8u) (pClipTab[pStrength[6]]);
                Clipping[7] = (Ipp8u) (pClipTab[pStrength[7]]);
                Clipping[8] = (Ipp8u) (pClipTab[pStrength[8]]);
                Clipping[9] = (Ipp8u) (pClipTab[pStrength[9]]);
                Clipping[10] = (Ipp8u) (pClipTab[pStrength[10]]);
                Clipping[11] = (Ipp8u) (pClipTab[pStrength[11]]);
                Clipping[12] = (Ipp8u) (pClipTab[pStrength[12]]);
                Clipping[13] = (Ipp8u) (pClipTab[pStrength[13]]);
                Clipping[14] = (Ipp8u) (pClipTab[pStrength[14]]);
                Clipping[15] = (Ipp8u) (pClipTab[pStrength[15]]);
            }

            if (pParams->bitDepthChroma > 8)
            {
                IppDeblocking16u[6 + dir]((Ipp16u*)pParams->pChroma[nPlane],
                                          pic_pitch,
                                          Alpha,
                                          Beta,
                                          Clipping,
                                          pStrength,
                                          pParams->bitDepthChroma);
            }
            else
            {

                IppDeblocking[6 + dir](pParams->pChroma[nPlane],
                                       pic_pitch,
                                       Alpha,
                                       Beta,
                                       Clipping,
                                       pStrength,
                                       pParams->bitDepthChroma);
            }
        }
    }

} // void H264SegmentDecoder::DeblockChroma444(Ipp32u dir, DeblockingParameters *pParams)

void H264SegmentDecoder::ResetDeblockingVariables(DeblockingParameters *pParams)
{
    PlanePtrYCommon pY;
    PlaneUVCommon *pU, *pV;
    Ipp32s offset;
    Ipp32s MBYAdjust = 0;
    Ipp32s mbXOffset, mbYOffset;
    Ipp32s pitch_luma = m_pCurrentFrame->pitch_luma();
    Ipp32s pitch_chroma = m_pCurrentFrame->pitch_chroma();
    Ipp32s MBAddr = pParams->nMBAddr;
    Ipp32s nCurrMB_X, nCurrMB_Y;
    const H264SliceHeader *pHeader;

    // load slice header
    pHeader = (m_bFrameDeblocking) ?
              (m_pCurrentFrame->GetAU(m_field_index)->GetSliceByNumber(m_gmbinfo->mbs[MBAddr].slice_id)->GetSliceHeader()) :
              (m_pSliceHeader);

    pParams->bitDepthLuma   = (Ipp8u)bit_depth_luma;
    pParams->bitDepthChroma = (Ipp8u)bit_depth_chroma;

    // load planes
    pY = m_pCurrentFrame->m_pYPlane;
    pU = m_pCurrentFrame->m_pUPlane;
    pV = m_pCurrentFrame->m_pVPlane;

    Ipp32s pixel_luma_sz    = pParams->bitDepthLuma > 8 ? 2 : 1;
    Ipp32s pixel_chroma_sz  = pParams->bitDepthChroma > 8 ? 2 : 1;

    if (FRM_STRUCTURE > m_pCurrentFrame->m_PictureStructureForDec)
    {
        if (m_field_index)
        {
            pY += pitch_luma*pixel_luma_sz;
            pU += pitch_chroma*pixel_chroma_sz;
            pV += pitch_chroma*pixel_chroma_sz;
        }

        if (m_field_index)
            MBYAdjust = mb_height / 2;

        pitch_luma *= 2;
        pitch_chroma *= 2;
    }

    // prepare macroblock variables
    nCurrMB_X = (MBAddr % mb_width);
    nCurrMB_Y = (MBAddr / mb_width)- MBYAdjust;
    mbXOffset = nCurrMB_X * 16;
    mbYOffset = nCurrMB_Y * 16;

    // calc plane's offsets
    offset = mbXOffset + (mbYOffset * pitch_luma);
    pY += offset*pixel_luma_sz;

    switch (m_pCurrentFrame->m_chroma_format)
    {
    case CHROMA_FORMAT_420: // YUV420
        offset = (mbXOffset + (mbYOffset * pitch_chroma)) >> 1;
        break;
    case CHROMA_FORMAT_422: // YUV422
        offset = (mbXOffset >> 1) + (mbYOffset * pitch_chroma);
        break;
    case CHROMA_FORMAT_400: // YUV400
        offset = 0;
    case CHROMA_FORMAT_444: // YUV444
        break;
    default:
        VM_ASSERT(false);
        break;
    }

    pU += offset*pixel_chroma_sz;
    pV += offset*pixel_chroma_sz;

    // set external edge variables
    pParams->ExternalEdgeFlag[VERTICAL_DEBLOCKING] = (nCurrMB_X != 0);
    pParams->ExternalEdgeFlag[HORIZONTAL_DEBLOCKING] = (nCurrMB_Y != 0);

    if (DEBLOCK_FILTER_ON_NO_SLICE_EDGES == pHeader->disable_deblocking_filter_idc)
    {
        // don't filter at slice boundaries
        if (nCurrMB_X)
        {
            if (m_gmbinfo->mbs[MBAddr].slice_id !=
                m_gmbinfo->mbs[MBAddr - 1].slice_id)
                pParams->ExternalEdgeFlag[VERTICAL_DEBLOCKING] = 0;
        }

        if (nCurrMB_Y)
        {
            if (m_gmbinfo->mbs[MBAddr].slice_id !=
                m_gmbinfo->mbs[MBAddr - mb_width].slice_id)
                pParams->ExternalEdgeFlag[HORIZONTAL_DEBLOCKING] = 0;
        }
    }

    // reset external edges strength
    SetEdgeStrength(pParams->Strength[VERTICAL_DEBLOCKING], 0);
    SetEdgeStrength(pParams->Strength[HORIZONTAL_DEBLOCKING], 0);

    // set neighbour addreses
    pParams->nNeighbour[VERTICAL_DEBLOCKING] = MBAddr - 1;
    pParams->nNeighbour[HORIZONTAL_DEBLOCKING] = MBAddr - mb_width;

    // set deblocking flag(s)
    pParams->DeblockingFlag[VERTICAL_DEBLOCKING] = 0;
    pParams->DeblockingFlag[HORIZONTAL_DEBLOCKING] = 0;

    // save variables
    pParams->pLuma = pY;
    pParams->pChroma[0] = pU;
    pParams->pChroma[1] = pV;
    pParams->pitch_luma = pitch_luma;
    pParams->pitch_chroma = pitch_chroma;
    pParams->nMaxMVector = (FRM_STRUCTURE > m_pCurrentFrame->m_PictureStructureForDec) ? (2) : (4);
    pParams->MBFieldCoded = (FRM_STRUCTURE > m_pCurrentFrame->m_PictureStructureForDec);

    // set slice's variables
    pParams->nAlphaC0Offset = pHeader->slice_alpha_c0_offset;
    pParams->nBetaOffset = pHeader->slice_beta_offset;

} // void H264SegmentDecoder::ResetDeblockingVariables(DeblockingParameters *pParams)

} // namespace UMC
#endif // UMC_ENABLE_H264_VIDEO_DECODER

⌨️ 快捷键说明

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