📄 mbdatactrl.cpp
字号:
m_ucLastMbQp = rcSH.getPicQp();
H264AVC_DELETE_CLASS( m_pcMbDataAccess );
return Err::m_nOK;
}
const MbData& MbDataCtrl::xGetColMbData( UInt uiIndex )
{
return (( m_pcMbDataCtrl0L1 == NULL ) ? xGetOutMbData() : m_pcMbDataCtrl0L1->getMbData( uiIndex ));
}
const MbData& MbDataCtrl::xGetRefMbData( UInt uiSliceId,
Int uiCurrSliceID,
Int iMbY,
Int iMbX,
Bool bLoopFilter )
{
// check whether ref mb is inside
ROTRS( iMbX < 0, xGetOutMbData() );
ROTRS( iMbY < 0, xGetOutMbData() );
ROTRS( iMbX >= m_iMbPerLine, xGetOutMbData() );
ROTRS( iMbY >= m_iMbPerColumn, xGetOutMbData() );
//--ICU/ETRI FMO Implementation
// ROTRS( uiCurrSliceID != getSliceGroupIDofMb(iMbY * m_uiMbStride + iMbX + m_uiMbOffset ) , xGetOutMbData() );
ROTRS( uiCurrSliceID != getSliceGroupIDofMb(iMbY * (m_uiMbStride>>(UInt)m_pcSliceHeader->getFieldPicFlag()) + iMbX ) , xGetOutMbData() ); //TMM_INTERLACE
// get the ref mb data
const MbData& rcMbData = getMbData( iMbY * m_uiMbStride + iMbX + m_uiMbOffset );
// test slice id
return (( rcMbData.getSliceId() == uiSliceId || bLoopFilter ) ? rcMbData : xGetOutMbData() );
}
ErrVal MbDataCtrl::initMb( MbDataAccess*& rpcMbDataAccess, UInt uiMbY, UInt uiMbX, const Bool bFieldFlag, const Int iForceQp )
{
UInt uiCurrIdx = uiMbY * m_uiMbStride + uiMbX + m_uiMbOffset;
MbData& rcMbDataCurr = m_pcMbData[ uiCurrIdx ];
rcMbDataCurr.setFieldFlag( bFieldFlag );
return initMb( rpcMbDataAccess, uiMbY, uiMbX, iForceQp );
}
ErrVal MbDataCtrl::initMb( MbDataAccess*& rpcMbDataAccess, UInt uiMbY, UInt uiMbX, const Int iForceQp )
{
ROF( m_bInitDone );
AOT_DBG( uiMbY * m_uiMbStride + uiMbX + m_uiMbOffset >= m_uiSize );
Bool bLf = (m_eProcessingState == POST_PROCESS);
Bool bMbAff = m_pcSliceHeader->isMbAff();
Bool bTopMb = ((bMbAff && (uiMbY % 2)) ? false : true);
UInt uiMbYComp = ( bMbAff ? ( bTopMb ? uiMbY+1 : uiMbY-1 ) : uiMbY );
UInt uiCurrIdx = uiMbY * m_uiMbStride + uiMbX + m_uiMbOffset;
UInt uiCompIdx = uiMbYComp * m_uiMbStride + uiMbX + m_uiMbOffset;
ROT( uiCompIdx >= m_uiSize );
ROT( uiCurrIdx >= m_uiSize );
MbData& rcMbDataCurr = m_pcMbData[ uiCurrIdx ];
MbData& rcMbDataComp = m_pcMbData[ uiCompIdx ];
//----- get co-located MbIndex -----
UInt uiIdxColTop;
UInt uiIdxColBot;
if( ! m_pcSliceHeader->getFieldPicFlag() )
{
UInt uiMbYColTop = 2 * ( uiMbY / 2 );
uiIdxColTop = uiMbYColTop * m_uiMbStride + uiMbX + m_uiMbOffset;
uiIdxColBot = uiIdxColTop + m_uiMbStride;
if( uiIdxColBot >= m_pcSliceHeader->getMbInPic() )
{
uiIdxColBot = uiIdxColTop;
}
}
else if( ! m_pcSliceHeader->getBottomFieldFlag() )
{
uiIdxColTop = uiCurrIdx + m_iColocatedOffset;
uiIdxColBot = uiIdxColTop - m_iColocatedOffset + m_iMbPerLine;
}
else
{
uiIdxColBot = uiCurrIdx - m_iColocatedOffset;
uiIdxColTop = uiIdxColBot + m_iColocatedOffset - m_iMbPerLine;
}
if( m_pcMbDataAccess )
{
m_ucLastMbQp = m_pcMbDataAccess->getMbData().getQp();
}
UInt uiSliceId = rcMbDataCurr.getSliceId();
if( PARSE_PROCESS == m_eProcessingState || ENCODE_PROCESS == m_eProcessingState)
{
if( 0 == uiSliceId )
{
uiSliceId = m_uiSliceId;
rcMbDataCurr.getMbTCoeffs().clear();
rcMbDataCurr.initMbData( m_ucLastMbQp, uiSliceId );
rcMbDataCurr.clear();
m_uiMbProcessed++;
m_cMbProcessed.get(uiCurrIdx) = true;
}
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,
*m_cpDFPBuffer.get( uiSliceId ),
uiMbX,
uiMbY,
bTopMb,
m_bUseTopField,
bColocatedField,// TMM_INTERLACE
m_ucLastMbQp );
ROT( NULL == m_pcMbDataAccess );
rpcMbDataAccess = m_pcMbDataAccess;
return Err::m_nOK;
}
//TMM_EC {{
ErrVal MbDataCtrl::initMbTDEnhance( MbDataAccess*& rpcMbDataAccess, MbDataCtrl *pcMbDataCtrl, MbDataCtrl *pcMbDataCtrlRef, UInt uiMbY, UInt uiMbX, const Int iForceQp )
{
ROF( m_bInitDone );
AOT_DBG( uiMbY * m_uiMbStride + uiMbX + m_uiMbOffset >= m_uiSize );
Bool bLf = (m_eProcessingState == POST_PROCESS);
Bool bMbAff = m_pcSliceHeader->isMbAff();
Bool bTopMb = ((bMbAff && (uiMbY % 2)) ? false : true);
UInt uiMbYComp = ( bMbAff ? ( bTopMb ? uiMbY+1 : uiMbY-1 ) : uiMbY );
UInt uiCurrIdx = uiMbY * m_uiMbStride + uiMbX + m_uiMbOffset;
UInt uiCompIdx = uiMbYComp * m_uiMbStride + uiMbX + m_uiMbOffset;
ROT( uiCompIdx >= m_uiSize );
ROT( uiCurrIdx >= m_uiSize );
MbData& rcMbDataCurr = m_pcMbData[ uiCurrIdx ];
MbData& rcMbDataComp = m_pcMbData[ uiCompIdx ];
//----- get co-located MbIndex -----
UInt uiIdxColTop;
UInt uiIdxColBot;
if( ! m_pcSliceHeader->getFieldPicFlag() )
{
UInt uiMbYColTop = 2 * ( uiMbY / 2 );
uiIdxColTop = uiMbYColTop * m_uiMbStride + uiMbX + m_uiMbOffset;
uiIdxColBot = uiIdxColTop + m_uiMbStride;
if( uiIdxColBot >= m_pcSliceHeader->getMbInPic() )
{
uiIdxColBot = uiIdxColTop;
}
}
else if( ! m_pcSliceHeader->getBottomFieldFlag() )
{
uiIdxColTop = uiCurrIdx + m_iColocatedOffset;
uiIdxColBot = uiIdxColTop - m_iColocatedOffset + m_iMbPerLine;
}
else
{
uiIdxColBot = uiCurrIdx - m_iColocatedOffset;
uiIdxColTop = uiIdxColBot + m_iColocatedOffset - m_iMbPerLine;
}
if( m_pcMbDataAccess )
{
m_ucLastMbQp = m_pcMbDataAccess->getMbData().getQp();
}
UInt uiSliceId = rcMbDataCurr.getSliceId();
if( PARSE_PROCESS == m_eProcessingState || ENCODE_PROCESS == m_eProcessingState)
{
if( 0 == uiSliceId )
{
uiSliceId = m_uiSliceId;
rcMbDataCurr.getMbTCoeffs().clear();
rcMbDataCurr.initMbData( m_ucLastMbQp, uiSliceId );
rcMbDataCurr.clear();
m_uiMbProcessed++;
m_cMbProcessed.get(uiCurrIdx) = true;
}
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(); // TMM_INTERLACE
// Int icurrSliceGroupID = getSliceGroupIDofMb(uiMbY * m_uiMbStride + uiMbX + m_uiMbOffset);
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
pcMbDataCtrlRef->getMbData( uiIdxColTop),
pcMbDataCtrlRef->getMbData( uiIdxColBot),
*m_pcSliceHeader,
*m_cpDFPBuffer.get( uiSliceId ),
uiMbX,
uiMbY,
bTopMb,
m_bUseTopField,
bColocatedField,
m_ucLastMbQp );
ROT( NULL == m_pcMbDataAccess );
rpcMbDataAccess = m_pcMbDataAccess;
return Err::m_nOK;
}
//TMM_EC }}
ErrVal
MbDataCtrl::storeFgsBQLayerQpAndCbp()
{
ROF( m_pacFgsBQMbQP );
ROF( m_pauiFgsBQMbCbp );
ROF( m_pauiFgsBQBCBP );
ROF( m_pabFgsBQ8x8Trafo );
for( UInt uiMbIndex = 0; uiMbIndex < getSize(); uiMbIndex++ )
{
m_pacFgsBQMbQP [uiMbIndex] = getMbData( uiMbIndex ).getQp();
m_pauiFgsBQMbCbp [uiMbIndex] = getMbData( uiMbIndex ).getMbExtCbp();
m_pauiFgsBQBCBP [uiMbIndex] = getMbData( uiMbIndex ).getBCBP();
m_pabFgsBQ8x8Trafo [uiMbIndex] = getMbData( uiMbIndex ).isTransformSize8x8();
}
return Err::m_nOK;
}
ErrVal
MbDataCtrl::switchFgsBQLayerQpAndCbp()
{
ROF( m_pacFgsBQMbQP );
ROF( m_pauiFgsBQMbCbp );
ROF( m_pauiFgsBQBCBP );
ROF( m_pabFgsBQ8x8Trafo );
for( UInt uiMbIndex = 0; uiMbIndex < getSize(); uiMbIndex++ )
{
UChar ucQP = getMbData( uiMbIndex ).getQp();
UInt uiCbp = getMbData( uiMbIndex ).getMbExtCbp();
UInt uiBCBP= getMbData( uiMbIndex ).getBCBP();
Bool bT8x8 = getMbData( uiMbIndex ).isTransformSize8x8();
getMbDataByIndex( uiMbIndex ).setQp ( m_pacFgsBQMbQP [uiMbIndex] );
getMbDataByIndex( uiMbIndex ).setMbExtCbp ( m_pauiFgsBQMbCbp [uiMbIndex] );
getMbDataByIndex( uiMbIndex ).setBCBP ( m_pauiFgsBQBCBP [uiMbIndex] );
getMbDataByIndex( uiMbIndex ).setTransformSize8x8 ( m_pabFgsBQ8x8Trafo [uiMbIndex] );
m_pacFgsBQMbQP [uiMbIndex] = ucQP;
m_pauiFgsBQMbCbp [uiMbIndex] = uiCbp;
m_pauiFgsBQBCBP [uiMbIndex] = uiBCBP;
m_pabFgsBQ8x8Trafo [uiMbIndex] = bT8x8;
}
return Err::m_nOK;
}
ErrVal
MbDataCtrl::initFgsBQData( UInt uiNumMb )
{
ROT( m_pacFgsBQMbQP );
ROT( m_pauiFgsBQMbCbp );
ROT( m_pauiFgsBQBCBP );
ROT( m_pabFgsBQ8x8Trafo );
ROFS( ( m_pacFgsBQMbQP = new UChar [uiNumMb] ) );
ROFS( ( m_pauiFgsBQMbCbp = new UInt [uiNumMb] ) );
ROFS( ( m_pauiFgsBQBCBP = new UInt [uiNumMb] ) );
ROFS( ( m_pabFgsBQ8x8Trafo = new Bool [uiNumMb] ) );
return Err::m_nOK;
}
ErrVal
MbDataCtrl::uninitFgsBQData()
{
delete [] m_pacFgsBQMbQP;
delete [] m_pauiFgsBQMbCbp;
delete [] m_pauiFgsBQBCBP;
delete [] m_pabFgsBQ8x8Trafo;
m_pacFgsBQMbQP = 0;
m_pauiFgsBQMbCbp = 0;
m_pauiFgsBQBCBP = 0;
m_pabFgsBQ8x8Trafo = 0;
return Err::m_nOK;
}
ControlData::ControlData()
: m_pcMbDataCtrl ( 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_pauiFGSMbCbp ( 0 )
, m_pabFGS8x8Trafo ( 0 )
, m_bIsNormalMbDataCtrl ( true )
, m_pacBQMbQP ( 0 )
, m_pauiBQMbCbp ( 0 )
, m_pabBQ8x8Trafo ( 0 )
, m_paeBQMbMode ( 0 )
, m_pusBQFwdBwd ( 0 )
, m_iSpatialScalabilityType ( 0 )
, m_bSpatialScalability ( false)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -