diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp index b70cd5767514829112b92041d475f16514f5fd3e..808aa60c998f8f5b46c27ecd7509e3c195400066 100644 --- a/source/Lib/CommonLib/Slice.cpp +++ b/source/Lib/CommonLib/Slice.cpp @@ -2711,7 +2711,11 @@ PPS::PPS() , m_picHeightInLumaSamples( 288 ) #if JVET_Q0764_WRAP_AROUND_WITH_RPR , m_wrapAroundEnabledFlag (false) +#if JVET_R0162_WRAPAROUND_OFFSET_SIGNALING +, m_picWidthMinusWrapAroundOffset (0) +#else , m_wrapAroundOffsetMinusCtbSize (0) +#endif , m_wrapAroundOffset (0) #endif , pcv (NULL) diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index fada6a97b8b94cd614a021fefcc93cc5d6ea151d..4d447a0e110770e061542e78aa5559d544c8d153 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -1959,7 +1959,11 @@ private: #if JVET_Q0764_WRAP_AROUND_WITH_RPR bool m_wrapAroundEnabledFlag; //< reference wrap around enabled or not +#if JVET_R0162_WRAPAROUND_OFFSET_SIGNALING + unsigned m_picWidthMinusWrapAroundOffset; // <pic_width_in_minCbSizeY - wraparound_offset_in_minCbSizeY +#else unsigned m_wrapAroundOffsetMinusCtbSize; //< reference wrap around offset minus ( CtbSizeY / MinCbSizeY ) + 2 in units of MinCbSizeY luma samples +#endif unsigned m_wrapAroundOffset; //< reference wrap around offset in luma samples #endif @@ -2052,8 +2056,13 @@ public: #if JVET_Q0764_WRAP_AROUND_WITH_RPR void setWrapAroundEnabledFlag(bool b) { m_wrapAroundEnabledFlag = b; } bool getWrapAroundEnabledFlag() const { return m_wrapAroundEnabledFlag; } +#if JVET_R0162_WRAPAROUND_OFFSET_SIGNALING + void setPicWidthMinusWrapAroundOffset(unsigned offset) { m_picWidthMinusWrapAroundOffset = offset; } + unsigned getPicWidthMinusWrapAroundOffset() const { return m_picWidthMinusWrapAroundOffset; } +#else void setWrapAroundOffsetMinusCtbSize(unsigned offset) { m_wrapAroundOffsetMinusCtbSize = offset; } unsigned getWrapAroundOffsetMinusCtbSize() const { return m_wrapAroundOffsetMinusCtbSize; } +#endif void setWrapAroundOffset(unsigned offset) { m_wrapAroundOffset = offset; } unsigned getWrapAroundOffset() const { return m_wrapAroundOffset; } #endif diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 2687c367fb58b4bffe68e392f3ae02e6493581d2..c3a34d03ead1927041c4c05590b5d2cf9e955ad4 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -52,6 +52,8 @@ //########### place macros to be removed in next cycle below this line ############### +#define JVET_R0162_WRAPAROUND_OFFSET_SIGNALING 1 // JVET-R0162 proposal 1 : signal "picture width minus wraparound offset" instead of "wraparound offset" + #define JVET_R0188 1 // JVET-R0188: Signalling slice_width_in_tiles_minus1[i] and slice_height_in_tiles_minus1[i] #define JVET_R0203_IRAP_LEADING_CONSTRAINT 1 // JVET-R0203: Constraint that IRAP NAL unit type cannot be mixed with RASL_NUT / RADL_NUT diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index f67cf62e0b474522a2026c01b1b8bc407bce47f2..a78ff59b806c1fc401a574137435a1ce16e90557 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -938,11 +938,20 @@ void HLSyntaxReader::parsePPS( PPS* pcPPS ) READ_FLAG(uiCode, "pps_ref_wraparound_enabled_flag"); pcPPS->setWrapAroundEnabledFlag( uiCode ? true : false ); if (pcPPS->getWrapAroundEnabledFlag()) { - READ_UVLC(uiCode, "pps_ref_wraparound_offset"); pcPPS->setWrapAroundOffsetMinusCtbSize( uiCode ); + READ_UVLC(uiCode, "pps_ref_wraparound_offset"); +#if JVET_R0162_WRAPAROUND_OFFSET_SIGNALING + pcPPS->setPicWidthMinusWrapAroundOffset(uiCode); +#else + pcPPS->setWrapAroundOffsetMinusCtbSize( uiCode ); +#endif } else { +#if JVET_R0162_WRAPAROUND_OFFSET_SIGNALING + pcPPS->setPicWidthMinusWrapAroundOffset(0); +#else pcPPS->setWrapAroundOffsetMinusCtbSize( 0 ); +#endif } #endif @@ -2804,7 +2813,12 @@ void HLSyntaxReader::parsePictureHeader( PicHeader* picHeader, ParameterSetManag CHECK( (((sps->getCTUSize() / minCbSizeY) + 1) > ((pps->getPicWidthInLumaSamples() / minCbSizeY) - 1)) && pps->getWrapAroundEnabledFlag(), "When the value of CtbSizeY / MinCbSizeY + 1 is greater than pic_width_in_luma_samples / MinCbSizeY - 1, the value of pps_ref_wraparound_enabled_flag shall be equal to 0."); if( pps->getWrapAroundEnabledFlag() ) { +#if JVET_R0162_WRAPAROUND_OFFSET_SIGNALING + CHECK((pps->getPicWidthMinusWrapAroundOffset() > (pps->getPicWidthInLumaSamples() / minCbSizeY - sps->getCTUSize() / minCbSizeY - 2)), "pps_pic_width_minus_wraparound_ofsfet shall be less than or equal to pps_pic_width_in_luma_samples/MinCbSizeY - CtbSizeY/MinCbSizeY-2"); + pps->setWrapAroundOffset(minCbSizeY * (pps->getPicWidthInLumaSamples()/minCbSizeY- pps->getPicWidthMinusWrapAroundOffset())); +#else pps->setWrapAroundOffset( minCbSizeY * (pps->getWrapAroundOffsetMinusCtbSize() + 2 + sps->getCTUSize() / minCbSizeY) ); +#endif } else { diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp index 6f8c06a57d37f25c1f2e14af1b46a3d7d9c5dc71..f41c61ec452f19ef7888d9029f24b79cf6753dab 100644 --- a/source/Lib/EncoderLib/EncLib.cpp +++ b/source/Lib/EncoderLib/EncLib.cpp @@ -316,12 +316,22 @@ void EncLib::init( bool isFieldCoding, AUWriterIf* auWriterIf ) if( pps.getWrapAroundEnabledFlag() ) { int minCbSizeY = (1 << sps0.getLog2MinCodingBlockSize()); +#if JVET_R0162_WRAPAROUND_OFFSET_SIGNALING + pps.setPicWidthMinusWrapAroundOffset ((pps.getPicWidthInLumaSamples()/minCbSizeY) - (m_wrapAroundOffset * pps.getPicWidthInLumaSamples() / pps0.getPicWidthInLumaSamples() / minCbSizeY) ); + pps.setWrapAroundOffset (minCbSizeY * (pps.getPicWidthInLumaSamples() / minCbSizeY - pps.getPicWidthMinusWrapAroundOffset())); +#else pps.setWrapAroundOffsetMinusCtbSize ( ((m_wrapAroundOffset * pps.getPicWidthInLumaSamples() / pps0.getPicWidthInLumaSamples()) / minCbSizeY) - 2 - (sps0.getCTUSize() / minCbSizeY) ); pps.setWrapAroundOffset ( minCbSizeY * (pps.getWrapAroundOffsetMinusCtbSize() + 2 + sps0.getCTUSize() / minCbSizeY) ); +#endif + } else { +#if JVET_R0162_WRAPAROUND_OFFSET_SIGNALING + pps.setPicWidthMinusWrapAroundOffset (0); +#else pps.setWrapAroundOffsetMinusCtbSize ( 0 ); +#endif pps.setWrapAroundOffset ( 0 ); } #endif @@ -1597,12 +1607,21 @@ void EncLib::xInitPPS(PPS &pps, const SPS &sps) pps.setWrapAroundEnabledFlag ( m_wrapAround ); if( m_wrapAround ) { +#if JVET_R0162_WRAPAROUND_OFFSET_SIGNALING + pps.setPicWidthMinusWrapAroundOffset ((pps.getPicWidthInLumaSamples()/minCbSizeY) - (m_wrapAroundOffset / minCbSizeY)); + pps.setWrapAroundOffset (minCbSizeY *(pps.getPicWidthInLumaSamples() / minCbSizeY- pps.getPicWidthMinusWrapAroundOffset())); +#else pps.setWrapAroundOffsetMinusCtbSize ( (m_wrapAroundOffset / minCbSizeY) - 2 - (sps.getCTUSize() / minCbSizeY) ); pps.setWrapAroundOffset ( minCbSizeY * (pps.getWrapAroundOffsetMinusCtbSize() + 2 + sps.getCTUSize() / minCbSizeY) ); +#endif } else { +#if JVET_R0162_WRAPAROUND_OFFSET_SIGNALING + pps.setPicWidthMinusWrapAroundOffset ( 0 ); +#else pps.setWrapAroundOffsetMinusCtbSize ( 0 ); +#endif pps.setWrapAroundOffset ( 0 ); } CHECK( !sps.getWrapAroundEnabledFlag() && pps.getWrapAroundEnabledFlag(), "When sps_ref_wraparound_enabled_flag is equal to 0, the value of pps_ref_wraparound_enabled_flag shall be equal to 0."); diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index e96e7040ce4c21b537f1b6aaf33dadddc55fe781..58bbfd3c1bdc8ad2b4fea37919416f51b3678859 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -535,7 +535,11 @@ void HLSWriter::codePPS( const PPS* pcPPS ) WRITE_FLAG( pcPPS->getWrapAroundEnabledFlag() ? 1 : 0, "pps_ref_wraparound_enabled_flag" ); if( pcPPS->getWrapAroundEnabledFlag() ) { +#if JVET_R0162_WRAPAROUND_OFFSET_SIGNALING + WRITE_UVLC(pcPPS->getPicWidthMinusWrapAroundOffset(), "pps_pic_width_minus_wraparound_offset"); +#else WRITE_UVLC( pcPPS->getWrapAroundOffsetMinusCtbSize(), "pps_ref_wraparound_offset"); +#endif } #endif