diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index 6aa8a5429d21c4dccd5737aa3a726af266da0aa6..2e25fda8d4e00cb5ddd7ab7ac4d041f3ea104eac 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -3726,51 +3726,19 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, PicHeader* picHeader, Par } // raster scan slices + uint32_t sliceAddr = 0; if(pps->getRectSliceFlag() == 0) { - uint32_t sliceAddr, numTilesInSlice; - // slice address is the raster scan tile index of first tile in slice if( pps->getNumTiles() > 1 ) { int bitsSliceAddress = ceilLog2(pps->getNumTiles()); READ_CODE(bitsSliceAddress, uiCode, "slice_address"); sliceAddr = uiCode; - if (((int)pps->getNumTiles() - (int)sliceAddr) > 1) - { - READ_UVLC(uiCode, "num_tiles_in_slice_minus1"); numTilesInSlice = uiCode + 1; - } - else - { - numTilesInSlice = 1; - } - if (!pps->getRectSliceFlag() && sps->getProfileTierLevel()->getConstraintInfo()->getOneSlicePerPicConstraintFlag()) - { - CHECK(pps->getNumTiles() != uiCode + 1, "When rect_slice_flag is equal to 0 and one_slice_per_pic_constraint_flag equal to 1, the value of num_tiles_in_slice_minus1 present in each slice header shall be equal to NumTilesInPic - 1"); - } } - else { - sliceAddr = 0; - numTilesInSlice = 1; - } - CHECK(sliceAddr >= pps->getNumTiles(), "Invalid slice address"); - pcSlice->initSliceMap(); - pcSlice->setSliceID(sliceAddr); - - for( uint32_t tileIdx = sliceAddr; tileIdx < sliceAddr + numTilesInSlice; tileIdx++ ) - { - uint32_t tileX = tileIdx % pps->getNumTileColumns(); - uint32_t tileY = tileIdx / pps->getNumTileColumns(); - CHECK(tileY >= pps->getNumTileRows(), "Number of tiles in slice exceeds the remaining number of tiles in picture"); - - pcSlice->addCtusToSlice(pps->getTileColumnBd(tileX), pps->getTileColumnBd(tileX + 1), - pps->getTileRowBd(tileY), pps->getTileRowBd(tileY + 1), pps->getPicWidthInCtu()); - } } // rectangular slices else { - uint32_t sliceAddr; - // slice address is the index of the slice within the current sub-picture uint32_t currSubPicIdx = pps->getSubPicIdxFromSubPicId( pcSlice->getSliceSubPicId() ); SubPic currSubPic = pps->getSubPic(currSubPicIdx); @@ -3780,10 +3748,6 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, PicHeader* picHeader, Par READ_CODE(bitsSliceAddress, uiCode, "slice_address"); sliceAddr = uiCode; CHECK(sliceAddr >= currSubPic.getNumSlicesInSubPic(), "Invalid slice address"); } - else - { - sliceAddr = 0; - } uint32_t picLevelSliceIdx = sliceAddr; for(int subpic = 0; subpic < currSubPicIdx; subpic++) { @@ -3803,6 +3767,35 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, PicHeader* picHeader, Par } } + if(pps->getRectSliceFlag() == 0) + { + uint32_t numTilesInSlice = 1; + if( pps->getNumTiles() > 1 ) + { + if (((int)pps->getNumTiles() - (int)sliceAddr) > 1) + { + READ_UVLC(uiCode, "num_tiles_in_slice_minus1"); numTilesInSlice = uiCode + 1; + } + if (!pps->getRectSliceFlag() && sps->getProfileTierLevel()->getConstraintInfo()->getOneSlicePerPicConstraintFlag()) + { + CHECK(pps->getNumTiles() != uiCode + 1, "When rect_slice_flag is equal to 0 and one_slice_per_pic_constraint_flag equal to 1, the value of num_tiles_in_slice_minus1 present in each slice header shall be equal to NumTilesInPic - 1"); + } + } + CHECK(sliceAddr >= pps->getNumTiles(), "Invalid slice address"); + pcSlice->initSliceMap(); + pcSlice->setSliceID(sliceAddr); + + for( uint32_t tileIdx = sliceAddr; tileIdx < sliceAddr + numTilesInSlice; tileIdx++ ) + { + uint32_t tileX = tileIdx % pps->getNumTileColumns(); + uint32_t tileY = tileIdx / pps->getNumTileColumns(); + CHECK(tileY >= pps->getNumTileRows(), "Number of tiles in slice exceeds the remaining number of tiles in picture"); + + pcSlice->addCtusToSlice(pps->getTileColumnBd(tileX), pps->getTileColumnBd(tileX + 1), + pps->getTileRowBd(tileY), pps->getTileRowBd(tileY + 1), pps->getPicWidthInCtu()); + } + } + if (picHeader->getPicInterSliceAllowedFlag()) { READ_UVLC ( uiCode, "slice_type" ); pcSlice->setSliceType((SliceType)uiCode);