diff --git a/source/Lib/CommonLib/InterPrediction.cpp b/source/Lib/CommonLib/InterPrediction.cpp index ac3ac1feaff116cc39c651aac8e4d6db6720266e..4adf3ac3ccf90073fb1829ec16b699488d09d8ee 100644 --- a/source/Lib/CommonLib/InterPrediction.cpp +++ b/source/Lib/CommonLib/InterPrediction.cpp @@ -476,11 +476,7 @@ void InterPrediction::xPredInterUni(const PredictionUnit& pu, const RefPicList& if( !pu.cu->affine ) { -#if JVET_R0058 - if (!isIBC) -#else if( !isIBC && pu.cu->slice->getRefPic( eRefPicList, iRefIdx )->isRefScaled( pu.cs->pps ) == false ) -#endif { #if JVET_Q0764_WRAP_AROUND_WITH_RPR if( !pu.cs->pps->getWrapAroundEnabledFlag() ) @@ -1099,9 +1095,7 @@ void InterPrediction::xPredAffineBlk(const ComponentID &compID, const Prediction { wrapRef = false; m_storedMv[h / AFFINE_MIN_BLOCK_SIZE * MVBUFFER_SIZE + w / AFFINE_MIN_BLOCK_SIZE].set(iMvScaleTmpHor, iMvScaleTmpVer); -#if !JVET_R0058 if (refPic->isRefScaled(pu.cs->pps) == false) -#endif { clipMv(tmpMv, pu.lumaPos(), pu.lumaSize(), *pu.cs->sps, *pu.cs->pps); iMvScaleTmpHor = tmpMv.getHor(); @@ -1125,9 +1119,7 @@ void InterPrediction::xPredAffineBlk(const ComponentID &compID, const Prediction else { wrapRef = false; -#if !JVET_R0058 if (refPic->isRefScaled(pu.cs->pps) == false) -#endif { clipMv(curMv, pu.lumaPos(), pu.lumaSize(), *pu.cs->sps, *pu.cs->pps); } diff --git a/source/Lib/CommonLib/Picture.cpp b/source/Lib/CommonLib/Picture.cpp index 79bf4e9f2f50209da88e5de324d959f67ae6f2d3..3f70b6e976fe3b73df8e37857ca78b79959ed0e7 100644 --- a/source/Lib/CommonLib/Picture.cpp +++ b/source/Lib/CommonLib/Picture.cpp @@ -195,6 +195,9 @@ Picture::Picture() m_spliceIdx = NULL; m_ctuNums = 0; layerId = NOT_VALID; +#if JVET_R0058 + numSubpics = 1; +#endif } void Picture::create( const ChromaFormat &_chromaFormat, const Size &size, const unsigned _maxCUSize, const unsigned _margin, const bool _decoder, const int _layerId ) diff --git a/source/Lib/CommonLib/Picture.h b/source/Lib/CommonLib/Picture.h index c7c4b9d4d1ee02c48472dfc82197465a15b5366c..771e69a13f1a3f20da8c9cd7e8bd23a8b8f897e8 100644 --- a/source/Lib/CommonLib/Picture.h +++ b/source/Lib/CommonLib/Picture.h @@ -222,6 +222,13 @@ public: uint32_t layer; uint32_t depth; int layerId; +#if JVET_R0058 + int numSubpics; + std::vector<int> subpicWidthInCTUs; + std::vector<int> subpicHeightInCTUs; + std::vector<int> subpicCtuTopLeftX; + std::vector<int> subpicCtuTopLeftY; +#endif bool subLayerNonReferencePictureDueToSTSA; diff --git a/source/Lib/CommonLib/UnitTools.cpp b/source/Lib/CommonLib/UnitTools.cpp index 5379edb373f7c411ad2be33771931d705b4e3fa9..6a7075879b34ac91a1e461c9464a44af40e018c6 100644 --- a/source/Lib/CommonLib/UnitTools.cpp +++ b/source/Lib/CommonLib/UnitTools.cpp @@ -149,7 +149,7 @@ void CU::checkConformanceILRP(Slice *slice) { const Picture* refPic = slice->getRefPic(eRefPicList, refIdx)->unscaledPic; - if (refPic->cs->pps->getNumSubPics() != slice->getPic()->cs->pps->getNumSubPics()) + if (refPic->numSubpics != slice->getPic()->cs->pps->getNumSubPics()) { isAllRefSameSubpicLayout = false; refList = numRefList; @@ -157,12 +157,12 @@ void CU::checkConformanceILRP(Slice *slice) } else { - for (int i = 0; i < slice->getPic()->cs->pps->getNumSubPics(); i++) + for (int i = 0; i < refPic->numSubpics; i++) { - if (refPic->cs->pps->getSubPic(i).getSubPicWidthInCTUs() != slice->getPic()->cs->pps->getSubPic(i).getSubPicWidthInCTUs() - || refPic->cs->pps->getSubPic(i).getSubPicHeightInCTUs() != slice->getPic()->cs->pps->getSubPic(i).getSubPicHeightInCTUs() - || refPic->cs->pps->getSubPic(i).getSubPicCtuTopLeftX() != slice->getPic()->cs->pps->getSubPic(i).getSubPicCtuTopLeftX() - || refPic->cs->pps->getSubPic(i).getSubPicCtuTopLeftY() != slice->getPic()->cs->pps->getSubPic(i).getSubPicCtuTopLeftY()) + if (refPic->subpicWidthInCTUs[i] != slice->getPic()->cs->pps->getSubPic(i).getSubPicWidthInCTUs() + || refPic->subpicHeightInCTUs[i] != slice->getPic()->cs->pps->getSubPic(i).getSubPicHeightInCTUs() + || refPic->subpicCtuTopLeftX[i] != slice->getPic()->cs->pps->getSubPic(i).getSubPicCtuTopLeftX() + || refPic->subpicCtuTopLeftY[i] != slice->getPic()->cs->pps->getSubPic(i).getSubPicCtuTopLeftY()) { isAllRefSameSubpicLayout = false; refIdx = slice->getNumRefIdx(eRefPicList); @@ -183,7 +183,7 @@ void CU::checkConformanceILRP(Slice *slice) for (int refIdx = 0; refIdx < slice->getNumRefIdx(eRefPicList); refIdx++) { const Picture* refPic = slice->getRefPic(eRefPicList, refIdx)->unscaledPic; - CHECK(!(refPic->layerId != slice->getPic()->layerId && refPic->cs->pps->getNumSubPics() == 1), "The inter-layer reference shall contain a single subpicture or have same subpicture layout with the current picture"); + CHECK(!(refPic->layerId != slice->getPic()->layerId && refPic->numSubpics == 1), "The inter-layer reference shall contain a single subpicture or have same subpicture layout with the current picture"); } } } diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp index 19cab91488ebc35913fc9383d8bd0155905c19f6..b58dfdfa82ad01f8b797e62e9c6f283d4b5996cb 100644 --- a/source/Lib/DecoderLib/DecLib.cpp +++ b/source/Lib/DecoderLib/DecLib.cpp @@ -2091,6 +2091,21 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl m_pcPic->setDecodingOrderNumber(m_decodingOrderCounter); m_decodingOrderCounter++; m_pcPic->setPictureType(nalu.m_nalUnitType); +#if JVET_R0058 + // store sub-picture numbers, sizes, and locations with a picture + pcSlice->getPic()->numSubpics = sps->getNumSubPics(); + pcSlice->getPic()->subpicWidthInCTUs.clear(); + pcSlice->getPic()->subpicHeightInCTUs.clear(); + pcSlice->getPic()->subpicCtuTopLeftX.clear(); + pcSlice->getPic()->subpicCtuTopLeftY.clear(); + for (int subPicIdx = 0; subPicIdx < sps->getNumSubPics(); subPicIdx++) + { + pcSlice->getPic()->subpicWidthInCTUs.push_back(pps->getSubPic(subPicIdx).getSubPicWidthInCTUs()); + pcSlice->getPic()->subpicHeightInCTUs.push_back(pps->getSubPic(subPicIdx).getSubPicHeightInCTUs()); + pcSlice->getPic()->subpicCtuTopLeftX.push_back(pps->getSubPic(subPicIdx).getSubPicCtuTopLeftX()); + pcSlice->getPic()->subpicCtuTopLeftY.push_back(pps->getSubPic(subPicIdx).getSubPicCtuTopLeftY()); + } +#endif } pcSlice->checkCRA(pcSlice->getRPL0(), pcSlice->getRPL1(), m_pocCRA, m_cListPic); pcSlice->constructRefPicList(m_cListPic); diff --git a/source/Lib/DecoderLib/DecSlice.cpp b/source/Lib/DecoderLib/DecSlice.cpp index 7b4bd8d95a54af4ac6de4ed99214622e09e32bfd..335b79ae49be703ed44afd392dabd91e850a8982 100644 --- a/source/Lib/DecoderLib/DecSlice.cpp +++ b/source/Lib/DecoderLib/DecSlice.cpp @@ -132,7 +132,7 @@ void DecSlice::decompressSlice( Slice* slice, InputBitstream* bitstream, int deb #if JVET_R0058 - if (slice->getSliceType() != I_SLICE && slice->getRefPic(REF_PIC_LIST_0, 0)->cs->pps->getNumSubPics() > 1) + if (slice->getSliceType() != I_SLICE && slice->getRefPic(REF_PIC_LIST_0, 0)->numSubpics > 1) { clipMv = clipMvInSubpic; } @@ -173,7 +173,7 @@ void DecSlice::decompressSlice( Slice* slice, InputBitstream* bitstream, int deb { Picture *refPic = slice->getRefPic((RefPicList)rlist, idx); #if JVET_R0058 - if (!refPic->getSubPicSaved() && refPic->unscaledPic->cs->pps->getNumSubPics() > 1) + if (!refPic->getSubPicSaved() && refPic->numSubpics > 1) #else if (!refPic->getSubPicSaved()) #endif diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp index 4b5c0f9ffba5628253f84c641d626378893f432c..1660efa6d7acd65f0ab103721bd1b73ab69aef3b 100644 --- a/source/Lib/EncoderLib/EncGOP.cpp +++ b/source/Lib/EncoderLib/EncGOP.cpp @@ -2259,6 +2259,20 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, pcSlice->constructRefPicList(rcListPic); #if JVET_R0058 + // store sub-picture numbers, sizes, and locations with a picture + pcSlice->getPic()->numSubpics = pcPic->cs->pps->getNumSubPics(); + pcSlice->getPic()->subpicWidthInCTUs.clear(); + pcSlice->getPic()->subpicHeightInCTUs.clear(); + pcSlice->getPic()->subpicCtuTopLeftX.clear(); + pcSlice->getPic()->subpicCtuTopLeftY.clear(); + for (int subPicIdx = 0; subPicIdx < pcPic->cs->pps->getNumSubPics(); subPicIdx++) + { + pcSlice->getPic()->subpicWidthInCTUs.push_back(pcPic->cs->pps->getSubPic(subPicIdx).getSubPicWidthInCTUs()); + pcSlice->getPic()->subpicHeightInCTUs.push_back(pcPic->cs->pps->getSubPic(subPicIdx).getSubPicHeightInCTUs()); + pcSlice->getPic()->subpicCtuTopLeftX.push_back(pcPic->cs->pps->getSubPic(subPicIdx).getSubPicCtuTopLeftX()); + pcSlice->getPic()->subpicCtuTopLeftY.push_back(pcPic->cs->pps->getSubPic(subPicIdx).getSubPicCtuTopLeftY()); + } + const VPS* vps = pcPic->cs->vps; int layerIdx = vps == nullptr ? 0 : vps->getGeneralLayerIdx(pcPic->layerId); if (vps && !vps->getIndependentLayerFlag(layerIdx) && pcPic->cs->pps->getNumSubPics() > 1) @@ -2743,7 +2757,7 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, #endif #if JVET_R0058 - if (pcSlice->getSliceType() != I_SLICE && pcSlice->getRefPic(REF_PIC_LIST_0, 0)->unscaledPic->cs->pps->getNumSubPics() > 1) + if (pcSlice->getSliceType() != I_SLICE && pcSlice->getRefPic(REF_PIC_LIST_0, 0)->numSubpics > 1) { clipMv = clipMvInSubpic; m_pcEncLib->getInterSearch()->setClipMvInSubPic(true); diff --git a/source/Lib/EncoderLib/EncSlice.cpp b/source/Lib/EncoderLib/EncSlice.cpp index c9601bb47db955b7b2f42de67d9a685b1b640a55..a3cabec3796bd9ae46f9984eb9fafdbf067691c9 100644 --- a/source/Lib/EncoderLib/EncSlice.cpp +++ b/source/Lib/EncoderLib/EncSlice.cpp @@ -1581,7 +1581,7 @@ void EncSlice::encodeCtus( Picture* pcPic, const bool bCompressEntireSlice, cons { Picture *refPic = pcSlice->getRefPic((RefPicList)rlist, idx); #if JVET_R0058 - if (!refPic->getSubPicSaved() && refPic->unscaledPic->cs->pps->getNumSubPics() > 1) + if (!refPic->getSubPicSaved() && refPic->numSubpics > 1) #else if (!refPic->getSubPicSaved()) #endif