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

📄 umc_h264_redual_decoder_templates.h

📁 audio-video-codecs.rar语音编解码器
💻 H
📖 第 1 页 / 共 5 页
字号:
        iVCLContext = sd->GetBlocksLumaContextLeft(y_pos, pNumCoeffsArray[(y_pos - 1) * 4]); \
        /* decode block coeffs */ \
        sd->m_pBitStream->GetCAVLCInfoLuma(iVCLContext, \
                                                    iMaxNum, \
                                                    iCoeffsNumber, \
                                                    (CoeffsPtr *) &sd->m_pCoeffBlocksWrite, \
                                                    bf); \
        /* update final CBP */ \
        uFinalCBP |= (iCoeffsNumber) ? (1 << (block_num + 1)) : (0); \
        /* update a num coeff storage for a prediction of future blocks */ \
        pNumCoeffsArray[(y_pos) * 4 + x_pos] = (Ipp8u) iCoeffsNumber; \
    }

#define DECODE_INTERNAL_LUMA_BLOCK_CAVLC(x_pos, y_pos, block_num) \
    { \
        Ipp16s iCoeffsNumber; \
        /*  to be honest, VLCContext is an average of coeffs numbers \
            of neighbouring blocks */ \
        Ipp32s iVCLContext; \
        iVCLContext = sd->GetBlocksLumaContextInternal(x_pos, y_pos, pNumCoeffsArray); \
        /* decode block coeffs */ \
        sd->m_pBitStream->GetCAVLCInfoLuma(iVCLContext, \
                                                    iMaxNum, \
                                                    iCoeffsNumber, \
                                                    (CoeffsPtr *) &sd->m_pCoeffBlocksWrite, \
                                                    bf); \
        /* update final CBP */ \
        uFinalCBP |= (iCoeffsNumber) ? (1 << (block_num + 1)) : (0); \
        /* update a num coeff storage for a prediction of future blocks */ \
        pNumCoeffsArray[(y_pos) * 4 + x_pos] = (Ipp8u) iCoeffsNumber; \
    }

#define DECODE_CHROMA_DC_BLOCK_CAVLC(component) \
    { \
        Ipp16s iCoeffsNumber; \
        /* decode chroma DC coefficients */ \
        switch (color_format) \
        { \
        case CHROMA_FORMAT_420: \
            sd->m_pBitStream->GetCAVLCInfoChroma0(iCoeffsNumber, \
                   (CoeffsPtr*) &sd->m_pCoeffBlocksWrite); \
            break; \
        case CHROMA_FORMAT_422: \
            sd->m_pBitStream->GetCAVLCInfoChroma2(iCoeffsNumber, \
                   (CoeffsPtr*) &sd->m_pCoeffBlocksWrite); \
            break; \
        case CHROMA_FORMAT_444: \
            sd->m_pBitStream->GetCAVLCInfoChroma4(iCoeffsNumber, \
                   (CoeffsPtr*) &sd->m_pCoeffBlocksWrite, 0); \
            break; \
        default: \
            iCoeffsNumber = 0; \
            VM_ASSERT(false); \
            throw h264_exception(UMC_ERR_INVALID_STREAM); \
        } \
        /* update final CBP */ \
        uFinalCBP[component] = (iCoeffsNumber) ? (1) : (0); \
    }

#define DECODE_EXTERNAL_CHROMA_BLOCK_CAVLC(x_pos, y_pos, block_num) \
    { \
        Ipp16s iCoeffsNumber; \
        /* to be honest, VLCContext is an average of coeffs numbers \
            of neighbouring blocks */ \
        Ipp32s iVLCContext; \
        switch (color_format) \
        { \
        case CHROMA_FORMAT_420: \
            iVLCContext = sd->GetBlocksChromaContextBMEHExternal(iComponent); \
            break; \
        case CHROMA_FORMAT_422: \
            iVLCContext = sd->GetBlocksChromaContextH2(x_pos, y_pos, iComponent); \
            break; \
        case CHROMA_FORMAT_444: \
            iVLCContext = sd->GetBlocksChromaContextH4(x_pos, y_pos, iComponent); \
            break; \
        default: \
            iVLCContext = 0; \
            VM_ASSERT(false); \
            throw h264_exception(UMC_ERR_INVALID_STREAM); \
        }; \
        /* decode chrominance coefficients */ \
        sd->m_pBitStream->GetCAVLCInfoLuma(iVLCContext, \
                                                    15, \
                                                    iCoeffsNumber, \
                                                    (CoeffsPtr*) &sd->m_pCoeffBlocksWrite, \
                                                    bf); \
        /* update final CBP */ \
        uFinalCBP[iComponent] |= (iCoeffsNumber) ? (1 << (block_num + 1)) : (0); \
        /* update a num coeff storage for a prediction of future blocks */ \
        pNumCoeffsArray[block_num] = (Ipp8u) iCoeffsNumber; \
    }

#define DECODE_TOP_CHROMA_BLOCK_CAVLC(x_pos, y_pos, block_num) \
    { \
        Ipp16s iCoeffsNumber; \
        /* to be honest, VLCContext is an average of coeffs numbers \
            of neighbouring blocks */ \
        Ipp32s iVLCContext; \
        switch (color_format) \
        { \
        case CHROMA_FORMAT_420: \
            iVLCContext = sd->GetBlocksChromaContextBMEHTop(x_pos, \
                                                            pNumCoeffsArray[0], \
                                                            iComponent); \
            break; \
        case CHROMA_FORMAT_422: \
            iVLCContext = sd->GetBlocksChromaContextH2(x_pos, y_pos, iComponent); \
            break; \
        case CHROMA_FORMAT_444: \
            iVLCContext = sd->GetBlocksChromaContextH4(x_pos, y_pos, iComponent); \
            break; \
        default: \
            iVLCContext = 0; \
            VM_ASSERT(false); \
            throw h264_exception(UMC_ERR_INVALID_STREAM);   \
        }; \
        /* decode chrominance coefficients */ \
        sd->m_pBitStream->GetCAVLCInfoLuma(iVLCContext, \
                                                    15, \
                                                    iCoeffsNumber, \
                                                    (CoeffsPtr*) &sd->m_pCoeffBlocksWrite, \
                                                    bf); \
        /* update final CBP */ \
        uFinalCBP[iComponent] |= (iCoeffsNumber) ? (1 << (block_num + 1)) : (0); \
        /* update a num coeff storage for a prediction of future blocks */ \
        pNumCoeffsArray[block_num] = (Ipp8u) iCoeffsNumber; \
    }

#define DECODE_LEFT_CHROMA_BLOCK_CAVLC(x_pos, y_pos, block_num) \
    { \
        Ipp16s iCoeffsNumber; \
        /* to be honest, VLCContext is an average of coeffs numbers \
            of neighbouring blocks */ \
        Ipp32s iVLCContext; \
        switch (color_format) \
        { \
        case CHROMA_FORMAT_420: \
            iVLCContext = sd->GetBlocksChromaContextBMEHLeft(y_pos, \
                                                             pNumCoeffsArray[0], \
                                                             iComponent); \
            break; \
        case CHROMA_FORMAT_422: \
            iVLCContext = sd->GetBlocksChromaContextH2(x_pos, y_pos, iComponent); \
            break; \
        case CHROMA_FORMAT_444: \
            iVLCContext = sd->GetBlocksChromaContextH4(x_pos, y_pos, iComponent); \
            break; \
        default: \
            iVLCContext = 0; \
            VM_ASSERT(false); \
            throw h264_exception(UMC_ERR_INVALID_STREAM);   \
        }; \
        /* decode chrominance coefficients */ \
        sd->m_pBitStream->GetCAVLCInfoLuma(iVLCContext, \
                                                    15, \
                                                    iCoeffsNumber, \
                                                    (CoeffsPtr*) &sd->m_pCoeffBlocksWrite, \
                                                    bf); \
        /* update final CBP */ \
        uFinalCBP[iComponent] |= (iCoeffsNumber) ? (1 << (block_num + 1)) : (0); \
        /* update a num coeff storage for a prediction of future blocks */ \
        pNumCoeffsArray[block_num] = (Ipp8u) iCoeffsNumber; \
    }

#define DECODE_INTERNAL_CHROMA_BLOCK_CAVLC(x_pos, y_pos, block_num) \
    { \
        Ipp16s iCoeffsNumber; \
        /* to be honest, VLCContext is an average of coeffs numbers \
            of neighbouring blocks */ \
        Ipp32s iVLCContext; \
        switch (color_format) \
        { \
        case CHROMA_FORMAT_420: \
            iVLCContext = sd->GetBlocksChromaContextBMEHInternal(x_pos, \
                                                                 y_pos, \
                                                                 pNumCoeffsArray); \
            break; \
        case CHROMA_FORMAT_422: \
            iVLCContext = sd->GetBlocksChromaContextH2(x_pos, y_pos, iComponent); \
            break; \
        case CHROMA_FORMAT_444: \
            iVLCContext = sd->GetBlocksChromaContextH4(x_pos, y_pos, iComponent); \
            break; \
        default: \
            iVLCContext = 0; \
            VM_ASSERT(false); \
            throw h264_exception(UMC_ERR_INVALID_STREAM);   \
        }; \
        /* decode chrominance coefficients */ \
        sd->m_pBitStream->GetCAVLCInfoLuma(iVLCContext, \
                                                    15, \
                                                    iCoeffsNumber, \
                                                    (CoeffsPtr*) &sd->m_pCoeffBlocksWrite, \
                                                    bf); \
        /* update final CBP */ \
        uFinalCBP[iComponent] |= (iCoeffsNumber) ? (1 << (block_num + 1)) : (0); \
        /* update a num coeff storage for a prediction of future blocks */ \
        pNumCoeffsArray[block_num] = (Ipp8u) iCoeffsNumber; \
    }

    void DecodeCoefficients16x16_CAVLC(H264SegmentDecoderMultiThreaded * sd)
    {
        Ipp32u iDCCBP = 0;

        // set field flag
        Ipp32s field_flag = (pGetMBFieldDecodingFlag(sd->m_cur_mb.GlobalMacroblockInfo) || is_field) ? 1 : 0;

        // decode luma DC block
        {
            Ipp16s sNumCoeff;
            Ipp32u uNC = 0;

            uNC = sd->GetDCBlocksLumaContext();
            sd->m_pBitStream->GetCAVLCInfoLuma(uNC,
                                    16,
                                    sNumCoeff,
                                    (CoeffsPtr *)&sd->m_pCoeffBlocksWrite,
                                    field_flag);

            if (sNumCoeff)
                iDCCBP = D_CBP_LUMA_DC;
        }

        DecodeCoefficients4x4_CAVLC(sd, 15);

        // save final CBP
        sd->m_cur_mb.LocalMacroblockInfo->cbp4x4_luma |= iDCCBP;
    } // void DecodeCoefficients16x16_CAVLC(H264SegmentDecoderMultiThreaded * sd)

    void DecodeCoefficients4x4_CAVLC(H264SegmentDecoderMultiThreaded * sd,
                                       Ipp32s iMaxNum = 16)
    {
        Ipp32s bFieldDecodeFlag = pGetMBFieldDecodingFlag(sd->m_cur_mb.GlobalMacroblockInfo);
        Ipp32s bf = sd->m_pCurrentFrame->m_PictureStructureForDec<FRM_STRUCTURE || bFieldDecodeFlag;
        Ipp32u cbp = sd->m_cur_mb.LocalMacroblockInfo->cbp;

        //
        // decode luminance blocks
        //
        {
            Ipp32u uFinalCBP;
            Ipp8u *pNumCoeffsArray = sd->m_cur_mb.MacroblockCoeffsInfo->numCoeff;

            uFinalCBP = 0;
            if (cbp & LUMA_BLOCK_8X8_0)
            {
                DECODE_EXTERNAL_LUMA_BLOCK_CAVLC(0, 0, 0)
                DECODE_TOP_LUMA_BLOCK_CAVLC(1, 0, 1)
                DECODE_LEFT_LUMA_BLOCK_CAVLC(0, 1, 2)
                DECODE_INTERNAL_LUMA_BLOCK_CAVLC(1, 1, 3)
            }
            else
            {
                SET_TO_ZERO_COEFFS_NUMBER(0, 0)
            }

            if (cbp & LUMA_BLOCK_8X8_1)
            {
                DECODE_TOP_LUMA_BLOCK_CAVLC(2, 0, 4)
                DECODE_TOP_LUMA_BLOCK_CAVLC(3, 0, 5)
                DECODE_INTERNAL_LUMA_BLOCK_CAVLC(2, 1, 6)
                DECODE_INTERNAL_LUMA_BLOCK_CAVLC(3, 1, 7)
            }
            else
            {
                SET_TO_ZERO_COEFFS_NUMBER(2, 0)
            }

            if (cbp & LUMA_BLOCK_8X8_2)
            {
                DECODE_LEFT_LUMA_BLOCK_CAVLC(0, 2, 8)
                DECODE_INTERNAL_LUMA_BLOCK_CAVLC(1, 2, 9)
                DECODE_LEFT_LUMA_BLOCK_CAVLC(0, 3, 10)
                DECODE_INTERNAL_LUMA_BLOCK_CAVLC(1, 3, 11)
            }
            else
            {
                SET_TO_ZERO_COEFFS_NUMBER(0, 2)
            }

            if (cbp & LUMA_BLOCK_8X8_3)
            {
                DECODE_INTERNAL_LUMA_BLOCK_CAVLC(2, 2, 12)
                DECODE_INTERNAL_LUMA_BLOCK_CAVLC(3, 2, 13)
                DECODE_INTERNAL_LUMA_BLOCK_CAVLC(2, 3, 14)
                DECODE_INTERNAL_LUMA_BLOCK_CAVLC(3, 3, 15)
            }
            else
            {
                SET_TO_ZERO_COEFFS_NUMBER(2, 2)
            }

            // save final CBP
            sd->m_cur_mb.LocalMacroblockInfo->cbp4x4_luma = uFinalCBP;
        }

        //
        // decode chrominance blocks
        //

        if (cbp & CHROMA_DC_AC_BLOCKS)
        {
            Ipp32u uFinalCBP[2];

            // decode DC blocks
            DECODE_CHROMA_DC_BLOCK_CAVLC(0)
            DECODE_CHROMA_DC_BLOCK_CAVLC(1)

            if (cbp & CHROMA_AC_BLOCKS)
            {
                Ipp32s iComponent;

                for (iComponent = 0; iComponent < 2; iComponent += 1)
                {
                    Ipp8u *pNumCoeffsArray = sd->m_cur_mb.MacroblockCoeffsInfo->numCoeff;

                    switch (color_format)
                    {
                    case CHROMA_FORMAT_420:
                        pNumCoeffsArray += iComponent * 4 + 16;

                        DECODE_EXTERNAL_CHROMA_BLOCK_CAVLC(0, 0, 0)
                        DECODE_TOP_CHROMA_BLOCK_CAVLC(1, 0, 1)
                        DECODE_LEFT_CHROMA_BLOCK_CAVLC(0, 1, 2)

⌨️ 快捷键说明

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