From bc8613d1c18918e80a29203d29ed452b19e784e2 Mon Sep 17 00:00:00 2001 From: Yao-Jen Chang <yjchang@qti.qualcomm.com> Date: Wed, 18 Sep 2019 11:53:24 -0700 Subject: [PATCH] JVET-O0452: Brick signaling condition on Tile Height with bugfixes --- source/Lib/CommonLib/Slice.h | 2 +- source/Lib/DecoderLib/VLCReader.cpp | 12 ++++++++---- source/Lib/EncoderLib/EncLib.cpp | 29 +++++++++++++++++++++++------ source/Lib/EncoderLib/VLCWriter.cpp | 12 ++++++++++-- 4 files changed, 42 insertions(+), 13 deletions(-) diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index 8e0443bfd..a931220aa 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -1458,7 +1458,7 @@ public: 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; } + void setTileHeight(const std::vector<int>& tileHeight) { m_tileHeight = tileHeight; } uint32_t getTileHeight(uint32_t tileIdx) const { return m_tileHeight[tileIdx]; } #endif diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index 620fde0ca..d65405cf6 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -592,12 +592,14 @@ void HLSyntaxReader::parsePPS( PPS* pcPPS, ParameterSetManager *parameterSetMana if (pcPPS->getTileHeight(i) > 1) { #endif - READ_FLAG( uiCode, "brick_split_flag [i]" ); - brickSplitFlag[i] = (uiCode == 1); + 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] ) @@ -606,12 +608,14 @@ void HLSyntaxReader::parsePPS( PPS* pcPPS, ParameterSetManager *parameterSetMana if (pcPPS->getTileHeight(i) > 2) { #endif - READ_FLAG( uiCode, "uniform_brick_spacing_flag [i]" ); - uniformBrickSpacingFlag[i] = (uiCode == 1); + 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] ) { diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp index 641909dc5..cb74d0324 100644 --- a/source/Lib/EncoderLib/EncLib.cpp +++ b/source/Lib/EncoderLib/EncLib.cpp @@ -1799,6 +1799,9 @@ void EncLib::xInitPPSforTiles(PPS &pps) int numTiles= (m_iNumColumnsMinus1 + 1) * (m_iNumRowsMinus1 + 1); pps.setNumTilesInPic(numTiles); +#if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION + std::vector<int> tileHeight(numTiles); +#endif if (m_brickSplitMap.empty()) { @@ -1870,11 +1873,12 @@ void EncLib::xInitPPSforTiles(PPS &pps) #if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION const int tileY = tileIdx / (m_iNumColumnsMinus1 + 1); - int tileHeight = tileRowHeight[tileY]; + tileHeight[tileIdx] = 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"); + if (tileHeight[tileIdx] <= 1) + { + CHECK(pps.getBrickSplitFlag(tileIdx) != 0, "The value of brick_split_flag[ i ] shall be 0 if tileHeight <= 1"); + } #endif if (pps.getBrickSplitFlag(tileIdx)) { @@ -1884,11 +1888,18 @@ void EncLib::xInitPPSforTiles(PPS &pps) 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"); + if (tileHeight[tileIdx] <= 2) + { + CHECK(pps.getUniformBrickSpacingFlag(tileIdx) != 1, "The value of uniform_brick_spacing_flag[ i ] shall be 1 if tileHeight <= 2"); + } #endif if (pps.getUniformBrickSpacingFlag(tileIdx)) { +#if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION + CHECK((pps.getBrickHeightMinus1(tileIdx) + 1) >= tileHeight[tileIdx], "Brick height larger than or equal to tile height"); +#else CHECK((pps.getBrickHeightMinus1(tileIdx) + 1) >= tileHeight, "Brick height larger than or equal to tile height"); +#endif } else { @@ -1897,12 +1908,18 @@ void EncLib::xInitPPSforTiles(PPS &pps) { cumulativeHeight += pps.getBrickRowHeightMinus1(tileIdx, i) + 1; } +#if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION + CHECK(cumulativeHeight >= tileHeight[tileIdx], "Cumulative brick height larger than or equal to tile height"); +#else CHECK(cumulativeHeight >= tileHeight, "Cumulative brick height larger than or equal to tile height"); +#endif } } } } - +#if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION + pps.setTileHeight(tileHeight); +#endif } void EncCfg::xCheckGSParameters() diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index 6832bbf16..90efec0da 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -343,14 +343,22 @@ void HLSWriter::codePPS( const PPS* pcPPS ) { #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 JVET_O0452_PPS_BRICK_SIGNALING_CONDITION + } #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 JVET_O0452_PPS_BRICK_SIGNALING_CONDITION + } #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" ); else -- GitLab