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

📄 umc_h264_segment_decoder_templates.h

📁 audio-video-codecs.rar语音编解码器
💻 H
📖 第 1 页 / 共 5 页
字号:
            sd->m_QuantPrev = sd->m_cur_mb.LocalMacroblockInfo->QP;

            // Now, decode the coefficients
            if (is_high_profile && pGetMB8x8TSFlag(sd->m_cur_mb.GlobalMacroblockInfo))
                this->DecodeCoefficients8x8_CABAC(sd);
            else
                this->DecodeCoefficients4x4_CABAC(sd);
        }
    } // void DecodeMacroblock_P_CABAC(H264SegmentDecoderMultiThreaded *sd)

    void DecodeMacroblock_B_CABAC(H264SegmentDecoderMultiThreaded *sd)
    {
        bool noSubMbPartSizeLessThan8x8Flag;

        if (is_high_profile)
            noSubMbPartSizeLessThan8x8Flag = false;

        Ipp8u mbtype = sd->m_cur_mb.GlobalMacroblockInfo->mbtype;

        if (is_high_profile)
        {
            if ((MBTYPE_INTER_8x8 == mbtype) || (MBTYPE_DIRECT == mbtype))
            {
                Ipp32s sum_partnum =
                    SbPartNumMinus1[sd->m_IsUseDirect8x8Inference][sd->m_cur_mb.GlobalMacroblockInfo->sbtype[0]]+
                    SbPartNumMinus1[sd->m_IsUseDirect8x8Inference][sd->m_cur_mb.GlobalMacroblockInfo->sbtype[1]]+
                    SbPartNumMinus1[sd->m_IsUseDirect8x8Inference][sd->m_cur_mb.GlobalMacroblockInfo->sbtype[2]]+
                    SbPartNumMinus1[sd->m_IsUseDirect8x8Inference][sd->m_cur_mb.GlobalMacroblockInfo->sbtype[3]];

                if (sum_partnum==0)
                    noSubMbPartSizeLessThan8x8Flag = true;
            }
            else
                noSubMbPartSizeLessThan8x8Flag = true;
        }

        if (mbtype != MBTYPE_DIRECT)
        {
            // Motion Vector Computation
            if (mbtype == MBTYPE_INTER_8x8)
            {
                // First, if B slice and MB is 8x8, set the MV for any DIRECT
                // 8x8 partitions. The MV for the 8x8 DIRECT partition need to
                // be properly set before the MV for subsequent 8x8 partitions
                // can be computed, due to prediction. The DIRECT MV are computed
                // by a separate function and do not depend upon block neighbors for
                // predictors, so it is done here first.
                if (sd->m_cur_mb.GlobalMacroblockInfo->sbtype[0] == SBTYPE_DIRECT ||
                    sd->m_cur_mb.GlobalMacroblockInfo->sbtype[1] == SBTYPE_DIRECT ||
                    sd->m_cur_mb.GlobalMacroblockInfo->sbtype[2] == SBTYPE_DIRECT ||
                    sd->m_cur_mb.GlobalMacroblockInfo->sbtype[3] == SBTYPE_DIRECT)
                {
                    sd->DecodeDirectMotionVectors(false);
                }
            }

            sd->DecodeMotionVectors_CABAC();
        }
        else
        {
            memset(sd->m_cur_mb.MVs[0 + MV_DELTAS_OFFSET], 0, sizeof(H264DecoderMacroblockMVs));
            memset(sd->m_cur_mb.MVs[1 + MV_DELTAS_OFFSET], 0, sizeof(H264DecoderMacroblockMVs));

            sd->DecodeDirectMotionVectors(true);
        }

        // cbp
        sd->m_cur_mb.LocalMacroblockInfo->cbp = (Ipp8u)sd->DecodeCBP_CABAC(color_format);

        if (0 == sd->m_cur_mb.LocalMacroblockInfo->cbp)
        {
            sd->m_cur_mb.LocalMacroblockInfo->cbp4x4_luma = 0;
            sd->m_cur_mb.LocalMacroblockInfo->cbp4x4_chroma[0] = 0;
            sd->m_cur_mb.LocalMacroblockInfo->cbp4x4_chroma[1] = 0;
            sd->m_prev_dquant = 0;
        }
        else
        { // // delta QP

            if (is_high_profile && noSubMbPartSizeLessThan8x8Flag && sd->m_cur_mb.LocalMacroblockInfo->cbp&15)
            {
                Ipp8u transform_size_8x8_mode_flag = 0;
                if (sd->m_pPicParamSet->transform_8x8_mode_flag)
                {
                    Ipp32u ctxIdxInc;
                    Ipp32s left_inc = sd->m_cur_mb.CurrentBlockNeighbours.mbs_left[0].mb_num>=0?
                        GetMB8x8TSFlag(sd->m_gmbinfo->mbs[sd->m_cur_mb.CurrentBlockNeighbours.mbs_left[0].mb_num]):0;
                    Ipp32s top_inc = sd->m_cur_mb.CurrentBlockNeighbours.mb_above.mb_num>=0?
                        GetMB8x8TSFlag(sd->m_gmbinfo->mbs[sd->m_cur_mb.CurrentBlockNeighbours.mb_above.mb_num]):0;
                    ctxIdxInc = top_inc+left_inc;
                    transform_size_8x8_mode_flag  = (Ipp8u) sd->m_pBitStream->DecodeSingleBin_CABAC(ctxIdxOffset[TRANSFORM_SIZE_8X8_FLAG] + ctxIdxInc);
                    pSetMB8x8TSFlag(sd->m_cur_mb.GlobalMacroblockInfo,transform_size_8x8_mode_flag);
                }
            }

            // decode delta for quant value
            {
                sd->DecodeMBQPDelta_CABAC();
                sd->m_QuantPrev = sd->m_cur_mb.LocalMacroblockInfo->QP;
            }

            // Now, decode the coefficients
            if (is_high_profile && pGetMB8x8TSFlag(sd->m_cur_mb.GlobalMacroblockInfo))
                this->DecodeCoefficients8x8_CABAC(sd);
            else
                this->DecodeCoefficients4x4_CABAC(sd);
        }
    } // void DecodeMacroblock_B_CABAC(H264SegmentDecoderMultiThreaded *sd)


    void DecodeMacroblock_I_CAVLC(H264SegmentDecoderMultiThreaded *sd)
    {
        bool noSubMbPartSizeLessThan8x8Flag;

        // Reset buffer pointers to start
        // This works only as long as "batch size" for VLD and reconstruct
        // is th same. When/if want to make them different, need to change this.
        IntraType * pMBIntraTypes = sd->m_pMBIntraTypes + sd->m_CurMBAddr*NUM_INTRA_TYPE_ELEMENTS;

        // First decode the "macroblock header", e.g., macroblock type,
        // intra-coding types, motion vectors and CBP.

        // Get MB type, possibly change MBSKipCount to non-zero
        if (is_high_profile)
            noSubMbPartSizeLessThan8x8Flag = false;

        Ipp8u mbtype = sd->m_cur_mb.GlobalMacroblockInfo->mbtype;

        if (mbtype == MBTYPE_INTRA)
        {
            Ipp8u transform_size_8x8_mode_flag = 0;
            if (is_high_profile)
            {
                if (sd->m_pPicParamSet->transform_8x8_mode_flag)
                {
                    transform_size_8x8_mode_flag  = (Ipp8u) sd->m_pBitStream->Get1Bit();
                    pSetMB8x8TSFlag(sd->m_cur_mb.GlobalMacroblockInfo,transform_size_8x8_mode_flag);
                }
            }

            if (transform_size_8x8_mode_flag)
                sd->DecodeIntraTypes8x8_CAVLC(pMBIntraTypes, sd->m_IsUseConstrainedIntra);
            else
                sd->DecodeIntraTypes4x4_CAVLC(pMBIntraTypes, sd->m_IsUseConstrainedIntra);
        }
        else
        {
            pMBIntraTypes[0] =
            pMBIntraTypes[1] =
            pMBIntraTypes[2] =
            pMBIntraTypes[3] = (sd->original_mb_type) & 0x03;
        }

        if (color_format)
        {
            // Get chroma prediction mode
            sd->m_cur_mb.LocalMacroblockInfo->IntraTypes.intra_chroma_mode = (Ipp8u) sd->m_pBitStream->GetVLCElement(false);
            if (sd->m_cur_mb.LocalMacroblockInfo->IntraTypes.intra_chroma_mode > 3)
                throw h264_exception(UMC_ERR_INVALID_STREAM);
        }

        sd->DecodeEdgeType();

        // cbp
        if (mbtype != MBTYPE_INTRA_16x16)
        {
            sd->m_cur_mb.LocalMacroblockInfo->cbp = (Ipp8u) sd->DecodeCBP_CAVLC(color_format);

            if (0 == sd->m_cur_mb.LocalMacroblockInfo->cbp)
            {
                sd->m_cur_mb.LocalMacroblockInfo->cbp4x4_luma = 0;
                sd->m_cur_mb.LocalMacroblockInfo->cbp4x4_chroma[0] = 0;
                sd->m_cur_mb.LocalMacroblockInfo->cbp4x4_chroma[1] = 0;
                sd->m_prev_dquant = 0;
            }
        }

        if ((sd->m_cur_mb.LocalMacroblockInfo->cbp) ||
            (mbtype == MBTYPE_INTRA_16x16))
        {
            if (is_high_profile && noSubMbPartSizeLessThan8x8Flag && sd->m_cur_mb.LocalMacroblockInfo->cbp&15)
            {
                Ipp8u transform_size_8x8_mode_flag = 0;
                if (sd->m_pPicParamSet->transform_8x8_mode_flag)
                {
                    transform_size_8x8_mode_flag  = (Ipp8u) sd->m_pBitStream->Get1Bit();
                    pSetMB8x8TSFlag(sd->m_cur_mb.GlobalMacroblockInfo, transform_size_8x8_mode_flag);
                }
            }

            // decode delta for quant value
            if (!sd->m_pBitStream->NextBit())
            {
                sd->DecodeMBQPDelta_CAVLC();
                sd->m_QuantPrev = sd->m_cur_mb.LocalMacroblockInfo->QP;
            }

            // Now, decode the coefficients
            if (MBTYPE_INTRA_16x16 != mbtype)
            {
                if (is_high_profile && pGetMB8x8TSFlag(sd->m_cur_mb.GlobalMacroblockInfo))
                    this->DecodeCoefficients8x8_CAVLC(sd);
                else
                    this->DecodeCoefficients4x4_CAVLC(sd);
            }
            else
                this->DecodeCoefficients16x16_CAVLC(sd);
        }
    } // void DecodeMacroblock_I_CAVLC(H264SegmentDecoderMultiThreaded *sd)

    void DecodeMacroblock_P_CAVLC(H264SegmentDecoderMultiThreaded *sd)
    {
        bool noSubMbPartSizeLessThan8x8Flag;

        // Get MB type, possibly change MBSKipCount to non-zero
        if (is_high_profile)
            noSubMbPartSizeLessThan8x8Flag = false;

        Ipp8u mbtype = sd->m_cur_mb.GlobalMacroblockInfo->mbtype;

        if (is_high_profile)
        {
            if (mbtype==MBTYPE_INTER_8x8 || mbtype==MBTYPE_INTER_8x8_REF0)
            {
                Ipp32s sum_partnum =
                    SbPartNumMinus1[sd->m_IsUseDirect8x8Inference][sd->m_cur_mb.GlobalMacroblockInfo->sbtype[0]]+
                    SbPartNumMinus1[sd->m_IsUseDirect8x8Inference][sd->m_cur_mb.GlobalMacroblockInfo->sbtype[1]]+
                    SbPartNumMinus1[sd->m_IsUseDirect8x8Inference][sd->m_cur_mb.GlobalMacroblockInfo->sbtype[2]]+
                    SbPartNumMinus1[sd->m_IsUseDirect8x8Inference][sd->m_cur_mb.GlobalMacroblockInfo->sbtype[3]];

                if (sum_partnum == 0)
                    noSubMbPartSizeLessThan8x8Flag = true;
            }
            else
                noSubMbPartSizeLessThan8x8Flag = true;
        }

        // MV and Ref Index
        sd->DecodeMotionVectorsPSlice_CAVLC();
        //sd->ReconstructMotionVectors();

        // cbp
        sd->m_cur_mb.LocalMacroblockInfo->cbp = (Ipp8u) sd->DecodeCBP_CAVLC(color_format);

        if (0 == sd->m_cur_mb.LocalMacroblockInfo->cbp)
        {
            sd->m_cur_mb.LocalMacroblockInfo->cbp4x4_luma = 0;
            sd->m_cur_mb.LocalMacroblockInfo->cbp4x4_chroma[0] = 0;
            sd->m_cur_mb.LocalMacroblockInfo->cbp4x4_chroma[1] = 0;
            sd->m_prev_dquant = 0;
        }
        else
        {
            if (is_high_profile && noSubMbPartSizeLessThan8x8Flag && sd->m_cur_mb.LocalMacroblockInfo->cbp&15)
            {
                Ipp8u transform_size_8x8_mode_flag = 0;
                if (sd->m_pPicParamSet->transform_8x8_mode_flag)
                {
                    transform_size_8x8_mode_flag  = (Ipp8u) sd->m_pBitStream->Get1Bit();
                    pSetMB8x8TSFlag(sd->m_cur_mb.GlobalMacroblockInfo, transform_size_8x8_mode_flag);
                }
            }

            // check for usual case of zero QP delta
            if (!sd->m_pBitStream->NextBit())
            {
                sd->DecodeMBQPDelta_CAVLC();
                sd->m_QuantPrev = sd->m_cur_mb.LocalMacroblockInfo->QP;
            }

            // Now, decode the coefficients
            if (is_high_profile && pGetMB8x8TSFlag(sd->m_cur_mb.GlobalMacroblockInfo))
                this->DecodeCoefficients8x8_CAVLC(sd);
            else
                this->DecodeCoefficients4x4_CAVLC(sd);
        }
    } // void DecodeMacroblock_P_CAVLC(H264SegmentDecoderMultiThreaded *sd)

    void DecodeMacroblock_B_CAVLC(H264SegmentDecoderMultiThreaded *sd)
    {
        bool noSubMbPartSizeLessThan8x8Flag;

        // Get MB type, possibly change MBSKipCount to non-zero
        if (is_high_profile)
            noSubMbPartSizeLessThan8x8Flag = false;

        Ipp8u mbtype = sd->m_cur_mb.GlobalMacroblockInfo->mbtype;

        if (is_high_profile)
        {
            if ((MBTYPE_INTER_8x8 == mbtype) ||
                (MBTYPE_DIRECT == mbtype))
            {
                Ipp32s sum_partnum =
                    SbPartNumMinus1[sd->m_IsUseDirect8x8Inference][sd->m_cur_mb.GlobalMacroblockInfo->sbtype[0]]+
                    SbPartNumMinus1[sd->m_IsUseDirect8x8Inference][sd->m_cur_mb.GlobalMacroblockInfo->sbtype[1]]+
                    SbPartNumMinus1[sd->m_IsUseDirect8x8Inference][sd->m_cur_mb.GlobalMacroblockInfo->sbtype[2]]+
                    SbPartNumMinus1[sd->m_IsUseDirect8x8Inference][sd->m_cur_mb.GlobalMacroblockInfo->sbtype[3]];

⌨️ 快捷键说明

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