gopdecoder.cpp
来自「SVC最新更新代码」· C++ 代码 · 共 1,768 行 · 第 1/5 页
CPP
1,768 行
{
if( ( ePicType & TOP_FIELD ) == TOP_FIELD )
{
m_abNeededForReference[0] = false;
m_abLongTerm [0] = false;
}
if( ( ePicType & BOT_FIELD ) == BOT_FIELD )
{
m_abNeededForReference[1] = false;
m_abLongTerm [1] = false;
}
if( !m_abLongTerm[0] && !m_abLongTerm[1] )
{
m_iLongTermFrameIdx = -1;
}
if( bRemoveOutputFlag )
{
ROF( ePicType == FRAME );
m_bWaitForOutput = false;
}
return Err::m_nOK;
}
ErrVal
DPBUnit::markLongTerm( PicType ePicType, Int iLongTermFrameIdx )
{
if( ( ePicType & TOP_FIELD ) == TOP_FIELD )
{
ROF( m_abNeededForReference[0] );
ROT( m_abLongTerm [0] );
m_abLongTerm[0] = true;
}
if( ( ePicType & BOT_FIELD ) == BOT_FIELD )
{
ROF( m_abNeededForReference[1] );
ROT( m_abLongTerm [1] );
m_abLongTerm[1] = true;
}
ROF( m_iLongTermFrameIdx == -1 || m_iLongTermFrameIdx == iLongTermFrameIdx );
m_iLongTermFrameIdx = iLongTermFrameIdx;
return Err::m_nOK;
}
ErrVal
DPBUnit::checkStatus( Int iMaxLongTermFrameIdx )
{
ROF( m_ePicStatus );
ROT( !m_abLongTerm[0] && !m_abLongTerm[1] && m_iLongTermFrameIdx != -1 );
ROT( !m_abNeededForReference[0] && m_abLongTerm[0] );
ROT( !m_abNeededForReference[1] && m_abLongTerm[1] );
ROT( m_abNeededForReference[0] && ( m_ePicStatus & TOP_FIELD ) == 0 );
ROT( m_abNeededForReference[1] && ( m_ePicStatus & BOT_FIELD ) == 0 );
ROT( m_abNeededForReference[0] && m_abNeededForReference[1] && m_abLongTerm[0] != m_abLongTerm[1] );
ROT( m_iLongTermFrameIdx > iMaxLongTermFrameIdx );
return Err::m_nOK;
}
//////////////////////////////////////////////////////////////////////////
// CURRENT DPB UNIT
//////////////////////////////////////////////////////////////////////////
CurrDPBUnit::CurrDPBUnit( YuvBufferCtrl& rcYuvBufferCtrl )
: DPBUnit ( rcYuvBufferCtrl )
, m_bInUse ( false )
, m_bRefBasePicInUse ( false )
, m_bCompleted ( false )
, m_uiQualityId ( 0 )
, m_pcControlData ( 0 )
, m_pcRefBasePicFrame ( 0 )
{
}
CurrDPBUnit::~CurrDPBUnit()
{
}
ErrVal
CurrDPBUnit::create( CurrDPBUnit*& rpcCurrDPBUnit,
YuvBufferCtrl& rcYuvBufferCtrl,
const SequenceParameterSet& rcSPS,
Bool bCreateRefBasePicBuffer,
Bool bBaseLayer )
{
ROF(( rpcCurrDPBUnit = new CurrDPBUnit( rcYuvBufferCtrl ) ));
RNOK( rpcCurrDPBUnit->xCreateData ( rcSPS, bCreateRefBasePicBuffer, bBaseLayer ) );
return Err::m_nOK;
}
ErrVal
CurrDPBUnit::destroy()
{
RNOK( xDeleteData() );
delete this;
return Err::m_nOK;
}
ErrVal
CurrDPBUnit::xCreateData( const SequenceParameterSet& rcSPS,
Bool bCreateRefBasePicBuffer,
Bool bBaseLayer )
{
ROT ( m_pcControlData );
ROT ( m_pcRefBasePicFrame );
//===== create data of base class =====
RNOK( DPBUnit::xCreateData( rcSPS, bBaseLayer ) );
m_pcFrame->setDPBUnit( 0 );
//===== create and init control data =====
{
MbDataCtrl* pcMbDataCtrl = 0;
ROF(( m_pcControlData = new ControlData () ));
ROF(( pcMbDataCtrl = new MbDataCtrl () ));
RNOK( pcMbDataCtrl ->init ( rcSPS ) );
RNOK( m_pcControlData ->setMbDataCtrl ( pcMbDataCtrl ) );
}
//===== create and init reference base picture frame =====
if( bCreateRefBasePicBuffer )
{
ROF(( m_pcRefBasePicFrame = new Frame( m_rcYuvBufferCtrl, m_rcYuvBufferCtrl, FRAME, 0 ) ));
RNOK( m_pcRefBasePicFrame->init() );
}
return Err::m_nOK;
}
ErrVal
CurrDPBUnit::xDeleteData()
{
RNOK( DPBUnit::xDeleteData() );
if( m_pcControlData )
{
if( m_pcControlData->getMbDataCtrl() )
{
RNOK( m_pcControlData->getMbDataCtrl()->uninit() );
delete m_pcControlData->getMbDataCtrl();
m_pcControlData->setMbDataCtrl( 0 );
}
delete m_pcControlData;
m_pcControlData = 0;
}
if( m_pcRefBasePicFrame )
{
RNOK( m_pcRefBasePicFrame->uninit () );
RNOK( m_pcRefBasePicFrame->destroy() );
m_pcRefBasePicFrame = 0;
}
return Err::m_nOK;
}
ErrVal
CurrDPBUnit::init( SliceHeader& rcSliceHeader )
{
ROF( !m_bInUse && !m_bRefBasePicInUse && !m_bCompleted );
ROT( rcSliceHeader.getStoreRefBasePicFlag() && ! rcSliceHeader.getNalRefIdc() );
ROT( rcSliceHeader.getStoreRefBasePicFlag() && ! m_pcRefBasePicFrame );
ROT( rcSliceHeader.getDependencyId() == 0 && ! m_pcMbDataCtrlBaseLayer );
//===== init parameters =====
m_bInUse = true;
m_bRefBasePicInUse = rcSliceHeader.getStoreRefBasePicFlag();
m_bCompleted = false;
m_uiQualityId = rcSliceHeader.getQualityId ();
m_ePicStatus = rcSliceHeader.getPicType ();
m_uiFrameNum = rcSliceHeader.getFrameNum ();
m_iLongTermFrameIdx = -1;
m_bExisting = true;
m_bBaseRepresentation = false;
m_bWaitForOutput = rcSliceHeader.getOutputFlag ();
m_bRefPic = rcSliceHeader.getNalRefIdc () > 0;
Int iFldMin = ( m_ePicStatus == BOT_FIELD ? 1 : 0 );
Int iFldMax = ( m_ePicStatus == TOP_FIELD ? 1 : 2 );
for( Int iF = iFldMin; iF < iFldMax; iF++ )
{
m_aiPoc [iF] = rcSliceHeader.getPoc ( m_ePicStatus );
m_abUseBasePred [iF] = rcSliceHeader.getUseRefBasePicFlag();
m_abNeededForReference[iF] = m_bRefPic;
m_abLongTerm [iF] = false;
}
//===== init frame =====
RNOK( m_pcFrame->addFrameFieldBuffer() );
m_pcFrame->setPoc ( rcSliceHeader );
//===== init reference base picture frame =====
if( m_pcRefBasePicFrame )
{
RNOK( m_pcRefBasePicFrame->addFrameFieldBuffer() );
m_pcRefBasePicFrame->setPoc ( rcSliceHeader );
}
//===== init control data =====
m_pcControlData->clear();
RNOK( m_pcControlData->setSliceHeader ( &rcSliceHeader ) );
RNOK( m_pcControlData->getMbDataCtrl ()->reset () );
RNOK( m_pcControlData->getMbDataCtrl ()->clear () );
return Err::m_nOK;
}
ErrVal
CurrDPBUnit::reinit( SliceHeader& rcSliceHeader, Bool bNewLayerRepresentation )
{
ROF( m_bInUse );
ROF( m_bCompleted == bNewLayerRepresentation );
ROF( m_bRefBasePicInUse == rcSliceHeader.getStoreRefBasePicFlag() );
ROF( m_uiQualityId == rcSliceHeader.getQualityId () - ( bNewLayerRepresentation ? 1 : 0 ) );
ROF( m_ePicStatus == rcSliceHeader.getPicType () );
ROF( m_uiFrameNum == rcSliceHeader.getFrameNum () );
ROF( m_bWaitForOutput == rcSliceHeader.getOutputFlag () );
ROF( m_bRefPic == (rcSliceHeader.getNalRefIdc () > 0) );
Int iFldMin = ( m_ePicStatus == BOT_FIELD ? 1 : 0 );
Int iFldMax = ( m_ePicStatus == TOP_FIELD ? 1 : 2 );
for( Int iF = iFldMin; iF < iFldMax; iF++ )
{
ROF( m_aiPoc [iF] == rcSliceHeader.getPoc ( m_ePicStatus ) );
ROF( m_abUseBasePred [iF] == rcSliceHeader.getUseRefBasePicFlag() );
ROF( m_abNeededForReference [iF] == m_bRefPic );
ROF( m_abLongTerm [iF] == false );
}
if( bNewLayerRepresentation )
{
RNOK( uninit() );
RNOK( init ( rcSliceHeader ) );
}
else
{
RNOK( m_pcControlData->setSliceHeader( &rcSliceHeader ) );
}
return Err::m_nOK;
}
ErrVal
CurrDPBUnit::resetMMCO5( SliceHeader& rcSliceHeader )
{
ROT( m_bBaseRepresentation );
ROF( m_bExisting );
ROF( m_bRefPic );
ROF( m_ePicStatus == rcSliceHeader.getPicType () );
ROF( m_uiFrameNum == rcSliceHeader.getFrameNum() );
m_uiFrameNum = 0;
m_aiPoc[0] = ( m_ePicStatus == BOT_FIELD ? m_aiPoc[0] : rcSliceHeader.getTopFieldPoc() );
m_aiPoc[1] = ( m_ePicStatus == TOP_FIELD ? m_aiPoc[1] : rcSliceHeader.getBotFieldPoc() );
return Err::m_nOK;
}
ErrVal
CurrDPBUnit::setComplete( CurrDPBUnit& rcILPredUnit, Bool bDependencyRepresentationFinished )
{
ROF( m_bInUse && !m_bCompleted );
//===== copy base layer macroblock data =====
if( m_pcMbDataCtrlBaseLayer && !m_uiQualityId )
{
RNOK( m_pcMbDataCtrlBaseLayer->copyMotion( *m_pcControlData->getMbDataCtrl(), m_ePicStatus ) );
}
//===== set complete =====
m_bCompleted = true;
//===== set inter-layer prediction DPB unit =====
if( bDependencyRepresentationFinished )
{
if( rcILPredUnit.isCompleted() )
{
RNOK( rcILPredUnit.uninit() );
}
}
else
{
Frame* pcFrame = m_pcFrame;
MbDataCtrl* pcMbDataCtrl = m_pcControlData->getMbDataCtrl ();
SliceHeader* pcSliceHeader = m_pcControlData->getSliceHeader ();
m_pcFrame = rcILPredUnit.m_pcFrame;
rcILPredUnit.m_pcFrame = pcFrame;
rcILPredUnit.m_bInUse = true;
rcILPredUnit.m_bCompleted = true;
rcILPredUnit.m_uiQualityId = m_uiQualityId;
RNOK( m_pcControlData->setMbDataCtrl( rcILPredUnit.m_pcControlData->getMbDataCtrl() ) );
RNOK( rcILPredUnit.m_pcControlData->setMbDataCtrl ( pcMbDataCtrl ) );
RNOK( rcILPredUnit.m_pcControlData->setSliceHeader( pcSliceHeader ) );
}
return Err::m_nOK;
}
ErrVal
CurrDPBUnit::store( DPBUnit& rcDPBUnit, Bool bRefBasePic )
{
//===== store picture =====
if( rcDPBUnit.m_ePicStatus )
{
RNOK( xStore2ndField( rcDPBUnit, bRefBasePic ) );
}
else
{
RNOK( xStoreFrame ( rcDPBUnit, bRefBasePic ) );
}
//===== fill image border =====
{
SliceHeader* pcSliceHeader = m_pcControlData->getSliceHeader();
ROF ( pcSliceHeader );
RNOK( rcDPBUnit.m_rcYuvBufferCtrl.initMb() );
RNOK( rcDPBUnit.m_pcFrame->extendFrame( 0, rcDPBUnit.m_ePicStatus, pcSliceHeader->getSPS().getFrameMbsOnlyFlag() ) );
}
return Err::m_nOK;
}
ErrVal
CurrDPBUnit::xStoreFrame( DPBUnit& rcDPBUnit, Bool bRefBasePic )
{
ROF( m_bInUse && m_bCompleted );
//===== safety checks =====
ROF( m_ePicStatus > 0 && m_ePicStatus <= FRAME );
ROF( m_iLongTermFrameIdx >= 0 || ( m_ePicStatus == FRAME ? ( !m_abLongTerm[0] && !m_abLongTerm[1] ) : !m_abLongTerm[m_ePicStatus-1] ) );
//===== set parameters =====
rcDPBUnit.m_ePicStatus = m_ePicStatus;
rcDPBUnit.m_uiFrameNum = m_uiFrameNum;
rcDPBUnit.m_iLongTermFrameIdx = m_iLongTermFrameIdx;
rcDPBUnit.m_bExisting = true;
rcDPBUnit.m_bBaseRepresentation = bRefBasePic;
rcDPBUnit.m_bWaitForOutput = ( bRefBasePic ? false : m_bWaitForOutput );
rcDPBUnit.m_bRefPic = m_bRefPic;
Int iMinFld = ( m_ePicStatus == BOT_FIELD ? 1 : 0 );
Int iMaxFld = ( m_ePicStatus == TOP_FIELD ? 1 : 2 );
for( Int iFld = iMinFld; iFld < iMaxFld; iFld++ )
{
rcDPBUnit.m_aiPoc [iFld] = m_aiPoc [iFld];
rcDPBUnit.m_abUseBasePred [iFld] = m_abUseBasePred [iFld];
rcDPBUnit.m_abNeededForReference[iFld] = m_abNeededForReference[iFld];
rcDPBUnit.m_abLongTerm [iFld] = m_abLongTerm [iFld];
}
//===== switch frame =====
{
Frame* pcTmpFrame = rcDPBUnit.m_pcFrame;
Frame*& rpcFrame = ( bRefBasePic ? m_pcRefBasePicFrame : m_pcFrame );
ROF( rpcFrame && pcTmpFrame );
rcDPBUnit.m_pcFrame = rpcFrame;
rpcFrame = pcTmpFrame;
}
//===== switch base layer macroblock data control =====
if( rcDPBUnit.m_pcMbDataCtrlBaseLayer )
{
ROF( m_pcMbDataCtrlBaseLayer );
MbDataCtrl* pcTmpMbDataCtrl = rcDPBUnit.m_pcMbDataCtrlBaseLayer;
rcDPBUnit.m_pcMbDataCtrlBaseLayer = m_pcMbDataCtrlBaseLayer;
m_pcMbDataCtrlBaseLayer = pcTmpMbDataCtrl;
}
return Err::m_nOK;
}
ErrVal
CurrDPBUnit::xStore2ndField( DPBUnit& rcDPBUnit, Bool bRefBasePic )
{
ROF( m_bInUse && m_bCompleted );
//===== safety checks =====
ROF( rcDPBUnit.m_bExisting );
ROF( rcDPBUnit.m_ePicStatus == TOP_FIELD || rcDPBUnit.m_ePicStatus == BOT_FIELD );
ROF( rcDPBUnit.m_ePicStatus + m_ePicStatus == FRAME );
ROF( rcDPBUnit.m_uiFrameNum == m_uiFrameNum );
ROF( rcDPBUnit.m_iLongTermFrameIdx == m_iLongTermFrameIdx || rcDPBUnit.m_abLongTerm[rcDPBUnit.m_ePicStatus-1] != m_abLongTerm[m_ePicStatus-1] );
ROF( rcDPBUnit.m_bExisting == m_bExisting );
ROF( rcDPBUnit.m_bBaseRepresentation == bRefBasePic );
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?