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

📄 umc_h264_reconstruct_templates.h

📁 audio-video-codecs.rar语音编解码器
💻 H
📖 第 1 页 / 共 5 页
字号:
            params.m_lumaSize = sd->m_pCurrentFrame->lumaSize();
            params.m_chromaSize = sd->m_pCurrentFrame->chromaSize();
            params.m_lumaSize.height >>= is_field;
            params.m_chromaSize.height >>= is_field;

            // reconstruct macro block
            switch (mbtype)
            {
            case MBTYPE_INTER_16x8:
                {
                    params.roi.width = 16;
                    params.roi.height = 8;
                    params.roi_chroma.width = 16 >> ((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 == psbdir[0])
                    {
                        params.m_iIntraMBLumaOffsetTmp = 0;
                        params.m_iIntraMBChromaOffsetTmp = 0;

                        CompensateBiDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
                                             0);
                    }
                    else
                    {
                        Ipp32s iDir = (D_DIR_BWD == psbdir[0]) ? (D_DIR_BWD) : (D_DIR_FWD);

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

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

                    if (D_DIR_BIDIR == psbdir[1])
                    {
                        params.m_iIntraMBLumaOffsetTmp = 8 * 16;
                        params.m_iIntraMBChromaOffsetTmp = (8 >> ((Ipp32s) (2 > color_format))) * 16;

                        CompensateBiDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
                                             8);
                    }
                    else
                    {
                        Ipp32s iDir = (D_DIR_BWD == psbdir[1]) ? (D_DIR_BWD) : (D_DIR_FWD);

                        CompensateUniDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma, iDir,
                                              8);
                    }
                }
                break;

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

                    if (D_DIR_BIDIR == psbdir[0])
                    {
                        params.m_iIntraMBLumaOffsetTmp = 0;
                        params.m_iIntraMBChromaOffsetTmp = 0;

                        CompensateBiDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
                                             0);
                    }
                    else
                    {
                        Ipp32s iDir = (D_DIR_BWD == psbdir[0]) ? (D_DIR_BWD) : (D_DIR_FWD);

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

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

                    if (D_DIR_BIDIR == psbdir[1])
                    {
                        params.m_iIntraMBLumaOffsetTmp = 8;
                        params.m_iIntraMBChromaOffsetTmp = 8 >> ((Ipp32s) (3 > color_format));

                        CompensateBiDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
                                             2);
                    }
                    else
                    {
                        Ipp32s iDir = (D_DIR_BWD == psbdir[1]) ? (D_DIR_BWD) : (D_DIR_FWD);

                        CompensateUniDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma, iDir,
                                              2);
                    }
                }
                break;

            default:
                {
                    params.roi.width = 16;
                    params.roi.height = 16;
                    params.roi_chroma.width = 16 >> ((Ipp32s) (3 > color_format));
                    params.roi_chroma.height = 16 >> ((Ipp32s) (2 > color_format));
                    params.m_iIntraMBLumaOffset = 0;
                    params.m_iIntraMBChromaOffset = 0;

                    if (MBTYPE_BIDIR == mbtype)
                    {
                        params.m_iIntraMBLumaOffsetTmp = 0;
                        params.m_iIntraMBChromaOffsetTmp = 0;

                        CompensateBiDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
                                             0);
                    }
                    else
                    {
                        Ipp32s iDir = (MBTYPE_BACKWARD == mbtype) ? (D_DIR_BWD) : (D_DIR_FWD);

                        CompensateUniDirBlock(params, pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma, iDir,
                                              0);
                    }
                }
                break;
            }
        }
        else
        {
            Ipp8s *pSubBlockType = sd->m_cur_mb.GlobalMacroblockInfo->sbtype;
            Ipp8s *pSubBlockDir = sd->m_cur_mb.LocalMacroblockInfo->sbdir;

            // 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;
            params.m_lumaSize = sd->m_pCurrentFrame->lumaSize();
            params.m_chromaSize = sd->m_pCurrentFrame->chromaSize();
            params.m_lumaSize.height >>= is_field;
            params.m_chromaSize.height >>= is_field;

            // sub block 0
            CompensateBlock8x8(pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
                params, pSubBlockType[0], pSubBlockDir[0], 0);

            // sub block 1
            pDstY += 8;
            pDstU += (8 >> ((Ipp32s) (3 > color_format)));
            pDstV += (8 >> ((Ipp32s) (3 > color_format)));
            params.m_iOffsetLuma = offsetY + 8;
            params.m_iOffsetChroma = offsetC + (8 >> ((Ipp32s) (3 > color_format)));
            params.m_iLumaXPos = mbXOffset + 8;
            params.m_iLumaYPos = mbYOffset;
            params.m_iChromaXPos = (mbXOffset + 8) >> ((Ipp32s) (3 > color_format));
            params.m_iChromaYPos = mbYOffset >> ((Ipp32s) (2 > color_format));
            CompensateBlock8x8(pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
                params, pSubBlockType[1], pSubBlockDir[1], 2);

            // sub block 2
            pDstY += - 8 + 8 * iPitchLuma;
            pDstU += - (8 >> ((Ipp32s) (3 > color_format))) +
                     (8 >> ((Ipp32s) (2 > color_format))) * iPitchChroma;
            pDstV += - (8 >> ((Ipp32s) (3 > color_format))) +
                     (8 >> ((Ipp32s) (2 > color_format))) * iPitchChroma;
            params.m_iOffsetLuma = offsetY + 8 * iPitchLuma;
            params.m_iOffsetChroma = offsetC + (8 >> ((Ipp32s) (2 > color_format))) * iPitchChroma;
            params.m_iLumaXPos = mbXOffset;
            params.m_iLumaYPos = mbYOffset + 8;
            params.m_iChromaXPos = mbXOffset >> ((Ipp32s) (3 > color_format));
            params.m_iChromaYPos = (mbYOffset + 8) >> ((Ipp32s) (2 > color_format));
            CompensateBlock8x8(pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
                params, pSubBlockType[2], pSubBlockDir[2], 8);

            // sub block 3
            pDstY += 8;
            pDstU += (8 >> ((Ipp32s) (3 > color_format)));
            pDstV += (8 >> ((Ipp32s) (3 > color_format)));
            params.m_iOffsetLuma = offsetY + 8 + 8 * iPitchLuma;
            params.m_iOffsetChroma = offsetC + (8 >> ((Ipp32s) (3 > color_format))) +
                                     (8 >> ((Ipp32s) (2 > color_format))) * iPitchChroma;
            params.m_iLumaXPos = mbXOffset + 8;
            params.m_iLumaYPos = mbYOffset + 8;
            params.m_iChromaXPos = (mbXOffset + 8) >> ((Ipp32s) (3 > color_format));
            params.m_iChromaYPos = (mbYOffset + 8) >> ((Ipp32s) (2 > color_format));
            CompensateBlock8x8(pDstY, pDstU, pDstV, iPitchLuma, iPitchChroma,
                params, pSubBlockType[3], pSubBlockDir[3], 10);

            /* DEBUG : should be removed *//*
            pDstY = pDstY - 8 - 8 * iPitchLuma;
            pDstU = pDstU - (8 >> ((Ipp32s) (3 > color_format))) - (8 >> ((Ipp32s) (2 > color_format))) * iPitchChroma;
            pDstV = pDstV - (8 >> ((Ipp32s) (3 > color_format))) - (8 >> ((Ipp32s) (2 > color_format))) * iPitchChroma;*/
        }
/*
        y_writer.Write(pDstY, iPitchLuma);

        u_writer.Write(pDstU, iPitchChroma);
        u_writer.Write(pDstV, iPitchChroma);*/
/*
        QueryPerformanceCounter((LARGE_INTEGER *) &iStamp);
        iTime += iStamp;*/

    } // void CompensateMotionMacroBlock(PlanePtrY pDstY,

    ////////////////////////////////////////////////////////////////////////////////
    // Copy raw pixel values from the bitstream to the reconstructed frame for
    // all luma and chroma blocks of one macroblock.
    ////////////////////////////////////////////////////////////////////////////////
    void ReconstructPCMMB(Ipp32u offsetY, Ipp32u offsetC, Ipp32s pitch_luma, Ipp32s pitch_chroma,
                          H264SegmentDecoder * sd)
    {
        PlanePtrY  pDstY;
        PlanePtrUV pDstU;
        PlanePtrUV pDstV;
        Ipp32s i;

        // to retrieve non-aligned pointer from m_pCoeffBlocksRead
        pDstY = (PlanePtrY)sd->m_pYPlane + offsetY;
        pDstU = (PlanePtrUV)sd->m_pUPlane + offsetC;
        pDstV = (PlanePtrUV)sd->m_pVPlane + offsetC;

        PlanePtrY pCoeffBlocksRead_Y = reinterpret_cast<PlanePtrY> (sd->m_pCoeffBlocksRead);
        // get pointer to raw bytes from m_pCoeffBlocksRead
        for (i = 0; i<16; i++)
            memcpy(pDstY + i * pitch_luma, pCoeffBlocksRead_Y + i * 16, 16*sizeof(PlaneY));

        sd->m_pCoeffBlocksRead = (UMC::CoeffsPtrCommon)((Ipp8u*)sd->m_pCoeffBlocksRead +
                                 256*sizeof(PlaneY));

        if (color_format)
        {
            Ipp32s iWidth = (color_format == 3) ? 16 : 8;
            Ipp32s iHeight = 8 + 8 * (color_format >> 1);

            PlanePtrUV pCoeffBlocksRead_UV = (PlanePtrUV) (sd->m_pCoeffBlocksRead);
            for (i = 0; i < iHeight; i += 1)
                memcpy(pDstU + i * pitch_chroma, pCoeffBlocksRead_UV + i * iWidth, iWidth*sizeof(PlaneUV));

            pCoeffBlocksRead_UV += iWidth * iHeight * sizeof(PlaneUV);

            for (i = 0; i < iHeight; i += 1)
                memcpy(pDstV + i * pitch_chroma, pCoeffBlocksRead_UV + i * iWidth, iWidth*sizeof(PlaneUV));

            sd->m_pCoeffBlocksRead = (UMC::CoeffsPtrCommon)((Ipp8u*)sd->m_pCoeffBlocksRead +
                2* iWidth * iHeight * sizeof(PlaneUV));
        }
    } // void ReconstructPCMMB(
};

#pragma warning(default: 4127)

} // namespace UMC

#endif // __UMC_H264_RECONSTRUCT_TEMPLATE

⌨️ 快捷键说明

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