Ticket #871: HM-9.0-dev_rev3097_no_zigzag_nsqt_scans.patch

File HM-9.0-dev_rev3097_no_zigzag_nsqt_scans.patch, 12.7 KB (added by joel, 10 years ago)
  • Lib/TLibCommon/TComDataCU.cpp

     
    37453745
    37463746  if ( !bIsIntra )
    37473747  {
    3748     uiScanIdx = SCAN_ZIGZAG;
     3748    uiScanIdx = SCAN_DIAG;
    37493749    return uiScanIdx;
    37503750  }
    37513751
     
    37633763  if ( bIsLuma )
    37643764  {
    37653765    uiDirMode = getLumaIntraDir(uiAbsPartIdx);
    3766     uiScanIdx = SCAN_ZIGZAG;
     3766    uiScanIdx = SCAN_DIAG;
    37673767    if (uiCTXIdx >3 && uiCTXIdx < 6) //if multiple scans supported for transform size
    37683768    {
    3769       uiScanIdx = abs((Int) uiDirMode - VER_IDX) < 5 ? 1 : (abs((Int)uiDirMode - HOR_IDX) < 5 ? 2 : 0);
     3769      uiScanIdx = abs((Int) uiDirMode - VER_IDX) < 5 ? SCAN_HOR : (abs((Int)uiDirMode - HOR_IDX) < 5 ? SCAN_VER : SCAN_DIAG);
    37703770    }
    37713771  }
    37723772  else
     
    37813781      // get luma mode from upper-left corner of current CU
    37823782      uiDirMode = getLumaIntraDir((uiAbsPartIdx/numParts)*numParts);
    37833783    }
    3784     uiScanIdx = SCAN_ZIGZAG;
     3784    uiScanIdx = SCAN_DIAG;
    37853785    if (uiCTXIdx >4 && uiCTXIdx < 7) //if multiple scans supported for transform size
    37863786    {
    3787       uiScanIdx = abs((Int) uiDirMode - VER_IDX) < 5 ? 1 : (abs((Int)uiDirMode - HOR_IDX) < 5 ? 2 : 0);
     3787      uiScanIdx = abs((Int) uiDirMode - VER_IDX) < 5 ? SCAN_HOR : (abs((Int)uiDirMode - HOR_IDX) < 5 ? SCAN_VER : SCAN_DIAG);
    37883788    }
    37893789  }
    37903790
  • Lib/TLibCommon/TComRom.cpp

     
    6868    g_auiSigLastScan[0][i] = new UInt[ c*c ];
    6969    g_auiSigLastScan[1][i] = new UInt[ c*c ];
    7070    g_auiSigLastScan[2][i] = new UInt[ c*c ];
    71     g_auiSigLastScan[3][i] = new UInt[ c*c ];
    72     initSigLastScan( g_auiSigLastScan[0][i], g_auiSigLastScan[1][i], g_auiSigLastScan[2][i], g_auiSigLastScan[3][i], c, c, i);
     71    initSigLastScan( g_auiSigLastScan[0][i], g_auiSigLastScan[1][i], g_auiSigLastScan[2][i], c, c, i);
    7372
    7473    c <<= 1;
    7574  } 
     
    8483    delete[] g_auiSigLastScan[0][i];
    8584    delete[] g_auiSigLastScan[1][i];
    8685    delete[] g_auiSigLastScan[2][i];
    87     delete[] g_auiSigLastScan[3][i];
    8886  }
    8987}
    9088
     
    386384// ====================================================================================================================
    387385
    388386// scanning order table
    389 UInt* g_auiSigLastScan[4][ MAX_CU_DEPTH ];
     387UInt* g_auiSigLastScan[ 3 ][ MAX_CU_DEPTH ];
    390388
    391 const UInt g_sigLastScan8x8[ 4 ][ 4 ] =
     389const UInt g_sigLastScan8x8[ 3 ][ 4 ] =
    392390{
    393   {0, 1, 2, 3},
    394   {0, 1, 2, 3},
    395391  {0, 2, 1, 3},
     392  {0, 1, 2, 3},
    396393  {0, 2, 1, 3}
    397394};
    398395UInt g_sigLastScanCG32x32[ 64 ];
     
    411408  8, 7, 6, 5, 4
    412409};
    413410
    414 Void initSigLastScan(UInt* pBuffZ, UInt* pBuffH, UInt* pBuffV, UInt* pBuffD, Int iWidth, Int iHeight, Int iDepth)
     411Void initSigLastScan(UInt* pBuffD, UInt* pBuffH, UInt* pBuffV, Int iWidth, Int iHeight, Int iDepth)
    415412{
    416413  const UInt  uiNumScanPos  = UInt( iWidth * iWidth );
    417414  UInt        uiNextScanPos = 0;
  • Lib/TLibCommon/TComRom.h

     
    6161
    6262Void         initROM();
    6363Void         destroyROM();
    64 Void         initSigLastScan(UInt* pBuffZ, UInt* pBuffH, UInt* pBuffV, UInt* pBuffD, Int iWidth, Int iHeight, Int iDepth);
     64Void         initSigLastScan(UInt* pBuffD, UInt* pBuffH, UInt* pBuffV, Int iWidth, Int iHeight, Int iDepth);
    6565// ====================================================================================================================
    6666// Data structure related table & variable
    6767// ====================================================================================================================
     
    122122// Scanning order & context mapping table
    123123// ====================================================================================================================
    124124
    125 extern       UInt*  g_auiSigLastScan[4][ MAX_CU_DEPTH ];  // raster index from scanning index (zigzag, hor, ver, diag)
     125extern       UInt*  g_auiSigLastScan[ 3 ][ MAX_CU_DEPTH ];  // raster index from scanning index (diag, hor, ver)
    126126
    127127extern const UInt   g_uiGroupIdx[ 32 ];
    128128extern const UInt   g_uiMinInGroup[ 10 ];
     
    130130extern const UInt   g_auiGoRiceRange[5];                  //!< maximum value coded with Rice codes
    131131extern const UInt   g_auiGoRicePrefixLen[5];              //!< prefix length for each maximum value
    132132 
    133 extern const UInt   g_sigLastScan8x8[ 4 ][ 4 ];           //!< coefficient group scan order for 8x8 TUs
     133extern const UInt   g_sigLastScan8x8[ 3 ][ 4 ];           //!< coefficient group scan order for 8x8 TUs
    134134extern       UInt   g_sigLastScanCG32x32[ 64 ];
    135135
    136136// ====================================================================================================================
  • Lib/TLibCommon/TComTrQuant.cpp

     
    10281028    const UInt   log2BlockSize   = g_aucConvertToBit[ iWidth ] + 2;
    10291029
    10301030    UInt scanIdx = pcCU->getCoefScanIdx(uiAbsPartIdx, iWidth, eTType==TEXT_LUMA, pcCU->isIntra(uiAbsPartIdx));
    1031     if (scanIdx == SCAN_ZIGZAG)
    1032     {
    1033       scanIdx = SCAN_DIAG;
    1034     }
    1035 
    10361031    const UInt *scan = g_auiSigLastScan[ scanIdx ][ log2BlockSize - 1 ];
    10371032   
    10381033    Int deltaU[32*32] ;
     
    15401535  Int iAddC =  1 << (iQBitsC-1);
    15411536#endif
    15421537  UInt uiScanIdx = pcCU->getCoefScanIdx(uiAbsPartIdx, uiWidth, eTType==TEXT_LUMA, pcCU->isIntra(uiAbsPartIdx));
    1543   if (uiScanIdx == SCAN_ZIGZAG)
    1544   {
    1545     // Map value zigzag to diagonal scan
    1546     uiScanIdx = SCAN_DIAG;
    1547   }
    1548   Int blockType = uiLog2BlkSize;
    15491538 
    15501539#if ADAPTIVE_QP_SELECTION
    15511540  memset(piArlDstCoeff, 0, sizeof(Int) *  uiMaxNumCoeff);
     
    16581647        {
    16591648          UInt   uiPosY        = uiBlkPos >> uiLog2BlkSize;
    16601649          UInt   uiPosX        = uiBlkPos - ( uiPosY << uiLog2BlkSize );
    1661           UShort uiCtxSig      = getSigCtxInc( patternSigCtx, uiScanIdx, uiPosX, uiPosY, blockType, uiWidth, uiHeight, eTType );
     1650          UShort uiCtxSig      = getSigCtxInc( patternSigCtx, uiScanIdx, uiPosX, uiPosY, uiLog2BlkSize, uiWidth, uiHeight, eTType );
    16621651          uiLevel              = xGetCodedLevel( pdCostCoeff[ iScanPos ], pdCostCoeff0[ iScanPos ], pdCostSig[ iScanPos ],
    16631652                                                lLevelDouble, uiMaxAbsLevel, uiCtxSig, uiOneCtx, uiAbsCtx, uiGoRiceParam,
    16641653                                                c1Idx, c2Idx, iQBits, dTemp, 0 );
     
    20582047 * \param patternSigCtx pattern for current coefficient group
    20592048 * \param posX column of current scan position
    20602049 * \param posY row of current scan position
    2061  * \param blockType log2 value of block size if square block, or 4 otherwise
     2050 * \param log2BlockSize log2 value of block size (square block)
    20622051 * \param width width of the block
    20632052 * \param height height of the block
    20642053 * \param textureType texture type (TEXT_LUMA...)
     
    20692058                                   UInt                            scanIdx,
    20702059                                   Int                             posX,
    20712060                                   Int                             posY,
    2072                                    Int                             blockType,
     2061                                   Int                             log2BlockSize,
    20732062                                   Int                             width
    20742063                                  ,Int                             height
    20752064                                  ,TextType                        textureType
     
    20882077    return 0;
    20892078  }
    20902079
    2091   if ( blockType == 2 )
     2080  if ( log2BlockSize == 2 )
    20922081  {
    20932082    return ctxIndMap[ 4 * posY + posX ];
    20942083  }
    20952084
    2096   Int offset = blockType == 3 ? (scanIdx==SCAN_DIAG ? 9 : 15) : (textureType == TEXT_LUMA ? 21 : 12);
     2085  Int offset = log2BlockSize == 3 ? (scanIdx==SCAN_DIAG ? 9 : 15) : (textureType == TEXT_LUMA ? 21 : 12);
    20972086
    20982087  Int posXinSubset = posX-((posX>>2)<<2);
    20992088  Int posYinSubset = posY-((posY>>2)<<2);
  • Lib/TLibCommon/TComTrQuant.h

     
    169169                                     UInt                            scanIdx,
    170170                                     Int                             posX,
    171171                                     Int                             posY,
    172                                      Int                             blockType,
     172                                     Int                             log2BlkSize,
    173173                                     Int                             width
    174174                                    ,Int                             height
    175175                                    ,TextType                        textureType
  • Lib/TLibCommon/TypeDef.h

     
    509509/// coefficient scanning type used in ACS
    510510enum COEFF_SCAN_TYPE
    511511{
    512   SCAN_ZIGZAG = 0,      ///< typical zigzag scan
    513   SCAN_HOR,             ///< horizontal first scan
    514   SCAN_VER,              ///< vertical first scan
    515   SCAN_DIAG              ///< up-right diagonal scan
     512  SCAN_DIAG = 0,         ///< up-right diagonal scan
     513  SCAN_HOR,              ///< horizontal first scan
     514  SCAN_VER               ///< vertical first scan
    516515};
    517516
    518517namespace Profile
  • Lib/TLibDecoder/TDecSbac.cpp

     
    10761076  const UInt  uiMaxNumCoeff     = uiWidth * uiHeight;
    10771077  const UInt  uiMaxNumCoeffM1   = uiMaxNumCoeff - 1;
    10781078  UInt uiScanIdx = pcCU->getCoefScanIdx(uiAbsPartIdx, uiWidth, eTType==TEXT_LUMA, pcCU->isIntra(uiAbsPartIdx));
    1079   Int blockType = uiLog2BlockSize;
    1080   if (uiWidth != uiHeight)
    1081   {
    1082     uiScanIdx = SCAN_DIAG;
    1083     blockType = 4;
    1084   }
    10851079 
    10861080  //===== decode last significant =====
    10871081  UInt uiPosLastX, uiPosLastY;
     
    10901084  pcCoef[ uiBlkPosLast ] = 1;
    10911085
    10921086  //===== decode significance flags =====
    1093   UInt uiScanPosLast   = uiBlkPosLast;
    1094   if (uiScanIdx == SCAN_ZIGZAG)
    1095   {
    1096     // Map zigzag to diagonal scan
    1097     uiScanIdx = SCAN_DIAG;
    1098   }
    1099   const UInt *scan = g_auiSigLastScan[ uiScanIdx ][ uiLog2BlockSize-1 ];
     1087  UInt uiScanPosLast = uiBlkPosLast;
     1088  const UInt *scan   = g_auiSigLastScan[ uiScanIdx ][ uiLog2BlockSize-1 ];
    11001089  for( uiScanPosLast = 0; uiScanPosLast < uiMaxNumCoeffM1; uiScanPosLast++ )
    11011090  {
    11021091    UInt uiBlkPos = scan[ uiScanPosLast ];
     
    11881177      {
    11891178        if( iScanPosSig > iSubPos || iSubSet == 0  || numNonZero )
    11901179        {
    1191           uiCtxSig  = TComTrQuant::getSigCtxInc( patternSigCtx, uiScanIdx, uiPosX, uiPosY, blockType, uiWidth, uiHeight, eTType );
     1180          uiCtxSig  = TComTrQuant::getSigCtxInc( patternSigCtx, uiScanIdx, uiPosX, uiPosY, uiLog2BlockSize, uiWidth, uiHeight, eTType );
    11921181          m_pcTDecBinIf->decodeBin( uiSig, baseCtx[ uiCtxSig ] );
    11931182        }
    11941183        else
  • Lib/TLibEncoder/TEncSbac.cpp

     
    11311131  eTType = eTType == TEXT_LUMA ? TEXT_LUMA : ( eTType == TEXT_NONE ? TEXT_NONE : TEXT_CHROMA );
    11321132 
    11331133  //----- encode significance map -----
    1134   const UInt   uiLog2BlockSize   = g_aucConvertToBit[ uiWidth ] + 2;
     1134  const UInt   uiLog2BlockSize = g_aucConvertToBit[ uiWidth ] + 2;
    11351135  UInt uiScanIdx = pcCU->getCoefScanIdx(uiAbsPartIdx, uiWidth, eTType==TEXT_LUMA, pcCU->isIntra(uiAbsPartIdx));
    1136   if (uiScanIdx == SCAN_ZIGZAG)
    1137   {
    1138     // Map zigzag to diagonal scan
    1139     uiScanIdx = SCAN_DIAG;
    1140   }
    1141   Int blockType = uiLog2BlockSize;
    1142   if (uiWidth != uiHeight)
    1143   {
    1144     uiScanIdx = SCAN_DIAG;
    1145     blockType = 4;
    1146   }
    1147  
    11481136  const UInt *scan = g_auiSigLastScan[ uiScanIdx ][ uiLog2BlockSize - 1 ];
    11491137 
    11501138  Bool beValid;
     
    12591247          uiSig     = (pcCoef[ uiBlkPos ] != 0);
    12601248          if( iScanPosSig > iSubPos || iSubSet == 0 || numNonZero )
    12611249          {
    1262             uiCtxSig  = TComTrQuant::getSigCtxInc( patternSigCtx, uiScanIdx, uiPosX, uiPosY, blockType, uiWidth, uiHeight, eTType );
     1250            uiCtxSig  = TComTrQuant::getSigCtxInc( patternSigCtx, uiScanIdx, uiPosX, uiPosY, uiLog2BlockSize, uiWidth, uiHeight, eTType );
    12631251            m_pcBinIf->encodeBin( uiSig, baseCtx[ uiCtxSig ] );
    12641252          }
    12651253          if( uiSig )