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

📄 umc_h264_segment_decoder_templates.h

📁 audio-video-codecs.rar语音编解码器
💻 H
📖 第 1 页 / 共 5 页
字号:
        // decode macroblock having I type
        if (MBTYPE_PCM != sd->m_cur_mb.GlobalMacroblockInfo->mbtype)
            DecodeMacroblock_I_CABAC(sd);
        // macroblock has PCM type
        else
            DecodeMacroblock_PCM(sd);

    } // void DecodeMacroblock_ISlice_CABAC(H264SegmentDecoderMultiThreaded *sd)

    void DecodeMacroblock_PSlice_CABAC(H264SegmentDecoderMultiThreaded *sd)
    {
        Ipp32s iSkip;

        // reset macroblock info
        memset(sd->m_cur_mb.LocalMacroblockInfo, 0, sizeof(H264DecoderMacroblockLocalInfo));
        memset(sd->m_cur_mb.GlobalMacroblockInfo->sbtype, 0, sizeof(sd->m_cur_mb.GlobalMacroblockInfo->sbtype));
        sd->m_cur_mb.LocalMacroblockInfo->QP = (Ipp8s) sd->m_QuantPrev;
        sd->m_cur_mb.GlobalMacroblockInfo->slice_id = (Ipp16s) sd->m_pSlice->GetSliceNum();
        memset((void *) sd->m_cur_mb.RefIdxs[1], -1, sizeof(H264DecoderMacroblockRefIdxs));

        // decode skip flag
        // sometimes we have decoded the flag,
        // when we were doing decoding of the previous macroblock
        if ((!sd->m_isMBAFF) ||
            (0 == (sd->m_CurMBAddr & 1)) ||
            (!pGetMBSkippedFlag(sd->m_cur_mb.GlobalMacroblockPairInfo)))
            iSkip = sd->DecodeMBSkipFlag_CABAC(MB_SKIP_FLAG_P_SP);
        else
            iSkip = sd->m_iSkipNextMacroblock;

        if (iSkip)
        {
            // reset macroblock variables
            memset((void *) sd->m_cur_mb.RefIdxs[0], 0, sizeof(H264DecoderMacroblockRefIdxs));
            memset(sd->m_cur_mb.MVs[0 + MV_DELTAS_OFFSET], 0, sizeof(H264DecoderMacroblockMVs));
            sd->m_cur_mb.GlobalMacroblockInfo->mbtype = MBTYPE_SKIPPED;
            pSetMBSkippedFlag(sd->m_cur_mb.GlobalMacroblockInfo);
            sd->m_prev_dquant = 0;

            sd->m_iSkipNextMacroblock = 0;
            if (sd->m_isMBAFF)
            {
                // but we don't know the spatial structure of the current macroblock.
                // we need to decode next macroblock for obtaining the structure.
                if (0 == (sd->m_CurMBAddr & 1))
                {
                    sd->m_CurMBAddr += 1;
                    sd->m_CurMB_Y += 1;
                    // the next macroblock isn't skipped, obtain the structure
                    if (0 == sd->DecodeMBSkipFlag_CABAC(MB_SKIP_FLAG_P_SP))
                        sd->DecodeMBFieldDecodingFlag_CABAC();
                    // the next macroblock is skipped too
                    else
                        sd->m_iSkipNextMacroblock = 1;
                    sd->m_CurMBAddr -= 1;
                    sd->m_CurMB_Y -= 1;
                }
            }

            sd->UpdateNeighbouringAddresses();
            ColorSpecific<color_format, Coeffs, PlaneY, PlaneUV, is_field>::UpdateNeighbouringBlocks(sd);

            sd->ReconstructSkipMotionVectors();

            return;
        }
        else
            sd->m_iSkipNextMacroblock = 0;

        // decode macroblock field flag
        if (sd->m_isMBAFF)
        {
            if (0 == (sd->m_CurMBAddr & 1))
                sd->DecodeMBFieldDecodingFlag_CABAC();
        }
        else
            pSetMBFieldDecodingFlag(sd->m_cur_mb.GlobalMacroblockInfo, 0);

        // update neighbouring addresses
        sd->UpdateNeighbouringAddresses();
        // update neighbouring block positions
        ColorSpecific<color_format, Coeffs, PlaneY, PlaneUV, is_field>::UpdateNeighbouringBlocks(sd);

        // First decode the "macroblock header", e.g., macroblock type,
        // intra-coding types.
        sd->DecodeMBTypePSlice_CABAC();

        // decode macroblock having P type
        if (MBTYPE_PCM < sd->m_cur_mb.GlobalMacroblockInfo->mbtype)
        {
            DecodeMacroblock_P_CABAC(sd);
        }
        else
        {
            memset((void *) sd->m_cur_mb.RefIdxs[0], -1, sizeof(H264DecoderMacroblockRefIdxs));
            memset((void *) sd->m_cur_mb.MVs[0], 0, sizeof(H264DecoderMacroblockMVs));
            memset(sd->m_cur_mb.MVs[0 + MV_DELTAS_OFFSET], 0, sizeof(H264DecoderMacroblockMVs));

            // decode macroblock having I type
            if (MBTYPE_PCM > sd->m_cur_mb.GlobalMacroblockInfo->mbtype)
                DecodeMacroblock_I_CABAC(sd);
            // macroblock has PCM type
            else
                DecodeMacroblock_PCM(sd);
        }

    } // void DecodeMacroblock_PSlice_CABAC(H264SegmentDecoderMultiThreaded *sd)

    void DecodeMacroblock_BSlice_CABAC(H264SegmentDecoderMultiThreaded * sd)
    {
        Ipp32s iSkip;

        // reset macroblock info
        memset(sd->m_cur_mb.LocalMacroblockInfo, 0, sizeof(H264DecoderMacroblockLocalInfo));
        memset(sd->m_cur_mb.GlobalMacroblockInfo->sbtype, 0, sizeof(sd->m_cur_mb.GlobalMacroblockInfo->sbtype));
        sd->m_cur_mb.LocalMacroblockInfo->QP = (Ipp8s) sd->m_QuantPrev;
        sd->m_cur_mb.GlobalMacroblockInfo->slice_id = (Ipp16s) sd->m_pSlice->GetSliceNum();

        // decode skip flag
        // sometimes we have decoded the flag,
        // when we were doing decoding of the previous macroblock
        if ((!sd->m_isMBAFF) ||
            (0 == (sd->m_CurMBAddr & 1)) ||
            (!pGetMBSkippedFlag(sd->m_cur_mb.GlobalMacroblockPairInfo)))
            iSkip = sd->DecodeMBSkipFlag_CABAC(MB_SKIP_FLAG_B);
        else
            iSkip = sd->m_iSkipNextMacroblock;

        if (iSkip)
        {
            // reset macroblock variables
            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));
            // reset macroblock variables
            sd->m_cur_mb.GlobalMacroblockInfo->mbtype = MBTYPE_SKIPPED;
            pSetMBSkippedFlag(sd->m_cur_mb.GlobalMacroblockInfo);
            sd->m_prev_dquant = 0;

            sd->m_iSkipNextMacroblock = 0;
            if (sd->m_isMBAFF)
            {
                // but we don't know the spatial structure of the current macroblock.
                // we need to decode next macroblock for obtaining the structure.
                if (0 == (sd->m_CurMBAddr & 1))
                {
                    sd->m_CurMBAddr += 1;
                    sd->m_CurMB_Y += 1;
                    // the next macroblock isn't skipped, obtain the structure
                    if (0 == sd->DecodeMBSkipFlag_CABAC(MB_SKIP_FLAG_B))
                        sd->DecodeMBFieldDecodingFlag_CABAC();
                    // the next macroblock is skipped too
                    else
                        sd->m_iSkipNextMacroblock = 1;
                    sd->m_CurMBAddr -= 1;
                    sd->m_CurMB_Y -= 1;

                    sd->UpdateNeighbouringAddresses();
                }
            }
            else
            {
                if (sd->m_IsUseSpatialDirectMode)
                {
                    sd->UpdateNeighbouringAddresses();
                }
            }

            if (sd->m_IsUseSpatialDirectMode)
            {
                ColorSpecific<color_format, Coeffs, PlaneY, PlaneUV, is_field>::UpdateNeighbouringBlocks(sd);
            }

            sd->DecodeDirectMotionVectors(true);
            return;
        }
        else
            sd->m_iSkipNextMacroblock = 0;

        // decode macroblock field flag
        if (sd->m_isMBAFF)
        {
            if (0 == (sd->m_CurMBAddr & 1))
                sd->DecodeMBFieldDecodingFlag_CABAC();
        }
        else
            pSetMBFieldDecodingFlag(sd->m_cur_mb.GlobalMacroblockInfo, 0);

        sd->UpdateNeighbouringAddresses();
        ColorSpecific<color_format, Coeffs, PlaneY, PlaneUV, is_field>::UpdateNeighbouringBlocks(sd);

        // First decode the "macroblock header", e.g., macroblock type,
        // intra-coding types.
        sd->DecodeMBTypeBSlice_CABAC();

        // decode macroblock having P type
        if (MBTYPE_PCM < sd->m_cur_mb.GlobalMacroblockInfo->mbtype)
        {
            DecodeMacroblock_B_CABAC(sd);
        }
        else
        {
            memset((void *) sd->m_cur_mb.RefIdxs[0], -1, sizeof(H264DecoderMacroblockRefIdxs));
            memset((void *) sd->m_cur_mb.RefIdxs[1], -1, sizeof(H264DecoderMacroblockRefIdxs));
            memset((void *) sd->m_cur_mb.MVs[0], 0, sizeof(H264DecoderMacroblockMVs));
            memset((void *) sd->m_cur_mb.MVs[1], 0, sizeof(H264DecoderMacroblockMVs));
            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));

            // decode macroblock having I type
            if (MBTYPE_PCM > sd->m_cur_mb.GlobalMacroblockInfo->mbtype)
                DecodeMacroblock_I_CABAC(sd);
            // macroblock has PCM type
            else
                DecodeMacroblock_PCM(sd);
        }

    } // void DecodeMacroblock_BSlice_CABAC(H264SegmentDecoderMultiThreaded * sd)

    void DecodeMacroblock_ISlice_CAVLC(H264SegmentDecoderMultiThreaded *sd)
    {
        memset(sd->m_cur_mb.LocalMacroblockInfo, 0, sizeof(H264DecoderMacroblockLocalInfo));
        memset(sd->m_cur_mb.GlobalMacroblockInfo->sbtype, 0, sizeof(sd->m_cur_mb.GlobalMacroblockInfo->sbtype));
        sd->m_cur_mb.LocalMacroblockInfo->QP = (Ipp8s) sd->m_QuantPrev;
        sd->m_cur_mb.GlobalMacroblockInfo->slice_id = (Ipp16s) sd->m_pSlice->GetSliceNum();
        memset((void *) sd->m_cur_mb.RefIdxs[0], -1, sizeof(H264DecoderMacroblockRefIdxs));
        memset((void *) sd->m_cur_mb.RefIdxs[1], -1, sizeof(H264DecoderMacroblockRefIdxs));

        // decode macroblock field flag
        if (sd->m_isMBAFF)
        {
            if (0 == (sd->m_CurMBAddr & 1))
                sd->DecodeMBFieldDecodingFlag_CAVLC();
        }
        else
            pSetMBFieldDecodingFlag(sd->m_cur_mb.GlobalMacroblockInfo, 0);

        // update neighbouring addresses
        sd->UpdateNeighbouringAddresses();
        // update neighbouring block positions
        ColorSpecific<color_format, Coeffs, PlaneY, PlaneUV, is_field>::UpdateNeighbouringBlocks(sd);

        // First decode the "macroblock header", e.g., macroblock type,
        // intra-coding types.
        sd->DecodeMBTypeISlice_CAVLC();

        // decode macroblock having I type
        if (MBTYPE_PCM != sd->m_cur_mb.GlobalMacroblockInfo->mbtype)
            DecodeMacroblock_I_CAVLC(sd);
        // macroblock has PCM type
        else
            DecodeMacroblock_PCM(sd);
    } // void DecodeMacroblock_ISlice_CAVLC(H264SegmentDecoderMultiThreaded *sd)

    void DecodeMacroblock_PSlice_CAVLC(H264SegmentDecoderMultiThreaded *sd)
    {
        // reset macroblock info
        memset(sd->m_cur_mb.LocalMacroblockInfo, 0, sizeof(H264DecoderMacroblockLocalInfo));
        memset(sd->m_cur_mb.GlobalMacroblockInfo->sbtype, 0, sizeof(sd->m_cur_mb.GlobalMacroblockInfo->sbtype));
        sd->m_cur_mb.LocalMacroblockInfo->QP = (Ipp8s) sd->m_QuantPrev;
        sd->m_cur_mb.GlobalMacroblockInfo->slice_id = (Ipp16s) sd->m_pSlice->GetSliceNum();
        memset((void *) sd->m_cur_mb.RefIdxs[1], -1, sizeof(H264DecoderMacroblockRefIdxs));

        if (0 == sd->m_MBSkipCount)
            sd->m_MBSkipCount = sd->DecodeMBSkipRun_CAVLC();
        else
            sd->m_MBSkipCount -= 1;

        if (0 < sd->m_MBSkipCount)
        {
            // reset macroblock variables
            memset((void *) sd->m_cur_mb.RefIdxs[0], 0, sizeof(H264DecoderMacroblockRefIdxs));
            sd->m_cur_mb.GlobalMacroblockInfo->mbtype = MBTYPE_SKIPPED;
            pSetMBSkippedFlag(sd->m_cur_mb.GlobalMacroblockInfo);
            sd->m_prev_dquant = 0;

            if ((sd->m_isMBAFF) &&
                (0 == (sd->m_CurMBAddr & 1)))
            {
                // but we don't know the spatial structure of the current macroblock.
                // we need to decode next macroblock for obtaining the structure.
                if (1 == sd->m_MBSkipCount)
                {
                    sd->m_CurMBAddr += 1;
                    sd->m_CurMB_Y += 1;
                    // the next macroblock isn't skipped, obtain the structure
                    sd->DecodeMBFieldDecodingFlag_CAVLC();
                    // the next macroblock is skipped too
                    sd->m_CurMBAddr -= 1;
                    sd->m_CurMB_Y -= 1;
                }
                else
                    sd->DecodeMBFieldDecodingFlag();
            }

            sd->UpdateNeighbouringAddresses();
            ColorSpecific<color_format, Coeffs, PlaneY, PlaneUV, is_field>::UpdateNeighbouringBlocks(sd);

            sd->ReconstructSkipMotionVectors();

⌨️ 快捷键说明

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