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

📄 umc_h264_reconstruct_templates.h

📁 audio-video-codecs.rar语音编解码器
💻 H
📖 第 1 页 / 共 5 页
字号:
        }

    } // void CompensateMotionLumaBlock(ReconstructParams *pParams,

    void CompensateMotionChromaBlock(ReconstructParams *pParams,
                                     Ipp32s iDir,
                                     Ipp32s iBlockNumber,
                                     Ipp32s iUniDir,
                                     Ipp8u *)
    {
        IppVCInterpolateBlock_8u interpolateInfo;
        Ipp32s iRefIndex;
        Ipp32s iRefFieldTop;

        // get reference index
        iRefIndex = pParams->m_pRefIndex[iDir][iBlockNumber];
        if (is_field && pParams->is_mbaff)
            iRefIndex >>= 1;
        VM_ASSERT(iRefIndex >= 0);

        // get reference frame & pitch
        interpolateInfo.pSrc[0] = (PlanePtrUV) pParams->m_pSegDec->m_pRefPicList[iDir][iRefIndex]->m_pUPlane;
        interpolateInfo.pSrc[1] = (PlanePtrUV) pParams->m_pSegDec->m_pRefPicList[iDir][iRefIndex]->m_pVPlane;
        VM_ASSERT(interpolateInfo.pSrc[0]);
        VM_ASSERT(interpolateInfo.pSrc[1]);
        interpolateInfo.srcStep = pParams->m_pSegDec->m_pRefPicList[iDir][iRefIndex]->pitch_chroma();

        if (is_field)
        {
            if (pParams->is_mbaff)
            {
                iRefFieldTop = pParams->is_bottom_mb ^ (pParams->m_pRefIndex[iDir][iBlockNumber] & 1);
                pParams->m_iRefIndex[iDir] = iRefIndex;
            }
            else
                iRefFieldTop = GetReferenceField(pParams->m_pSegDec->m_pFields[iDir], iRefIndex);

            if (iRefFieldTop)
            {
                interpolateInfo.pSrc[0] += interpolateInfo.srcStep;
                interpolateInfo.pSrc[1] += interpolateInfo.srcStep;
            }

            interpolateInfo.srcStep *= 2;
        }

        // save vector
        interpolateInfo.pointVector.x = pParams->m_pMV[iDir][iBlockNumber].mvx;
        interpolateInfo.pointVector.y = pParams->m_pMV[iDir][iBlockNumber].mvy;

        // adjust vectors when we decode a field
        if ((is_field) && (1 == color_format))
        {
            if (pParams->is_mbaff)
            {
                interpolateInfo.pointVector.y += (pParams->is_bottom_mb - iRefFieldTop) * 2;
            }
            else
            {
                if (!pParams->m_pSegDec->m_field_index && iRefFieldTop)
                    interpolateInfo.pointVector.y -= 2;
                else if(pParams->m_pSegDec->m_field_index && !iRefFieldTop)
                    interpolateInfo.pointVector.y += 2;
            }
        }

        // we should do interpolation if vertical or horizontal vector isn't zero
        if ((interpolateInfo.pointVector.x | interpolateInfo.pointVector.y) ||
            (iUniDir))
        {
            // scale motion vector
            interpolateInfo.pointVector.x <<= ((Ipp32s) (3 <= color_format));
            interpolateInfo.pointVector.y <<= ((Ipp32s) (2 <= color_format));

            // fill parameters
            interpolateInfo.pDst[0] = pParams->m_pDstU;
            interpolateInfo.pDst[1] = pParams->m_pDstV;
            interpolateInfo.dstStep = pParams->m_iDstPitchChroma;
            interpolateInfo.sizeFrame = pParams->m_chromaSize;
            interpolateInfo.sizeBlock = pParams->roi_chroma;
            interpolateInfo.pointBlockPos.x = pParams->m_iChromaXPos;
            interpolateInfo.pointBlockPos.y = pParams->m_iChromaYPos;

            ippiInterpolateChromaBlock_H264_8u_P2R(&interpolateInfo);

            // save pointers for optimized interpolation
            pParams->m_pSrcU[iDir] = pParams->m_pDstU;
            pParams->m_pSrcV[iDir] = pParams->m_pDstV;
            pParams->m_iSrcPitchChroma[iDir] = pParams->m_iDstPitchChroma;
        }
        else
        {
            Ipp32s iOffset = pParams->m_iOffsetChroma +
                             pParams->m_iIntraMBChromaOffset;

            // save pointers for optimized interpolation
            pParams->m_pSrcU[iDir] = (PlanePtrUV) interpolateInfo.pSrc[0] + iOffset;
            pParams->m_pSrcV[iDir] = (PlanePtrUV) interpolateInfo.pSrc[1] + iOffset;
            pParams->m_iSrcPitchChroma[iDir] = interpolateInfo.srcStep;
        }

    } // void CompensateMotionChromaBlock(ReconstructParams *pParams,

    void CompensateMotionChromaBlock(ReconstructParams *pParams,
                                     Ipp32s iDir,
                                     Ipp32s iBlockNumber,
                                     Ipp32s iUniDir,
                                     Ipp16u *)
    {
        IppVCInterpolateBlock_16u interpolateInfo;
        Ipp32s iRefIndex;
        Ipp32s iRefFieldTop;

        // get reference index
        iRefIndex = pParams->m_pRefIndex[iDir][iBlockNumber];
        if (is_field && pParams->is_mbaff)
            iRefIndex >>= 1;
        VM_ASSERT(iRefIndex >= 0);

        // get reference frame & pitch
        interpolateInfo.pSrc[0] = (PlanePtrUV) pParams->m_pSegDec->m_pRefPicList[iDir][iRefIndex]->m_pUPlane;
        interpolateInfo.pSrc[1] = (PlanePtrUV) pParams->m_pSegDec->m_pRefPicList[iDir][iRefIndex]->m_pVPlane;
        VM_ASSERT(interpolateInfo.pSrc[0]);
        VM_ASSERT(interpolateInfo.pSrc[1]);
        interpolateInfo.srcStep = pParams->m_pSegDec->m_pRefPicList[iDir][iRefIndex]->pitch_chroma();

        if (is_field)
        {
            if (pParams->is_mbaff)
            {
                iRefFieldTop = pParams->is_bottom_mb ^ (pParams->m_pRefIndex[iDir][iBlockNumber] & 1);
                pParams->m_iRefIndex[iDir] = iRefIndex;
            }
            else
                iRefFieldTop = GetReferenceField(pParams->m_pSegDec->m_pFields[iDir], iRefIndex);

            if (iRefFieldTop)
            {
                interpolateInfo.pSrc[0] += interpolateInfo.srcStep;
                interpolateInfo.pSrc[1] += interpolateInfo.srcStep;
            }

            interpolateInfo.srcStep *= 2;
        }

        // save vector
        interpolateInfo.pointVector.x = pParams->m_pMV[iDir][iBlockNumber].mvx;
        interpolateInfo.pointVector.y = pParams->m_pMV[iDir][iBlockNumber].mvy;

        // adjust vectors when we decode a field
        if ((is_field) && (1 == color_format))
        {
            if (pParams->is_mbaff)
            {
                interpolateInfo.pointVector.y += (pParams->is_bottom_mb - iRefFieldTop) * 2;
            }
            else
            {
                if (!pParams->m_pSegDec->m_field_index && iRefFieldTop)
                    interpolateInfo.pointVector.y -= 2;
                else if(pParams->m_pSegDec->m_field_index && !iRefFieldTop)
                    interpolateInfo.pointVector.y += 2;
            }
        }

        // we should do interpolation if vertical or horizontal vector isn't zero
        if ((interpolateInfo.pointVector.x | interpolateInfo.pointVector.y) ||
            (iUniDir))
        {
            // scale motion vector
            interpolateInfo.pointVector.x <<= ((Ipp32s) (3 <= color_format));
            interpolateInfo.pointVector.y <<= ((Ipp32s) (2 <= color_format));

            // fill parameters
            interpolateInfo.pDst[0] = pParams->m_pDstU;
            interpolateInfo.pDst[1] = pParams->m_pDstV;
            interpolateInfo.dstStep = pParams->m_iDstPitchChroma;
            interpolateInfo.sizeFrame = pParams->m_chromaSize;
            interpolateInfo.sizeBlock = pParams->roi_chroma;
            interpolateInfo.pointBlockPos.x = pParams->m_iChromaXPos;
            interpolateInfo.pointBlockPos.y = pParams->m_iChromaYPos;
            interpolateInfo.bitDepth = pParams->bit_depth_chroma;

            ippiInterpolateChromaBlock_H264_16u_P2R(&interpolateInfo);

            // save pointers for optimized interpolation
            pParams->m_pSrcU[iDir] = pParams->m_pDstU;
            pParams->m_pSrcV[iDir] = pParams->m_pDstV;
            pParams->m_iSrcPitchChroma[iDir] = pParams->m_iDstPitchChroma;
        }
        else
        {
            Ipp32s iOffset = pParams->m_iOffsetChroma +
                             pParams->m_iIntraMBChromaOffset;

            // save pointers for optimized interpolation
            pParams->m_pSrcU[iDir] = (PlanePtrUV) interpolateInfo.pSrc[0] + iOffset;
            pParams->m_pSrcV[iDir] = (PlanePtrUV) interpolateInfo.pSrc[1] + iOffset;
            pParams->m_iSrcPitchChroma[iDir] = interpolateInfo.srcStep;
        }

    } // void CompensateMotionChromaBlock(ReconstructParams *pParams,

    inline
    void InterpolateMacroblock(ReconstructParams *pParams)
    {
        // combine bidir predictions into one,
        // no weighting

        InterpolateBlock(pParams->m_pSrcY[0],
                         pParams->m_pSrcY[1],
                         pParams->m_pDstY,
                         pParams->roi.width,
                         pParams->roi.height,
                         pParams->m_iSrcPitchLuma[0],
                         pParams->m_iSrcPitchLuma[1],
                         pParams->m_iDstPitchLuma,
                         pParams->bit_depth_luma);

        if (color_format)
        {
            InterpolateBlock(pParams->m_pSrcV[0],
                             pParams->m_pSrcV[1],
                             pParams->m_pDstV,
                             pParams->roi_chroma.width,
                             pParams->roi_chroma.height,
                             pParams->m_iSrcPitchChroma[0],
                             pParams->m_iSrcPitchChroma[1],
                             pParams->m_iDstPitchChroma,
                             pParams->bit_depth_chroma);
            InterpolateBlock(pParams->m_pSrcU[0],
                             pParams->m_pSrcU[1],
                             pParams->m_pDstU,
                             pParams->roi_chroma.width,
                             pParams->roi_chroma.height,
                             pParams->m_iSrcPitchChroma[0],
                             pParams->m_iSrcPitchChroma[1],
                             pParams->m_iDstPitchChroma,
                             pParams->bit_depth_chroma);
        }

    } // void InterpolateMacroblock(ReconstructParams *pParams)

    inline
    void BiDirWeightMacroblock(ReconstructParams *pParams)
    {
        // combine bidir predictions into one,
        // explicit weighting
        BiDirWeightBlock(pParams->m_pSrcY[0],
                         pParams->m_pSrcY[1],
                         pParams->m_pDstY,
                         pParams->m_iSrcPitchLuma[0],
                         pParams->m_iSrcPitchLuma[1],
                         pParams->m_iDstPitchLuma,
                         pParams->luma_log2_weight_denom,
                         pParams->m_pSegDec->m_pPredWeight[D_DIR_FWD][pParams->m_iRefIndex[D_DIR_FWD]].luma_weight,
                         pParams->m_pSegDec->m_pPredWeight[D_DIR_FWD][pParams->m_iRefIndex[D_DIR_FWD]].luma_offset,
                         pParams->m_pSegDec->m_pPredWeight[D_DIR_BWD][pParams->m_iRefIndex[D_DIR_BWD]].luma_weight,
                         pParams->m_pSegDec->m_pPredWeight[D_DIR_BWD][pParams->m_iRefIndex[D_DIR_BWD]].luma_offset,
                         pParams->roi,
                         pParams->bit_depth_luma);

        if (color_format)
        {
            BiDirWeightBlock(pParams->m_pSrcV[0],
                             pParams->m_pSrcV[1],
                             pParams->m_pDstV,
                             pParams->m_iSrcPitchChroma[0],
                             pParams->m_iSrcPitchChroma[1],
                             pParams->m_iDstPitchChroma,
                             pParams->chroma_log2_weight_denom,
                             pParams->m_pSegDec->m_pPredWeight[D_DIR_FWD][pParams->m_iRefIndex[D_DIR_FWD]].chroma_weight[1],
                             pParams->m_pSegDec->m_pPredWeight[D_DIR_FWD][pParams->m_iRefIndex[D_DIR_FWD]].chroma_offset[1],
                             pParams->m_pSegDec->m_pPredWeight[D_DIR_BWD][pParams->m_iRefIndex[D_DIR_BWD]].chroma_weight[1],
                             pParams->m_pSegDec->m_pPredWeight[D_DIR_BWD][pParams->m_iRefIndex[D_DIR_BWD]].chroma_offset[1],
                             pParams->roi_chroma,
                             pParams->bit_depth_chroma);

            BiDirWeightBlock(pParams->m_pSrcU[0],
                             pParams->m_pSrcU[1],
                             pParams->m_pDstU,
                             pParams->m_iSrcPitchChroma[0],

⌨️ 快捷键说明

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