📄 mbdataaccess.h
字号:
if( ! xIsAvailable( rcMbData ) )
{
return ( !m_rcMbCurr.getBLSkipFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
}
if( rcMbData.isPCM() )
{
return 1;
}
if( bReCalc )
{
return rcMbData.calcBCBP( uiStart, uiStop, cIdx.b4x4() );
}
return rcMbData.getBCBP( cIdx.b4x4() );
}
// chroma block based
B4x4Idx cIdx( m_aucChroma2LumaIdx[ uiBit - 16 ] );
Int iOffset = ( uiBit >= 20 ? 20 : 16 );
const MbData& rcMbData = xGetBlockAbove( cIdx );
if( ! xIsAvailable( rcMbData ) )
{
return ( !m_rcMbCurr.getBLSkipFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
}
if( rcMbData.isPCM() )
{
return 1;
}
if( bReCalc )
{
return rcMbData.calcBCBP( uiStart, uiStop, m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] + iOffset );
}
return rcMbData.getBCBP( m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] + iOffset );
}
__inline UInt MbDataAccess::getCtxCodedBlockBit( UInt uiBitPos, UInt uiStart, UInt uiStop, Bool bReCalc ) const
{
UInt uiCtx;
uiCtx = xGetLeftCodedBlockBit ( uiBitPos, uiStart, uiStop, bReCalc );
uiCtx += xGetAboveCodedBlockBit( uiBitPos, uiStart, uiStop, bReCalc ) << 1;
return uiCtx;
}
__inline Void MbDataAccess::xGetColocatedMvRefIdx( Mv& rcMv, SChar& rscRefIdx, LumaIdx cIdx ) const
{
ListIdx eListIdx = LIST_0;
MvRefConversion eMvRefConversion = ONE_TO_ONE;
const MbData& rcMbColocated = xGetBlockColocated( cIdx, eMvRefConversion );
if( ( rscRefIdx = rcMbColocated.getMbMotionData( eListIdx ).getRefIdx( cIdx ) ) < BLOCK_NOT_AVAILABLE )
{
eListIdx = LIST_1;
rscRefIdx = rcMbColocated.getMbMotionData( eListIdx ).getRefIdx( cIdx );
}
if( rscRefIdx < BLOCK_NOT_AVAILABLE )
{
rcMv = Mv::ZeroMv();
}
else
{
rcMv = rcMbColocated.getMbMotionData( eListIdx ).getMv( cIdx );
}
}
__inline Void MbDataAccess::xGetColocatedMvsRefIdxNonInterlaced( Mv acMv[], SChar& rscRefIdx, ParIdx8x8 eParIdx ) const
{
ListIdx eListIdx = LIST_0;
const MbData& rcMbColocated = xGetBlockColocatedNonInterlaced();
if( ( rscRefIdx = rcMbColocated.getMbMotionData( eListIdx ).getRefIdx( eParIdx ) ) < BLOCK_NOT_AVAILABLE )
{
eListIdx = LIST_1;
rscRefIdx = rcMbColocated.getMbMotionData( eListIdx ).getRefIdx( eParIdx );
}
if( rscRefIdx < BLOCK_NOT_AVAILABLE )
{
acMv[0] = acMv[1] = acMv[2] = acMv[3] = Mv::ZeroMv();
}
else
{
acMv[0] = rcMbColocated.getMbMotionData( eListIdx ).getMv( eParIdx, SPART_4x4_0 );
acMv[1] = rcMbColocated.getMbMotionData( eListIdx ).getMv( eParIdx, SPART_4x4_1 );
acMv[2] = rcMbColocated.getMbMotionData( eListIdx ).getMv( eParIdx, SPART_4x4_2 );
acMv[3] = rcMbColocated.getMbMotionData( eListIdx ).getMv( eParIdx, SPART_4x4_3 );
}
}
__inline
const RefPicIdc&
MbDataAccess::xGetColocatedMvRefPic( Mv& rcMv, SChar& rscRefIdx, LumaIdx cIdx ) const
{
ListIdx eListIdx = LIST_0;
MvRefConversion eMvRefConversion = ONE_TO_ONE;
const MbData& rcMbColocated = xGetBlockColocated( cIdx, eMvRefConversion );
if( ( rscRefIdx = rcMbColocated.getMbMotionData( eListIdx ).getRefIdx( cIdx ) ) < BLOCK_NOT_AVAILABLE )
{
eListIdx = LIST_1;
rscRefIdx = rcMbColocated.getMbMotionData( eListIdx ).getRefIdx( cIdx );
}
if( rscRefIdx < BLOCK_NOT_AVAILABLE )
{
rcMv = Mv::ZeroMv();
}
else
{
rcMv = rcMbColocated.getMbMotionData( eListIdx ).getMv( cIdx );
}
//--- mv scaling ----
if( eMvRefConversion == FRM_TO_FLD )
{
rcMv.setFrameToFieldPredictor();
}
else if( eMvRefConversion == FLD_TO_FRM )
{
rcMv.setFieldToFramePredictor();
}
return rcMbColocated.getMbMotionData( eListIdx ).getRefPicIdc( cIdx );
}
__inline
const RefPicIdc&
MbDataAccess::xGetColocatedMvsRefPicNonInterlaced( Mv acMv[], SChar& rscRefIdx, ParIdx8x8 eParIdx ) const
{
ListIdx eListIdx = LIST_0;
const MbData& rcMbColocated = xGetBlockColocatedNonInterlaced();
if( ( rscRefIdx = rcMbColocated.getMbMotionData( eListIdx ).getRefIdx( eParIdx ) ) < BLOCK_NOT_AVAILABLE )
{
eListIdx = LIST_1;
rscRefIdx = rcMbColocated.getMbMotionData( eListIdx ).getRefIdx( eParIdx );
}
if( rscRefIdx < BLOCK_NOT_AVAILABLE )
{
acMv[0] = acMv[1] = acMv[2] = acMv[3] = Mv::ZeroMv();
}
else
{
acMv[0] = rcMbColocated.getMbMotionData( eListIdx ).getMv( eParIdx, SPART_4x4_0 );
acMv[1] = rcMbColocated.getMbMotionData( eListIdx ).getMv( eParIdx, SPART_4x4_1 );
acMv[2] = rcMbColocated.getMbMotionData( eListIdx ).getMv( eParIdx, SPART_4x4_2 );
acMv[3] = rcMbColocated.getMbMotionData( eListIdx ).getMv( eParIdx, SPART_4x4_3 );
}
return rcMbColocated.getMbMotionData( eListIdx ).getRefPicIdc( eParIdx );
}
__inline const MbData& MbDataAccess::xGetMbLeft() const
{
if( m_rcMbCurr.getFieldFlag() == m_rcMbLeft.getFieldFlag() ) // same frame/field mode
{
return m_rcMbLeft;
}
return ( isTopMb() ? m_rcMbLeft : m_rcMbAboveLeft );
}
__inline const MbData& MbDataAccess::xGetMbAbove() const
{
if( ! m_bMbAff )
{
return m_rcMbAbove;
}
if( ! m_rcMbCurr.getFieldFlag() || ( isTopMb() && ! m_rcMbAbove.getFieldFlag() ) )
{
return m_rcMbAbove;
}
return m_rcMbAboveAbove;
}
__inline const MbData& MbDataAccess::xGetBlockLeft( LumaIdx& rcIdx ) const
{
if( rcIdx.x() ) // inside current macroblock
{
rcIdx = rcIdx + CURR_MB_LEFT_NEIGHBOUR;
return m_rcMbCurr;
}
if( ! m_bMbAff )
{
rcIdx = rcIdx + LEFT_MB_LEFT_NEIGHBOUR;
return m_rcMbLeft;
}
if( m_rcMbCurr.getFieldFlag() == m_rcMbLeft.getFieldFlag() ) // same frame/field mode
{
rcIdx = rcIdx + LEFT_MB_LEFT_NEIGHBOUR;
return m_rcMbLeft;
}
if( m_rcMbCurr.getFieldFlag() && ! m_rcMbLeft.getFieldFlag() ) // current field, neighbour frame
{
Int i4x4 = rcIdx.b4x4();
rcIdx = B4x4Idx( i4x4 % 8 ? 11 : 3 );
return ( i4x4 > 4 && isTopMb() ? m_rcMbBelowLeft : i4x4 <= 4 && ! isTopMb() ? m_rcMbAboveLeft : m_rcMbLeft );
}
// current frame, neighbour field
if( isTopMb() )
{
rcIdx = B4x4Idx( rcIdx.b4x4() > 4 ? 7 : 3 );
return m_rcMbLeft;
}
rcIdx = B4x4Idx( rcIdx.b4x4() > 4 ? 15 : 11 );
return m_rcMbAboveLeft;
}
__inline const MbData& MbDataAccess::xGetBlockLeftBottom( LumaIdx& rcIdx ) const
{
if( rcIdx.x() ) // inside current macroblock
{
rcIdx = rcIdx + CURR_MB_LEFT_NEIGHBOUR;
return m_rcMbCurr;
}
if( ! m_bMbAff )
{
rcIdx = rcIdx + LEFT_MB_LEFT_NEIGHBOUR;
return m_rcMbLeft;
}
if( m_rcMbCurr.getFieldFlag() == m_rcMbLeft.getFieldFlag() ) // same frame/field mode
{
rcIdx = rcIdx + LEFT_MB_LEFT_NEIGHBOUR;
return m_rcMbLeft;
}
if( m_rcMbCurr.getFieldFlag() && ! m_rcMbLeft.getFieldFlag() ) // current field, neighbour frame
{
Int i4x4 = rcIdx.b4x4();
rcIdx = B4x4Idx( i4x4 % 8 ? 15 : 7 );
return ( i4x4 > 4 && isTopMb() ? m_rcMbBelowLeft : i4x4 <= 4 && ! isTopMb() ? m_rcMbAboveLeft : m_rcMbLeft );
}
// current frame, neighbour field
if( isTopMb() )
{
rcIdx = B4x4Idx( rcIdx.b4x4() > 4 ? 7 : 3 );
return m_rcMbBelowLeft;
}
rcIdx = B4x4Idx( rcIdx.b4x4() > 4 ? 15 : 11 );
return m_rcMbLeft;
}
__inline const MbData& MbDataAccess::xGetBlockAbove( LumaIdx& rcIdx ) const
{
if( rcIdx.y() ) // inside current macroblock
{
rcIdx = rcIdx + CURR_MB_ABOVE_NEIGHBOUR;
return m_rcMbCurr;
}
// outside current macroblock
rcIdx = rcIdx + ABOVE_MB_ABOVE_NEIGHBOUR;
if( ! m_bMbAff )
{
return m_rcMbAbove;
}
if( ! m_rcMbCurr.getFieldFlag() || ( isTopMb() && ! m_rcMbAbove.getFieldFlag() ) )
{
return m_rcMbAbove;
}
return m_rcMbAboveAbove;
}
__inline const MbData& MbDataAccess::xGetBlockAboveLeft( LumaIdx& cIdx ) const
{
if( cIdx.x() )
{
if( cIdx.y() ) // inside current macroblock
{
cIdx = cIdx + CURR_MB_ABOVE_NEIGHBOUR + CURR_MB_LEFT_NEIGHBOUR;
return m_rcMbCurr;
}
// inside above macroblock
cIdx = cIdx + CURR_MB_LEFT_NEIGHBOUR;
return xGetBlockAbove( cIdx );
}
if( cIdx.y() ) // inside left macroblock
{
cIdx = cIdx + CURR_MB_ABOVE_NEIGHBOUR;
return xGetBlockLeftBottom( cIdx );
}
// inside above left macroblock
cIdx = B4x4Idx( ! m_rcMbCurr.getFieldFlag() && ! isTopMb() && m_rcMbAboveLeft.getFieldFlag() ? 7 : 15 );
if( ! m_rcMbCurr.getFieldFlag() && ! isTopMb() && m_rcMbAboveLeft.getFieldFlag() )
{
return m_rcMbLeft;
}
if( ! m_rcMbCurr.getFieldFlag() || ( isTopMb() && ! m_rcMbAboveLeft.getFieldFlag() ) )
{
return m_rcMbAboveLeft;
}
return m_rcMbAboveAboveLeft;
}
__inline const MbData& MbDataAccess::xGetBlockAboveRight( LumaIdx& cIdx ) const
{
if( cIdx.x() < 3 )
{
if( cIdx.y() ) // inside current macroblock
{
cIdx = cIdx + CURR_MB_ABOVE_NEIGHBOUR + CURR_MB_RIGHT_NEIGHBOUR;
if( cIdx.b4x4() == 2 || cIdx.b4x4() == 10 )
{
return m_rcMbUnavailable;
}
return m_rcMbCurr;
}
// inside above macroblock pair
cIdx = cIdx + CURR_MB_RIGHT_NEIGHBOUR;
return xGetBlockAbove( cIdx );
}
if( cIdx.y() || ( ! m_rcMbCurr.getFieldFlag() && ! isTopMb() ) ) // not available ( inside right mb or inside above right macroblock for a bottom macroblock )
{
cIdx = cIdx + RIGHT_MB_RIGHT_NEIGHBOUR;
return m_rcMbUnavailable;
}
// inside above rigth macroblock pair
cIdx = B4x4Idx( 12 );
if( ! m_rcMbCurr.getFieldFlag() || ( isTopMb() && ! m_rcMbAboveRight.getFieldFlag() ) )
{
return m_rcMbAboveRight;
}
return m_rcMbAboveAboveRight;
}
__inline const MbData& MbDataAccess::xGetBlockColocated( LumaIdx& rcIdx, MvRefConversion& eMvRefConversion ) const
{
Bool bCurrField = getSH().getFieldPicFlag() || m_rcMbCurr. getFieldFlag();
Bool bColField = m_bColocatedField || m_rcMbColocatedTop.getFieldFlag();
if( bCurrField == bColField )
{
eMvRefConversion = ONE_TO_ONE;
return ( m_bIsTopRowMb ? m_rcMbColocatedTop : m_rcMbColocatedBot );
}
if( bCurrField )
{
eMvRefConversion = FRM_TO_FLD;
const MbData& rcCol = ( rcIdx.b4x4() < 8 ? m_rcMbColocatedTop : m_rcMbColocatedBot );
rcIdx = B4x4Idx( rcIdx.x() + 4 * ( ( 2 * rcIdx.y() ) % 4 ) );
return rcCol;
}
eMvRefConversion = FLD_TO_FRM;
rcIdx = B4x4Idx( rcIdx.x() + 4 * ( rcIdx.y() / 2 ) + ( m_bIsTopRowMb ? 0 : 8 ) );
return ( m_bUseTopField ? m_rcMbColocatedTop : m_rcMbColocatedBot );
}
__inline const MbData& MbDataAccess::xGetBlockColocatedNonInterlaced() const
{
return ( m_bIsTopRowMb ? m_rcMbColocatedTop : m_rcMbColocatedBot );
}
H264AVC_NAMESPACE_END
#endif // !defined(AFX_MBDATAACCESS_H__710205A4_CFE9_496D_A469_C47EC8D2FBD2__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -