📄 fgscoder.h
字号:
UChar& getChromaACBlockMap( const CIdx &rcCIdx ) { return m_aucChromaACBlockMap[rcCIdx]; }
UChar& getLumaScanPos( const S4x4Idx &rcS4x4Idx ) { return m_aucLumaScanPosMap[rcS4x4Idx.s4x4()]; }
UChar& getChromaDCScanPos( const CPlaneIdx &rcCPlaneIdx ) { return m_aucChromaDCScanPosMap[rcCPlaneIdx]; }
UChar& getChromaACScanPos( const CIdx &rcCIdx ) { return m_aucChromaACScanPosMap[rcCIdx]; }
ErrVal increaseAndCheckNumCoded( UInt ui ) { return ( m_usNumCoded += ui ) > 384 ? Err::m_nERR : Err::m_nOK; }
UShort getNumCoded() const { return m_usNumCoded; }
private:
CoefMap m_aacCoefMap[24][16];
RefCtx m_aacRefCtx[24][16];
UInt m_uiMbMap;
UChar m_aucB8x8Map[4];
UChar m_aucB4x4Map[16];
UChar m_aucChromaDCMbMap[2];
UChar m_aucChromaACBlockMap[8];
UChar m_aucLumaScanPosMap[16]; // s-ordered buffer (to be accessed with m_iSIdx of S4x4Idx )
UChar m_aucChromaDCScanPosMap[2];
UChar m_aucChromaACScanPosMap[8];
UShort m_usNumCoded;
};
class FGSCoder
{
public:
enum
{
RQ_QP_DELTA = 6
};
FGSCoder()
: m_bInit ( false )
, m_bPicInit ( false )
, m_papcYuvFullPelBufferCtrl ( 0 )
, m_pcTransform ( 0 )
, m_uiWidthInMB ( 0 )
, m_uiHeightInMB ( 0 )
, m_pcCurrMbDataCtrl ( 0 )
, m_pcBaseLayerSbb ( 0 )
, m_bUpdateWithoutMap ( false )
, m_pcSliceHeader ( 0 )
{
}
Void getCoeffSigMap ( UInt uiMbX, UInt uiMbY, S4x4Idx cIdx, UChar *pucSigMap, Bool bFrame );
Void getCoeffSigMap ( UInt uiMbX, UInt uiMbY, B8x8Idx c8x8Idx, UChar *pucSigMap, Bool bFrame );
Void getCoeffSigMap ( UInt uiMbX, UInt uiMbY, CIdx cIdx, UChar *pucSigMap, Bool bFrame );
Void getCoeffSigMapChroma8x8( UInt uiMbX, UInt uiMbY, UInt uiPlane, UChar *pucSigMap, Bool bFrame );
ErrVal xStoreBQLayerSigMap();
ErrVal xSwitchBQLayerSigMap();
static Bool isSignificant(UChar ucCoeffState)
{
return ( ( ucCoeffState & SIGNIFICANT ) != 0 );
}
IntFrame* getBaseLayerSbb() { return m_pcBaseLayerSbb; }
MbDataCtrl* getMbDataCtrl() { return m_pcCurrMbDataCtrl; }
MbDataCtrl* getMbDataCtrlEL() { return &m_cMbDataCtrlEL; }
//JVT-T054{
Void setMbDataCtrl(MbDataCtrl* pcMbDataCtrl) { m_pcCurrMbDataCtrl = pcMbDataCtrl;}
Void setBaseLayerSbb(IntFrame* pcBaseLayerSbb) { m_pcBaseLayerSbb = pcBaseLayerSbb; }
//JVT-T054}
enum
{
CLEAR = 0x00,
SIGNIFICANT = 0x01, // was significant in base layer or during the current path
CODED = 0x02, // was coded during the current path
TRANSFORM_SPECIFIED = 0x04, // transform size was specified in base layer or during current path
CHROMA_CBP_CODED = 0x08,
CHROMA_CBP_AC_CODED = 0x10,
BASE_SIGN = 0x20,
NEWSIG = 0x40, // new significant only during the current path
};
ErrVal reconstruct ( IntFrame* pcRecResidual, Bool bDecoder );
SliceHeader* getSliceHeader () { return m_pcSliceHeader; }
protected:
ErrVal xInit ( YuvBufferCtrl** apcYuvFullPelBufferCtrl,
Transform* pcTransform );
ErrVal xInitSPS ( const SequenceParameterSet& rcSPS );
ErrVal xUninit ();
ErrVal xScaleTCoeffs ( MbDataAccess& rcMbDataAccess,
Bool bBaseLayer );
ErrVal xReconstructMacroblock( MbDataAccess& rcMbDataAccess,
IntYuvMbBuffer& rcMbBuffer );
ErrVal xScaleBaseLayerCoeffs ( Bool bDecoder );
// FMO FGS ICU/ETRI
ErrVal xInitializeCodingPath (SliceHeader* pcSliceHeader);
ErrVal xUpdateCodingPath (SliceHeader* pcSliceHeader);
ErrVal xInitializeCodingPath ();
ErrVal xUpdateCodingPath ();
ErrVal xClearCodingPath ();
ErrVal xUpdateMacroblock ( MbDataAccess& rcMbDataAccessBL,
MbDataAccess& rcMbDataAccessEL,
UInt uiMbY,
UInt uiMbX );
ErrVal xClearBaseCoeffs( MbDataAccess& rcMbDataAccess, MbDataAccess* pcMbDataAccessBase );
ErrVal xInitBaseLayerSbb ( UInt uiLayerId );
ErrVal xUpdateMbMaps ( MbDataAccess* pcMbDataAccessBL,
MbDataAccess* pcMbDataAccessEL,
MbFGSCoefMap &rcMbFGSCoefMap,
Int* piRemainingTCoeff = 0 );
Bool m_bInit;
Bool m_bPicInit;
YuvBufferCtrl** m_papcYuvFullPelBufferCtrl;
Transform* m_pcTransform;
MbDataCtrl m_cMbDataCtrlEL;
MbDataCtrl* m_pcCurrMbDataCtrl;
UInt m_uiWidthInMB;
UInt m_uiHeightInMB;
Bool m_bFgsComponentSep;
MbFGSCoefMap* m_pcCoefMap;
MbFGSCoefMap* m_pcBQCoefMap;
UInt m_uiLumaCbpRun;
Bool m_bLastLumaCbpFlag;
UInt m_uiChromaCbpRun;
UInt m_uiLastChromaCbp;
UInt m_uiLumaCbpNextMbX;
UInt m_uiLumaCbpNextMbY;
UInt m_uiLumaCbpNext8x8Idx;
UInt m_uiChromaCbpNextMbX;
UInt m_uiChromaCbpNextMbY;
IntFrame* m_pcBaseLayerSbb;
SliceHeader* m_pcSliceHeader;
UInt xDeriveComponentPosVectors ( UInt* puiRefPosVect,
Int* piMaxPosLuma,
Int* piMaxPosChromaAC,
Int* piMaxPosChromaDC,
UInt uiChromaStartCycle );
Bool m_bUpdateWithoutMap;
ErrVal xSetNumCoefficients ( UInt uiMbX,
UInt uiMbY,
MbFGSCoefMap &rcMbFGSCoefMap,
UInt uiMbCoeffsDecoded );
private:
Void xUpdateCoefMap(TCoeff& cBL, TCoeff cEL, CoefMap& sm)
{
if ((cEL))
{
if( cEL < 0 ) // set sign only when base layer not significant
{
sm |= BASE_SIGN;
}
sm |= SIGNIFICANT;
cBL += cEL;
}
}
Int xScaleLevel4x4 ( Int iLevel,
Int iIndex,
const QpParameter& cQP,
const QpParameter& cBaseQP );
Int xScaleLevel8x8 ( Int iLevel,
Int iIndex,
const QpParameter& cQP,
const QpParameter& cBaseQP );
ErrVal xScaleSymbols4x4 ( TCoeff* piCoeff,
const QpParameter& cQP,
const QpParameter& cBaseQP );
ErrVal xScaleSymbols8x8 ( TCoeff* piCoeff,
const QpParameter& cQP,
const QpParameter& cBaseQP );
ErrVal xScale4x4Block ( TCoeff* piCoeff,
const UChar* pucScale,
UInt uiStart,
const QpParameter& rcQP );
ErrVal xScale8x8Block ( TCoeff* piCoeff,
const UChar* pucScale,
const QpParameter& rcQP );
ErrVal xUpdateSymbols ( TCoeff* piCoeff,
TCoeff* piCoeffEL,
Bool& bSigDC,
Bool& bSigAC,
Int iNumCoeff );
};
H264AVC_NAMESPACE_END
#endif // _FGS_CODER_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -