📄 recpicbuffer.cpp
字号:
RecPicBufUnitList::iterator end = m_cUsedRecPicBufUnitList.end ();
for( ; iter != end; iter++ )
{
if( (*iter)->isNeededForRef() )
{
uiCurrNumRefFrames++;
}
}
ROTRS( uiCurrNumRefFrames <= m_uiNumRefFrames, Err::m_nOK );
//===== sliding window reference picture update =====
//--- look for last ref frame that shall be removed ---
UInt uiRefFramesToRemove = uiCurrNumRefFrames - m_uiNumRefFrames;
iter = m_cUsedRecPicBufUnitList.begin();
for( ; iter != end; iter++ )
{
if( (*iter)->isNeededForRef() )
{
uiRefFramesToRemove--;
if( uiRefFramesToRemove == 0 )
{
break;
}
}
}
ROT( uiRefFramesToRemove );
//--- delete reference label ---
end = ++iter;
iter = m_cUsedRecPicBufUnitList.begin();
for( ; iter != end; iter++ )
{
if( (*iter)->isNeededForRef() )
{
RNOK( (*iter)->markNonRef() );
}
}
return Err::m_nOK;
}
ErrVal
RecPicBuffer::xDumpRecPicBuffer()
{
#if 1 // NO_DEBUG
return Err::m_nOK;
#endif
printf( "\nRECONSTRUCTED PICTURE BUFFER:\n" );
RecPicBufUnitList::iterator iter = m_cUsedRecPicBufUnitList.begin();
RecPicBufUnitList::iterator end = m_cUsedRecPicBufUnitList.end ();
for( Int iIndex = 0; iter != end; iter++ )
{
RecPicBufUnit* p = (*iter);
printf( "\tPOS=%d:\tFN=%d\tViewId=%d\tPoc=%d\t%s\t", iIndex, p->getFrameNum(),
p->getViewId(), p->getPoc(), (p->isNeededForRef()?"REF":" ") );
if( p->isOutputted() ) printf("Outputted ");
if( !p->isExisting () ) printf("NotExisting ");
printf("\n");
}
printf("\n");
return Err::m_nOK;
}
// ----------------------------------------------------------------------
//
// FUNCTION: AddMultiviewRefsToList
//
// INPUTS: recPicBufUnitList: A list of refernce pictures potentially
// containing multiview references.
// rcList: A RefFrameList object to add multiview references to.
// refDirection: Direction of references to add to rcList.
//
// PURPOSE: This function goes through each reference in recPicBufUnitList,
// finds all multiview references with the given refDirection,
// and adds them to rcList.
//
// MODIFIED: Tue Mar 14, 2006
//
// ----------------------------------------------------------------------
// modified to be a member of RecPicBuffer 26 Dec, 2006
// and the format has also been adjusted (AddMultiviewRef)
// Simplified again for JVT-V043 7 Feb. 2007
// and some cleanup
ErrVal
RecPicBuffer::AddMultiviewRef( RecPicBufUnitList& recPicBufUnitList,
RefFrameList& rcList, const int maxListSize,
const MultiviewReferenceDirection refDirection, SliceHeader& rcSliceheader) {
RefFrameList tempList;
RecPicBufUnitList::iterator iter;
for (iter = recPicBufUnitList.begin();iter != recPicBufUnitList.end(); iter++) {
if ( refDirection == (*iter)->GetMultiviewReferenceDirection() ) {
if(m_pcPicEncoder->derivation_Inter_View_Flag((*iter)->getViewId(), rcSliceheader)){ //JVT-W056 Samsung
RecPicBufUnit* bufUnitToAdd = (*iter);
rcList.add( bufUnitToAdd->getRecFrame() );
}
}
}
return Err::m_nOK;
}
ErrVal
RecPicBuffer::xInitRefListPSlice( RefFrameList& rcList)
{
//----- get current frame num -----
UInt uiCurrFrameNum = m_pcCurrRecPicBufUnit->getFrameNum();
//----- generate decreasing POC list -----
for( Int iMaxPicNum = (Int)uiCurrFrameNum;
! CodeAsVFrameP() ;
)
{
RecPicBufUnit* pNext = 0;
RecPicBufUnitList::iterator iter = m_cUsedRecPicBufUnitList.begin();
RecPicBufUnitList::iterator end = m_cUsedRecPicBufUnitList.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 ) ) )
{
pNext = (*iter);
}
}
if( ! pNext )
{
break;
}
iMaxPicNum = pNext->getPicNum( uiCurrFrameNum, m_uiMaxFrameNum );
rcList.add( pNext->getRecFrame() );
}
// move the inter-view appending out, ying
return Err::m_nOK;
}
ErrVal
RecPicBuffer::xInitRefListsBSlice( RefFrameList& rcList0,
RefFrameList& rcList1)
{
RefFrameList cDecreasingPocList;
RefFrameList cIncreasingPocList;
Int iCurrPoc = m_pcCurrRecPicBufUnit->getPoc();
//----- generate decreasing Poc list -----
for( Int iMaxPoc = iCurrPoc;
! CodeAsVFrameP();
)
{
RecPicBufUnit* pNext = 0;
RecPicBufUnitList::iterator iter = m_cUsedRecPicBufUnitList.begin();
RecPicBufUnitList::iterator end = m_cUsedRecPicBufUnitList.end ();
for( ; iter != end; iter++ )
{
if( (*iter)->isNeededForRef() &&
(*iter)->getPoc() < iMaxPoc &&
( ! pNext ||
(*iter)->getPoc() > pNext->getPoc() ) )
{
pNext = (*iter);
}
}
if( ! pNext )
{
break;
}
iMaxPoc = pNext->getPoc();
cDecreasingPocList.add( pNext->getRecFrame() );
}
//----- generate increasing Poc list -----
for( Int iMinPoc = iCurrPoc;
! CodeAsVFrameP();
)
{
RecPicBufUnit* pNext = 0;
RecPicBufUnitList::iterator iter = m_cUsedRecPicBufUnitList.begin();
RecPicBufUnitList::iterator end = m_cUsedRecPicBufUnitList.end ();
for( ; iter != end; iter++ )
{
if( (*iter)->isNeededForRef() &&
(*iter)->getPoc() > iMinPoc &&
( ! pNext ||
(*iter)->getPoc() < pNext->getPoc() ) )
{
pNext = (*iter);
}
}
if( ! pNext )
{
break;
}
iMinPoc = pNext->getPoc();
cIncreasingPocList.add( pNext->getRecFrame() );
}
//----- list 0 and list 1 -----
UInt uiPos;
for( uiPos = 0; uiPos < cDecreasingPocList.getSize(); uiPos++ )
{
RNOK( rcList0.add( cDecreasingPocList.getEntry( uiPos ) ) );
}
for( uiPos = 0; uiPos < cIncreasingPocList.getSize(); uiPos++ )
{
RNOK( rcList0.add( cIncreasingPocList.getEntry( uiPos ) ) );
RNOK( rcList1.add( cIncreasingPocList.getEntry( uiPos ) ) );
}
for( uiPos = 0; uiPos < cDecreasingPocList.getSize(); uiPos++ )
{
RNOK( 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();
}
}
// remove the inter-view appending out
return Err::m_nOK;
}
ErrVal
RecPicBuffer::xRefListRemapping( RefFrameList& rcList,
ListIdx eListIdx,
SliceHeader* pcSliceHeader )
{
ROF( pcSliceHeader );
const RplrBuffer& rcRplrBuffer = pcSliceHeader->getRplrBuffer( eListIdx );
//===== re-ordering ======
if( rcRplrBuffer.getRefPicListReorderingFlag() )
{
UInt uiPicNumPred = pcSliceHeader->getFrameNum();
UInt uiIndex = 0;
UInt uiCommand = 0;
UInt uiIdentifier = 0;
// JVT-V043
UInt uiCurrViewId = pcSliceHeader->getViewId();
Bool bFirstViewRPLR = true;
Bool bAnchor = pcSliceHeader->getAnchorPicFlag();
UInt uiPicViewIdx = 0;
while( RPLR_END != ( uiCommand = rcRplrBuffer.get( uiIndex ).getCommand( uiIdentifier ) ) )
{
IntFrame* pcFrame = 0;
if( uiCommand == RPLR_LONG )
{
//===== long-term index =====
RERR(); // long-term not supported
}
else if (uiCommand == RPLR_NEG || uiCommand == RPLR_POS) // JVT-V043
{
//===== 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 -----
RecPicBufUnitList::iterator iter = m_cUsedRecPicBufUnitList.begin();
RecPicBufUnitList::iterator end = m_cUsedRecPicBufUnitList.end ();
for( ; iter != end; iter++ )
{
if( (*iter)->isNeededForRef() &&
(*iter)->getFrameNum() == uiIdentifier &&
(*iter)->getViewId() == uiCurrViewId) // JVT-V043
{
pcFrame = (*iter)->getRecFrame();
break;
}
}
if( ! pcFrame )
{
fprintf( stderr, "\nERROR: MISSING PICTURE for RPLR\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 -----
RNOK( rcList.setElementAndRemove( uiIndex, uiRemoveIndex, pcFrame ) );
uiIndex++;
} // short-term
else // 4 or 5
{
if( uiCommand == RPLR_VIEW_NEG && uiIdentifier == 0 && bFirstViewRPLR )
uiPicViewIdx = 0;
else
{
UInt uiAbsDiff = uiIdentifier + 1;
// JVT-W066
UInt uiMaxRef = pcSliceHeader->getSPS().getSpsMVC()->getNumRefsForListX (uiCurrViewId, eListIdx, bAnchor);
if( uiCommand == RPLR_VIEW_NEG )
{
if( uiPicViewIdx < uiAbsDiff )
{
uiPicViewIdx -= ( uiAbsDiff - uiMaxRef );
}
else
{
uiPicViewIdx -= uiAbsDiff;
}
}
if( uiCommand == RPLR_VIEW_POS)
{
if( uiPicViewIdx + uiAbsDiff >= uiMaxRef )
{
uiPicViewIdx += ( uiAbsDiff - uiMaxRef );
}
else
{
uiPicViewIdx += uiAbsDiff;
}
}
// JVT-W066
}
uiIdentifier = uiPicViewIdx;
UInt targetViewId = pcSliceHeader->getSPS().getSpsMVC()->getViewIDByViewIndex( pcSliceHeader->getViewId(), uiIdentifier, eListIdx, bAnchor );
//----- get frame -----
RecPicBufUnitList::iterator iter = m_cUsedRecPicBufUnitList.begin();
RecPicBufUnitList::iterator end = m_cUsedRecPicBufUnitList.end ();
for( ; iter != end; iter++ )
{
if ((*iter)->getViewId() == targetViewId &&
(*iter)->getPoc() == pcSliceHeader->getPoc() )
{
pcFrame = (*iter)->getRecFrame();
break;
}
}
if( ! pcFrame )
{
fprintf( stderr, "\nERROR: MISSING Inter-View PICTURE for RPLR\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 -----
RNOK( rcList.setElementAndRemove( uiIndex, uiRemoveIndex, pcFrame ) );
uiIndex++;
bFirstViewRPLR = false;
} // inter-view
} // while
}
return Err::m_nOK;
}
ErrVal
RecPicBuffer::xDumpRefList( RefFrameList& rcList,
ListIdx eListIdx )
{
#if 1 // NO_DEBUG
return Err::m_nOK;
#endif
printf( "List %d =", eListIdx );
for( UInt uiIndex = 1; uiIndex <= rcList.getActive(); uiIndex++ )
{
printf( " %d/%d", rcList[uiIndex]->getViewId(), rcList[uiIndex]->getPOC() );
}
printf( "\n" );
fflush(stdout);
return Err::m_nOK;
}
H264AVC_NAMESPACE_END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -