📄 gopdecoder.cpp
字号:
if(!bRef)
{
//JVT-T054}
if( bTreatAsIdr )
{
//===== IDR pictures =====
m_cUsedDPBUnitList.push_back( pcDPBUnit ); // store current picture
}
else
{
//===== non-IDR picture =====
m_cUsedDPBUnitList.push_back( pcDPBUnit ); // store current picture
RNOK( xUpdateMemory( pcDPBUnit->getCtrlData().getSliceHeader() ) ); // memory update
RNOK( xOutput( rcOutputList, rcUnusedList ) ); // output
}
RNOK( xDumpDPB() );
m_pcCurrDPBUnit = m_cFreeDPBUnitList.popFront(); // new current DPB unit
//JVT-T054{
}
else
{
//replace previous version of current frame in usedDPBUnit by the new version
RNOK( xUpdateDPBUnitList(pcDPBUnit));
RNOK( xUpdateMemory( pcDPBUnit->getCtrlData().getSliceHeader() ) ); // memory update
RNOK( xOutput( rcOutputList, rcUnusedList ) ); // output
m_pcCurrDPBUnit = m_cFreeDPBUnitList.popBack();
}
//JVT-T054}
m_pcCurrDPBUnit->getCtrlData().setSliceHeader( 0 );
m_pcCurrDPBUnit->getCtrlData().getMbDataCtrl()->reset();
m_pcCurrDPBUnit->getCtrlData().getMbDataCtrl()->clear();
return Err::m_nOK;
}
ErrVal
DecodedPicBuffer::xCheckMissingPics( SliceHeader* pcSliceHeader,
PicBufferList& rcOutputList,
PicBufferList& rcUnusedList )
{
ROTRS( pcSliceHeader->isIdrNalUnit(), Err::m_nOK );
ROTRS( ( ( m_uiLastRefFrameNum + 1 ) % m_uiMaxFrameNum ) == pcSliceHeader->getFrameNum(), Err::m_nOK );
UInt uiMissingFrames = pcSliceHeader->getFrameNum() - m_uiLastRefFrameNum - 1;
if( pcSliceHeader->getFrameNum() <= m_uiLastRefFrameNum )
{
uiMissingFrames += m_uiMaxFrameNum;
}
if( ! pcSliceHeader->getSPS().getRequiredFrameNumUpdateBehaviourFlag() )
{
printf("\nLOST PICTURES = %d\n", uiMissingFrames );
RERR();
}
else
{
for( UInt uiIndex = 1; uiIndex <= uiMissingFrames; uiIndex++ )
{
Bool bTreatAsIdr = ( m_cUsedDPBUnitList.empty() );
Int iPoc = ( bTreatAsIdr ? 0 : m_cUsedDPBUnitList.back()->getPoc() );
UInt uiFrameNum = ( m_uiLastRefFrameNum + uiIndex ) % m_uiMaxFrameNum;
RNOK( m_pcCurrDPBUnit->initNonEx( iPoc, uiFrameNum ) );
RNOK( xStorePicture( m_pcCurrDPBUnit, rcOutputList, rcUnusedList, bTreatAsIdr ) );
}
}
m_uiLastRefFrameNum = ( m_uiLastRefFrameNum + uiMissingFrames ) % m_uiMaxFrameNum;
return Err::m_nOK;
}
ErrVal
DecodedPicBuffer::xDumpDPB()
{
#if 1 // NO_DEBUG
return Err::m_nOK;
#endif
printf("\nDECODED PICTURE BUFFER (Layer %d)\n", m_uiLayer );
DPBUnitList::iterator iter = m_cUsedDPBUnitList.begin();
DPBUnitList::iterator end = m_cUsedDPBUnitList.end ();
for( Int iIndex = 0; iter != end; iter++, iIndex++ )
{
DPBUnit* p = (*iter);
printf("\tPOS=%d:\tFN=%d\tPoc=%d\t%s\t", iIndex, p->getFrameNum(), p->getPoc(), (p->isNeededForRef()?"REF":" ") );
if( p->isOutputted() ) printf("Outputted ");
if( !p->isExisting () ) printf("NotExisting ");
if( p->isBaseRep () ) printf("BasRep ");
printf("\n");
}
printf("\n");
return Err::m_nOK;
}
ErrVal
DecodedPicBuffer::xInitPrdListPSlice( RefFrameList& rcList )
{
Bool bBaseRep = m_pcCurrDPBUnit->isKeyPic ();
UInt uiCurrFrameNum = m_pcCurrDPBUnit->getFrameNum();
//----- generate decreasing POC list -----
for( Int iMaxPicNum = (Int)uiCurrFrameNum; true; )
{
DPBUnit* pNext = 0;
DPBUnitList::iterator iter = m_cUsedDPBUnitList.begin();
DPBUnitList::iterator end = m_cUsedDPBUnitList.end ();
for( ; iter != end; iter++ )
{
if( (*iter)->isNeededForRef() &&
(*iter)->getPicNum(uiCurrFrameNum,m_uiMaxFrameNum) < iMaxPicNum &&
( !pNext || (*iter)->getPicNum(uiCurrFrameNum,m_uiMaxFrameNum) > pNext->getPicNum(uiCurrFrameNum,m_uiMaxFrameNum)
||((*iter)->getPicNum(uiCurrFrameNum,m_uiMaxFrameNum) == pNext->getPicNum(uiCurrFrameNum,m_uiMaxFrameNum) && (*iter)->isBaseRep() == bBaseRep) ) )
{
pNext = (*iter);
}
}
if( !pNext )
{
break;
}
iMaxPicNum = pNext->getPicNum(uiCurrFrameNum,m_uiMaxFrameNum);
rcList.add( pNext->getFrame() );
}
return Err::m_nOK;
}
ErrVal
DecodedPicBuffer::xInitPrdListsBSlice( RefFrameList& rcList0,
RefFrameList& rcList1 )
{
RefFrameList cDecreasingPocList;
RefFrameList cIncreasingPocList;
Bool bBaseRep = m_pcCurrDPBUnit->isKeyPic ();
Int iCurrPoc = m_pcCurrDPBUnit->getPoc ();
//----- generate decreasing POC list -----
for( Int iMaxPoc = iCurrPoc; true; )
{
DPBUnit* pNext = 0;
DPBUnitList::iterator iter = m_cUsedDPBUnitList.begin();
DPBUnitList::iterator end = m_cUsedDPBUnitList.end ();
for( ; iter != end; iter++ )
{
if( (*iter)->isNeededForRef() &&
(*iter)->getPoc() < iMaxPoc && ( !pNext || (*iter)->getPoc() > pNext->getPoc() ) &&
(*iter)->isBaseRep() == bBaseRep )
{
pNext = (*iter);
}
}
if( !pNext )
{
break;
}
iMaxPoc = pNext->getPoc();
cDecreasingPocList.add( pNext->getFrame() );
}
//----- generate increasing POC list -----
for( Int iMinPoc = iCurrPoc; true; )
{
DPBUnit* pNext = 0;
DPBUnitList::iterator iter = m_cUsedDPBUnitList.begin();
DPBUnitList::iterator end = m_cUsedDPBUnitList.end ();
for( ; iter != end; iter++ )
{
if( (*iter)->isNeededForRef() &&
(*iter)->getPoc() > iMinPoc && ( !pNext || (*iter)->getPoc() < pNext->getPoc() ) &&
(*iter)->isBaseRep() == bBaseRep )
{
pNext = (*iter);
}
}
if( !pNext )
{
break;
}
iMinPoc = pNext->getPoc();
cIncreasingPocList.add( pNext->getFrame() );
}
//----- list 0 and list 1 -----
UInt uiPos;
for( uiPos = 0; uiPos < cDecreasingPocList.getSize(); uiPos++ )
{
rcList0.add( cDecreasingPocList.getEntry(uiPos) );
}
for( uiPos = 0; uiPos < cIncreasingPocList.getSize(); uiPos++ )
{
rcList0.add( cIncreasingPocList.getEntry(uiPos) );
rcList1.add( cIncreasingPocList.getEntry(uiPos) );
}
for( uiPos = 0; uiPos < cDecreasingPocList.getSize(); uiPos++ )
{
rcList1.add( cDecreasingPocList.getEntry(uiPos) );
}
//----- check for element switching -----
if( rcList1.getActive() >= 2 && rcList0.getActive() == rcList1.getActive() )
{
Bool bSwitch = true;
for( uiPos = 0; uiPos < rcList1.getActive(); uiPos++ )
{
if( rcList0.getEntry(uiPos) != rcList1.getEntry(uiPos) )
{
bSwitch = false;
break;
}
}
if( bSwitch )
{
rcList1.switchFirst();
}
}
return Err::m_nOK;
}
ErrVal
DecodedPicBuffer::xPrdListRemapping ( RefFrameList& rcList,
ListIdx eListIdx,
SliceHeader* pcSliceHeader )
{
ROF( pcSliceHeader );
const RplrBuffer& rcRplrBuffer = pcSliceHeader->getRplrBuffer( eListIdx );
//===== re-odering =====
if( rcRplrBuffer.getRefPicListReorderingFlag() )
{
Bool bBaseRep = pcSliceHeader->getKeyPictureFlag();
UInt uiPicNumPred = pcSliceHeader->getFrameNum();
UInt uiIndex = 0;
UInt uiCommand = 0;
UInt uiIdentifier = 0;
while( RPLR_END != ( uiCommand = rcRplrBuffer.get(uiIndex).getCommand(uiIdentifier) ) )
{
IntFrame* pcFrame = 0;
if( uiCommand == RPLR_LONG )
{
//===== long term index =====
RERR(); // long-term indices are currently not supported by the software
}
else
{
//===== short term index =====
UInt uiAbsDiff = uiIdentifier + 1;
//----- set short-term index (pic num) -----
if( uiCommand == RPLR_NEG )
{
if( uiPicNumPred < uiAbsDiff )
{
uiPicNumPred -= ( uiAbsDiff - m_uiMaxFrameNum );
}
else
{
uiPicNumPred -= uiAbsDiff;
}
}
else // uiCommand == RPLR_POS
{
if( uiPicNumPred + uiAbsDiff > m_uiMaxFrameNum - 1 )
{
uiPicNumPred += ( uiAbsDiff - m_uiMaxFrameNum );
}
else
{
uiPicNumPred += uiAbsDiff;
}
}
uiIdentifier = uiPicNumPred;
//----- get frame -----
DPBUnitList::iterator iter = m_cUsedDPBUnitList.begin();
DPBUnitList::iterator end = m_cUsedDPBUnitList.end ();
for( ; iter != end; iter++ )
{
if( (*iter)->isNeededForRef() &&
(*iter)->getFrameNum() == uiIdentifier &&
(!pcFrame || (*iter)->isBaseRep() == bBaseRep ) )
{
pcFrame = (*iter)->getFrame();
}
}
if( !pcFrame )
{
fprintf( stderr, "\nERROR: MISSING PICTURE !!!!\n\n");
RERR();
}
//----- find picture in reference list -----
UInt uiRemoveIndex = MSYS_UINT_MAX;
for( UInt uiPos = uiIndex; uiPos < rcList.getActive(); uiPos++ ) // active is equal to size !!!
{
if( rcList.getEntry( uiPos ) == pcFrame )
{
uiRemoveIndex = uiPos;
break;
}
}
//----- reference list re-ordering -----
rcList.setElementAndRemove( uiIndex, uiRemoveIndex, pcFrame );
uiIndex++;
} // short-term RPLR
} // while command
}
//===== set final size =====
//EIDR JVT-Q065
// ROT( pcSliceHeader->getNumRefIdxActive( eListIdx ) > rcList.getActive() );
rcList.setActive( pcSliceHeader->getNumRefIdxActive( eListIdx ) );
return Err::m_nOK;
}
ErrVal
DecodedPicBuffer::xDumpRefList( ListIdx eListIdx,
RefFrameList& rcList )
{
#if 1 // NO_DEBUG
return Err::m_nOK;
#endif
printf("List %d =", eListIdx );
for( UInt uiIndex = 1; uiIndex <= rcList.getActive(); uiIndex++ )
{
printf(" %d", rcList[uiIndex]->getPOC() );
}
printf("\n");
return Err::m_nOK;
}
ErrVal
DecodedPicBuffer::initPicCurrDPBUnit( PicBuffer*& rpcPicBuffer,
Bool bRef) //JVT-T054
{
ROF( m_bInitDone );
if(!bRef) //JVT-T054
{
//===== insert pic buffer in list =====
m_cPicBufferList.push_back( rpcPicBuffer );
rpcPicBuffer = 0;
}
SliceHeader* pcOldSH = m_pcCurrDPBUnit->getCtrlData().getSliceHeader();
delete pcOldSH;
m_pcCurrDPBUnit->getCtrlData().clear();
m_pcCurrDPBUnit->getCtrlData().getMbDataCtrl()->reset();
m_pcCurrDPBUnit->getCtrlData().getMbDataCtrl()->clear();
return Err::m_nOK;
}
ErrVal
DecodedPicBuffer::initCurrDPBUnit( DPBUnit*& rpcCurrDPBUnit,
SliceHeader* pcSliceHeader,
PicBufferList& rcOutputList,
PicBufferList& rcUnusedList,
Bool bRef) //JVT-T054
{
ROF( m_bInitDone );
if(!bRef) //JVT-T054
{
//===== check missing pictures =====
RNOK( xCheckMissingPics( pcSliceHeader, rcOutputList, rcUnusedList ) );
}
//===== initialize current DPB unit =====
RNOK( m_pcCurrDPBUnit->init( pcSliceHeader->getPoc(),
pcSliceHeader->getFrameNum(),
pcSliceHeader->getTemporalLevel(),
pcSliceHeader->getKeyPictureFlag(),
pcSliceHeader->getNalRefIdc() > 0,
pcSliceHeader->getPPS().getConstrainedIntraPredFlag(),
pcSliceHeader->getQualityLevel()) ); //JVT-T054
ROT( pcSliceHeader->getKeyPictureFlag() && !pcSliceHeader->getNalRefIdc() ); // just a check
m_pcCurrDPBUnit->getFrame()->setPOC ( pcSliceHeader->getPoc() );
m_pcCurrDPBUnit->getCtrlData().setSliceHeader( pcSliceHeader );
if(!bRef) //JVT-T054
// JVT-Q065 EIDR{
if( m_pcCurrDPBUnit->getCtrlData().getSliceHeader()->isIdrNalUnit() )
{
//===== IDR pictures =====
Int iDummy;
RNOK( xClearOutputAll( rcOutputList, rcUnusedList, iDummy ) ); // clear and output all pictures
}
// JVT-Q065 EIDR}
//===== set DPB unit =====
rpcCurrDPBUnit = m_pcCurrDPBUnit;
return Err::m_nOK;
}
ErrVal
DecodedPicBuffer::clear( PicBufferList& rcOutputList,
PicBufferList& rcUnusedList,
Int& riMaxPoc )
{
RNOK( xClearOutputAll( rcOutputList, rcUnusedList, riMaxPoc ) ); // clear and output all pictures
ROF ( m_cPicBufferList.empty() );
return Err::m_nOK;
}
DPBUnit*
DecodedPicBuffer::getLastUnit()
{
ROTRS( m_cUsedDPBUnitList.empty(), 0 );
return m_cUsedDPBUnitList.back();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -