From d4c54c397a008f0282d91c6fca54500920b3cb0b Mon Sep 17 00:00:00 2001 From: Chen-Yen Lai <jenny.lai@mediatek.com> Date: Tue, 4 Jun 2019 12:08:27 +0200 Subject: [PATCH] Fix #301: Fix JVET-N0847 scaling matrices cause mismatch --- source/Lib/CommonLib/DepQuant.cpp | 4 ++-- source/Lib/CommonLib/Quant.h | 7 +++++-- source/Lib/EncoderLib/VLCWriter.cpp | 4 ++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/source/Lib/CommonLib/DepQuant.cpp b/source/Lib/CommonLib/DepQuant.cpp index 58ada92aaa..5bd804176b 100644 --- a/source/Lib/CommonLib/DepQuant.cpp +++ b/source/Lib/CommonLib/DepQuant.cpp @@ -1920,7 +1920,7 @@ void DepQuant::quant( TransformUnit &tu, const ComponentID &compID, const CCoeff CHECK(scalingListType >= SCALING_LIST_NUM, "Invalid scaling list"); const uint32_t log2TrWidth = g_aucLog2[width]; const uint32_t log2TrHeight = g_aucLog2[height]; - const bool enableScalingLists = getUseScalingList(width, height, tu.mtsIdx == MTS_SKIP);//4x4 must test scalingLists + const bool enableScalingLists = getUseScalingList(width, height, tu.mtsIdx == MTS_SKIP); static_cast<DQIntern::DepQuant*>(p)->quant( tu, pSrc, compID, cQP, Quant::m_dLambda, ctx, uiAbsSum, enableScalingLists, Quant::getQuantCoeff(scalingListType, qpRem, log2TrWidth, log2TrHeight) ); #else static_cast<DQIntern::DepQuant*>(p)->quant( tu, pSrc, compID, cQP, Quant::m_dLambda, ctx, uiAbsSum ); @@ -1952,7 +1952,7 @@ void DepQuant::dequant( const TransformUnit &tu, CoeffBuf &dstCoeff, const Compo const uint32_t log2TrWidth = g_aucLog2[width]; const uint32_t log2TrHeight = g_aucLog2[height]; - const bool enableScalingLists = getUseScalingList(width, height, (tu.mtsIdx == MTS_SKIP));//4x4 must test scalingLists + const bool enableScalingLists = getUseScalingList(width, height, (tu.mtsIdx == MTS_SKIP)); static_cast<DQIntern::DepQuant*>(p)->dequant( tu, dstCoeff, compID, cQP, enableScalingLists, Quant::getDequantCoeff(scalingListType, qpRem, log2TrWidth, log2TrHeight) ); #else static_cast<DQIntern::DepQuant*>(p)->dequant( tu, dstCoeff, compID, cQP ); diff --git a/source/Lib/CommonLib/Quant.h b/source/Lib/CommonLib/Quant.h index e5a6f3715a..134c545789 100644 --- a/source/Lib/CommonLib/Quant.h +++ b/source/Lib/CommonLib/Quant.h @@ -122,8 +122,11 @@ public: int* getDequantCoeff ( uint32_t list, int qp, uint32_t sizeX, uint32_t sizeY ) { return m_dequantCoef [sizeX][sizeY][list][qp]; }; //!< get DeQuant Coefficent void setUseScalingList ( bool bUseScalingList){ m_scalingListEnabledFlag = bUseScalingList; }; - bool getUseScalingList ( const uint32_t width, const uint32_t height, const bool isTransformSkip){ return m_scalingListEnabledFlag && (!isTransformSkip || ((width == 4) && (height == 4))); }; - +#if JVET_N0847_SCALING_LISTS + bool getUseScalingList ( const uint32_t width, const uint32_t height, const bool isTransformSkip) { return (m_scalingListEnabledFlag && !isTransformSkip); }; +#else + bool getUseScalingList ( const uint32_t width, const uint32_t height, const bool isTransformSkip) { return (m_scalingListEnabledFlag && (!isTransformSkip || ((width == 4) && (height == 4)))); }; +#endif void setScalingListDec ( const ScalingList &scalingList); #if JVET_N0246_MODIFIED_QUANTSCALES void processScalingListEnc ( int *coeff, int *quantcoeff, int qpMod6, uint32_t height, uint32_t width, uint32_t ratio, int sizuNum, uint32_t dc); diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index df4e84aab3..90bce51511 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -2084,7 +2084,7 @@ void HLSWriter::codeScalingList( const ScalingList &scalingList ) #else WRITE_UVLC( ((int)listId - (int)scalingList.getRefMatrixId (sizeId,listId)) / (SCALING_LIST_NUM/NUMBER_OF_PREDICTION_MODES), "scaling_list_pred_matrix_id_delta"); #endif - } + } else { WRITE_UVLC( (int)listId - (int)scalingList.getRefMatrixId (sizeId,listId), "scaling_list_pred_matrix_id_delta"); @@ -2107,7 +2107,7 @@ void HLSWriter::xCodeScalingList(const ScalingList* scalingList, uint32_t sizeId { int coefNum = std::min( MAX_MATRIX_COEF_NUM, ( int ) g_scalingListSize[sizeId] ); #if JVET_N0847_SCALING_LISTS - ScanElement* scan = g_scanOrder[SCAN_UNGROUPED][SCAN_DIAG][gp_sizeIdxInfo->idxFrom(1 << (sizeId == SCALING_LIST_FIRST_CODED ? 2 : 3))][gp_sizeIdxInfo->idxFrom(1 << (sizeId == SCALING_LIST_FIRST_CODED ? 2 : 3))]; + ScanElement *scan = g_scanOrder[SCAN_UNGROUPED][SCAN_DIAG][gp_sizeIdxInfo->idxFrom(1 << (sizeId == SCALING_LIST_2x2 ? 1 : (sizeId == SCALING_LIST_4x4 ? 2 : 3)))][gp_sizeIdxInfo->idxFrom(1 << (sizeId == SCALING_LIST_2x2 ? 1 : (sizeId == SCALING_LIST_4x4 ? 2 : 3)))]; #else uint32_t* scan = g_scanOrder[SCAN_UNGROUPED][SCAN_DIAG][gp_sizeIdxInfo->idxFrom( 1 << ( sizeId == SCALING_LIST_FIRST_CODED ? 2 : 3 ) )][gp_sizeIdxInfo->idxFrom( 1 << ( sizeId == SCALING_LIST_FIRST_CODED ? 2 : 3 ) )]; #endif -- GitLab