diff --git a/source/Lib/CommonLib/ContextModelling.h b/source/Lib/CommonLib/ContextModelling.h index 959b45b7c2cc709a0f69af4f75fc827df7bb3867..4f2c0d90327606deffffdf26773083927762a763 100644 --- a/source/Lib/CommonLib/ContextModelling.h +++ b/source/Lib/CommonLib/ContextModelling.h @@ -107,7 +107,11 @@ public: const int diag = posX + posY; int numPos = 0; int sumAbs = 0; +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS +#define UPDATE(x) {int a=abs(x);sumAbs+=std::min(4+(a&1),a);numPos+=!!a;} +#else #define UPDATE(x) {int a=abs(x);sumAbs+=std::min(2+(a&1),a);numPos+=!!a;} +#endif if( posX < m_width-1 ) { UPDATE( pData[1] ); diff --git a/source/Lib/CommonLib/DepQuant.cpp b/source/Lib/CommonLib/DepQuant.cpp index 5bebbf03f73532dcbf9cb95ff72bc93d40d3f455..820920082c726b577d39675070e5048683ce6888 100644 --- a/source/Lib/CommonLib/DepQuant.cpp +++ b/source/Lib/CommonLib/DepQuant.cpp @@ -863,7 +863,11 @@ namespace DQIntern { m_rdCost = std::numeric_limits<int64_t>::max()>>1; m_numSigSbb = 0; +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + m_remRegBins = 4; // just large enough for last scan pos +#else m_remRegBins = 3; // just large enough for last scan pos +#endif m_refSbbCtxId = -1; m_sigFracBits = m_sigFracBitsArray[ 0 ]; m_coeffFracBits = m_gtxFracBitsArray[ 0 ]; @@ -877,7 +881,11 @@ namespace DQIntern int64_t rdCostA = m_rdCost + pqDataA.deltaDist; int64_t rdCostB = m_rdCost + pqDataB.deltaDist; int64_t rdCostZ = m_rdCost; +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + if( m_remRegBins >= 4 ) +#else if( m_remRegBins >= 3 ) +#endif { if( pqDataA.absLevel < 4 ) rdCostA += m_coeffFracBits.bits[pqDataA.absLevel]; @@ -1016,14 +1024,22 @@ namespace DQIntern m_sbbFracBits = prvState->m_sbbFracBits; m_remRegBins = prvState->m_remRegBins - 1; m_goRicePar = prvState->m_goRicePar; +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + if( m_remRegBins >= 4 ) +#else if( m_remRegBins >= 3 ) +#endif { TCoeff rem = (decision.absLevel - 4) >> 1; if( m_goRicePar < 3 && rem > (3<<m_goRicePar)-1 ) { m_goRicePar++; } +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + m_remRegBins -= (decision.absLevel < 2 ? decision.absLevel : 3); +#else m_remRegBins -= std::min<TCoeff>( decision.absLevel, 2 ); +#endif } ::memcpy( m_absLevelsAndCtxInit, prvState->m_absLevelsAndCtxInit, 48*sizeof(uint8_t) ); } @@ -1033,11 +1049,19 @@ namespace DQIntern m_refSbbCtxId = -1; if ( scanInfo.sbbSize == 4 ) { +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + m_remRegBins = MAX_NUM_REG_BINS_2x2SUBBLOCK - (decision.absLevel < 2 ? decision.absLevel : 3); +#else m_remRegBins = MAX_NUM_REG_BINS_2x2SUBBLOCK - MAX_NUM_GT2_BINS_2x2SUBBLOCK - std::min<TCoeff>( decision.absLevel, 2 ); +#endif } else { +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + m_remRegBins = MAX_NUM_REG_BINS_4x4SUBBLOCK - (decision.absLevel < 2 ? decision.absLevel : 3); +#else m_remRegBins = MAX_NUM_REG_BINS_4x4SUBBLOCK - MAX_NUM_GT2_BINS_4x4SUBBLOCK - std::min<TCoeff>( decision.absLevel, 2 ); +#endif } m_goRicePar = ( ((decision.absLevel - 4) >> 1) > (3<<0)-1 ? 1 : 0 ); ::memset( m_absLevelsAndCtxInit, 0, 48*sizeof(uint8_t) ); @@ -1046,12 +1070,20 @@ namespace DQIntern uint8_t* levels = reinterpret_cast<uint8_t*>(m_absLevelsAndCtxInit); levels[ scanInfo.insidePos ] = (uint8_t)std::min<TCoeff>( 255, decision.absLevel ); +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + if (m_remRegBins >= 4) +#else if (m_remRegBins >= 3) +#endif { TCoeff tinit = m_absLevelsAndCtxInit[8 + scanInfo.nextInsidePos]; TCoeff sumAbs1 = (tinit >> 3) & 31; TCoeff sumNum = tinit & 7; +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS +#define UPDATE(k) {TCoeff t=levels[scanInfo.nextNbInfoSbb.inPos[k]]; sumAbs1+=std::min<TCoeff>(4+(t&1),t); sumNum+=!!t; } +#else #define UPDATE(k) {TCoeff t=levels[scanInfo.nextNbInfoSbb.inPos[k]]; sumAbs1+=std::min<TCoeff>(2+(t&1),t); sumNum+=!!t; } +#endif if (numIPos == 1) { UPDATE(0); @@ -1182,11 +1214,19 @@ namespace DQIntern currState.m_numSigSbb = 0; if (scanInfo.sbbSize == 4) { +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + currState.m_remRegBins = MAX_NUM_REG_BINS_2x2SUBBLOCK; +#else currState.m_remRegBins = MAX_NUM_REG_BINS_2x2SUBBLOCK - MAX_NUM_GT2_BINS_2x2SUBBLOCK; +#endif } else { +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + currState.m_remRegBins = MAX_NUM_REG_BINS_4x4SUBBLOCK; +#else currState.m_remRegBins = MAX_NUM_REG_BINS_4x4SUBBLOCK - MAX_NUM_GT2_BINS_4x4SUBBLOCK; +#endif } currState.m_goRicePar = 0; currState.m_refSbbCtxId = currState.m_stateId; @@ -1201,7 +1241,11 @@ namespace DQIntern if( nbOut->num ) { TCoeff sumAbs = 0, sumAbs1 = 0, sumNum = 0; +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS +#define UPDATE(k) {TCoeff t=absLevels[nbOut->outPos[k]]; sumAbs+=t; sumAbs1+=std::min<TCoeff>(4+(t&1),t); sumNum+=!!t; } +#else #define UPDATE(k) {TCoeff t=absLevels[nbOut->outPos[k]]; sumAbs+=t; sumAbs1+=std::min<TCoeff>(2+(t&1),t); sumNum+=!!t; } +#endif UPDATE(0); if( nbOut->num > 1 ) { diff --git a/source/Lib/CommonLib/QuantRDOQ.cpp b/source/Lib/CommonLib/QuantRDOQ.cpp index ff034e11b1faffd033879f16420ad8e7f09905b7..74e2abd9be19f03fcde474b52d39e83e91711b4d 100644 --- a/source/Lib/CommonLib/QuantRDOQ.cpp +++ b/source/Lib/CommonLib/QuantRDOQ.cpp @@ -185,7 +185,11 @@ inline int QuantRDOQ::xGetICRate( const uint32_t uiAbsLevel, const bool useLimitedPrefixLength, const int maxLog2TrDynamicRange ) const { +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + if( remRegBins < 4 ) +#else if( remRegBins < 3 ) +#endif { int iRate = int( xGetIEPRate() ); // cost of sign bit uint32_t symbol = ( uiAbsLevel == 0 ? goRiceZero : uiAbsLevel <= goRiceZero ? uiAbsLevel-1 : uiAbsLevel ); @@ -226,7 +230,11 @@ inline int QuantRDOQ::xGetICRate( const uint32_t uiAbsLevel, } int iRate = int( xGetIEPRate() ); // cost of sign bit +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + const uint32_t cthres = 4; +#else const uint32_t cthres = ( remGt2Bins ? 4 : 2 ); +#endif if( uiAbsLevel >= cthres ) { uint32_t symbol = ( uiAbsLevel - cthres ) >> 1; @@ -266,7 +274,11 @@ inline int QuantRDOQ::xGetICRate( const uint32_t uiAbsLevel, iRate += fracBitsGt1.intBits[1]; iRate += fracBitsPar.intBits[( uiAbsLevel - 2 ) & 1]; +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + if( remRegBins ) +#else if( remGt2Bins ) +#endif { iRate += fracBitsGt2.intBits[1]; } @@ -694,7 +706,11 @@ void QuantRDOQ::xRateDistOptQuant(TransformUnit &tu, const ComponentID &compID, bool is2x2subblock = ( iCGSizeM1 == 3 ); int remGt2Bins = ( is2x2subblock ? MAX_NUM_GT2_BINS_2x2SUBBLOCK : MAX_NUM_GT2_BINS_4x4SUBBLOCK ); - int remRegBins = ( is2x2subblock ? MAX_NUM_REG_BINS_2x2SUBBLOCK : MAX_NUM_REG_BINS_4x4SUBBLOCK ) - remGt2Bins; +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + int remRegBins = ( is2x2subblock ? MAX_NUM_REG_BINS_2x2SUBBLOCK : MAX_NUM_REG_BINS_4x4SUBBLOCK ); +#else + int remRegBins = (is2x2subblock ? MAX_NUM_REG_BINS_2x2SUBBLOCK : MAX_NUM_REG_BINS_4x4SUBBLOCK) - remGt2Bins; +#endif uint32_t goRiceParam = 0; double *pdCostCoeffGroupSig = m_pdCostCoeffGroupSig; @@ -770,7 +786,11 @@ void QuantRDOQ::xRateDistOptQuant(TransformUnit &tu, const ComponentID &compID, uint32_t uiGt1Ctx = cctx.greater1CtxIdAbs ( ctxOffset ); uint32_t uiGt2Ctx = cctx.greater2CtxIdAbs ( ctxOffset ); uint32_t goRiceZero = 0; +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + if( remRegBins < 4 ) +#else if( remRegBins < 3 ) +#endif { unsigned sumAbs = cctx.templateAbsSum( iScanPos, piDstCoeff ); goRiceParam = g_auiGoRiceParsCoeff [ sumAbs ]; @@ -794,7 +814,11 @@ void QuantRDOQ::xRateDistOptQuant(TransformUnit &tu, const ComponentID &compID, uiLevel = xGetCodedLevel( pdCostCoeff[ iScanPos ], pdCostCoeff0[ iScanPos ], pdCostSig[ iScanPos ], lLevelDouble, uiMaxAbsLevel, &fracBitsSig, fracBitsPar, fracBitsGt1, fracBitsGt2, remGt2Bins, remRegBins, goRiceZero, goRiceParam, iQBits, errorScale, 0, extendedPrecision, maxLog2TrDynamicRange ); #if HEVC_USE_SIGN_HIDING +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + sigRateDelta[ uiBlkPos ] = ( remRegBins < 4 ? 0 : fracBitsSig.intBits[1] - fracBitsSig.intBits[0] ); +#else sigRateDelta[ uiBlkPos ] = ( remRegBins < 3 ? 0 : fracBitsSig.intBits[1] - fracBitsSig.intBits[0] ); +#endif #endif } @@ -813,7 +837,11 @@ void QuantRDOQ::xRateDistOptQuant(TransformUnit &tu, const ComponentID &compID, } else // uiLevel == 0 { +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + if( remRegBins < 4 ) +#else if( remRegBins < 3 ) +#endif { int rateNow = xGetICRate( uiLevel, fracBitsPar, fracBitsGt1, fracBitsGt2, remGt2Bins, remRegBins, goRiceZero, goRiceParam, extendedPrecision, maxLog2TrDynamicRange ); rateIncUp [ uiBlkPos ] = xGetICRate( uiLevel+1, fracBitsPar, fracBitsGt1, fracBitsGt2, remGt2Bins, remRegBins, goRiceZero, goRiceParam, extendedPrecision, maxLog2TrDynamicRange ) - rateNow; @@ -833,18 +861,32 @@ void QuantRDOQ::xRateDistOptQuant(TransformUnit &tu, const ComponentID &compID, remRegBins = ( is2x2subblock ? MAX_NUM_REG_BINS_2x2SUBBLOCK : MAX_NUM_REG_BINS_4x4SUBBLOCK ) - remGt2Bins; goRiceParam = 0; } +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + else if( remRegBins >= 4 ) +#else else if( remRegBins >= 3 ) +#endif { +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + const uint32_t baseLevel = 4; +#else const uint32_t baseLevel = ( remGt2Bins ? 4 : 2 ); +#endif if( goRiceParam < 3 && ((uiLevel-baseLevel)>>1) > (3<<goRiceParam)-1 ) { goRiceParam++; } +#if !JVET_M0173_MOVE_GT2_TO_FIRST_PASS if( uiLevel >= 2 && remGt2Bins ) { remGt2Bins--; } +#endif +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + remRegBins -= (uiLevel < 2 ? uiLevel : 3) + (iScanPos != iLastScanPos); +#else remRegBins -= std::min<int>( uiLevel, 2 ) + (iScanPos != iLastScanPos); +#endif } } else diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index db1db01d75eef962e6fb00a2d09dccf31bf73ded..7029ef42ad544a0142db17b439aed082bfcd5a63 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -65,6 +65,8 @@ typedef std::pair<int, int> TrCost; #define JVET_M0421_SPLIT_SIG 1 +#define JVET_M0173_MOVE_GT2_TO_FIRST_PASS 1 // Moving the gtr2 flag to the first coding pass + #define REMOVE_BIN_DECISION_TREE 1 // clang-format off diff --git a/source/Lib/DecoderLib/CABACReader.cpp b/source/Lib/DecoderLib/CABACReader.cpp index 757202d9640bbf98b7bc32264ca4faeb1608a772..c33f746c982d2fbdcca796403e96bd0534122fdd 100644 --- a/source/Lib/DecoderLib/CABACReader.cpp +++ b/source/Lib/DecoderLib/CABACReader.cpp @@ -2536,13 +2536,23 @@ void CABACReader::residual_coding_subblock( CoeffCodingContext& cctx, TCoeff* co #endif int numNonZero = 0; bool is2x2subblock = ( cctx.log2CGSize() == 2 ); +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + int remRegBins = ( is2x2subblock ? MAX_NUM_REG_BINS_2x2SUBBLOCK : MAX_NUM_REG_BINS_4x4SUBBLOCK ); +#else int remGt2Bins = ( is2x2subblock ? MAX_NUM_GT2_BINS_2x2SUBBLOCK : MAX_NUM_GT2_BINS_4x4SUBBLOCK ); int remRegBins = ( is2x2subblock ? MAX_NUM_REG_BINS_2x2SUBBLOCK : MAX_NUM_REG_BINS_4x4SUBBLOCK ) - remGt2Bins; +#endif int firstPosMode2 = minSubPos - 1; +#if !JVET_M0173_MOVE_GT2_TO_FIRST_PASS int firstPosMode1 = minSubPos - 1; +#endif int sigBlkPos[ 1 << MLS_CG_SIZE ]; +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + for( ; nextSigPos >= minSubPos && remRegBins >= 4; nextSigPos-- ) +#else for( ; nextSigPos >= minSubPos && remRegBins >= 3; nextSigPos-- ) +#endif { int blkPos = cctx.blockPos( nextSigPos ); unsigned sigFlag = ( !numNonZero && nextSigPos == inferSigPos ); @@ -2571,6 +2581,9 @@ void CABACReader::residual_coding_subblock( CoeffCodingContext& cctx, TCoeff* co remRegBins--; unsigned parFlag = 0; +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + unsigned gt2Flag = 0; +#endif if( gt1Flag ) { RExt__DECODER_DEBUG_BIT_STATISTICS_SET( ctype_par ); @@ -2578,19 +2591,33 @@ void CABACReader::residual_coding_subblock( CoeffCodingContext& cctx, TCoeff* co DTRACE( g_trace_ctx, D_SYNTAX_RESI, "par_flag() bin=%d ctx=%d\n", parFlag, cctx.parityCtxIdAbs( ctxOff ) ); remRegBins--; +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + RExt__DECODER_DEBUG_BIT_STATISTICS_SET(ctype_gt2); + gt2Flag = m_BinDecoder.decodeBin( cctx.greater2CtxIdAbs( ctxOff ) ); + DTRACE( g_trace_ctx, D_SYNTAX_RESI, "gt2_flag() bin=%d ctx=%d\n", gt2Flag, cctx.greater2CtxIdAbs( ctxOff ) ); + remRegBins--; +#else if( remGt2Bins && !--remGt2Bins ) { firstPosMode1 = nextSigPos - 1; } +#endif } +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + coeff[ blkPos ] += 1 + parFlag + gt1Flag + (gt2Flag << 1); +#else coeff[ blkPos ] += 1 + parFlag + gt1Flag; +#endif } state = ( stateTransTable >> ((state<<2)+((coeff[blkPos]&1)<<1)) ) & 3; } firstPosMode2 = nextSigPos; +#if !JVET_M0173_MOVE_GT2_TO_FIRST_PASS firstPosMode1 = ( firstPosMode1 > firstPosMode2 ? firstPosMode1 : firstPosMode2 ); +#endif +#if !JVET_M0173_MOVE_GT2_TO_FIRST_PASS //===== 2nd PASS: gt2 ===== for( int scanPos = firstSigPos; scanPos > firstPosMode1; scanPos-- ) { @@ -2604,10 +2631,17 @@ void CABACReader::residual_coding_subblock( CoeffCodingContext& cctx, TCoeff* co tcoeff += (gt2Flag<<1); } } +#endif +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + //===== 2nd PASS: Go-rice codes ===== + unsigned ricePar = 0; + for( int scanPos = firstSigPos; scanPos > firstPosMode2; scanPos-- ) +#else //===== 3rd PASS: Go-rice codes ===== unsigned ricePar = 0; for( int scanPos = firstSigPos; scanPos > firstPosMode1; scanPos-- ) +#endif { TCoeff& tcoeff = coeff[ cctx.blockPos( scanPos ) ]; if( tcoeff >= 4 ) @@ -2622,6 +2656,7 @@ void CABACReader::residual_coding_subblock( CoeffCodingContext& cctx, TCoeff* co } } } +#if !JVET_M0173_MOVE_GT2_TO_FIRST_PASS for( int scanPos = firstPosMode1; scanPos > firstPosMode2; scanPos-- ) { TCoeff& tcoeff = coeff[ cctx.blockPos( scanPos ) ]; @@ -2637,6 +2672,7 @@ void CABACReader::residual_coding_subblock( CoeffCodingContext& cctx, TCoeff* co } } } +#endif //===== coeff bypass ==== for( int scanPos = firstPosMode2; scanPos >= minSubPos; scanPos-- ) diff --git a/source/Lib/EncoderLib/CABACWriter.cpp b/source/Lib/EncoderLib/CABACWriter.cpp index d883588edd785b18c692c7114accac21deafd738..a26ced9fc88c39fca540b11df4d2b3625c2cfe45 100644 --- a/source/Lib/EncoderLib/CABACWriter.cpp +++ b/source/Lib/EncoderLib/CABACWriter.cpp @@ -2415,12 +2415,22 @@ void CABACWriter::residual_coding_subblock( CoeffCodingContext& cctx, const TCoe int numNonZero = 0; unsigned signPattern = 0; bool is2x2subblock = ( cctx.log2CGSize() == 2 ); +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + int remRegBins = ( is2x2subblock ? MAX_NUM_REG_BINS_2x2SUBBLOCK : MAX_NUM_REG_BINS_4x4SUBBLOCK ); +#else int remGt2Bins = ( is2x2subblock ? MAX_NUM_GT2_BINS_2x2SUBBLOCK : MAX_NUM_GT2_BINS_4x4SUBBLOCK ); int remRegBins = ( is2x2subblock ? MAX_NUM_REG_BINS_2x2SUBBLOCK : MAX_NUM_REG_BINS_4x4SUBBLOCK ) - remGt2Bins; +#endif int firstPosMode2 = minSubPos - 1; +#if !JVET_M0173_MOVE_GT2_TO_FIRST_PASS int firstPosMode1 = minSubPos - 1; +#endif +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + for( ; nextSigPos >= minSubPos && remRegBins >= 4; nextSigPos-- ) +#else for( ; nextSigPos >= minSubPos && remRegBins >= 3; nextSigPos-- ) +#endif { TCoeff Coeff = coeff[ cctx.blockPos( nextSigPos ) ]; unsigned sigFlag = ( Coeff != 0 ); @@ -2459,19 +2469,29 @@ void CABACWriter::residual_coding_subblock( CoeffCodingContext& cctx, const TCoe remAbsLevel >>= 1; remRegBins--; +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + unsigned gt2 = !!remAbsLevel; + m_BinEncoder.encodeBin(gt2, cctx.greater2CtxIdAbs(ctxOff)); + DTRACE(g_trace_ctx, D_SYNTAX_RESI, "gt2_flag() bin=%d ctx=%d\n", gt2, cctx.greater2CtxIdAbs(ctxOff)); + remRegBins--; +#else if( remGt2Bins && !--remGt2Bins ) { firstPosMode1 = nextSigPos - 1; } +#endif } } state = ( stateTransTable >> ((state<<2)+((Coeff&1)<<1)) ) & 3; } firstPosMode2 = nextSigPos; +#if !JVET_M0173_MOVE_GT2_TO_FIRST_PASS firstPosMode1 = ( firstPosMode1 > firstPosMode2 ? firstPosMode1 : firstPosMode2 ); +#endif +#if !JVET_M0173_MOVE_GT2_TO_FIRST_PASS //===== 2nd PASS: gt2 ===== for( int scanPos = firstSigPos; scanPos > firstPosMode1; scanPos-- ) { @@ -2484,10 +2504,17 @@ void CABACWriter::residual_coding_subblock( CoeffCodingContext& cctx, const TCoe DTRACE( g_trace_ctx, D_SYNTAX_RESI, "gt2_flag() bin=%d ctx=%d\n", gt2, cctx.greater2CtxIdAbs(ctxOff) ); } } +#endif +#if JVET_M0173_MOVE_GT2_TO_FIRST_PASS + //===== 2nd PASS: Go-rice codes ===== + unsigned ricePar = 0; + for( int scanPos = firstSigPos; scanPos > firstPosMode2; scanPos-- ) +#else //===== 3rd PASS: Go-rice codes ===== unsigned ricePar = 0; for( int scanPos = firstSigPos; scanPos > firstPosMode1; scanPos-- ) +#endif { unsigned absLevel = abs( coeff[ cctx.blockPos( scanPos ) ] ); if( absLevel >= 4 ) @@ -2501,6 +2528,7 @@ void CABACWriter::residual_coding_subblock( CoeffCodingContext& cctx, const TCoe } } } +#if !JVET_M0173_MOVE_GT2_TO_FIRST_PASS for( int scanPos = firstPosMode1; scanPos > firstPosMode2; scanPos-- ) { unsigned absLevel = abs( coeff[ cctx.blockPos( scanPos ) ] ); @@ -2515,6 +2543,7 @@ void CABACWriter::residual_coding_subblock( CoeffCodingContext& cctx, const TCoe } } } +#endif //===== coeff bypass ==== for( int scanPos = firstPosMode2; scanPos >= minSubPos; scanPos-- )