mbdatactrl.cpp
来自「SVC最新更新代码」· C++ 代码 · 共 1,734 行 · 第 1/5 页
CPP
1,734 行
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();
m_ucLastMbQp4LF = m_pcMbDataAccess->getMbData().getQp4LF();
}
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, 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_uiUseBLMotion ( 0 )
, m_dScalingFactor ( 1.0 )
, m_bSpatialScalability ( false)
{
}
ControlData::~ControlData()
{
}
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;
}
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;
}
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 iMbY, Int iMbX, Bool& rbIntra, UInt& ruiMask, UInt uiCurrentSliceID ) const
{
ruiMask = 0;
UInt uiCurrIdx = iMbY * m_uiMbStride + iMbX + m_uiMbOffset;
AOT( uiCurrIdx >= m_uiSize );
rbIntra = m_pcMbData[uiCurrIdx].isIntraInSlice( uiCurrentSliceID );
ROTRS( rbIntra, Err::m_nOK );
Bool bLeftAvailable = ( iMbX > 0 );
Bool bTopAvailable = ( iMbY > 0 );
Bool bRightAvailable = ( iMbX < m_iMbPerLine-1 );
Bool bBottomAvailable = ( iMbY < m_iMbPerColumn-1 );
if( bTopAvailable )
{
{
Int iIndex = uiCurrIdx - m_uiMbStride;
ruiMask |= ( m_pcMbData[iIndex].isIntraInSlice( uiCurrentSliceID ) ? 0x01 : 0 );
}
if( bLeftAvailable )
{
Int iIndex = uiCurrIdx - m_uiMbStride - 1;
ruiMask |= ( m_pcMbData[iIndex].isIntraInSlice( uiCurrentSliceID ) ? 0x80 : 0 );
}
if( bRightAvailable )
{
Int iIndex = uiCurrIdx - m_uiMbStride + 1;
ruiMask |= ( m_pcMbData[iIndex].isIntraInSlice( uiCurrentSliceID ) ? 0x02 : 0 );
}
}
if( bBottomAvailable )
{
{
Int iIndex = uiCurrIdx + m_uiMbStride;
ruiMask |= ( m_pcMbData[iIndex].isIntraInSlice( uiCurrentSliceID ) ? 0x10 : 0 );
}
if( bLeftAvailable )
{
Int iIndex = uiCurrIdx + m_uiMbStride - 1;
ruiMask |= ( m_pcMbData[iIndex].isIntraInSlice( uiCurrentSliceID ) ? 0x20 : 0 );
}
if( bRightAvailable )
{
Int iIndex = uiCurrIdx + m_uiMbStride + 1;
ruiMask |= ( m_pcMbData[iIndex].isIntraInSlice( uiCurrentSliceID ) ? 0x08 : 0 );
}
}
if( bLeftAvailable )
{
Int iIndex = uiCurrIdx - 1;
ruiMask |= ( m_pcMbData[iIndex].isIntraInSlice( uiCurrentSliceID ) ? 0x40 : 0 );
}
if( bRightAvailable )
{
Int iIndex = uiCurrIdx + 1;
ruiMask |= ( m_pcMbData[iIndex].isIntraInSlice( uiCurrentSliceID ) ? 0x04 : 0 );
}
return Err::m_nOK;
}
ErrVal
MbDataCtrl::getBoundaryMask_MbAff( Int iMbY, Int iMbX, Bool& rbIntra, UInt& ruiMask, UInt uiCurrentSliceID ) const
{
ROF( iMbY >= 0 && iMbY < m_iMbPerColumn && iMbX >= 0 && iMbX < m_iMbPerLine );
Bool bAvailableTopLeft = false; //0x001
Bool bAvailableTop = false; //0x002
Bool bAvailableTopRight = false; //0x004
Bool bAvailableLeftTop = false; //0x008
Bool bAvailableLeftBot = false; //0x010
Bool bAvailableCurrTop = false; //0x020
Bool bAvailableCurrBot = false; //0x040
Bool bAvailableRightTop = false; //0x080
Bool bAvailableRightBot = false; //0x100
Bool bAvailableBotLeft = false; //0x200
Bool bAvailableBot = false; //0x400
Bool bAvailableBotRight = false; //0x800
Int iMbY0 = ( iMbY >> 1 ) << 1;
Int iMbFieldOffset = ( iMbY - iMbY0 ) * (Int)m_uiMbStride;
Bool bMbPairAvailableTop = ( iMbY0 > 0 );
Bool bMbPairAvailableBot = ( iMbY0 < m_iMbPerColumn - 2 );
Bool bMbPairAvailableLeft = ( iMbX > 0 );
Bool bMbPairAvailableRight = ( iMbX < m_iMbPerLine - 1 );
Int iMbPairTIdxCurr = iMbY0 * (Int)m_uiMbStride + iMbX + (Int)m_uiMbOffset;
Int iMbPairTIdxTop = iMbPairTIdxCurr - (Int)( m_uiMbStride << 1 );
Int iMbPairTIdxBot = iMbPairTIdxCurr + (Int)( m_uiMbStride << 1 );
//===== current macroblock pair =====
{
Int iMbIdxCurrTop = iMbPairTIdxCurr + ( m_pcMbData[iMbPairTIdxCurr].getFieldFlag() ? iMbFieldOffset : 0 );
Int iMbIdxCurrBot = iMbPairTIdxCurr + ( m_pcMbData[iMbPairTIdxCurr].getFieldFlag() ? iMbFieldOffset : m_uiMbStride );
bAvailableCurrTop = m_pcMbData[iMbIdxCurrTop].isIntraInSlice( uiCurrentSliceID );
bAvailableCurrBot = m_pcMbData[iMbIdxCurrBot].isIntraInSlice( uiCurrentSliceID );
}
//===== reset =====
ruiMask = 0;
rbIntra = ( bAvailableCurrTop && bAvailableCurrBot );
ROTRS( rbIntra, Err::m_nOK ); // current field of current macroblock pair is completely intra coded
//===== left macroblock pair =====
if( bMbPairAvailableLeft )
{
Int iMbIdxLeftTop = iMbPairTIdxCurr - 1 + ( m_pcMbData[iMbPairTIdxCurr - 1].getFieldFlag() ? iMbFieldOffset : 0 );
Int iMbIdxLeftBot = iMbPairTIdxCurr - 1 + ( m_pcMbData[iMbPairTIdxCurr - 1].getFieldFlag() ? iMbFieldOffset : m_uiMbStride );
bAvailableLeftTop = m_pcMbData[iMbIdxLeftTop].isIntraInSlice( uiCurrentSliceID );
bAvailableLeftBot = m_pcMbData[iMbIdxLeftBot].isIntraInSlice( uiCurrentSliceID );
}
//===== right macroblock pair =====
if( bMbPairAvailableRight )
{
Int iMbIdxRightTop = iMbPairTIdxCurr + 1 + ( m_pcMbData[iMbPairTIdxCurr + 1].getFieldFlag() ? iMbFieldOffset : 0 );
Int iMbIdxRightBot = iMbPairTIdxCurr + 1 + ( m_pcMbData[iMbPairTIdxCurr + 1].getFieldFlag() ? iMbFieldOffset : m_uiMbStride );
bAvailableRightTop = m_pcMbData[iMbIdxRightTop].isIntraInSlice( uiCurrentSliceID );
bAvailableRightBot = m_pcMbData[iMbIdxRightBot].isIntraInSlice( uiCurrentSliceID );
}
if( bMbPairAvailableTop )
{
//===== top macroblock pair =====
{
Int iMbIdxTop = iMbPairTIdxTop + ( m_pcMbData[iMbPairTIdxTop].getFieldFlag() ? iMbFieldOffset : m_uiMbStride );
bAvailableTop = m_pcMbData[iMbIdxTop].isIntraInSlice( uiCurrentSliceID );
}
//===== top-left macroblock pair =====
if( bMbPairAvailableLeft )
{
Int iMbIdxTopLeft = iMbPairTIdxTop - 1 + ( m_pcMbData[iMbPairTIdxTop - 1].getFieldFlag() ? iMbFieldOffset : m_uiMbStride );
bAvailableTopLeft = m_pcMbData[iMbIdxTopLeft].isIntraInSlice( uiCurrentSliceID );
}
//===== top-right macroblock pair =====
if( bMbPairAvailableRight )
{
Int iMbIdxTopRight = iMbPairTIdxTop + 1 + ( m_pcMbData[iMbPairTIdxTop + 1].getFieldFlag() ? iMbFieldOffset : m_uiMbStride );
bAvailableTopRight = m_pcMbData[iMbIdxTopRight].isIntraInSlice( uiCurrentSliceID );
}
}
if( bMbPairAvailableBot )
{
//===== bottom macroblock pair =====
{
Int iMbIdxBot = iMbPairTIdxBot + ( m_pcMbData[iMbPairTIdxBot].getFieldFlag() ? iMbFieldOffset : 0 );
bAvailableBot = m_pcMbData[iMbIdxBot].isIntraInSlice( uiCurrentSliceID );
}
//===== bottom-left macroblock pair =====
if( bMbPairAvailableLeft )
{
Int iMbIdxBotLeft = iMbPairTIdxBot - 1 + ( m_pcMbData[iMbPairTIdxBot - 1].getFieldFlag() ? iMbFieldOffset : 0 );
bAvailableBotLeft = m_pcMbData[iMbIdxBotLeft].isIntraInSlice( uiCurrentSliceID );
}
//===== bottom-right macroblock pair =====
if( bMbPairAvailableRight )
{
Int iMbIdxBotRight = iMbPairTIdxBot + 1 + ( m_pcMbData[iMbPairTIdxBot + 1].getFieldFlag() ? iMbFieldOffset : 0 );
bAvailableBotRight = m_pcMbData[iMbIdxBotRight].isIntraInSlice( uiCurrentSliceID );
}
}
//===== set mask =====
ruiMask |= ( bAvailableTopLeft ? 0x001 : 0 );
ruiMask |= ( bAvailableTop ? 0x002 : 0 );
ruiMask |= ( bAvailableTopRight ? 0
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?