📄 slicedecoder.cpp
字号:
ListIdx eListIdx = uiList==0 ? LIST_0:LIST_1;
cMbMotionData[uiList].copyFrom( pcMbDataAccessRewrite->getMbMotionData(eListIdx) );
pcMbDataAccessRewrite->getMbMvdData(eListIdx).clear();
pcMbDataAccessRewrite->getMbMotionData(eListIdx).setMotPredFlag( false );
}
// This is a sub-optimal implementation
for( UInt uiList=0; uiList<2; uiList++ )
{
ListIdx eListIdx = uiList==0 ? LIST_0:LIST_1;
for( S4x4Idx cIdx; cIdx.isLegal(); cIdx++ )
{
m_pcMbDecoder->calcMv( *pcMbDataAccessRewrite, NULL );
cMv = cMbMotionData[uiList].getMv( cIdx );
cMv -= pcMbDataAccessRewrite->getMbMotionData( eListIdx ).getMv( cIdx );
pcMbDataAccessRewrite->getMbMvdData( eListIdx ).setMv( cMv, cIdx );
}
// Cleanup for CABAC context models
switch( pcMbDataAccessRewrite->getMbData().getMbMode() )
{
case MODE_16x16:
cMv = pcMbDataAccessRewrite->getMbMvdData( eListIdx ).getMv( );
pcMbDataAccessRewrite->getMbMvdData(eListIdx).setAllMv( cMv );
break;
case MODE_16x8:
cMv = pcMbDataAccessRewrite->getMbMvdData( eListIdx ).getMv( PART_16x8_0 );
pcMbDataAccessRewrite->getMbMvdData(eListIdx).setAllMv( cMv, PART_16x8_0 );
cMv = pcMbDataAccessRewrite->getMbMvdData( eListIdx ).getMv( PART_16x8_1 );
pcMbDataAccessRewrite->getMbMvdData(eListIdx).setAllMv( cMv, PART_16x8_1 );
break;
case MODE_8x16:
cMv = pcMbDataAccessRewrite->getMbMvdData( eListIdx ).getMv( PART_8x16_0 );
pcMbDataAccessRewrite->getMbMvdData(eListIdx).setAllMv( cMv, PART_8x16_0 );
cMv = pcMbDataAccessRewrite->getMbMvdData( eListIdx ).getMv( PART_8x16_1 );
pcMbDataAccessRewrite->getMbMvdData(eListIdx).setAllMv( cMv, PART_8x16_1 );
break;
case MODE_8x8:
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
{
ParIdx8x8 eParIdx = c8x8Idx.b8x8();
if( pcMbDataAccessRewrite->getMbData().getBlkMode( c8x8Idx.b8x8Index() ) == BLK_SKIP )
pcMbDataAccessRewrite->getMbData().setBlkMode( c8x8Idx.b8x8Index(), BLK_8x8 );
switch( pcMbDataAccessRewrite->getMbData().getBlkMode( c8x8Idx.b8x8Index() ) )
{
case BLK_8x8:
cMv = pcMbDataAccessRewrite->getMbMvdData( eListIdx ).getMv( eParIdx );
pcMbDataAccessRewrite->getMbMvdData(eListIdx).setAllMv( cMv, eParIdx );
break;
case BLK_8x4:
cMv = pcMbDataAccessRewrite->getMbMvdData( eListIdx ).getMv( eParIdx, SPART_8x4_0 );
pcMbDataAccessRewrite->getMbMvdData(eListIdx).setAllMv( cMv, eParIdx, SPART_8x4_0 );
cMv = pcMbDataAccessRewrite->getMbMvdData( eListIdx ).getMv( eParIdx, SPART_8x4_1 );
pcMbDataAccessRewrite->getMbMvdData(eListIdx).setAllMv( cMv, eParIdx, SPART_8x4_1 );
break;
case BLK_4x8:
cMv = pcMbDataAccessRewrite->getMbMvdData( eListIdx ).getMv( eParIdx, SPART_4x8_0 );
pcMbDataAccessRewrite->getMbMvdData(eListIdx).setAllMv( cMv, eParIdx, SPART_4x8_0 );
cMv = pcMbDataAccessRewrite->getMbMvdData( eListIdx ).getMv( eParIdx, SPART_4x8_1 );
pcMbDataAccessRewrite->getMbMvdData(eListIdx).setAllMv( cMv, eParIdx, SPART_4x8_1 );
break;
case BLK_4x4:
break;
default:
AOT(1);
}
}
break;
default:
AOT(1);
}
}
// SANITY CHECK
m_pcMbDecoder->calcMv( *pcMbDataAccessRewrite, NULL );
for( UInt uiList=0; uiList<2; uiList++ )
{
for( B4x4Idx cIdx; cIdx.isLegal(); cIdx++ )
{
ListIdx eListIdx = uiList==0 ? LIST_0:LIST_1;
cMv = cMbMotionData[uiList].getMv( cIdx );
cMv -= pcMbDataAccessRewrite->getMbMotionData( eListIdx ).getMv( cIdx );
if( cMv.getHor() || cMv.getVer() )
AOT(1);
}
}
// END SANITY CHECK
}
///////////////////////////////////////////////////////////
pcMbDataAccessRewrite->getMbData().setBCBPAll(0);
// Reset data
UInt uiCbp = pcMbDataAccess->getMbData().getMbCbp();
//MbMode mode = pcMbDataAccess->getMbData().getMbMode();
int base_layer_id_save = rcSH.getBaseLayerId();
//bool bl_skip_flag_save = pcMbDataAccess->getMbData().getBLSkipFlag();
bool adaptivePredictionFlag_save = rcSH.getAdaptivePredictionFlag();
bool adaptiveResPredictionFlag_save = rcSH.getAdaptiveResPredictionFlag();
rcSH.setBaseLayerId(MSYS_UINT_MAX);
rcSH.setAdaptivePredictionFlag(false);
rcSH.setAdaptiveResPredictionFlag(false);
//pcMbDataAccess->getMbData().setBLSkipFlag(false);
pcMbDataAccessRewrite->getMbData().setBLSkipFlag( false );
if (uiCbp >=48) {
fprintf(stderr, "Warning! frame %d, MB (%d, %d), uiCbp=%d\n", rcSH.getFrameNum(), uiMbY, uiMbX, uiCbp);
AOT(1);
}
if (rcSH.getAVCRewriteFlag()) {
//RNOK( m_pcAvcRewriteEncoder->xGetPcMbCoder()->encode( *pcMbDataAccess,
RNOK( m_pcAvcRewriteEncoder->xGetPcMbCoder()->encode( *pcMbDataAccessRewrite,NULL, 0, uiMbRead==1, true ));
}
// resume
rcSH.setBaseLayerId(base_layer_id_save);
rcSH.setAdaptivePredictionFlag(adaptivePredictionFlag_save);
rcSH.setAdaptiveResPredictionFlag(adaptiveResPredictionFlag_save);
#endif
uiMbRead--;
//TMM_EC {{
if ( rcSH.getTrueSlice())
{
//TMM_EC }}
//--ICU/ETRI FMO Implementation
uiMbAddress=rcSH.getFMO()->getNextMBNr(uiMbAddress);
}
else
{
uiMbAddress++;
}
}
if( ePicType!=FRAME )
{
if( pcFrame ) RNOK( pcFrame-> removeFieldBuffer( ePicType ) );
if( pcResidual ) RNOK( pcResidual-> removeFieldBuffer( ePicType ) );
if( pcPredSignal ) RNOK( pcPredSignal-> removeFieldBuffer( ePicType ) );
if( pcBaseLayer ) RNOK( pcBaseLayer-> removeFieldBuffer( ePicType ) );
if( pcBaseLayerResidual ) RNOK( pcBaseLayerResidual->removeFieldBuffer( ePicType ) );
}
return Err::m_nOK;
}
ErrVal SliceDecoder::decodeMbAff( SliceHeader& rcSH,
MbDataCtrl* pcMbDataCtrl,
MbDataCtrl* pcMbDataCtrlBase,
MbDataCtrl* pcMbDataCtrlBaseField,
IntFrame* pcFrame,
IntFrame* pcResidual,
IntFrame* pcPredSignal,
IntFrame* pcBaseLayer,
IntFrame* pcBaseLayerResidual,
RefFrameList* pcRefFrameList0,
RefFrameList* pcRefFrameList1,
Bool bReconstructAll)
{
ROF( m_bInitDone );
//====== initialization ======
RNOK( pcMbDataCtrl->initSlice( rcSH, DECODE_PROCESS, true, NULL ) );
RefFrameList acRefFrameList0[2];
RefFrameList acRefFrameList1[2];
RNOK( gSetFrameFieldLists( acRefFrameList0[0], acRefFrameList0[1], *pcRefFrameList0 ) );
RNOK( gSetFrameFieldLists( acRefFrameList1[0], acRefFrameList1[1], *pcRefFrameList1 ) );
RefFrameList* apcRefFrameList0[2];
RefFrameList* apcRefFrameList1[2];
apcRefFrameList0[0] = ( NULL == pcRefFrameList0 ) ? NULL : &acRefFrameList0[0];
apcRefFrameList0[1] = ( NULL == pcRefFrameList0 ) ? NULL : &acRefFrameList0[1];
apcRefFrameList1[0] = ( NULL == pcRefFrameList1 ) ? NULL : &acRefFrameList1[0];
apcRefFrameList1[1] = ( NULL == pcRefFrameList1 ) ? NULL : &acRefFrameList1[1];
IntFrame* apcFrame [4] = { NULL, NULL, NULL, NULL };
IntFrame* apcResidual [4] = { NULL, NULL, NULL, NULL };
IntFrame* apcPredSignal [4] = { NULL, NULL, NULL, NULL };
IntFrame* apcBaseLayer [4] = { NULL, NULL, NULL, NULL };
IntFrame* apcBaseLayerResidual[4] = { NULL, NULL, NULL, NULL };
RNOK( gSetFrameFieldArrays( apcFrame, pcFrame ) );
RNOK( gSetFrameFieldArrays( apcResidual, pcResidual ) );
RNOK( gSetFrameFieldArrays( apcPredSignal, pcPredSignal ) );
RNOK( gSetFrameFieldArrays( apcBaseLayer, pcBaseLayer ) );
RNOK( gSetFrameFieldArrays( apcBaseLayerResidual, pcBaseLayerResidual ) );
//===== loop over macroblocks =====
UInt uiMbAddress = rcSH.getFirstMbInSlice();
const UInt uiLastMbAddress = rcSH.getNumMbsInSlice ()-1;
for( ; uiMbAddress <= uiLastMbAddress; uiMbAddress+=2 )
{
for( UInt eP = 0; eP < 2; eP++ )
{
UInt uiMbAddressMbAff = uiMbAddress + eP;
MbDataAccess* pcMbDataAccess = NULL;
MbDataAccess* pcMbDataAccessBase = NULL;
UInt uiMbY, uiMbX;
RefFrameList* pcRefFrameList0F;
RefFrameList* pcRefFrameList1F;
rcSH.getMbPositionFromAddress( uiMbY, uiMbX, uiMbAddressMbAff );
RNOK( pcMbDataCtrl-> initMb ( pcMbDataAccess, uiMbY, uiMbX ) );
pcMbDataAccess->setFieldMode( pcMbDataAccess->getMbData().getFieldFlag() );
if( pcMbDataAccess->getMbPicType()==FRAME && pcMbDataCtrlBase )
{
RNOK( pcMbDataCtrlBase->initMb ( pcMbDataAccessBase, uiMbY, uiMbX ) );
}
else if( pcMbDataAccess->getMbPicType()<FRAME && pcMbDataCtrlBaseField )
{
RNOK( pcMbDataCtrlBaseField->initMb ( pcMbDataAccessBase, uiMbY, uiMbX ) );
}
RNOK( m_pcControlMng->initMbForDecoding( *pcMbDataAccess, uiMbY, uiMbX, true ) );
const PicType eMbPicType = pcMbDataAccess->getMbPicType();
const UInt uiLI = eMbPicType - 1;
if( FRAME == eMbPicType )
{
pcRefFrameList0F = pcRefFrameList0;
pcRefFrameList1F = pcRefFrameList1;
}
else
{
pcRefFrameList0F = apcRefFrameList0[eP];
pcRefFrameList1F = apcRefFrameList1[eP];
}
RNOK( m_pcMbDecoder ->decode ( *pcMbDataAccess,
pcMbDataAccessBase,
apcFrame [uiLI],
apcResidual [uiLI],
apcPredSignal [uiLI],
apcBaseLayer [uiLI],
apcBaseLayerResidual[uiLI],
pcRefFrameList0F,
pcRefFrameList1F,
bReconstructAll ) );
}
}
if( pcFrame ) RNOK( pcFrame-> removeFrameFieldBuffer() );
if( pcResidual ) RNOK( pcResidual-> removeFrameFieldBuffer() );
if( pcPredSignal ) RNOK( pcPredSignal-> removeFrameFieldBuffer() );
if( pcBaseLayer ) RNOK( pcBaseLayer-> removeFrameFieldBuffer() );
if( pcBaseLayerResidual ) RNOK( pcBaseLayerResidual->removeFrameFieldBuffer() );
return Err::m_nOK;
}
ErrVal
SliceDecoder::compensatePrediction( SliceHeader& rcSH )
{
ROF( m_bInitDone );
//====== initialization ======
RNOK( m_pcControlMng->initSlice( rcSH, DECODE_PROCESS ) );
UInt uiFirstMbInSlice;
UInt uiLastMbInSlice;
FMO* pcFMO = rcSH.getFMO();
const Bool bMbAff = rcSH.isMbAff();
for(Int iSliceGroupID=0; !pcFMO->SliceGroupCompletelyCoded(iSliceGroupID); iSliceGroupID++)
{
if (false == pcFMO->isCodedSG(iSliceGroupID))
{
continue;
}
uiFirstMbInSlice = pcFMO->getFirstMacroblockInSlice(iSliceGroupID);
uiLastMbInSlice = pcFMO->getLastMBInSliceGroup(iSliceGroupID);
//===== loop over macroblocks =====
for(UInt uiMbIndex = uiFirstMbInSlice; uiMbIndex<=uiLastMbInSlice;)
{
MbDataAccess* pcMbDataAccess = NULL;
UInt uiMbY, uiMbX;
rcSH.getMbPositionFromAddress( uiMbY, uiMbX, uiMbIndex );
RNOK( m_pcControlMng->initMbForDecoding( pcMbDataAccess, uiMbY, uiMbX, bMbAff ) );
RNOK( m_pcMbDecoder ->compensatePrediction( *pcMbDataAccess ) );
uiMbIndex = rcSH.getFMO()->getNextMBNr(uiMbIndex);
}
}
//TMM_INTERLACE{
RNOK( m_pcControlMng->removeFrameFieldBuffer() );
//TMM_INTERLACE}
return Err::m_nOK;
}
#ifdef SHARP_AVC_REWRITE_OUTPUT
ErrVal
SliceDecoder::xSetAvcRewriteEncoder(H264AVCEncoder* pcAvcRewriteEncoder) {
m_pcAvcRewriteEncoder = pcAvcRewriteEncoder;
return Err::m_nOK;
}
#endif
H264AVC_NAMESPACE_END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -