📄 gopdecoder.cpp
字号:
}
ErrVal
MCTFDecoder::process( SliceHeader*& rpcSliceHeader,
PicBuffer* pcPicBuffer,
PicBufferList& rcPicBufferOutputList,
PicBufferList& rcPicBufferUnusedList,
Bool bReconstructionLayer )
{
ROF ( m_bInitDone );
ROTRS( m_bWaitForIdr && !rpcSliceHeader->isIdrNalUnit(), Err::m_nOK );
m_bWaitForIdr = false;
//TMM_EC {{
if( NULL == m_pcVeryFirstSliceHeader )
{
m_pcVeryFirstSliceHeader = new SliceHeader( rpcSliceHeader->getSPS(), rpcSliceHeader->getPPS() );
}
//TMM_EC }}
//===== decoding =====
if( rpcSliceHeader->getSliceType() == F_SLICE )
{
RNOK( xDecodeFGSRefinement( rpcSliceHeader ) );
}
else
{
RNOK( xDecodeBaseRepresentation( rpcSliceHeader, pcPicBuffer, rcPicBufferOutputList, rcPicBufferUnusedList, bReconstructionLayer ) );
}
//===== clear unused pic buffer ====
if( pcPicBuffer )
{
rcPicBufferUnusedList.push_back( pcPicBuffer );
}
//===== delete slice header (if not stored) =====
delete rpcSliceHeader;
rpcSliceHeader = NULL;
return Err::m_nOK;
}
//JVT-T054{
ErrVal
MCTFDecoder::StoreDecodedPicture( FrameUnit* pcFrameUnit,
PicBuffer*& rpcPicBuffer,
SliceHeader* pcSliceHeader,
PicBufferList& rcOutputList,
PicBufferList& rcUnusedList,
IntFrame * pcBaseRep)
{
m_pcDecodedPictureBuffer->initPicCurrDPBUnit(rpcPicBuffer);
m_pcDecodedPictureBuffer->initCurrDPBUnit(m_pcCurrDPBUnit, pcSliceHeader, rcOutputList, rcUnusedList);
IntFrame* pcFrame = m_pcCurrDPBUnit->getFrame();
pcFrame->copyAll(pcFrameUnit->getFGSIntFrame());
m_pcDecodedPictureBuffer->store(m_pcCurrDPBUnit, rcOutputList, rcUnusedList, pcBaseRep);
return Err::m_nOK;
}
//JVT-T054}
ErrVal
MCTFDecoder::finishProcess( PicBufferList& rcPicBufferOutputList,
PicBufferList& rcPicBufferUnusedList,
Int& riMaxPoc )
{
RNOK( m_pcDecodedPictureBuffer->clear( rcPicBufferOutputList, rcPicBufferUnusedList, riMaxPoc ) );
return Err::m_nOK;
}
ErrVal
MCTFDecoder::getBaseLayerPWTable( SliceHeader::PredWeightTable*& rpcPredWeightTable,
ListIdx eListIdx,
Int iPoc )
{
DPBUnit* pcBaseDPBUnit = m_pcDecodedPictureBuffer->getDPBUnit( iPoc );
ROF( pcBaseDPBUnit );
SliceHeader* pcSliceHeader = pcBaseDPBUnit->getCtrlData().getSliceHeader();
ROF( pcSliceHeader );
rpcPredWeightTable = &pcSliceHeader->getPredWeightTable( eListIdx );
return Err::m_nOK;
}
ErrVal
MCTFDecoder::getBaseLayerData ( IntFrame*& pcFrame,
IntFrame*& pcResidual,
MbDataCtrl*& pcMbDataCtrl,
MbDataCtrl*& pcMbDataCtrlEL, // ICU/ETRI FGS_MOT_USE
Bool& rbConstrainedIPred,
Bool bSpatialScalability,
Int iPoc )
{
pcFrame = 0;
pcResidual = 0;
pcMbDataCtrl = 0;
pcMbDataCtrlEL = 0;
SliceHeader* pcSliceHeader = 0;
DPBUnit* pcBaseDPBUnit = m_pcDecodedPictureBuffer->getDPBUnit( iPoc );
ROF( pcBaseDPBUnit );
pcFrame = m_pcILPrediction;
pcResidual = m_pcResidual;
pcMbDataCtrl = pcBaseDPBUnit->getCtrlData().getMbDataCtrl ();
pcMbDataCtrlEL = m_pcBaseLayerCtrlEL;
pcSliceHeader = pcBaseDPBUnit->getCtrlData().getSliceHeader ();
rbConstrainedIPred = pcBaseDPBUnit->isConstrIPred();
if( bSpatialScalability )
{
RNOK( m_apcFrameTemp[0]->copy( pcFrame ) );
pcFrame = m_apcFrameTemp[0];
if( pcSliceHeader->getPPS().getConstrainedIntraPredFlag() )
{
m_pcLoopFilter->setFilterMode( LoopFilter::LFMode( LoopFilter::LFM_NO_INTER_FILTER + LoopFilter::LFM_EXTEND_INTRA_SUR ) );
RNOK( m_pcLoopFilter->process(*pcSliceHeader,
pcFrame,
pcMbDataCtrl,
pcMbDataCtrl,
m_uiFrameWidthInMb,
NULL,
NULL,
false,
pcBaseDPBUnit->getCtrlData().getSpatialScalability()) ); // SSUN@SHARP
m_pcLoopFilter->setFilterMode();
}
else
{
m_pcLoopFilter->setHighpassFramePointer( pcResidual );
RNOK( m_pcLoopFilter->process(*pcSliceHeader,
pcFrame,
pcMbDataCtrl,
pcMbDataCtrl,
m_uiFrameWidthInMb,
&pcBaseDPBUnit->getCtrlData().getPrdFrameList( LIST_0 ),
&pcBaseDPBUnit->getCtrlData().getPrdFrameList( LIST_1 ),
false,
pcBaseDPBUnit->getCtrlData().getSpatialScalability()) ); // SSUN@SHARP
}
}
return Err::m_nOK;
}
ErrVal
MCTFDecoder::xCreateData( const SequenceParameterSet& rcSPS )
{
UInt uiIndex;
//========== CREATE FRAME MEMORIES ==========
for( uiIndex = 0; uiIndex < NUM_TMP_FRAMES; uiIndex++ )
{
ROFS ( ( m_apcFrameTemp [ uiIndex ] = new IntFrame( *m_pcYuvFullPelBufferCtrl,
*m_pcYuvFullPelBufferCtrl ) ) );
RNOK ( m_apcFrameTemp [ uiIndex ] ->init () );
}
ROFS ( ( m_pcResidual = new IntFrame( *m_pcYuvFullPelBufferCtrl,
*m_pcYuvFullPelBufferCtrl ) ) );
RNOK ( m_pcResidual ->init () );
ROFS ( ( m_pcILPrediction = new IntFrame( *m_pcYuvFullPelBufferCtrl,
*m_pcYuvFullPelBufferCtrl ) ) );
RNOK ( m_pcILPrediction ->init () );
ROFS ( ( m_pcPredSignal = new IntFrame( *m_pcYuvFullPelBufferCtrl,
*m_pcYuvFullPelBufferCtrl ) ) );
RNOK ( m_pcPredSignal ->init () );
ROFS ( ( m_pcBaseLayerFrame = new IntFrame( *m_pcYuvFullPelBufferCtrl,
*m_pcYuvFullPelBufferCtrl ) ) );
RNOK ( m_pcBaseLayerFrame ->init () );
ROFS ( ( m_pcBaseLayerResidual = new IntFrame( *m_pcYuvFullPelBufferCtrl,
*m_pcYuvFullPelBufferCtrl ) ) );
RNOK ( m_pcBaseLayerResidual ->init () );
//========== CREATE MACROBLOCK DATA MEMORIES ==========
ROFS ( ( m_pcBaseLayerCtrl = new MbDataCtrl() ) );
RNOK ( m_pcBaseLayerCtrl ->init ( rcSPS ) );
ROFS ( ( m_pcBaseLayerCtrlEL = new MbDataCtrl() ) );
RNOK ( m_pcBaseLayerCtrlEL ->init ( rcSPS ) );
m_pcH264AVCDecoder->m_pcBaseLayerCtrlEL = new MbDataCtrl();
m_pcH264AVCDecoder->m_pcBaseLayerCtrlEL->init(rcSPS);
//========== CREATE UPDATE WEIGHTS ARRAY and WRITE BUFFER ==========
ROT ( m_cDownConvert .init ( m_uiFrameWidthInMb<<4, m_uiFrameHeightInMb<<4 ) );
return Err::m_nOK;
}
ErrVal
MCTFDecoder::xDeleteData()
{
UInt uiIndex;
//========== DELETE FRAME MEMORIES ==========
for( uiIndex = 0; uiIndex < NUM_TMP_FRAMES; uiIndex++ )
{
if( m_apcFrameTemp[ uiIndex ] )
{
RNOK( m_apcFrameTemp[ uiIndex ]->uninit() );
delete m_apcFrameTemp[ uiIndex ];
m_apcFrameTemp[ uiIndex ] = 0;
}
}
if( m_pcResidual )
{
RNOK( m_pcResidual->uninit() );
delete m_pcResidual;
m_pcResidual = 0;
}
if( m_pcILPrediction )
{
RNOK( m_pcILPrediction->uninit() );
delete m_pcILPrediction;
m_pcILPrediction = 0;
}
if( m_pcPredSignal )
{
RNOK( m_pcPredSignal->uninit() );
delete m_pcPredSignal;
m_pcPredSignal = 0;
}
if( m_pcBaseLayerFrame )
{
RNOK( m_pcBaseLayerFrame->uninit() );
delete m_pcBaseLayerFrame;
m_pcBaseLayerFrame = 0;
}
if( m_pcBaseLayerResidual )
{
RNOK( m_pcBaseLayerResidual->uninit() );
delete m_pcBaseLayerResidual;
m_pcBaseLayerResidual = 0;
}
//========== DELETE MACROBLOCK DATA MEMORIES (and SLICE HEADER) ==========
if( m_pcBaseLayerCtrl )
{
RNOK( m_pcBaseLayerCtrl->uninit() );
delete m_pcBaseLayerCtrl;
m_pcBaseLayerCtrl = 0;
}
// ICU/ETRI FGS_MOT_USE
if( m_pcBaseLayerCtrlEL )
{
RNOK( m_pcBaseLayerCtrlEL->uninit() );
delete m_pcBaseLayerCtrlEL;
m_pcBaseLayerCtrlEL = 0;
}
if (m_pcH264AVCDecoder->m_pcBaseLayerCtrlEL)
{
m_pcH264AVCDecoder->m_pcBaseLayerCtrlEL->uninit();
delete m_pcH264AVCDecoder->m_pcBaseLayerCtrlEL;
m_pcH264AVCDecoder->m_pcBaseLayerCtrlEL = 0;
}
return Err::m_nOK;
}
ErrVal
MCTFDecoder::xZeroIntraMacroblocks( IntFrame* pcFrame,
ControlData& rcCtrlData )
{
MbDataCtrl* pcMbDataCtrl = rcCtrlData.getMbDataCtrl ();
SliceHeader* pcSliceHeader = rcCtrlData.getSliceHeader ();
IntYuvPicBuffer* pcPicBuffer = pcFrame ->getFullPelYuvBuffer ();
RNOK( pcMbDataCtrl->initSlice( *pcSliceHeader, PRE_PROCESS, true, NULL ) );
IntYuvMbBuffer cZeroMbBuffer;
cZeroMbBuffer.setAllSamplesToZero();
for( UInt uiMbIndex = 0; uiMbIndex < m_uiMbNumber; uiMbIndex++ )
{
UInt uiMbY = uiMbIndex / m_uiFrameWidthInMb;
UInt uiMbX = uiMbIndex % m_uiFrameWidthInMb;
MbDataAccess* pcMbDataAccess = 0;
RNOK( pcMbDataCtrl ->initMb( pcMbDataAccess, uiMbY, uiMbX ) );
RNOK( m_pcYuvFullPelBufferCtrl->initMb( uiMbY, uiMbX ) );
if( pcMbDataAccess->getMbData().isIntra() )
{
pcPicBuffer->loadBuffer( &cZeroMbBuffer );
}
}
return Err::m_nOK;
}
ErrVal
MCTFDecoder::xAddBaseLayerResidual( ControlData& rcControlData,
IntFrame* pcFrame )
{
ROFRS( rcControlData.getBaseLayerSbb(), Err::m_nOK );
MbDataCtrl* pcMbDataCtrl = rcControlData.getMbDataCtrl ();
SliceHeader* pcSliceHeader = rcControlData.getSliceHeader ();
IntYuvPicBuffer* pcBLResidual = rcControlData.getBaseLayerSbb ()->getFullPelYuvBuffer();
IntYuvPicBuffer* pcPicBuffer = pcFrame ->getFullPelYuvBuffer ();
IntYuvMbBuffer cBLResBuffer;
IntYuvMbBuffer cMbBuffer;
RNOK( pcMbDataCtrl->initSlice( *pcSliceHeader, PRE_PROCESS, true, NULL ) );
for( UInt uiMbIndex = 0; uiMbIndex < m_uiMbNumber; uiMbIndex++ )
{
UInt uiMbY = uiMbIndex / m_uiFrameWidthInMb;
UInt uiMbX = uiMbIndex % m_uiFrameWidthInMb;
MbDataAccess* pcMbDataAccess = 0;
RNOK( pcMbDataCtrl ->initMb( pcMbDataAccess, uiMbY, uiMbX ) );
RNOK( m_pcYuvFullPelBufferCtrl->initMb( uiMbY, uiMbX ) );
if( ! pcMbDataAccess->getMbData().isIntra() && pcMbDataAccess->getMbData().getResidualPredFlag( PART_16x16 ) )
{
cMbBuffer .loadBuffer ( pcPicBuffer );
cBLResBuffer.loadBuffer ( pcBLResidual );
cMbBuffer .add ( cBLResBuffer );
pcPicBuffer->loadBuffer ( &cMbBuffer );
}
}
return Err::m_nOK;
}
ErrVal
MCTFDecoder::initSlice( SliceHeader* pcSliceHeader, UInt uiLastLayer, Bool bLastNalInAU, Bool bCGSSNRInAU ) //JVT-T054
{
ROFRS( m_bActive, Err::m_nOK );
//===== calculate POC =====
if( pcSliceHeader && pcSliceHeader->getLayerId() == m_uiLayerId )
{
RNOK( m_pcPocCalculator->calculatePoc( *pcSliceHeader ) );
}
//===== check if an FGS enhancement needs to be reconstructed =====
if( m_pcRQFGSDecoder->isInitialized () &&
m_pcRQFGSDecoder->getSliceHeader ()->getLayerId() == m_uiLayerId &&
(!pcSliceHeader ||
pcSliceHeader->getLayerId () != m_pcRQFGSDecoder->getSliceHeader()->getLayerId () ||
pcSliceHeader->getTemporalLevel () != m_pcRQFGSDecoder->getSliceHeader()->getTemporalLevel() ||
pcSliceHeader->getQualityLevel () != m_pcRQFGSDecoder->getSliceHeader()->getQualityLevel () + 1 ||
pcSliceHeader->getPoc () != m_pcRQFGSDecoder->getSliceHeader()->getPoc ()
|| pcSliceHeader->getSliceType() != F_SLICE //JVT-T054
))
{
Bool bHighestLayer = ( uiLastLayer == m_uiLayerId && bLastNalInAU ); //JVT-T054
if (NULL == pcSliceHeader)
{
RNOK( xReconstructLastFGS( bHighestLayer, bCGSSNRInAU ) ); //JVT-T054
}
else if (pcSliceHeader->getQualityLevel () != m_pcRQFGSDecoder->getSliceHeader()->getQualityLevel () + 1)
{
if (pcSliceHeader->getQualityLevel () != m_pcRQFGSDecoder->getSliceHeader()->getQualityLevel ()
|| 0 == pcSliceHeader->getQualityLevel () )
{
RNOK( xReconstructLastFGS( bHighestLayer, bCGSSNRInAU ) ); //JVT-T054
}
}
else
{
RNOK( xReconstructLastFGS( bHighestLayer, bCGSSNRInAU ) ); //JVT-T054
}
}
return Err::m_nOK;
}
//JVT-T054{
ErrVal
MCTFDecoder::setILPrediction(IntFrame * pcFrame)
{
RNOK( m_pcILPrediction->copy( pcFrame ) );
return Err::m_nOK;
}
//JVT-T054}
//JVT-T054{
ErrVal
MCTFDecoder::ReconstructLastFGS( Bool bHighestLayer, Bool bCGSSNRInAU )
{
DPBUnit* pcLastDPBUnit = m_pcDecodedPictureBuffer->getLastUnit();
DPBUnit* pcTemp = m_pcDecodedPictureBuffer->getCurrDPBUnit();
m_pcDecodedPictureBuffer->setCurrDPBUnit(pcLastDPBUnit);
m_pcDecodedPictureBuffer->setPrdRefLists( pcLastDPBUnit );
RNOK(xReconstructLastFGS(bHighestLayer, bCGSSNRInAU) );
m_pcDecodedPictureBuffer->setCurrDPBUnit(pcTemp);
return Err::m_nOK;
}
//JVT-T054}
ErrVal
MCTFDecoder::xMotionCompensation( IntFrame* pcMCFrame,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -