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

📄 umc_h264_reconstruct_templates.h

📁 audio-video-codecs.rar语音编解码器
💻 H
📖 第 1 页 / 共 5 页
字号:
                {
                    Ipp32s iDir = ((D_DIR_BWD == iSubBlockDir) || (D_DIR_DIRECT_SPATIAL_BWD == iSubBlockDir)) ?
                                   (D_DIR_BWD) :
                                   (D_DIR_FWD);

                    CompensateUniDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma, iDir,
                                          iSubBlockNumber);

                    // set sub-block offset for second half of MB
                    params.m_iLumaYPos += 4;
                    params.m_iChromaYPos += 4 >> ((Ipp32s) (2 > color_format));
                    params.m_iIntraMBLumaOffset = 4 * iPitchLuma;
                    params.m_iIntraMBChromaOffset = (4 >> ((Ipp32s) (2 > color_format))) * iPitchChroma;

                    CompensateUniDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma, iDir,
                                          iSubBlockNumber + 4);
                }
            }
            break;

        case SBTYPE_4x8:
            {
                params.roi.width = 4;
                params.roi.height = 8;
                params.roi_chroma.width = 4 >> ((Ipp32s) (3 > color_format));
                params.roi_chroma.height = 8 >> ((Ipp32s) (2 > color_format));
                params.m_iIntraMBLumaOffset = 0;
                params.m_iIntraMBChromaOffset = 0;

                if ((D_DIR_BIDIR == iSubBlockDir) ||
                    (D_DIR_DIRECT == iSubBlockDir) ||
                    (D_DIR_DIRECT_SPATIAL_BIDIR == iSubBlockDir))
                {
                    params.m_iIntraMBLumaOffsetTmp = 0;
                    params.m_iIntraMBChromaOffsetTmp = 0;

                    CompensateBiDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
                                         iSubBlockNumber);

                    // set sub-block offset for second half of MB
                    params.m_iLumaXPos += 4;
                    params.m_iChromaXPos += 4 >> ((Ipp32s) (3 > color_format));
                    params.m_iIntraMBLumaOffset = 4;
                    params.m_iIntraMBChromaOffset = (4 >> ((Ipp32s) (3 > color_format)));

                    params.m_iIntraMBLumaOffsetTmp = 4;
                    params.m_iIntraMBChromaOffsetTmp = (4 >> ((Ipp32s) (3 > color_format)));

                    CompensateBiDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
                                         iSubBlockNumber + 1);
                }
                else
                {
                    Ipp32s iDir = ((D_DIR_BWD == iSubBlockDir) || (D_DIR_DIRECT_SPATIAL_BWD == iSubBlockDir)) ?
                                   (D_DIR_BWD) :
                                   (D_DIR_FWD);

                    CompensateUniDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma, iDir,
                                          iSubBlockNumber);

                    // set sub-block offset for second half of MB
                    params.m_iLumaXPos += 4;
                    params.m_iChromaXPos += 4 >> ((Ipp32s) (3 > color_format));
                    params.m_iIntraMBLumaOffset = 4;
                    params.m_iIntraMBChromaOffset = (4 >> ((Ipp32s) (3 > color_format)));

                    CompensateUniDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma, iDir,
                                          iSubBlockNumber + 1);
                }
            }
            break;

        default:
            // 4x4 sub division
            {
                params.roi.width = 4;
                params.roi.height = 4;
                params.roi_chroma.width = 4 >> ((Ipp32s) (3 > color_format));
                params.roi_chroma.height = 4 >> ((Ipp32s) (2 > color_format));
                params.m_iIntraMBLumaOffset = 0;
                params.m_iIntraMBChromaOffset = 0;

                if ((D_DIR_BIDIR == iSubBlockDir) ||
                    (D_DIR_DIRECT == iSubBlockDir) ||
                    (D_DIR_DIRECT_SPATIAL_BIDIR == iSubBlockDir))
                {
                    params.m_iIntraMBLumaOffsetTmp = 0;
                    params.m_iIntraMBChromaOffsetTmp = 0;

                    CompensateBiDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
                                         iSubBlockNumber);

                    // set sub-block offset for second quarter of MB
                    params.m_iLumaXPos += 4;
                    params.m_iChromaXPos += 4 >> ((Ipp32s) (3 > color_format));
                    params.m_iIntraMBLumaOffset = 4;
                    params.m_iIntraMBChromaOffset = (4 >> ((Ipp32s) (3 > color_format)));

                    params.m_iIntraMBLumaOffsetTmp = 4;
                    params.m_iIntraMBChromaOffsetTmp = (4 >> ((Ipp32s) (3 > color_format)));

                    CompensateBiDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
                                         iSubBlockNumber + 1);

                    // set sub-block offset for third quarter of MB
                    params.m_iLumaXPos -= 4;
                    params.m_iLumaYPos += 4;
                    params.m_iChromaXPos -= 4 >> ((Ipp32s) (3 > color_format));
                    params.m_iChromaYPos += 4 >> ((Ipp32s) (2 > color_format));
                    params.m_iIntraMBLumaOffset = 4 * iPitchLuma;
                    params.m_iIntraMBChromaOffset = (4 >> ((Ipp32s) (2 > color_format))) * iPitchChroma;

                    params.m_iIntraMBLumaOffsetTmp = 4 * 16;
                    params.m_iIntraMBChromaOffsetTmp = (4 >> ((Ipp32s) (2 > color_format))) * 16;

                    CompensateBiDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
                                         iSubBlockNumber + 4);

                    // set sub-block offset for fourth quarter of MB
                    params.m_iLumaXPos += 4;
                    params.m_iChromaXPos += 4 >> ((Ipp32s) (3 > color_format));
                    params.m_iIntraMBLumaOffset = 4 + 4 * iPitchLuma;
                    params.m_iIntraMBChromaOffset = (4 >> ((Ipp32s) (3 > color_format))) +
                                                    (4 >> ((Ipp32s) (2 > color_format))) * iPitchChroma;

                    params.m_iIntraMBLumaOffsetTmp = 4 + 4 * 16;
                    params.m_iIntraMBChromaOffsetTmp = (4 >> ((Ipp32s) (3 > color_format))) +
                                                       (4 >> ((Ipp32s) (2 > color_format))) * 16;

                    CompensateBiDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
                                         iSubBlockNumber + 5);
                }
                else
                {
                    Ipp32s iDir = ((D_DIR_BWD == iSubBlockDir) || (D_DIR_DIRECT_SPATIAL_BWD == iSubBlockDir)) ?
                                   (D_DIR_BWD) :
                                   (D_DIR_FWD);

                    CompensateUniDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma, iDir,
                                          iSubBlockNumber);

                    // set sub-block offset for second quarter of MB
                    params.m_iLumaXPos += 4;
                    params.m_iChromaXPos += 4 >> ((Ipp32s) (3 > color_format));
                    params.m_iIntraMBLumaOffset = 4;
                    params.m_iIntraMBChromaOffset = (4 >> ((Ipp32s) (3 > color_format)));

                    CompensateUniDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma, iDir,
                                          iSubBlockNumber + 1);

                    // set sub-block offset for third quarter of MB
                    params.m_iLumaXPos -= 4;
                    params.m_iLumaYPos += 4;
                    params.m_iChromaXPos -= 4 >> ((Ipp32s) (3 > color_format));
                    params.m_iChromaYPos += 4 >> ((Ipp32s) (2 > color_format));
                    params.m_iIntraMBLumaOffset = 4 * iPitchLuma;
                    params.m_iIntraMBChromaOffset = (4 >> ((Ipp32s) (2 > color_format))) * iPitchChroma;

                    CompensateUniDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma, iDir,
                                          iSubBlockNumber + 4);

                    // set sub-block offset for fourth quarter of MB
                    params.m_iLumaXPos += 4;
                    params.m_iChromaXPos += 4 >> ((Ipp32s) (3 > color_format));
                    params.m_iIntraMBLumaOffset = 4 + 4 * iPitchLuma;
                    params.m_iIntraMBChromaOffset = (4 >> ((Ipp32s) (3 > color_format))) +
                                                    (4 >> ((Ipp32s) (2 > color_format))) * iPitchChroma;

                    CompensateUniDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma, iDir,
                                          iSubBlockNumber + 5);
                }
            }
            break;
        }

    } // void CompensateBlock8x8(PlanePtrY pDstY,

    void CompensateMotionMacroBlock(PlanePtrY pDstY,
                                    PlanePtrUV pDstV,
                                    PlanePtrUV pDstU,
                                    Ipp32u mbXOffset, // for edge clipping
                                    Ipp32u mbYOffset,
                                    Ipp32s offsetY,
                                    Ipp32s offsetC,
                                    Ipp32s pitch_luma,
                                    Ipp32s pitch_chroma,
                                    H264SegmentDecoder *sd)
    {
        Ipp32s mbtype = sd->m_cur_mb.GlobalMacroblockInfo->mbtype;

        Ipp8s *psbdir = sd->m_cur_mb.LocalMacroblockInfo->sbdir;

        bool bBidirWeightMB = false;    // is bidir weighting in effect for the MB?
        bool bUnidirWeightMB = false;    // is explicit L0 weighting in effect for the MB?

        // Optional weighting vars
        Ipp32u weighted_bipred_idc = 0;
        Ipp32u luma_log2_weight_denom = 0;
        Ipp32u chroma_log2_weight_denom = 0;

        Ipp8s *pRefIndexL0 = NULL;
        Ipp8s *pRefIndexL1 = NULL;

        Ipp32s bit_depth_luma = sd->bit_depth_luma;
        Ipp32s bit_depth_cr = sd->bit_depth_chroma;

        VM_ASSERT(IS_INTER_MBTYPE(sd->m_cur_mb.GlobalMacroblockInfo->mbtype));

        ReconstructParams params;
        params.is_mbaff = (sd->m_pSliceHeader->MbaffFrameFlag != 0);
        params.is_bottom_mb = (params.is_mbaff && (sd->m_CurMBAddr & 1)) ? 1 : 0;

        pRefIndexL0 = sd->m_cur_mb.RefIdxs[0]->RefIdxs;

        if (((PREDSLICE == sd->m_pSliceHeader->slice_type) ||
            (S_PREDSLICE == sd->m_pSliceHeader->slice_type)) &&
            (sd->m_pPicParamSet->weighted_pred_flag != 0))
        {
            // L0 weighting specified in pic param set. Get weighting params
            // for the slice.
            luma_log2_weight_denom = sd->m_pSliceHeader->luma_log2_weight_denom;
            chroma_log2_weight_denom = sd->m_pSliceHeader->chroma_log2_weight_denom;
            bUnidirWeightMB = true;
        }

        // get luma interp func pointer table in cache
        if (sd->m_pSliceHeader->slice_type == BPREDSLICE)
        {
            VM_ASSERT(sd->m_pRefPicList[1][0]);

            pRefIndexL1 = sd->m_cur_mb.RefIdxs[1]->RefIdxs;
            // DIRECT MB have the same subblock partition structure as the
            // colocated MB. Take advantage of that to perform motion comp
            // for the direct MB using the largest partitions possible.
            if (mbtype == MBTYPE_DIRECT || mbtype == MBTYPE_SKIPPED)
            {
                mbtype = MBTYPE_INTER_8x8;
            }

            // Bi-dir weighting?
            weighted_bipred_idc = sd->m_pPicParamSet->weighted_bipred_idc;
            if (weighted_bipred_idc == 1)
            {
                // explicit bidir weighting
                luma_log2_weight_denom = sd->m_pSliceHeader->luma_log2_weight_denom;
                chroma_log2_weight_denom = sd->m_pSliceHeader->chroma_log2_weight_denom;
                bUnidirWeightMB = true;
                bBidirWeightMB = true;
            }
            if (weighted_bipred_idc == 2)
            {
                bBidirWeightMB = true;
            }
        }

        Ipp32s iPitchLuma = pitch_luma;
        Ipp32s iPitchChroma = pitch_chroma;

        if (mbtype != MBTYPE_INTER_8x8 && mbtype != MBTYPE_INTER_8x8_REF0)
        {
            // fill the reconstruct parameters
            params.m_pMV[0] = sd->m_cur_mb.MVs[0]->MotionVectors;
            params.m_pMV[1] = (BPREDSLICE == sd->m_pSliceHeader->slice_type) ? (sd->m_cur_mb.MVs[1]->MotionVectors) : (NULL);
            params.m_pRefIndex[0] = pRefIndexL0;
            params.m_pRefIndex[1] = pRefIndexL1;
            params.m_iOffsetLuma = offsetY;
            params.m_iOffsetChroma = offsetC;
            params.m_iLumaXPos = mbXOffset;
            params.m_iLumaYPos = mbYOffset;
            params.m_iChromaXPos = mbXOffset >> ((Ipp32s) (3 > color_format));
            params.m_iChromaYPos = mbYOffset >> ((Ipp32s) (2 > color_format));
            if (is_weight)
            {
                params.luma_log2_weight_denom = luma_log2_weight_denom;
                params.chroma_log2_weight_denom = chroma_log2_weight_denom;
                params.weighted_bipred_idc = weighted_bipred_idc;
                params.m_bBidirWeightMB = bBidirWeightMB;
                params.m_bUnidirWeightMB = bUnidirWeightMB;
            }
            params.bit_depth_luma = bit_depth_luma;
            params.bit_depth_chroma = bit_depth_cr;
            params.m_pSegDec = sd;

⌨️ 快捷键说明

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