📄 gopdecoder.cpp
字号:
m_bIsCoded = false;
m_pcSliceHeader = 0;
}
Bool
MbStatus::canBeUpdated( const SliceHeader* pcSliceHeader )
{
ROTRS( pcSliceHeader->getQualityId() == 0 && m_uiSliceIdc == MSYS_UINT_MAX, true );
ROTRS( pcSliceHeader->getQualityId() != 0 && pcSliceHeader->getRefLayerDQId() == getDQId() &&
( m_bIsCoded || !pcSliceHeader->isTrueSlice() ), true );
return false;
}
ErrVal
MbStatus::update( SliceHeader* pcSliceHeader )
{
ROF( canBeUpdated( pcSliceHeader ) );
m_uiSliceIdc = pcSliceHeader->getFirstMbInSlice() << 7;
m_uiSliceIdc += pcSliceHeader->getDependencyId () << 4;
m_uiSliceIdc += pcSliceHeader->getQualityId ();
m_bIsCoded = pcSliceHeader->isTrueSlice ();
m_pcSliceHeader = pcSliceHeader;
return Err::m_nOK;
}
LayerDecoder::LayerDecoder()
: m_pcH264AVCDecoder ( 0 )
, m_pcNalUnitParser ( 0 )
, m_pcSliceReader ( 0 )
, m_pcSliceDecoder ( 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_pcReconstructionBypass ( 0 )
#ifdef SHARP_AVC_REWRITE_OUTPUT
, m_pcRewriteEncoder ( 0 )
#endif
, m_bInitialized ( false )
, m_bSPSInitialized ( false )
, m_bDependencyRepresentationInitialized( false )
, m_bLayerRepresentationInitialized ( false )
, m_uiFrameWidthInMb ( 0 )
, m_uiFrameHeightInMb ( 0 )
, m_uiMbNumber ( 0 )
, m_uiDependencyId ( 0 )
, m_uiQualityId ( 0 )
, m_pacMbStatus ( 0 )
, m_pcCurrDPBUnit ( 0 )
, m_pcBaseLayerCtrl ( 0 )
, m_pcBaseLayerCtrlField ( 0 )
, m_pcResidual ( 0 )
, m_pcILPrediction ( 0 )
, m_pcBaseLayerFrame ( 0 )
, m_pcBaseLayerResidual ( 0 )
{
::memset( m_apcFrameTemp, 0x00, sizeof( m_apcFrameTemp ) );
}
LayerDecoder::~LayerDecoder()
{
while( m_cSliceHeaderList.size() )
{
SliceHeader* pcSliceHeader = m_cSliceHeaderList.popFront();
delete pcSliceHeader;
}
}
ErrVal
LayerDecoder::create( LayerDecoder*& rpcLayerDecoder )
{
rpcLayerDecoder = new LayerDecoder;
ROT( NULL == rpcLayerDecoder );
return Err::m_nOK;
}
ErrVal
LayerDecoder::destroy()
{
ROT( m_bInitialized );
delete this;
return Err::m_nOK;
}
ErrVal
LayerDecoder::init( UInt uiDependencyId,
H264AVCDecoder* pcH264AVCDecoder,
NalUnitParser* pcNalUnitParser,
SliceReader* pcSliceReader,
SliceDecoder* pcSliceDecoder,
ControlMngIf* pcControlMng,
LoopFilter* pcLoopFilter,
HeaderSymbolReadIf* pcHeaderSymbolReadIf,
ParameterSetMng* pcParameterSetMng,
PocCalculator* pcPocCalculator,
YuvBufferCtrl* pcYuvFullPelBufferCtrl,
DecodedPicBuffer* pcDecodedPictureBuffer,
MotionCompensation* pcMotionCompensation,
ReconstructionBypass* pcReconstructionBypass
#ifdef SHARP_AVC_REWRITE_OUTPUT
,RewriteEncoder* pcRewriteEncoder
#endif
)
{
ROT( m_bInitialized );
ROF( pcH264AVCDecoder );
ROF( pcNalUnitParser );
ROF( pcSliceReader );
ROF( pcSliceDecoder );
ROF( pcControlMng );
ROF( pcLoopFilter );
ROF( pcHeaderSymbolReadIf );
ROF( pcParameterSetMng );
ROF( pcPocCalculator );
ROF( pcYuvFullPelBufferCtrl );
ROF( pcDecodedPictureBuffer );
ROF( pcMotionCompensation );
ROF( pcReconstructionBypass );
#ifdef SHARP_AVC_REWRITE_OUTPUT
ROF( pcRewriteEncoder );
#endif
m_pcH264AVCDecoder = pcH264AVCDecoder;
m_pcNalUnitParser = pcNalUnitParser;
m_pcSliceReader = pcSliceReader;
m_pcSliceDecoder = pcSliceDecoder ;
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_pcReconstructionBypass = pcReconstructionBypass;
#ifdef SHARP_AVC_REWRITE_OUTPUT
m_pcRewriteEncoder = pcRewriteEncoder;
#endif
m_bInitialized = true;
m_bSPSInitialized = false;
m_bDependencyRepresentationInitialized = false;
m_bLayerRepresentationInitialized = false;
m_uiFrameWidthInMb = 0;
m_uiFrameHeightInMb = 0;
m_uiMbNumber = 0;
m_uiDependencyId = uiDependencyId;
m_uiQualityId = 0;
m_pacMbStatus = 0;
m_pcCurrDPBUnit = 0;
m_pcBaseLayerCtrl = 0;
m_pcBaseLayerCtrlField = 0;
m_pcResidual = 0;
m_pcILPrediction = 0;
m_pcBaseLayerFrame = 0;
m_pcBaseLayerResidual = 0;
return Err::m_nOK;
}
ErrVal
LayerDecoder::uninit()
{
ROF ( m_bInitialized );
RNOK( xDeleteData() );
m_bInitialized = false;
return Err::m_nOK;
}
ErrVal
LayerDecoder::processSliceData( PicBuffer* pcPicBuffer,
PicBufferList& rcPicBufferOutputList,
PicBufferList& rcPicBufferUnusedList,
BinDataList& rcBinDataList,
SliceDataNALUnit& rcSliceDataNALUnit )
{
ROF( m_bInitialized );
ROF( pcPicBuffer );
//===== process slice =====
SliceHeader* pcSliceHeader = 0;
Bool bFirstSliceInLayerRepresentation = ! m_bLayerRepresentationInitialized;
RNOK( xInitSlice ( pcSliceHeader, pcPicBuffer, rcPicBufferOutputList, rcPicBufferUnusedList, rcSliceDataNALUnit ) );
//===== parse, decode, and finish slice =====
RNOK( xParseSlice ( *pcSliceHeader ) );
RNOK( xDecodeSlice( *pcSliceHeader, rcSliceDataNALUnit, bFirstSliceInLayerRepresentation ) );
RNOK( xFinishSlice( *pcSliceHeader, rcPicBufferOutputList, rcPicBufferUnusedList, rcSliceDataNALUnit, rcBinDataList ) );
return Err::m_nOK;
}
ErrVal
LayerDecoder::finishProcess( PicBufferList& rcPicBufferOutputList,
PicBufferList& rcPicBufferUnusedList )
{
ROF( m_bInitialized );
RNOK ( m_pcDecodedPictureBuffer->clear( rcPicBufferOutputList, rcPicBufferUnusedList ) );
while( m_cSliceHeaderList.size() )
{
SliceHeader* pcSliceHeader = m_cSliceHeaderList.popFront();
delete pcSliceHeader;
}
return Err::m_nOK;
}
ErrVal
LayerDecoder::xInitSlice( SliceHeader*& rpcSliceHeader,
PicBuffer* pcPicBuffer,
PicBufferList& rcPicBufferOutputList,
PicBufferList& rcPicBufferUnusedList,
SliceDataNALUnit& rcSliceDataNalUnit )
{
//===== delete non-required slice headers =====
if( ! m_bDependencyRepresentationInitialized )
{
while( m_cSliceHeaderList.size() )
{
SliceHeader* pcSliceHeader = m_cSliceHeaderList.popFront();
delete pcSliceHeader;
}
}
//===== create, read, init, and store slice header (and init SPS when required) =====
RNOK( xReadSliceHeader ( rpcSliceHeader, rcSliceDataNalUnit ) );
RNOK( xInitSliceHeader ( *rpcSliceHeader, rcSliceDataNalUnit ) );
RNOK( xInitSPS ( *rpcSliceHeader ) );
m_cSliceHeaderList.push_back ( rpcSliceHeader );
//===== init DPB unit (when required) =====
RNOK( xInitDPBUnit ( *rpcSliceHeader, pcPicBuffer, rcPicBufferOutputList, rcPicBufferUnusedList ) );
//===== init resize parameters ===== ---> write new function xInitResizeParameters, which is somewhat nicer
RNOK( xInitESSandCroppingWindow ( *rpcSliceHeader, *m_pcCurrDPBUnit->getCtrlData().getMbDataCtrl(), m_pcCurrDPBUnit->getCtrlData() ) );
//===== update parameters =====
m_bLayerRepresentationInitialized = true;
m_bDependencyRepresentationInitialized = true;
return Err::m_nOK;
}
ErrVal
LayerDecoder::xParseSlice( SliceHeader& rcSliceHeader )
{
ROF( m_pcCurrDPBUnit );
ControlData& rcControlData = m_pcCurrDPBUnit->getCtrlData();
MbDataCtrl* pcMbDataCtrl = rcControlData.getMbDataCtrl();
UInt uiMbRead = 0;
RNOK( m_pcControlMng ->initSliceForReading ( rcSliceHeader ) );
RNOK( m_pcSliceReader ->read ( rcSliceHeader,
pcMbDataCtrl,
m_pacMbStatus,
m_uiFrameWidthInMb,
uiMbRead ) );
return Err::m_nOK;
}
ErrVal
LayerDecoder::xDecodeSlice( SliceHeader& rcSliceHeader,
const SliceDataNALUnit& rcSliceDataNalUnit,
Bool bFirstSliceInLayerRepresentation )
{
ROF( m_pcCurrDPBUnit );
Bool bReconstructBaseRep = rcSliceHeader.getStoreRefBasePicFlag() && ! rcSliceHeader.getQualityId();
Bool bReconstructAll = rcSliceDataNalUnit.isDQIdMax();
Bool bReconstructMCMbs = bReconstructAll || ( rcSliceDataNalUnit.isDependencyIdMax() && bReconstructBaseRep );
PicType ePicType = rcSliceHeader.getPicType();
ControlData& rcControlData = m_pcCurrDPBUnit->getCtrlData();
Frame* pcFrame = m_pcCurrDPBUnit->getFrame ();
Frame* pcBaseRepFrame = m_apcFrameTemp[0];
Frame* pcRecFrame = ( bReconstructBaseRep ? pcBaseRepFrame : pcFrame );
MbDataCtrl* pcMbDataCtrl = rcControlData.getMbDataCtrl ();
//===== get reference frame lists =====
RNOK( m_pcDecodedPictureBuffer->setPrdRefLists( m_pcCurrDPBUnit ) );
RefFrameList& rcRefFrameList0 = rcControlData.getPrdFrameList( LIST_0 );
RefFrameList& rcRefFrameList1 = rcControlData.getPrdFrameList( LIST_1 );
MbDataCtrl* pcMbDataCtrl0L1 = rcControlData.getMbDataCtrl0L1();
rcSliceHeader.setRefFrameList( &rcRefFrameList0, ePicType, LIST_0 );
rcSliceHeader.setRefFrameList( &rcRefFrameList1, ePicType, LIST_1 );
//===== init base layer =====
RNOK( xInitBaseLayer( rcControlData, bFirstSliceInLayerRepresentation ) );
//----- decoding -----
RNOK( m_pcControlMng->initSliceForDecoding( rcSliceHeader ) );
if( rcSliceHeader.isMbaffFrame() )
{
RNOK( m_pcSliceDecoder->decodeMbAff( rcSliceHeader,
pcMbDataCtrl,
rcControlData.getBaseLayerCtrl(),
rcControlData.getBaseLayerCtrlField(),
pcRecFrame,
m_pcResidual,
rcControlData.getBaseLayerRec(),
rcControlData.getBaseLayerSbb(),
&rcRefFrameList0,
&rcRefFrameList1,
pcMbDataCtrl0L1,
bReconstructMCMbs ) );
}
else
{
RNOK( m_pcSliceDecoder->decode ( rcSliceHeader,
pcMbDataCtrl,
rcControlData.getBaseLayerCtrl(),
pcRecFrame,
m_pcResidual,
rcControlData.getBaseLayerRec(),
rcControlData.getBaseLayerSbb(),
&rcRefFrameList0,
&rcRefFrameList1,
pcMbDataCtrl0L1,
bReconstructMCMbs ) );
}
printf(" %s %4d ( LId%2d, TL%2d, QL%2d, %s-%c, BId%2d, AP%2d, QP%3d )\n",
ePicType == FRAME ? "Frame" : ePicType == TOP_FIELD ? "TopFd" : "BotFd",
rcSliceHeader.getPoc (),
rcSliceHeader.getDependencyId (),
rcSliceHeader.getTemporalId (),
rcSliceHeader.getQualityId (),
rcSliceHeader.isH264AVCCompatible () ? "AVC" : "SVC",
rcSliceHeader.getSliceType () == I_SLICE ? 'I' :
rcSliceHeader.getSliceType () == P_SLICE ? 'P' : 'B',
rcSliceHeader.getRefLayerDQId (),
rcSliceHeader.getAdaptiveBaseModeFlag () ? 1 : 0,
rcSliceHeader.getSliceQp () );
return Err::m_nOK;
}
ErrVal
LayerDecoder::xFinishLayerRepresentation( SliceHeader& rcSliceHeader,
PicBufferList& rcPicBufferOutputList,
PicBufferList& rcPicBufferUnusedList,
const SliceDataNALUnit& rcSliceDataNalUnit,
BinDataList& rcBinDataList )
{
ROF( m_pcCurrDPBUnit );
Bool bReconstructBaseRep = rcSliceHeader.getStoreRefBasePicFlag() && ! rcSliceHeader.getQualityId();
Bool bReconstructAll = rcSliceDataNalUnit.isDQIdMax();
ControlData& rcControlData = m_pcCurrDPBUnit->getCtrlData();
Frame* pcBaseRepFrame = m_apcFrameTemp[0];
MbDataCtrl* pcMbDataCtrl = rcControlData.getMbDataCtrl ();
#ifdef SHARP_AVC_REWRITE_OUTPUT
#else
Frame* pcFrame = m_pcCurrDPBUnit->getFrame ();
PicType ePicType = rcSliceHeader.getPicType();
#endif
//===== check for missing slices =====
RNOK( xCheckForMissingSlices( rcSliceDataNalUnit ) );
//===== determine loop filter QPs =====
RNOK( xSetLoopFilterQPs( rcSliceHeader, *pcMbDataCtrl ) );
#ifdef SHARP_AVC_REWRITE_OUTPUT
//===== rewrite picture =====
if( rcSliceDataNalUnit.isHighestRewriteLayer() )
{
RNOK( xRewritePicture( rcBinDataList, *pcMbDataCtrl ) );
}
#else
//===== loop filter =====
if( bReconstructBaseRep )
{
//----- copy non-filtered frame -----
RNOK( pcFrame->copy( pcBaseRepFrame, ePicType ) );
//----- loop-filtering and store in DPB as base representation -----
RNOK( m_pcLoopFilter->process( rcSliceHeader,
pcBaseRepFrame,
m_pcResidual,
pcMbDataCtrl,
0, rcControlData.getSpatialScalability() ) );
}
RNOK( m_pcILPrediction->copy( pcFrame,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -