📄 mbdataaccess.h
字号:
Bool xTemporalDirectModeVirtual( ParIdx8x8 eParIdx, Bool b8x8, Bool bFaultTolerant, RefFrameList& rcRefFrameListL0, RefFrameList& rcRefFrameListL1 );
Bool xTemporalDirectModeMvRefVirtual( Mv acMv[], SChar ascRefIdx[], LumaIdx cIdx, Bool bFaultTolerant, RefFrameList& rcRefFrameListL0, RefFrameList& rcRefFrameListL1);
// TMM_EC }}
Bool xIsAvailable ( const MbData& rcMbData ) const
{
return ( rcMbData.getSliceId() == m_rcMbCurr.getSliceId() );
}
Bool xIsAvailableIntra( const MbData& rcMbData ) const
{
Bool bConstrainedIntraPred = m_rcSliceHeader.getPPS().getConstrainedIntraPredFlag();
return ( xIsAvailable( rcMbData ) && ( rcMbData.isIntra() || ! bConstrainedIntraPred ) );
}
private:
#if JMVM_ONLY //JVT-Z021
class MBMotion FMb_RD_in[5*5*2];
#endif//JVT-Z021
static const BlkMode m_aucBMTabB0[13];
static const UChar m_aucBMTabB1[13];
static const BlkMode m_aucBMTabP[4];
static const MbMode m_aausInterBMbType0[23];
static const UShort m_aausInterBMbType1[23];
static const UChar m_aucMbType1x2[9];
static const UChar m_aucMbType2x1[9];
static const UChar m_aucChroma2LumaIdx[8];
static const UChar m_auc4x4Idx28x8Idx[16];
public:
MbData& m_rcMbCurr;
const MbData& m_rcMbLeft;
const MbData& m_rcMbAbove;
const MbData& m_rcMbAboveLeft;
const MbData& m_rcMbAboveRight;
const MbData& m_rcMbUnavailable;
const MbData& m_rcMbColocated;
SliceHeader& m_rcSliceHeader;
const DFP& m_rcDFP;
Mv3D m_cMv3D_A;
Mv3D m_cMv3D_B;
Mv3D m_cMv3D_C;
UInt m_uiAvailable;
UInt m_uiPosX;
UInt m_uiPosY;
SChar m_ucLastMbQp;
MbDataAccess* m_pcMbDataAccessBase;
};
__inline Void MbDataAccess::getMvPredictor( Mv& rcMv, SChar scRef, ListIdx eListIdx )
{
xGetMvPredictor( rcMv, scRef, eListIdx, MEDIAN, B4x4Idx( 0 ), B4x4Idx( 3 ) );
}
__inline Void MbDataAccess::getMvPredictor( Mv& rcMv, SChar scRef, ListIdx eListIdx, ParIdx16x8 eParIdx )
{
PredictionType ePred = ( eParIdx == PART_16x8_0 ? PRED_B : PRED_A );
xGetMvPredictor( rcMv, scRef, eListIdx, ePred, B4x4Idx( eParIdx ), B4x4Idx( eParIdx+3 ) );
}
__inline Void MbDataAccess::getMvPredictor( Mv& rcMv, SChar scRef, ListIdx eListIdx, ParIdx8x16 eParIdx )
{
PredictionType ePred = ( eParIdx == PART_8x16_0 ? PRED_A : PRED_C );
xGetMvPredictor( rcMv, scRef, eListIdx, ePred, B4x4Idx( eParIdx ), B4x4Idx( eParIdx+1 ) );
}
__inline Void MbDataAccess::getMvPredictor( Mv& rcMv, SChar scRef, ListIdx eListIdx, ParIdx8x8 eParIdx )
{
xGetMvPredictor( rcMv, scRef, eListIdx, MEDIAN, B4x4Idx( eParIdx ), B4x4Idx( eParIdx+1 ) );
}
__inline Void MbDataAccess::getMvPredictor( Mv& rcMv, SChar scRef, ListIdx eListIdx, ParIdx8x8 eParIdx, SParIdx8x4 eSParIdx )
{
xGetMvPredictor( rcMv, scRef, eListIdx, MEDIAN, B4x4Idx( eParIdx+eSParIdx ), B4x4Idx( eParIdx+eSParIdx+1 ) );
}
__inline Void MbDataAccess::getMvPredictor( Mv& rcMv, SChar scRef, ListIdx eListIdx, ParIdx8x8 eParIdx, SParIdx4x8 eSParIdx )
{
xGetMvPredictor( rcMv, scRef, eListIdx, MEDIAN, B4x4Idx( eParIdx+eSParIdx ), B4x4Idx( eParIdx+eSParIdx ) );
}
__inline Void MbDataAccess::getMvPredictor( Mv& rcMv, SChar scRef, ListIdx eListIdx, ParIdx8x8 eParIdx, SParIdx4x4 eSParIdx )
{
xGetMvPredictor( rcMv, scRef, eListIdx, MEDIAN, B4x4Idx( eParIdx+eSParIdx ), B4x4Idx( eParIdx+eSParIdx ) );
}
__inline Void MbDataAccess::setMvPredictorsBL( const Mv& rcMv, ListIdx eListIdx )
{
xSetMvPredictorsBL( rcMv, eListIdx, B4x4Idx( 0 ), B4x4Idx( 3 ) );
}
__inline Void MbDataAccess::setMvPredictorsBL( const Mv& rcMv, ListIdx eListIdx, ParIdx16x8 eParIdx )
{
xSetMvPredictorsBL( rcMv, eListIdx, B4x4Idx( eParIdx ), B4x4Idx( eParIdx+3 ) );
}
__inline Void MbDataAccess::setMvPredictorsBL( const Mv& rcMv, ListIdx eListIdx, ParIdx8x16 eParIdx )
{
xSetMvPredictorsBL( rcMv, eListIdx, B4x4Idx( eParIdx ), B4x4Idx( eParIdx+1 ) );
}
__inline Void MbDataAccess::setMvPredictorsBL( const Mv& rcMv, ListIdx eListIdx, ParIdx8x8 eParIdx )
{
xSetMvPredictorsBL( rcMv, eListIdx, B4x4Idx( eParIdx ), B4x4Idx( eParIdx+1 ) );
}
__inline Void MbDataAccess::setMvPredictorsBL( const Mv& rcMv, ListIdx eListIdx, ParIdx8x8 eParIdx, SParIdx8x4 eSParIdx )
{
xSetMvPredictorsBL( rcMv, eListIdx, B4x4Idx( eParIdx+eSParIdx ), B4x4Idx( eParIdx+eSParIdx+1 ) );
}
__inline Void MbDataAccess::setMvPredictorsBL( const Mv& rcMv, ListIdx eListIdx, ParIdx8x8 eParIdx, SParIdx4x8 eSParIdx )
{
xSetMvPredictorsBL( rcMv, eListIdx, B4x4Idx( eParIdx+eSParIdx ), B4x4Idx( eParIdx+eSParIdx ) );
}
__inline Void MbDataAccess::setMvPredictorsBL( const Mv& rcMv, ListIdx eListIdx, ParIdx8x8 eParIdx, SParIdx4x4 eSParIdx )
{
xSetMvPredictorsBL( rcMv, eListIdx, B4x4Idx( eParIdx+eSParIdx ), B4x4Idx( eParIdx+eSParIdx ) );
}
__inline SChar MbDataAccess::xGetRefIdxLeft( ListIdx eListIdx, ParIdx8x8 eParIdx ) const
{
B4x4Idx cIdx( eParIdx );
const MbData& rcMbData = xGetBlockLeft( cIdx );
if(
#if JMVM_ONLY // JVT-W081
rcMbData.getMotionSkipFlag() ||
#endif // JVT-W081
rcMbData.getBLSkipFlag() || rcMbData.getMbMotionData( eListIdx ).getMotPredFlag( ParIdx8x8( cIdx.b4x4() ) ) )
{
return BLOCK_NOT_AVAILABLE;
}
if( m_rcSliceHeader.isInterB() )
{
if( rcMbData.getMbMode() == MODE_SKIP || ( rcMbData.getMbMode() == MODE_8x8 && rcMbData.getBlkMode( Par8x8( 2*(cIdx.y()/2) + cIdx.x()/2 ) ) == BLK_SKIP ) )
return BLOCK_NOT_AVAILABLE;
}
SChar scRefIdx = rcMbData.getMbMotionData( eListIdx ).getRefIdx( ParIdx8x8( cIdx.b4x4() ) );
return scRefIdx;
}
__inline SChar MbDataAccess::xGetRefIdxAbove( ListIdx eListIdx, ParIdx8x8 eParIdx ) const
{
B4x4Idx cIdx( eParIdx );
const MbData& rcMbData = xGetBlockAbove( cIdx );
if(
#if JMVM_ONLY // JVT-W081
rcMbData.getMotionSkipFlag() ||
#endif // JVT-W081
rcMbData.getBLSkipFlag() || rcMbData.getMbMotionData( eListIdx ).getMotPredFlag( ParIdx8x8( cIdx.b4x4() ) ) )
{
return BLOCK_NOT_AVAILABLE;
}
if( m_rcSliceHeader.isInterB() )
{
if( rcMbData.getMbMode() == MODE_SKIP || ( rcMbData.getMbMode() == MODE_8x8 && rcMbData.getBlkMode( Par8x8( 2*(cIdx.y()/2) + cIdx.x()/2 ) ) == BLK_SKIP ) )
return BLOCK_NOT_AVAILABLE;
}
SChar scRefIdx = rcMbData.getMbMotionData( eListIdx ).getRefIdx( ParIdx8x8( cIdx.b4x4() ) );
return scRefIdx;
}
__inline Void MbDataAccess::getMvdLeft( Mv& rcMv, ListIdx eListIdx, LumaIdx cIdx ) const
{
const MbData& rcMbData = xGetBlockLeft( cIdx );
rcMv = rcMbData.getMbMvdData( eListIdx ).getMv( cIdx );
}
__inline Void MbDataAccess::getMvdAbove( Mv& rcMv, ListIdx eListIdx, LumaIdx cIdx ) const
{
const MbData& rcMbData = xGetBlockAbove( cIdx );
rcMv = rcMbData.getMbMvdData( eListIdx ).getMv( cIdx );
}
__inline UInt MbDataAccess::getCtxCoeffCount( LumaIdx cIdx ) const
{
Bool bLeftAvailable = false;
UInt uiCoeffCount = 0;
{
B4x4Idx cIdxL( cIdx.b4x4() );
const MbData& rcMbDataLeft = xGetBlockLeft( cIdxL );
if( xIsAvailable( rcMbDataLeft ) )
{
bLeftAvailable = true;
uiCoeffCount = rcMbDataLeft.getMbTCoeffs().getCoeffCount( cIdxL );
}
}
const MbData& rcMbDataAbove = xGetBlockAbove( cIdx );
if( xIsAvailable( rcMbDataAbove ) )
{
uiCoeffCount += rcMbDataAbove.getMbTCoeffs().getCoeffCount( cIdx );
if( bLeftAvailable )
{
uiCoeffCount += 1;
uiCoeffCount >>= 1;
}
}
if( 4 > uiCoeffCount )
{
uiCoeffCount >>= 1;
}
else
{
uiCoeffCount = ( 8 > uiCoeffCount) ? 2 : 3;
}
return uiCoeffCount;
}
__inline UInt MbDataAccess::getCtxCoeffCount( ChromaIdx cIdx ) const
{
Bool bLeftAvailable = false;
UInt uiCoeffCount = 0;
B4x4Idx cLumIdx( m_aucChroma2LumaIdx[ cIdx ] );
Int iComp = ( cIdx >> 2) << 2;
{
B4x4Idx cLumIdxL = cLumIdx;
const MbData& rcMbDataLeft = xGetBlockLeft( cLumIdxL );
if( xIsAvailable( rcMbDataLeft ) )
{
bLeftAvailable = true;
uiCoeffCount = rcMbDataLeft.getMbTCoeffs().getCoeffCount( CIdx( iComp + m_auc4x4Idx28x8Idx[ cLumIdxL.b4x4() ] ) );
}
}
const MbData& rcMbDataAbove = xGetBlockAbove( cLumIdx );
if( xIsAvailable( rcMbDataAbove ) )
{
uiCoeffCount += rcMbDataAbove.getMbTCoeffs().getCoeffCount( CIdx( iComp + m_auc4x4Idx28x8Idx[ cLumIdx.b4x4() ] ) );
if( bLeftAvailable )
{
uiCoeffCount += 1;
uiCoeffCount >>= 1;
}
}
if( 4 > uiCoeffCount )
{
uiCoeffCount >>= 1;
}
else
{
uiCoeffCount = ( 8 > uiCoeffCount) ? 2 : 3;
}
return uiCoeffCount;
}
__inline UInt MbDataAccess::getCtxChromaPredMode() const
{
UInt uiCtx;
uiCtx = ((xGetMbLeft ().getChromaPredMode() > 0) ? 1 : 0);
uiCtx += ((xGetMbAbove().getChromaPredMode() > 0) ? 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::getCtxMbType() const
{
const MbData& rcMbLeft = xGetMbLeft ();
const MbData& rcMbAbove = xGetMbAbove();
Bool bSkippedLeft = ( !rcMbLeft .getBLSkipFlag() && rcMbLeft .isSkiped()
#if JMVM_ONLY // JVT-W081
&& !rcMbLeft.getMotionSkipFlag()
#endif // JVT-W081
);
Bool bSkippedAbove = ( !rcMbAbove.getBLSkipFlag() && rcMbAbove.isSkiped()
#if JMVM_ONLY // JVT-W081
&& !rcMbAbove.getMotionSkipFlag()
#endif // JVT-W081
);
UInt uiCtx = ( bSkippedLeft ? 0 : 1 );
uiCtx += ( bSkippedAbove ? 0 : 1 );
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
{
return getCtxMbType();
}
__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;
}
#if JMVM_ONLY // JVT-W081
__inline UInt MbDataAccess::getCtxMotionSkipFlag() const
{
const MbData& rcMbDataLeft = xGetMbLeft ();
const MbData& rcMbDataAbove = xGetMbAbove ();
UInt uiCtx = ( rcMbDataLeft .getMotionSkipFlag() ? 0 : 1 );
uiCtx += ( rcMbDataAbove.getMotionSkipFlag() ? 0 : 1 );
return uiCtx;
}
#endif // JVT-W081
#if JMVM_ONLY //JVT-Z021
__inline UInt MbDataAccess::getCtxMotionSkipListXFlag() const
{
const MbData& rcMbDataLeft = xGetMbLeft ();
const MbData& rcMbDataAbove = xGetMbAbove ();
Bool bMbImsmLeft = xIsAvailable(rcMbDataLeft) && rcMbDataLeft.getMotionSkipFlag();
Bool bMbImsmAbove = xIsAvailable(rcMbDataAbove) && rcMbDataAbove.getMotionSkipFlag();
UInt uiCtx;
uiCtx = (rcMbDataLeft.m_pcMbImsm->m_iListXFlag==LIST_0) ? 0 : 1;
uiCtx += (rcMbDataAbove.m_pcMbImsm->m_iListXFlag==LIST_0) ? 0 : 1;
return uiCtx;
}
#endif //JVT-Z021
__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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -