diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 48083d419de71f4a7cbc1730f9c4899c4a1c18b9..724b63aec3f7a97491a2b2a2214f6df80851532a 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -175,6 +175,8 @@ #define JVET_Q0517_RPR_AFFINE_DS 1 // JVET-Q0517: affine down-sampling filters for RPR +#define JVET_Q0203_MULTI_SLICE_IN_TILE 1 // JVET-Q0203: Signalling of multiple rectangular slices within a tile + #define JVET_O1143_SUBPIC_BOUNDARY 1 // treat subpicture boundary as picture boundary #if JVET_O1143_SUBPIC_BOUNDARY #define JVET_O1143_LPF_ACROSS_SUBPIC_BOUNDARY 1 diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index adf296755691a7a1b3c353f8fb6e4ccf5ea73245..a745bf77d13dc34b5d577c07c3dec99783989d8e 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -544,6 +544,61 @@ void HLSyntaxReader::parsePPS( PPS* pcPPS ) #endif // multiple slices within a single tile special case +#if JVET_Q0203_MULTI_SLICE_IN_TILE + if( pcPPS->getSliceWidthInTiles(i) == 1 && pcPPS->getSliceHeightInTiles(i) == 1 && pcPPS->getTileRowHeight(tileIdx / pcPPS->getNumTileColumns()) > 1 ) + { + READ_UVLC(uiCode, "num_exp_slices_in_tile[i]"); + uint32_t numExpSliceInTile = uiCode; + uint32_t numSliceInTile = 0; + uint32_t remTileRowHeight = pcPPS->getTileRowHeight(tileIdx / pcPPS->getNumTileColumns()); + for( int j = 0; j < numExpSliceInTile - 1; j++ ) + { + READ_UVLC(uiCode, "exp_slice_height_in_ctus_minus1[i]"); + pcPPS->setSliceHeightInCtu(i, uiCode + 1); + remTileRowHeight -= (uiCode + 1); + i++; + pcPPS->setSliceWidthInTiles(i, 1); + pcPPS->setSliceHeightInTiles(i, 1); + pcPPS->setSliceTileIdx(i, tileIdx); + numSliceInTile++; + } + READ_UVLC(uiCode, "exp_slice_height_in_ctus_minus1[i]"); + pcPPS->setSliceHeightInCtu(i, uiCode + 1); + remTileRowHeight -= (uiCode + 1); + i++; + pcPPS->setSliceWidthInTiles(i, 1); + pcPPS->setSliceHeightInTiles(i, 1); + pcPPS->setSliceTileIdx(i, tileIdx); + numSliceInTile++; + uint32_t uniformSliceHeight = pcPPS->getSliceHeightInCtu(i - 1); + + CHECK(remTileRowHeight < 0, "The height of the last slice in a tile cannot be less than 0"); + if( remTileRowHeight == 0 ) + { + i--; + } + + while( remTileRowHeight > uniformSliceHeight ) + { + pcPPS->setSliceHeightInCtu(i, uniformSliceHeight); + remTileRowHeight -= uniformSliceHeight; + i++; + pcPPS->setSliceWidthInTiles(i, 1); + pcPPS->setSliceHeightInTiles(i, 1); + pcPPS->setSliceTileIdx(i, tileIdx); + numSliceInTile++; + } + if( remTileRowHeight > 0 ) + { + pcPPS->setSliceHeightInCtu(i, remTileRowHeight); + numSliceInTile++; + } + for( int j = 0; j < numSliceInTile; j++ ) + { + pcPPS->setNumSlicesInTile(i - 1 - j, numSliceInTile); + } + } +#else if( pcPPS->getSliceWidthInTiles( i ) == 1 && pcPPS->getSliceHeightInTiles( i ) == 1 ) { READ_UVLC( uiCode, "num_slices_in_tile_minus1[i]" ); pcPPS->setNumSlicesInTile( i, uiCode + 1 ); @@ -558,6 +613,7 @@ void HLSyntaxReader::parsePPS( PPS* pcPPS ) pcPPS->setSliceTileIdx ( i, tileIdx ); } } +#endif // tile index offset to start of next slice if( i < pcPPS->getNumSlicesInPic()-1 ) diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index 3372400581a8f2905f80590fe26e7b88bd54c9d0..72d7dacc6f236915a944fbba3e6e1ed7c3ed7b91 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -348,6 +348,28 @@ void HLSWriter::codePPS( const PPS* pcPPS ) #endif // multiple slices within a single tile special case +#if JVET_Q0203_MULTI_SLICE_IN_TILE + if( pcPPS->getSliceWidthInTiles(i) == 1 && pcPPS->getSliceHeightInTiles(i) == 1 && pcPPS->getTileRowHeight(pcPPS->getSliceTileIdx(i) / pcPPS->getNumTileColumns()) > 1 ) + { + uint32_t numExpSliceInTile = pcPPS->getNumSlicesInTile(i) - 1; + if( pcPPS->getSliceHeightInCtu(i + numExpSliceInTile - 2) >= pcPPS->getSliceHeightInCtu(i + numExpSliceInTile - 1) ) + { + for( int j = numExpSliceInTile - 2; j >= 0; j-- ) + { + if( pcPPS->getSliceHeightInCtu(i + j) == pcPPS->getSliceHeightInCtu(i + j + 1) ) + { + numExpSliceInTile--; + } + } + } + WRITE_UVLC(numExpSliceInTile, "num_exp_slices_in_tile[i]"); + for( int j = 0; j < numExpSliceInTile; j++ ) + { + WRITE_UVLC(pcPPS->getSliceHeightInCtu(i + j) - 1, "exp_slice_height_in_ctus_minus1[i]"); + } + i += (pcPPS->getNumSlicesInTile(i) - 1); + } +#else if( pcPPS->getSliceWidthInTiles( i ) == 1 && pcPPS->getSliceHeightInTiles( i ) == 1 ) { WRITE_UVLC( pcPPS->getNumSlicesInTile( i ) - 1, "num_slices_in_tile_minus1[i]" ); @@ -358,6 +380,7 @@ void HLSWriter::codePPS( const PPS* pcPPS ) i++; } } +#endif // tile index offset to start of next slice if( i < pcPPS->getNumSlicesInPic()-1 )