废话不多说直接上代码注释。有错的话,请指教。
//设定当前CU中PU的参数 Void TComPattern::initPattern( TComDataCU* pcCU, //当前的CU(64*64到8*8) UInt uiPartDepth, //PU相对于当前CU的深度 UInt uiAbsPartIdx ) //当前的PU以4*4块为单位,以Zscan扫描顺序的序号(以LCU为标准) { //为了计算参考点的位置:是否需要计算上一行,左一列 Int uiOffsetLeft = 0; Int uiOffsetAbove = 0; //当前PU的宽和高 //pcCU->getWidth (0)为当前CU的宽,当前CU可能会被分为很多层,第0个就是当前CU的尺寸 UChar uiWidth = pcCU->getWidth (0)>>uiPartDepth; UChar uiHeight = pcCU->getHeight(0)>>uiPartDepth; //先计算当前CU的起始地址,再加上Zscan的扫描序号,构成当前PU在整个图片中的绝对位置 UInt uiAbsZorderIdx = pcCU->getZorderIdxInCU() + uiAbsPartIdx; UInt uiCurrPicPelX = pcCU->getCUPelX() + g_auiRasterToPelX[ g_auiZscanToRaster[uiAbsZorderIdx] ]; UInt uiCurrPicPelY = pcCU->getCUPelY() + g_auiRasterToPelY[ g_auiZscanToRaster[uiAbsZorderIdx] ]; /* 计算参考点的起始坐标 m_piPatternOrigin = pcCU->getPic()->getPicYuvRec()->getLumaAddr(pcCU->getAddr(), uiAbsZorderIdx) - m_iOffsetAbove * m_iPatternStride //当前地址的上面m_iOffsetAbove行的位置处 - m_iOffsetLeft;//当前地址的左面m_iOffsetLeft列处 */ //在计算参考点的位置时,当前的位置的起始点要是在第一列,因为左面没有像素,需要设置0,不是第一列时取左面一列的数据,此时设为1 if( uiCurrPicPelX != 0 ) { uiOffsetLeft = 1; } //在计算参考点的位置时,当前的位置的起始点要是在第一行,因为上面没有像素,需要设置0,不是第一行时取上一行的数据 if( uiCurrPicPelY != 0 ) { uiOffsetAbove = 1; } //根据上面的偏移,计算Y,Cb,Cr的参考点处的位置,0,1,2用来表示是Y,Cb,Cr m_cPatternY .setPatternParamCU( pcCU, 0, uiWidth, uiHeight, uiOffsetLeft, uiOffsetAbove, uiAbsPartIdx ); m_cPatternCb.setPatternParamCU( pcCU, 1, uiWidth >> 1, uiHeight >> 1, uiOffsetLeft, uiOffsetAbove, uiAbsPartIdx ); m_cPatternCr.setPatternParamCU( pcCU, 2, uiWidth >> 1, uiHeight >> 1, uiOffsetLeft, uiOffsetAbove, uiAbsPartIdx ); }
请指教:1729048547