📄 mbdataaccess.h
字号:
const MbData& rcMbData = xGetBlockAbove( cIdx );
rcMv = rcMbData.getMbMvdData( eListIdx ).getMv( cIdx );
if( rcMbData.getFieldFlag() && ! m_rcMbCurr.getFieldFlag() )
{
rcMv.setVer( rcMv.getVer() * 2 );
}
else if( ! rcMbData.getFieldFlag() && m_rcMbCurr.getFieldFlag() )
{
rcMv.setVer( rcMv.getVer() / 2 );
}
}
__inline UInt MbDataAccess::getCtxChromaPredMode() const
{
UInt uiCtx;
uiCtx = ((xGetMbLeft ().getChromaPredMode() > 0) ? 1 : 0);
uiCtx += ((xGetMbAbove().getChromaPredMode() > 0) ? 1 : 0);
// Support independent parsing of layers
// -- Current layer blocks will inherit the
// -- prediction modes from the lower layer.
// -- However, this happens after parsing.
if( getSH().getTCoeffLevelPredictionFlag() )
{
uiCtx -= ( xGetMbLeft().getChromaPredMode() > 0 && xGetMbLeft().isIntraBL() ) ? 1 : 0;
uiCtx -= ( xGetMbAbove().getChromaPredMode() > 0 && xGetMbAbove().isIntraBL() ) ? 1 : 0;
}
return uiCtx;
}
__inline Int MbDataAccess::mostProbableIntraPredMode( LumaIdx cIdx )
{
B4x4Idx cIdxL( cIdx.b4x4() );
B4x4Idx cIdxA( cIdx.b4x4() );
const MbData& rcMbDataLeft = xGetBlockLeft( cIdxL );
Int iLeftPredMode = ( xIsAvailableIntra( rcMbDataLeft ) ? rcMbDataLeft.intraPredMode( cIdxL ) : OUTSIDE);
const MbData& rcMbDataAbove = xGetBlockAbove( cIdxA );
Int iAbovePredMode = ( xIsAvailableIntra( rcMbDataAbove ) ? rcMbDataAbove.intraPredMode( cIdxA ) : OUTSIDE);
Int iMostProbable = min( iLeftPredMode, iAbovePredMode );
return ( OUTSIDE == iMostProbable ) ? DC_PRED : iMostProbable;
}
__inline Int MbDataAccess::encodeIntraPredMode( LumaIdx cIdx )
{
const Int iMostProbable = mostProbableIntraPredMode( cIdx );
const Int iIntraPredMode = m_rcMbCurr.intraPredMode ( cIdx );
ROTRS( iMostProbable == iIntraPredMode, -1 )
return (iIntraPredMode < iMostProbable) ? iIntraPredMode : iIntraPredMode-1;
}
__inline Int MbDataAccess::decodeIntraPredMode( LumaIdx cIdx )
{
const Int iMostProbable = mostProbableIntraPredMode( cIdx );
const Int iIntraPredMode = m_rcMbCurr.intraPredMode ( cIdx );
ROTRS( -1 == iIntraPredMode, iMostProbable )
return (iIntraPredMode < iMostProbable) ? iIntraPredMode : iIntraPredMode+1;
}
__inline UInt MbDataAccess::getCtxFieldFlag() const
{
UInt uiCtx = (m_rcMbLeft.getFieldFlag() ? 1: 0);
if( m_bMbAff && ! isTopMb() )
{
uiCtx += (m_rcMbAboveAbove.getFieldFlag() ? 1: 0);
}
else
{
uiCtx += (m_rcMbAbove.getFieldFlag() ? 1: 0);
}
return uiCtx;
}
__inline UInt MbDataAccess::getCtxMbType() const
{
const MbData& rcMbLeft = xGetMbLeft ();
const MbData& rcMbAbove = xGetMbAbove();
Bool bSkippedLeft = ( !rcMbLeft .getBLSkipFlag() && rcMbLeft .isSkiped() );
Bool bSkippedAbove = ( !rcMbAbove.getBLSkipFlag() && rcMbAbove.isSkiped() );
UInt uiCtx = ( bSkippedLeft ? 0 : 1 );
uiCtx += ( bSkippedAbove ? 0 : 1 );
return uiCtx;
}
__inline UInt MbDataAccess::getCtx8x8Flag( UInt uiStart, UInt uiStop ) const
{
const MbData &rcLeft = xGetMbLeft();
const MbData &rcAbove = xGetMbAbove();
UInt uiCtx = 0;
Bool bLeftTs8x8 = rcLeft.isTransformSize8x8();
Bool bLeftIntra4x4 = rcLeft.isIntra4x4();
Bool bLeftCoeff = (rcLeft.calcMbCbp( uiStart, uiStop ) & 0x0F) != 0;
if( bLeftTs8x8 && (bLeftIntra4x4 || bLeftCoeff) )
{
uiCtx++;
}
Bool bAboveTs8x8 = rcAbove.isTransformSize8x8();
Bool bAboveIntra4x4 = rcAbove.isIntra4x4();
Bool bAboveCoeff = (rcAbove.calcMbCbp( uiStart, uiStop ) & 0x0F) != 0;
if( bAboveTs8x8 && (bAboveIntra4x4 || bAboveCoeff) )
{
uiCtx++;
}
return uiCtx;
}
__inline UInt MbDataAccess::getCtx8x8Flag() const
{
UInt uiCtx = ( xGetMbLeft ().isTransformSize8x8() ? 1 : 0);
uiCtx += ( xGetMbAbove().isTransformSize8x8() ? 1 : 0);
return uiCtx;
}
__inline UInt MbDataAccess::getCtxMbSkipped() const
{
const Bool bFieldFlag = m_rcMbCurr.getFieldFlag();
if( m_bMbAff && ( isTopMb() || m_rcMbComplementary.getSkipFlag() ) )
{
m_rcMbCurr.setFieldFlag( getDefaultFieldFlag() );
}
const MbData& rcMbDataLeft = xGetMbLeft();
const MbData& rcMbDataAbove = xGetMbAbove();
UInt uiCtx = (( rcMbDataLeft .getSkipFlag()) ? 0 : 1);
uiCtx += (( rcMbDataAbove.getSkipFlag()) ? 0 : 1);
m_rcMbCurr.setFieldFlag( bFieldFlag );
return uiCtx;
}
__inline UInt MbDataAccess::getCtxBLSkipFlag() const
{
const MbData& rcMbDataLeft = xGetMbLeft ();
const MbData& rcMbDataAbove = xGetMbAbove ();
UInt uiCtx = ( rcMbDataLeft .getBLSkipFlag() ? 0 : 1 );
uiCtx += ( rcMbDataAbove.getBLSkipFlag() ? 0 : 1 );
return uiCtx;
}
__inline UInt MbDataAccess::getCtxDirectMbWoCoeff() const
{
const MbData& rcMbDataLeft = xGetMbLeft();
const MbData& rcMbDataAbove = xGetMbAbove();
UInt uiCtx = (( rcMbDataLeft .getSkipFlag()) ? 0 : 1);
uiCtx += (( rcMbDataAbove.getSkipFlag()) ? 0 : 1);
return uiCtx;
}
__inline UInt MbDataAccess::getCtxMbIntra4x4() const
{
const MbData& rcMbDataLeft = xGetMbLeft();
const MbData& rcMbDataAbove = xGetMbAbove();
Bool bIntraLeft = ( !xIsAvailable( rcMbDataLeft ) || ( !rcMbDataLeft .getBLSkipFlag() && rcMbDataLeft .isIntra4x4() ) );
Bool bIntraAbove = ( !xIsAvailable( rcMbDataAbove ) || ( !rcMbDataAbove.getBLSkipFlag() && rcMbDataAbove.isIntra4x4() ) );
UInt uiCtx = ( bIntraLeft ? 0 : 1 );
uiCtx += ( bIntraAbove ? 0 : 1 );
return uiCtx;
}
__inline UInt MbDataAccess::getCtxRefIdx( ListIdx eLstIdx, ParIdx8x8 eParIdx ) const
{
UInt uiCtx;
uiCtx = xGetRefIdxAbove( eLstIdx, eParIdx ) > 1 ? 2 : 0;
uiCtx += xGetRefIdxLeft ( eLstIdx, eParIdx ) > 1 ? 1 : 0;
return uiCtx;
}
__inline UInt MbDataAccess::getLeftLumaCbp( LumaIdx cIdx, UInt uiStart, UInt uiStop, Bool bReCalc ) const
{
const MbData& rcMbData = xGetBlockLeft( cIdx );
if( ! xIsAvailable( rcMbData ) )
{
return 1;
}
if( !rcMbData.getBLSkipFlag() && rcMbData.isIntra16x16() )
{
return rcMbData.isAcCoded() ? 1 : 0;
}
if( rcMbData.isPCM() )
{
return 1;
}
if( bReCalc )
{
return ( rcMbData.calcMbCbp( uiStart, uiStop ) >> m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] ) & 1;
}
return ( rcMbData.getMbCbp() >> m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] ) & 1;
}
__inline UInt MbDataAccess::getAboveLumaCbp( LumaIdx cIdx, UInt uiStart, UInt uiStop, Bool bReCalc ) const
{
const MbData& rcMbData = xGetBlockAbove( cIdx );
if( ! xIsAvailable( rcMbData ) )
{
return 1;
}
if( !rcMbData.getBLSkipFlag() && rcMbData.isIntra16x16() )
{
return rcMbData.isAcCoded() ? 1 : 0;
}
if( rcMbData.isPCM() )
{
return 1;
}
if( bReCalc )
{
return ( rcMbData.calcMbCbp( uiStart, uiStop ) >> m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] ) & 1;
}
return ( rcMbData.getMbCbp() >> m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] ) & 1;
}
__inline UInt MbDataAccess::getLeftChromaCbp( UInt uiStart, UInt uiStop, Bool bReCalc ) const
{
const MbData& rcMbData = xGetMbLeft();
if( !rcMbData.getBLSkipFlag() && rcMbData.isIntra16x16() )
{
return rcMbData.getCbpChroma16x16();
}
if( rcMbData.isPCM() )
{
return 2;
}
if( bReCalc )
{
return rcMbData.calcMbCbp( uiStart, uiStop ) >> 4;
}
return rcMbData.getMbCbp() >> 4;
}
__inline UInt MbDataAccess::getAboveChromaCbp( UInt uiStart, UInt uiStop, Bool bReCalc ) const
{
const MbData& rcMbData = xGetMbAbove();
if( !rcMbData.getBLSkipFlag() && rcMbData.isIntra16x16() )
{
return rcMbData.getCbpChroma16x16();
}
if( rcMbData.isPCM() )
{
return 2;
}
if( bReCalc )
{
return rcMbData.calcMbCbp( uiStart, uiStop ) >> 4;
}
return rcMbData.getMbCbp() >> 4;
}
__inline UInt MbDataAccess::xGetLeftCodedBlockBit( UInt uiBit, UInt uiStart, UInt uiStop, Bool bReCalc ) const
{
AOT( uiBit > 26 );
if( uiBit >= 24 ) // macroblock based stuff
{
const MbData& rcMbData = xGetMbLeft();
if( ! xIsAvailable( rcMbData ) )
{
return ( !m_rcMbCurr.getBLSkipFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
}
if( rcMbData.isPCM() )
{
return 1;
}
if( bReCalc )
{
return rcMbData.calcBCBP( uiStart, uiStop, uiBit );
}
return rcMbData.getBCBP( uiBit );
}
if( uiBit < 16 ) // luma block based
{
B4x4Idx cIdx( uiBit );
const MbData& rcMbData = xGetBlockLeft( 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, 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 = xGetBlockLeft( 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::xGetAboveCodedBlockBit( UInt uiBit, UInt uiStart, UInt uiStop, Bool bReCalc ) const
{
AOT( uiBit > 26 );
if( uiBit >= 24 ) // macroblock based stuff
{
const MbData& rcMbData = xGetMbAbove();
if( ! xIsAvailable( rcMbData ) )
{
return ( !m_rcMbCurr.getBLSkipFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
}
if( rcMbData.isPCM() )
{
return 1;
}
if( bReCalc )
{
return rcMbData.calcBCBP( uiStart, uiStop, uiBit );
}
return rcMbData.getBCBP( uiBit );
}
if( uiBit < 16 ) // luma block based
{
B4x4Idx cIdx( uiBit );
const MbData& rcMbData = xGetBlockAbove( cIdx );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -