📄 framemng.cpp
字号:
ErrVal FrameMng::xSetInitialReferenceListBFrame( SliceHeader& rcSH )
{
RefPicList<RefPic>& rcList0 = rcSH.getRefPicList( FRAME, LIST_0 );
RefPicList<RefPic>& rcList1 = rcSH.getRefPicList( FRAME, LIST_1 );
UInt uiFirstPosWithGreaterPoc, uiPos;
FUIter iter;
//====== set Poc ordered short-term list and get index with smallest Poc greater than current ======
m_cPocOrderedFrameList.reset();
if( ! rcSH.getUseBasePredictionFlag() )
m_cShortTermList.setRefFrameListFGS( m_cPocOrderedFrameList );
else
m_cShortTermList.setRefFrameList( m_cPocOrderedFrameList );
const PicType ePicType = rcSH.getPicType();
uiFirstPosWithGreaterPoc = xSortPocOrderedList( m_cPocOrderedFrameList, m_pcCurrentFrameUnit->getPic( ePicType )->getPoc() );
//===== set short term reference frames =====
for( uiPos = uiFirstPosWithGreaterPoc - 1; uiPos != MSYS_UINT_MAX; uiPos-- )
{
rcList0.next().setFrame( m_cPocOrderedFrameList.get( uiPos ) );
}
for( uiPos = uiFirstPosWithGreaterPoc; uiPos != m_cPocOrderedFrameList.size(); uiPos++ )
{
rcList0.next().setFrame( m_cPocOrderedFrameList.get( uiPos ) );
rcList1.next().setFrame( m_cPocOrderedFrameList.get( uiPos ) );
}
for( uiPos = uiFirstPosWithGreaterPoc - 1; uiPos != MSYS_UINT_MAX; uiPos-- )
{
rcList1.next().setFrame( m_cPocOrderedFrameList.get( uiPos ) );
}
return Err::m_nOK;
}
ErrVal FrameMng::xSetInitialReferenceListPFields( SliceHeader& rcSH )
{
//----- initial frame list for short term pictures -----
m_acTmpShortTermRefList[LIST_0].reset();
m_cShortTermList.setRefFrameUnitList( m_acTmpShortTermRefList[LIST_0] );
RNOK( xSetInitialReferenceFieldList( rcSH, LIST_0 ) );
return Err::m_nOK;
}
ErrVal FrameMng::xSetInitialReferenceListBFields( SliceHeader& rcSH )
{
UInt uiFirstPosWithGreaterPoc, uiPos;
//====== set POC ordered short-term list and get index with smallest POC greater than current ======
m_cPocOrderedFrameList.reset();
m_cShortTermList.setRefFrameList( m_cPocOrderedFrameList );
const PicType ePicType = rcSH.getPicType();
uiFirstPosWithGreaterPoc = xSortPocOrderedList( m_cPocOrderedFrameList, m_pcCurrentFrameUnit->getPic( ePicType )->getPoc() );
//----- initial frame list for short term pictures -----
m_acTmpShortTermRefList[LIST_0].reset();
m_acTmpShortTermRefList[LIST_1].reset();
for( uiPos = uiFirstPosWithGreaterPoc - 1; uiPos != MSYS_UINT_MAX; uiPos-- )
{
m_acTmpShortTermRefList[LIST_0].add( m_cPocOrderedFrameList.get( uiPos )->getFrameUnit() );
}
for( uiPos = uiFirstPosWithGreaterPoc; uiPos != m_cPocOrderedFrameList.size(); uiPos++ )
{
m_acTmpShortTermRefList[LIST_0].add( m_cPocOrderedFrameList.get( uiPos )->getFrameUnit() );
m_acTmpShortTermRefList[LIST_1].add( m_cPocOrderedFrameList.get( uiPos )->getFrameUnit() );
}
for( uiPos = uiFirstPosWithGreaterPoc - 1; uiPos != MSYS_UINT_MAX; uiPos-- )
{
m_acTmpShortTermRefList[LIST_1].add( m_cPocOrderedFrameList.get( uiPos )->getFrameUnit() );
}
RNOK( xSetInitialReferenceFieldList( rcSH, LIST_0 ) );
RNOK( xSetInitialReferenceFieldList( rcSH, LIST_1 ) );
return Err::m_nOK;
}
ErrVal FrameMng::xSetInitialReferenceFieldList( SliceHeader& rcSH, ListIdx eListIdx )
{
const PicType eCurrentPicType = rcSH.getPicType();
const PicType eOppositePicType = ( eCurrentPicType == TOP_FIELD ? BOT_FIELD : TOP_FIELD );
RefPicList<FrameUnit*>& rcShortList = m_acTmpShortTermRefList [eListIdx];
RefPicList<RefPic>& rcList = rcSH.getRefPicList( eCurrentPicType, eListIdx );
ROTRS( rcList.full(), Err::m_nOK );
//----- initialize field list for short term pictures -----
UInt uiCurrentParityIndex = 0;
UInt uiOppositeParityIndex = 0;
while( uiCurrentParityIndex < rcShortList.size() || uiOppositeParityIndex < rcShortList.size() )
{
//--- current parity ---
while( uiCurrentParityIndex < rcShortList.size() )
{
FrameUnit* pcFU = rcShortList.get( uiCurrentParityIndex++ );
if( pcFU->isUsed( eCurrentPicType ) )
{
if( ! rcSH.getUseBasePredictionFlag() )
rcList.next().setFrame( pcFU->getFGSPicBuffer() ? pcFU->getFGSPic( eCurrentPicType ) : pcFU->getPic( eCurrentPicType ) );
else
rcList.next().setFrame( pcFU->getPic( eCurrentPicType ) );
break;
}
}
//--- opposite parity ---
while( uiOppositeParityIndex < rcShortList.size() )
{
FrameUnit* pcFU = rcShortList.get( uiOppositeParityIndex++ );
if( pcFU->isUsed( eOppositePicType ) )
{
if( ! rcSH.getUseBasePredictionFlag() )
rcList.next().setFrame( pcFU->getFGSPicBuffer() ? pcFU->getFGSPic( eOppositePicType ) : pcFU->getPic( eOppositePicType ) );
else
rcList.next().setFrame( pcFU->getPic( eOppositePicType ) );
break;
}
}
}
return Err::m_nOK;
}
ErrVal FrameMng::xSetFrameFieldLists( SliceHeader& rcSH, ListIdx eListIdx )
{
RefPicList<RefPic>& rcFrameList = rcSH.getRefPicList( FRAME, eListIdx );
RefPicList<RefPic>& rcTopFieldList = rcSH.getRefPicList( TOP_FIELD, eListIdx );
RefPicList<RefPic>& rcBotFieldList = rcSH.getRefPicList( BOT_FIELD, eListIdx );
//===== generate list for field macroblocks =====
for( UInt uiFrmIdx = 0; uiFrmIdx < rcFrameList.size(); uiFrmIdx++ )
{
const Frame* pcFrame = rcFrameList.get( uiFrmIdx ).getFrame();
const Frame* pcTopField = NULL;
const Frame* pcBotField = NULL;
if( pcFrame == rcFrameList.get( uiFrmIdx ).getFrame()->getFrameUnit()->getPic( FRAME ) )
{
pcTopField = pcFrame->getFrameUnit()->getPic( TOP_FIELD );
pcBotField = pcFrame->getFrameUnit()->getPic( BOT_FIELD );
}
else
{
pcTopField = pcFrame->getFrameUnit()->getFGSPic( TOP_FIELD );
pcBotField = pcFrame->getFrameUnit()->getFGSPic( BOT_FIELD );
}
rcTopFieldList.next().setFrame( pcTopField );
rcTopFieldList.next().setFrame( pcBotField );
rcBotFieldList.next().setFrame( pcBotField );
rcBotFieldList.next().setFrame( pcTopField );
}
return Err::m_nOK;
}
ErrVal FrameMng::xCheckReferenceListSwitching( SliceHeader& rcSH )
{
const PicType ePicType = rcSH.getPicType();
RefPicList<RefPic>& rcList0 = rcSH.getRefPicList( ePicType, LIST_0 );
RefPicList<RefPic>& rcList1 = rcSH.getRefPicList( ePicType, LIST_1 );
ROTRS( rcList1.size() < 2 || rcList0.size() != rcList1.size(), Err::m_nOK );
for( UInt uiPos = 0; uiPos < rcList1.size(); uiPos++ )
{
if( rcList1.get( uiPos ) != rcList0.get( uiPos ) )
{
return Err::m_nOK;
}
}
rcList1.switchFirstEntries();
return Err::m_nOK;
}
ErrVal FrameMng::setRefPicLists( SliceHeader& rcSH, Bool bDoNotRemap )
{
RNOK( xSetReferenceLists( rcSH) );
if( ! bDoNotRemap )
{
//===== remapping =====
RNOK( xReferenceListRemapping( rcSH, LIST_0 ) );
RNOK( xReferenceListRemapping( rcSH, LIST_1 ) );
}
const PicType ePicType = rcSH.getPicType ();
//===== MBAFF field lists =====
if( ePicType == FRAME && rcSH.getSPS().getMbAdaptiveFrameFieldFlag() )
{
RNOK( xSetFrameFieldLists( rcSH, LIST_0 ) );
RNOK( xSetFrameFieldLists( rcSH, LIST_1 ) );
}
return Err::m_nOK;
}
ErrVal FrameMng::xSetReferenceLists( SliceHeader& rcSH )
{
rcSH.getRefPicList( FRAME , LIST_0 ).reset( 0 );
rcSH.getRefPicList( FRAME , LIST_1 ).reset( 0 );
rcSH.getRefPicList( TOP_FIELD, LIST_0 ).reset( 0 );
rcSH.getRefPicList( TOP_FIELD, LIST_1 ).reset( 0 );
rcSH.getRefPicList( BOT_FIELD, LIST_0 ).reset( 0 );
rcSH.getRefPicList( BOT_FIELD, LIST_1 ).reset( 0 );
if( rcSH.isIntra() )
{
return Err::m_nOK;
}
const PicType ePicType = rcSH.getPicType();
rcSH.getRefPicList( ePicType, LIST_0 ).reset();
if( ePicType==FRAME && rcSH.getSPS().getMbAdaptiveFrameFieldFlag() )
{
rcSH.getRefPicList( TOP_FIELD, LIST_0 ).reset();
rcSH.getRefPicList( BOT_FIELD, LIST_0 ).reset();
}
if( rcSH.isInterB() )
{
rcSH.getRefPicList( ePicType, LIST_1 ).reset();
if( ePicType==FRAME && rcSH.getSPS().getMbAdaptiveFrameFieldFlag() )
{
rcSH.getRefPicList( TOP_FIELD, LIST_1 ).reset();
rcSH.getRefPicList( BOT_FIELD, LIST_1 ).reset();
}
}
//===== initial lists =====
if( ! rcSH.isInterB() )
{
if( ePicType==FRAME )
{
RNOK( xSetInitialReferenceListPFrame( rcSH ) );
}
else
{
RNOK( xSetInitialReferenceListPFields( rcSH ) );
}
}
else
{
if( ePicType==FRAME )
{
RNOK( xSetInitialReferenceListBFrame( rcSH ) );
}
else
{
RNOK( xSetInitialReferenceListBFields( rcSH ) );
}
RNOK( xCheckReferenceListSwitching( rcSH ) )
}
return Err::m_nOK;
}
ErrVal FrameMng::xClearListsIDR( const SliceHeader& rcSH )
{
RNOK( xRemoveFromRefList( m_cShortTermList ) );
//===== output =====
for( FUIter iter = m_cOrderedPocList.begin(); iter != m_cOrderedPocList.end(); iter++ )
{
if( ! rcSH.getNoOutputOfPriorPicsFlag() )
{
if( (*iter)->getFGSPicBuffer() )
{
(*iter)->getFGSPicBuffer()->setCts( (UInt64)((*iter)->getMaxPoc()) ); // HS: decoder robustness
m_cPicBufferOutputList.push_back( (*iter)->getFGSPicBuffer() );
}
else if ((*iter)->getPicBuffer() ) //JVT-S036 lsj
{
(*iter)->getPicBuffer()->setCts( (UInt64)((*iter)->getMaxPoc()) ); // HS: decoder robustness
m_cPicBufferOutputList.push_back( (*iter)->getPicBuffer() );
}
}
(*iter)->setOutputDone();
if( xFindAndErase( m_cNonRefList, *iter ) )
{
RNOK( xAddToFreeList( (*iter) ) );
}
}
m_cOrderedPocList.clear();
//bug-fix shenqiu EIDR{
RNOK(xAddToFreeList( m_cShortTermList ));
//bug-fix shenqiu EIDR}
return Err::m_nOK;
}
UInt FrameMng::MaxRefFrames( UInt uiLevel, UInt uiNumMbs )
{
return m_uiDBPMemory[ uiLevel ] / ( 384 * uiNumMbs );
}
ErrVal FrameMng::outputAll()
{
FUIter iter;
//===== output =====
for( iter = m_cOrderedPocList.begin(); iter != m_cOrderedPocList.end(); iter++ )
{
if( (*iter)->getFGSPicBuffer() )
{
(*iter)->getFGSPicBuffer()->setCts( (UInt64)((*iter)->getMaxPoc()) ); // HS: decoder robustness
m_cPicBufferOutputList.push_back( (*iter)->getFGSPicBuffer() );
}
else if ((*iter)->getPicBuffer() ) //JVT-S036 lsj
{
(*iter)->getPicBuffer()->setCts( (UInt64)((*iter)->getMaxPoc()) ); // HS: decoder robustness
m_cPicBufferOutputList.push_back( (*iter)->getPicBuffer() );
}
(*iter)->setOutputDone();
}
m_cOrderedPocList.erase( m_cOrderedPocList.begin(), iter );
RNOK( xAddToFreeList( m_cShortTermList ) );
RNOK( xAddToFreeList( m_cNonRefList ) );
return Err::m_nOK;
}
ErrVal FrameMng::xSetOutputList( FrameUnit* pcFrameUnit )
{
ROTRS( m_iEntriesInDPB <= m_iMaxEntriesinDPB, Err::m_nOK );
//===== get minimum Poc for output =====
Int iMinPoctoOuput = MSYS_INT_MAX;
FUIter iter;
for( iter = m_cNonRefList.begin(); iter != m_cNonRefList.end(); iter++ )
{
if( (*iter)->getMaxPoc() < iMinPoctoOuput && ( (*iter) != pcFrameUnit) )
{
iMinPoctoOuput = (*iter)->getMaxPoc();
}
}
ROT( iMinPoctoOuput == MSYS_INT_MAX );
//===== output =====
for( iter = m_cOrderedPocList.begin(); iter != m_cOrderedPocList.end(); iter++ )
{
if( (*iter)->getMaxPoc() <= iMinPoctoOuput )
{
if( (*iter)->getFGSPicBuffer() )
{
(*iter)->getFGSPicBuffer()->setCts( (UInt64)((*iter)->getMaxPoc()) ); // HS: decoder robustness
m_cPicBufferOutputList.push_back( (*iter)->getFGSPicBuffer() );
}
else if ((*iter)->getPicBuffer() ) //JVT-S036 lsj
{
(*iter)->getPicBuffer()->setCts( (UInt64)((*iter)->getMaxPoc()) ); // HS: decoder robustness
m_cPicBufferOutputList.push_back( (*iter)->getPicBuffer() );
}
(*iter)->setOutputDone();
if( xFindAndErase( m_cNonRefList, *iter ) )
{
RNOK( xAddToFreeList( *iter ) );
}
}
else
{
break;
}
}
m_cOrderedPocList.erase( m_cOrderedPocList.begin(), iter );
return Err::m_nOK;
}
ErrVal FrameMng::storeFGSPicture( PicBuffer* pcPicBuffer )
{
const PicType ePicType = m_pcCurrentFrameUnit->getMbDataCtrl()->getSliceHeader()->getPicType();
const Bool bFrameMbsOnlyFlag = m_pcCurrentFrameUnit->getMbDataCtrl()->getSliceHeader()->getSPS().getFrameMbsOnlyFlag();
UInt uiFGSReconCount = m_pcCurrentFrameUnit->getFGSReconCount();
m_pcCurrentFrameUnit->getFGSReconstruction(uiFGSReconCount)->copyAll(m_pcCurrentFrameUnit->getFGSIntFrame());
m_pcCurrentFrameUnit->setFGSReconCount(uiFGSReconCount + 1);
m_pcCurrentFrameUnit->setFGS( pcPicBuffer );
m_cPicBufferUnusedList.pushBack( pcPicBuffer );
m_pcCurrentFrameUnit->getFGSPic( ePicType )->extendFrame( m_pcQuarterPelFilter, bFrameMbsOnlyFlag, true );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -