📄 mbdatactrl.cpp
字号:
uiSliceId = m_uiSliceId;
rcMbDataCurr.getMbTCoeffs().clear();
rcMbDataCurr.initMbData( m_ucLastMbQp, m_ucLastMbQp4LF, uiSliceId, m_pcSliceHeader->getSliceType() );
rcMbDataCurr.clear();
m_uiMbProcessed++;
}
else
{
//allready assigned;
if( ENCODE_PROCESS != m_eProcessingState )
{
AF();
}
else
{
if( iForceQp != -1 )
{
m_ucLastMbQp = iForceQp;
}
}
}
}
const Bool bColocatedField = ( m_pcMbDataCtrl0L1 == NULL ) ? true : m_pcMbDataCtrl0L1->isPicCodedField();
Int icurrSliceGroupID = getSliceGroupIDofMb(uiMbY * (m_uiMbStride>>(UInt)m_pcSliceHeader->getFieldPicFlag()) + uiMbX ); //TMM_INTERLACE
m_pcMbDataAccess = new (m_pcMbDataAccess) MbDataAccess( rcMbDataCurr, // current
rcMbDataComp, // complementary
xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY, uiMbX-1, bLf ), // left
xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY-1, uiMbX , bLf ), // above
xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY-1, uiMbX-1, bLf ), // above left
((bMbAff && (uiMbY % 2 == 1)) ? xGetOutMbData() : xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY-1, uiMbX+1, bLf )), // above right
xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY-2, uiMbX , bLf ), // above above
xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY-2, uiMbX-1, bLf ), // above above left
xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY-2, uiMbX+1, bLf ), // above above right
xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY+1, uiMbX-1, bLf ), // below left
xGetOutMbData(), // unvalid
xGetColMbData( uiIdxColTop ),
xGetColMbData( uiIdxColBot ),
*m_pcSliceHeader,
uiMbX,
uiMbY,
bTopMb,
m_bUseTopField,
bColocatedField,// TMM_INTERLACE
m_ucLastMbQp, m_ucLastMbQp4LF );
ROT( NULL == m_pcMbDataAccess );
rpcMbDataAccess = m_pcMbDataAccess;
return Err::m_nOK;
}
ControlData::ControlData()
: m_pcMbDataCtrl ( 0 )
, m_pcMbDataCtrl0L1( 0 )
, m_pcSliceHeader ( 0 )
, m_pcSliceHeaderBot ( 0 )
, m_dLambda ( 0 )
, m_pcBaseLayerRec ( 0 )
, m_pcBaseLayerSbb ( 0 )
, m_pcBaseLayerCtrl ( 0 )
, m_pcBaseLayerCtrlField ( 0 )
, m_pcBaseCtrlData ( 0 )
, m_uiUseBLMotion ( 0 )
, m_dScalingFactor ( 1.0 )
, m_pacFGSMbQP ( 0 )
, m_pacFGSMbQP4LF ( 0 )
, m_pauiFGSMbCbp ( 0 )
, m_pabFGS8x8Trafo ( 0 )
, m_bIsNormalMbDataCtrl ( true )
, m_pacBQMbQP ( 0 )
, m_pacBQMbQP4LF ( 0 )
, m_pauiBQMbCbp ( 0 )
, m_pabBQ8x8Trafo ( 0 )
, m_paeBQMbMode ( 0 )
, m_pusBQFwdBwd ( 0 )
, m_bSpatialScalability ( false)
{
m_paacBQMotionData[0] = m_paacBQMotionData[1] = 0;
}
ControlData::~ControlData()
{
AOT( m_pacBQMbQP );
AOT( m_pacBQMbQP4LF );
AOT( m_pauiBQMbCbp );
AOT( m_pabBQ8x8Trafo );
AOT( m_pacFGSMbQP );
AOT( m_pacFGSMbQP4LF );
AOT( m_pauiFGSMbCbp );
AOT( m_pabFGS8x8Trafo );
}
Void
ControlData::clear()
{
m_pcMbDataCtrl0L1 = 0;
m_pcBaseLayerRec = 0;
m_pcBaseLayerSbb = 0;
m_pcBaseLayerCtrl = 0;
m_pcBaseLayerCtrlField = 0;
m_uiUseBLMotion = 0;
m_dScalingFactor = 1.0;
m_bIsNormalMbDataCtrl = true;
}
ErrVal
ControlData::init( SliceHeader* pcSliceHeader,
MbDataCtrl* pcMbDataCtrl,
Double dLambda )
{
ROF( pcSliceHeader );
ROF( pcMbDataCtrl );
m_pcSliceHeader = pcSliceHeader;
m_pcMbDataCtrl = pcMbDataCtrl;
m_dLambda = dLambda;
m_pcMbDataCtrl0L1 = 0;
m_pcBaseLayerRec = 0;
m_pcBaseLayerSbb = 0;
m_pcBaseLayerCtrl = 0;
m_pcBaseLayerCtrlField = 0;
m_uiUseBLMotion = 0;
return Err::m_nOK;
}
ErrVal
ControlData::init( SliceHeader* pcSliceHeader )
{
ROF( pcSliceHeader );
ROF( m_pcMbDataCtrl );
m_pcSliceHeader = pcSliceHeader;
m_pcMbDataCtrl0L1 = 0;
m_pcBaseLayerRec = 0;
m_pcBaseLayerSbb = 0;
m_pcBaseLayerCtrl = 0;
m_pcBaseLayerCtrlField = 0;
m_uiUseBLMotion = 0;
return Err::m_nOK;
}
ErrVal
ControlData::initBQData( UInt uiNumMb )
{
ROT( m_pacBQMbQP );
ROT( m_pacBQMbQP4LF );
ROT( m_pauiBQMbCbp );
ROT( m_pabBQ8x8Trafo );
ROFS( ( m_pacBQMbQP = new UChar [uiNumMb] ) );
ROFS( ( m_pacBQMbQP4LF = new UChar [uiNumMb] ) );
ROFS( ( m_pauiBQMbCbp = new UInt [uiNumMb] ) );
ROFS( ( m_pabBQ8x8Trafo = new Bool [uiNumMb] ) );
ROFS( ( m_paeBQMbMode = new MbMode[uiNumMb] ) );
ROFS( ( m_pusBQFwdBwd = new UShort[uiNumMb] ) );
ROFS( ( m_paacBQMotionData[0] = new MbMotionData[uiNumMb] ) );
ROFS( ( m_paacBQMotionData[1] = new MbMotionData[uiNumMb] ) );
return Err::m_nOK;
}
ErrVal
ControlData::uninitBQData()
{
delete [] m_pacBQMbQP;
delete [] m_pacBQMbQP4LF;
delete [] m_pauiBQMbCbp;
delete [] m_pabBQ8x8Trafo;
delete [] m_paeBQMbMode;
delete [] m_pusBQFwdBwd;
delete [] m_paacBQMotionData[0];
delete [] m_paacBQMotionData[1];
m_pacBQMbQP = 0;
m_pacBQMbQP4LF = 0;
m_pauiBQMbCbp = 0;
m_pabBQ8x8Trafo = 0;
m_paeBQMbMode = 0;
m_pusBQFwdBwd = 0;
m_paacBQMotionData[0] = 0;
m_paacBQMotionData[1] = 0;
return Err::m_nOK;
}
ErrVal
ControlData::storeBQLayerQpAndCbp()
{
ROF( m_pacBQMbQP );
ROF( m_pacBQMbQP4LF );
ROF( m_pauiBQMbCbp );
ROF( m_pabBQ8x8Trafo );
for( UInt uiMbIndex = 0; uiMbIndex < m_pcMbDataCtrl->getSize(); uiMbIndex++ )
{
m_pacBQMbQP [uiMbIndex] = m_pcMbDataCtrl->getMbData( uiMbIndex ).getQp();
m_pacBQMbQP4LF [uiMbIndex] = m_pcMbDataCtrl->getMbData( uiMbIndex ).getQp4LF();
m_pauiBQMbCbp [uiMbIndex] = m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbExtCbp();
m_pabBQ8x8Trafo [uiMbIndex] = m_pcMbDataCtrl->getMbData( uiMbIndex ).isTransformSize8x8();
m_paeBQMbMode [uiMbIndex] = m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbMode();
m_pusBQFwdBwd [uiMbIndex] = m_pcMbDataCtrl->getMbData( uiMbIndex ).getFwdBwd();
m_paacBQMotionData[0][uiMbIndex].copyFrom( m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbMotionData( ListIdx( 0 ) ) );
m_paacBQMotionData[1][uiMbIndex].copyFrom( m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbMotionData( ListIdx( 1 ) ) );
}
return Err::m_nOK;
}
ErrVal
ControlData::switchBQLayerQpAndCbp()
{
ROF( m_pacBQMbQP );
ROF( m_pacBQMbQP4LF );
ROF( m_pauiBQMbCbp );
ROF( m_pabBQ8x8Trafo );
for( UInt uiMbIndex = 0; uiMbIndex < m_pcMbDataCtrl->getSize(); uiMbIndex++ )
{
UChar ucQP = m_pcMbDataCtrl->getMbData( uiMbIndex ).getQp();
UChar ucQP4LF = m_pcMbDataCtrl->getMbData( uiMbIndex ).getQp4LF();
UInt uiCbp = m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbExtCbp();
Bool bT8x8 = m_pcMbDataCtrl->getMbData( uiMbIndex ).isTransformSize8x8();
m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setQp ( m_pacBQMbQP [uiMbIndex] );
m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setQp4LF ( m_pacBQMbQP4LF [uiMbIndex] );
m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setMbExtCbp ( m_pauiBQMbCbp [uiMbIndex] );
m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setTransformSize8x8 ( m_pabBQ8x8Trafo [uiMbIndex] );
m_pacBQMbQP [uiMbIndex] = ucQP;
m_pacBQMbQP4LF [uiMbIndex] = ucQP4LF;
m_pauiBQMbCbp [uiMbIndex] = uiCbp;
m_pabBQ8x8Trafo [uiMbIndex] = bT8x8;
MbMode eMbMode = m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbMode();
UShort usFwdBwd = m_pcMbDataCtrl->getMbData( uiMbIndex ).getFwdBwd();
m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setMbMode ( m_paeBQMbMode [uiMbIndex] );
m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setFwdBwd ( m_pusBQFwdBwd [uiMbIndex] );
m_paeBQMbMode [uiMbIndex] = eMbMode;
m_pusBQFwdBwd [uiMbIndex] = usFwdBwd;
for( UInt ui = 0; ui < 2; ui++ )
{
MbMotionData cMbMotionData;
cMbMotionData.copyFrom( m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbMotionData( ListIdx( ui ) ) );
m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).getMbMotionData( ListIdx( ui ) ).copyFrom( m_paacBQMotionData[ui][uiMbIndex] );
m_paacBQMotionData[ui][uiMbIndex].copyFrom( cMbMotionData );
}
}
return Err::m_nOK;
}
ErrVal
ControlData::initFGSData( UInt uiNumMb )
{
ROT( m_pacFGSMbQP );
ROT( m_pacFGSMbQP4LF );
ROT( m_pauiFGSMbCbp );
ROT( m_pabFGS8x8Trafo );
ROFS( ( m_pacFGSMbQP = new UChar [uiNumMb] ) );
ROFS( ( m_pacFGSMbQP4LF = new UChar [uiNumMb] ) );
ROFS( ( m_pauiFGSMbCbp = new UInt [uiNumMb] ) );
ROFS( ( m_pabFGS8x8Trafo = new Bool [uiNumMb] ) );
return Err::m_nOK;
}
ErrVal
ControlData::uninitFGSData()
{
delete [] m_pacFGSMbQP;
delete [] m_pacFGSMbQP4LF;
delete [] m_pauiFGSMbCbp;
delete [] m_pabFGS8x8Trafo;
m_pacFGSMbQP = 0;
m_pacFGSMbQP4LF = 0;
m_pauiFGSMbCbp = 0;
m_pabFGS8x8Trafo = 0;
return Err::m_nOK;
}
ErrVal
ControlData::storeFGSLayerQpAndCbp()
{
ROF( m_pacFGSMbQP );
ROF( m_pacFGSMbQP4LF );
ROF( m_pauiFGSMbCbp );
ROF( m_pabFGS8x8Trafo );
for( UInt uiMbIndex = 0; uiMbIndex < m_pcMbDataCtrl->getSize(); uiMbIndex++ )
{
m_pacFGSMbQP [uiMbIndex] = m_pcMbDataCtrl->getMbData( uiMbIndex ).getQp();
m_pacFGSMbQP4LF [uiMbIndex] = m_pcMbDataCtrl->getMbData( uiMbIndex ).getQp4LF();
m_pauiFGSMbCbp [uiMbIndex] = m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbExtCbp();
m_pabFGS8x8Trafo [uiMbIndex] = m_pcMbDataCtrl->getMbData( uiMbIndex ).isTransformSize8x8();
}
return Err::m_nOK;
}
ErrVal
ControlData::switchFGSLayerQpAndCbp()
{
ROF( m_pacFGSMbQP );
ROF( m_pacFGSMbQP4LF );
ROF( m_pauiFGSMbCbp );
ROF( m_pabFGS8x8Trafo );
for( UInt uiMbIndex = 0; uiMbIndex < m_pcMbDataCtrl->getSize(); uiMbIndex++ )
{
UChar ucQP = m_pcMbDataCtrl->getMbData( uiMbIndex ).getQp();
UChar ucQP4LF = m_pcMbDataCtrl->getMbData( uiMbIndex ).getQp4LF();
UInt uiCbp = m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbExtCbp();
Bool bT8x8 = m_pcMbDataCtrl->getMbData( uiMbIndex ).isTransformSize8x8();
m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setQp ( m_pacFGSMbQP [uiMbIndex] );
m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setQp4LF ( m_pacFGSMbQP4LF [uiMbIndex] );
m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setMbExtCbp ( m_pauiFGSMbCbp [uiMbIndex] );
m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setTransformSize8x8 ( m_pabFGS8x8Trafo [uiMbIndex] );
m_pacFGSMbQP [uiMbIndex] = ucQP;
m_pacFGSMbQP4LF [uiMbIndex] = ucQP4LF;
m_pauiFGSMbCbp [uiMbIndex] = uiCbp;
m_pabFGS8x8Trafo [uiMbIndex] = bT8x8;
}
return Err::m_nOK;
}
const Int MbDataCtrl::getSliceGroupIDofMb(Int mb)
{
Int iRefSliceID ;
if(m_pcSliceHeader->getFMO() != NULL)
iRefSliceID =m_pcSliceHeader->getFMO()->getSliceGroupId(mb );
else
iRefSliceID =-1;
return iRefSliceID ;
}
ErrVal
MbDataCtrl::getBoundaryMask( Int i
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -