Ticket #419: 419cleanup.patch

File 419cleanup.patch, 3.4 KB (added by bbross, 12 years ago)

patch with bit-exact cleanup

  • source/Lib/TLibCommon/TComDataCU.cpp

     
    20232023  }
    20242024}
    20252025
    2026 UInt TComDataCU::getQuadtreeTULog2MinSizeInCU( UInt uiIdx )
     2026UInt TComDataCU::getQuadtreeTULog2MinSizeInCU( UInt absPartIdx )
    20272027{
    2028   UInt uiLog2MinTUSizeInCU = g_aucConvertToBit[getWidth( uiIdx )] + 2;
    2029  
    2030   if ( getPredictionMode( uiIdx ) == MODE_INTRA && getPartitionSize( uiIdx ) == SIZE_NxN )
    2031   {
    2032     uiLog2MinTUSizeInCU--;
    2033   }
    2034  
    2035   UInt uiQuadtreeTUMaxDepth = getPredictionMode( uiIdx ) == MODE_INTRA ? m_pcSlice->getSPS()->getQuadtreeTUMaxDepthIntra() : m_pcSlice->getSPS()->getQuadtreeTUMaxDepthInter();
    2036 
    2037   PartSize  partSize  = getPartitionSize( uiIdx );
     2028  UInt log2CbSize = g_aucConvertToBit[getWidth( absPartIdx )] + 2;
     2029  PartSize  partSize  = getPartitionSize( absPartIdx );
     2030  UInt quadtreeTUMaxDepth = getPredictionMode( absPartIdx ) == MODE_INTRA ? m_pcSlice->getSPS()->getQuadtreeTUMaxDepthIntra() : m_pcSlice->getSPS()->getQuadtreeTUMaxDepthInter();
     2031  Int intraSplitFlag = ( getPredictionMode( absPartIdx ) == MODE_INTRA && partSize == SIZE_NxN ) ? 1 : 0;
    20382032#if G519_TU_AMP_NSQT_HARMONIZATION
    2039   Int   SplitFlag = ((uiQuadtreeTUMaxDepth == 1) && (getPredictionMode( uiIdx ) == MODE_INTER) && (partSize != SIZE_2Nx2N) );
     2033  Int interSplitFlag = ((quadtreeTUMaxDepth == 1) && (getPredictionMode( absPartIdx ) == MODE_INTER) && (partSize != SIZE_2Nx2N) );
    20402034#else
    2041   Int   SplitFlag = ((uiQuadtreeTUMaxDepth == 1) && (getPredictionMode( uiIdx ) == MODE_INTER) && (partSize == SIZE_Nx2N || partSize == SIZE_2NxN) );
     2035  Int interSplitFlag = ((quadtreeTUMaxDepth == 1) && (getPredictionMode( absPartIdx ) == MODE_INTER) && (partSize == SIZE_Nx2N || partSize == SIZE_2NxN) );
    20422036#endif
    2043 
    2044   if (uiLog2MinTUSizeInCU < m_pcSlice->getSPS()->getQuadtreeTULog2MinSize() + uiQuadtreeTUMaxDepth - 1 + SplitFlag)
     2037 
     2038  UInt log2MinTUSizeInCU = 0;
     2039  if (log2CbSize < (m_pcSlice->getSPS()->getQuadtreeTULog2MinSize() + quadtreeTUMaxDepth - 1 + interSplitFlag + intraSplitFlag) )
    20452040  {
    2046     uiLog2MinTUSizeInCU = m_pcSlice->getSPS()->getQuadtreeTULog2MinSize(); 
     2041    // when fully making use of signaled TUMaxDepth + inter/intraSplitFlag, resulting luma TB size is < QuadtreeTULog2MinSize
     2042    log2MinTUSizeInCU = m_pcSlice->getSPS()->getQuadtreeTULog2MinSize();
    20472043  }
    20482044  else
    20492045  {
    2050     uiLog2MinTUSizeInCU -= uiQuadtreeTUMaxDepth - 1 + SplitFlag; 
     2046    // when fully making use of signaled TUMaxDepth + inter/intraSplitFlag, resulting luma TB size is still >= QuadtreeTULog2MinSize
     2047    log2MinTUSizeInCU = log2CbSize - ( quadtreeTUMaxDepth - 1 + interSplitFlag + intraSplitFlag); // stop when trafoDepth == hierarchy_depth = splitFlag
     2048    if ( log2MinTUSizeInCU > m_pcSlice->getSPS()->getQuadtreeTULog2MaxSize())
     2049    {
     2050      // when fully making use of signaled TUMaxDepth + inter/intraSplitFlag, resulting luma TB size is still > QuadtreeTULog2MaxSize
     2051      log2MinTUSizeInCU = m_pcSlice->getSPS()->getQuadtreeTULog2MaxSize() - interSplitFlag;
     2052    } 
    20512053  }
    2052  
    2053   if ( uiLog2MinTUSizeInCU > m_pcSlice->getSPS()->getQuadtreeTULog2MaxSize())
    2054   {
    2055     uiLog2MinTUSizeInCU = m_pcSlice->getSPS()->getQuadtreeTULog2MaxSize() - SplitFlag;
    2056   } 
    2057 
    2058   return uiLog2MinTUSizeInCU;
     2054  return log2MinTUSizeInCU;
    20592055}
    20602056
    20612057UInt TComDataCU::getCtxSkipFlag( UInt uiAbsPartIdx )