📄 gopdecoder.h
字号:
ErrVal xDeleteData ();
ErrVal xClearBuffer (); // remove non-ref frames that are not output pictures
ErrVal xUpdateMemory ( SliceHeader* pcSliceHeader );
ErrVal xSlidingWindow ();
ErrVal xMMCO ( SliceHeader* pcSliceHeader );
ErrVal xMarkShortTermUnusedBase( const PicType ePicType,
UInt mCurrFrameNum,
UInt uiDiffOfPicNums );
ErrVal xMarkShortTermUnused ( const PicType ePicType,
const DPBUnit* pcCurrentDPBUnit,
UInt uiDiffOfPicNums );
ErrVal xOutput ( PicBufferList& rcOutputList,
PicBufferList& rcUnusedList );
ErrVal xClearOutputAll ( PicBufferList& rcOutputList,
PicBufferList& rcUnusedList,
Bool bFinal );
ErrVal xStorePicture ( DPBUnit* pcDPBUnit, // just for checking
PicBufferList& rcOutputList,
PicBufferList& rcUnusedList,
Bool bTreatAsIdr,
Bool bFrameMbsOnlyFlag,
Bool bRefinement );
ErrVal xCheckMissingPics ( const SliceHeader* pcSliceHeader,
PicBufferList& rcOutputList,
PicBufferList& rcUnusedList );
ErrVal xInitPrdListPSlice ( RefFrameList& rcList0,
Frame* pcCurrentFrame,
PicType eCurrentPicType,
SliceType eSliceType );
ErrVal xInitPrdListsBSlice ( RefFrameList& rcList0,
RefFrameList& rcList1,
Frame* pcCurrentFrame,
PicType eCurrentPicType,
SliceType eSliceType );
ErrVal xSetInitialRefFieldList ( RefFrameList& rcList,
Frame* pcCurrentFrame,
PicType eCurrentPicType,
SliceType eSliceType );
ErrVal xPrdListRemapping ( RefFrameList& rcList,
ListIdx eListIdx,
SliceHeader* pcSliceHeader );
ErrVal xUpdateDPBUnitList ( DPBUnit *pcDPBUNit );
//===== debugging ======
ErrVal xDumpDPB ();
ErrVal xDumpRefList ( RefFrameList& rcList,
ListIdx eListIdx );
private:
Bool m_bInitDone;
YuvBufferCtrl* m_pcYuvBufferCtrl;
UInt m_uiLayer;
UInt m_uiNumRefFrames;
UInt m_uiMaxFrameNum;
UInt m_uiLastRefFrameNum;
DPBUnitList m_cUsedDPBUnitList;
DPBUnitList m_cFreeDPBUnitList;
DPBUnit* m_pcCurrDPBUnit;
DPBUnit* m_pcLastDPBUnit;
PicBufferList m_cPicBufferList;
};
class H264AVCDECODERLIB_API MbStatus
{
public:
MbStatus();
virtual ~MbStatus();
Void reset ();
Bool canBeUpdated ( const SliceHeader* pcSliceHeader );
ErrVal update ( SliceHeader* pcSliceHeader );
SliceHeader* getSliceHeader () { return m_pcSliceHeader; }
const SliceHeader* getSliceHeader () const { return m_pcSliceHeader; }
UInt getSliceIdc () const { return m_uiSliceIdc; }
UInt getFirstMbInSlice () const { return m_uiSliceIdc >> 7; }
UInt getDQId () const { return m_uiSliceIdc & 0x7F; }
UInt getDependencyId () const { return ( m_uiSliceIdc >> 4 ) & 0x7; }
UInt getQualityId () const { return m_uiSliceIdc & 0xF; }
Bool isCoded () const { return m_bIsCoded; }
private:
UInt m_uiSliceIdc;
Bool m_bIsCoded;
SliceHeader* m_pcSliceHeader;
};
class H264AVCDECODERLIB_API LayerDecoder
{
enum { NUM_TMP_FRAMES = 2 };
protected:
LayerDecoder ();
virtual ~LayerDecoder();
public:
//===== general functions ======
static ErrVal create ( LayerDecoder*& rpcLayerDecoder );
ErrVal destroy ();
ErrVal 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
);
ErrVal uninit ();
//===== main processing functions =====
ErrVal processSliceData ( PicBuffer* pcPicBuffer,
PicBufferList& rcPicBufferOutputList,
PicBufferList& rcPicBufferUnusedList,
BinDataList& rcBinDataList,
SliceDataNALUnit& rcSliceDataNALUnit );
ErrVal finishProcess ( PicBufferList& rcPicBufferOutputList,
PicBufferList& rcPicBufferUnusedList );
//===== returning data =====
ErrVal getBaseLayerData ( SliceHeader& rcELSH,
Frame*& pcFrame,
Frame*& pcResidual,
MbDataCtrl*& pcMbDataCtrl,
ResizeParameters& rcResizeParameters );
ErrVal getBaseSliceHeader ( SliceHeader*& rpcSliceHeader );
UInt getFrameWidth () const { return m_uiFrameWidthInMb*16; }
UInt getFrameHeight () const { return m_uiFrameHeightInMb*16; }
private:
//===== create data arrays =====
ErrVal xCreateData ( const SequenceParameterSet& rcSPS );
ErrVal xDeleteData ();
//===== initialization =====
ErrVal xReadSliceHeader ( SliceHeader*& rpcSliceHeader,
SliceDataNALUnit& rcSliceDataNalUnit );
ErrVal xInitSliceHeader ( SliceHeader& rcSliceHeader,
const SliceDataNALUnit& rcSliceDataNalUnit );
ErrVal xInitSPS ( const SliceHeader& rcSliceHeader );
ErrVal xInitDPBUnit ( SliceHeader& rcSliceHeader,
PicBuffer* pcPicBuffer,
PicBufferList& rcPicBufferOutputList,
PicBufferList& rcPicBufferUnusedList );
//===== slice processing =====
ErrVal xInitSlice ( SliceHeader*& rpcSliceHeader,
PicBuffer* pcPicBuffer,
PicBufferList& rcPicBufferOutputList,
PicBufferList& rcPicBufferUnusedList,
SliceDataNALUnit& rcSliceDataNalUnit );
ErrVal xParseSlice ( SliceHeader& rcSliceHeader );
ErrVal xDecodeSlice ( SliceHeader& rcSliceHeader,
const SliceDataNALUnit& rcSliceDataNalUnit,
Bool bFirstSliceInLayerRepresentation );
ErrVal xFinishLayerRepresentation ( SliceHeader& rcSliceHeader,
PicBufferList& rcPicBufferOutputList,
PicBufferList& rcPicBufferUnusedList,
const SliceDataNALUnit& rcSliceDataNalUnit,
BinDataList& rcBinDataList );
ErrVal xFinishSlice ( SliceHeader& rcSliceHeader,
PicBufferList& rcPicBufferOutputList,
PicBufferList& rcPicBufferUnusedList,
const SliceDataNALUnit& rcSliceDataNalUnit,
BinDataList& rcBinDataList );
//===== picture processing =====
ErrVal xCheckForMissingSlices ( const SliceDataNALUnit& rcSliceDataNalUnit );
ErrVal xSetLoopFilterQPs ( SliceHeader& rcSliceHeader,
MbDataCtrl& rcMbDataCtrl );
#ifdef SHARP_AVC_REWRITE_OUTPUT
ErrVal xRewritePicture ( BinDataList& rcBinDataList,
MbDataCtrl& rcMbDataCtrl );
#endif
//===== base layer processing =====
ErrVal xInitESSandCroppingWindow ( SliceHeader& rcSliceHeader,
MbDataCtrl& rcMbDataCtrl,
ControlData& rcControlData );
ErrVal xInitBaseLayer ( ControlData& rcControlData,
Bool bFirstSliceInLayerRepresentation );
ErrVal xGetBaseLayerData ( ControlData& rcControlData,
Frame*& rpcBaseFrame,
Frame*& rpcBaseResidual,
MbDataCtrl*& rpcBaseDataCtrl,
ResizeParameters& rcResizeParameters );
Void xSetMCResizeParameters ( ResizeParameters& rcResizeParameters );
protected:
//----- references -----
H264AVCDecoder* m_pcH264AVCDecoder;
NalUnitParser* m_pcNalUnitParser;
SliceReader* m_pcSliceReader;
SliceDecoder* m_pcSliceDecoder;
ControlMngIf* m_pcControlMng;
LoopFilter* m_pcLoopFilter;
HeaderSymbolReadIf* m_pcHeaderSymbolReadIf;
ParameterSetMng* m_pcParameterSetMng;
PocCalculator* m_pcPocCalculator;
YuvBufferCtrl* m_pcYuvFullPelBufferCtrl;
DecodedPicBuffer* m_pcDecodedPictureBuffer;
MotionCompensation* m_pcMotionCompensation;
ReconstructionBypass* m_pcReconstructionBypass;
#ifdef SHARP_AVC_REWRITE_OUTPUT
RewriteEncoder* m_pcRewriteEncoder;
#endif
DownConvert m_cDownConvert;
//----- general parameters -----
Bool m_bInitialized;
Bool m_bSPSInitialized;
Bool m_bDependencyRepresentationInitialized;
Bool m_bLayerRepresentationInitialized;
UInt m_uiFrameWidthInMb;
UInt m_uiFrameHeightInMb;
UInt m_uiMbNumber;
UInt m_uiDependencyId;
UInt m_uiQualityId;
//----- macroblock status and slice headers -----
MbStatus* m_pacMbStatus;
MyList<SliceHeader*> m_cSliceHeaderList;
//----- frame memories, control data, and references -----
ResizeParameters m_cResizeParameters;
DPBUnit* m_pcCurrDPBUnit;
MbDataCtrl* m_pcBaseLayerCtrl;
MbDataCtrl* m_pcBaseLayerCtrlField;
Frame* m_pcResidual;
Frame* m_pcILPrediction;
Frame* m_pcBaseLayerFrame;
Frame* m_pcBaseLayerResidual;
Frame* m_apcFrameTemp[NUM_TMP_FRAMES];
};
H264AVC_NAMESPACE_END
#endif // !defined(AFX_GOPDECODER_H__339878FC_BA98_4ABE_8530_E1676196576F__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -