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

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


  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. }  
Void TComDataCU::getPartPosition( UInt partIdx, Int& xP, Int& yP, Int& nPSW, Int& nPSH)
{
  UInt col = m_uiCUPelX;
  UInt row = m_uiCUPelY;

  switch ( m_pePartSize[0] )
  {
  case SIZE_2NxN:
    nPSW = getWidth(0);      
    nPSH = getHeight(0) >> 1; 
    xP   = col;
    yP   = (partIdx ==0)? row: row + nPSH;
    break;
  case SIZE_Nx2N:
    nPSW = getWidth(0) >> 1; 
    nPSH = getHeight(0);      
    xP   = (partIdx ==0)? col: col + nPSW;
    yP   = row;
    break;
  case SIZE_NxN:
    nPSW = getWidth(0) >> 1; 
    nPSH = getHeight(0) >> 1; 
    xP   = col + (partIdx&0x1)*nPSW;
    yP   = row + (partIdx>>1)*nPSH;
    break;
  case SIZE_2NxnU:
    nPSW = getWidth(0);
    nPSH = ( partIdx == 0 ) ?  getHeight(0) >> 2 : ( getHeight(0) >> 2 ) + ( getHeight(0) >> 1 );
    xP   = col;
    yP   = (partIdx ==0)? row: row + getHeight(0) - nPSH;

    break;
  case SIZE_2NxnD:
    nPSW = getWidth(0);
    nPSH = ( partIdx == 0 ) ?  ( getHeight(0) >> 2 ) + ( getHeight(0) >> 1 ) : getHeight(0) >> 2;
    xP   = col;
    yP   = (partIdx ==0)? row: row + getHeight(0) - nPSH;
    break;
  case SIZE_nLx2N:
    nPSW = ( partIdx == 0 ) ? getWidth(0) >> 2 : ( getWidth(0) >> 2 ) + ( getWidth(0) >> 1 );
    nPSH = getHeight(0);
    xP   = (partIdx ==0)? col: col + getWidth(0) - nPSW;
    yP   = row;
    break;
  case SIZE_nRx2N:
    nPSW = ( partIdx == 0 ) ? ( getWidth(0) >> 2 ) + ( getWidth(0) >> 1 ) : getWidth(0) >> 2;
    nPSH = getHeight(0);
    xP   = (partIdx ==0)? col: col + getWidth(0) - nPSW;
    yP   = row;
    break;
  default:
    assert ( m_pePartSize[0] == SIZE_2Nx2N );
    nPSW = getWidth(0);      
    nPSH = getHeight(0);      
    xP   = col ;
    yP   = row ;

    break;
  }
}


在 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块,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值