diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp index 72681ba7a2dc841e7b021f166554c333f8beb6b9..7cf799322c155d9fb4f71158a890dc8894c01510 100644 --- a/source/Lib/CommonLib/Slice.cpp +++ b/source/Lib/CommonLib/Slice.cpp @@ -123,6 +123,9 @@ Slice::Slice() , m_numEntryPoints ( 0 ) #endif , m_cabacInitFlag ( false ) +#if JVET_P0126_SIGNALLING_SUBPICID + , m_sliceSubPicId ( 0 ) +#endif #if !JVET_P1006_PICTURE_HEADER , m_jointCbCrSignFlag ( false ) , m_bLMvdL1Zero ( false ) @@ -2025,6 +2028,9 @@ SPS::SPS() // Structure , m_maxWidthInLumaSamples (352) , m_maxHeightInLumaSamples (288) +#if JVET_P0126_SIGNALLING_SUBPICID +, m_subPicPresentFlag (0) +#endif #if JVET_P1006_PICTURE_HEADER , m_numSubPics(1) , m_subPicIdPresentFlag(0) diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index 12c9c3e61fb6a6d60ea232a13aef75bd0ec76401..d5e2825a4b48a6e10ef6b11769d56719d22db65d 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -977,6 +977,9 @@ private: // Structure uint32_t m_maxWidthInLumaSamples; uint32_t m_maxHeightInLumaSamples; +#if JVET_P0126_SIGNALLING_SUBPICID + bool m_subPicPresentFlag; // indicates the presence of sub-pictures + #endif #if JVET_P1006_PICTURE_HEADER uint8_t m_numSubPics; //!< number of sub-pictures used bool m_subPicIdPresentFlag; //!< indicates the presence of sub-picture IDs @@ -1146,6 +1149,12 @@ public: uint32_t getMaxPicWidthInLumaSamples() const { return m_maxWidthInLumaSamples; } void setMaxPicHeightInLumaSamples( uint32_t u ) { m_maxHeightInLumaSamples = u; } uint32_t getMaxPicHeightInLumaSamples() const { return m_maxHeightInLumaSamples; } + +#if JVET_P0126_SIGNALLING_SUBPICID + void setSubPicPresentFlag(bool b) { m_subPicPresentFlag = b; } + bool getSubPicPresentFlag() const { return m_subPicPresentFlag; } +#endif + #if JVET_P1006_PICTURE_HEADER void setNumSubPics( uint8_t u ) { m_numSubPics = u; } uint8_t getNumSubPics( ) const { return m_numSubPics; } @@ -2377,6 +2386,10 @@ private: bool m_cabacInitFlag; +#if JVET_P0126_SIGNALLING_SUBPICID + uint32_t m_sliceSubPicId; +#endif + #if !JVET_P1006_PICTURE_HEADER bool m_jointCbCrSignFlag; #endif @@ -2612,7 +2625,10 @@ public: void setSignDataHidingEnabledFlag( bool b ) { m_signDataHidingEnabledFlag = b; } bool getSignDataHidingEnabledFlag() const { return m_signDataHidingEnabledFlag; } #endif - +#if JVET_P0126_SIGNALLING_SUBPICID + void setSliceSubPicId(int i) { m_sliceSubPicId = i; } + uint32_t getSliceSubPicId() const { return m_sliceSubPicId; } +#endif #if JVET_P1006_PICTURE_HEADER uint32_t getCuQpDeltaSubdiv() const { return this->isIntra() ? m_pcPicHeader->getCuQpDeltaSubdivIntra() : m_pcPicHeader->getCuQpDeltaSubdivInter(); } uint32_t getCuChromaQpOffsetSubdiv() const { return this->isIntra() ? m_pcPicHeader->getCuChromaQpOffsetSubdivIntra() : m_pcPicHeader->getCuChromaQpOffsetSubdivInter(); } diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 119c2063ab561f03630fb33b5e8adb2db66c3e0e..ecd268eaa7bcc031a6d579c08f717073ae95d6de 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -50,6 +50,8 @@ #include <assert.h> #include <cassert> +#define JVET_P0126_SIGNALLING_SUBPICID 1 // JVET-P0126: Signalling of subpicture IDs + #define JVET_P1004_REMOVE_BRICKS 1 // JVET-P1004: Removal of bricks #define JVET_P0202_P0203_FIX_HRD_RELATED_SEI 1 // JVET-P0202 and JVET-P0203: CPB timing for sub-layers with DU and parsing independency to SPS diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index 3183b335d8f2eabccd0986653d24077d7c99b6a7..19484b3bfb54ed2e8d5f81d51746e024700fbd64 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -423,6 +423,7 @@ void HLSyntaxReader::parsePPS( PPS* pcPPS, ParameterSetManager *parameterSetMana } #endif + #if JVET_P1004_REMOVE_BRICKS READ_FLAG( uiCode, "no_pic_partition_flag" ); pcPPS->setNoPicPartitionFlag( uiCode == 1 ); if(!pcPPS->getNoPicPartitionFlag()) @@ -933,6 +934,7 @@ void HLSyntaxReader::parsePPS( PPS* pcPPS, ParameterSetManager *parameterSetMana } } + #endif READ_FLAG(uiCode, "entropy_coding_sync_enabled_flag"); pcPPS->setEntropyCodingSyncEnabledFlag(uiCode == 1); @@ -1374,6 +1376,10 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) READ_UVLC( uiCode, "pic_width_max_in_luma_samples" ); pcSPS->setMaxPicWidthInLumaSamples( uiCode ); READ_UVLC( uiCode, "pic_height_max_in_luma_samples" ); pcSPS->setMaxPicHeightInLumaSamples( uiCode ); +#if JVET_P0126_SIGNALLING_SUBPICID + READ_FLAG( uiCode, "subpics_present_flag" ); pcSPS->setSubPicPresentFlag(uiCode); +#endif + #if JVET_P1006_PICTURE_HEADER pcSPS->setNumSubPics( 1 ); // TODO - need sub-picture syntax READ_FLAG(uiCode, "sps_subpic_id_present_flag"); pcSPS->setSubPicIdPresentFlag( uiCode != 0 ); @@ -2749,6 +2755,30 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, ParameterSetManager *para pcSlice->setPOC(iPOCmsb + iPOClsb); } #endif + +#if JVET_P0126_SIGNALLING_SUBPICID + if (sps->getSubPicPresentFlag()) + { + uint32_t bitsSubPicId; + if (sps->getSubPicIdSignallingPresentFlag()) + { + bitsSubPicId = sps->getSubPicIdLen(); + } + else if (picHeader->getSubPicIdSignallingPresentFlag()) + { + bitsSubPicId = picHeader->getSubPicIdLen(); + } + else if (pps->getSubPicIdSignallingPresentFlag()) + { + bitsSubPicId = pps->getSubPicIdLen(); + } + else + { + bitsSubPicId = ceilLog2(sps->getNumSubPics()); + } + READ_CODE(bitsSubPicId, uiCode, "slice_subpic_id"); pcSlice->setSliceSubPicId(uiCode); + } +#endif #if JVET_P1004_REMOVE_BRICKS // raster scan slices @@ -2806,7 +2836,7 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, ParameterSetManager *para { while (pps->getNumTilesInPic() > (1 << bitsSliceAddress)) //TODO: use the correct one { - bitsSliceAddress++; + bitsSliceAddress++; } } else @@ -3147,7 +3177,7 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, ParameterSetManager *para { uiCode = 0; } - pcSlice->setNumRefIdx( REF_PIC_LIST_1, uiCode + 1 ); + pcSlice->setNumRefIdx(REF_PIC_LIST_1, uiCode + 1); } else { @@ -3678,6 +3708,7 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, ParameterSetManager *para } #endif + #if JVET_P1004_REMOVE_BRICKS if( pcSlice->getFirstCtuRsAddrInSlice() == 0 ) #else @@ -3699,6 +3730,7 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, ParameterSetManager *para } std::vector<uint32_t> entryPointOffset; + #if JVET_P1004_REMOVE_BRICKS pcSlice->setNumEntryPoints( pps ); if( pcSlice->getNumEntryPoints() > 0 ) diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index 0e12799af47acafd76ea279ca75f608729ae78f8..099f227aa74b42a6144d31345eb397a0d0d55700 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -869,6 +869,10 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) WRITE_UVLC( pcSPS->getMaxPicWidthInLumaSamples(), "pic_width_max_in_luma_samples" ); WRITE_UVLC( pcSPS->getMaxPicHeightInLumaSamples(), "pic_height_max_in_luma_samples" ); +#if JVET_P0126_SIGNALLING_SUBPICID + WRITE_FLAG(pcSPS->getSubPicPresentFlag(), "subpics_present_flag"); +#endif + #if JVET_P1006_PICTURE_HEADER WRITE_FLAG( pcSPS->getSubPicIdPresentFlag(), "sps_subpic_id_present_flag"); if( pcSPS->getSubPicIdPresentFlag() ) @@ -1898,6 +1902,31 @@ void HLSWriter::codeSliceHeader ( Slice* pcSlice ) #if !JVET_P1006_PICTURE_HEADER WRITE_UVLC( pcSlice->getPPS()->getPPSId(), "slice_pic_parameter_set_id" ); #endif + + #if JVET_P0126_SIGNALLING_SUBPICID + if (pcSlice->getSPS()->getSubPicPresentFlag()) + { + uint32_t bitsSubPicId; + if (pcSlice->getSPS()->getSubPicIdSignallingPresentFlag()) + { + bitsSubPicId = pcSlice->getSPS()->getSubPicIdLen(); + } + else if (picHeader->getSubPicIdSignallingPresentFlag()) + { + bitsSubPicId = picHeader->getSubPicIdLen(); + } + else if (pcSlice->getPPS()->getSubPicIdSignallingPresentFlag()) + { + bitsSubPicId = pcSlice->getPPS()->getSubPicIdLen(); + } + else + { + bitsSubPicId = ceilLog2(pcSlice->getSPS()->getNumSubPics()); + } + WRITE_CODE(pcSlice->getSliceSubPicId(), bitsSubPicId, "slice_subpic_id"); + } +#endif + #if JVET_P1004_REMOVE_BRICKS // raster scan slices if( pcSlice->getPPS()->getRectSliceFlag() == 0 )