diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 0e33452e537339fe9173b00a967ed5a68fa21f39..0705deb60a7a9777980eba98af35bd56e5eb1721 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -78,6 +78,8 @@ #define JVET_L0265_AFF_MINIMUM4X4 1 //Affine 4x4 chroma subblock #define JVET_L0111 1 // Max Tx size for skip +#define JVET_L0553_PCM 1 // PCM mode + #define JVET_L0553_FIX_INITQP 1 #define JVET_L0053_L0272_DM 1 // use center position of luma block to derive DM diff --git a/source/Lib/DecoderLib/CABACReader.cpp b/source/Lib/DecoderLib/CABACReader.cpp index fd58a5ae29a364a7b1da93dd4cf420de42c0d7a4..f95dea94a9be92ef768de9dcbdc4002a75b0e892 100644 --- a/source/Lib/DecoderLib/CABACReader.cpp +++ b/source/Lib/DecoderLib/CABACReader.cpp @@ -715,7 +715,11 @@ bool CABACReader::coding_unit( CodingUnit &cu, Partitioner &partitioner, CUCtx& // pcm samples if( CU::isIntra(cu) && cu.partSize == SIZE_2Nx2N ) { +#if JVET_L0553_PCM + pcm_flag( cu, partitioner ); +#else pcm_flag( cu ); +#endif if( cu.ipcm ) { TransformUnit& tu = cs.addTU( cu, partitioner.chType ); @@ -818,11 +822,19 @@ void CABACReader::pred_mode( CodingUnit& cu ) } } - +#if JVET_L0553_PCM +void CABACReader::pcm_flag( CodingUnit& cu, Partitioner &partitioner ) +#else void CABACReader::pcm_flag( CodingUnit& cu ) +#endif { const SPS& sps = *cu.cs->sps; +#if JVET_L0553_PCM + if( !sps.getUsePCM() || partitioner.currArea().lwidth() > (1 << sps.getPCMLog2MaxSize()) || partitioner.currArea().lwidth() < (1 << sps.getPCMLog2MinSize()) + || partitioner.currArea().lheight() > (1 << sps.getPCMLog2MaxSize()) || partitioner.currArea().lheight() < (1 << sps.getPCMLog2MinSize()) ) +#else if( !sps.getUsePCM() || cu.lumaSize().width > (1 << sps.getPCMLog2MaxSize()) || cu.lumaSize().width < (1 << sps.getPCMLog2MinSize()) ) +#endif { cu.ipcm = false; return; @@ -1888,10 +1900,24 @@ void CABACReader::pcm_samples( TransformUnit& tu ) { CHECK( !tu.cu->ipcm, "pcm mode expected" ); +#if JVET_L0553_PCM + const CodingStructure *cs = tu.cs; + const ChannelType chType = tu.chType; +#endif + const SPS& sps = *tu.cu->cs->sps; +#if !JVET_L0553_PCM const ComponentID maxCompId = ( tu.chromaFormat == CHROMA_400 ? COMPONENT_Y : COMPONENT_Cr ); +#endif tu.depth = 0; + +#if JVET_L0553_PCM + ComponentID compStr = (CS::isDualITree(*cs) && !isLuma(chType)) ? COMPONENT_Cb: COMPONENT_Y; + ComponentID compEnd = (CS::isDualITree(*cs) && isLuma(chType)) ? COMPONENT_Y : COMPONENT_Cr; + for( ComponentID compID = compStr; compID <= compEnd; compID = ComponentID(compID+1) ) +#else for( ComponentID compID = COMPONENT_Y; compID <= maxCompId; compID = ComponentID(compID+1) ) +#endif { PelBuf samples = tu.getPcmbuf( compID ); const unsigned sampleBits = sps.getPCMBitDepth( toChannelType(compID) ); diff --git a/source/Lib/DecoderLib/CABACReader.h b/source/Lib/DecoderLib/CABACReader.h index 4332968b2e99f916c91d5d6ab9949fd806c8cec3..b0f46995933de4597ef6dc5ac19c5b24b06501d5 100644 --- a/source/Lib/DecoderLib/CABACReader.h +++ b/source/Lib/DecoderLib/CABACReader.h @@ -78,7 +78,11 @@ public: void cu_transquant_bypass_flag ( CodingUnit& cu ); void cu_skip_flag ( CodingUnit& cu ); void pred_mode ( CodingUnit& cu ); +#if JVET_L0553_PCM + void pcm_flag ( CodingUnit& cu, Partitioner& pm ); +#else void pcm_flag ( CodingUnit& cu ); +#endif void cu_pred_data ( CodingUnit& cu ); #if JVET_L0646_GBI void cu_gbi_flag ( CodingUnit& cu ); diff --git a/source/Lib/DecoderLib/DecCu.cpp b/source/Lib/DecoderLib/DecCu.cpp index dc510242ad3a866d0a9014d65976eec17e14e523..d1df4c4c877717c30a59a012a0ba7dd912df8f5e 100644 --- a/source/Lib/DecoderLib/DecCu.cpp +++ b/source/Lib/DecoderLib/DecCu.cpp @@ -260,9 +260,20 @@ void DecCu::xDecodePCMTexture(TransformUnit &tu, const ComponentID compID) */ void DecCu::xReconPCM(TransformUnit &tu) { +#if JVET_L0553_PCM + const CodingStructure *cs = tu.cs; + const ChannelType chType = tu.chType; + + ComponentID compStr = (CS::isDualITree(*cs) && !isLuma(chType)) ? COMPONENT_Cb: COMPONENT_Y; + ComponentID compEnd = (CS::isDualITree(*cs) && isLuma(chType)) ? COMPONENT_Y : COMPONENT_Cr; + for( ComponentID compID = compStr; compID <= compEnd; compID = ComponentID(compID+1) ) +#else for (uint32_t ch = 0; ch < tu.blocks.size(); ch++) +#endif { +#if !JVET_L0553_PCM ComponentID compID = ComponentID(ch); +#endif xDecodePCMTexture(tu, compID); } diff --git a/source/Lib/EncoderLib/CABACWriter.cpp b/source/Lib/EncoderLib/CABACWriter.cpp index a733df5104ee8bf7427a633a1f83dff83cbe3c92..60ed41522fef73156637554d40c69a8ae151c681 100644 --- a/source/Lib/EncoderLib/CABACWriter.cpp +++ b/source/Lib/EncoderLib/CABACWriter.cpp @@ -641,7 +641,11 @@ void CABACWriter::coding_unit( const CodingUnit& cu, Partitioner& partitioner, C // pcm samples if( CU::isIntra(cu) && cu.partSize == SIZE_2Nx2N ) { +#if JVET_L0553_PCM + pcm_data( cu, partitioner ); +#else pcm_data( cu ); +#endif if( cu.ipcm ) { end_of_ctu( cu, cuCtx ); @@ -691,9 +695,17 @@ void CABACWriter::pred_mode( const CodingUnit& cu ) m_BinEncoder.encodeBin( ( CU::isIntra( cu ) ), Ctx::PredMode() ); } +#if JVET_L0553_PCM +void CABACWriter::pcm_data( const CodingUnit& cu, Partitioner& partitioner ) +#else void CABACWriter::pcm_data( const CodingUnit& cu ) +#endif { +#if JVET_L0553_PCM + pcm_flag( cu, partitioner ); +#else pcm_flag( cu ); +#endif if( cu.ipcm ) { m_BinEncoder.pcmAlignBits(); @@ -701,11 +713,19 @@ void CABACWriter::pcm_data( const CodingUnit& cu ) } } - +#if JVET_L0553_PCM +void CABACWriter::pcm_flag( const CodingUnit& cu, Partitioner& partitioner ) +#else void CABACWriter::pcm_flag( const CodingUnit& cu ) +#endif { const SPS& sps = *cu.cs->sps; + #if JVET_L0553_PCM + if( !sps.getUsePCM() || partitioner.currArea().lwidth() > (1 << sps.getPCMLog2MaxSize()) || partitioner.currArea().lwidth() < (1 << sps.getPCMLog2MinSize()) + || partitioner.currArea().lheight() > (1 << sps.getPCMLog2MaxSize()) || partitioner.currArea().lheight() < (1 << sps.getPCMLog2MinSize()) ) +#else if( !sps.getUsePCM() || cu.lumaSize().width > (1 << sps.getPCMLog2MaxSize()) || cu.lumaSize().width < (1 << sps.getPCMLog2MinSize()) ) +#endif { return; } @@ -1836,8 +1856,18 @@ void CABACWriter::pcm_samples( const TransformUnit& tu ) CHECK( !tu.cu->ipcm, "pcm mode expected" ); const SPS& sps = *tu.cu->cs->sps; + +#if JVET_L0553_PCM + const CodingStructure *cs = tu.cs; + const ChannelType chType = tu.chType; + + ComponentID compStr = (CS::isDualITree(*cs) && !isLuma(chType)) ? COMPONENT_Cb: COMPONENT_Y; + ComponentID compEnd = (CS::isDualITree(*cs) && isLuma(chType)) ? COMPONENT_Y : COMPONENT_Cr; + for( ComponentID compID = compStr; compID <= compEnd; compID = ComponentID(compID+1) ) +#else const ComponentID maxCompId = ( tu.chromaFormat == CHROMA_400 ? COMPONENT_Y : COMPONENT_Cr ); for( ComponentID compID = COMPONENT_Y; compID <= maxCompId; compID = ComponentID(compID+1) ) +#endif { const CPelBuf samples = tu.getPcmbuf( compID ); const unsigned sampleBits = sps.getPCMBitDepth( toChannelType(compID) ); diff --git a/source/Lib/EncoderLib/CABACWriter.h b/source/Lib/EncoderLib/CABACWriter.h index addb673f2877e74e707290805c2b717220d3fda2..85311a0bb29b4ff43fa9621bd72c2c18110cbae7 100644 --- a/source/Lib/EncoderLib/CABACWriter.h +++ b/source/Lib/EncoderLib/CABACWriter.h @@ -90,8 +90,13 @@ public: void cu_transquant_bypass_flag ( const CodingUnit& cu ); void cu_skip_flag ( const CodingUnit& cu ); void pred_mode ( const CodingUnit& cu ); +#if JVET_L0553_PCM + void pcm_data ( const CodingUnit& cu, Partitioner& pm ); + void pcm_flag ( const CodingUnit& cu, Partitioner& pm ); +#else void pcm_data ( const CodingUnit& cu ); void pcm_flag ( const CodingUnit& cu ); +#endif void cu_pred_data ( const CodingUnit& cu ); #if JVET_L0646_GBI void cu_gbi_flag ( const CodingUnit& cu ); diff --git a/source/Lib/EncoderLib/EncCu.cpp b/source/Lib/EncoderLib/EncCu.cpp index 7ab53e4ae2eef510cd12abc7488c3de10b5c20e3..c65884ec66d4868453c35b25d33cf6caaeb4ffdb 100644 --- a/source/Lib/EncoderLib/EncCu.cpp +++ b/source/Lib/EncoderLib/EncCu.cpp @@ -1507,8 +1507,11 @@ void EncCu::xCheckRDCostIntra( CodingStructure *&tempCS, CodingStructure *&bestC m_CABACEstimator->extend_ref_line( cu ); #endif m_CABACEstimator->cu_pred_data ( cu ); +#if JVET_L0553_PCM + m_CABACEstimator->pcm_data ( cu, partitioner ); +#else m_CABACEstimator->pcm_data ( cu ); - +#endif // Encode Coefficients CUCtx cuCtx; @@ -1554,7 +1557,11 @@ void EncCu::xCheckIntraPCM(CodingStructure *&tempCS, CodingStructure *&bestCS, P { tempCS->initStructData( encTestMode.qp, encTestMode.lossless ); +#if JVET_L0553_PCM + CodingUnit &cu = tempCS->addCU( CS::getArea( *tempCS, tempCS->area, partitioner.chType ), partitioner.chType ); +#else CodingUnit &cu = tempCS->addCU( tempCS->area, partitioner.chType ); +#endif partitioner.setCUData( cu ); cu.slice = tempCS->slice; @@ -1572,9 +1579,15 @@ void EncCu::xCheckIntraPCM(CodingStructure *&tempCS, CodingStructure *&bestCS, P cu.qp = encTestMode.qp; cu.ipcm = true; +#if JVET_L0553_PCM + tempCS->addPU( CS::getArea( *tempCS, tempCS->area, partitioner.chType ), partitioner.chType ); + + tempCS->addTU( CS::getArea( *tempCS, tempCS->area, partitioner.chType ), partitioner.chType ); +#else tempCS->addPU(tempCS->area, partitioner.chType); tempCS->addTU( tempCS->area, partitioner.chType ); +#endif m_pcIntraSearch->IPCMSearch(*tempCS, partitioner); @@ -1596,7 +1609,11 @@ void EncCu::xCheckIntraPCM(CodingStructure *&tempCS, CodingStructure *&bestCS, P m_CABACEstimator->cu_skip_flag ( cu ); } m_CABACEstimator->pred_mode ( cu ); +#if JVET_L0553_PCM + m_CABACEstimator->pcm_data ( cu, partitioner ); +#else m_CABACEstimator->pcm_data ( cu ); +#endif tempCS->fracBits = m_CABACEstimator->getEstFracBits(); diff --git a/source/Lib/EncoderLib/IntraSearch.cpp b/source/Lib/EncoderLib/IntraSearch.cpp index 9b48e8c05979dfa6d338909d05c87f0ebc947d43..36309d1f157dd714781a79ddeaf7bc09cd39dae2 100644 --- a/source/Lib/EncoderLib/IntraSearch.cpp +++ b/source/Lib/EncoderLib/IntraSearch.cpp @@ -1031,9 +1031,17 @@ void IntraSearch::estIntraPredChromaQT(CodingUnit &cu, Partitioner &partitioner) void IntraSearch::IPCMSearch(CodingStructure &cs, Partitioner& partitioner) { +#if JVET_L0553_PCM + ComponentID compStr = (CS::isDualITree(cs) && !isLuma(partitioner.chType)) ? COMPONENT_Cb: COMPONENT_Y; + ComponentID compEnd = (CS::isDualITree(cs) && isLuma(partitioner.chType)) ? COMPONENT_Y : COMPONENT_Cr; + for( ComponentID compID = compStr; compID <= compEnd; compID = ComponentID(compID+1) ) +#else for (uint32_t ch = 0; ch < getNumberValidTBlocks( *cs.pcv ); ch++) +#endif { +#if !JVET_L0553_PCM const ComponentID compID = ComponentID(ch); +#endif xEncPCM(cs, partitioner, compID); } @@ -1047,7 +1055,9 @@ void IntraSearch::IPCMSearch(CodingStructure &cs, Partitioner& partitioner) cs.cost = 0; cs.setDecomp(cs.area); +#if !JVET_L0553_PCM cs.picture->getRecoBuf(cs.area).copyFrom(cs.getRecoBuf()); +#endif } void IntraSearch::xEncPCM(CodingStructure &cs, Partitioner& partitioner, const ComponentID &compID) @@ -1111,7 +1121,11 @@ void IntraSearch::xEncIntraHeader(CodingStructure &cs, Partitioner &partitioner, #endif if( CU::isIntra(cu) && cu.partSize == SIZE_2Nx2N ) { +#if JVET_L0553_PCM + m_CABACEstimator->pcm_data( cu, partitioner ); +#else m_CABACEstimator->pcm_data( cu ); +#endif if( cu.ipcm ) { return;