📄 fgscoder.cpp
字号:
}
ErrVal
FGSCoder::reconstruct( IntFrame* pcRecResidual, Bool bDecoder )
{
ROF( m_bInit );
ROF( m_bPicInit );
ROF( pcRecResidual );
UInt uiLayer = m_pcSliceHeader->getLayerId();
YuvBufferCtrl* pcYuvBufferCtrl = m_papcYuvFullPelBufferCtrl[ uiLayer ];
IntYuvMbBuffer cMbBuffer;
RNOK( m_pcCurrMbDataCtrl->initSlice ( *m_pcSliceHeader, PRE_PROCESS, bDecoder, NULL ) );
const PicType ePicType = m_pcSliceHeader->getPicType();
const Bool bMbAff = m_pcSliceHeader->isMbAff ();
if( ePicType!=FRAME )
{
RNOK( pcRecResidual->addFieldBuffer ( ePicType ) );
RNOK( m_pcBaseLayerSbb->addFieldBuffer( ePicType ) );//TMM_INTERLACE
}
else if( bMbAff )
{
RNOK( pcRecResidual->addFrameFieldBuffer() );
RNOK( m_pcBaseLayerSbb->addFrameFieldBuffer() );//TMM_INTERLACE
}
//===== loop over macroblocks =====
for( UInt uiMbY = 0; uiMbY < m_uiHeightInMB; uiMbY++ )
for( UInt uiMbX = 0; uiMbX < m_uiWidthInMB; uiMbX++ )
{
MbDataAccess* pcMbDataAccessBL = NULL;
RNOK( m_pcCurrMbDataCtrl->initMb( pcMbDataAccessBL, uiMbY, uiMbX ) );
RNOK( pcYuvBufferCtrl ->initMb( uiMbY, uiMbX, bMbAff ) );
RNOK( xReconstructMacroblock ( *pcMbDataAccessBL, cMbBuffer ) );
const PicType eMbPicType = pcMbDataAccessBL->getMbPicType();
RNOK( pcRecResidual->getPic( eMbPicType )->getFullPelYuvBuffer()->loadBuffer( &cMbBuffer ) );
}
if( ePicType!=FRAME )
{
RNOK( pcRecResidual->removeFieldBuffer ( ePicType ) );
}
else if( bMbAff )
{
RNOK( pcRecResidual->removeFrameFieldBuffer() );
}
return Err::m_nOK;
}
ErrVal
FGSCoder::xScaleBaseLayerCoeffs( Bool bDecoder )
{
//===== loop over macroblocks =====
for( UInt uiMbY = 0; uiMbY < m_uiHeightInMB; uiMbY++ )
for( UInt uiMbX = 0; uiMbX < m_uiWidthInMB; uiMbX++ )
{
MbDataAccess* pcMbDataAccessBL = NULL;
RNOK( m_pcCurrMbDataCtrl->initMb ( pcMbDataAccessBL, uiMbY, uiMbX ) );
RNOK( xScaleTCoeffs ( *pcMbDataAccessBL, true ) );
}
return Err::m_nOK;
}
ErrVal
FGSCoder::xClearBaseCoeffs( MbDataAccess& rcMbDataAccess,
MbDataAccess* pcMbDataAccessBase )
{
UInt uiMbY = pcMbDataAccessBase->getMbY();
UInt uiMbX = pcMbDataAccessBase->getMbX();
UInt uiMbIndex = uiMbY * m_uiWidthInMB + uiMbX;
MbFGSCoefMap &rcMbFGSCoefMap = m_pcCoefMap[uiMbIndex];
rcMbFGSCoefMap.resetNumCoded();
rcMbFGSCoefMap.resetMbRefCtx();
rcMbFGSCoefMap.resetMbCoefMap();
rcMbFGSCoefMap.getMbMap() = rcMbDataAccess.getSH().getPPS().getTransform8x8ModeFlag() && rcMbDataAccess.getMbData().is8x8TrafoFlagPresent(rcMbDataAccess.getSH().getSPS().getDirect8x8InferenceFlag()) ? CLEAR : TRANSFORM_SPECIFIED;
//--- LUMA ---
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
{
rcMbFGSCoefMap.getB8x8Map( c8x8Idx ) = CLEAR;
for( S4x4Idx cIdx( c8x8Idx ); cIdx.isLegal( c8x8Idx ); cIdx++ )
{
UInt uiScanIndex;
CoefMap *pcCoefMap = rcMbFGSCoefMap.getCoefMap( cIdx );
UChar &rucScanPos = rcMbFGSCoefMap.getLumaScanPos( cIdx );
rucScanPos = 16;
for( uiScanIndex = 0; uiScanIndex < 16; uiScanIndex++ )
if( !( pcCoefMap[uiScanIndex] & (SIGNIFICANT|CODED) ) && rucScanPos == 16 )
rucScanPos = uiScanIndex;
//===== set block mode =====
rcMbFGSCoefMap.getB4x4Map( cIdx ) = CLEAR;
}
}
//--- CHROMA DC ---
for( CPlaneIdx cCPlaneIdx; cCPlaneIdx.isLegal(); ++cCPlaneIdx )
{
UChar &rucScanPos = rcMbFGSCoefMap.getChromaDCScanPos( cCPlaneIdx );
rucScanPos = 4;
for( CIdx cCIdx( cCPlaneIdx ); cCIdx.isLegal( cCPlaneIdx ); cCIdx++ )
{
rcMbFGSCoefMap.getCoefMap( cCIdx )[0] = CLEAR;
if( !( rcMbFGSCoefMap.getCoefMap( cCIdx )[0] & (SIGNIFICANT|CODED) ) && rucScanPos == 4 )
rucScanPos = cCIdx&3;
}
rcMbFGSCoefMap.getChromaDCMbMap( cCPlaneIdx ) = CLEAR;
}
//--- CHROMA AC ---
for( CIdx cCIdx; cCIdx.isLegal(); cCIdx++ )
{
UInt ui;
CoefMap *pcCoefMap = rcMbFGSCoefMap.getCoefMap( cCIdx );
UChar &rucScanPos = rcMbFGSCoefMap.getChromaACScanPos( cCIdx );
rucScanPos = 16;
for( ui = 1; ui < 16; ui++ )
{
pcCoefMap[ui] = CLEAR;
if( !( pcCoefMap[ui] & (SIGNIFICANT|CODED) ) && rucScanPos == 16 )
rucScanPos = ui;
}
rcMbFGSCoefMap.getChromaACBlockMap( cCIdx ) = CLEAR;
}
//pcMbDataAccessBase->getMbData().setMbCbp( 0 );
pcMbDataAccessBase->getMbTCoeffs().clear();
pcMbDataAccessBase->getMbData().setTransformSize8x8( false );
IntYuvMbBuffer cZeroBuffer;
cZeroBuffer.setAllSamplesToZero();
RNOK( m_pcBaseLayerSbb->getFullPelYuvBuffer()->loadBuffer( &cZeroBuffer ) );
return Err::m_nOK;
}
ErrVal
FGSCoder::xUpdateMbMaps ( MbDataAccess* pcMbDataAccessBL,
MbDataAccess* pcMbDataAccessEL,
MbFGSCoefMap &rcMbFGSCoefMap,
Int* piRemainingTCoeff )
{
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx ++ ) {
Bool bSigCBP = ( pcMbDataAccessEL->getMbData().getMbCbp() >> c8x8Idx.b8x8Index() ) & 1;
rcMbFGSCoefMap.getB8x8Map( c8x8Idx ) |= CODED;
if( bSigCBP )
rcMbFGSCoefMap.getB8x8Map( c8x8Idx ) |= SIGNIFICANT;
if( !bSigCBP ) {
//===== set coefficient and block map =====
for( S4x4Idx cIdx(c8x8Idx); cIdx.isLegal(c8x8Idx); cIdx++ ) {
CoefMap *pcCoefMap = rcMbFGSCoefMap.getCoefMap(cIdx);
rcMbFGSCoefMap.getB4x4Map( cIdx ) |= CODED;
rcMbFGSCoefMap.getLumaScanPos( cIdx ) =
(pcMbDataAccessEL->getMbData().isTransformSize8x8() && pcMbDataAccessEL->getSH().getPPS().getEntropyCodingModeFlag()) ? 64:16 ;
for( UInt ui = 0; ui < 16; ui++ ) {
if( ! ( pcCoefMap[ui] & SIGNIFICANT ) ) {
pcCoefMap[ui] |= CODED;
if( piRemainingTCoeff )
*piRemainingTCoeff -= 1;
rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 );
}
}
}
}
else {
if( pcMbDataAccessBL->getMbData().isTransformSize8x8() && pcMbDataAccessBL->getSH().getPPS().getEntropyCodingModeFlag() )
{
}
else if( pcMbDataAccessBL->getMbData().isTransformSize8x8() )
{
CoefMap *pcCoefMap = rcMbFGSCoefMap.getCoefMap(c8x8Idx);
for( S4x4Idx cIdx(c8x8Idx); cIdx.isLegal(c8x8Idx); cIdx++ ) {
UInt uiOffset = (cIdx.x() % 2) + (cIdx.y() %2) * 2;
rcMbFGSCoefMap.getB4x4Map( cIdx ) |= CODED;
// BCBP for the enhancement layer is set in pcMbDataAccessEL
if( pcMbDataAccessEL->getMbData().getBCBP( cIdx.b4x4() ) )
rcMbFGSCoefMap.getB4x4Map( cIdx ) |= SIGNIFICANT;
else {
rcMbFGSCoefMap.getLumaScanPos( cIdx ) = 16;
for( UInt ui = 0; ui < 16; ui++ ) {
if( ! ( pcCoefMap[ui*4 + uiOffset] & SIGNIFICANT ) ) {
pcCoefMap[ui*4 + uiOffset] |= CODED;
if( piRemainingTCoeff )
*piRemainingTCoeff -= 1;
rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 );
}
}
}
}
}
else
{
for( S4x4Idx cIdx(c8x8Idx); cIdx.isLegal(c8x8Idx); cIdx++ ) {
CoefMap *pcCoefMap = rcMbFGSCoefMap.getCoefMap(cIdx);
rcMbFGSCoefMap.getB4x4Map( cIdx ) |= CODED;
// BCBP for the enhancement layer is set in pcMbDataAccessEL
if( pcMbDataAccessEL->getMbData().getBCBP( cIdx.b4x4() ) )
rcMbFGSCoefMap.getB4x4Map( cIdx ) |= SIGNIFICANT;
else {
rcMbFGSCoefMap.getLumaScanPos( cIdx ) = 16;
for( UInt ui = 0; ui < 16; ui++ ) {
if( ! ( pcCoefMap[ui] & SIGNIFICANT ) ) {
pcCoefMap[ui] |= CODED;
if( piRemainingTCoeff )
*piRemainingTCoeff -= 1;
rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 );
}
}
}
}
}
}
}
if( ( pcMbDataAccessEL->getMbData().getMbCbp() >> 4 ) <= 1 ) {
//----- chroma AC -----
for( CIdx cCIdx; cCIdx.isLegal(); cCIdx++ ) {
CoefMap *pcCoefMap = rcMbFGSCoefMap.getCoefMap( cCIdx );
rcMbFGSCoefMap.getChromaACBlockMap( cCIdx ) |= CODED;
rcMbFGSCoefMap.getChromaACScanPos( cCIdx ) = 16;
for( UInt ui = 1; ui < 16; ui++ ) {
if( ! ( pcCoefMap[ui] & SIGNIFICANT ) ) {
pcCoefMap[ui] |= CODED;
if( piRemainingTCoeff )
*piRemainingTCoeff -= 1;
rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 );
}
}
}
}
if( ( pcMbDataAccessEL->getMbData().getMbCbp() >> 4 ) == 0 ) {
//----- chroma DC -----
for( CPlaneIdx cCPlaneIdx; cCPlaneIdx.isLegal(); ++cCPlaneIdx )
{
rcMbFGSCoefMap.getChromaDCMbMap( cCPlaneIdx ) |= CODED;
rcMbFGSCoefMap.getChromaDCScanPos( cCPlaneIdx ) = 4;
for( UInt ui = 0; ui < 4; ui++ ) {
CoefMap &cCoefMap = rcMbFGSCoefMap.getCoefMap( CIdx( cCPlaneIdx ) + ui )[0];
// CoefMap cCoefMap = rcMbFGSCoefMap.getCoefMap( CIdx( cCPlaneIdx ) + ui )[0];
if( ! ( cCoefMap & SIGNIFICANT ) ) {
cCoefMap |= CODED;
if( piRemainingTCoeff )
*piRemainingTCoeff -= 1;
rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 );
}
}
}
}
return Err::m_nOK;
}
UInt
FGSCoder::xDeriveComponentPosVectors( UInt* puiRefPosVect,
Int* piMaxPosLuma,
Int* piMaxPosChromaAC,
Int* piMaxPosChromaDC,
UInt uiChromaStartCycle )
{
Bool bAllowChromaDC, bAllowChromaAC;
UInt uiCycle, uiNumFrags, uiFirstCycle, uiLastCycle;
uiNumFrags = uiFirstCycle = 0;
piMaxPosChromaAC[0] = 0;
piMaxPosChromaDC[0] = -1;
do {
piMaxPosLuma[uiNumFrags] = puiRefPosVect[uiNumFrags];
uiLastCycle = piMaxPosLuma[uiNumFrags];
if( uiNumFrags > 0 ) {
piMaxPosChromaAC[uiNumFrags] = piMaxPosChromaAC[uiNumFrags - 1];
piMaxPosChromaDC[uiNumFrags] = piMaxPosChromaDC[uiNumFrags - 1];
}
// find the max position for chroma AC
for( uiCycle = uiFirstCycle; uiCycle <= uiLastCycle; uiCycle ++ ) {
bAllowChromaDC = (uiCycle == 0) || ((uiCycle >= uiChromaStartCycle) && ((uiCycle-uiChromaStartCycle) % 2 == 0));
bAllowChromaAC = (uiCycle > 0) && ((uiCycle == uiChromaStartCycle) || ((uiCycle >= uiChromaStartCycle) && ((uiCycle-uiChromaStartCycle) % 3 == 1)));
piMaxPosChromaDC[uiNumFrags] += bAllowChromaDC;
if( piMaxPosChromaDC[uiNumFrags] > 3 )
piMaxPosChromaDC[uiNumFrags] = 3;
piMaxPosChromaAC[uiNumFrags] += bAllowChromaAC;
if( piMaxPosChromaAC[uiNumFrags] > 15 )
piMaxPosChromaAC[uiNumFrags] = 15;
}
uiFirstCycle = uiLastCycle + 1;
uiNumFrags ++;
} while( piMaxPosLuma[uiNumFrags - 1] < 15 );
// dirty fix
piMaxPosChromaDC[uiNumFrags - 1] = 3;
piMaxPosChromaAC[uiNumFrags - 1] = 15;
return uiNumFrags;
}
ErrVal
FGSCoder::xSetNumCoefficients( UInt uiMbX,
UInt uiMbY,
MbFGSCoefMap &rcMbFGSCoefMap,
UInt uiMbCoeffsDecoded )
{
// now partially it is set in xDecodeMbHeader, should be changed also
rcMbFGSCoefMap.resetNumCoded();
rcMbFGSCoefMap.increaseAndCheckNumCoded( uiMbCoeffsDecoded );
if( uiMbCoeffsDecoded > 384 )
return Err::m_nERR;
else
return Err::m_nOK;
}
H264AVC_NAMESPACE_END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -