HEVC学习(三十一) —— 去方块滤波之二
这个是维护去方块滤波参数的结构体:
/// parameters for deblocking filtertypedef struct _LFCUParam{ Bool bInternalEdge; ///< indicates internal edge Bool bLeftEdge; ///< indicates left edge Bool bTopEdge; ///< indicates top edge} LFCUParam;
//! 该函数的功能是根据当前PU的位置、当前PU的邻块的存在性对其边界是否进行相应滤波进行判断Void TComLoopFilter::xSetLoopfilterParam( TComDataCU* pcCU, UInt uiAbsZorderIdx ){ UInt uiX = pcCU->getCUPelX() + g_auiRasterToPelX[ g_auiZscanToRaster[ uiAbsZorderIdx ] ]; UInt uiY = pcCU->getCUPelY() + g_auiRasterToPelY[ g_auiZscanToRaster[ uiAbsZorderIdx ] ]; TComDataCU* pcTempCU; UInt uiTempPartIdx; m_stLFCUParam.bInternalEdge = ! pcCU->getSlice()->getDeblockingFilterDisable(); //!< 标记边界是否进行去方块滤波 if ( (uiX == 0) || pcCU->getSlice()->getDeblockingFilterDisable() ) { m_stLFCUParam.bLeftEdge = false; } else { m_stLFCUParam.bLeftEdge = true; } if ( m_stLFCUParam.bLeftEdge ) { pcTempCU = pcCU->getPULeft( uiTempPartIdx, uiAbsZorderIdx, !pcCU->getSlice()->getLFCrossSliceBoundaryFlag(), false, !m_bLFCrossTileBoundary); if ( pcTempCU ) //!< 只有在左邻PU存在的情况下才进行垂直边界的滤波 { m_stLFCUParam.bLeftEdge = true; } else { m_stLFCUParam.bLeftEdge = false; } } if ( (uiY == 0 ) || pcCU->getSlice()->getDeblockingFilterDisable() ) { m_stLFCUParam.bTopEdge = false; } else { m_stLFCUParam.bTopEdge = true; } if ( m_stLFCUParam.bTopEdge ) {#if LINEBUF_CLEANUP pcTempCU = pcCU->getPUAbove( uiTempPartIdx, uiAbsZorderIdx, !pcCU->getSlice()->getLFCrossSliceBoundaryFlag(), false , false, !m_bLFCrossTileBoundary);#else pcTempCU = pcCU->getPUAbove( uiTempPartIdx, uiAbsZorderIdx, !pcCU->getSlice()->getLFCrossSliceBoundaryFlag(), false , false, false, !m_bLFCrossTileBoundary);#endif if ( pcTempCU ) //!< 只有在上邻PU存在的情况下才进行水平边界的滤波 { m_stLFCUParam.bTopEdge = true; } else { m_stLFCUParam.bTopEdge = false; } }}