📄 mbdataaccess.h
字号:
#endif
if( rcMbData.isIntra16x16() )
{
return rcMbData.getCbpChroma16x16();
}
return rcMbData.getMbCbp() >> 4;
}
__inline UInt MbDataAccess::getAboveChromaCbp() const
{
const MbData& rcMbData = xGetMbAbove();
#if INDEPENDENT_PARSING
if( m_rcSliceHeader.getSPS().getIndependentParsing() )
{
if( !rcMbData.getBLSkipFlag() && !rcMbData.getBLQRefFlag() && rcMbData.isIntra16x16() )
{
return rcMbData.getCbpChroma16x16();
}
}
else
#endif
if( rcMbData.isIntra16x16() )
{
return rcMbData.getCbpChroma16x16();
}
return rcMbData.getMbCbp() >> 4;
}
__inline UInt MbDataAccess::getAutoCbp() const
{
UInt uiCbp = m_rcMbCurr.getMbCbp();
if( m_rcMbCurr.isIntra16x16() )
{
uiCbp = ( m_rcMbCurr.isAcCoded() ? 15 : 0 ); //luma
uiCbp += ( m_rcMbCurr.getCbpChroma16x16() << 4 ); //chroma
}
return uiCbp;
}
__inline UInt MbDataAccess::getLeftLumaCbpFGS( LumaIdx cIdx ) const
{
const MbData& rcMbData = xGetBlockLeft( cIdx );
if( ! xIsAvailable( rcMbData ) )
{
return 1;
}
return ( rcMbData.getMbCbp() >> m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] ) & 1;
}
__inline UInt MbDataAccess::getAboveLumaCbpFGS( LumaIdx cIdx ) const
{
const MbData& rcMbData = xGetBlockAbove( cIdx );
if( ! xIsAvailable( rcMbData ) )
{
return 1;
}
return ( rcMbData.getMbCbp() >> m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] ) & 1;
}
__inline UInt MbDataAccess::getLeftChromaCbpFGS() const
{
const MbData& rcMbData = xGetMbLeft();
return rcMbData.getMbCbp() >> 4;
}
__inline UInt MbDataAccess::getAboveChromaCbpFGS() const
{
const MbData& rcMbData = xGetMbAbove();
return rcMbData.getMbCbp() >> 4;
}
__inline UInt MbDataAccess::xGetLeftCodedBlockBit( UInt uiBit ) const
{
AOT_DBG( uiBit > 30 );
if( uiBit > 26 )
{
B4x4Idx cIdx( m_aucChroma2LumaIdx[ uiBit - 27 ] );
const MbData& rcMbData = xGetBlockLeft( cIdx );
if( ! xIsAvailable( rcMbData ) )
{
#if INDEPENDENT_PARSING
if( m_rcSliceHeader.getSPS().getIndependentParsing() )
{
return ( !m_rcMbCurr.getBLSkipFlag() && !m_rcMbCurr.getBLQRefFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
}
#endif
return m_rcMbCurr.isIntra() ? 1 : 0;
}
return rcMbData.getBCBP( m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] + 27 );
}
if( uiBit >= 24 ) // macroblock based stuff
{
const MbData& rcMbData = xGetMbLeft();
if( ! xIsAvailable( rcMbData ) )
{
#if INDEPENDENT_PARSING
if( m_rcSliceHeader.getSPS().getIndependentParsing() )
{
return ( !m_rcMbCurr.getBLSkipFlag() && !m_rcMbCurr.getBLQRefFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
}
#endif
return m_rcMbCurr.isIntra() ? 1 : 0;
}
return rcMbData.getBCBP( uiBit );
}
if( uiBit < 16 ) // luma block based
{
B4x4Idx cIdx( uiBit );
const MbData& rcMbData = xGetBlockLeft( cIdx );
if( ! xIsAvailable( rcMbData ) )
{
#if INDEPENDENT_PARSING
if( m_rcSliceHeader.getSPS().getIndependentParsing() )
{
return ( !m_rcMbCurr.getBLSkipFlag() && !m_rcMbCurr.getBLQRefFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
}
#endif
return m_rcMbCurr.isIntra() ? 1 : 0;
}
return rcMbData.getBCBP( cIdx.b4x4() );
}
// chroma block based
B4x4Idx cIdx( m_aucChroma2LumaIdx[ uiBit - 16 ] );
Int iOffset = ( uiBit >= 20 ? 20 : 16 );
const MbData& rcMbData = xGetBlockLeft( cIdx );
if( ! xIsAvailable( rcMbData ) )
{
#if INDEPENDENT_PARSING
if( m_rcSliceHeader.getSPS().getIndependentParsing() )
{
return ( !m_rcMbCurr.getBLSkipFlag() && !m_rcMbCurr.getBLQRefFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
}
#endif
return m_rcMbCurr.isIntra() ? 1 : 0;
}
return rcMbData.getBCBP( m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] + iOffset );
}
__inline UInt MbDataAccess::xGetAboveCodedBlockBit( UInt uiBit ) const
{
AOT_DBG( uiBit > 30 );
if( uiBit > 26 )
{
B4x4Idx cIdx( m_aucChroma2LumaIdx[ uiBit - 27 ] );
const MbData& rcMbData = xGetBlockAbove( cIdx );
if( ! xIsAvailable( rcMbData ) )
{
#if INDEPENDENT_PARSING
if( m_rcSliceHeader.getSPS().getIndependentParsing() )
{
return ( !m_rcMbCurr.getBLSkipFlag() && !m_rcMbCurr.getBLQRefFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
}
#endif
return m_rcMbCurr.isIntra() ? 1 : 0;
}
return rcMbData.getBCBP( m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] + 27 );
}
if( uiBit >= 24 ) // macroblock based stuff
{
const MbData& rcMbData = xGetMbAbove();
if( ! xIsAvailable( rcMbData ) )
{
#if INDEPENDENT_PARSING
if( m_rcSliceHeader.getSPS().getIndependentParsing() )
{
return ( !m_rcMbCurr.getBLSkipFlag() && !m_rcMbCurr.getBLQRefFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
}
#endif
return m_rcMbCurr.isIntra() ? 1 : 0;
}
return rcMbData.getBCBP( uiBit );
}
if( uiBit < 16 ) // luma block based
{
B4x4Idx cIdx( uiBit );
const MbData& rcMbData = xGetBlockAbove( cIdx );
if( ! xIsAvailable( rcMbData ) )
{
#if INDEPENDENT_PARSING
if( m_rcSliceHeader.getSPS().getIndependentParsing() )
{
return ( !m_rcMbCurr.getBLSkipFlag() && !m_rcMbCurr.getBLQRefFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
}
#endif
return m_rcMbCurr.isIntra() ? 1 : 0;
}
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 ) )
{
#if INDEPENDENT_PARSING
if( m_rcSliceHeader.getSPS().getIndependentParsing() )
{
return ( !m_rcMbCurr.getBLSkipFlag() && !m_rcMbCurr.getBLQRefFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
}
#endif
return m_rcMbCurr.isIntra() ? 1 : 0;
}
return rcMbData.getBCBP( m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] + iOffset );
}
__inline UInt MbDataAccess::getCtxCodedBlockBit( UInt uiBitPos ) const
{
UInt uiCtx;
uiCtx = xGetLeftCodedBlockBit ( uiBitPos );
uiCtx += xGetAboveCodedBlockBit( uiBitPos ) << 1;
return uiCtx;
}
__inline Void MbDataAccess::xGetColocatedMvRefIdx( Mv& rcMv, SChar& rscRefIdx, LumaIdx cIdx ) const
{
ListIdx eListIdx = LIST_0;
if( ( rscRefIdx = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getRefIdx( cIdx ) ) < 1 )
{
eListIdx = LIST_1;
rscRefIdx = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getRefIdx( cIdx );
}
if( rscRefIdx < 1 )
{
rcMv = Mv::ZeroMv();
}
else
{
rcMv = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getMv( cIdx );
}
}
__inline Void MbDataAccess::xGetColocatedMvsRefIdxNonInterlaced( Mv acMv[], SChar& rscRefIdx, ParIdx8x8 eParIdx ) const
{
ListIdx eListIdx = LIST_0;
if( ( rscRefIdx = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getRefIdx( eParIdx ) ) < 1 )
{
eListIdx = LIST_1;
rscRefIdx = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getRefIdx( eParIdx );
}
if( rscRefIdx < 1 )
{
acMv[0] = acMv[1] = acMv[2] = acMv[3] = Mv::ZeroMv();
}
else
{
acMv[0] = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getMv( eParIdx, SPART_4x4_0 );
acMv[1] = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getMv( eParIdx, SPART_4x4_1 );
acMv[2] = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getMv( eParIdx, SPART_4x4_2 );
acMv[3] = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getMv( eParIdx, SPART_4x4_3 );
}
}
__inline const RefPic& MbDataAccess::xGetColocatedMvRefPic( Mv& rcMv, SChar& rscRefIdx, LumaIdx cIdx ) const
{
ListIdx eListIdx = LIST_0;
if( ( rscRefIdx = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getRefIdx( cIdx ) ) < 1 )
{
eListIdx = LIST_1;
rscRefIdx = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getRefIdx( cIdx );
}
if( rscRefIdx < 1 )
{
rcMv = Mv::ZeroMv();
}
else
{
rcMv = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getMv( cIdx );
}
return m_rcMbColocated.getMbMotionDataBase( eListIdx ).getRefPic( cIdx );
}
__inline const RefPic& MbDataAccess::xGetColocatedMvsRefPicNonInterlaced( Mv acMv[], SChar& rscRefIdx, ParIdx8x8 eParIdx ) const
{
ListIdx eListIdx = LIST_0;
if( ( rscRefIdx = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getRefIdx( eParIdx ) ) < 1 )
{
eListIdx = LIST_1;
rscRefIdx = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getRefIdx( eParIdx );
}
if( rscRefIdx < 1 )
{
acMv[0] = acMv[1] = acMv[2] = acMv[3] = Mv::ZeroMv();
}
else
{
acMv[0] = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getMv( eParIdx, SPART_4x4_0 );
acMv[1] = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getMv( eParIdx, SPART_4x4_1 );
acMv[2] = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getMv( eParIdx, SPART_4x4_2 );
acMv[3] = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getMv( eParIdx, SPART_4x4_3 );
}
return m_rcMbColocated.getMbMotionDataBase( eListIdx ).getRefPic( eParIdx );
}
__inline const MbData& MbDataAccess::xGetMbLeft() const
{
return m_rcMbLeft;
}
__inline const MbData& MbDataAccess::xGetMbAbove() const
{
return m_rcMbAbove;
}
__inline const MbData& MbDataAccess::xGetBlockLeft( LumaIdx& rcIdx ) const
{
if( rcIdx.x() ) // inside current macroblock
{
rcIdx = rcIdx + CURR_MB_LEFT_NEIGHBOUR;
return m_rcMbCurr;
}
rcIdx = rcIdx + LEFT_MB_LEFT_NEIGHBOUR;
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;
return m_rcMbAbove;
}
__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 + ABOVE_MB_ABOVE_NEIGHBOUR + CURR_MB_LEFT_NEIGHBOUR;
return m_rcMbAbove;
}
if( cIdx.y() ) // inside left macroblock
{
cIdx = cIdx + CURR_MB_ABOVE_NEIGHBOUR + LEFT_MB_LEFT_NEIGHBOUR;
return m_rcMbLeft;
}
// inside above left macroblock
cIdx = B4x4Idx( 15 );
return m_rcMbAboveLeft;
}
__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 + ABOVE_MB_ABOVE_NEIGHBOUR + CURR_MB_RIGHT_NEIGHBOUR;
return m_rcMbAbove;
}
if( cIdx.y() )
{
cIdx = cIdx + CURR_MB_ABOVE_NEIGHBOUR + RIGHT_MB_RIGHT_NEIGHBOUR;
return m_rcMbUnavailable;
}
// inside above rigth macroblock pair
cIdx = B4x4Idx( 12 );
return m_rcMbAboveRight;
}
H264AVC_NAMESPACE_END
#endif // !defined(AFX_MBDATAACCESS_H__710205A4_CFE9_496D_A469_C47EC8D2FBD2__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -