HEVC/H265 HM10.0 分析(二)TComDataCU.cpp .

来源:互联网 发布:鞍山市网络作家协会 编辑:程序博客网 时间:2024/06/05 13:39

以下分析TComDataCU.cpp。这个cpp是很重要的,要分几次分析完,这是分析TComDataCU.cpp(一)。


[cpp] view plaincopyprint?
  1. Void TComDataCU::getPartPosition( UInt partIdx, Int& xP, Int& yP, Int& nPSW, Int& nPSH)  
  2. {  
  3.   UInt col = m_uiCUPelX;  
  4.   UInt row = m_uiCUPelY;  
  5.   
  6.   switch ( m_pePartSize[0] )  
  7.   {  
  8.   case SIZE_2NxN:  
  9.     nPSW = getWidth(0);        
  10.     nPSH = getHeight(0) >> 1;   
  11.     xP   = col;  
  12.     yP   = (partIdx ==0)? row: row + nPSH;  
  13.     break;  
  14.   case SIZE_Nx2N:  
  15.     nPSW = getWidth(0) >> 1;   
  16.     nPSH = getHeight(0);        
  17.     xP   = (partIdx ==0)? col: col + nPSW;  
  18.     yP   = row;  
  19.     break;  
  20.   case SIZE_NxN:  
  21.     nPSW = getWidth(0) >> 1;   
  22.     nPSH = getHeight(0) >> 1;   
  23.     xP   = col + (partIdx&0x1)*nPSW;  
  24.     yP   = row + (partIdx>>1)*nPSH;  
  25.     break;  
  26.   case SIZE_2NxnU:  
  27.     nPSW = getWidth(0);  
  28.     nPSH = ( partIdx == 0 ) ?  getHeight(0) >> 2 : ( getHeight(0) >> 2 ) + ( getHeight(0) >> 1 );  
  29.     xP   = col;  
  30.     yP   = (partIdx ==0)? row: row + getHeight(0) - nPSH;  
  31.   
  32.     break;  
  33.   case SIZE_2NxnD:  
  34.     nPSW = getWidth(0);  
  35.     nPSH = ( partIdx == 0 ) ?  ( getHeight(0) >> 2 ) + ( getHeight(0) >> 1 ) : getHeight(0) >> 2;  
  36.     xP   = col;  
  37.     yP   = (partIdx ==0)? row: row + getHeight(0) - nPSH;  
  38.     break;  
  39.   case SIZE_nLx2N:  
  40.     nPSW = ( partIdx == 0 ) ? getWidth(0) >> 2 : ( getWidth(0) >> 2 ) + ( getWidth(0) >> 1 );  
  41.     nPSH = getHeight(0);  
  42.     xP   = (partIdx ==0)? col: col + getWidth(0) - nPSW;  
  43.     yP   = row;  
  44.     break;  
  45.   case SIZE_nRx2N:  
  46.     nPSW = ( partIdx == 0 ) ? ( getWidth(0) >> 2 ) + ( getWidth(0) >> 1 ) : getWidth(0) >> 2;  
  47.     nPSH = getHeight(0);  
  48.     xP   = (partIdx ==0)? col: col + getWidth(0) - nPSW;  
  49.     yP   = row;  
  50.     break;  
  51.   default:  
  52.     assert ( m_pePartSize[0] == SIZE_2Nx2N );  
  53.     nPSW = getWidth(0);        
  54.     nPSH = getHeight(0);        
  55.     xP   = col ;  
  56.     yP   = row ;  
  57.   
  58.     break;  
  59.   }  
  60. }  


在 2N*N, 2N*nU,2N*nD 中,上面部分的partIdx 为0,下面部分为1;

在N*2N,nL*2N,nR*2N中, 左边部分的partIdx为0,右边部分为1;

在N*N中, 按四叉树的结构,partIdx 分别为0,1,2,3;

在2N*2N中, partIdx只能为0;


xP,yP的值是CU块左上角的绝对位置值,nPSW,nPSH是当前CU块的宽度和高度,记住,CU是可以嵌套的,CU包含CU,所以有xP,yP,nPSW,nPSH就能够唯一的确定CU块,

原创粉丝点击