diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index 22ac7ed2d7745099d354ffeb455737b72edc6ff5..8e0443bfdd9f754a332b76b38a6bdd5f17c9ab0f 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -1271,6 +1271,9 @@ private: int m_numTileRowsMinus1; std::vector<int> m_tileColumnWidth; std::vector<int> m_tileRowHeight; +#if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION + std::vector<int> m_tileHeight; +#endif bool m_singleTileInPicFlag; int m_tileColsWidthMinus1; @@ -1454,6 +1457,10 @@ public: int getNumTileRowsMinus1() const { return m_numTileRowsMinus1; } void setTileRowHeight(const std::vector<int>& rowHeight) { m_tileRowHeight = rowHeight; } uint32_t getTileRowHeight(uint32_t rowIdx) const { return m_tileRowHeight[rowIdx]; } +#if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION + void setTileHeight(uint32_t tileIdx, uint32_t tileHeight) { m_tileHeight[tileIdx] = tileHeight; } + uint32_t getTileHeight(uint32_t tileIdx) const { return m_tileHeight[tileIdx]; } +#endif bool getSingleTileInPicFlag() const { return m_singleTileInPicFlag; } void setSingleTileInPicFlag(bool val) { m_singleTileInPicFlag = val; } diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index aae385021c123c4de5d5a957cfe4dc4a5397adf8..20881e35deb8bf347256473d90fe19ab4d7414dd 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -65,6 +65,8 @@ #define JVET_O0238_PPS_OR_SLICE 1 // JVET-O0238: Signal certain parameters either in PPS or per slice #define SUPPORT_FOR_RECT_SLICES_WITH_VARYING_NUMBER_OF_TILES 1 +#define JVET_O0452_PPS_BRICK_SIGNALING_CONDITION 1 // JVET-O0452: brick_split_flag signaled as RowHeight > 1 and uniform_brick_spacing_flag signaled as RowHeight > 2 + #define FLATTEN_BUFFERS \ (1 && JVET_O0502_ISP_CLEANUP && JVET_O0364_PADDING && JVET_O0426_MRL_REF_SAMPLES_DC_MODE \ && JVET_O0925_MIP_SIMPLIFICATIONS && JVET_O0364_PDPC_DC) diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index ba73150eb8bcbe59b7df8e28ceb6a9377589d7be..620fde0cac1530d13426e8f2ca85da71d18f15f8 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -588,13 +588,31 @@ void HLSyntaxReader::parsePPS( PPS* pcPPS, ParameterSetManager *parameterSetMana std::vector<std::vector<int>> brickRowHeightMinus1 (numTilesInPic); for( int i = 0; i < numTilesInPic; i++ ) { +#if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION + if (pcPPS->getTileHeight(i) > 1) + { +#endif READ_FLAG( uiCode, "brick_split_flag [i]" ); brickSplitFlag[i] = (uiCode == 1); +#if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION + } + else + brickSplitFlag[i] = 0; +#endif if( brickSplitFlag[i] ) { +#if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION + if (pcPPS->getTileHeight(i) > 2) + { +#endif READ_FLAG( uiCode, "uniform_brick_spacing_flag [i]" ); uniformBrickSpacingFlag[i] = (uiCode == 1); +#if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION + } + else + uniformBrickSpacingFlag[i] = 1; +#endif if( uniformBrickSpacingFlag[i] ) { READ_UVLC( uiCode, "brick_height_minus1" ); diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp index de684c90252349f3131407a18847b50cbcc47cb2..641909dc52248a18d3a26146c39eb08fbfcd091c 100644 --- a/source/Lib/EncoderLib/EncLib.cpp +++ b/source/Lib/EncoderLib/EncLib.cpp @@ -1867,12 +1867,25 @@ void EncLib::xInitPPSforTiles(PPS &pps) // check brick splits for each tile for (int tileIdx=0; tileIdx < numTiles; tileIdx++) { +#if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION + const int tileY = tileIdx / (m_iNumColumnsMinus1 + 1); + + int tileHeight = tileRowHeight[tileY]; + + pps.setTileHeight(tileIdx, tileHeight); + + CHECK((tileHeight <= 1) && (pps.getBrickSplitFlag(tileIdx) == 0), "The value of brick_split_flag[ i ] shall be 0 if tileHeight <= 1"); +#endif if (pps.getBrickSplitFlag(tileIdx)) { +#if !JVET_O0452_PPS_BRICK_SIGNALING_CONDITION const int tileY = tileIdx / (m_iNumColumnsMinus1+1); int tileHeight = tileRowHeight [tileY]; - +#endif +#if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION + CHECK((tileHeight <= 2) && (pps.getUniformBrickSpacingFlag(tileIdx) == 1), "The value of uniform_brick_spacing_flag[ i ] shall be 1 if tileHeight <= 2"); +#endif if (pps.getUniformBrickSpacingFlag(tileIdx)) { CHECK((pps.getBrickHeightMinus1(tileIdx) + 1) >= tileHeight, "Brick height larger than or equal to tile height"); diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index d21fc833c9ceba022dc26f84d001f040468306ea..6832bbf16fe23233b41491a46cdb833030bf2f1d 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -341,9 +341,15 @@ void HLSWriter::codePPS( const PPS* pcPPS ) for( int i = 0; pcPPS->getBrickSplittingPresentFlag() && i < numTilesInPic; i++ ) { +#if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION + if (pcPPS->getTileHeight(i) > 1) +#endif WRITE_FLAG( pcPPS->getBrickSplitFlag(i) ? 1 : 0, "brick_split_flag [i]" ); if( pcPPS->getBrickSplitFlag(i) ) { +#if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION + if (pcPPS->getTileHeight(i) > 2) +#endif WRITE_FLAG( pcPPS->getUniformBrickSpacingFlag(i) ? 1 : 0, "uniform_brick_spacing_flag [i]" ); if( pcPPS->getUniformBrickSpacingFlag(i) ) WRITE_UVLC( pcPPS->getBrickHeightMinus1(i), "brick_height_minus1" );