📄 gopdecoder.cpp
字号:
{
ROF( pcDPBUnit );
//---- fill border ----
RNOK( m_pcYuvBufferCtrl->initMb() );
const PicType ePicType = pcDPBUnit->getCtrlData().getSliceHeader()->getPicType();
const Bool bFrameMbsOnlyFlag = pcDPBUnit->getCtrlData().getSliceHeader()->getSPS().getFrameMbsOnlyFlag();
RNOK( pcDPBUnit->getFrame()->extendFrame( NULL, ePicType, bFrameMbsOnlyFlag ) );
return Err::m_nOK;
}
//////////////////////////////////////////////////////////////////////////
// MCTF DECODER
//////////////////////////////////////////////////////////////////////////
MCTFDecoder::MCTFDecoder()
: m_pcH264AVCDecoder ( 0 )
, m_pcSliceReader ( 0 )
, m_pcSliceDecoder ( 0 )
, m_pcNalUnitParser ( 0 )
, m_pcControlMng ( 0 )
, m_pcLoopFilter ( 0 )
, m_pcHeaderSymbolReadIf ( 0 )
, m_pcParameterSetMng ( 0 )
, m_pcPocCalculator ( 0 )
, m_pcYuvFullPelBufferCtrl ( 0 )
, m_pcDecodedPictureBuffer ( 0 )
, m_pcMotionCompensation ( 0 )
, m_pcQuarterPelFilter ( 0 )
, m_bInitDone ( false )
, m_bCreateDone ( false )
, m_bWaitForIdr ( true )
, m_bReconstructAll ( false )
, m_uiFrameWidthInMb ( 0 )
, m_uiFrameHeightInMb ( 0 )
, m_uiMbNumber ( 0 )
, m_pcResidual ( 0 )
, m_pcILPrediction ( 0 )
, m_pcPredSignal ( 0 )
, m_pcBaseLayerResidual ( 0 )
, m_pcBaseLayerFrame ( 0 )
, m_pcBaseLayerCtrl ( 0 )
, m_pcBaseLayerCtrlField ( 0 )
, m_pcCurrDPBUnit ( 0 )
, m_pcBaseLayerCtrlEL ( 0 ) // ICU/ETRI FGS_MOT_USE
, m_uiLayerId ( 0 )
, m_bActive ( false )
, m_uiQualityLevelForPrediction ( 3 )
, m_pcResizeParameter ( 0 ) //TMM_ESS
, m_iMbProcessed (-1) //--ICU/ETRI FMO Implementation
, m_bIsNewPic (true)
, m_bAVCBased ( false ) //JVT-T054
{
::memset( m_apcFrameTemp, 0x00, sizeof( m_apcFrameTemp ) );
//TMM_EC {{
m_pcVeryFirstSliceHeader = NULL;
m_bBaseLayerLost = false;
m_bEnhanceAvailable = false;
//TMM_EC }}
//JVT-T054{
UInt uiFGSLayer;
for(uiFGSLayer = 0; uiFGSLayer < MAX_FGS_LAYERS+1; uiFGSLayer++)
{
m_pcResizeParameterCGSSNR[uiFGSLayer] = 0;
}
//JVT-T054}
}
MCTFDecoder::~MCTFDecoder()
{
}
ErrVal
MCTFDecoder::create( MCTFDecoder*& rpcMCTFDecoder )
{
rpcMCTFDecoder = new MCTFDecoder;
ROT( NULL == rpcMCTFDecoder );
return Err::m_nOK;
}
ErrVal
MCTFDecoder::destroy()
{
ROT( m_bInitDone );
delete this;
return Err::m_nOK;
}
ErrVal
MCTFDecoder::init( H264AVCDecoder* pcH264AVCDecoder,
SliceReader* pcSliceReader,
SliceDecoder* pcSliceDecoder,
RQFGSDecoder* pcRQFGSDecoder,
NalUnitParser* pcNalUnitParser,
ControlMngIf* pcControlMng,
LoopFilter* pcLoopFilter,
HeaderSymbolReadIf* pcHeaderSymbolReadIf,
ParameterSetMng* pcParameterSetMng,
PocCalculator* pcPocCalculator,
YuvBufferCtrl* pcYuvFullPelBufferCtrl,
DecodedPicBuffer* pcDecodedPictureBuffer,
MotionCompensation* pcMotionCompensation,
QuarterPelFilter* pcQuarterPelFilter
//JVT-U106 Behaviour at slice boundaries{
,ReconstructionBypass* pcReconstructionBypass
//JVT-U106 Behaviour at slice boundaries}
)
{
ROT( NULL == pcH264AVCDecoder );
ROT( NULL == pcSliceReader );
ROT( NULL == pcSliceDecoder );
ROT( NULL == pcNalUnitParser );
ROT( NULL == pcControlMng );
ROT( NULL == pcLoopFilter );
ROT( NULL == pcHeaderSymbolReadIf );
ROT( NULL == pcParameterSetMng );
ROT( NULL == pcPocCalculator );
ROT( NULL == pcQuarterPelFilter );
ROT( NULL == pcYuvFullPelBufferCtrl );
ROT( NULL == pcDecodedPictureBuffer );
ROT( NULL == pcMotionCompensation );
ROT( NULL == pcRQFGSDecoder );
//JVT-U106 Behaviour at slice boundaries{
ROT( NULL == pcReconstructionBypass );
//JVT-U106 Behaviour at slice boundaries}
m_pcH264AVCDecoder = pcH264AVCDecoder;
m_pcSliceReader = pcSliceReader;
m_pcSliceDecoder = pcSliceDecoder ;
m_pcNalUnitParser = pcNalUnitParser;
m_pcControlMng = pcControlMng;
m_pcLoopFilter = pcLoopFilter;
m_pcHeaderSymbolReadIf = pcHeaderSymbolReadIf;
m_pcParameterSetMng = pcParameterSetMng;
m_pcPocCalculator = pcPocCalculator;
m_pcYuvFullPelBufferCtrl = pcYuvFullPelBufferCtrl;
m_pcDecodedPictureBuffer = pcDecodedPictureBuffer;
m_pcMotionCompensation = pcMotionCompensation;
m_pcQuarterPelFilter = pcQuarterPelFilter;
m_pcRQFGSDecoder = pcRQFGSDecoder;
//JVT-U106 Behaviour at slice boundaries{
m_pcReconstructionBypass = pcReconstructionBypass;
//JVT-U106 Behaviour at slice boundaries}
m_bInitDone = true;
m_bCreateDone = false;
m_bWaitForIdr = true;
m_bActive = false;
m_uiFrameWidthInMb = 0;
m_uiFrameHeightInMb = 0;
m_uiMbNumber = 0;
m_pcResidual = NULL;
m_pcILPrediction = NULL;
m_pcBaseLayerFrame = NULL;
m_pcBaseLayerResidual = NULL;
m_pcPredSignal = NULL;
m_pcBaseLayerCtrl = NULL;
m_pcBaseLayerCtrlField = NULL;
m_pcCurrDPBUnit = NULL;
m_uiLayerId = 0;
m_iMbProcessed = -1;
m_bIsNewPic = true;
m_bAVCBased = false; //JVT-T054
return Err::m_nOK;
}
ErrVal
MCTFDecoder::uninit()
{
m_pcSliceReader = NULL;
m_pcSliceDecoder = NULL;
m_pcNalUnitParser = NULL;
m_pcControlMng = NULL;
m_pcLoopFilter = NULL;
m_pcHeaderSymbolReadIf = NULL;
m_pcParameterSetMng = NULL;
m_pcPocCalculator = NULL;
m_pcYuvFullPelBufferCtrl = NULL;
m_pcMotionCompensation = NULL;
m_uiFrameWidthInMb = 0;
m_uiFrameHeightInMb = 0;
// {{ TMM_EC
delete m_pcVeryFirstSliceHeader;
m_pcVeryFirstSliceHeader = NULL;
// }}TMM_EC
RNOK( xDeleteData() );
m_bInitDone = false;
return Err::m_nOK;
}
ErrVal
MCTFDecoder::initSlice0( SliceHeader* rcSH )
{
ROTRS( m_bActive, Err::m_nOK );
//===== get and set relevant parameters =====
m_uiLayerId = rcSH->getLayerId();
m_uiFrameWidthInMb = rcSH->getSPS().getFrameWidthInMbs();
m_uiFrameHeightInMb = rcSH->getSPS().getFrameHeightInMbs();
m_uiMbNumber = rcSH->getMbInPic();
//===== re-allocate dynamic memory =====
RNOK( xDeleteData() );
RNOK( xCreateData( rcSH->getSPS() ) );
//===== initialize DPB =====
RNOK( m_pcDecodedPictureBuffer->initSPS( rcSH->getSPS() ) );
//===== initialize some parameters =====
m_bActive = true;
m_bInitDone = true;
return Err::m_nOK;
}
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 }}
m_pcH264AVCDecoder->setRCDO( rpcSliceHeader );
m_pcH264AVCDecoder->set4Tap( rpcSliceHeader ); // V090
//===== 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;
}
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;
}
//TMM_INTERLACE {
ErrVal
MCTFDecoder::getBaseLayerDataAvailability ( IntFrame*& pcFrame,
IntFrame*& pcResidual,
MbDataCtrl*& pcMbDataCtrl,
Bool& bBaseDataAvailable,
Bool bSpatialScalability,
Int iPoc)
{
pcFrame = NULL;
pcResidual = NULL;
pcMbDataCtrl = NULL;
DPBUnit* pcBaseDPBUnit = m_pcDecodedPictureBuffer->getDPBUnit( iPoc );
ROF( pcBaseDPBUnit );
pcFrame = m_pcILPrediction;
pcResidual = m_pcResidual;
pcMbDataCtrl = pcBaseDPBUnit->getCtrlData().getMbDataCtrl ();
bBaseDataAvailable = pcFrame && pcResidual && pcMbDataCtrl;
return Err::m_nOK;
}
//TMM_INTERLACE }
//TMM_EC {{
ErrVal
MCTFDecoder::getBaseLayerUnit(Int iPoc, DPBUnit *&pcBaseDPBUnit)
{
pcBaseDPBUnit = m_pcDecodedPictureBuffer->getDPBUnit( iPoc );
return Err::m_nOK;
}
//TMM_EC }}
ErrVal
MCTFDecoder::getBaseLayerData ( IntFrame*& pcFrame,
IntFrame*& pcResidual,
MbDataCtrl*& pcMbDataCtrl,
MbDataCtrl*& pcMbDataCtrlEL, // ICU/ETRI FGS_MOT_USE
Bool& rbConstrainedIPred,
Bool bSpatialScalability,
Int iPoc )
{
DPBUnit* pcBaseDPBUnit = m_pcDecodedPictureBuffer->getDPBUnit( iPoc );
ROF( pcBaseDPBUnit );
pcMbDataCtrl = pcBaseDPBUnit->getCtrlData().getMbDataCtrl ();
SliceHeader* pcSliceHeader = pcBaseDPBUnit->getCtrlData().getSliceHeader();
const PicType ePicType = pcSliceHeader->getPicType ();
rbConstrainedIPred = pcBaseDPBUnit->isConstrIPred ();
pcFrame = m_pcILPrediction;
pcResidual = m_pcResidual;
pcMbDataCtrlEL = m_pcBaseLayerCtrlEL;// TMM_INTERLACE
if( bSpatialScalability )
{
RNOK( m_apcFrameTemp[0]->copy( pcFrame, ePicType ) );
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++ )
{
RNOK( IntFrame::create( m_apcFrameTemp [ uiIndex ]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -