Void TComSlice::decodingRefMarkingForLD( TComList<TComPic*>& rcListPic, Int iMaxNumRefFrames, Int iCurrentPOC ) { assert( iMaxNumRefFrames >= 1 ); while( getActualRefNumber( rcListPic ) > iMaxNumRefFrames ) { sortPicList( rcListPic ); TComList<TComPic*>::iterator it = rcListPic.begin(); while( it != rcListPic.end() ) { if ( (*it)->getSlice(0)->isReferenced() && (*it)->getSlice(0)->getPOC() != iCurrentPOC && (*it)->getSlice(0)->getPOC() % 4 != 0 ) { (*it)->getSlice(0)->setReferenced( false ); // mark POC%4!=0 as unused for reference break; } it++; } if ( it == rcListPic.end() ) // all the reference frames POC%4== 0, mark the first reference frame as unused for reference { it = rcListPic.begin(); while( it != rcListPic.end() ) { if ( (*it)->getSlice(0)->isReferenced() ) { (*it)->getSlice(0)->setReferenced( false ); break; } it++; } } } }
Void TComSlice::setRefPicList ( TComList<TComPic*>& rcListPic ) { if (m_eSliceType == I_SLICE) { ::memset( m_apcRefPicList, 0, sizeof (m_apcRefPicList)); ::memset( m_aiNumRefIdx, 0, sizeof ( m_aiNumRefIdx )); return; } m_aiNumRefIdx[0] = min ( m_aiNumRefIdx[0], (Int)(rcListPic.size())-1 ); m_aiNumRefIdx[1] = min ( m_aiNumRefIdx[1], (Int)(rcListPic.size())-1 ); sortPicList(rcListPic); TComPic* pcRefPic; for (Int n = 0; n < 2; n++) { RefPicList eRefPicList = (RefPicList)n; UInt uiOrderDRB = 1; UInt uiOrderERB = 1; Int iRefIdx = 0; UInt uiActualListSize = 0; if ( m_eSliceType == P_SLICE && eRefPicList == REF_PIC_LIST_1 ) { m_aiNumRefIdx[eRefPicList] = 0; ::memset( m_apcRefPicList[eRefPicList], 0, sizeof(m_apcRefPicList[eRefPicList])); break; } // First DRB pcRefPic = xGetRefPic(rcListPic, true, ERB_NONE, m_iPOC, eRefPicList, uiOrderDRB, m_uiTLayer); if (pcRefPic != NULL) { m_apcRefPicList[eRefPicList][iRefIdx] = pcRefPic; pcRefPic->getPicYuvRec()->extendPicBorder(); iRefIdx++; uiOrderDRB++; uiActualListSize++; } if ( (Int)uiActualListSize >= m_aiNumRefIdx[eRefPicList] ) { m_aiNumRefIdx[eRefPicList] = uiActualListSize; continue; } // Long term reference // Should be enabled to support long term refernce //* // First ERB pcRefPic = xGetRefPic(rcListPic, false, ERB_LTR, m_iPOC, eRefPicList, uiOrderERB, m_uiTLayer); if (pcRefPic != NULL) { Bool bChangeDrbErb = false; if (iRefIdx > 0 && eRefPicList == REF_PIC_LIST_0 && pcRefPic->getPOC() > m_apcRefPicList[eRefPicList][iRefIdx-1]->getPOC()) { bChangeDrbErb = true; } else if (iRefIdx > 0 && eRefPicList == REF_PIC_LIST_1 && pcRefPic->getPOC() < m_apcRefPicList[eRefPicList][iRefIdx-1]->getPOC()) { bChangeDrbErb = true; } if ( bChangeDrbErb) { m_apcRefPicList[eRefPicList][iRefIdx] = m_apcRefPicList[eRefPicList][iRefIdx-1]; m_apcRefPicList[eRefPicList][iRefIdx-1] = pcRefPic; } else { m_apcRefPicList[eRefPicList][iRefIdx] = pcRefPic; } pcRefPic->getPicYuvRec()->extendPicBorder(); iRefIdx++; uiOrderERB++; uiActualListSize++; } //*/ // Short term reference // Residue DRB UInt uiBreakCount = 17 - iRefIdx; while (1) { uiBreakCount--; if ( (Int)uiActualListSize >= m_aiNumRefIdx[eRefPicList] || uiBreakCount == 0 ) { break; } pcRefPic = xGetRefPic(rcListPic, true, ERB_NONE, m_iPOC, eRefPicList, uiOrderDRB, m_uiTLayer); if (pcRefPic != NULL) { uiOrderDRB++; } if (pcRefPic != NULL) { m_apcRefPicList[eRefPicList][iRefIdx] = pcRefPic; pcRefPic->getPicYuvRec()->extendPicBorder(); iRefIdx++; uiActualListSize++; } } m_aiNumRefIdx[eRefPicList] = uiActualListSize; } }