diff --git a/source/App/EncoderApp/EncApp.cpp b/source/App/EncoderApp/EncApp.cpp index e5ebd2ca1e6dad1709a3834c858029c500ecfb7f..135a3c9f1d175f31f9d94e3feddb5840580e2951 100644 --- a/source/App/EncoderApp/EncApp.cpp +++ b/source/App/EncoderApp/EncApp.cpp @@ -371,8 +371,13 @@ void EncApp::xInitLibCfg() #endif m_cEncLib.setRDpenalty ( m_rdPenalty ); m_cEncLib.setCTUSize ( m_uiCTUSize ); +#if JVET_Q0119_CLEANUPS + m_cEncLib.setSubPicInfoPresentFlag ( m_subPicInfoPresentFlag ); + if(m_subPicInfoPresentFlag) +#else m_cEncLib.setSubPicPresentFlag ( m_subPicPresentFlag ); if(m_subPicPresentFlag) +#endif { m_cEncLib.setNumSubPics ( m_numSubPics ); for (int i = 0; i < m_numSubPics; i++) @@ -385,11 +390,20 @@ void EncApp::xInitLibCfg() m_cEncLib.setLoopFilterAcrossSubpicEnabledFlag ( m_loopFilterAcrossSubpicEnabledFlag[i], i ); } } + +#if JVET_Q0119_CLEANUPS + m_cEncLib.setSubPicIdMappingExplicitlySignaledFlag ( m_subPicIdMappingExplicitlySignaledFlag ); + if (m_subPicIdMappingExplicitlySignaledFlag) + { + m_cEncLib.setSubPicIdMappingInSpsFlag ( m_subPicIdMappingInSpsFlag ); + if(m_subPicIdMappingInSpsFlag) +#else m_cEncLib.setSubPicIdPresentFlag ( m_subPicIdPresentFlag ); if (m_subPicIdPresentFlag) { m_cEncLib.setSubPicIdSignallingPresentFlag ( m_subPicIdSignallingPresentFlag ); if(m_subPicIdSignallingPresentFlag) +#endif { m_cEncLib.setSubPicIdLen ( m_subPicIdLen ); for (int i = 0; i < m_numSubPics; i++) diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp index 6417fb0896eb46ef01e78befd8d312a24fb3dee6..08a52a2370d6a4177e05e74af591f7fbf03e63eb 100644 --- a/source/App/EncoderApp/EncAppCfg.cpp +++ b/source/App/EncoderApp/EncAppCfg.cpp @@ -870,7 +870,11 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) ("NonPackedSource", m_nonPackedConstraintFlag, false, "Indicate that source does not contain frame packing") ("FrameOnly", m_frameOnlyConstraintFlag, false, "Indicate that the bitstream contains only frames") ("CTUSize", m_uiCTUSize, 128u, "CTUSize (specifies the CTU size if QTBT is on) [default: 128]") +#if JVET_Q0119_CLEANUPS + ("SubPicInfoPresentFlag", m_subPicInfoPresentFlag, false, "equal to 1 specifies that subpicture parameters are present in in the SPS RBSP syntax") +#else ("SubPicPresentFlag", m_subPicPresentFlag, false, "equal to 1 specifies that subpicture parameters are present in in the SPS RBSP syntax") +#endif ("NumSubPics", m_numSubPics, 0u, "specifies the number of subpictures") ("SubPicCtuTopLeftX", cfg_subPicCtuTopLeftX, cfg_subPicCtuTopLeftX, "specifies horizontal position of top left CTU of i-th subpicture in unit of CtbSizeY") ("SubPicCtuTopLeftY", cfg_subPicCtuTopLeftY, cfg_subPicCtuTopLeftY, "specifies vertical position of top left CTU of i-th subpicture in unit of CtbSizeY") @@ -878,8 +882,13 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) ("SubPicHeight", cfg_subPicHeight, cfg_subPicHeight, "specifies the height of the i-th subpicture in units of CtbSizeY") ("SubPicTreatedAsPicFlag", cfg_subPicTreatedAsPicFlag, cfg_subPicTreatedAsPicFlag, "equal to 1 specifies that the i-th subpicture of each coded picture in the CLVS is treated as a picture in the decoding process excluding in-loop filtering operations") ("LoopFilterAcrossSubpicEnabledFlag", cfg_loopFilterAcrossSubpicEnabledFlag, cfg_loopFilterAcrossSubpicEnabledFlag, "equal to 1 specifies that in-loop filtering operations may be performed across the boundaries of the i-th subpicture in each coded picture in the CLVS") +#if JVET_Q0119_CLEANUPS + ("SubPicIdPresentFlag", m_subPicIdMappingExplicitlySignaledFlag, false, "equal to 1 specifies that subpicture ID mapping is present in the SPS") + ("SubPicIdMappingInSpsFlag", m_subPicIdMappingInSpsFlag, false, "equal to 1 specifies that subpicture ID mapping is signalled in the SPS") +#else ("SubPicIdPresentFlag", m_subPicIdPresentFlag, false, "equal to 1 specifies that subpicture ID mapping is present in the SPS") ("SubPicIdSignallingPresentFlag", m_subPicIdSignallingPresentFlag, false, "equal to 1 specifies that subpicture ID mapping is signalled in the SPS") +#endif ("SubPicIdLen", m_subPicIdLen, 0u, "specifies the number of bits used to represent the syntax element sps_subpic_id[ i ]. ") ("SubPicId", cfg_subPicId, cfg_subPicId, "specifies that subpicture ID of the i-th subpicture") ("EnablePartitionConstraintsOverride", m_SplitConsOverrideEnabledFlag, true, "Enable partition constraints override") @@ -1586,7 +1595,11 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) //number of fields to encode m_framesToBeEncoded *= 2; } +#if JVET_Q0119_CLEANUPS + if ( m_subPicInfoPresentFlag ) +#else if ( m_subPicPresentFlag ) +#endif { CHECK( m_numSubPics > 255 || m_numSubPics < 1, "Number of subpicture must be within 1 to 255" ); m_subPicCtuTopLeftX = cfg_subPicCtuTopLeftX.values; @@ -1601,9 +1614,15 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) CHECK(m_subPicCtuTopLeftX[i] + m_subPicWidth[i] > (m_iSourceWidth + m_uiCTUSize - 1) / m_uiCTUSize, "subpicture must not exceed picture boundary"); CHECK(m_subPicCtuTopLeftY[i] + m_subPicHeight[i] > (m_iSourceHeight + m_uiCTUSize - 1) / m_uiCTUSize, "subpicture must not exceed picture boundary"); } +#if JVET_Q0119_CLEANUPS + if (m_subPicIdMappingExplicitlySignaledFlag) + { + if (m_subPicIdMappingInSpsFlag) +#else if (m_subPicIdPresentFlag) { if (m_subPicIdSignallingPresentFlag) +#endif { CHECK( m_subPicIdLen > 16, "sibpic ID length must not exceed 16 bits" ); } @@ -3592,8 +3611,13 @@ void EncAppCfg::xPrintParameter() msg( DETAILS, "Profile : %s\n", profileToString(m_profile) ); } msg( DETAILS, "CU size / depth / total-depth : %d / %d / %d\n", m_uiMaxCUWidth, m_uiMaxCUDepth, m_uiMaxCodingDepth ); +#if JVET_Q0119_CLEANUPS + msg(DETAILS, "subpicture info present flag : %d\n", m_subPicInfoPresentFlag); + if (m_subPicInfoPresentFlag) +#else msg(DETAILS, "subpicture present flag : %d\n", m_subPicPresentFlag); if (m_subPicPresentFlag) +#endif { msg(DETAILS, "number of subpictures : %d\n", m_numSubPics); for (int i = 0; i < m_numSubPics; i++) @@ -3605,10 +3629,18 @@ void EncAppCfg::xPrintParameter() } } + +#if JVET_Q0119_CLEANUPS + msg(DETAILS, "subpicture ID present flag : %d\n", m_subPicIdMappingExplicitlySignaledFlag); + if (m_subPicIdMappingExplicitlySignaledFlag) + { + msg(DETAILS, "subpicture ID signalling present flag : %d\n", m_subPicIdMappingInSpsFlag); +#else msg(DETAILS, "subpicture ID present flag : %d\n", m_subPicIdPresentFlag); if (m_subPicIdPresentFlag) { msg(DETAILS, "subpicture ID signalling present flag : %d\n", m_subPicIdSignallingPresentFlag); +#endif for (int i = 0; i < m_numSubPics; i++) { msg(DETAILS, "[%d]th subpictures ID length :%d\n", i, m_subPicIdLen); diff --git a/source/App/EncoderApp/EncAppCfg.h b/source/App/EncoderApp/EncAppCfg.h index 2bfc490580cc58af3c5e4ff4b097cb8dddd606b9..45420e443cd057bf50a7ee7d97dce7760f7f8eed 100644 --- a/source/App/EncoderApp/EncAppCfg.h +++ b/source/App/EncoderApp/EncAppCfg.h @@ -273,7 +273,11 @@ protected: // coding unit (CU) definition unsigned m_uiCTUSize; +#if JVET_Q0119_CLEANUPS + bool m_subPicInfoPresentFlag; +#else bool m_subPicPresentFlag; +#endif unsigned m_numSubPics; std::vector<uint32_t> m_subPicCtuTopLeftX; std::vector<uint32_t> m_subPicCtuTopLeftY; @@ -281,8 +285,13 @@ protected: std::vector<uint32_t> m_subPicHeight; std::vector<uint32_t> m_subPicTreatedAsPicFlag; std::vector<uint32_t> m_loopFilterAcrossSubpicEnabledFlag; +#if JVET_Q0119_CLEANUPS + bool m_subPicIdMappingExplicitlySignaledFlag; + bool m_subPicIdMappingInSpsFlag; +#else bool m_subPicIdPresentFlag; bool m_subPicIdSignallingPresentFlag; +#endif unsigned m_subPicIdLen; std::vector<uint32_t> m_subPicId; bool m_SplitConsOverrideEnabledFlag; diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp index c4ad7c567b36e1247f505f6de8d141b3b1d4aa85..64a44a74c8957dd0c834fdb4a59850a9817ef0bd 100644 --- a/source/Lib/CommonLib/Slice.cpp +++ b/source/Lib/CommonLib/Slice.cpp @@ -1634,8 +1634,10 @@ PicHeader::PicHeader() , m_recoveryPocCnt ( 0 ) , m_spsId ( -1 ) , m_ppsId ( -1 ) +#if !JVET_Q0119_CLEANUPS , m_subPicIdSignallingPresentFlag ( 0 ) , m_subPicIdLen ( 0 ) +#endif , m_loopFilterAcrossVirtualBoundariesDisabledFlag ( 0 ) , m_numVerVirtualBoundaries ( 0 ) , m_numHorVirtualBoundaries ( 0 ) @@ -1694,7 +1696,9 @@ PicHeader::PicHeader() , m_scalingListApsId ( -1 ) , m_scalingListAps ( nullptr ) { +#if !JVET_Q0119_CLEANUPS memset(m_subPicId, 0, sizeof(m_subPicId)); +#endif memset(m_virtualBoundariesPosX, 0, sizeof(m_virtualBoundariesPosX)); memset(m_virtualBoundariesPosY, 0, sizeof(m_virtualBoundariesPosY)); memset(m_saoEnabledFlag, 0, sizeof(m_saoEnabledFlag)); @@ -1736,8 +1740,10 @@ void PicHeader::initPicHeader() m_recoveryPocCnt = 0; m_spsId = -1; m_ppsId = -1; +#if !JVET_Q0119_CLEANUPS m_subPicIdSignallingPresentFlag = 0; m_subPicIdLen = 0; +#endif m_loopFilterAcrossVirtualBoundariesDisabledFlag = 0; m_numVerVirtualBoundaries = 0; m_numHorVirtualBoundaries = 0; @@ -1794,7 +1800,9 @@ void PicHeader::initPicHeader() m_scalingListPresentFlag = 0; m_scalingListApsId = -1; m_scalingListAps = nullptr; +#if !JVET_Q0119_CLEANUPS memset(m_subPicId, 0, sizeof(m_subPicId)); +#endif memset(m_virtualBoundariesPosX, 0, sizeof(m_virtualBoundariesPosX)); memset(m_virtualBoundariesPosY, 0, sizeof(m_virtualBoundariesPosY)); memset(m_saoEnabledFlag, 0, sizeof(m_saoEnabledFlag)); @@ -1852,10 +1860,19 @@ SPS::SPS() // Structure , m_maxWidthInLumaSamples (352) , m_maxHeightInLumaSamples (288) +#if JVET_Q0119_CLEANUPS +, m_subPicInfoPresentFlag (0) +#else , m_subPicPresentFlag (0) +#endif , m_numSubPics(1) +#if JVET_Q0119_CLEANUPS +, m_subPicIdMappingExplicitlySignalledFlag ( false ) +, m_subPicIdMappingInSpsFlag ( false ) +#else , m_subPicIdPresentFlag(0) , m_subPicIdSignallingPresentFlag(0) +#endif , m_subPicIdLen(16) , m_log2MinCodingBlockSize ( 0) , m_log2DiffMaxMinCodingBlockSize(0) @@ -2115,7 +2132,11 @@ PPS::PPS() , m_numRefIdxL1DefaultActive (1) , m_rpl1IdxPresentFlag (false) , m_numSubPics (1) +#if JVET_Q0119_CLEANUPS +, m_subPicIdMappingInPpsFlag (0) +#else , m_subPicIdSignallingPresentFlag (0) +#endif , m_subPicIdLen (16) , m_noPicPartitionFlag (1) , m_log2CtuSize (0) diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index 6418e04aa787c17babdc9b1cec58e6c7c3dd4953..a7a43f20589a31a15142f21345a2efa1cceb5df6 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -1091,7 +1091,11 @@ private: // Structure uint32_t m_maxWidthInLumaSamples; uint32_t m_maxHeightInLumaSamples; +#if JVET_Q0119_CLEANUPS + bool m_subPicInfoPresentFlag; // indicates the presence of sub-picture info +#else bool m_subPicPresentFlag; // indicates the presence of sub-pictures +#endif uint8_t m_numSubPics; //!< number of sub-pictures used uint32_t m_subPicCtuTopLeftX[MAX_NUM_SUB_PICS]; uint32_t m_subPicCtuTopLeftY[MAX_NUM_SUB_PICS]; @@ -1099,8 +1103,13 @@ private: uint32_t m_SubPicHeight[MAX_NUM_SUB_PICS]; bool m_subPicTreatedAsPicFlag[MAX_NUM_SUB_PICS]; bool m_loopFilterAcrossSubpicEnabledFlag[MAX_NUM_SUB_PICS]; +#if JVET_Q0119_CLEANUPS + bool m_subPicIdMappingExplicitlySignalledFlag; + bool m_subPicIdMappingInSpsFlag; +#else bool m_subPicIdPresentFlag; //!< indicates the presence of sub-picture IDs bool m_subPicIdSignallingPresentFlag; //!< indicates the presence of sub-picture ID signalling in the SPS +#endif uint32_t m_subPicIdLen; //!< sub-picture ID length in bits uint8_t m_subPicId[MAX_NUM_SUB_PICS]; //!< sub-picture ID for each sub-picture in the sequence @@ -1263,8 +1272,13 @@ public: void setMaxPicHeightInLumaSamples( uint32_t u ) { m_maxHeightInLumaSamples = u; } uint32_t getMaxPicHeightInLumaSamples() const { return m_maxHeightInLumaSamples; } +#if JVET_Q0119_CLEANUPS + void setSubPicInfoPresentFlag(bool b) { m_subPicInfoPresentFlag = b; } + bool getSubPicInfoPresentFlag() const { return m_subPicInfoPresentFlag; } +#else void setSubPicPresentFlag(bool b) { m_subPicPresentFlag = b; } bool getSubPicPresentFlag() const { return m_subPicPresentFlag; } +#endif void setNumSubPics( uint8_t u ) { m_numSubPics = u; } uint8_t getNumSubPics( ) const { return m_numSubPics; } @@ -1280,10 +1294,17 @@ public: bool getSubPicTreatedAsPicFlag( int i ) const { CHECK( i >= MAX_NUM_SUB_PICS, "Sub-picture index exceeds valid range" ); return m_subPicTreatedAsPicFlag[i]; } void setLoopFilterAcrossSubpicEnabledFlag( int i, bool u ) { CHECK( i >= MAX_NUM_SUB_PICS, "Sub-picture index exceeds valid range" ); m_loopFilterAcrossSubpicEnabledFlag[i] = u; } bool getLoopFilterAcrossSubpicEnabledFlag( int i ) const { CHECK( i >= MAX_NUM_SUB_PICS, "Sub-picture index exceeds valid range" ); return m_loopFilterAcrossSubpicEnabledFlag[i]; } +#if JVET_Q0119_CLEANUPS + void setSubPicIdMappingExplicitlySignalledFlag( bool b ) { m_subPicIdMappingExplicitlySignalledFlag = b; } + bool getSubPicIdMappingExplicitlySignalledFlag() const { return m_subPicIdMappingExplicitlySignalledFlag; } + void setSubPicIdMappingInSpsFlag( bool b ) { m_subPicIdMappingInSpsFlag = b; } + bool getSubPicIdMappingInSpsFlag() const { return m_subPicIdMappingInSpsFlag; } +#else void setSubPicIdPresentFlag( bool b ) { m_subPicIdPresentFlag = b; } bool getSubPicIdPresentFlag() const { return m_subPicIdPresentFlag; } void setSubPicIdSignallingPresentFlag( bool b ) { m_subPicIdSignallingPresentFlag = b; } bool getSubPicIdSignallingPresentFlag() const { return m_subPicIdSignallingPresentFlag; } +#endif void setSubPicIdLen( uint32_t u ) { m_subPicIdLen = u; } uint32_t getSubPicIdLen() const { return m_subPicIdLen; } void setSubPicId( int i, uint8_t u ) { CHECK( i >= MAX_NUM_SUB_PICS, "Sub-picture index exceeds valid range" ); m_subPicId[i] = u; } @@ -1630,7 +1651,11 @@ private: bool m_useWeightedBiPred; //!< Use of Weighting Bi-Prediction (B_SLICE) bool m_OutputFlagPresentFlag; //!< Indicates the presence of output_flag in slice header uint8_t m_numSubPics; //!< number of sub-pictures used - must match SPS +#if JVET_Q0119_CLEANUPS + bool m_subPicIdMappingInPpsFlag; +#else bool m_subPicIdSignallingPresentFlag; //!< indicates the presence of sub-picture ID signalling in the PPS +#endif uint32_t m_subPicIdLen; //!< sub-picture ID length in bits uint8_t m_subPicId[MAX_NUM_SUB_PICS]; //!< sub-picture ID for each sub-picture in the sequence bool m_noPicPartitionFlag; //!< no picture partitioning flag - single slice, single tile @@ -1789,8 +1814,13 @@ public: bool getOutputFlagPresentFlag() const { return m_OutputFlagPresentFlag; } void setNumSubPics( uint8_t u ) { m_numSubPics = u; } uint8_t getNumSubPics( ) const { return m_numSubPics; } +#if JVET_Q0119_CLEANUPS + void setSubPicIdMappingInPpsFlag( bool b ) { m_subPicIdMappingInPpsFlag = b; } + bool getSubPicIdMappingInPpsFlag() const { return m_subPicIdMappingInPpsFlag; } +#else void setSubPicIdSignallingPresentFlag( bool b ) { m_subPicIdSignallingPresentFlag = b; } bool getSubPicIdSignallingPresentFlag() const { return m_subPicIdSignallingPresentFlag; } +#endif void setSubPicIdLen( uint32_t u ) { m_subPicIdLen = u; } uint32_t getSubPicIdLen() const { return m_subPicIdLen; } void setSubPicId( int i, uint8_t u ) { CHECK( i >= MAX_NUM_SUB_PICS, "Sub-picture index exceeds valid range" ); m_subPicId[i] = u; } @@ -2021,9 +2051,11 @@ private: uint32_t m_recoveryPocCnt; //!< recovery POC count int m_spsId; //!< sequence parameter set ID int m_ppsId; //!< picture parameter set ID +#if !JVET_Q0119_CLEANUPS bool m_subPicIdSignallingPresentFlag; //!< indicates the presence of sub-picture ID signalling in the SPS uint32_t m_subPicIdLen; //!< sub-picture ID length in bits uint8_t m_subPicId[MAX_NUM_SUB_PICS]; //!< sub-picture ID for each sub-picture in the sequence +#endif bool m_loopFilterAcrossVirtualBoundariesDisabledFlag; //!< loop filtering across virtual boundaries disabled unsigned m_numVerVirtualBoundaries; //!< number of vertical virtual boundaries unsigned m_numHorVirtualBoundaries; //!< number of horizontal virtual boundaries @@ -2126,12 +2158,14 @@ public: uint32_t getSPSId() const { return m_spsId; } void setPPSId( uint32_t u ) { m_ppsId = u; } uint32_t getPPSId() const { return m_ppsId; } +#if !JVET_Q0119_CLEANUPS void setSubPicIdSignallingPresentFlag( bool b ) { m_subPicIdSignallingPresentFlag = b; } bool getSubPicIdSignallingPresentFlag() const { return m_subPicIdSignallingPresentFlag; } void setSubPicIdLen( uint32_t u ) { m_subPicIdLen = u; } uint32_t getSubPicIdLen() const { return m_subPicIdLen; } void setSubPicId( int i, uint8_t u ) { CHECK( i >= MAX_NUM_SUB_PICS, "Sub-pic index exceeds valid range" ); m_subPicId[i] = u; } uint8_t getSubPicId( int i ) const { CHECK( i >= MAX_NUM_SUB_PICS, "Sub-pic index exceeds valid range" ); return m_subPicId[i]; } +#endif void setLoopFilterAcrossVirtualBoundariesDisabledFlag(bool b) { m_loopFilterAcrossVirtualBoundariesDisabledFlag = b; } bool getLoopFilterAcrossVirtualBoundariesDisabledFlag() const { return m_loopFilterAcrossVirtualBoundariesDisabledFlag; } void setNumVerVirtualBoundaries(unsigned u) { m_numVerVirtualBoundaries = u; } diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 52745d048ae5e34fc2e07f2c85953b09b44eeedd..d7729d719cde6ef9aad14968359f092b0db44dff 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -83,6 +83,8 @@ #define JVET_Q0447_WP_PARAM_ESTIM 1 // JVET-Q0447: Add search iterations for method 2,3 and 4 +#define JVET_Q0119_CLEANUPS 1 // JVET-Q0119: AHG12: Cleanups on signalling of subpictures, tiles, and rectangular slices + #define JVET_Q0820_ACT 1 // JVET-Q0820: ACT bug fixes and reversible ACT transform #define JVET_Q0353_ACT_SW_FIX 1 // JVET-Q0353: Bug fix of ACT diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp index beb58cf5cf93c4c07a5b9a5de95a802a6c6b7fcc..f55adff33e08115916be61498cabf8727a90156c 100644 --- a/source/Lib/DecoderLib/DecLib.cpp +++ b/source/Lib/DecoderLib/DecLib.cpp @@ -1258,7 +1258,11 @@ void DecLib::xActivateParameterSets( const int layerId ) } if( sps->getRprEnabledFlag() ) { +#if JVET_Q0119_CLEANUPS + CHECK( sps->getSubPicInfoPresentFlag() != 0, "When res_change_in_clvs_allowed_flag is equal to 1, the value of subpic_info_present_flag shall be equal to 0." ); +#else CHECK( sps->getSubPicPresentFlag() != 0, "When res_change_in_clvs_allowed_flag is equal to 1, the value of subpic_info_present_flag shall be equal to 0." ); +#endif } CHECK( !sps->getRprEnabledFlag() && pps->getScalingWindow().getWindowEnabledFlag(), "When res_change_in_clvs_allowed_flag is equal to 0, the value of scaling_window_flag shall be equal to 0." ); #else diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index 9d22d2d1e4d85a9a2502391b0a72102e05a9c5d9..78a3e6a5dd7aae73092d65c4d8953dc99a17bae9 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -446,8 +446,13 @@ void HLSyntaxReader::parsePPS( PPS* pcPPS, ParameterSetManager *parameterSetMana READ_FLAG( uiCode, "output_flag_present_flag" ); pcPPS->setOutputFlagPresentFlag( uiCode==1 ); +#if JVET_Q0119_CLEANUPS + READ_FLAG( uiCode, "subpic_id_mapping_in_pps_flag" ); pcPPS->setSubPicIdMappingInPpsFlag( uiCode != 0 ); + if( pcPPS->getSubPicIdMappingInPpsFlag() ) +#else READ_FLAG(uiCode, "pps_subpic_id_signalling_present_flag"); pcPPS->setSubPicIdSignallingPresentFlag( uiCode != 0 ); if( pcPPS->getSubPicIdSignallingPresentFlag() ) +#endif { READ_UVLC( uiCode, "pps_num_subpics_minus1" ); pcPPS->setNumSubPics( uiCode + 1 ); CHECK( uiCode > MAX_NUM_SUB_PICS-1, "Number of sub-pictures exceeds limit"); @@ -1255,15 +1260,30 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) pcSPS->setLog2DiffMaxMinCodingBlockSize(uiCode+3); pcSPS->setMaxCUWidth(pcSPS->getCTUSize()); pcSPS->setMaxCUHeight(pcSPS->getCTUSize()); -#if JVET_Q0043_RPR_and_Subpics + +#if JVET_Q0043_RPR_and_Subpics | JVET_Q0119_CLEANUPS +#if JVET_Q0119_CLEANUPS + READ_FLAG( uiCode, "subpic_info_present_flag" ); pcSPS->setSubPicInfoPresentFlag(uiCode); +#else READ_FLAG( uiCode, "subpic_info_present_flag" ); pcSPS->setSubPicPresentFlag(uiCode); +#endif #else READ_FLAG( uiCode, "subpics_present_flag" ); pcSPS->setSubPicPresentFlag(uiCode); #endif +#if JVET_Q0119_CLEANUPS + if (pcSPS->getSubPicInfoPresentFlag()) +#else if (pcSPS->getSubPicPresentFlag()) +#endif { +#if JVET_Q0119_CLEANUPS + READ_UVLC(uiCode, "sps_num_subpics_minus1"); pcSPS->setNumSubPics(uiCode + 1); + CHECK(uiCode > (pcSPS->getMaxPicWidthInLumaSamples() / (1 << pcSPS->getCTUSize())) * (pcSPS->getMaxPicHeightInLumaSamples() / (1 << pcSPS->getCTUSize())) - 1, "Invalid sps_num_subpics_minus1 value"); +#else READ_CODE(8, uiCode, "sps_num_subpics_minus1"); pcSPS->setNumSubPics(uiCode + 1); +#endif + #if JVET_Q0816 if( pcSPS->getNumSubPics() == 1 ) { @@ -1350,9 +1370,30 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) #if JVET_Q0816 } #endif + +#if JVET_Q0119_CLEANUPS + READ_UVLC( uiCode, "sps_subpic_id_len_minus1" ); pcSPS->setSubPicIdLen( uiCode + 1 ); + CHECK( uiCode > 15, "Invalid sps_subpic_id_len_minus1 value" ); + CHECK( (1 << (uiCode + 1)) < pcSPS->getNumSubPics() + 1, "Invalid sps_subpic_id_len_minus1 value" ); + READ_FLAG( uiCode, "subpic_id_mapping_explicitly_signalled_flag" ); pcSPS->setSubPicIdMappingExplicitlySignalledFlag( uiCode != 0 ); + if (pcSPS->getSubPicIdMappingExplicitlySignalledFlag()) + { + READ_FLAG( uiCode, "subpic_id_mapping_in_sps_flag" ); pcSPS->setSubPicIdMappingInSpsFlag( uiCode != 0 ); + if (pcSPS->getSubPicIdMappingInSpsFlag()) + { + for (int picIdx = 0; picIdx < pcSPS->getNumSubPics(); picIdx++) + { + READ_CODE(pcSPS->getSubPicIdLen(), uiCode, "sps_subpic_id[i]"); pcSPS->setSubPicId(picIdx, uiCode); + } + } + } +#endif } else { +#if JVET_Q0119_CLEANUPS + pcSPS->setSubPicIdMappingExplicitlySignalledFlag(0); +#endif pcSPS->setNumSubPics(1); pcSPS->setSubPicCtuTopLeftX(0, 0); pcSPS->setSubPicCtuTopLeftY(0, 0); @@ -1360,6 +1401,7 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) pcSPS->setSubPicHeight(0, (pcSPS->getMaxPicHeightInLumaSamples() + pcSPS->getCTUSize() - 1) >> floorLog2(pcSPS->getCTUSize())); } +#if !JVET_Q0119_CLEANUPS READ_FLAG(uiCode, "sps_subpic_id_present_flag"); pcSPS->setSubPicIdPresentFlag( uiCode != 0 ); if( pcSPS->getSubPicIdPresentFlag() ) { @@ -1378,6 +1420,9 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) } } if( pcSPS->getSubPicIdPresentFlag() == false || pcSPS->getSubPicIdSignallingPresentFlag() == false ) +#else + if( !pcSPS->getSubPicIdMappingExplicitlySignalledFlag() || !pcSPS->getSubPicIdMappingInSpsFlag() ) // is it correct??? +#endif { for( int picIdx = 0; picIdx < pcSPS->getNumSubPics( ); picIdx++ ) { @@ -2106,6 +2151,7 @@ void HLSyntaxReader::parsePictureHeader( PicHeader* picHeader, ParameterSetManag CHECK(pps->getCtuSize() != sps->getCTUSize(), "PPS CTU size does not match CTU size in SPS"); } +#if !JVET_Q0119_CLEANUPS // sub-picture IDs if( sps->getSubPicIdPresentFlag() ) { @@ -2147,6 +2193,7 @@ void HLSyntaxReader::parsePictureHeader( PicHeader* picHeader, ParameterSetManag picHeader->setSubPicId( picIdx, picIdx ); } } +#endif // virtual boundaries if( !sps->getLoopFilterAcrossVirtualBoundariesDisabledFlag() ) @@ -3005,18 +3052,32 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, PicHeader* picHeader, Par pcSlice->setPOC(iPOCmsb + iPOClsb); } +#if JVET_Q0119_CLEANUPS + if (sps->getSubPicInfoPresentFlag()) +#else if (sps->getSubPicPresentFlag()) +#endif { uint32_t bitsSubPicId; +#if JVET_Q0119_CLEANUPS + if (pcSlice->getSPS()->getSubPicIdMappingExplicitlySignalledFlag()) +#else if (sps->getSubPicIdSignallingPresentFlag()) +#endif { bitsSubPicId = sps->getSubPicIdLen(); } +#if !JVET_Q0119_CLEANUPS else if (picHeader->getSubPicIdSignallingPresentFlag()) { bitsSubPicId = picHeader->getSubPicIdLen(); } +#endif +#if JVET_Q0119_CLEANUPS + else if (pcSlice->getPPS()->getSubPicIdMappingInPpsFlag()) +#else else if (pps->getSubPicIdSignallingPresentFlag()) +#endif { bitsSubPicId = pps->getSubPicIdLen(); } @@ -3026,6 +3087,12 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, PicHeader* picHeader, Par } READ_CODE(bitsSubPicId, uiCode, "slice_subpic_id"); pcSlice->setSliceSubPicId(uiCode); } +#if JVET_Q0119_CLEANUPS + else + { + pcSlice->setSliceSubPicId(0); + } +#endif // raster scan slices if(pps->getRectSliceFlag() == 0) diff --git a/source/Lib/EncoderLib/EncCfg.h b/source/Lib/EncoderLib/EncCfg.h index b795a2a410ea39fb1d1476bcf975e6423c73f66f..5959637d9c245a45c835fcf970f3a2858fbffe53 100644 --- a/source/Lib/EncoderLib/EncCfg.h +++ b/source/Lib/EncoderLib/EncCfg.h @@ -266,7 +266,11 @@ protected: int m_maxTempLayer; ///< Max temporal layer unsigned m_CTUSize; +#if JVET_Q0119_CLEANUPS + bool m_subPicInfoPresentFlag; +#else bool m_subPicPresentFlag; +#endif unsigned m_numSubPics; uint32_t m_subPicCtuTopLeftX[MAX_NUM_SUB_PICS]; uint32_t m_subPicCtuTopLeftY[MAX_NUM_SUB_PICS]; @@ -274,8 +278,13 @@ protected: uint32_t m_subPicHeight[MAX_NUM_SUB_PICS]; uint32_t m_subPicTreatedAsPicFlag[MAX_NUM_SUB_PICS]; uint32_t m_loopFilterAcrossSubpicEnabledFlag[MAX_NUM_SUB_PICS]; +#if JVET_Q0119_CLEANUPS + bool m_subPicIdMappingExplicitlySignaledFlag; + bool m_subPicIdMappingInSpsFlag; +#else bool m_subPicIdPresentFlag; bool m_subPicIdSignallingPresentFlag; +#endif unsigned m_subPicIdLen; uint32_t m_subPicId[MAX_NUM_SUB_PICS]; bool m_useSplitConsOverride; @@ -941,7 +950,11 @@ public: bool getUseSplitConsOverride () const { return m_useSplitConsOverride; } void setDualITree ( bool b ) { m_dualITree = b; } bool getDualITree () const { return m_dualITree; } +#if JVET_Q0119_CLEANUPS + void setSubPicInfoPresentFlag (bool b) { m_subPicInfoPresentFlag = b; } +#else void setSubPicPresentFlag (bool b) { m_subPicPresentFlag = b; } +#endif void setNumSubPics (uint32_t u) { m_numSubPics = u; } void setSubPicCtuTopLeftX (uint32_t u, int i) { m_subPicCtuTopLeftX[i] = u; } void setSubPicCtuTopLeftY (uint32_t u, int i) { m_subPicCtuTopLeftY[i] = u; } @@ -949,12 +962,22 @@ public: void setSubPicHeight (uint32_t u, int i) { m_subPicHeight[i] = u; } void setSubPicTreatedAsPicFlag (bool b, int i) { m_subPicTreatedAsPicFlag[i] = b; } void setLoopFilterAcrossSubpicEnabledFlag (uint32_t u, int i) { m_loopFilterAcrossSubpicEnabledFlag[i] = u; } + +#if JVET_Q0119_CLEANUPS + void setSubPicIdMappingExplicitlySignaledFlag (bool b) { m_subPicIdMappingExplicitlySignaledFlag = b; } + void setSubPicIdMappingInSpsFlag (bool b) { m_subPicIdMappingInSpsFlag = b; } +#else void setSubPicIdPresentFlag (bool b) { m_subPicIdPresentFlag = b; } void setSubPicIdSignallingPresentFlag (bool b) { m_subPicIdSignallingPresentFlag = b; } +#endif void setSubPicIdLen (uint32_t u) { m_subPicIdLen = u; } void setSubPicId (uint32_t b, int i) { m_subPicId[i] = b; } +#if JVET_Q0119_CLEANUPS + bool getSubPicInfoPresentFlag () { return m_subPicInfoPresentFlag; } +#else bool getSubPicPresentFlag () { return m_subPicPresentFlag; } +#endif uint32_t getNumSubPics () { return m_numSubPics; } uint32_t getSubPicCtuTopLeftX (int i) { return m_subPicCtuTopLeftX[i]; } uint32_t getSubPicCtuTopLeftY (int i) { return m_subPicCtuTopLeftY[i]; } @@ -962,8 +985,13 @@ public: uint32_t getSubPicHeight (int i) { return m_subPicHeight[i]; } bool getSubPicTreatedAsPicFlag (int i) { return m_subPicTreatedAsPicFlag[i]; } uint32_t getLoopFilterAcrossSubpicEnabledFlag (int i) { return m_loopFilterAcrossSubpicEnabledFlag[i]; } +#if JVET_Q0119_CLEANUPS + bool getSubPicIdMappingExplicitlySignaledFlag () { return m_subPicIdMappingExplicitlySignaledFlag; } + bool getSubPicIdMappingInSpsFlag () { return m_subPicIdMappingInSpsFlag; } +#else bool getSubPicIdPresentFlag () { return m_subPicIdPresentFlag; } bool getSubPicIdSignallingPresentFlag () { return m_subPicIdSignallingPresentFlag; } +#endif uint32_t getSubPicIdLen () { return m_subPicIdLen; } uint32_t getSubPicId (int i) { return m_subPicId[i]; } void setLFNST ( bool b ) { m_LFNST = b; } diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp index 5b59d3243a724510b940f99c8f436146c350ba53..3f816256df452a85e01b8347fc0511f0cb02db8e 100644 --- a/source/Lib/EncoderLib/EncLib.cpp +++ b/source/Lib/EncoderLib/EncLib.cpp @@ -1265,8 +1265,13 @@ void EncLib::xInitSPS( SPS& sps, VPS& vps ) sps.setRPL1CopyFromRPL0Flag( true ); } +#if JVET_Q0119_CLEANUPS + sps.setSubPicInfoPresentFlag(m_subPicInfoPresentFlag); + if (m_subPicInfoPresentFlag) +#else sps.setSubPicPresentFlag(m_subPicPresentFlag); if (m_subPicPresentFlag) +#endif { sps.setNumSubPics(m_numSubPics); for (int i = 0; i < m_numSubPics; i++) @@ -1279,6 +1284,21 @@ void EncLib::xInitSPS( SPS& sps, VPS& vps ) sps.setLoopFilterAcrossSubpicEnabledFlag(i, m_loopFilterAcrossSubpicEnabledFlag[i]); } } +#if JVET_Q0119_CLEANUPS + sps.setSubPicIdMappingExplicitlySignalledFlag(m_subPicIdMappingExplicitlySignaledFlag); + if (m_subPicIdMappingExplicitlySignaledFlag) + { + sps.setSubPicIdMappingInSpsFlag(m_subPicIdMappingInSpsFlag); + if (m_subPicIdMappingInSpsFlag) + { + sps.setSubPicIdLen(m_subPicIdLen); + for (int i = 0; i < m_numSubPics; i++) + { + sps.setSubPicId(i, m_subPicId[i]); + } + } + } +#else sps.setSubPicIdPresentFlag(m_subPicIdPresentFlag); if (m_subPicIdPresentFlag) { @@ -1292,6 +1312,7 @@ void EncLib::xInitSPS( SPS& sps, VPS& vps ) } } } +#endif sps.setLoopFilterAcrossVirtualBoundariesDisabledFlag( m_loopFilterAcrossVirtualBoundariesDisabledFlag ); sps.setNumVerVirtualBoundaries ( m_numVerVirtualBoundaries ); @@ -1348,7 +1369,11 @@ void EncLib::xInitPPS(PPS &pps, const SPS &sps) #endif pps.setNumSubPics(sps.getNumSubPics()); +#if JVET_Q0119_CLEANUPS + pps.setSubPicIdMappingInPpsFlag(false); +#else pps.setSubPicIdSignallingPresentFlag(false); +#endif pps.setSubPicIdLen(sps.getSubPicIdLen()); for(int picIdx=0; picIdx<pps.getNumSubPics(); picIdx++) { @@ -1717,12 +1742,14 @@ void EncLib::xInitPicHeader(PicHeader &picHeader, const SPS &sps, const PPS &pps picHeader.setCuChromaQpOffsetSubdivInter(0); } +#if !JVET_Q0119_CLEANUPS // sub-pictures picHeader.setSubPicIdSignallingPresentFlag(sps.getSubPicIdSignallingPresentFlag()); picHeader.setSubPicIdLen(sps.getSubPicIdLen()); for(i=0; i<sps.getNumSubPics(); i++) { picHeader.setSubPicId(i, sps.getSubPicId(i)); } +#endif // virtual boundaries picHeader.setLoopFilterAcrossVirtualBoundariesDisabledFlag(sps.getLoopFilterAcrossVirtualBoundariesDisabledFlag()); diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index f1b94db14c01b30ab3deaca05f1197235de4fc2d..0b93282c873fc17b7afa6f30e8644701e999f237 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -275,8 +275,13 @@ void HLSWriter::codePPS( const PPS* pcPPS, const SPS* pcSPS ) } WRITE_FLAG( pcPPS->getOutputFlagPresentFlag() ? 1 : 0, "output_flag_present_flag" ); +#if JVET_Q0119_CLEANUPS + WRITE_FLAG( pcPPS->getSubPicIdMappingInPpsFlag() ? 1 : 0, "subpic_id_mapping_in_pps_flag" ); + if( pcPPS->getSubPicIdMappingInPpsFlag() ) +#else WRITE_FLAG(pcPPS->getSubPicIdSignallingPresentFlag(), "pps_subpic_id_signalling_present_flag"); if( pcPPS->getSubPicIdSignallingPresentFlag() ) +#endif { WRITE_UVLC( pcPPS->getNumSubPics() - 1, "pps_num_subpics_minus1" ); @@ -838,14 +843,26 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) WRITE_UVLC( pcSPS->getMaxPicHeightInLumaSamples(), "pic_height_max_in_luma_samples" ); WRITE_CODE(floorLog2(pcSPS->getCTUSize()) - 5, 2, "sps_log2_ctu_size_minus5"); -#if JVET_Q0043_RPR_and_Subpics +#if JVET_Q0043_RPR_and_Subpics | JVET_Q0119_CLEANUPS +#if JVET_Q0119_CLEANUPS + WRITE_FLAG(pcSPS->getSubPicInfoPresentFlag(), "subpic_info_present_flag"); +#else WRITE_FLAG(pcSPS->getSubPicPresentFlag(), "subpic_info_present_flag"); +#endif #else WRITE_FLAG(pcSPS->getSubPicPresentFlag(), "subpics_present_flag"); #endif +#if JVET_Q0119_CLEANUPS + if (pcSPS->getSubPicInfoPresentFlag()) +#else if(pcSPS->getSubPicPresentFlag()) +#endif { +#if JVET_Q0119_CLEANUPS + WRITE_UVLC(pcSPS->getNumSubPics() - 1, "sps_num_subpics_minus1"); +#else WRITE_CODE(pcSPS->getNumSubPics() - 1, 8, "sps_num_subpics_minus1"); +#endif #if JVET_Q0816 if( pcSPS->getNumSubPics() > 1 ) { @@ -889,6 +906,23 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) #if JVET_Q0816 } #endif + +#if JVET_Q0119_CLEANUPS + WRITE_UVLC(pcSPS->getSubPicIdLen() - 1, "sps_subpic_id_len_minus1"); + WRITE_FLAG(pcSPS->getSubPicIdMappingExplicitlySignalledFlag(), "subpic_id_mapping_explicitly_signalled_flag"); + if (pcSPS->getSubPicIdMappingExplicitlySignalledFlag()) + { + WRITE_FLAG(pcSPS->getSubPicIdMappingInSpsFlag(), "subpic_id_mapping_in_sps_flag"); + if (pcSPS->getSubPicIdMappingInSpsFlag()) + { + for (int picIdx = 0; picIdx < pcSPS->getNumSubPics(); picIdx++) + { + WRITE_CODE(pcSPS->getSubPicId(picIdx), pcSPS->getSubPicIdLen(), "sps_subpic_id[i]"); + } + } + } + } +#else } WRITE_FLAG( pcSPS->getSubPicIdPresentFlag(), "sps_subpic_id_present_flag"); @@ -907,6 +941,7 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) } } } +#endif WRITE_UVLC( pcSPS->getBitDepth(CHANNEL_TYPE_LUMA) - 8, "bit_depth_minus8" ); @@ -1429,6 +1464,7 @@ void HLSWriter::codePictureHeader( PicHeader* picHeader ) #endif +#if !JVET_Q0119_CLEANUPS // sub-picture IDs if( sps->getSubPicIdPresentFlag() ) { @@ -1469,6 +1505,7 @@ void HLSWriter::codePictureHeader( PicHeader* picHeader ) picHeader->setSubPicId( picIdx, picIdx ); } } +#endif // virtual boundaries if( !sps->getLoopFilterAcrossVirtualBoundariesDisabledFlag() ) @@ -2131,18 +2168,32 @@ void HLSWriter::codeSliceHeader ( Slice* pcSlice ) WRITE_CODE(pcSlice->getPOC() & pocMask, pocBits, "slice_pic_order_cnt_lsb"); #endif +#if JVET_Q0119_CLEANUPS + if (pcSlice->getSPS()->getSubPicInfoPresentFlag()) +#else if (pcSlice->getSPS()->getSubPicPresentFlag()) +#endif { uint32_t bitsSubPicId; +#if JVET_Q0119_CLEANUPS + if (pcSlice->getSPS()->getSubPicIdMappingExplicitlySignalledFlag()) +#else if (pcSlice->getSPS()->getSubPicIdSignallingPresentFlag()) +#endif { bitsSubPicId = pcSlice->getSPS()->getSubPicIdLen(); } +#if !JVET_Q0119_CLEANUPS else if (picHeader->getSubPicIdSignallingPresentFlag()) { bitsSubPicId = picHeader->getSubPicIdLen(); } +#endif +#if JVET_Q0119_CLEANUPS + else if (pcSlice->getPPS()->getSubPicIdMappingInPpsFlag()) +#else else if (pcSlice->getPPS()->getSubPicIdSignallingPresentFlag()) +#endif { bitsSubPicId = pcSlice->getPPS()->getSubPicIdLen(); }