Changeset 1313 in 3DVCSoftware for trunk/source/Lib/TLibCommon/TComPicSym.cpp


Ignore:
Timestamp:
13 Aug 2015, 17:38:13 (9 years ago)
Author:
tech
Message:

Merged 14.1-update-dev1@1312.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/Lib/TLibCommon/TComPicSym.cpp

    r1179 r1313  
    22 * License, included below. This software may be subject to other third party
    33 * and contributor rights, including patent rights, and no such rights are
    4  * granted under this license. 
     4 * granted under this license.
    55 *
    6 * Copyright (c) 2010-2015, ITU/ISO/IEC
     6 * Copyright (c) 2010-2015, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    4848
    4949TComPicSym::TComPicSym()
    50 :m_uiWidthInCU(0)
    51 ,m_uiHeightInCU(0)
    52 ,m_uiMaxCUWidth(0)
    53 ,m_uiMaxCUHeight(0)
     50:m_frameWidthInCtus(0)
     51,m_frameHeightInCtus(0)
    5452,m_uiMinCUWidth(0)
    5553,m_uiMinCUHeight(0)
    5654,m_uhTotalDepth(0)
    57 ,m_uiNumPartitions(0)
    58 ,m_uiNumPartInWidth(0)
    59 ,m_uiNumPartInHeight(0)
    60 ,m_uiNumCUsInFrame(0)
    61 ,m_apcTComSlice(NULL)
    62 ,m_uiNumAllocatedSlice (0)
    63 ,m_apcTComDataCU (NULL)
    64 ,m_iNumColumnsMinus1 (0)
    65 ,m_iNumRowsMinus1(0)
    66 ,m_puiCUOrderMap(0)
     55,m_numPartitionsInCtu(0)
     56,m_numPartInCtuWidth(0)
     57,m_numPartInCtuHeight(0)
     58,m_numCtusInFrame(0)
     59,m_apSlices()
     60,m_pictureCtuArray(NULL)
     61,m_numTileColumnsMinus1(0)
     62,m_numTileRowsMinus1(0)
     63,m_ctuTsToRsAddrMap(NULL)
    6764,m_puiTileIdxMap(NULL)
    68 ,m_puiInverseCUOrderMap(NULL)
     65,m_ctuRsToTsAddrMap(NULL)
    6966,m_saoBlkParams(NULL)
    70 {};
    71 
    72 
    73 Void TComPicSym::create  ( Int iPicWidth, Int iPicHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth )
     67#if ADAPTIVE_QP_SELECTION
     68,m_pParentARLBuffer(NULL)
     69#endif
     70{}
     71
     72
     73Void TComPicSym::create  ( const TComSPS &sps, const TComPPS &pps, UInt uiMaxDepth )
    7474{
    7575  UInt i;
    76 
    77   m_uhTotalDepth      = uiMaxDepth;
    78   m_uiNumPartitions   = 1<<(m_uhTotalDepth<<1);
    79  
    80   m_uiMaxCUWidth      = uiMaxWidth;
    81   m_uiMaxCUHeight     = uiMaxHeight;
    82  
    83   m_uiMinCUWidth      = uiMaxWidth  >> m_uhTotalDepth;
    84   m_uiMinCUHeight     = uiMaxHeight >> m_uhTotalDepth;
    85  
    86   m_uiNumPartInWidth  = m_uiMaxCUWidth  / m_uiMinCUWidth;
    87   m_uiNumPartInHeight = m_uiMaxCUHeight / m_uiMinCUHeight;
    88  
    89   m_uiWidthInCU       = ( iPicWidth %m_uiMaxCUWidth  ) ? iPicWidth /m_uiMaxCUWidth  + 1 : iPicWidth /m_uiMaxCUWidth;
    90   m_uiHeightInCU      = ( iPicHeight%m_uiMaxCUHeight ) ? iPicHeight/m_uiMaxCUHeight + 1 : iPicHeight/m_uiMaxCUHeight;
    91  
    92   m_uiNumCUsInFrame   = m_uiWidthInCU * m_uiHeightInCU;
    93   m_apcTComDataCU     = new TComDataCU*[m_uiNumCUsInFrame];
    94  
    95   if (m_uiNumAllocatedSlice>0)
    96   {
    97     for ( i=0; i<m_uiNumAllocatedSlice ; i++ )
    98     {
    99       delete m_apcTComSlice[i];
    100     }
    101     delete [] m_apcTComSlice;
    102   }
    103   m_apcTComSlice      = new TComSlice*[m_uiNumCUsInFrame];
    104   m_apcTComSlice[0]   = new TComSlice;
    105   m_uiNumAllocatedSlice = 1;
    106   for ( i=0; i<m_uiNumCUsInFrame ; i++ )
    107   {
    108     m_apcTComDataCU[i] = new TComDataCU;
    109     m_apcTComDataCU[i]->create( m_uiNumPartitions, m_uiMaxCUWidth, m_uiMaxCUHeight, false, m_uiMaxCUWidth >> m_uhTotalDepth
     76  m_sps = sps;
     77  m_pps = pps;
     78
     79  const ChromaFormat chromaFormatIDC = sps.getChromaFormatIdc();
     80  const Int iPicWidth      = sps.getPicWidthInLumaSamples();
     81  const Int iPicHeight     = sps.getPicHeightInLumaSamples();
     82  const UInt uiMaxCuWidth  = sps.getMaxCUWidth();
     83  const UInt uiMaxCuHeight = sps.getMaxCUHeight();
     84
     85  m_uhTotalDepth       = uiMaxDepth;
     86  m_numPartitionsInCtu = 1<<(m_uhTotalDepth<<1);
     87
     88  m_uiMinCUWidth       = uiMaxCuWidth  >> m_uhTotalDepth;
     89  m_uiMinCUHeight      = uiMaxCuHeight >> m_uhTotalDepth;
     90
     91  m_numPartInCtuWidth  = uiMaxCuWidth  / m_uiMinCUWidth;  // equivalent to 1<<m_uhTotalDepth
     92  m_numPartInCtuHeight = uiMaxCuHeight / m_uiMinCUHeight; // equivalent to 1<<m_uhTotalDepth
     93
     94  m_frameWidthInCtus   = ( iPicWidth %uiMaxCuWidth  ) ? iPicWidth /uiMaxCuWidth  + 1 : iPicWidth /uiMaxCuWidth;
     95  m_frameHeightInCtus  = ( iPicHeight%uiMaxCuHeight ) ? iPicHeight/uiMaxCuHeight + 1 : iPicHeight/uiMaxCuHeight;
     96
     97  m_numCtusInFrame     = m_frameWidthInCtus * m_frameHeightInCtus;
     98  m_pictureCtuArray    = new TComDataCU*[m_numCtusInFrame];
     99
     100  clearSliceBuffer();
     101  allocateNewSlice();
     102
    110103#if ADAPTIVE_QP_SELECTION
    111       , true
    112 #endif     
     104  if (m_pParentARLBuffer == NULL)
     105  {
     106     m_pParentARLBuffer = new TCoeff[uiMaxCuWidth*uiMaxCuHeight*MAX_NUM_COMPONENT];
     107  }
     108#endif
     109
     110  for ( i=0; i<m_numCtusInFrame ; i++ )
     111  {
     112    m_pictureCtuArray[i] = new TComDataCU;
     113    m_pictureCtuArray[i]->create( chromaFormatIDC, m_numPartitionsInCtu, uiMaxCuWidth, uiMaxCuHeight, false, uiMaxCuWidth >> m_uhTotalDepth
     114#if ADAPTIVE_QP_SELECTION
     115      , m_pParentARLBuffer
     116#endif
    113117      );
    114118  }
    115119
    116   m_puiCUOrderMap = new UInt[m_uiNumCUsInFrame+1];
    117   m_puiTileIdxMap = new UInt[m_uiNumCUsInFrame];
    118   m_puiInverseCUOrderMap = new UInt[m_uiNumCUsInFrame+1];
    119 
    120   for( i=0; i<m_uiNumCUsInFrame; i++ )
    121   {
    122     m_puiCUOrderMap[i] = i;
    123     m_puiInverseCUOrderMap[i] = i;
    124   }
    125 
    126   m_saoBlkParams = new SAOBlkParam[m_uiNumCUsInFrame];
     120  m_ctuTsToRsAddrMap = new UInt[m_numCtusInFrame+1];
     121  m_puiTileIdxMap    = new UInt[m_numCtusInFrame];
     122  m_ctuRsToTsAddrMap = new UInt[m_numCtusInFrame+1];
     123
     124  for( i=0; i<m_numCtusInFrame; i++ )
     125  {
     126    m_ctuTsToRsAddrMap[i] = i;
     127    m_ctuRsToTsAddrMap[i] = i;
     128  }
     129
     130  m_saoBlkParams = new SAOBlkParam[m_numCtusInFrame];
     131
     132
     133  xInitTiles();
     134  xInitCtuTsRsAddrMaps();
     135
    127136}
    128137
    129138Void TComPicSym::destroy()
    130139{
    131   if (m_uiNumAllocatedSlice>0)
    132   {
    133     for (Int i = 0; i<m_uiNumAllocatedSlice ; i++ )
    134     {
    135       delete m_apcTComSlice[i];
    136     }
    137     delete [] m_apcTComSlice;
    138   }
    139   m_apcTComSlice = NULL;
    140  
    141   for (Int i = 0; i < m_uiNumCUsInFrame; i++)
    142   {
    143     m_apcTComDataCU[i]->destroy();
    144     delete m_apcTComDataCU[i];
    145     m_apcTComDataCU[i] = NULL;
    146   }
    147   delete [] m_apcTComDataCU;
    148   m_apcTComDataCU = NULL;
    149 
    150   delete [] m_puiCUOrderMap;
    151   m_puiCUOrderMap = NULL;
     140  clearSliceBuffer();
     141
     142  for (Int i = 0; i < m_numCtusInFrame; i++)
     143  {
     144    m_pictureCtuArray[i]->destroy();
     145    delete m_pictureCtuArray[i];
     146    m_pictureCtuArray[i] = NULL;
     147  }
     148  delete [] m_pictureCtuArray;
     149  m_pictureCtuArray = NULL;
     150
     151  delete [] m_ctuTsToRsAddrMap;
     152  m_ctuTsToRsAddrMap = NULL;
    152153
    153154  delete [] m_puiTileIdxMap;
    154155  m_puiTileIdxMap = NULL;
    155156
    156   delete [] m_puiInverseCUOrderMap;
    157   m_puiInverseCUOrderMap = NULL;
    158  
     157  delete [] m_ctuRsToTsAddrMap;
     158  m_ctuRsToTsAddrMap = NULL;
     159
    159160  if(m_saoBlkParams)
    160161  {
    161162    delete[] m_saoBlkParams; m_saoBlkParams = NULL;
    162163  }
     164
     165#if ADAPTIVE_QP_SELECTION
     166  delete [] m_pParentARLBuffer;
     167  m_pParentARLBuffer = NULL;
     168#endif
    163169}
    164170
    165171Void TComPicSym::allocateNewSlice()
    166172{
    167   assert ((m_uiNumAllocatedSlice + 1) <= m_uiNumCUsInFrame);
    168   m_apcTComSlice[m_uiNumAllocatedSlice ++] = new TComSlice;
    169   if (m_uiNumAllocatedSlice>=2)
    170   {
    171     m_apcTComSlice[m_uiNumAllocatedSlice-1]->copySliceInfo( m_apcTComSlice[m_uiNumAllocatedSlice-2] );
    172     m_apcTComSlice[m_uiNumAllocatedSlice-1]->initSlice();
     173  m_apSlices.push_back(new TComSlice);
     174  m_apSlices.back()->setPPS(&m_pps);
     175  m_apSlices.back()->setSPS(&m_sps);
     176  if (m_apSlices.size()>=2)
     177  {
     178    m_apSlices.back()->copySliceInfo( m_apSlices[m_apSlices.size()-2] );
     179    m_apSlices.back()->initSlice();
    173180  }
    174181}
     
    176183Void TComPicSym::clearSliceBuffer()
    177184{
    178   UInt i;
    179   for (i = 1; i < m_uiNumAllocatedSlice; i++)
    180   {
    181     delete m_apcTComSlice[i];
    182   }
    183   m_uiNumAllocatedSlice = 1;
    184 }
    185 
    186 UInt TComPicSym::getPicSCUEncOrder( UInt SCUAddr )
    187 {
    188   return getInverseCUOrderMap(SCUAddr/m_uiNumPartitions)*m_uiNumPartitions + SCUAddr%m_uiNumPartitions;
    189 }
    190 
    191 UInt TComPicSym::getPicSCUAddr( UInt SCUEncOrder )
    192 {
    193   return getCUOrderMap(SCUEncOrder/m_uiNumPartitions)*m_uiNumPartitions + SCUEncOrder%m_uiNumPartitions;
    194 }
    195 
    196 Void TComPicSym::initTiles(TComPPS *pps)
     185  for (UInt i = 0; i < UInt(m_apSlices.size()); i++)
     186  {
     187    delete m_apSlices[i];
     188  }
     189  m_apSlices.clear();
     190}
     191
     192Void TComPicSym::xInitCtuTsRsAddrMaps()
     193{
     194  //generate the Coding Order Map and Inverse Coding Order Map
     195  for(Int ctuTsAddr=0, ctuRsAddr=0; ctuTsAddr<getNumberOfCtusInFrame(); ctuTsAddr++, ctuRsAddr = xCalculateNextCtuRSAddr(ctuRsAddr))
     196  {
     197    setCtuTsToRsAddrMap(ctuTsAddr, ctuRsAddr);
     198    setCtuRsToTsAddrMap(ctuRsAddr, ctuTsAddr);
     199  }
     200  setCtuTsToRsAddrMap(getNumberOfCtusInFrame(), getNumberOfCtusInFrame());
     201  setCtuRsToTsAddrMap(getNumberOfCtusInFrame(), getNumberOfCtusInFrame());
     202}
     203
     204Void TComPicSym::xInitTiles()
    197205{
    198206  //set NumColumnsMinus1 and NumRowsMinus1
    199   setNumColumnsMinus1( pps->getNumTileColumnsMinus1() );
    200   setNumRowsMinus1( pps->getTileNumRowsMinus1() );
    201 
    202   const Int numCols = pps->getNumTileColumnsMinus1() + 1;
    203   const Int numRows = pps->getTileNumRowsMinus1() + 1;
     207  setNumTileColumnsMinus1( m_pps.getNumTileColumnsMinus1() );
     208  setNumTileRowsMinus1(    m_pps.getNumTileRowsMinus1()    );
     209
     210  const Int numCols = m_pps.getNumTileColumnsMinus1() + 1;
     211  const Int numRows = m_pps.getNumTileRowsMinus1() + 1;
    204212  const Int numTiles = numRows * numCols;
    205213
     
    207215  m_tileParameters.resize(numTiles);
    208216
    209   if( pps->getTileUniformSpacingFlag() )
     217  if( m_pps.getTileUniformSpacingFlag() )
    210218  {
    211219    //set width and height for each (uniform) tile
     
    215223      {
    216224        const Int tileIdx = row * numCols + col;
    217         m_tileParameters[tileIdx].setTileWidth( (col+1)*getFrameWidthInCU()/numCols
    218                                               - (col*getFrameWidthInCU())/numCols );
    219         m_tileParameters[tileIdx].setTileHeight( (row+1)*getFrameHeightInCU()/numRows
    220                                                - (row*getFrameHeightInCU())/numRows );
     225        m_tileParameters[tileIdx].setTileWidthInCtus(  (col+1)*getFrameWidthInCtus( )/numCols - (col*getFrameWidthInCtus( ))/numCols );
     226        m_tileParameters[tileIdx].setTileHeightInCtus( (row+1)*getFrameHeightInCtus()/numRows - (row*getFrameHeightInCtus())/numRows );
    221227      }
    222228    }
     
    228234    {
    229235      Int cumulativeTileWidth = 0;
    230       for(Int col=0; col < getNumColumnsMinus1(); col++)
    231   {
    232         m_tileParameters[row * numCols + col].setTileWidth( pps->getTileColumnWidth(col) );
    233         cumulativeTileWidth += pps->getTileColumnWidth(col);
    234   }
    235       m_tileParameters[row * numCols + getNumColumnsMinus1()].setTileWidth( getFrameWidthInCU()-cumulativeTileWidth );
    236 }
     236      for(Int col=0; col < getNumTileColumnsMinus1(); col++)
     237      {
     238        m_tileParameters[row * numCols + col].setTileWidthInCtus( m_pps.getTileColumnWidth(col) );
     239        cumulativeTileWidth += m_pps.getTileColumnWidth(col);
     240      }
     241      m_tileParameters[row * numCols + getNumTileColumnsMinus1()].setTileWidthInCtus( getFrameWidthInCtus()-cumulativeTileWidth );
     242    }
    237243
    238244    //set the height for each tile
    239245    for(Int col=0; col < numCols; col++)
    240 {
     246    {
    241247      Int cumulativeTileHeight = 0;
    242       for(Int row=0; row < getNumRowsMinus1(); row++)
    243       {
    244         m_tileParameters[row * numCols + col].setTileHeight( pps->getTileRowHeight(row) );
    245         cumulativeTileHeight += pps->getTileRowHeight(row);
    246       }
    247       m_tileParameters[getNumRowsMinus1() * numCols + col].setTileHeight( getFrameHeightInCU()-cumulativeTileHeight );
    248     }
    249   }
    250 
    251 #if TILE_SIZE_CHECK
     248      for(Int row=0; row < getNumTileRowsMinus1(); row++)
     249      {
     250        m_tileParameters[row * numCols + col].setTileHeightInCtus( m_pps.getTileRowHeight(row) );
     251        cumulativeTileHeight += m_pps.getTileRowHeight(row);
     252      }
     253      m_tileParameters[getNumTileRowsMinus1() * numCols + col].setTileHeightInCtus( getFrameHeightInCtus()-cumulativeTileHeight );
     254    }
     255  }
     256
     257  // Tile size check
    252258  Int minWidth  = 1;
    253259  Int minHeight = 1;
    254   const Int profileIdc = pps->getSPS()->getPTL()->getGeneralPTL()->getProfileIdc();
    255   if (  profileIdc == Profile::MAIN || profileIdc == Profile::MAIN10)
    256   {
    257     if (pps->getTilesEnabledFlag())
    258     {
    259       minHeight = 64  / g_uiMaxCUHeight;
    260       minWidth  = 256 / g_uiMaxCUWidth;
     260  const Int profileIdc = m_sps.getPTL()->getGeneralPTL()->getProfileIdc();
     261  if (  profileIdc == Profile::MAIN || profileIdc == Profile::MAIN10) //TODO: add more profiles to the tile-size check...
     262  {
     263    if (m_pps.getTilesEnabledFlag())
     264    {
     265      minHeight = 64  / m_sps.getMaxCUHeight();
     266      minWidth  = 256 / m_sps.getMaxCUWidth();
    261267    }
    262268  }
     
    266272    {
    267273      const Int tileIdx = row * numCols + col;
    268       assert (m_tileParameters[tileIdx].getTileWidth() >= minWidth);
    269       assert (m_tileParameters[tileIdx].getTileHeight() >= minHeight);
    270     }
    271   }
    272 #endif
     274      assert (m_tileParameters[tileIdx].getTileWidthInCtus() >= minWidth);
     275      assert (m_tileParameters[tileIdx].getTileHeightInCtus() >= minHeight);
     276    }
     277  }
    273278
    274279  //initialize each tile of the current picture
     
    283288      for( Int i=0; i <= col; i++ )
    284289      {
    285         rightEdgePosInCTU += m_tileParameters[row * numCols + i].getTileWidth();
    286       }
    287       m_tileParameters[tileIdx].setRightEdgePosInCU(rightEdgePosInCTU-1);
     290        rightEdgePosInCTU += m_tileParameters[row * numCols + i].getTileWidthInCtus();
     291      }
     292      m_tileParameters[tileIdx].setRightEdgePosInCtus(rightEdgePosInCTU-1);
    288293
    289294      //initialize the BottomEdgePosInCU for each tile
     
    291296      for( Int i=0; i <= row; i++ )
    292297      {
    293         bottomEdgePosInCTU += m_tileParameters[i * numCols + col].getTileHeight();
    294       }
    295       m_tileParameters[tileIdx].setBottomEdgePosInCU(bottomEdgePosInCTU-1);
     298        bottomEdgePosInCTU += m_tileParameters[i * numCols + col].getTileHeightInCtus();
     299      }
     300      m_tileParameters[tileIdx].setBottomEdgePosInCtus(bottomEdgePosInCTU-1);
    296301
    297302      //initialize the FirstCUAddr for each tile
    298       m_tileParameters[tileIdx].setFirstCUAddr( (m_tileParameters[tileIdx].getBottomEdgePosInCU() - m_tileParameters[tileIdx].getTileHeight() + 1) * getFrameWidthInCU() +
    299                                                  m_tileParameters[tileIdx].getRightEdgePosInCU() - m_tileParameters[tileIdx].getTileWidth() + 1);
     303      m_tileParameters[tileIdx].setFirstCtuRsAddr( (m_tileParameters[tileIdx].getBottomEdgePosInCtus() - m_tileParameters[tileIdx].getTileHeightInCtus() + 1) * getFrameWidthInCtus() +
     304                                                    m_tileParameters[tileIdx].getRightEdgePosInCtus()  - m_tileParameters[tileIdx].getTileWidthInCtus() + 1);
    300305    }
    301306  }
     
    305310
    306311  //initialize the TileIdxMap
    307   for( Int i=0; i<m_uiNumCUsInFrame; i++)
     312  for( Int i=0; i<m_numCtusInFrame; i++)
    308313  {
    309314    for( Int col=0; col < numCols; col++)
    310315    {
    311       if(i % getFrameWidthInCU() <= m_tileParameters[col].getRightEdgePosInCU())
     316      if(i % getFrameWidthInCtus() <= m_tileParameters[col].getRightEdgePosInCtus())
    312317      {
    313318        columnIdx = col;
     
    317322    for(Int row=0; row < numRows; row++)
    318323    {
    319       if(i / getFrameWidthInCU() <= m_tileParameters[row*numCols].getBottomEdgePosInCU())
     324      if(i / getFrameWidthInCtus() <= m_tileParameters[row*numCols].getBottomEdgePosInCtus())
    320325      {
    321326        rowIdx = row;
     
    325330    m_puiTileIdxMap[i] = rowIdx * numCols + columnIdx;
    326331  }
    327 
    328 }
    329 
    330 UInt TComPicSym::xCalculateNxtCUAddr( UInt uiCurrCUAddr )
    331 {
    332   UInt  uiNxtCUAddr;
    333   UInt  uiTileIdx;
    334  
    335   //get the tile index for the current LCU
    336   uiTileIdx = this->getTileIdxMap(uiCurrCUAddr);
    337 
    338   //get the raster scan address for the next LCU
    339   if( uiCurrCUAddr % m_uiWidthInCU == this->getTComTile(uiTileIdx)->getRightEdgePosInCU() && uiCurrCUAddr / m_uiWidthInCU == this->getTComTile(uiTileIdx)->getBottomEdgePosInCU() )
    340   //the current LCU is the last LCU of the tile
    341   {
    342     if(uiTileIdx == (m_iNumColumnsMinus1+1)*(m_iNumRowsMinus1+1)-1)
    343     {
    344       uiNxtCUAddr = m_uiNumCUsInFrame;
     332}
     333UInt TComPicSym::xCalculateNextCtuRSAddr( UInt currCtuRsAddr )
     334{
     335  UInt  nextCtuRsAddr;
     336
     337  //get the tile index for the current CTU
     338  const UInt uiTileIdx = getTileIdxMap(currCtuRsAddr);
     339
     340  //get the raster scan address for the next CTU
     341  if( currCtuRsAddr % m_frameWidthInCtus == getTComTile(uiTileIdx)->getRightEdgePosInCtus() && currCtuRsAddr / m_frameWidthInCtus == getTComTile(uiTileIdx)->getBottomEdgePosInCtus() )
     342  //the current CTU is the last CTU of the tile
     343  {
     344    if(uiTileIdx+1 == getNumTiles())
     345    {
     346      nextCtuRsAddr = m_numCtusInFrame;
    345347    }
    346348    else
    347349    {
    348       uiNxtCUAddr = this->getTComTile(uiTileIdx+1)->getFirstCUAddr();
    349     }
    350   } 
    351   else //the current LCU is not the last LCU of the tile
    352   {
    353     if( uiCurrCUAddr % m_uiWidthInCU == this->getTComTile(uiTileIdx)->getRightEdgePosInCU() )  //the current LCU is on the rightmost edge of the tile
    354     {
    355       uiNxtCUAddr = uiCurrCUAddr + m_uiWidthInCU - this->getTComTile(uiTileIdx)->getTileWidth() + 1;
     350      nextCtuRsAddr = getTComTile(uiTileIdx+1)->getFirstCtuRsAddr();
     351    }
     352  }
     353  else //the current CTU is not the last CTU of the tile
     354  {
     355    if( currCtuRsAddr % m_frameWidthInCtus == getTComTile(uiTileIdx)->getRightEdgePosInCtus() )  //the current CTU is on the rightmost edge of the tile
     356    {
     357      nextCtuRsAddr = currCtuRsAddr + m_frameWidthInCtus - getTComTile(uiTileIdx)->getTileWidthInCtus() + 1;
    356358    }
    357359    else
    358360    {
    359       uiNxtCUAddr = uiCurrCUAddr + 1;
    360     }
    361   }
    362 
    363   return uiNxtCUAddr;
    364 }
    365 
    366 Void TComPicSym::deriveLoopFilterBoundaryAvailibility(Int ctu,
     361      nextCtuRsAddr = currCtuRsAddr + 1;
     362    }
     363  }
     364
     365  return nextCtuRsAddr;
     366}
     367
     368Void TComPicSym::deriveLoopFilterBoundaryAvailibility(Int ctuRsAddr,
    367369                                                      Bool& isLeftAvail,
    368370                                                      Bool& isRightAvail,
     
    376378{
    377379
    378   isLeftAvail      = (ctu % m_uiWidthInCU != 0);
    379   isRightAvail     = (ctu % m_uiWidthInCU != m_uiWidthInCU-1);
    380   isAboveAvail     = (ctu >= m_uiWidthInCU );
    381   isBelowAvail     = (ctu <  m_uiNumCUsInFrame - m_uiWidthInCU);
     380  isLeftAvail      = (ctuRsAddr % m_frameWidthInCtus != 0);
     381  isRightAvail     = (ctuRsAddr % m_frameWidthInCtus != m_frameWidthInCtus-1);
     382  isAboveAvail     = (ctuRsAddr >= m_frameWidthInCtus );
     383  isBelowAvail     = (ctuRsAddr <  m_numCtusInFrame - m_frameWidthInCtus);
    382384  isAboveLeftAvail = (isAboveAvail && isLeftAvail);
    383385  isAboveRightAvail= (isAboveAvail && isRightAvail);
     
    385387  isBelowRightAvail= (isBelowAvail && isRightAvail);
    386388
    387   Bool isLoopFiltAcrossTilePPS = getCU(ctu)->getSlice()->getPPS()->getLoopFilterAcrossTilesEnabledFlag();
    388 
    389   {
    390     TComDataCU* ctuCurr  = getCU(ctu);
    391     TComDataCU* ctuLeft  = isLeftAvail ?getCU(ctu-1):NULL;
    392     TComDataCU* ctuRight = isRightAvail?getCU(ctu+1):NULL;
    393     TComDataCU* ctuAbove = isAboveAvail?getCU(ctu-m_uiWidthInCU):NULL;
    394     TComDataCU* ctuBelow = isBelowAvail?getCU(ctu+m_uiWidthInCU):NULL;
    395     TComDataCU* ctuAboveLeft  = isAboveLeftAvail ? getCU(ctu-m_uiWidthInCU-1):NULL;
    396     TComDataCU* ctuAboveRigtht= isAboveRightAvail? getCU(ctu-m_uiWidthInCU+1):NULL;
    397     TComDataCU* ctuBelowLeft  = isBelowLeftAvail ? getCU(ctu+m_uiWidthInCU-1):NULL;
    398     TComDataCU* ctuBelowRight = isBelowRightAvail? getCU(ctu+m_uiWidthInCU+1):NULL;
     389  Bool isLoopFiltAcrossTilePPS = getCtu(ctuRsAddr)->getSlice()->getPPS()->getLoopFilterAcrossTilesEnabledFlag();
     390
     391  {
     392    TComDataCU* ctuCurr  = getCtu(ctuRsAddr);
     393    TComDataCU* ctuLeft  = isLeftAvail ?getCtu(ctuRsAddr-1):NULL;
     394    TComDataCU* ctuRight = isRightAvail?getCtu(ctuRsAddr+1):NULL;
     395    TComDataCU* ctuAbove = isAboveAvail?getCtu(ctuRsAddr-m_frameWidthInCtus):NULL;
     396    TComDataCU* ctuBelow = isBelowAvail?getCtu(ctuRsAddr+m_frameWidthInCtus):NULL;
     397    TComDataCU* ctuAboveLeft  = isAboveLeftAvail ? getCtu(ctuRsAddr-m_frameWidthInCtus-1):NULL;
     398    TComDataCU* ctuAboveRight = isAboveRightAvail? getCtu(ctuRsAddr-m_frameWidthInCtus+1):NULL;
     399    TComDataCU* ctuBelowLeft  = isBelowLeftAvail ? getCtu(ctuRsAddr+m_frameWidthInCtus-1):NULL;
     400    TComDataCU* ctuBelowRight = isBelowRightAvail? getCtu(ctuRsAddr+m_frameWidthInCtus+1):NULL;
    399401
    400402    {
     
    402404      if(ctuLeft != NULL)
    403405      {
    404         isLeftAvail = (ctuCurr->getSlice()->getSliceCurStartCUAddr() != ctuLeft->getSlice()->getSliceCurStartCUAddr())?ctuCurr->getSlice()->getLFCrossSliceBoundaryFlag():true;
     406        isLeftAvail = (ctuCurr->getSlice()->getSliceCurStartCtuTsAddr() != ctuLeft->getSlice()->getSliceCurStartCtuTsAddr())?ctuCurr->getSlice()->getLFCrossSliceBoundaryFlag():true;
    405407      }
    406408      //above
    407409      if(ctuAbove != NULL)
    408410      {
    409         isAboveAvail = (ctuCurr->getSlice()->getSliceCurStartCUAddr() != ctuAbove->getSlice()->getSliceCurStartCUAddr())?ctuCurr->getSlice()->getLFCrossSliceBoundaryFlag():true;
     411        isAboveAvail = (ctuCurr->getSlice()->getSliceCurStartCtuTsAddr() != ctuAbove->getSlice()->getSliceCurStartCtuTsAddr())?ctuCurr->getSlice()->getLFCrossSliceBoundaryFlag():true;
    410412      }
    411413      //right
    412414      if(ctuRight != NULL)
    413415      {
    414         isRightAvail = (ctuCurr->getSlice()->getSliceCurStartCUAddr() != ctuRight->getSlice()->getSliceCurStartCUAddr())?ctuRight->getSlice()->getLFCrossSliceBoundaryFlag():true;
     416        isRightAvail = (ctuCurr->getSlice()->getSliceCurStartCtuTsAddr() != ctuRight->getSlice()->getSliceCurStartCtuTsAddr())?ctuRight->getSlice()->getLFCrossSliceBoundaryFlag():true;
    415417      }
    416418      //below
    417419      if(ctuBelow != NULL)
    418420      {
    419         isBelowAvail = (ctuCurr->getSlice()->getSliceCurStartCUAddr() != ctuBelow->getSlice()->getSliceCurStartCUAddr())?ctuBelow->getSlice()->getLFCrossSliceBoundaryFlag():true;
     421        isBelowAvail = (ctuCurr->getSlice()->getSliceCurStartCtuTsAddr() != ctuBelow->getSlice()->getSliceCurStartCtuTsAddr())?ctuBelow->getSlice()->getLFCrossSliceBoundaryFlag():true;
    420422      }
    421423      //above-left
    422424      if(ctuAboveLeft != NULL)
    423425      {
    424         isAboveLeftAvail = (ctuCurr->getSlice()->getSliceCurStartCUAddr() != ctuAboveLeft->getSlice()->getSliceCurStartCUAddr())?ctuCurr->getSlice()->getLFCrossSliceBoundaryFlag():true;
     426        isAboveLeftAvail = (ctuCurr->getSlice()->getSliceCurStartCtuTsAddr() != ctuAboveLeft->getSlice()->getSliceCurStartCtuTsAddr())?ctuCurr->getSlice()->getLFCrossSliceBoundaryFlag():true;
    425427      }
    426428      //below-right
    427429      if(ctuBelowRight != NULL)
    428 {
    429         isBelowRightAvail = (ctuCurr->getSlice()->getSliceCurStartCUAddr() != ctuBelowRight->getSlice()->getSliceCurStartCUAddr())?ctuBelowRight->getSlice()->getLFCrossSliceBoundaryFlag():true;
    430       }
    431 
     430      {
     431        isBelowRightAvail = (ctuCurr->getSlice()->getSliceCurStartCtuTsAddr() != ctuBelowRight->getSlice()->getSliceCurStartCtuTsAddr())?ctuBelowRight->getSlice()->getLFCrossSliceBoundaryFlag():true;
     432      }
    432433
    433434      //above-right
    434       if(ctuAboveRigtht != NULL)
    435       {
    436         Int curSliceStartEncOrder  = ctuCurr->getSlice()->getSliceCurStartCUAddr();
    437         Int aboveRigthtSliceStartEncOrder = ctuAboveRigtht->getSlice()->getSliceCurStartCUAddr();
    438 
    439         isAboveRightAvail = (curSliceStartEncOrder == aboveRigthtSliceStartEncOrder)?(true):
     435      if(ctuAboveRight != NULL)
     436      {
     437        Int curSliceStartTsAddr  = ctuCurr->getSlice()->getSliceCurStartCtuTsAddr();
     438        Int aboveRightSliceStartTsAddr = ctuAboveRight->getSlice()->getSliceCurStartCtuTsAddr();
     439
     440        isAboveRightAvail = (curSliceStartTsAddr == aboveRightSliceStartTsAddr)?(true):
    440441          (
    441           (curSliceStartEncOrder > aboveRigthtSliceStartEncOrder)?(ctuCurr->getSlice()->getLFCrossSliceBoundaryFlag())
    442           :(ctuAboveRigtht->getSlice()->getLFCrossSliceBoundaryFlag())
    443           );         
     442          (curSliceStartTsAddr > aboveRightSliceStartTsAddr)?(ctuCurr->getSlice()->getLFCrossSliceBoundaryFlag())
     443          :(ctuAboveRight->getSlice()->getLFCrossSliceBoundaryFlag())
     444          );
    444445      }
    445446      //below-left
    446447      if(ctuBelowLeft != NULL)
    447448      {
    448         Int curSliceStartEncOrder  = ctuCurr->getSlice()->getSliceCurStartCUAddr();
    449         Int belowLeftSliceStartEncOrder = ctuBelowLeft->getSlice()->getSliceCurStartCUAddr();
    450 
    451         isBelowLeftAvail = (curSliceStartEncOrder == belowLeftSliceStartEncOrder)?(true):
     449        Int curSliceStartTsAddr       = ctuCurr->getSlice()->getSliceCurStartCtuTsAddr();
     450        Int belowLeftSliceStartTsAddr = ctuBelowLeft->getSlice()->getSliceCurStartCtuTsAddr();
     451
     452        isBelowLeftAvail = (curSliceStartTsAddr == belowLeftSliceStartTsAddr)?(true):
    452453          (
    453           (curSliceStartEncOrder > belowLeftSliceStartEncOrder)?(ctuCurr->getSlice()->getLFCrossSliceBoundaryFlag())
     454          (curSliceStartTsAddr > belowLeftSliceStartTsAddr)?(ctuCurr->getSlice()->getLFCrossSliceBoundaryFlag())
    454455          :(ctuBelowLeft->getSlice()->getLFCrossSliceBoundaryFlag())
    455456          );
    456       }       
     457      }
    457458    }
    458459
    459460    if(!isLoopFiltAcrossTilePPS)
    460     {     
    461       isLeftAvail      = (!isLeftAvail      ) ?false:(getTileIdxMap( ctuLeft->getAddr()         ) == getTileIdxMap( ctu ));
    462       isAboveAvail     = (!isAboveAvail     ) ?false:(getTileIdxMap( ctuAbove->getAddr()        ) == getTileIdxMap( ctu ));
    463       isRightAvail     = (!isRightAvail     ) ?false:(getTileIdxMap( ctuRight->getAddr()        ) == getTileIdxMap( ctu ));
    464       isBelowAvail     = (!isBelowAvail     ) ?false:(getTileIdxMap( ctuBelow->getAddr()        ) == getTileIdxMap( ctu ));
    465       isAboveLeftAvail = (!isAboveLeftAvail ) ?false:(getTileIdxMap( ctuAboveLeft->getAddr()    ) == getTileIdxMap( ctu ));
    466       isAboveRightAvail= (!isAboveRightAvail) ?false:(getTileIdxMap( ctuAboveRigtht->getAddr()  ) == getTileIdxMap( ctu ));
    467       isBelowLeftAvail = (!isBelowLeftAvail ) ?false:(getTileIdxMap( ctuBelowLeft->getAddr()    ) == getTileIdxMap( ctu ));
    468       isBelowRightAvail= (!isBelowRightAvail) ?false:(getTileIdxMap( ctuBelowRight->getAddr()   ) == getTileIdxMap( ctu ));
    469     }
    470   }
    471 
    472 }
     461    {
     462      isLeftAvail      = (!isLeftAvail      ) ?false:(getTileIdxMap( ctuLeft->getCtuRsAddr()         ) == getTileIdxMap( ctuRsAddr ));
     463      isAboveAvail     = (!isAboveAvail     ) ?false:(getTileIdxMap( ctuAbove->getCtuRsAddr()        ) == getTileIdxMap( ctuRsAddr ));
     464      isRightAvail     = (!isRightAvail     ) ?false:(getTileIdxMap( ctuRight->getCtuRsAddr()        ) == getTileIdxMap( ctuRsAddr ));
     465      isBelowAvail     = (!isBelowAvail     ) ?false:(getTileIdxMap( ctuBelow->getCtuRsAddr()        ) == getTileIdxMap( ctuRsAddr ));
     466      isAboveLeftAvail = (!isAboveLeftAvail ) ?false:(getTileIdxMap( ctuAboveLeft->getCtuRsAddr()    ) == getTileIdxMap( ctuRsAddr ));
     467      isAboveRightAvail= (!isAboveRightAvail) ?false:(getTileIdxMap( ctuAboveRight->getCtuRsAddr()   ) == getTileIdxMap( ctuRsAddr ));
     468      isBelowLeftAvail = (!isBelowLeftAvail ) ?false:(getTileIdxMap( ctuBelowLeft->getCtuRsAddr()    ) == getTileIdxMap( ctuRsAddr ));
     469      isBelowRightAvail= (!isBelowRightAvail) ?false:(getTileIdxMap( ctuBelowRight->getCtuRsAddr()   ) == getTileIdxMap( ctuRsAddr ));
     470    }
     471  }
     472
     473}
     474
    473475
    474476TComTile::TComTile()
    475 : m_uiTileWidth         (0)
    476 , m_uiTileHeight        (0)
    477 , m_uiRightEdgePosInCU  (0)
    478 , m_uiBottomEdgePosInCU (0)
    479 , m_uiFirstCUAddr       (0)
    480 
     477: m_tileWidthInCtus     (0)
     478, m_tileHeightInCtus    (0)
     479, m_rightEdgePosInCtus  (0)
     480, m_bottomEdgePosInCtus (0)
     481, m_firstCtuRsAddr      (0)
    481482{
    482483}
Note: See TracChangeset for help on using the changeset viewer.