framemng.cpp
来自「JVT-S203 contains the JSVM 6 reference s」· C++ 代码 · 共 1,239 行 · 第 1/3 页
CPP
1,239 行
}
}
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 )
{
UInt uiFGSReconCount = m_pcCurrentFrameUnit->getFGSReconCount();
m_pcCurrentFrameUnit->getFGSReconstruction(uiFGSReconCount)->copyAll(m_pcCurrentFrameUnit->getFGSIntFrame());
m_pcCurrentFrameUnit->setFGSReconCount(uiFGSReconCount + 1);
m_pcCurrentFrameUnit->setFGS( pcPicBuffer );
m_pcCurrentFrameUnit->getFGSIntFrame()->store( pcPicBuffer );
m_pcCurrentFrameUnit->getFGSFrame().extendFrame( m_pcQuarterPelFilter );
return Err::m_nOK;
}
ErrVal FrameMng::xStoreCurrentPicture( const SliceHeader& rcSH )
{
Frame& cBaseFrame = m_pcCurrentFrameUnit->getFrame();
PicBuffer cTempPicBuffer(cBaseFrame.getFullPelYuvBuffer()->getBuffer());
// Base layer
m_pcCurrentFrameUnit->getFGSReconstruction(0)->load(& cTempPicBuffer);
m_pcCurrentFrameUnit->setFGSReconCount(1);
RNOK( m_pcCurrentFrameUnit->getFrame().extendFrame( m_pcQuarterPelFilter ) );
if( rcSH.getNalRefIdc() )
{
//===== store as short term picture =====
m_pcCurrentFrameUnit->setFrameNumber( rcSH.getFrameNum() );
m_pcCurrentFrameUnit->setUsed ();
m_cShortTermList.push_front( m_pcCurrentFrameUnit );
m_iEntriesInDPB++;
//JVT-S036 lsj start
if( rcSH.getKeyPicFlagScalable() )
{
RNOK( m_cFrameUnitBuffer.getFrameUnit( m_pcCurrentFrameUnitBase ) );
RNOK( m_pcCurrentFrameUnitBase->copyBase( rcSH, *m_pcCurrentFrameUnit ) );
m_pcCurrentFrameUnitBase->setBaseRep( true );
m_cShortTermList.push_front( m_pcCurrentFrameUnitBase );
m_iEntriesInDPB++;
}
//JVT-S036 lsj end
}
else
{
m_cNonRefList.push_back( m_pcCurrentFrameUnit );
m_iEntriesInDPB++;
}
//===== store reference in ordered POC List =====
FUIter iter;
for( iter = m_cOrderedPOCList.begin(); iter != m_cOrderedPOCList.end(); iter++ )
{
if( (*iter)->getMaxPOC() > m_pcCurrentFrameUnit->getMaxPOC() )
{
break;
}
}
if( rcSH.getKeyPicFlagScalable() ) //JVT-S036 lsj
{
m_cOrderedPOCList.insert( iter, m_pcCurrentFrameUnitBase );
}
else
{
m_cOrderedPOCList.insert( iter, m_pcCurrentFrameUnit );
}
return Err::m_nOK;
}
ErrVal FrameMng::xMmcoMarkShortTermAsUnused( const FrameUnit* pcCurrFrameUnit, UInt uiDiffOfPicNums )
{
UInt uiCurrPicNum = pcCurrFrameUnit->getFrameNumber();
UInt uiPicNumN = uiCurrPicNum - uiDiffOfPicNums - 1;
if( uiCurrPicNum <= uiDiffOfPicNums )
{
uiPicNumN += m_uiMaxFrameNumPrev;
}
FUIter iter = m_cShortTermList.findShortTerm( uiPicNumN );
if( iter == m_cShortTermList.end() )
{
printf("\nMMCO not possible\n" );
return Err::m_nOK; // HS: decoder robustness
}
FrameUnit* pcFrameUnit = (*iter);
pcFrameUnit->setUnused();
RNOK( xRemoveFromRefList( m_cShortTermList, iter ) );
return Err::m_nOK;
}
//JVT-S036 lsj start
ErrVal FrameMng::xMmcoMarkShortTermAsUnusedBase( const FrameUnit* pcCurrFrameUnit, UInt uiDiffOfPicNums )
{
UInt uiCurrPicNum = pcCurrFrameUnit->getFrameNumber();
UInt uiPicNumN = uiCurrPicNum - uiDiffOfPicNums - 1;
if( uiCurrPicNum <= uiDiffOfPicNums )
{
uiPicNumN += m_uiMaxFrameNumPrev;
}
FUIter iter = m_cShortTermList.findShortTerm( uiPicNumN );
if( iter == m_cShortTermList.end() )
{
printf("\nMMCO not possible\n" );
return Err::m_nOK; // HS: decoder robustness
}
FrameUnit* pcFrameUnit = (*iter);
if(pcFrameUnit->getBaseRep() )
{
pcFrameUnit->setUnused();
RNOK( xRemoveFromRefList( m_cShortTermList, iter ) );
}
return Err::m_nOK;
}
//JVT-S036 lsj end
ErrVal FrameMng::xManageMemory( const SliceHeader& rcSH )
{
ROTRS( ! rcSH.getNalRefIdc(), Err::m_nOK );
if( ! rcSH.getAdaptiveRefPicBufferingFlag() )
{
RNOK( xSlidingWindowUpdate() );
return Err::m_nOK;
}
MmcoOp eMmcoOp;
const MmcoBuffer& rcMmcoBuffer = rcSH.getMmcoBuffer();
UInt uiVal1, uiVal2;
Int iIndex = 0;
while( MMCO_END != (eMmcoOp = rcMmcoBuffer.get( iIndex++ ).getCommand( uiVal1, uiVal2)) )
{
switch (eMmcoOp)
{
case MMCO_SHORT_TERM_UNUSED:
RNOK( xMmcoMarkShortTermAsUnused( m_pcCurrentFrameUnit, uiVal1 ) );
break;
case MMCO_RESET:
case MMCO_MAX_LONG_TERM_IDX:
case MMCO_ASSIGN_LONG_TERM:
case MMCO_LONG_TERM_UNUSED:
case MMCO_SET_LONG_TERM:
default:AF();
break;
}
}
return Err::m_nOK;
}
ErrVal FrameMng::xSlidingWindowUpdate()
{
UInt uiS = m_cShortTermList.size();
//ROT( uiS > m_uiNumRefFrames );
//if( uiS == m_uiNumRefFrames )
while( uiS >= m_uiNumRefFrames ) // HS: decoder robustness
{
RNOK( xRemove( m_cShortTermList.popBack() ) );
uiS--; // HS: decoder robustness
}
return Err::m_nOK;
}
//JVT-S036 lsj start
ErrVal FrameMng::xSlidingWindowUpdateBase( UInt mCurrFrameNum )
{
FUList::iterator iter = m_cShortTermList.begin();
FUList::iterator end = m_cShortTermList.end();
FUList::iterator iiter;
for( ; iter != m_cShortTermList.end(); iter++ )
{
if( (*iter)->getBaseRep() && (*iter)->getFrameNumber() != mCurrFrameNum )
{
for( iiter = m_cShortTermList.begin(); iiter != m_cShortTermList.end(); iiter++ )
{
if ( (*iiter)->getFrameNumber() == (*iter)->getFrameNumber() && !(*iiter)->getBaseRep() )
{
(*iter)->setUnused();
RNOK( xRemoveFromRefList( m_cShortTermList, iter ) );
return Err::m_nOK;
}
}
}
}
return Err::m_nOK;
}
ErrVal FrameMng::xMMCOUpdateBase( SliceHeader* rcSH )
{
MmcoOp eMmcoOp;
const MmcoBuffer& rcMmcoBaseBuffer = rcSH->getMmcoBaseBuffer();
Int iIndex = 0;
UInt uiVal1, uiVal2;
while( MMCO_END != (eMmcoOp = rcMmcoBaseBuffer.get( iIndex++ ).getCommand( uiVal1, uiVal2 ) ) )
{
switch( eMmcoOp )
{
case MMCO_SHORT_TERM_UNUSED:
RNOK( xMmcoMarkShortTermAsUnusedBase( m_pcCurrentFrameUnit, uiVal1 ) );
break;
case MMCO_RESET:
case MMCO_MAX_LONG_TERM_IDX:
case MMCO_ASSIGN_LONG_TERM:
case MMCO_LONG_TERM_UNUSED:
case MMCO_SET_LONG_TERM:
default:
fprintf( stderr,"\nERROR: MMCO COMMAND currently not supported in the software\n\n" );
RERR();
}
}
return Err::m_nOK;
}
//JVT-S036 lsj end
ErrVal FrameMng::getRecYuvBuffer( YuvPicBuffer*& rpcRecYuvBuffer )
{
ROT( NULL == m_pcCurrentFrameUnit );
rpcRecYuvBuffer = m_pcCurrentFrameUnit->getFrame().getFullPelYuvBuffer();
return Err::m_nOK;
}
FrameUnit*
FrameMng::getReconstructedFrameUnit( Int iPoc )
{
for( FUIter iter = m_cOrderedPOCList.begin(); iter != m_cOrderedPOCList.end(); iter++ )
{
if( (*iter)->getMaxPOC() == iPoc )
{
return *iter;
}
}
return 0;
}
ErrVal FrameMng::xReferenceListRemapping( SliceHeader& rcSH, ListIdx eListIdx )
{
RefPicList<RefPic>& rcList = rcSH.getRefPicList( eListIdx );
ROTRS( 0 == rcList.bufSize(), Err::m_nOK );
const RplrBuffer& rcRplrBuffer = rcSH.getRplrBuffer( eListIdx );
ROTRS( ! rcRplrBuffer.getRefPicListReorderingFlag(), Err::m_nOK );
UInt uiPicNumPred = rcSH.getFrameNum();
UInt uiMaxPicNum = m_uiMaxFrameNumPrev;
UInt uiIndex = 0;
UInt uiCommand;
UInt uiIdentifier;
while( RPLR_END != ( uiCommand = rcRplrBuffer.get( uiIndex ).getCommand( uiIdentifier ) ) )
{
FUIter iter;
const Frame* pcFrame = NULL;
if( uiCommand == RPLR_LONG )
//===== LONG TERM INDEX =====
{
AF();
}
else
//===== SHORT TERM INDEX =====
{
UInt uiAbsDiff = uiIdentifier + 1;
//---- set short term index ----
if( uiCommand == RPLR_NEG )
{
if( uiPicNumPred < uiAbsDiff )
{
uiPicNumPred -= ( uiAbsDiff - uiMaxPicNum );
}
else
{
uiPicNumPred -= uiAbsDiff;
}
}
else
{
if( uiPicNumPred + uiAbsDiff > uiMaxPicNum - 1 )
{
uiPicNumPred += ( uiAbsDiff - uiMaxPicNum );
}
else
{
uiPicNumPred += uiAbsDiff;
}
}
uiIdentifier = uiPicNumPred;
//---- search for short term picture ----
iter = m_cShortTermList.findShortTerm( uiIdentifier );
//---- check ----
if( iter == m_cShortTermList.end() )
{
return Err::m_nDataNotAvailable;
}
else
{ // everything is fine
//---- set frame ----
if( ! rcSH.getKeyPictureFlag() )
{
if((*iter)->getBaseRep()) //JVT-S036 lsj
{
iter++;
}
if( (*iter)->getFGSPicBuffer() )
{
pcFrame = &( (*iter)->getFGSFrame() );
}
else
{
pcFrame = &( (*iter)->getFrame() );
}
}
else
{
pcFrame = &((*iter)->getFrame() );
}
}
}
//---- find picture in reference list -----
UInt uiRemoveIndex = MSYS_UINT_MAX;
if( NULL != pcFrame )
{
for( UInt uiPos = uiIndex; uiPos < rcList.size(); uiPos++ )
{
if( rcList.get( uiPos ).getFrame() == pcFrame )
{
uiRemoveIndex = uiPos;
break;
}
}
}
//----- reference list reordering -----
rcList.getElementAndRemove( uiIndex, uiRemoveIndex ).setFrame( pcFrame );
uiIndex++;
}
return Err::m_nOK;
}
H264AVC_NAMESPACE_END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?