diff --git a/cfg/per-class/formatRGB.cfg b/cfg/per-class/formatRGB.cfg index fe065ff2f0920a6d63e87687c136e6dbe9ccfc82..a761a1d399d7f31d22a14c54e53b6aa38a0683e9 100644 --- a/cfg/per-class/formatRGB.cfg +++ b/cfg/per-class/formatRGB.cfg @@ -1,2 +1,3 @@ ColorTransform : 1 -Log2MaxTbSize : 5 \ No newline at end of file +Log2MaxTbSize : 5 +DualITree: 0 \ No newline at end of file diff --git a/source/Lib/CommonLib/AdaptiveLoopFilter.cpp b/source/Lib/CommonLib/AdaptiveLoopFilter.cpp index ab7287b5d22b009d6cc78c66d71e5acdcdb1b288..c82551538f0030392a409acbf836ab11adbc3c5d 100644 --- a/source/Lib/CommonLib/AdaptiveLoopFilter.cpp +++ b/source/Lib/CommonLib/AdaptiveLoopFilter.cpp @@ -1262,7 +1262,11 @@ void AdaptiveLoopFilter::filterBlk(AlfClassifier **classifier, const PelUnitBuf } else { +#if JVET_R0208_ALF_VB_ROUNDING_FIX + sum = (sum + (1 << ((shift + 3) - 1))) >> (shift + 3); +#else sum = (sum + offset) >> (shift + 3); +#endif } sum += curr; pRec1[jj] = ClipPel( sum, clpRng ); @@ -1341,6 +1345,12 @@ void AdaptiveLoopFilter::filterBlkCcAlf(const PelBuf &dstBuf, const CPelUnitBuf const Pel *srcCross = lumaPtr + col + row * lumaStride; int pos = ((startHeight + i + ii) << scaleY) & (vbCTUHeight - 1); +#if JVET_R0233_CCALF_LINE_BUFFER_REDUCTION + if (scaleY == 0 && (pos == vbPos || pos == vbPos + 1)) + { + continue; + } +#endif if (pos == (vbPos - 2) || pos == (vbPos + 1)) { offset3 = offset1; diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index e8fd447a17345ed6918037ea37376d7be3fe1e03..3896965d6461f0fdfd16a322946096806d8f9151 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -52,9 +52,17 @@ //########### place macros to be removed in next cycle below this line ############### -#define JVET_Q0471_CHROMA_QT_SPLIT 1 // JVET-Q0471: Chroma QT split + + #define JVET_R0156_ASPECT4_SPS_CLEANUP 1 // JVET-R0071, R0156 aspect 4, R0284: Condition sps_independent_subpics_flag on "sps_num_subpics_minus1 > 0" +#define JVET_R0233_CCALF_LINE_BUFFER_REDUCTION 1 // JVET-R0233 method 2: Line buffer reduction for CCALF + +#define JVET_Q0471_CHROMA_QT_SPLIT 1 // JVET-Q0471: Chroma QT split +#define JVET_R0208_ALF_VB_ROUNDING_FIX 1 // JVET-R0208: Rounding offset fix for ALF virtual boundary processing +#define JVET_R0232_CCALF_APS_CONSTRAINT 1 // JVET-R0232 section 3.2: APS contraint for CCALF + + //########### place macros to be be kept below this line ############### #define JVET_M0497_MATRIX_MULT 0 // 0: Fast method; 1: Matrix multiplication diff --git a/source/Lib/CommonLib/version.h b/source/Lib/CommonLib/version.h index c25c904c98faecd636a83262a3f3356071b3ddbd..908c57ea0e948777d395bed7ebb2fb9d258df0fc 100644 --- a/source/Lib/CommonLib/version.h +++ b/source/Lib/CommonLib/version.h @@ -1,3 +1,3 @@ #if ! defined( VTM_VERSION ) -#define VTM_VERSION "8.1" +#define VTM_VERSION "8.2" #endif diff --git a/source/Lib/CommonLib/x86/AdaptiveLoopFilterX86.h b/source/Lib/CommonLib/x86/AdaptiveLoopFilterX86.h index 295465d592d39ce3132853dc0484f94b85e26c70..12c44a2f87d0d8046c0e10fa31ff4dbbf4ef7467 100644 --- a/source/Lib/CommonLib/x86/AdaptiveLoopFilterX86.h +++ b/source/Lib/CommonLib/x86/AdaptiveLoopFilterX86.h @@ -313,6 +313,9 @@ static void simdFilter5x5Blk(AlfClassifier **classifier, const PelUnitBuf &recDs constexpr int SHIFT = AdaptiveLoopFilter::m_NUM_BITS - 1; constexpr int ROUND = 1 << (SHIFT - 1); +#if JVET_R0208_ALF_VB_ROUNDING_FIX + const __m128i mmOffset1 = _mm_set1_epi32((1 << ((SHIFT + 3) - 1)) - ROUND); +#endif const size_t width = blk.width; const size_t height = blk.height; @@ -425,8 +428,13 @@ static void simdFilter5x5Blk(AlfClassifier **classifier, const PelUnitBuf &recDs } else { +#if JVET_R0208_ALF_VB_ROUNDING_FIX + accumA = _mm_srai_epi32(_mm_add_epi32(accumA, mmOffset1), SHIFT + 3); + accumB = _mm_srai_epi32(_mm_add_epi32(accumB, mmOffset1), SHIFT + 3); +#else accumA = _mm_srai_epi32(accumA, SHIFT + 3); accumB = _mm_srai_epi32(accumB, SHIFT + 3); +#endif } accumA = _mm_packs_epi32(accumA, accumB); accumA = _mm_add_epi16(accumA, cur); @@ -507,6 +515,9 @@ static void simdFilter7x7Blk(AlfClassifier **classifier, const PelUnitBuf &recDs Pel * dst = dstBuffer.buf + blkDst.y * dstStride + blkDst.x; const __m128i mmOffset = _mm_set1_epi32(ROUND); +#if JVET_R0208_ALF_VB_ROUNDING_FIX + const __m128i mmOffset1 = _mm_set1_epi32((1 << ((SHIFT + 3) - 1)) - ROUND); +#endif const __m128i mmMin = _mm_set1_epi16( clpRng.min ); const __m128i mmMax = _mm_set1_epi16( clpRng.max ); @@ -655,8 +666,13 @@ static void simdFilter7x7Blk(AlfClassifier **classifier, const PelUnitBuf &recDs } else { +#if JVET_R0208_ALF_VB_ROUNDING_FIX + accumA = _mm_srai_epi32(_mm_add_epi32(accumA, mmOffset1), SHIFT + 3); + accumB = _mm_srai_epi32(_mm_add_epi32(accumB, mmOffset1), SHIFT + 3); +#else accumA = _mm_srai_epi32(accumA, SHIFT + 3); accumB = _mm_srai_epi32(accumB, SHIFT + 3); +#endif } accumA = _mm_packs_epi32(accumA, accumB); accumA = _mm_add_epi16(accumA, cur); diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp index 567b1e07633d53dcb5ffe1df7c89f5ca1cf3dff3..81754874b54b0b715d5111717f1090f45e6439a6 100644 --- a/source/Lib/DecoderLib/DecLib.cpp +++ b/source/Lib/DecoderLib/DecLib.cpp @@ -980,6 +980,9 @@ bool DecLib::isSliceNaluFirstInAU( bool newPicture, InputNALUnit &nalu ) void activateAPS(PicHeader* picHeader, Slice* pSlice, ParameterSetManager& parameterSetManager, APS** apss, APS* lmcsAPS, APS* scalingListAPS) { +#if JVET_R0232_CCALF_APS_CONSTRAINT + const SPS *sps = parameterSetManager.getSPS(picHeader->getSPSId()); +#endif //luma APSs if (pSlice->getTileGroupAlfEnabledFlag(COMPONENT_Y)) { @@ -998,6 +1001,10 @@ void activateAPS(PicHeader* picHeader, Slice* pSlice, ParameterSetManager& param CHECK( aps->getTemporalId() > pSlice->getTLayer(), "TemporalId shall be less than or equal to the TemporalId of the coded slice NAL unit" ); //ToDO: APS NAL unit containing the APS RBSP shall have nuh_layer_id either equal to the nuh_layer_id of a coded slice NAL unit that referrs it, or equal to the nuh_layer_id of a direct dependent layer of the layer containing a coded slice NAL unit that referrs it. + +#if JVET_R0232_CCALF_APS_CONSTRAINT + CHECK(((sps->getCCALFEnabledFlag() == false) && (aps->getCcAlfAPSParam().newCcAlfFilter[0] || aps->getCcAlfAPSParam().newCcAlfFilter[1])), "When sps_ccalf_enabled_flag is 0, the values of alf_cc_cb_filter_signal_flag and alf_cc_cr_filter_signal_flag shall be equal to 0"); +#endif } } } @@ -1016,6 +1023,10 @@ void activateAPS(PicHeader* picHeader, Slice* pSlice, ParameterSetManager& param CHECK( aps->getTemporalId() > pSlice->getTLayer(), "TemporalId shall be less than or equal to the TemporalId of the coded slice NAL unit" ); //ToDO: APS NAL unit containing the APS RBSP shall have nuh_layer_id either equal to the nuh_layer_id of a coded slice NAL unit that referrs it, or equal to the nuh_layer_id of a direct dependent layer of the layer containing a coded slice NAL unit that referrs it. + +#if JVET_R0232_CCALF_APS_CONSTRAINT + CHECK(((sps->getCCALFEnabledFlag() == false) && (aps->getCcAlfAPSParam().newCcAlfFilter[0] || aps->getCcAlfAPSParam().newCcAlfFilter[1])), "When sps_ccalf_enabled_flag is 0, the values of alf_cc_cb_filter_signal_flag and alf_cc_cr_filter_signal_flag shall be equal to 0"); +#endif } } diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp index 82b2d9027aa76c235779b2a7be6f03506f6e557e..e7d06837ff7f6ce3d069d14efa0453328e8e88f1 100644 --- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp +++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp @@ -4014,6 +4014,12 @@ void EncAdaptiveLoopFilter::getBlkStatsCcAlf(AlfCovariance &alfCovariance, const for (int i = 0; i < compArea.height; i++) { int vbDistance = ((i << getComponentScaleY(compID, m_chromaFormat)) % vbCTUHeight) - vbPos; +#if JVET_R0233_CCALF_LINE_BUFFER_REDUCTION + if ((getComponentScaleY(compID, m_chromaFormat) == 0) && (vbDistance == 0 || vbDistance == 1)) + { + continue; + } +#endif for (int j = 0; j < compArea.width; j++) { std::memset(ELocal, 0, sizeof(ELocal));