diff --git a/cfg/encoder_intra_vtm.cfg b/cfg/encoder_intra_vtm.cfg index 57b9ef540bce9ef7350d448a7ca853f49fcdfeab..4d330a29967920fc8798046fae58525c8f535db7 100644 --- a/cfg/encoder_intra_vtm.cfg +++ b/cfg/encoder_intra_vtm.cfg @@ -61,13 +61,6 @@ SliceArgument : 1500 # Argument for 'SliceMode'. LFCrossSliceBoundaryFlag : 1 # In-loop filtering, including ALF and DB, is across or not across slice boundary. # 0:not across, 1: across -#============ PCM ================ -PCMEnabledFlag : 0 # 0: No PCM mode -PCMLog2MaxSize : 5 # Log2 of maximum PCM block size. -PCMLog2MinSize : 3 # Log2 of minimum PCM block size. -PCMInputBitDepthFlag : 1 # 0: PCM bit-depth is internal bit-depth. 1: PCM bit-depth is input bit-depth. -PCMFilterDisableFlag : 0 # 0: Enable loop filtering on I_PCM samples. 1: Disable loop filtering on I_PCM samples. - #============ Lossless ================ TransquantBypassEnable : 0 # Value of PPS flag. CUTransquantBypassFlagForce: 0 # Force transquant bypass mode, when transquant_bypass_enable_flag is enabled diff --git a/cfg/encoder_lowdelay_P_vtm.cfg b/cfg/encoder_lowdelay_P_vtm.cfg index fcc83ed92956b95f44f4996eea69342cb63737ca..90b645849b645ea62c3ad309fe947895b9a865f6 100644 --- a/cfg/encoder_lowdelay_P_vtm.cfg +++ b/cfg/encoder_lowdelay_P_vtm.cfg @@ -69,13 +69,6 @@ SliceArgument : 1500 # Argument for 'SliceMode'. LFCrossSliceBoundaryFlag : 1 # In-loop filtering, including ALF and DB, is across or not across slice boundary. # 0:not across, 1: across -#============ PCM ================ -PCMEnabledFlag : 0 # 0: No PCM mode -PCMLog2MaxSize : 5 # Log2 of maximum PCM block size. -PCMLog2MinSize : 3 # Log2 of minimum PCM block size. -PCMInputBitDepthFlag : 1 # 0: PCM bit-depth is internal bit-depth. 1: PCM bit-depth is input bit-depth. -PCMFilterDisableFlag : 0 # 0: Enable loop filtering on I_PCM samples. 1: Disable loop filtering on I_PCM samples. - #============ Lossless ================ TransquantBypassEnable : 0 # Value of PPS flag. CUTransquantBypassFlagForce: 0 # Force transquant bypass mode, when transquant_bypass_enable_flag is enabled diff --git a/cfg/encoder_lowdelay_vtm.cfg b/cfg/encoder_lowdelay_vtm.cfg index a1c98ae3c685dd7215ea4f02a514e0f797c09a3e..02becb448693210ff8abfba01411c9ccf4bbc585 100644 --- a/cfg/encoder_lowdelay_vtm.cfg +++ b/cfg/encoder_lowdelay_vtm.cfg @@ -69,13 +69,6 @@ SliceArgument : 1500 # Argument for 'SliceMode'. LFCrossSliceBoundaryFlag : 1 # In-loop filtering, including ALF and DB, is across or not across slice boundary. # 0:not across, 1: across -#============ PCM ================ -PCMEnabledFlag : 0 # 0: No PCM mode -PCMLog2MaxSize : 5 # Log2 of maximum PCM block size. -PCMLog2MinSize : 3 # Log2 of minimum PCM block size. -PCMInputBitDepthFlag : 1 # 0: PCM bit-depth is internal bit-depth. 1: PCM bit-depth is input bit-depth. -PCMFilterDisableFlag : 0 # 0: Enable loop filtering on I_PCM samples. 1: Disable loop filtering on I_PCM samples. - #============ Lossless ================ TransquantBypassEnable : 0 # Value of PPS flag. CUTransquantBypassFlagForce: 0 # Force transquant bypass mode, when transquant_bypass_enable_flag is enabled diff --git a/cfg/encoder_randomaccess_vtm.cfg b/cfg/encoder_randomaccess_vtm.cfg index 7c4404bdfca11c24f7cdc4619bbfe57e25084d40..45d4ecd4f7c2ca9041c5dbf0e98689394aba35fc 100644 --- a/cfg/encoder_randomaccess_vtm.cfg +++ b/cfg/encoder_randomaccess_vtm.cfg @@ -83,13 +83,6 @@ SliceArgument : 1500 # Argument for 'SliceMode'. LFCrossSliceBoundaryFlag : 1 # In-loop filtering, including ALF and DB, is across or not across slice boundary. # 0:not across, 1: across -#============ PCM ================ -PCMEnabledFlag : 0 # 0: No PCM mode -PCMLog2MaxSize : 5 # Log2 of maximum PCM block size. -PCMLog2MinSize : 3 # Log2 of minimum PCM block size. -PCMInputBitDepthFlag : 1 # 0: PCM bit-depth is internal bit-depth. 1: PCM bit-depth is input bit-depth. -PCMFilterDisableFlag : 0 # 0: Enable loop filtering on I_PCM samples. 1: Disable loop filtering on I_PCM samples. - #============ Lossless ================ TransquantBypassEnable : 0 # Value of PPS flag. CUTransquantBypassFlagForce: 0 # Force transquant bypass mode, when transquant_bypass_enable_flag is enabled diff --git a/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RasterScanSlice.cfg b/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RasterScanSlice.cfg index c588313ddeea1c63529ce967c31820e6225bd825..4dbc0a9e90e3602acb4318aa0d28fa8ce3b621ba 100644 --- a/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RasterScanSlice.cfg +++ b/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RasterScanSlice.cfg @@ -96,13 +96,6 @@ LFCrossTileBoundaryFlag : 0 # In-loop filtering is ac RectSliceFlag : 0 -#============ PCM ================ -PCMEnabledFlag : 0 # 0: No PCM mode -PCMLog2MaxSize : 5 # Log2 of maximum PCM block size. -PCMLog2MinSize : 3 # Log2 of minimum PCM block size. -PCMInputBitDepthFlag : 1 # 0: PCM bit-depth is internal bit-depth. 1: PCM bit-depth is input bit-depth. -PCMFilterDisableFlag : 0 # 0: Enable loop filtering on I_PCM samples. 1: Disable loop filtering on I_PCM samples. - #============ Lossless ================ TransquantBypassEnable : 0 # Value of PPS flag. CUTransquantBypassFlagForce: 0 # Force transquant bypass mode, when transquant_bypass_enable_flag is enabled diff --git a/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RectangularSlice.cfg b/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RectangularSlice.cfg index 4b8fd25a1d4988fae5f2a941ec52c52a0991c5d7..f8f2286a823908a7f14ff0387ea891271e52b3bc 100644 --- a/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RectangularSlice.cfg +++ b/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RectangularSlice.cfg @@ -98,13 +98,6 @@ RectSliceFlag : 1 NumRectSlicesInPicMinus1 : 3 RectSlicesBoundaryArray : 0 4 1 5 2 6 3 7 -#============ PCM ================ -PCMEnabledFlag : 0 # 0: No PCM mode -PCMLog2MaxSize : 5 # Log2 of maximum PCM block size. -PCMLog2MinSize : 3 # Log2 of minimum PCM block size. -PCMInputBitDepthFlag : 1 # 0: PCM bit-depth is internal bit-depth. 1: PCM bit-depth is input bit-depth. -PCMFilterDisableFlag : 0 # 0: Enable loop filtering on I_PCM samples. 1: Disable loop filtering on I_PCM samples. - #============ Lossless ================ TransquantBypassEnable : 0 # Value of PPS flag. CUTransquantBypassFlagForce: 0 # Force transquant bypass mode, when transquant_bypass_enable_flag is enabled diff --git a/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_SingleTilePerSlice.cfg b/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_SingleTilePerSlice.cfg index 1bf9e561e8d1e284eb814d5b07cf1b78e6b135dc..9d7ce53ae491ff720340828e7c0b517fc5f0401d 100644 --- a/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_SingleTilePerSlice.cfg +++ b/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_SingleTilePerSlice.cfg @@ -98,13 +98,6 @@ RectSliceFlag : 1 NumRectSlicesInPicMinus1 : 3 RectSlicesBoundaryArray : 0 0 1 1 2 2 3 3 -#============ PCM ================ -PCMEnabledFlag : 0 # 0: No PCM mode -PCMLog2MaxSize : 5 # Log2 of maximum PCM block size. -PCMLog2MinSize : 3 # Log2 of minimum PCM block size. -PCMInputBitDepthFlag : 1 # 0: PCM bit-depth is internal bit-depth. 1: PCM bit-depth is input bit-depth. -PCMFilterDisableFlag : 0 # 0: Enable loop filtering on I_PCM samples. 1: Disable loop filtering on I_PCM samples. - #============ Lossless ================ TransquantBypassEnable : 0 # Value of PPS flag. CUTransquantBypassFlagForce: 0 # Force transquant bypass mode, when transquant_bypass_enable_flag is enabled diff --git a/source/App/EncoderApp/EncApp.cpp b/source/App/EncoderApp/EncApp.cpp index 21c65e025833428981a3e697e79f01f9c20d0f7d..819fc808525685f98be95499ffb6f5a3893a65f6 100644 --- a/source/App/EncoderApp/EncApp.cpp +++ b/source/App/EncoderApp/EncApp.cpp @@ -118,7 +118,9 @@ void EncApp::xInitLibCfg() m_cEncLib.setNoPartitionConstraintsOverrideConstraintFlag ( !m_SplitConsOverrideEnabledFlag ); m_cEncLib.setNoSaoConstraintFlag ( !m_bUseSAO ); m_cEncLib.setNoAlfConstraintFlag ( !m_alf ); +#if !JVET_O0525_REMOVE_PCM m_cEncLib.setNoPcmConstraintFlag ( !m_usePCM ); +#endif m_cEncLib.setNoRefWraparoundConstraintFlag ( m_bNoRefWraparoundConstraintFlag ); m_cEncLib.setNoTemporalMvpConstraintFlag ( m_TMVPModeId ? false : true ); m_cEncLib.setNoSbtmvpConstraintFlag ( m_SubPuMvpMode ? false : true ); @@ -387,8 +389,10 @@ void EncApp::xInitLibCfg() m_cEncLib.setFastUDIUseMPMEnabled ( m_bFastUDIUseMPMEnabled ); m_cEncLib.setFastMEForGenBLowDelayEnabled ( m_bFastMEForGenBLowDelayEnabled ); m_cEncLib.setUseBLambdaForNonKeyLowDelayPictures ( m_bUseBLambdaForNonKeyLowDelayPictures ); +#if !JVET_O0525_REMOVE_PCM m_cEncLib.setPCMLog2MinSize ( m_uiPCMLog2MinSize); m_cEncLib.setUsePCM ( m_usePCM ); +#endif m_cEncLib.setUseISP ( m_ISP ); m_cEncLib.setUseFastISP ( m_useFastISP ); @@ -397,10 +401,14 @@ void EncApp::xInitLibCfg() { m_cEncLib.setBitDepth((ChannelType)channelType, m_internalBitDepth[channelType]); m_cEncLib.setInputBitDepth((ChannelType)channelType, m_inputBitDepth[channelType]); +#if !JVET_O0525_REMOVE_PCM m_cEncLib.setPCMBitDepth((ChannelType)channelType, m_bPCMInputBitDepthFlag ? m_MSBExtendedBitDepth[channelType] : m_internalBitDepth[channelType]); +#endif } +#if !JVET_O0525_REMOVE_PCM m_cEncLib.setPCMLog2MaxSize ( m_pcmLog2MaxSize); +#endif m_cEncLib.setMaxNumMergeCand ( m_maxNumMergeCand ); m_cEncLib.setMaxNumAffineMergeCand ( m_maxNumAffineMergeCand ); m_cEncLib.setMaxNumTriangleCand ( m_maxNumTriangleCand ); @@ -432,8 +440,10 @@ void EncApp::xInitLibCfg() m_cEncLib.setMaxNumOffsetsPerPic ( m_maxNumOffsetsPerPic); m_cEncLib.setSaoCtuBoundary ( m_saoCtuBoundary); +#if !JVET_O0525_REMOVE_PCM m_cEncLib.setPCMInputBitDepthFlag ( m_bPCMInputBitDepthFlag); m_cEncLib.setPCMFilterDisableFlag ( m_bPCMFilterDisableFlag); +#endif m_cEncLib.setSaoGreedyMergeEnc ( m_saoGreedyMergeEnc); m_cEncLib.setIntraSmoothingDisabledFlag (!m_enableIntraReferenceSmoothing ); diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp index 75c2ef47e2add50da3cb20575404cb2cbc032924..ac811cd4a7b135da1d3a193c07daaf89743e8a5a 100644 --- a/source/App/EncoderApp/EncAppCfg.cpp +++ b/source/App/EncoderApp/EncAppCfg.cpp @@ -116,7 +116,9 @@ EncAppCfg::EncAppCfg() , m_noPartitionConstraintsOverrideConstraintFlag(false) , m_bNoSaoConstraintFlag(false) , m_bNoAlfConstraintFlag(false) +#if !JVET_O0525_REMOVE_PCM , m_bNoPcmConstraintFlag(false) +#endif , m_bNoRefWraparoundConstraintFlag(false) , m_bNoTemporalMvpConstraintFlag(false) , m_bNoSbtmvpConstraintFlag(false) @@ -1152,12 +1154,14 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) ("FastUDIUseMPMEnabled", m_bFastUDIUseMPMEnabled, true, "If enabled, adapt intra direction search, accounting for MPM") ("FastMEForGenBLowDelayEnabled", m_bFastMEForGenBLowDelayEnabled, true, "If enabled use a fast ME for generalised B Low Delay slices") ("UseBLambdaForNonKeyLowDelayPictures", m_bUseBLambdaForNonKeyLowDelayPictures, true, "Enables use of B-Lambda for non-key low-delay pictures") +#if !JVET_O0525_REMOVE_PCM ("PCMEnabledFlag", m_usePCM, false) ("PCMLog2MaxSize", m_pcmLog2MaxSize, 5u) ("PCMLog2MinSize", m_uiPCMLog2MinSize, 3u) ("PCMInputBitDepthFlag", m_bPCMInputBitDepthFlag, true) ("PCMFilterDisableFlag", m_bPCMFilterDisableFlag, false) +#endif ("IntraReferenceSmoothing", m_enableIntraReferenceSmoothing, true, "0: Disable use of intra reference smoothing (not valid in V1 profiles). 1: Enable use of intra reference smoothing (same as V1)") ("WeightedPredP,-wpP", m_useWeightedPred, false, "Use weighted prediction in P slices") ("WeightedPredB,-wpB", m_useWeightedBiPred, false, "Use weighted (bidirectional) prediction in B slices") @@ -2718,6 +2722,7 @@ bool EncAppCfg::xCheckParameter() xConfirmPara( m_MTSIntraMaxCand < 0 || m_MTSIntraMaxCand > 5, "m_MTSIntraMaxCand must be greater than 0 and smaller than 6" ); xConfirmPara( m_MTSInterMaxCand < 0 || m_MTSInterMaxCand > 5, "m_MTSInterMaxCand must be greater than 0 and smaller than 6" ); xConfirmPara( m_MTS != 0 && m_MTSImplicit != 0, "Both explicit and implicit MTS cannot be enabled at the same time" ); +#if !JVET_O0525_REMOVE_PCM if( m_usePCM) { for (uint32_t channelType = 0; channelType < MAX_NUM_CHANNEL_TYPE; channelType++) @@ -2729,6 +2734,7 @@ bool EncAppCfg::xCheckParameter() xConfirmPara( m_pcmLog2MaxSize > 5, "PCMLog2MaxSize must be 5 or smaller."); xConfirmPara( m_pcmLog2MaxSize < m_uiPCMLog2MinSize, "PCMLog2MaxSize must be equal to or greater than m_uiPCMLog2MinSize."); } +#endif if (m_useBDPCM) { @@ -3377,7 +3383,9 @@ void EncAppCfg::xPrintParameter() #if MAX_TB_SIZE_SIGNALLING msg( DETAILS, "Max TB size : %d \n", 1 << m_log2MaxTbSize ); #endif +#if !JVET_O0525_REMOVE_PCM msg( DETAILS, "Min PCM size : %d\n", 1 << m_uiPCMLog2MinSize); +#endif msg( DETAILS, "Motion search range : %d\n", m_iSearchRange ); msg( DETAILS, "Intra period : %d\n", m_iIntraPeriod ); msg( DETAILS, "Decoding refresh type : %d\n", m_iDecodingRefreshType ); @@ -3402,8 +3410,10 @@ void EncAppCfg::xPrintParameter() msg( DETAILS, "Input bit depth : (Y:%d, C:%d)\n", m_inputBitDepth[CHANNEL_TYPE_LUMA], m_inputBitDepth[CHANNEL_TYPE_CHROMA] ); msg( DETAILS, "MSB-extended bit depth : (Y:%d, C:%d)\n", m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA], m_MSBExtendedBitDepth[CHANNEL_TYPE_CHROMA] ); msg( DETAILS, "Internal bit depth : (Y:%d, C:%d)\n", m_internalBitDepth[CHANNEL_TYPE_LUMA], m_internalBitDepth[CHANNEL_TYPE_CHROMA] ); +#if !JVET_O0525_REMOVE_PCM msg( DETAILS, "PCM sample bit depth : (Y:%d, C:%d)\n", m_bPCMInputBitDepthFlag ? m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA] : m_internalBitDepth[CHANNEL_TYPE_LUMA], m_bPCMInputBitDepthFlag ? m_MSBExtendedBitDepth[CHANNEL_TYPE_CHROMA] : m_internalBitDepth[CHANNEL_TYPE_CHROMA] ); +#endif msg( DETAILS, "Intra reference smoothing : %s\n", (m_enableIntraReferenceSmoothing ? "Enabled" : "Disabled") ); msg( DETAILS, "cu_chroma_qp_offset_subdiv : %d\n", m_cuChromaQpOffsetSubdiv); msg( DETAILS, "extended_precision_processing_flag : %s\n", (m_extendedPrecisionProcessingFlag ? "Enabled" : "Disabled") ); @@ -3493,7 +3503,9 @@ void EncAppCfg::xPrintParameter() msg( VERBOSE, "CIP:%d ", m_bUseConstrainedIntraPred); msg( VERBOSE, "SAO:%d ", (m_bUseSAO)?(1):(0)); msg( VERBOSE, "ALF:%d ", m_alf ? 1 : 0 ); +#if !JVET_O0525_REMOVE_PCM msg( VERBOSE, "PCM:%d ", (m_usePCM && (1<<m_uiPCMLog2MinSize) <= m_uiMaxCUWidth)? 1 : 0); +#endif if (m_TransquantBypassEnabledFlag && m_CUTransquantBypassFlagForce) { diff --git a/source/App/EncoderApp/EncAppCfg.h b/source/App/EncoderApp/EncAppCfg.h index 16d0993ce049104fdece32b202f8f273edc1794b..6cc2c2ed36f49420f669bba360446776272473ec 100644 --- a/source/App/EncoderApp/EncAppCfg.h +++ b/source/App/EncoderApp/EncAppCfg.h @@ -130,7 +130,9 @@ protected: bool m_noPartitionConstraintsOverrideConstraintFlag; bool m_bNoSaoConstraintFlag; bool m_bNoAlfConstraintFlag; +#if !JVET_O0525_REMOVE_PCM bool m_bNoPcmConstraintFlag; +#endif bool m_bNoRefWraparoundConstraintFlag; bool m_bNoTemporalMvpConstraintFlag; bool m_bNoSbtmvpConstraintFlag; @@ -377,8 +379,10 @@ protected: //coding tools (chroma format) ChromaFormat m_chromaFormatIDC; +#if !JVET_O0525_REMOVE_PCM // coding tools (PCM bit-depth) bool m_bPCMInputBitDepthFlag; ///< 0: PCM bit-depth is internal bit-depth. 1: PCM bit-depth is input bit-depth. +#endif // coding tool (SAO) bool m_bUseSAO; @@ -398,11 +402,13 @@ protected: #else bool m_DeblockingFilterMetric; ///< blockiness metric in encoder #endif +#if !JVET_O0525_REMOVE_PCM // coding tools (PCM) bool m_usePCM; ///< flag for using IPCM uint32_t m_pcmLog2MaxSize; ///< log2 of maximum PCM block size uint32_t m_uiPCMLog2MinSize; ///< log2 of minimum PCM block size bool m_bPCMFilterDisableFlag; ///< PCM filter disable flag +#endif bool m_enableIntraReferenceSmoothing; ///< flag for enabling(default)/disabling intra reference smoothing/filtering // coding tools (encoder-only parameters) diff --git a/source/Lib/CommonLib/AdaptiveLoopFilter.cpp b/source/Lib/CommonLib/AdaptiveLoopFilter.cpp index ed2a49402b2f2a26291cf8c45d949a2cc309149d..22432da378550108f4bd9a9a33e9424d989aa39f 100644 --- a/source/Lib/CommonLib/AdaptiveLoopFilter.cpp +++ b/source/Lib/CommonLib/AdaptiveLoopFilter.cpp @@ -273,8 +273,10 @@ void AdaptiveLoopFilter::ALFProcess(CodingStructure& cs) const Area blkSrc( 0, 0, w, h ); const Area blkDst( xStart, yStart, w, h ); deriveClassification( m_classifier, buf.get(COMPONENT_Y), blkDst, blkSrc ); +#if !JVET_O0525_REMOVE_PCM const Area blkPCM( xStart, yStart, w, h ); resetPCMBlkClassInfo( cs, m_classifier, buf.get(COMPONENT_Y), blkPCM ); +#endif short filterSetIndex = alfCtuFilterIndex[ctuIdx]; short *coeff; short *clip; @@ -328,8 +330,10 @@ void AdaptiveLoopFilter::ALFProcess(CodingStructure& cs) { Area blk( xPos, yPos, width, height ); deriveClassification( m_classifier, tmpYuv.get( COMPONENT_Y ), blk, blk ); +#if !JVET_O0525_REMOVE_PCM Area blkPCM(xPos, yPos, width, height); resetPCMBlkClassInfo(cs, m_classifier, tmpYuv.get(COMPONENT_Y), blkPCM); +#endif short filterSetIndex = alfCtuFilterIndex[ctuIdx]; short *coeff; short *clip; @@ -754,6 +758,7 @@ void AdaptiveLoopFilter::deriveClassification( AlfClassifier** classifier, const } } } +#if !JVET_O0525_REMOVE_PCM void AdaptiveLoopFilter::resetPCMBlkClassInfo(CodingStructure & cs, AlfClassifier** classifier, const CPelBuf& srcLuma, const Area& blk) { if ( !cs.sps->getPCMFilterDisableFlag() ) @@ -803,6 +808,7 @@ void AdaptiveLoopFilter::resetPCMBlkClassInfo(CodingStructure & cs, AlfClassifi } } } +#endif void AdaptiveLoopFilter::deriveClassificationBlk(AlfClassifier **classifier, int **laplacian[NUM_DIRECTIONS], const CPelBuf &srcLuma, const Area &blkDst, const Area &blk, @@ -1029,10 +1035,12 @@ void AdaptiveLoopFilter::filterBlk(AlfClassifier **classifier, const PelUnitBuf { CHECK( filtType != 0, "Chroma needs to have filtType == 0" ); } +#if !JVET_O0525_REMOVE_PCM const SPS* sps = cs.slice->getSPS(); bool isDualTree =CS::isDualITree(cs); bool isPCMFilterDisabled = sps->getPCMFilterDisableFlag(); ChromaFormat nChromaFormat = sps->getChromaFormatIdc(); +#endif const CPelBuf srcLuma = recSrc.get( compId ); PelBuf dstLuma = recDst.get( compId ); @@ -1062,7 +1070,9 @@ void AdaptiveLoopFilter::filterBlk(AlfClassifier **classifier, const PelUnitBuf const int clsSizeY = 4; const int clsSizeX = 4; +#if !JVET_O0525_REMOVE_PCM bool pcmFlags2x2[4] = {0,0,0,0}; +#endif CHECK( startHeight % clsSizeY, "Wrong startHeight in filtering" ); CHECK( startWidth % clsSizeX, "Wrong startWidth in filtering" ); @@ -1101,13 +1111,16 @@ void AdaptiveLoopFilter::filterBlk(AlfClassifier **classifier, const PelUnitBuf { AlfClassifier& cl = pClass[j]; transposeIdx = cl.transposeIdx; +#if !JVET_O0525_REMOVE_PCM if( isPCMFilterDisabled && cl.classIdx== m_ALF_UNUSED_CLASSIDX && transposeIdx== m_ALF_UNUSED_TRANSPOSIDX ) { continue; } +#endif coef = filterSet + cl.classIdx * MAX_NUM_ALF_LUMA_COEFF; clip = fClipSet + cl.classIdx * MAX_NUM_ALF_LUMA_COEFF; } +#if !JVET_O0525_REMOVE_PCM else if( isPCMFilterDisabled ) { int blkX, blkY; @@ -1139,6 +1152,7 @@ void AdaptiveLoopFilter::filterBlk(AlfClassifier **classifier, const PelUnitBuf } } +#endif if( filtType == ALF_FILTER_7 ) { @@ -1224,6 +1238,7 @@ void AdaptiveLoopFilter::filterBlk(AlfClassifier **classifier, const PelUnitBuf for( int jj = 0; jj < clsSizeX; jj++ ) { +#if !JVET_O0525_REMOVE_PCM // skip 2x2 PCM chroma blocks if( bChroma && isPCMFilterDisabled ) { @@ -1239,6 +1254,7 @@ void AdaptiveLoopFilter::filterBlk(AlfClassifier **classifier, const PelUnitBuf continue; } } +#endif int sum = 0; const Pel curr = pImg0[+0]; diff --git a/source/Lib/CommonLib/AdaptiveLoopFilter.h b/source/Lib/CommonLib/AdaptiveLoopFilter.h index 04c9f66003087ee949714eb57f211e01046a51b4..1d6e367b49798f7f56ec8312a5b2b973f0923321 100644 --- a/source/Lib/CommonLib/AdaptiveLoopFilter.h +++ b/source/Lib/CommonLib/AdaptiveLoopFilter.h @@ -91,7 +91,9 @@ public: const CPelBuf &srcLuma, const Area &blkDst, const Area &blk, const int shift, const int vbCTUHeight, int vbPos); void deriveClassification( AlfClassifier** classifier, const CPelBuf& srcLuma, const Area& blkDst, const Area& blk ); +#if !JVET_O0525_REMOVE_PCM void resetPCMBlkClassInfo(CodingStructure & cs, AlfClassifier** classifier, const CPelBuf& srcLuma, const Area& blk); +#endif template<AlfFilterType filtType> static void filterBlk(AlfClassifier **classifier, const PelUnitBuf &recDst, const CPelUnitBuf &recSrc, const Area &blkDst, const Area &blk, const ComponentID compId, const short *filterSet, diff --git a/source/Lib/CommonLib/CodingStatistics.h b/source/Lib/CommonLib/CodingStatistics.h index 845e040702366e4f3cff1cca8fccf456951f7da0..d9dae2f63e5d19565ce2a28c26c365cc1133d77f 100644 --- a/source/Lib/CommonLib/CodingStatistics.h +++ b/source/Lib/CommonLib/CodingStatistics.h @@ -102,8 +102,10 @@ enum CodingStatisticsType STATS__CABAC_BITS__ALF, STATS__CABAC_TRM_BITS, STATS__CABAC_FIXED_BITS, +#if !JVET_O0525_REMOVE_PCM STATS__CABAC_PCM_ALIGN_BITS, STATS__CABAC_PCM_CODE_BITS, +#endif STATS__BYTE_ALIGNMENT_BITS, STATS__TRAILING_BITS, STATS__EXPLICIT_RDPCM_BITS, @@ -198,8 +200,10 @@ static inline const char* getName(CodingStatisticsType name) "CABAC_BITS__ALF", "CABAC_TRM_BITS", "CABAC_FIXED_BITS", +#if !JVET_O0525_REMOVE_PCM "CABAC_PCM_ALIGN_BITS", "CABAC_PCM_CODE_BITS", +#endif "BYTE_ALIGNMENT_BITS", "TRAILING_BITS", "EXPLICIT_RDPCM_BITS", diff --git a/source/Lib/CommonLib/LoopFilter.cpp b/source/Lib/CommonLib/LoopFilter.cpp index 35b4cd16d44ad390072998fd43b84ce62a81779a..13424b7d8e41683a7534e9cda36303504f6d8cad 100644 --- a/source/Lib/CommonLib/LoopFilter.cpp +++ b/source/Lib/CommonLib/LoopFilter.cpp @@ -914,7 +914,9 @@ void LoopFilter::xEdgeFilterLuma( const CodingUnit& cu, const DeblockEdgeDir edg unsigned uiBsAbsIdx = 0, uiBs = 0; int iOffset, iSrcStep; +#if !JVET_O0525_REMOVE_PCM bool bPCMFilter = (sps.getPCMEnabledFlag() && sps.getPCMFilterDisableFlag()) ? true : false; +#endif bool bPartPNoFilter = false; bool bPartQNoFilter = false; int betaOffsetDiv2 = slice.getDeblockingFilterBetaOffsetDiv2(); @@ -1071,12 +1073,14 @@ void LoopFilter::xEdgeFilterLuma( const CodingUnit& cu, const DeblockEdgeDir edg int dL = d0L + d3L; bPartPNoFilter = bPartQNoFilter = false; +#if !JVET_O0525_REMOVE_PCM if (bPCMFilter) { // Check if each of PUs is I_PCM with LF disabling bPartPNoFilter = cuP.ipcm; bPartQNoFilter = cuQ.ipcm; } +#endif if (ppsTransquantBypassEnabledFlag) { // check if each of PUs is lossless coded @@ -1124,12 +1128,14 @@ void LoopFilter::xEdgeFilterLuma( const CodingUnit& cu, const DeblockEdgeDir edg const int d = d0 + d3; bPartPNoFilter = bPartQNoFilter = false; +#if !JVET_O0525_REMOVE_PCM if( bPCMFilter ) { // Check if each of PUs is I_PCM with LF disabling bPartPNoFilter = cuP.ipcm; bPartQNoFilter = cuQ.ipcm; } +#endif if( ppsTransquantBypassEnabledFlag ) { // check if each of PUs is lossless coded @@ -1199,7 +1205,9 @@ void LoopFilter::xEdgeFilterChroma(const CodingUnit& cu, const DeblockEdgeDir ed int iOffset, iSrcStep; unsigned uiLoopLength; +#if !JVET_O0525_REMOVE_PCM bool bPCMFilter = (sps.getPCMEnabledFlag() && sps.getPCMFilterDisableFlag()) ? true : false; +#endif bool bPartPNoFilter = false; bool bPartQNoFilter = false; const int tcOffsetDiv2 = slice.getDeblockingFilterTcOffsetDiv2(); @@ -1282,12 +1290,14 @@ void LoopFilter::xEdgeFilterChroma(const CodingUnit& cu, const DeblockEdgeDir ed } bPartPNoFilter = bPartQNoFilter = false; +#if !JVET_O0525_REMOVE_PCM if (bPCMFilter) { // Check if each of PUs is I_PCM with LF disabling bPartPNoFilter = cuP.ipcm; bPartQNoFilter = cuQ.ipcm; } +#endif if( pps.getTransquantBypassEnabledFlag() ) { // check if each of PUs is lossless coded diff --git a/source/Lib/CommonLib/SampleAdaptiveOffset.cpp b/source/Lib/CommonLib/SampleAdaptiveOffset.cpp index ddd40aeefe4226d11c5a34b552ee63192eeacf13..37ca91c90e1fb3ff2a62b72a898f691ad60a6b80 100644 --- a/source/Lib/CommonLib/SampleAdaptiveOffset.cpp +++ b/source/Lib/CommonLib/SampleAdaptiveOffset.cpp @@ -661,15 +661,27 @@ void SampleAdaptiveOffset::SAOProcess( CodingStructure& cs, SAOBlkParam* saoBlkP DTRACE ( g_trace_ctx, D_CRC, "SAO" ); DTRACE_CRC( g_trace_ctx, D_CRC, cs, cs.getRecoBuf() ); +#if !JVET_O0525_REMOVE_PCM xPCMLFDisableProcess(cs); +#else + xLosslessDisableProcess(cs); +#endif } +#if !JVET_O0525_REMOVE_PCM void SampleAdaptiveOffset::xPCMLFDisableProcess(CodingStructure& cs) +#else +void SampleAdaptiveOffset::xLosslessDisableProcess(CodingStructure& cs) +#endif { const PreCalcValues& pcv = *cs.pcv; +#if !JVET_O0525_REMOVE_PCM const bool bPCMFilter = (cs.sps->getPCMEnabledFlag() && cs.sps->getPCMFilterDisableFlag()) ? true : false; if( bPCMFilter || cs.pps->getTransquantBypassEnabledFlag() ) +#else + if( cs.pps->getTransquantBypassEnabledFlag() ) +#endif { for( uint32_t yPos = 0; yPos < pcv.lumaHeight; yPos += pcv.maxCUHeight ) { @@ -677,22 +689,37 @@ void SampleAdaptiveOffset::xPCMLFDisableProcess(CodingStructure& cs) { UnitArea ctuArea( cs.area.chromaFormat, Area( xPos, yPos, pcv.maxCUWidth, pcv.maxCUHeight ) ); +#if !JVET_O0525_REMOVE_PCM // CU-based deblocking xPCMCURestoration(cs, ctuArea); +#else + xLosslessCURestoration(cs, ctuArea); +#endif } } } } +#if !JVET_O0525_REMOVE_PCM void SampleAdaptiveOffset::xPCMCURestoration(CodingStructure& cs, const UnitArea &ctuArea) +#else +void SampleAdaptiveOffset::xLosslessCURestoration(CodingStructure& cs, const UnitArea &ctuArea) +#endif { +#if !JVET_O0525_REMOVE_PCM const SPS& sps = *cs.sps; +#endif uint32_t numComponents; bool anyDualTree = false; for( auto &cu : cs.traverseCUs( ctuArea, CH_L ) ) { +#if !JVET_O0525_REMOVE_PCM // restore PCM samples if( ( cu.ipcm && sps.getPCMFilterDisableFlag() ) || CU::isLosslessCoded( cu ) ) +#else + // restore lossless samples + if( CU::isLosslessCoded( cu ) ) +#endif { cs.slice = cu.slice; @@ -700,7 +727,11 @@ void SampleAdaptiveOffset::xPCMCURestoration(CodingStructure& cs, const UnitArea numComponents = CS::isDualITree(cs) ? 1 : m_numberOfComponents; for( uint32_t comp = 0; comp < numComponents; comp++ ) { +#if !JVET_O0525_REMOVE_PCM xPCMSampleRestoration( cu, ComponentID( comp ) ); +#else + xLosslessSampleRestoration( cu, ComponentID( comp ) ); +#endif } } } @@ -714,22 +745,39 @@ void SampleAdaptiveOffset::xPCMCURestoration(CodingStructure& cs, const UnitArea continue; } +#if !JVET_O0525_REMOVE_PCM // restore PCM samples if ((cu.ipcm && sps.getPCMFilterDisableFlag()) || CU::isLosslessCoded(cu)) +#else + // restore lossless samples + if (CU::isLosslessCoded(cu)) +#endif { for (uint32_t comp = 1; comp < numComponents; comp++) { +#if !JVET_O0525_REMOVE_PCM xPCMSampleRestoration(cu, ComponentID(comp)); +#else + xLosslessSampleRestoration(cu, ComponentID(comp)); +#endif } } } } } +#if !JVET_O0525_REMOVE_PCM void SampleAdaptiveOffset::xPCMSampleRestoration(CodingUnit& cu, const ComponentID compID) +#else +void SampleAdaptiveOffset::xLosslessSampleRestoration(CodingUnit& cu, const ComponentID compID) +#endif { +#if !JVET_O0525_REMOVE_PCM const CompArea& ca = cu.block(compID); if( CU::isLosslessCoded( cu ) && !cu.ipcm ) +#else + if( CU::isLosslessCoded( cu ) ) +#endif { for( auto &currTU : CU::traverseTUs( cu ) ) { @@ -746,6 +794,7 @@ void SampleAdaptiveOffset::xPCMSampleRestoration(CodingUnit& cu, const Component return; } +#if !JVET_O0525_REMOVE_PCM const TransformUnit& tu = *cu.firstTU; CHECK( cu.firstTU != cu.lastTU, "Multiple TUs present in a PCM CU" ); const CPelBuf& pcmBuf = tu.getPcmbuf( compID ); PelBuf dstBuf = cu.cs->getRecoBuf( ca ); @@ -763,6 +812,7 @@ void SampleAdaptiveOffset::xPCMSampleRestoration(CodingUnit& cu, const Component { dstBuf.rspSignal(m_pcReshape->getInvLUT()); } +#endif } void SampleAdaptiveOffset::deriveLoopFilterBoundaryAvailibility(CodingStructure& cs, const Position &pos, diff --git a/source/Lib/CommonLib/SampleAdaptiveOffset.h b/source/Lib/CommonLib/SampleAdaptiveOffset.h index c314eb6f6849984e2a582335d0812a18ef8bcdaf..b2cdcb3da82a2b79a0a37d162fd7ce572c93051f 100644 --- a/source/Lib/CommonLib/SampleAdaptiveOffset.h +++ b/source/Lib/CommonLib/SampleAdaptiveOffset.h @@ -91,9 +91,15 @@ protected: void reconstructBlkSAOParam(SAOBlkParam& recParam, SAOBlkParam* mergeList[NUM_SAO_MERGE_TYPES]); int getMergeList(CodingStructure& cs, int ctuRsAddr, SAOBlkParam* blkParams, SAOBlkParam* mergeList[NUM_SAO_MERGE_TYPES]); void offsetCTU(const UnitArea& area, const CPelUnitBuf& src, PelUnitBuf& res, SAOBlkParam& saoblkParam, CodingStructure& cs); +#if !JVET_O0525_REMOVE_PCM void xPCMLFDisableProcess(CodingStructure& cs); void xPCMCURestoration(CodingStructure& cs, const UnitArea &ctuArea); void xPCMSampleRestoration(CodingUnit& cu, const ComponentID compID); +#else + void xLosslessDisableProcess(CodingStructure& cs); + void xLosslessCURestoration(CodingStructure& cs, const UnitArea &ctuArea); + void xLosslessSampleRestoration(CodingUnit& cu, const ComponentID compID); +#endif void xReconstructBlkSAOParams(CodingStructure& cs, SAOBlkParam* saoBlkParams); bool isCrossedByVirtualBoundaries(const int xPos, const int yPos, const int width, const int height, int& numHorVirBndry, int& numVerVirBndry, int horVirBndryPos[], int verVirBndryPos[], const PPS* pps); inline bool isProcessDisabled(int xPos, int yPos, int numVerVirBndry, int numHorVirBndry, int verVirBndryPos[], int horVirBndryPos[]) diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp index 2404f16821df58912232b775e2dd1a19a4a8b6dc..ff5fbb969e5c82a3cb48eaea795b28523ef79270 100644 --- a/source/Lib/CommonLib/Slice.cpp +++ b/source/Lib/CommonLib/Slice.cpp @@ -1413,9 +1413,11 @@ SPS::SPS() , m_allRplEntriesHasSameSignFlag ( true ) , m_bLongTermRefsPresent (false) // Tool list +#if !JVET_O0525_REMOVE_PCM , m_pcmEnabledFlag (false) , m_pcmLog2MaxSize ( 5) , m_uiPCMLog2MinSize ( 7) +#endif #if JVET_O1136_TS_BDPCM_SIGNALLING , m_transformSkipEnabledFlag (false) , m_BDPCMEnabledFlag (false) @@ -1423,7 +1425,9 @@ SPS::SPS() #if JVET_O0376_SPS_JOINTCBCR_FLAG , m_JointCbCrEnabledFlag (false) #endif +#if !JVET_O0525_REMOVE_PCM , m_bPCMFilterDisableFlag (false) +#endif , m_sbtmvpEnabledFlag (false) , m_bdofEnabledFlag (false) , m_fpelMmvdEnabledFlag ( false ) @@ -1475,7 +1479,9 @@ SPS::SPS() for(int ch=0; ch<MAX_NUM_CHANNEL_TYPE; ch++) { m_bitDepths.recon[ch] = 8; +#if !JVET_O0525_REMOVE_PCM m_pcmBitDepths[ch] = 8; +#endif m_qpBDOffset [ch] = 0; } diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index bf8fa59fd884f8ffdcff9dffe16b26f7b4e71862..fea7245580fc3668a4137ca042c73087c7e3b0a0 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -188,7 +188,9 @@ class ConstraintInfo bool m_noPartitionConstraintsOverrideConstraintFlag; bool m_noSaoConstraintFlag; bool m_noAlfConstraintFlag; +#if !JVET_O0525_REMOVE_PCM bool m_noPcmConstraintFlag; +#endif bool m_noRefWraparoundConstraintFlag; bool m_noTemporalMvpConstraintFlag; bool m_noSbtmvpConstraintFlag; @@ -229,7 +231,9 @@ public: , m_noPartitionConstraintsOverrideConstraintFlag(false) , m_noSaoConstraintFlag (false) , m_noAlfConstraintFlag (false) +#if !JVET_O0525_REMOVE_PCM , m_noPcmConstraintFlag (false) +#endif , m_noRefWraparoundConstraintFlag(false) , m_noTemporalMvpConstraintFlag(false) , m_noSbtmvpConstraintFlag (false) @@ -297,8 +301,10 @@ public: bool getNoJointCbCrConstraintFlag() const { return m_noJointCbCrConstraintFlag; } void setNoJointCbCrConstraintFlag(bool bVal) { m_noJointCbCrConstraintFlag = bVal; } #endif +#if !JVET_O0525_REMOVE_PCM bool getNoPcmConstraintFlag() const { return m_noPcmConstraintFlag; } void setNoPcmConstraintFlag(bool bVal) { m_noPcmConstraintFlag = bVal; } +#endif bool getNoRefWraparoundConstraintFlag() const { return m_noRefWraparoundConstraintFlag; } void setNoRefWraparoundConstraintFlag(bool bVal) { m_noRefWraparoundConstraintFlag = bVal; } bool getNoTemporalMvpConstraintFlag() const { return m_noTemporalMvpConstraintFlag; } @@ -771,9 +777,11 @@ private: int m_numReorderPics[MAX_TLAYER]; // Tool list +#if !JVET_O0525_REMOVE_PCM bool m_pcmEnabledFlag; uint32_t m_pcmLog2MaxSize; uint32_t m_uiPCMLog2MinSize; +#endif #if JVET_O1136_TS_BDPCM_SIGNALLING bool m_transformSkipEnabledFlag; @@ -788,8 +796,10 @@ private: #if JVET_O0919_TS_MIN_QP int m_minQpMinus4[MAX_NUM_CHANNEL_TYPE]; // QP_internal - QP_input; #endif +#if !JVET_O0525_REMOVE_PCM int m_pcmBitDepths[MAX_NUM_CHANNEL_TYPE]; bool m_bPCMFilterDisableFlag; +#endif bool m_sbtmvpEnabledFlag; bool m_bdofEnabledFlag; @@ -948,12 +958,14 @@ public: uint32_t getMaxCUHeight() const { return m_uiMaxCUHeight; } void setMaxCodingDepth( uint32_t u ) { m_uiMaxCodingDepth = u; } uint32_t getMaxCodingDepth() const { return m_uiMaxCodingDepth; } +#if !JVET_O0525_REMOVE_PCM void setPCMEnabledFlag( bool b ) { m_pcmEnabledFlag = b; } bool getPCMEnabledFlag() const { return m_pcmEnabledFlag; } void setPCMLog2MaxSize( uint32_t u ) { m_pcmLog2MaxSize = u; } uint32_t getPCMLog2MaxSize() const { return m_pcmLog2MaxSize; } void setPCMLog2MinSize( uint32_t u ) { m_uiPCMLog2MinSize = u; } uint32_t getPCMLog2MinSize() const { return m_uiPCMLog2MinSize; } +#endif #if JVET_O1136_TS_BDPCM_SIGNALLING bool getTransformSkipEnabledFlag() const { return m_transformSkipEnabledFlag; } void setTransformSkipEnabledFlag( bool b ) { m_transformSkipEnabledFlag = b; } @@ -1030,10 +1042,12 @@ public: bool getTemporalIdNestingFlag() const { return m_bTemporalIdNestingFlag; } void setTemporalIdNestingFlag( bool bValue ) { m_bTemporalIdNestingFlag = bValue; } +#if !JVET_O0525_REMOVE_PCM uint32_t getPCMBitDepth(ChannelType type) const { return m_pcmBitDepths[type]; } void setPCMBitDepth(ChannelType type, uint32_t u) { m_pcmBitDepths[type] = u; } void setPCMFilterDisableFlag( bool bValue ) { m_bPCMFilterDisableFlag = bValue; } bool getPCMFilterDisableFlag() const { return m_bPCMFilterDisableFlag; } +#endif bool getScalingListFlag() const { return m_scalingListEnabledFlag; } void setScalingListFlag( bool b ) { m_scalingListEnabledFlag = b; } diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 2a72e25f20a0d0882b52a6eef0c67e163ed636d4..85db89b0860226823bdfa1be74862dc5d7d99b12 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -177,6 +177,8 @@ #define JVET_O0545_MAX_TB_SIGNALLING 1 // JVET-O0545: Configurable maximum transform size +#define JVET_O0525_REMOVE_PCM 1 // JVET-O0525: Removal of PCM mode + #define JVET_O0541_IMPLICIT_MTS_CONDITION 1 // JVET_O0541: Decouple the intra implicit transform selection from an inter MTS related SPS flag #define JVET_O0163_REMOVE_SWITCHING_TMV 1 // JVET-O0163/JVET-O0588: Remove switching between L0 and L1 for temporal MV #define JVET_O0655_422_CHROMA_DM_MAPPING_FIX 1 // JVET-O0655: modify chroma DM derivation table for 4:2:2 chroma format @@ -245,7 +247,9 @@ #define JVET_M0497_MATRIX_MULT 0 // 0: Fast method; 1: Matrix multiplication #define APPLY_SBT_SL_ON_MTS 1 // apply save & load fast algorithm on inter MTS when SBT is on +#if !JVET_O0525_REMOVE_PCM #define FIX_PCM 1 // Fix PCM bugs in VTM3 +#endif #if JVET_O0545_MAX_TB_SIGNALLING #define MAX_TB_SIZE_SIGNALLING 1 diff --git a/source/Lib/CommonLib/Unit.cpp b/source/Lib/CommonLib/Unit.cpp index 05d8548154096179a7dfd48c31b027130137ed90..b603e3fe0383b0fa0733cf6de8faed1a1293bdc7 100644 --- a/source/Lib/CommonLib/Unit.cpp +++ b/source/Lib/CommonLib/Unit.cpp @@ -268,7 +268,9 @@ CodingUnit& CodingUnit::operator=( const CodingUnit& other ) triangle = other.triangle; transQuantBypass = other.transQuantBypass; bdpcmMode = other.bdpcmMode; +#if !JVET_O0525_REMOVE_PCM ipcm = other.ipcm; +#endif qp = other.qp; chromaQpAdj = other.chromaQpAdj; rootCbf = other.rootCbf; @@ -322,7 +324,9 @@ void CodingUnit::initData() triangle = false; transQuantBypass = false; bdpcmMode = 0; +#if !JVET_O0525_REMOVE_PCM ipcm = false; +#endif qp = 0; chromaQpAdj = 0; rootCbf = true; diff --git a/source/Lib/CommonLib/Unit.h b/source/Lib/CommonLib/Unit.h index f5c92b9d8093171afc666674cd9c562654d66e13..d2cd41d67e7d3c6736fdd98f08e8234c59ed716f 100644 --- a/source/Lib/CommonLib/Unit.h +++ b/source/Lib/CommonLib/Unit.h @@ -315,7 +315,9 @@ struct CodingUnit : public UnitArea bool triangle; bool transQuantBypass; int bdpcmMode; +#if !JVET_O0525_REMOVE_PCM bool ipcm; +#endif uint8_t imv; bool rootCbf; uint8_t sbtInfo; diff --git a/source/Lib/CommonLib/dtrace_blockstatistics.cpp b/source/Lib/CommonLib/dtrace_blockstatistics.cpp index 38f9221ce4b1a07943cb7e0bdf970386551bccd0..99042a6cfa4a8fcca39da5d3824f1d40448596eb 100644 --- a/source/Lib/CommonLib/dtrace_blockstatistics.cpp +++ b/source/Lib/CommonLib/dtrace_blockstatistics.cpp @@ -672,14 +672,18 @@ void writeAllData(const CodingStructure& cs, const UnitArea& ctuArea) { if(chType == CHANNEL_TYPE_LUMA) { +#if !JVET_O0525_REMOVE_PCM DTRACE_BLOCK_SCALAR(g_trace_ctx, D_BLOCK_STATISTICS_ALL, cu, GetBlockStatisticName(BlockStatistic::IPCM), cu.ipcm); +#endif DTRACE_BLOCK_SCALAR(g_trace_ctx, D_BLOCK_STATISTICS_ALL, cu, GetBlockStatisticName(BlockStatistic::MIPFlag), cu.mipFlag); DTRACE_BLOCK_SCALAR(g_trace_ctx, D_BLOCK_STATISTICS_ALL, cu, GetBlockStatisticName(BlockStatistic::ISPMode), cu.ispMode); } +#if !JVET_O0525_REMOVE_PCM else if(chType == CHANNEL_TYPE_CHROMA) { DTRACE_BLOCK_SCALAR_CHROMA(g_trace_ctx, D_BLOCK_STATISTICS_ALL, cu, GetBlockStatisticName(BlockStatistic::IPCM_Chroma), cu.ipcm); } +#endif const uint32_t numChType = ::getNumberValidChannels( cu.chromaFormat ); @@ -806,6 +810,7 @@ void writeAllCodedData(const CodingStructure & cs, const UnitArea & ctuArea) // prediction mode and partitioning data DTRACE_BLOCK_SCALAR(g_trace_ctx, D_BLOCK_STATISTICS_CODED, cu, GetBlockStatisticName(BlockStatistic::PredMode), cu.predMode); +#if !JVET_O0525_REMOVE_PCM if (CU::isIntra(cu)) { if (!(!sps.getPCMEnabledFlag() || cu.lumaSize().width > (1 << sps.getPCMLog2MaxSize()) || cu.lumaSize().width < (1 << sps.getPCMLog2MinSize()))) @@ -813,6 +818,7 @@ void writeAllCodedData(const CodingStructure & cs, const UnitArea & ctuArea) DTRACE_BLOCK_SCALAR(g_trace_ctx, D_BLOCK_STATISTICS_CODED, cu, GetBlockStatisticName(BlockStatistic::IPCM), cu.ipcm); } } +#endif } else if (chType == CHANNEL_TYPE_CHROMA ) { @@ -829,6 +835,7 @@ void writeAllCodedData(const CodingStructure & cs, const UnitArea & ctuArea) DTRACE_BLOCK_SCALAR_CHROMA(g_trace_ctx, D_BLOCK_STATISTICS_CODED, cu, GetBlockStatisticName(BlockStatistic::TransQuantBypassFlag_Chroma), cu.transQuantBypass); } +#if !JVET_O0525_REMOVE_PCM if (CU::isIntra(cu)) { if (!(!sps.getPCMEnabledFlag() || cu.lumaSize().width > (1 << sps.getPCMLog2MaxSize()) || cu.lumaSize().width < (1 << sps.getPCMLog2MinSize()))) @@ -836,6 +843,7 @@ void writeAllCodedData(const CodingStructure & cs, const UnitArea & ctuArea) DTRACE_BLOCK_SCALAR_CHROMA(g_trace_ctx, D_BLOCK_STATISTICS_CODED, cu, GetBlockStatisticName(BlockStatistic::IPCM_Chroma), cu.ipcm); } } +#endif } for (const PredictionUnit &pu : CU::traversePUs(cu)) diff --git a/source/Lib/CommonLib/dtrace_blockstatistics.h b/source/Lib/CommonLib/dtrace_blockstatistics.h index 865b1753a574b89f104420f68b78046c42b81144..80995171d30783e2c6a2557a1cabe3ab4ca1cc45 100644 --- a/source/Lib/CommonLib/dtrace_blockstatistics.h +++ b/source/Lib/CommonLib/dtrace_blockstatistics.h @@ -76,7 +76,9 @@ enum class BlockStatistic { RDPCM_Cr, // intra +#if !JVET_O0525_REMOVE_PCM IPCM, +#endif Luma_IntraMode, Chroma_IntraMode, MultiRefIdx, @@ -132,7 +134,9 @@ enum class BlockStatistic { TransQuantBypassFlag_Chroma, // intra +#if !JVET_O0525_REMOVE_PCM IPCM_Chroma, +#endif NumBlockStatistics, }; @@ -157,7 +161,9 @@ static const std::map<BlockStatistic, std::tuple<std::string, BlockStatisticType { BlockStatistic::RegularMergeFlag, std::tuple<std::string, BlockStatisticType, std::string>{"RegularMergeFlag", BlockStatisticType::Flag, ""}}, { BlockStatistic::MVL0, std::tuple<std::string, BlockStatisticType, std::string>{"MVL0", BlockStatisticType::Vector, "Scale: 4"}}, { BlockStatistic::MVL1, std::tuple<std::string, BlockStatisticType, std::string>{"MVL1", BlockStatisticType::Vector, "Scale: 4"}}, +#if !JVET_O0525_REMOVE_PCM { BlockStatistic::IPCM, std::tuple<std::string, BlockStatisticType, std::string>{"IPCM", BlockStatisticType::Flag, ""}}, +#endif { BlockStatistic::Luma_IntraMode, std::tuple<std::string, BlockStatisticType, std::string>{"Luma_IntraMode", BlockStatisticType::Integer, "[0, " + std::to_string(NUM_INTRA_MODE) + "]"}}, { BlockStatistic::Chroma_IntraMode, std::tuple<std::string, BlockStatisticType, std::string>{"Chroma_IntraMode", BlockStatisticType::Integer, "[0, " + std::to_string(NUM_INTRA_MODE) + "]"}}, { BlockStatistic::SkipFlag, std::tuple<std::string, BlockStatisticType, std::string>{"SkipFlag", BlockStatisticType::Flag, ""}}, @@ -223,7 +229,9 @@ static const std::map<BlockStatistic, std::tuple<std::string, BlockStatisticType { BlockStatistic::QP_Chroma, std::tuple<std::string, BlockStatisticType, std::string>{"QP_Chroma", BlockStatisticType::Integer, "[0, 51]"}}, { BlockStatistic::SplitSeries_Chroma, std::tuple<std::string, BlockStatisticType, std::string>{"SplitSeries_Chroma", BlockStatisticType::Integer, "[0, " + std::to_string(std::numeric_limits<SplitSeries>::max()) + "]"}}, { BlockStatistic::TransQuantBypassFlag_Chroma, std::tuple<std::string, BlockStatisticType, std::string>{"TransQuantBypassFlag_Chroma", BlockStatisticType::Flag, ""}}, +#if !JVET_O0525_REMOVE_PCM { BlockStatistic::IPCM_Chroma, std::tuple<std::string, BlockStatisticType, std::string>{"IPCM_Chroma", BlockStatisticType::Flag, ""}}, +#endif }; diff --git a/source/Lib/CommonLib/x86/AdaptiveLoopFilterX86.h b/source/Lib/CommonLib/x86/AdaptiveLoopFilterX86.h index 35790793977058e8bc416ae818e1e6f293ccd07e..5bf5a76354b543b1dd1121fba1b3d7f916a479ee 100644 --- a/source/Lib/CommonLib/x86/AdaptiveLoopFilterX86.h +++ b/source/Lib/CommonLib/x86/AdaptiveLoopFilterX86.h @@ -280,10 +280,12 @@ static void simdFilter5x5Blk(AlfClassifier **classifier, const PelUnitBuf &recDs CHECK((vbCTUHeight & (vbCTUHeight - 1)) != 0, "vbCTUHeight must be a power of 2"); CHECK(!isChroma(compId), "ALF 5x5 filter is for chroma only"); +#if !JVET_O0525_REMOVE_PCM const SPS* sps = cs.slice->getSPS(); bool isDualTree = CS::isDualITree(cs); bool isPCMFilterDisabled = sps->getPCMFilterDisableFlag(); ChromaFormat nChromaFormat = sps->getChromaFormatIdc(); +#endif const CPelBuf srcBuffer = recSrc.get(compId); PelBuf dstBuffer = recDst.get(compId); @@ -308,8 +310,10 @@ static void simdFilter5x5Blk(AlfClassifier **classifier, const PelUnitBuf &recDs const Pel *src = srcBuffer.buf + blk.y * srcStride + blk.x; Pel * dst = dstBuffer.buf + blkDst.y * dstStride + blkDst.x; +#if !JVET_O0525_REMOVE_PCM bool pcmFlags2x2[8] = {0,0,0,0,0,0,0,0}; Pel pcmRec2x2[32]; +#endif const __m128i mmOffset = _mm_set1_epi32(ROUND); const __m128i mmMin = _mm_set1_epi16( clpRng.min ); @@ -329,6 +333,7 @@ static void simdFilter5x5Blk(AlfClassifier **classifier, const PelUnitBuf &recDs { for (size_t j = 0; j < width; j += STEP_X) { +#if !JVET_O0525_REMOVE_PCM if (isPCMFilterDisabled) { size_t blkX, blkY; @@ -370,6 +375,7 @@ static void simdFilter5x5Blk(AlfClassifier **classifier, const PelUnitBuf &recDs } } } +#endif for (size_t ii = 0; ii < STEP_Y; ii++) { @@ -456,6 +462,7 @@ static void simdFilter5x5Blk(AlfClassifier **classifier, const PelUnitBuf &recDs _mm_storel_epi64((__m128i *) (dst + ii * dstStride + j), accumA); } } +#if !JVET_O0525_REMOVE_PCM // restore 2x2 PCM chroma blocks if (isPCMFilterDisabled) { @@ -476,6 +483,7 @@ static void simdFilter5x5Blk(AlfClassifier **classifier, const PelUnitBuf &recDs } } } +#endif } @@ -517,9 +525,11 @@ static void simdFilter7x7Blk(AlfClassifier **classifier, const PelUnitBuf &recDs CHECK((vbCTUHeight & (vbCTUHeight - 1)) != 0, "vbCTUHeight must be a power of 2"); CHECK(isChroma(compId), "7x7 ALF filter is meant for luma only"); +#if !JVET_O0525_REMOVE_PCM const SPS *sps = cs.slice->getSPS(); bool isPCMFilterDisabled = sps->getPCMFilterDisableFlag(); +#endif const CPelBuf srcBuffer = recSrc.get(compId); PelBuf dstBuffer = recDst.get(compId); @@ -569,6 +579,7 @@ static void simdFilter7x7Blk(AlfClassifier **classifier, const PelUnitBuf &recDs __m128i rawCoeff0, rawCoeff1; __m128i rawClip0, rawClip1; +#if !JVET_O0525_REMOVE_PCM if (isPCMFilterDisabled && classIdx == AdaptiveLoopFilter::m_ALF_UNUSED_CLASSIDX && transposeIdx == AdaptiveLoopFilter::m_ALF_UNUSED_TRANSPOSIDX) { @@ -579,12 +590,15 @@ static void simdFilter7x7Blk(AlfClassifier **classifier, const PelUnitBuf &recDs } else { +#endif rawCoeff0 = _mm_loadu_si128((const __m128i *) (filterSet + classIdx * MAX_NUM_ALF_LUMA_COEFF)); rawCoeff1 = _mm_loadl_epi64((const __m128i *) (filterSet + classIdx * MAX_NUM_ALF_LUMA_COEFF + 8)); rawClip0 = _mm_loadu_si128((const __m128i *) (fClipSet + classIdx * MAX_NUM_ALF_LUMA_COEFF)); rawClip1 = _mm_loadl_epi64((const __m128i *) (fClipSet + classIdx * MAX_NUM_ALF_LUMA_COEFF + 8)); +#if !JVET_O0525_REMOVE_PCM } +#endif const __m128i s0 = _mm_loadu_si128((const __m128i *) shuffleTab[transposeIdx][0]); const __m128i s1 = _mm_xor_si128(s0, _mm_set1_epi8((char) 0x80)); diff --git a/source/Lib/DecoderLib/BinDecoder.cpp b/source/Lib/DecoderLib/BinDecoder.cpp index 49b3ea2f3a2d91734b2acdda7f3d881c1673c878..03f63b0e62219b4b9fb04781ba507191acc09584 100644 --- a/source/Lib/DecoderLib/BinDecoder.cpp +++ b/source/Lib/DecoderLib/BinDecoder.cpp @@ -257,6 +257,7 @@ unsigned BinDecoderBase::decodeBinTrm() } +#if !JVET_O0525_REMOVE_PCM unsigned BinDecoderBase::decodeBinsPCM( unsigned numBins ) { unsigned bins = 0; @@ -266,6 +267,7 @@ unsigned BinDecoderBase::decodeBinsPCM( unsigned numBins ) #endif return bins; } +#endif void BinDecoderBase::align() diff --git a/source/Lib/DecoderLib/BinDecoder.h b/source/Lib/DecoderLib/BinDecoder.h index 2e45c0d250b3e27208ffdc275f40f2dd5ead1cd8..6a8ef0e0d394c14c50e013bdff3e6368ea291602 100644 --- a/source/Lib/DecoderLib/BinDecoder.h +++ b/source/Lib/DecoderLib/BinDecoder.h @@ -73,7 +73,9 @@ public: unsigned decodeBinsEP ( unsigned numBins ); unsigned decodeRemAbsEP ( unsigned goRicePar, bool useLimitedPrefixLength, int maxLog2TrDynamicRange ); unsigned decodeBinTrm (); +#if !JVET_O0525_REMOVE_PCM unsigned decodeBinsPCM ( unsigned numBins ); +#endif void align (); unsigned getNumBitsRead () { return m_Bitstream->getNumBitsRead() + m_bitsNeeded; } private: diff --git a/source/Lib/DecoderLib/CABACReader.cpp b/source/Lib/DecoderLib/CABACReader.cpp index 259ff38e6d2511263bb29f0db45a8e82a750a753..1ed746ee0ea6a40efc81a96b03d0550b95ddfe5e 100644 --- a/source/Lib/DecoderLib/CABACReader.cpp +++ b/source/Lib/DecoderLib/CABACReader.cpp @@ -832,8 +832,10 @@ PartSplit CABACReader::split_cu_mode( CodingStructure& cs, Partitioner &partitio // void cu_skip_flag ( cu ) // void pred_mode ( cu ) // void part_mode ( cu ) +#if !JVET_O0525_REMOVE_PCM // void pcm_flag ( cu ) // void pcm_samples ( tu ) +#endif // void cu_pred_data ( pus ) // void cu_lic_flag ( cu ) // void intra_luma_pred_modes ( pus ) @@ -904,6 +906,7 @@ bool CABACReader::coding_unit( CodingUnit &cu, Partitioner &partitioner, CUCtx& bdpcm_mode( cu, ComponentID( partitioner.chType ) ); // --> create PUs +#if !JVET_O0525_REMOVE_PCM // pcm samples if( CU::isIntra(cu) ) { @@ -916,6 +919,7 @@ bool CABACReader::coding_unit( CodingUnit &cu, Partitioner &partitioner, CUCtx& } } +#endif // prediction data ( intra prediction modes / reference indexes + motion vectors ) cu_pred_data( cu ); @@ -1323,6 +1327,7 @@ void CABACReader::bdpcm_mode( CodingUnit& cu, const ComponentID compID ) DTRACE( g_trace_ctx, D_SYNTAX, "bdpcm_mode() x=%d, y=%d, w=%d, h=%d, bdpcm=%d\n", cu.lumaPos().x, cu.lumaPos().y, cu.lwidth(), cu.lheight(), cu.bdpcmMode ); } +#if !JVET_O0525_REMOVE_PCM void CABACReader::pcm_flag( CodingUnit& cu, Partitioner &partitioner ) { const SPS& sps = *cu.cs->sps; @@ -1335,6 +1340,7 @@ void CABACReader::pcm_flag( CodingUnit& cu, Partitioner &partitioner ) cu.ipcm = ( m_BinDecoder.decodeBinTrm() ); } +#endif void CABACReader::cu_pred_data( CodingUnit &cu ) { @@ -1449,7 +1455,11 @@ void CABACReader::extend_ref_line(CodingUnit& cu) #if !ENABLE_JVET_L0283_MRL return; #endif +#if !JVET_O0525_REMOVE_PCM if ( !cu.Y().valid() || cu.predMode != MODE_INTRA || !isLuma(cu.chType) || cu.ipcm || cu.bdpcmMode ) +#else + if ( !cu.Y().valid() || cu.predMode != MODE_INTRA || !isLuma(cu.chType) || cu.bdpcmMode ) +#endif { cu.firstPU->multiRefIdx = 0; return; @@ -2906,6 +2916,7 @@ void CABACReader::MHIntra_flag(PredictionUnit& pu) +#if !JVET_O0525_REMOVE_PCM //================================================================================ // clause 7.3.8.7 //-------------------------------------------------------------------------------- @@ -2944,6 +2955,7 @@ void CABACReader::pcm_samples( TransformUnit& tu ) } m_BinDecoder.start(); } +#endif //================================================================================ // clause 7.3.8.8 @@ -3671,7 +3683,11 @@ void CABACReader::mts_coding( TransformUnit& tu, ComponentID compID ) void CABACReader::isp_mode( CodingUnit& cu ) { +#if !JVET_O0525_REMOVE_PCM if( !CU::isIntra( cu ) || !isLuma( cu.chType ) || cu.firstPU->multiRefIdx || cu.ipcm || !cu.cs->sps->getUseISP() || cu.bdpcmMode || !CU::canUseISP( cu, getFirstComponentOfChannel( cu.chType ) ) ) +#else + if( !CU::isIntra( cu ) || !isLuma( cu.chType ) || cu.firstPU->multiRefIdx || !cu.cs->sps->getUseISP() || cu.bdpcmMode || !CU::canUseISP( cu, getFirstComponentOfChannel( cu.chType ) ) ) +#endif { cu.ispMode = NOT_INTRA_SUBPARTITIONS; return; diff --git a/source/Lib/DecoderLib/CABACReader.h b/source/Lib/DecoderLib/CABACReader.h index ee35c9d7b837b204fac9b0bc4fd55d7a8e564fb9..a5f288714cd1fa1c2d9d23b211d8de48d501788b 100644 --- a/source/Lib/DecoderLib/CABACReader.h +++ b/source/Lib/DecoderLib/CABACReader.h @@ -83,7 +83,9 @@ public: void cu_skip_flag ( CodingUnit& cu ); void pred_mode ( CodingUnit& cu ); void bdpcm_mode ( CodingUnit& cu, const ComponentID compID ); +#if !JVET_O0525_REMOVE_PCM void pcm_flag ( CodingUnit& cu, Partitioner& pm ); +#endif void cu_pred_data ( CodingUnit& cu ); void cu_gbi_flag ( CodingUnit& cu ); void extend_ref_line (CodingUnit& cu); @@ -119,8 +121,10 @@ public: void MHIntra_luma_pred_modes ( CodingUnit& cu ); void smvd_mode ( PredictionUnit& pu ); +#if !JVET_O0525_REMOVE_PCM // pcm samples (clause 7.3.8.7) void pcm_samples ( TransformUnit& tu ); +#endif // transform tree (clause 7.3.8.8) #if JVET_O0596_CBF_SIG_ALIGN_TO_SPEC diff --git a/source/Lib/DecoderLib/DecCu.cpp b/source/Lib/DecoderLib/DecCu.cpp index 0f012c2fd3a5bdcddb9dba52b01144ad2d8042d5..9f9831006192874acd95a180cdad6bec83f93e0c 100644 --- a/source/Lib/DecoderLib/DecCu.cpp +++ b/source/Lib/DecoderLib/DecCu.cpp @@ -175,7 +175,11 @@ void DecCu::decompressCtu( CodingStructure& cs, const UnitArea& ctuArea ) break; } +#if !JVET_O0525_REMOVE_PCM if( CU::isLosslessCoded( currCU ) && !currCU.ipcm ) +#else + if( CU::isLosslessCoded( currCU ) ) +#endif { xFillPCMBuffer( currCU ); } @@ -416,11 +420,13 @@ void DecCu::xIntraRecBlk( TransformUnit& tu, const ComponentID compID ) void DecCu::xReconIntraQT( CodingUnit &cu ) { +#if !JVET_O0525_REMOVE_PCM if( cu.ipcm ) { xReconPCM( *cu.firstTU ); return; } +#endif #if JVET_O0119_BASE_PALETTE_444 if (CU::isPLT(cu)) @@ -540,6 +546,7 @@ void DecCu::xReconPLT(CodingUnit &cu, ComponentID compBegin, uint32_t numComp) } } #endif +#if !JVET_O0525_REMOVE_PCM /** Function for deriving reconstructed luma/chroma samples of a PCM mode CU. * \param pcCU pointer to current CU * \param uiPartIdx part index @@ -596,6 +603,7 @@ void DecCu::xReconPCM(TransformUnit &tu) xDecodePCMTexture(tu, compID); } } +#endif /** Function for deriving reconstructed PU/CU chroma samples with QTree structure * \param pcRecoYuv pointer to reconstructed sample arrays diff --git a/source/Lib/DecoderLib/DecCu.h b/source/Lib/DecoderLib/DecCu.h index 2e6956d1b60685ef3957e6db4e78311562ba7bbb..21564ba03398bedd78775ed886ef88b32ae7c089 100644 --- a/source/Lib/DecoderLib/DecCu.h +++ b/source/Lib/DecoderLib/DecCu.h @@ -87,8 +87,10 @@ protected: void xFillPCMBuffer ( CodingUnit& cu ); void xIntraRecBlk ( TransformUnit& tu, const ComponentID compID ); +#if !JVET_O0525_REMOVE_PCM void xReconPCM ( TransformUnit& tu); void xDecodePCMTexture ( TransformUnit& tu, const ComponentID compID ); +#endif void xDecodeInterTU ( TransformUnit& tu, const ComponentID compID ); void xDeriveCUMV ( CodingUnit& cu ); diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index 43ec52ffbf19a27a395b469152dbac374e1c5a00..1e30714bd03e876704885214ff36fb8b14abf8f4 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -1289,6 +1289,7 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) READ_FLAG( uiCode, "sps_sao_enabled_flag" ); pcSPS->setSAOEnabledFlag ( uiCode ? true : false ); READ_FLAG( uiCode, "sps_alf_enabled_flag" ); pcSPS->setALFEnabledFlag ( uiCode ? true : false ); +#if !JVET_O0525_REMOVE_PCM READ_FLAG( uiCode, "sps_pcm_enabled_flag" ); pcSPS->setPCMEnabledFlag( uiCode ? true : false ); if( pcSPS->getPCMEnabledFlag() ) { @@ -1298,6 +1299,7 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) READ_UVLC( uiCode, "log2_diff_max_min_pcm_luma_coding_block_size" ); pcSPS->setPCMLog2MaxSize ( uiCode+pcSPS->getPCMLog2MinSize() ); READ_FLAG( uiCode, "pcm_loop_filter_disable_flag" ); pcSPS->setPCMFilterDisableFlag ( uiCode ? true : false ); } +#endif #if JVET_O1136_TS_BDPCM_SIGNALLING READ_FLAG(uiCode, "sps_transform_skip_enabled_flag"); pcSPS->setTransformSkipEnabledFlag(uiCode ? true : false); @@ -2460,7 +2462,9 @@ void HLSyntaxReader::parseConstraintInfo(ConstraintInfo *cinfo) READ_FLAG(symbol, "no_joint_cbcr_constraint_flag"); cinfo->setNoJointCbCrConstraintFlag(symbol > 0 ? true : false); #endif +#if !JVET_O0525_REMOVE_PCM READ_FLAG(symbol, "no_pcm_constraint_flag"); cinfo->setNoPcmConstraintFlag(symbol > 0 ? true : false); +#endif READ_FLAG(symbol, "no_ref_wraparound_constraint_flag"); cinfo->setNoRefWraparoundConstraintFlag(symbol > 0 ? true : false); READ_FLAG(symbol, "no_temporal_mvp_constraint_flag"); cinfo->setNoTemporalMvpConstraintFlag(symbol > 0 ? true : false); READ_FLAG(symbol, "no_sbtmvp_constraint_flag"); cinfo->setNoSbtmvpConstraintFlag(symbol > 0 ? true : false); diff --git a/source/Lib/EncoderLib/BinEncoder.cpp b/source/Lib/EncoderLib/BinEncoder.cpp index ebad19d3e1a517e3a4cb087e59b9f29abc117329..3fd167fcd42da2059078375f1fbfa24cb26ad8e1 100644 --- a/source/Lib/EncoderLib/BinEncoder.cpp +++ b/source/Lib/EncoderLib/BinEncoder.cpp @@ -285,22 +285,26 @@ void BinEncoderBase::encodeBinTrm( unsigned bin ) } } +#if !JVET_O0525_REMOVE_PCM void BinEncoderBase::encodeBinsPCM( unsigned bins, unsigned numBins ) { m_Bitstream->write( bins, numBins ); } +#endif void BinEncoderBase::align() { m_Range = 256; } +#if !JVET_O0525_REMOVE_PCM void BinEncoderBase::pcmAlignBits() { finish(); m_Bitstream->write( 1, 1 ); m_Bitstream->writeAlignZero(); // pcm align zero } +#endif void BinEncoderBase::encodeAlignedBinsEP( unsigned bins, unsigned numBins ) { @@ -488,6 +492,7 @@ void BitEstimatorBase::align() m_EstFracBits &= mask; } +#if !JVET_O0525_REMOVE_PCM void BitEstimatorBase::pcmAlignBits() { uint64_t numCurrBits = ( m_EstFracBits >> SCALE_BITS ); @@ -495,6 +500,7 @@ void BitEstimatorBase::pcmAlignBits() unsigned bitsToAdd = unsigned( ( filledBytes << 3 ) - numCurrBits ); m_EstFracBits += BinProbModelBase::estFracBitsEP( bitsToAdd ); } +#endif diff --git a/source/Lib/EncoderLib/BinEncoder.h b/source/Lib/EncoderLib/BinEncoder.h index 83c108c05e9a2ee58e1bf47ddd7181a573fe9ade..d829a04eee769ea38201205894734bed40e88ba1 100644 --- a/source/Lib/EncoderLib/BinEncoder.h +++ b/source/Lib/EncoderLib/BinEncoder.h @@ -121,9 +121,13 @@ public: bool useLimitedPrefixLength, int maxLog2TrDynamicRange ) = 0; virtual void encodeBinTrm ( unsigned bin ) = 0; +#if !JVET_O0525_REMOVE_PCM virtual void encodeBinsPCM ( unsigned bins, unsigned numBins ) = 0; +#endif virtual void align () = 0; +#if !JVET_O0525_REMOVE_PCM virtual void pcmAlignBits () = 0; +#endif public: virtual uint32_t getNumBins () = 0; virtual bool isEncoding () = 0; @@ -186,9 +190,13 @@ public: bool useLimitedPrefixLength, int maxLog2TrDynamicRange ); void encodeBinTrm ( unsigned bin ); +#if !JVET_O0525_REMOVE_PCM void encodeBinsPCM ( unsigned bins, unsigned numBins ); +#endif void align (); +#if !JVET_O0525_REMOVE_PCM void pcmAlignBits (); +#endif unsigned getNumWrittenBits () { return ( m_Bitstream->getNumberOfWrittenBits() + 8 * m_numBufferedBytes + 23 - m_bitsLeft ); } public: uint32_t getNumBins () { return BinCounter::getAll(); } @@ -253,9 +261,13 @@ public: unsigned goRicePar, bool useLimitedPrefixLength, int maxLog2TrDynamicRange ); +#if !JVET_O0525_REMOVE_PCM void encodeBinsPCM ( unsigned bins, unsigned numBins ) { m_EstFracBits += BinProbModelBase::estFracBitsEP ( numBins ); } +#endif void align (); +#if !JVET_O0525_REMOVE_PCM void pcmAlignBits (); +#endif public: uint32_t getNumBins () { THROW("Not supported"); return 0; } bool isEncoding () { return false; } diff --git a/source/Lib/EncoderLib/CABACWriter.cpp b/source/Lib/EncoderLib/CABACWriter.cpp index 15493bae3802a5ab1512d58fd473e34d7bf91742..286afa10b40d81e366e1b447f5e73ffe61f3b81e 100644 --- a/source/Lib/EncoderLib/CABACWriter.cpp +++ b/source/Lib/EncoderLib/CABACWriter.cpp @@ -634,8 +634,10 @@ void CABACWriter::split_cu_mode( const PartSplit split, const CodingStructure& c // void cu_skip_flag ( cu ) // void pred_mode ( cu ) // void part_mode ( cu ) +#if !JVET_O0525_REMOVE_PCM // void pcm_flag ( cu ) // void pcm_samples ( tu ) +#endif // void cu_pred_data ( pus ) // void cu_lic_flag ( cu ) // void intra_luma_pred_modes ( pus ) @@ -674,6 +676,7 @@ void CABACWriter::coding_unit( const CodingUnit& cu, Partitioner& partitioner, C return; } +#if !JVET_O0525_REMOVE_PCM #if !FIX_PCM // pcm samples if( CU::isIntra(cu) ) @@ -685,6 +688,7 @@ void CABACWriter::coding_unit( const CodingUnit& cu, Partitioner& partitioner, C return; } } +#endif #endif // prediction mode and partitioning data @@ -717,6 +721,7 @@ void CABACWriter::coding_unit( const CodingUnit& cu, Partitioner& partitioner, C #endif bdpcm_mode( cu, ComponentID( partitioner.chType ) ); +#if !JVET_O0525_REMOVE_PCM #if FIX_PCM // pcm samples if( CU::isIntra(cu) ) @@ -728,6 +733,7 @@ void CABACWriter::coding_unit( const CodingUnit& cu, Partitioner& partitioner, C return; } } +#endif #endif // prediction data ( intra prediction modes / reference indexes + motion vectors ) @@ -981,6 +987,7 @@ void CABACWriter::bdpcm_mode( const CodingUnit& cu, const ComponentID compID ) } DTRACE( g_trace_ctx, D_SYNTAX, "bdpcm_mode() x=%d, y=%d, w=%d, h=%d, bdpcm=%d\n", cu.lumaPos().x, cu.lumaPos().y, cu.lwidth(), cu.lheight(), cu.bdpcmMode ); } +#if !JVET_O0525_REMOVE_PCM void CABACWriter::pcm_data( const CodingUnit& cu, Partitioner& partitioner ) { pcm_flag( cu, partitioner ); @@ -1001,6 +1008,7 @@ void CABACWriter::pcm_flag( const CodingUnit& cu, Partitioner& partitioner ) } m_BinEncoder.encodeBinTrm( cu.ipcm ); } +#endif void CABACWriter::cu_pred_data( const CodingUnit& cu ) @@ -1146,7 +1154,11 @@ void CABACWriter::extend_ref_line(const CodingUnit& cu) return; #endif +#if !JVET_O0525_REMOVE_PCM if ( !cu.Y().valid() || cu.predMode != MODE_INTRA || !isLuma(cu.chType) || cu.ipcm || cu.bdpcmMode ) +#else + if ( !cu.Y().valid() || cu.predMode != MODE_INTRA || !isLuma(cu.chType) || cu.bdpcmMode ) +#endif { return; } @@ -2713,6 +2725,7 @@ void CABACWriter::MHIntra_flag(const PredictionUnit& pu) +#if !JVET_O0525_REMOVE_PCM //================================================================================ // clause 7.3.8.7 //-------------------------------------------------------------------------------- @@ -2751,6 +2764,7 @@ void CABACWriter::pcm_samples( const TransformUnit& tu ) m_BinEncoder.restart(); } +#endif //================================================================================ @@ -3487,7 +3501,11 @@ void CABACWriter::mts_coding( const TransformUnit& tu, ComponentID compID ) void CABACWriter::isp_mode( const CodingUnit& cu ) { +#if !JVET_O0525_REMOVE_PCM if( !CU::isIntra( cu ) || !isLuma( cu.chType ) || cu.firstPU->multiRefIdx || cu.ipcm || !cu.cs->sps->getUseISP() || cu.bdpcmMode || !CU::canUseISP( cu, getFirstComponentOfChannel( cu.chType ) ) ) +#else + if( !CU::isIntra( cu ) || !isLuma( cu.chType ) || cu.firstPU->multiRefIdx || !cu.cs->sps->getUseISP() || cu.bdpcmMode || !CU::canUseISP( cu, getFirstComponentOfChannel( cu.chType ) ) ) +#endif { CHECK( cu.ispMode != NOT_INTRA_SUBPARTITIONS, "cu.ispMode != 0" ); return; diff --git a/source/Lib/EncoderLib/CABACWriter.h b/source/Lib/EncoderLib/CABACWriter.h index 4da4200c30bb9dfeb91b3def3aa62feb9074a316..4285192d67ef4b4b4fab57a75a979944cc657984 100644 --- a/source/Lib/EncoderLib/CABACWriter.h +++ b/source/Lib/EncoderLib/CABACWriter.h @@ -94,8 +94,10 @@ public: void pred_mode ( const CodingUnit& cu ); void bdpcm_mode ( const CodingUnit& cu, const ComponentID compID ); +#if !JVET_O0525_REMOVE_PCM void pcm_data ( const CodingUnit& cu, Partitioner& pm ); void pcm_flag ( const CodingUnit& cu, Partitioner& pm ); +#endif void cu_pred_data ( const CodingUnit& cu ); void cu_gbi_flag ( const CodingUnit& cu ); void extend_ref_line (const PredictionUnit& pu ); @@ -138,8 +140,10 @@ public: void MHIntra_luma_pred_modes ( const CodingUnit& cu ); void smvd_mode ( const PredictionUnit& pu ); +#if !JVET_O0525_REMOVE_PCM // pcm samples (clause 7.3.8.7) void pcm_samples ( const TransformUnit& tu ); +#endif // transform tree (clause 7.3.8.8) #if JVET_O0596_CBF_SIG_ALIGN_TO_SPEC diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp index 2f6037cbb70d69c2fb554f4d672df85668fad650..7c6634315dedc127a687299b77f97fe273dcad8f 100644 --- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp +++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp @@ -755,8 +755,10 @@ void EncAdaptiveLoopFilter::ALFProcess(CodingStructure& cs, const double *lambda const Area blkSrc( 0, 0, w, h ); const Area blkDst( xStart, yStart, w, h ); deriveClassification( m_classifier, buf.get(COMPONENT_Y), blkDst, blkSrc ); +#if !JVET_O0525_REMOVE_PCM Area blkPCM( xStart, yStart, w, h ); resetPCMBlkClassInfo( cs, m_classifier, buf.get(COMPONENT_Y), blkPCM ); +#endif xStart = xEnd; } @@ -768,8 +770,10 @@ void EncAdaptiveLoopFilter::ALFProcess(CodingStructure& cs, const double *lambda { Area blk( xPos, yPos, width, height ); deriveClassification( m_classifier, recLuma, blk, blk ); +#if !JVET_O0525_REMOVE_PCM Area blkPCM( xPos, yPos, width, height ); resetPCMBlkClassInfo( cs, m_classifier, recLuma, blkPCM ); +#endif } } } diff --git a/source/Lib/EncoderLib/EncCfg.h b/source/Lib/EncoderLib/EncCfg.h index b2e2501e94913cb7072942fc0f93c7b26651cb8e..7644bbd86dc1f5ab432f778a3e68d48a625b59b8 100644 --- a/source/Lib/EncoderLib/EncCfg.h +++ b/source/Lib/EncoderLib/EncCfg.h @@ -188,7 +188,9 @@ protected: bool m_noPartitionConstraintsOverrideConstraintFlag; bool m_bNoSaoConstraintFlag; bool m_bNoAlfConstraintFlag; +#if !JVET_O0525_REMOVE_PCM bool m_bNoPcmConstraintFlag; +#endif bool m_bNoRefWraparoundConstraintFlag; bool m_bNoTemporalMvpConstraintFlag; bool m_bNoSbtmvpConstraintFlag; @@ -463,10 +465,12 @@ protected: bool m_bFastUDIUseMPMEnabled; bool m_bFastMEForGenBLowDelayEnabled; bool m_bUseBLambdaForNonKeyLowDelayPictures; +#if !JVET_O0525_REMOVE_PCM bool m_usePCM; int m_PCMBitDepth[MAX_NUM_CHANNEL_TYPE]; uint32_t m_pcmLog2MaxSize; uint32_t m_uiPCMLog2MinSize; +#endif //====== Slice ======== SliceConstraint m_sliceMode; int m_sliceArgument; @@ -475,8 +479,10 @@ protected: int m_sliceSegmentArgument; bool m_bLFCrossSliceBoundaryFlag; +#if !JVET_O0525_REMOVE_PCM bool m_bPCMInputBitDepthFlag; bool m_bPCMFilterDisableFlag; +#endif bool m_intraSmoothingDisabledFlag; bool m_loopFilterAcrossBricksEnabledFlag; bool m_tileUniformSpacingFlag; @@ -678,8 +684,10 @@ public: : m_tileColumnWidth() , m_tileRowHeight() { +#if !JVET_O0525_REMOVE_PCM m_PCMBitDepth[CHANNEL_TYPE_LUMA]=8; m_PCMBitDepth[CHANNEL_TYPE_CHROMA]=8; +#endif } virtual ~EncCfg() @@ -705,8 +713,10 @@ public: void setNoSaoConstraintFlag(bool bVal) { m_bNoSaoConstraintFlag = bVal; } bool getNoAlfConstraintFlag() const { return m_bNoAlfConstraintFlag; } void setNoAlfConstraintFlag(bool bVal) { m_bNoAlfConstraintFlag = bVal; } +#if !JVET_O0525_REMOVE_PCM bool getNoPcmConstraintFlag() const { return m_bNoPcmConstraintFlag; } void setNoPcmConstraintFlag(bool bVal) { m_bNoPcmConstraintFlag = bVal; } +#endif bool getNoRefWraparoundConstraintFlag() const { return m_bNoRefWraparoundConstraintFlag; } void setNoRefWraparoundConstraintFlag(bool bVal) { m_bNoRefWraparoundConstraintFlag = bVal; } bool getNoTemporalMvpConstraintFlag() const { return m_bNoTemporalMvpConstraintFlag; } @@ -1176,12 +1186,14 @@ public: void setFastMEForGenBLowDelayEnabled ( bool b ) { m_bFastMEForGenBLowDelayEnabled = b; } void setUseBLambdaForNonKeyLowDelayPictures ( bool b ) { m_bUseBLambdaForNonKeyLowDelayPictures = b; } +#if !JVET_O0525_REMOVE_PCM void setPCMInputBitDepthFlag ( bool b ) { m_bPCMInputBitDepthFlag = b; } void setPCMFilterDisableFlag ( bool b ) { m_bPCMFilterDisableFlag = b; } void setUsePCM ( bool b ) { m_usePCM = b; } void setPCMBitDepth( const ChannelType chType, int pcmBitDepthForChannel ) { m_PCMBitDepth[chType] = pcmBitDepthForChannel; } void setPCMLog2MaxSize ( uint32_t u ) { m_pcmLog2MaxSize = u; } void setPCMLog2MinSize ( uint32_t u ) { m_uiPCMLog2MinSize = u; } +#endif void setdQPs ( int* p ) { m_aidQP = p; } void setDeltaQpRD ( uint32_t u ) {m_uiDeltaQpRD = u; } void setFastDeltaQp ( bool b ) {m_bFastDeltaQP = b; } @@ -1203,11 +1215,13 @@ public: bool getFastUDIUseMPMEnabled () { return m_bFastUDIUseMPMEnabled; } bool getFastMEForGenBLowDelayEnabled () { return m_bFastMEForGenBLowDelayEnabled; } bool getUseBLambdaForNonKeyLowDelayPictures () { return m_bUseBLambdaForNonKeyLowDelayPictures; } +#if !JVET_O0525_REMOVE_PCM bool getPCMInputBitDepthFlag () { return m_bPCMInputBitDepthFlag; } bool getPCMFilterDisableFlag () { return m_bPCMFilterDisableFlag; } bool getUsePCM () { return m_usePCM; } uint32_t getPCMLog2MaxSize () { return m_pcmLog2MaxSize; } uint32_t getPCMLog2MinSize () { return m_uiPCMLog2MinSize; } +#endif bool getCrossComponentPredictionEnabledFlag () const { return m_crossComponentPredictionEnabledFlag; } void setCrossComponentPredictionEnabledFlag (const bool value) { m_crossComponentPredictionEnabledFlag = value; } diff --git a/source/Lib/EncoderLib/EncCu.cpp b/source/Lib/EncoderLib/EncCu.cpp index da4f21f5113314c6c9a0811e6ae5f36b9354d737..41d4a4601414c6831836904522a9a60f21cacde7 100644 --- a/source/Lib/EncoderLib/EncCu.cpp +++ b/source/Lib/EncoderLib/EncCu.cpp @@ -594,7 +594,11 @@ bool EncCu::xCheckBestMode( CodingStructure *&tempCS, CodingStructure *&bestCS, // if tempCS is not a split-mode CodingUnit &cu = *tempCS->cus.front(); +#if !JVET_O0525_REMOVE_PCM if( CU::isLosslessCoded( cu ) && !cu.ipcm ) +#else + if( CU::isLosslessCoded( cu ) ) +#endif { xFillPCMBuffer( cu ); } @@ -866,10 +870,12 @@ void EncCu::xCompressCU( CodingStructure *&tempCS, CodingStructure *&bestCS, Par { xCheckRDCostIntra( tempCS, bestCS, partitioner, currTestMode ); } +#if !JVET_O0525_REMOVE_PCM else if( currTestMode.type == ETM_IPCM ) { xCheckIntraPCM( tempCS, bestCS, partitioner, currTestMode ); } +#endif #if JVET_O0119_BASE_PALETTE_444 else if (currTestMode.type == ETM_PALETTE) { @@ -1943,7 +1949,9 @@ void EncCu::xCheckRDCostIntra( CodingStructure *&tempCS, CodingStructure *&bestC cu.transQuantBypass = encTestMode.lossless; cu.chromaQpAdj = cu.transQuantBypass ? 0 : m_cuChromaQpOffsetIdxPlus1; cu.qp = encTestMode.qp; +#if !JVET_O0525_REMOVE_PCM //cu.ipcm = false; +#endif cu.lfnstIdx = lfnstIdx; cu.mtsFlag = mtsFlag; cu.ispMode = NOT_INTRA_SUBPARTITIONS; @@ -2059,7 +2067,9 @@ void EncCu::xCheckRDCostIntra( CodingStructure *&tempCS, CodingStructure *&bestC m_CABACEstimator->cu_skip_flag ( cu ); } m_CABACEstimator->pred_mode ( cu ); +#if !JVET_O0525_REMOVE_PCM m_CABACEstimator->pcm_data ( cu, partitioner ); +#endif m_CABACEstimator->cu_pred_data ( cu ); m_CABACEstimator->bdpcm_mode ( cu, ComponentID(partitioner.chType) ); @@ -2229,6 +2239,7 @@ void EncCu::xCheckRDCostIntra( CodingStructure *&tempCS, CodingStructure *&bestC } //trGrpIdx } +#if !JVET_O0525_REMOVE_PCM void EncCu::xCheckIntraPCM(CodingStructure *&tempCS, CodingStructure *&bestCS, Partitioner &partitioner, const EncTestMode& encTestMode ) { tempCS->initStructData( encTestMode.qp, encTestMode.lossless ); @@ -2289,6 +2300,7 @@ void EncCu::xCheckIntraPCM(CodingStructure *&tempCS, CodingStructure *&bestCS, P #endif xCheckBestMode( tempCS, bestCS, partitioner, encTestMode ); } +#endif #if JVET_O0119_BASE_PALETTE_444 void EncCu::xCheckPLT(CodingStructure *&tempCS, CodingStructure *&bestCS, Partitioner &partitioner, const EncTestMode& encTestMode) @@ -2305,7 +2317,9 @@ void EncCu::xCheckPLT(CodingStructure *&tempCS, CodingStructure *&bestCS, Partit cu.transQuantBypass = encTestMode.lossless; cu.chromaQpAdj = cu.transQuantBypass ? 0 : m_cuChromaQpOffsetIdxPlus1; cu.qp = encTestMode.qp; +#if !JVET_O0525_REMOVE_PCM cu.ipcm = false; +#endif cu.bdpcmMode = 0; tempCS->addPU(CS::getArea(*tempCS, tempCS->area, partitioner.chType), partitioner.chType); diff --git a/source/Lib/EncoderLib/EncCu.h b/source/Lib/EncoderLib/EncCu.h index 5a50a1c513beecc4a8c6fe16721721ab4c67dea6..274d98c152117b944f2638ee88598808e55e7f62 100644 --- a/source/Lib/EncoderLib/EncCu.h +++ b/source/Lib/EncoderLib/EncCu.h @@ -203,7 +203,9 @@ protected: #endif void xCheckRDCostIntra ( CodingStructure *&tempCS, CodingStructure *&bestCS, Partitioner &pm, const EncTestMode& encTestMode ); +#if !JVET_O0525_REMOVE_PCM void xCheckIntraPCM ( CodingStructure *&tempCS, CodingStructure *&bestCS, Partitioner &pm, const EncTestMode& encTestMode ); +#endif void xCheckDQP ( CodingStructure& cs, Partitioner& partitioner, bool bKeepCtx = false); void xFillPCMBuffer ( CodingUnit &cu); diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp index 61c625e9c55d4a4d1f8c4c9c43d5e1e823d37a2e..ed645b167162fd43dd1132daac4145dbe070e0b0 100644 --- a/source/Lib/EncoderLib/EncLib.cpp +++ b/source/Lib/EncoderLib/EncLib.cpp @@ -862,7 +862,9 @@ void EncLib::xInitSPS(SPS &sps) cinfo->setNoPartitionConstraintsOverrideConstraintFlag(m_noPartitionConstraintsOverrideConstraintFlag); cinfo->setNoSaoConstraintFlag(m_bNoSaoConstraintFlag); cinfo->setNoAlfConstraintFlag(m_bNoAlfConstraintFlag); +#if !JVET_O0525_REMOVE_PCM cinfo->setNoPcmConstraintFlag(m_bNoPcmConstraintFlag); +#endif cinfo->setNoRefWraparoundConstraintFlag(m_bNoRefWraparoundConstraintFlag); cinfo->setNoTemporalMvpConstraintFlag(m_bNoTemporalMvpConstraintFlag); cinfo->setNoSbtmvpConstraintFlag(m_bNoSbtmvpConstraintFlag); @@ -1002,9 +1004,11 @@ void EncLib::xInitSPS(SPS &sps) sps.setLog2MinCodingBlockSize(log2MinCUSize); +#if !JVET_O0525_REMOVE_PCM sps.setPCMLog2MinSize (m_uiPCMLog2MinSize); sps.setPCMEnabledFlag ( m_usePCM ); sps.setPCMLog2MaxSize( m_pcmLog2MaxSize ); +#endif #if JVET_O1136_TS_BDPCM_SIGNALLING sps.setTransformSkipEnabledFlag(m_useTransformSkip); @@ -1024,7 +1028,9 @@ void EncLib::xInitSPS(SPS &sps) #if JVET_O0919_TS_MIN_QP sps.setMinQpPrimeTsMinus4(ChannelType(channelType), (6 * (m_bitDepth[channelType] - m_inputBitDepth[channelType]))); #endif +#if !JVET_O0525_REMOVE_PCM sps.setPCMBitDepth (ChannelType(channelType), m_PCMBitDepth[channelType] ); +#endif } #if JVET_O0244_DELTA_POC @@ -1045,7 +1051,9 @@ void EncLib::xInitSPS(SPS &sps) sps.setNumReorderPics(m_numReorderPics[i], i); } +#if !JVET_O0525_REMOVE_PCM sps.setPCMFilterDisableFlag ( m_bPCMFilterDisableFlag ); +#endif sps.setScalingListFlag ( (m_useScalingListId == SCALING_LIST_OFF) ? 0 : 1 ); sps.setALFEnabledFlag( m_alf ); sps.setVuiParametersPresentFlag(getVuiParametersPresentFlag()); diff --git a/source/Lib/EncoderLib/EncModeCtrl.cpp b/source/Lib/EncoderLib/EncModeCtrl.cpp index fc7a30a4dd20a912565deea08baaa88dda8489fb..7c7e1ff124843e55d685b224518a996a521aae8c 100644 --- a/source/Lib/EncoderLib/EncModeCtrl.cpp +++ b/source/Lib/EncoderLib/EncModeCtrl.cpp @@ -1389,7 +1389,9 @@ void EncModeCtrlMTnoRQT::initCULevel( Partitioner &partitioner, const CodingStru if( tryIntraRdo ) { #endif +#if !JVET_O0525_REMOVE_PCM m_ComprCUCtxList.back().testModes.push_back( { ETM_IPCM, ETO_STANDARD, qp, lossless } ); +#endif #if JVET_O0119_BASE_PALETTE_444 if (cs.slice->getSPS()->getPLTMode() && ( cs.slice->isIRAP() || (cs.area.lwidth() == 4 && cs.area.lheight() == 4) ) && getPltEnc() ) { @@ -1540,8 +1542,10 @@ bool EncModeCtrlMTnoRQT::tryMode( const EncTestMode& encTestmode, const CodingSt const SPS& sps = *slice.getSPS(); const uint32_t numComp = getNumberValidComponents( slice.getSPS()->getChromaFormatIdc() ); const uint32_t width = partitioner.currArea().lumaSize().width; +#if !JVET_O0525_REMOVE_PCM #if FIX_PCM const uint32_t height = partitioner.currArea().lumaSize().height; +#endif #endif const CodingStructure *bestCS = cuECtx.bestCS; const CodingUnit *bestCU = cuECtx.bestCU; @@ -1667,6 +1671,7 @@ bool EncModeCtrlMTnoRQT::tryMode( const EncTestMode& encTestmode, const CodingSt return true; } #endif +#if !JVET_O0525_REMOVE_PCM else if( encTestmode.type == ETM_IPCM ) { if( getFastDeltaQp() ) @@ -1688,6 +1693,7 @@ bool EncModeCtrlMTnoRQT::tryMode( const EncTestMode& encTestmode, const CodingSt return sps.getPCMEnabledFlag() && width <= ( 1 << sps.getPCMLog2MaxSize() ) && width >= ( 1 << sps.getPCMLog2MinSize() ); #endif } +#endif else if (encTestmode.type == ETM_IBC || encTestmode.type == ETM_IBC_MERGE) { // IBC MODES diff --git a/source/Lib/EncoderLib/EncModeCtrl.h b/source/Lib/EncoderLib/EncModeCtrl.h index 32dabb5d277a58918103b79e181b6084b5d25510..b29cb082674f5b07c0eb1aae139ac413202547a5 100644 --- a/source/Lib/EncoderLib/EncModeCtrl.h +++ b/source/Lib/EncoderLib/EncModeCtrl.h @@ -63,7 +63,9 @@ enum EncTestModeType ETM_AFFINE, ETM_MERGE_TRIANGLE, ETM_INTRA, +#if !JVET_O0525_REMOVE_PCM ETM_IPCM, +#endif #if JVET_O0119_BASE_PALETTE_444 ETM_PALETTE, #endif diff --git a/source/Lib/EncoderLib/EncSampleAdaptiveOffset.cpp b/source/Lib/EncoderLib/EncSampleAdaptiveOffset.cpp index 8962e86a2ac3820beae6ddcf504f3847aeac16c7..30bcc51ccb67832d212a42ad9e06963699829915 100644 --- a/source/Lib/EncoderLib/EncSampleAdaptiveOffset.cpp +++ b/source/Lib/EncoderLib/EncSampleAdaptiveOffset.cpp @@ -245,7 +245,11 @@ void EncSampleAdaptiveOffset::SAOProcess( CodingStructure& cs, bool* sliceEnable DTRACE ( g_trace_ctx, D_CRC, "SAO" ); DTRACE_CRC( g_trace_ctx, D_CRC, cs, cs.getRecoBuf() ); +#if !JVET_O0525_REMOVE_PCM xPCMLFDisableProcess(cs); +#else + xLosslessDisableProcess(cs); +#endif } diff --git a/source/Lib/EncoderLib/IntraSearch.cpp b/source/Lib/EncoderLib/IntraSearch.cpp index d9c2b821a47bc4ded731afc8c000f1eeaa4a7474..5bbf01bc8f5c5902a29ac110a5f764b762d6a0d0 100644 --- a/source/Lib/EncoderLib/IntraSearch.cpp +++ b/source/Lib/EncoderLib/IntraSearch.cpp @@ -1682,6 +1682,7 @@ void IntraSearch::estIntraPredChromaQT( CodingUnit &cu, Partitioner &partitioner } } +#if !JVET_O0525_REMOVE_PCM void IntraSearch::IPCMSearch(CodingStructure &cs, Partitioner& partitioner) { #if JVET_O0050_LOCAL_DUAL_TREE @@ -1742,6 +1743,7 @@ void IntraSearch::xEncPCM(CodingStructure &cs, Partitioner& partitioner, const C } } } +#endif #if JVET_O0050_LOCAL_DUAL_TREE void IntraSearch::saveCuAreaCostInSCIPU( Area area, double cost ) @@ -2372,6 +2374,7 @@ void IntraSearch::xEncIntraHeader( CodingStructure &cs, Partitioner &partitioner } #endif m_CABACEstimator->bdpcm_mode ( cu, ComponentID(partitioner.chType) ); +#if !JVET_O0525_REMOVE_PCM if( CU::isIntra(cu) ) { m_CABACEstimator->pcm_data( cu, partitioner ); @@ -2380,6 +2383,7 @@ void IntraSearch::xEncIntraHeader( CodingStructure &cs, Partitioner &partitioner return; } } +#endif } PredictionUnit &pu = *cs.getPU(partitioner.currArea().lumaPos(), partitioner.chType); diff --git a/source/Lib/EncoderLib/IntraSearch.h b/source/Lib/EncoderLib/IntraSearch.h index d3273bcc1a73f5432926e46449f76278f0a99d8b..a621ba2a4d5525593b5d9e1583f4b138ea794810 100644 --- a/source/Lib/EncoderLib/IntraSearch.h +++ b/source/Lib/EncoderLib/IntraSearch.h @@ -396,7 +396,9 @@ public: bool estIntraPredLumaQT ( CodingUnit &cu, Partitioner& pm, const double bestCostSoFar = MAX_DOUBLE, bool mtsCheckRangeFlag = false, int mtsFirstCheckId = 0, int mtsLastCheckId = 0, bool moreProbMTSIdxFirst = false ); void estIntraPredChromaQT ( CodingUnit &cu, Partitioner& pm, const double maxCostAllowed = MAX_DOUBLE ); +#if !JVET_O0525_REMOVE_PCM void IPCMSearch (CodingStructure &cs, Partitioner& partitioner); +#endif #if JVET_O0119_BASE_PALETTE_444 void PLTSearch ( CodingStructure &cs, Partitioner& partitioner, ComponentID compBegin, uint32_t numComp); void deriveRunAndCalcBits ( CodingStructure& cs, Partitioner& partitioner, ComponentID compBegin, uint32_t numComp, PLTScanMode pltScanMode, uint64_t& bits); @@ -410,7 +412,9 @@ protected: // T & Q & Q-1 & T-1 // ------------------------------------------------------------------------------------------------------------------- +#if !JVET_O0525_REMOVE_PCM void xEncPCM (CodingStructure &cs, Partitioner& partitioner, const ComponentID &compID); +#endif // ------------------------------------------------------------------------------------------------------------------- // Intra search diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index a2042418f128378eb9b83ed1a3db3bed4653d314..fd9960a92f16423670896f3bab698f3c1532e898 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -870,6 +870,7 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) WRITE_FLAG( pcSPS->getSAOEnabledFlag(), "sps_sao_enabled_flag"); WRITE_FLAG( pcSPS->getALFEnabledFlag(), "sps_alf_enabled_flag" ); +#if !JVET_O0525_REMOVE_PCM WRITE_FLAG( pcSPS->getPCMEnabledFlag() ? 1 : 0, "sps_pcm_enabled_flag"); if( pcSPS->getPCMEnabledFlag() ) { @@ -879,6 +880,7 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) WRITE_UVLC( pcSPS->getPCMLog2MaxSize() - pcSPS->getPCMLog2MinSize(), "log2_diff_max_min_pcm_luma_coding_block_size" ); WRITE_FLAG( pcSPS->getPCMFilterDisableFlag()?1 : 0, "pcm_loop_filter_disable_flag"); } +#endif #if JVET_O1136_TS_BDPCM_SIGNALLING WRITE_FLAG(pcSPS->getTransformSkipEnabledFlag() ? 1 : 0, "sps_transform_skip_enabled_flag"); @@ -1673,7 +1675,9 @@ void HLSWriter::codeConstraintInfo ( const ConstraintInfo* cinfo ) #if JVET_O0376_SPS_JOINTCBCR_FLAG WRITE_FLAG(cinfo->getNoJointCbCrConstraintFlag() ? 1 : 0, "no_joint_cbcr_constraint_flag"); #endif +#if !JVET_O0525_REMOVE_PCM WRITE_FLAG(cinfo->getNoPcmConstraintFlag() ? 1 : 0, "no_pcm_constraint_flag"); +#endif WRITE_FLAG(cinfo->getNoRefWraparoundConstraintFlag() ? 1 : 0, "no_ref_wraparound_constraint_flag"); WRITE_FLAG(cinfo->getNoTemporalMvpConstraintFlag() ? 1 : 0, "no_temporal_mvp_constraint_flag"); WRITE_FLAG(cinfo->getNoSbtmvpConstraintFlag() ? 1 : 0, "no_sbtmvp_constraint_flag");