/* 分析xTZSearch这个函数,xTZSearchHelp是当中最为重要的子函数之一。它实现最基本的功能:根据输入的搜索点坐标, 参考图像首地址,原始图像首地址,以及当前PU大小等相关信息,计算出SAD,并与之前保存的最佳值进行比较,更新到 目前为止的最佳值相关参数,如uiBestSad,搜索点坐标,搜索步长等。其他的函数如xTZ8PointSearch等搜索函数,最终 都是调用xTZSearchHelp进行误差匹配的。 */ __inline Void TEncSearch::xTZSearchHelp( TComPattern* pcPatternKey, IntTZSearchStruct& rcStruct, const Int iSearchX, const Int iSearchY, const UChar ucPointNr, const UInt uiDistance ) { UInt uiSad; Pel* piRefSrch; piRefSrch = rcStruct.piRefY + iSearchY * rcStruct.iYStride + iSearchX;//!< 参考图像Y分量的起始地址 //-- jclee for using the SAD function pointer m_pcRdCost->setDistParam( pcPatternKey, piRefSrch, rcStruct.iYStride, m_cDistParam );//!< 该函数主要职能是设置计算SAD的函数指针,下面会更为详细地分析该函数 // fast encoder decision: use subsampled SAD when rows > 8 for integer ME if ( m_pcEncCfg->getUseFastEnc() ) { if ( m_cDistParam.iRows > 8 ) { m_cDistParam.iSubShift = 1; } } setDistParamComp(0); // Y component // distortion m_cDistParam.bitDepth = g_bitDepthY;//!< 位深 uiSad = m_cDistParam.DistFunc( &m_cDistParam );//!< 计算SAD // motion cost uiSad += m_pcRdCost->getCost( iSearchX, iSearchY );//!< 考虑上mv本身带来的开销 if( uiSad < rcStruct.uiBestSad )//!< 更新最佳值 { rcStruct.uiBestSad = uiSad;//!< SAD rcStruct.iBestX = iSearchX; //!< mv_x rcStruct.iBestY = iSearchY;//!< mv_y rcStruct.uiBestDistance = uiDistance;//!< 搜索步长 rcStruct.uiBestRound = 0;//!< 搜索次数 rcStruct.ucPointNr = ucPointNr;//!< 搜索点序号 } }
// Setting the Distortion Parameter for Inter (ME) Void TComRdCost::setDistParam( TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride, DistParam& rcDistParam ) { // set Original & Curr Pointer / Stride rcDistParam.pOrg = pcPatternKey->getROIY();//!< 感兴趣区即待搜索的原始图像首地址 rcDistParam.pCur = piRefY;//!< 参考图像首地址 rcDistParam.iStrideOrg = pcPatternKey->getPatternLStride();//!< 原始图像跨度 rcDistParam.iStrideCur = iRefStride;//!< 参考图像跨度 // set Block Width / Height rcDistParam.iCols = pcPatternKey->getROIYWidth();//!< PU宽度 rcDistParam.iRows = pcPatternKey->getROIYHeight();//!< PU高度 rcDistParam.DistFunc = m_afpDistortFunc[DF_SAD + g_aucConvertToBit[ rcDistParam.iCols ] + 1 ];//!< 根据PU的大小选择相应的失真计算函数 #if AMP_SAD if (rcDistParam.iCols == 12) { rcDistParam.DistFunc = m_afpDistortFunc[43 ]; } else if (rcDistParam.iCols == 24) { rcDistParam.DistFunc = m_afpDistortFunc[44 ]; } else if (rcDistParam.iCols == 48) { rcDistParam.DistFunc = m_afpDistortFunc[45 ]; } #endif // initialize rcDistParam.iSubShift = 0; }
/// distortion parameter class class DistParam { public: Pel* pOrg;//!< 原始图像首地址 Pel* pCur;//!< 参考图像首地址 Int iStrideOrg;//!< 原始图像跨度 Int iStrideCur;//!< 参考图像跨度 Int iRows;//!< PU的宽度 Int iCols;//!< PU的高度 Int iStep; FpDistFunc DistFunc;//!< 计算失真的函数指针 Int bitDepth; //!< 位深 Bool bApplyWeight; // whether weithed prediction is used or not wpScalingParam *wpCur; // weithed prediction scaling parameters for current ref UInt uiComp; // uiComp = 0 (luma Y), 1 (chroma U), 2 (chroma V) // (vertical) subsampling shift (for reducing complexity) // - 0 = no subsampling, 1 = even rows, 2 = every 4th, etc. Int iSubShift;//!< 下采样 DistParam() { pOrg = NULL; pCur = NULL; iStrideOrg = 0; iStrideCur = 0; iRows = 0; iCols = 0; iStep = 1; DistFunc = NULL; iSubShift = 0; bitDepth = 0; } };