diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp index b0af03c8aed706f02666100b8bb197f4a1bdd92c..2e198afcfe0c8fa8521683ed3c577992d4f7f83e 100644 --- a/source/Lib/CommonLib/Slice.cpp +++ b/source/Lib/CommonLib/Slice.cpp @@ -503,9 +503,9 @@ void Slice::constructRefPicList(PicList& rcListPic) { CHECK( m_pRPL0->getInterLayerRefPicIdx( ii ) == NOT_VALID, "Wrong ILRP index" ); - int refLayerIdx = m_pcPic->cs->vps->getDirectRefLayerIdx( layerIdx, m_pRPL0->getInterLayerRefPicIdx( ii ) ); + int refLayerId = m_pcPic->cs->vps->getLayerId( m_pcPic->cs->vps->getDirectRefLayerIdx( layerIdx, m_pRPL0->getInterLayerRefPicIdx( ii ) ) ); - pcRefPic = xGetRefPic( rcListPic, getPOC(), refLayerIdx ); + pcRefPic = xGetRefPic( rcListPic, getPOC(), refLayerId ); pcRefPic->longTerm = true; } else @@ -539,9 +539,9 @@ void Slice::constructRefPicList(PicList& rcListPic) { CHECK( m_pRPL1->getInterLayerRefPicIdx( ii ) == NOT_VALID, "Wrong ILRP index" ); - int refLayerIdx = m_pcPic->cs->vps->getDirectRefLayerIdx( layerIdx, m_pRPL1->getInterLayerRefPicIdx( ii ) ); + int refLayerId = m_pcPic->cs->vps->getLayerId( m_pcPic->cs->vps->getDirectRefLayerIdx( layerIdx, m_pRPL1->getInterLayerRefPicIdx( ii ) ) ); - pcRefPic = xGetRefPic( rcListPic, getPOC(), refLayerIdx ); + pcRefPic = xGetRefPic( rcListPic, getPOC(), refLayerId ); pcRefPic->longTerm = true; } else @@ -4082,10 +4082,12 @@ void Slice::scaleRefPicList( Picture *scaledRefPic[ ], PicHeader *picHeader, APS else { int poc = m_apcRefPicList[refList][rIdx]->getPOC(); + int layerId = m_apcRefPicList[refList][rIdx]->layerId; + // check whether the reference picture has already been scaled for( i = 0; i < MAX_NUM_REF; i++ ) { - if( scaledRefPic[i] != nullptr && scaledRefPic[i]->poc == poc ) + if( scaledRefPic[i] != nullptr && scaledRefPic[i]->poc == poc && scaledRefPic[i]->layerId == layerId ) { break; } @@ -4120,9 +4122,9 @@ void Slice::scaleRefPicList( Picture *scaledRefPic[ ], PicHeader *picHeader, APS scaledRefPic[j]->finalInit( m_pcPic->cs->vps, *sps, *pps, picHeader, apss, lmcsAps, scalingListAps ); - scaledRefPic[j]->poc = -1; + scaledRefPic[j]->poc = NOT_VALID; - scaledRefPic[j]->create( sps->getChromaFormatIdc(), Size( pps->getPicWidthInLumaSamples(), pps->getPicHeightInLumaSamples() ), sps->getMaxCUWidth(), sps->getMaxCUWidth() + 16, isDecoder, m_pcPic->layerId ); + scaledRefPic[j]->create( sps->getChromaFormatIdc(), Size( pps->getPicWidthInLumaSamples(), pps->getPicHeightInLumaSamples() ), sps->getMaxCUWidth(), sps->getMaxCUWidth() + 16, isDecoder, layerId ); } scaledRefPic[j]->poc = poc; diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp index 770838aa12d4b1162337abd4f58d43a6ff65264f..ea429bd33190bdda01164ca8c9e23f92d7534f90 100644 --- a/source/Lib/EncoderLib/EncGOP.cpp +++ b/source/Lib/EncoderLib/EncGOP.cpp @@ -5345,7 +5345,7 @@ void EncGOP::xCreateExplicitReferencePictureSetFromReference( Slice* slice, PicL // loop through all pictures in the reference picture buffer PicList::iterator iterPic = rcListPic.begin(); - while( iterPic != rcListPic.end() ) + while( iterPic != rcListPic.end() && ii < numOfRefPic ) { rpcPic = *( iterPic++ ); int refLayerIdx = vps->getGeneralLayerIdx( rpcPic->layerId ); @@ -5355,7 +5355,7 @@ void EncGOP::xCreateExplicitReferencePictureSetFromReference( Slice* slice, PicL pLocalRPL0->setRefPicIdentifier( refPicIdxL0, 0, true, true, vps->getInterLayerRefIdc( layerIdx, refLayerIdx ) ); refPicIdxL0++; numOfILRPL0++; - break; + ii++; } } } @@ -5441,7 +5441,7 @@ void EncGOP::xCreateExplicitReferencePictureSetFromReference( Slice* slice, PicL // loop through all pictures in the reference picture buffer PicList::iterator iterPic = rcListPic.begin(); - while( iterPic != rcListPic.end() ) + while( iterPic != rcListPic.end() && ii < numOfRefPic ) { rpcPic = *( iterPic++ ); int refLayerIdx = vps->getGeneralLayerIdx( rpcPic->layerId ); @@ -5451,7 +5451,7 @@ void EncGOP::xCreateExplicitReferencePictureSetFromReference( Slice* slice, PicL pLocalRPL1->setRefPicIdentifier( refPicIdxL1, 0, true, true, vps->getInterLayerRefIdc( layerIdx, refLayerIdx ) ); refPicIdxL1++; numOfILRPL1++; - break; + ii++; } } } diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp index 1c08f782fa99b9eb416a4b18e54492dcf3e8ad43..3b4324ea879bef8468b880a5e74a61b6bd1a8bfc 100644 --- a/source/Lib/EncoderLib/EncLib.cpp +++ b/source/Lib/EncoderLib/EncLib.cpp @@ -222,11 +222,11 @@ void EncLib::init( bool isFieldCoding, AUWriterIf* auWriterIf ) m_AUWriterIf = auWriterIf; #if ENABLING_MULTI_SPS - SPS &sps0 = *(m_spsMap.allocatePS(m_layerId)); // NOTE: implementations that use more than 1 SPS need to be aware of activation issues. + SPS &sps0 = *(m_spsMap.allocatePS( m_vps->getGeneralLayerIdx( m_layerId ) )); // NOTE: implementations that use more than 1 SPS need to be aware of activation issues. #else SPS &sps0 = *(m_spsMap.allocatePS(0)); // NOTE: implementations that use more than 1 SPS need to be aware of activation issues. #endif - PPS &pps0 = *( m_ppsMap.allocatePS( m_layerId ) ); + PPS &pps0 = *( m_ppsMap.allocatePS( m_vps->getGeneralLayerIdx( m_layerId ) ) ); APS &aps0 = *( m_apsMap.allocatePS( SCALING_LIST_APS ) ); aps0.setAPSId( 0 ); aps0.setAPSType( SCALING_LIST_APS ); @@ -706,7 +706,7 @@ bool EncLib::encodePrep( bool flush, PelStorage* pcPicYuvOrg, PelStorage* cPicYu if( m_cVPS.getMaxLayers() > 1 ) #endif { - ppsID = m_layerId; + ppsID = m_vps->getGeneralLayerIdx( m_layerId ); } xGetNewPicBuffer( rcListPicYuvRecOut, pcPicCurr, ppsID );