mbdataaccess.cpp
来自「JMVM MPEG MVC/3DAV 测试平台 国际通用标准」· C++ 代码 · 共 2,199 行 · 第 1/5 页
CPP
2,199 行
}
//TMM_EC }}
#if JMVM_ONLY // JVT-U052
Void MbDataAccess::getIcpPredictor( Icp& rcIcp, ListIdx eListIdx, SChar scRefIdx )
{
const MbData& rcMbDataLeft = xGetMbLeft();
const MbData& rcMbDataAbove = xGetMbAbove();
const MbData& rcMbDataAboveRight = xGetMbAboveRight();
const MbData& rcMbDataAboveLeft = xGetMbAboveLeft();
MbMode ePrevMbMode;
MbIcp cPrevMbIcp;
MbMotionData cPrevMbMotionData;
bool bIcpPredictorSet = false;
short sOffset = 0;
/********* The beginning of a bug-fix 1/4 provided by Sejong in JVT-X042 ***********/
// above block
if ( xIsAvailable(rcMbDataAbove) && rcMbDataAbove.getMbIcp().getIcAct() && scRefIdx == rcMbDataAbove.getMbMotionData(eListIdx).getRefIdx() )
{
ePrevMbMode = rcMbDataAbove.getMbMode();
cPrevMbIcp = rcMbDataAbove.getMbIcp();
switch (ePrevMbMode)
{
case MODE_SKIP:
case MODE_16x16:
{
sOffset = cPrevMbIcp.getIcp().getOffset();
bIcpPredictorSet = true;
}
break;
default:
bIcpPredictorSet = false;
break;
}
}
else
// left block
if ( xIsAvailable(rcMbDataLeft) && rcMbDataLeft.getMbIcp().getIcAct() && scRefIdx==rcMbDataLeft.getMbMotionData(eListIdx).getRefIdx() )
{
ePrevMbMode = rcMbDataLeft.getMbMode();
cPrevMbIcp = rcMbDataLeft.getMbIcp();
switch (ePrevMbMode)
{
case MODE_SKIP:
case MODE_16x16:
{
sOffset = cPrevMbIcp.getIcp().getOffset();
bIcpPredictorSet = true;
}
break;
default:
bIcpPredictorSet = false;
break;
}
}
else
// above right block
if ( xIsAvailable(rcMbDataAboveRight) && rcMbDataAboveRight.getMbIcp().getIcAct() && scRefIdx==rcMbDataAboveRight.getMbMotionData(eListIdx).getRefIdx())
{
ePrevMbMode = rcMbDataAboveRight.getMbMode();
cPrevMbIcp = rcMbDataAboveRight.getMbIcp();
switch (ePrevMbMode)
{
case MODE_SKIP:
case MODE_16x16:
{
sOffset = cPrevMbIcp.getIcp().getOffset();
bIcpPredictorSet = true;
}
break;
default:
bIcpPredictorSet = false;
break;
}
}
else
// above left block
if ( xIsAvailable(rcMbDataAboveLeft) && rcMbDataAboveLeft.getMbIcp().getIcAct() && scRefIdx==rcMbDataAboveLeft.getMbMotionData(eListIdx).getRefIdx())
{
ePrevMbMode = rcMbDataAboveLeft.getMbMode();
cPrevMbIcp = rcMbDataAboveLeft.getMbIcp();
switch (ePrevMbMode)
{
case MODE_SKIP:
case MODE_16x16:
{
sOffset = cPrevMbIcp.getIcp().getOffset();
bIcpPredictorSet = true;
}
break;
default:
bIcpPredictorSet = false;
break;
}
}
/********* The end of a bug-fix 1/4 provided by Sejong in JVT-X042 ***********/
// median prediction
if( !bIcpPredictorSet )
{
short sOffsetAbove, sOffsetLeft, sOffsetAboveRight;
Bool bAboveAvail = xIsAvailable(rcMbDataAbove) && rcMbDataAbove.getMbIcp().getIcAct();
Bool bLeftAvail = xIsAvailable(rcMbDataLeft) && rcMbDataLeft.getMbIcp().getIcAct();
Bool bAboveRightAvail = xIsAvailable(rcMbDataAboveRight) && rcMbDataAboveRight.getMbIcp().getIcAct();
if( bAboveAvail )
{
ePrevMbMode = rcMbDataAbove.getMbMode();
cPrevMbIcp = rcMbDataAbove.getMbIcp();
switch( ePrevMbMode )
{
case MODE_SKIP:
case MODE_16x16:
if( cPrevMbIcp.getIcAct() )
sOffsetAbove = cPrevMbIcp.getIcp().getOffset();
else
bAboveAvail = false;
break;
default:
bAboveAvail = false;
break;
}
}
if( bLeftAvail )
{
ePrevMbMode = rcMbDataLeft.getMbMode();
cPrevMbIcp = rcMbDataLeft.getMbIcp();
switch( ePrevMbMode )
{
case MODE_SKIP:
case MODE_16x16:
if( cPrevMbIcp.getIcAct() )
sOffsetLeft = cPrevMbIcp.getIcp().getOffset();
else
bLeftAvail = false;
break;
default:
bLeftAvail = false;
break;
}
}
if( bAboveRightAvail )
{
/********* The beginning of a bug-fix 2/4 provided by Sejong in JVT-X042 ***********/
ePrevMbMode = rcMbDataAboveRight.getMbMode();
cPrevMbIcp = rcMbDataAboveRight.getMbIcp();
/********* The end of a bug-fix 2/4 provided by Sejong in JVT-X042 ***********/
switch( ePrevMbMode )
{
case MODE_SKIP:
case MODE_16x16:
if( cPrevMbIcp.getIcAct() )
sOffsetAboveRight = cPrevMbIcp.getIcp().getOffset();
else
bAboveRightAvail = false;
break;
default:
bAboveRightAvail = false;
break;
}
}
if( bAboveAvail && bLeftAvail && bAboveRightAvail )
{
#define MEDIAN(a,b,c) ((a)>(b)?(a)>(c)?(b)>(c)?(b):(c):(a):(b)>(c)?(a)>(c)?(a):(c):(b))
sOffset = MEDIAN(sOffsetAbove,sOffsetLeft,sOffsetAboveRight);
bIcpPredictorSet = true;
#undef MEDIAN
}
}
if ( !bIcpPredictorSet )
{
rcIcp.setPredOffset( 0 );
}
else
rcIcp.setPredOffset( sOffset );
}
Void MbDataAccess::getIcpPredictor( Icp& rcIcp, SChar scRefIdx0, SChar scRefIdx1 )
{
const MbData& rcMbDataLeft = xGetMbLeft();
const MbData& rcMbDataAbove = xGetMbAbove();
const MbData& rcMbDataAboveRight = xGetMbAboveRight();
const MbData& rcMbDataAboveLeft = xGetMbAboveLeft();
MbMode ePrevMbMode;
MbIcp cPrevMbIcp;
MbMotionData cPrevMbMotionData0, cPrevMbMotionData1;
bool bIcpPredictorSet = false;
short sOffset = 0;
/********* The beginning of a bug-fix 3/4 provided by Sejong in JVT-X042 ***********/
// above block
if ( xIsAvailable(rcMbDataAbove) && rcMbDataAbove.getMbIcp().getIcAct() && scRefIdx0==rcMbDataAbove.getMbMotionData(LIST_0).getRefIdx() && scRefIdx1==rcMbDataAbove.getMbMotionData(LIST_1).getRefIdx() )
{
ePrevMbMode = rcMbDataAbove.getMbMode();
cPrevMbIcp = rcMbDataAbove.getMbIcp();
switch (ePrevMbMode)
{
case MODE_SKIP:
case MODE_16x16:
{
sOffset = cPrevMbIcp.getIcp().getOffset();
bIcpPredictorSet = true;
}
break;
default:
bIcpPredictorSet = false;
break;
}
}
else
// left block
if ( xIsAvailable(rcMbDataLeft) && rcMbDataLeft.getMbIcp().getIcAct() && scRefIdx0==rcMbDataLeft.getMbMotionData(LIST_0).getRefIdx() && scRefIdx1==rcMbDataLeft.getMbMotionData(LIST_1).getRefIdx())
{
ePrevMbMode = rcMbDataLeft.getMbMode();
cPrevMbIcp = rcMbDataLeft.getMbIcp();
switch (ePrevMbMode)
{
case MODE_SKIP:
case MODE_16x16:
{
sOffset = cPrevMbIcp.getIcp().getOffset();
bIcpPredictorSet = true;
}
break;
default:
bIcpPredictorSet = false;
break;
}
}
else
// above right block
if ( xIsAvailable(rcMbDataAboveRight) && rcMbDataAboveRight.getMbIcp().getIcAct() && scRefIdx0==rcMbDataAboveRight.getMbMotionData(LIST_0).getRefIdx() && scRefIdx1==rcMbDataAboveRight.getMbMotionData(LIST_1).getRefIdx())
{
ePrevMbMode = rcMbDataAboveRight.getMbMode();
cPrevMbIcp = rcMbDataAboveRight.getMbIcp();
switch (ePrevMbMode)
{
case MODE_SKIP:
case MODE_16x16:
{
sOffset = cPrevMbIcp.getIcp().getOffset();
bIcpPredictorSet = true;
}
break;
default:
bIcpPredictorSet = false;
break;
}
}
else
// above left block
if ( xIsAvailable(rcMbDataAboveLeft) && rcMbDataAboveLeft.getMbIcp().getIcAct() && scRefIdx0==rcMbDataAboveLeft.getMbMotionData(LIST_0).getRefIdx() && scRefIdx1==rcMbDataAboveLeft.getMbMotionData(LIST_1).getRefIdx())
{
ePrevMbMode = rcMbDataAboveLeft.getMbMode();
cPrevMbIcp = rcMbDataAboveLeft.getMbIcp();
switch (ePrevMbMode)
{
case MODE_SKIP:
case MODE_16x16:
{
sOffset = cPrevMbIcp.getIcp().getOffset();
bIcpPredictorSet = true;
}
break;
default:
bIcpPredictorSet = false;
break;
}
}
/********* The end of a bug-fix 3/4 provided by Sejong in JVT-X042 ***********/
// median prediction
if( !bIcpPredictorSet )
{
short sOffsetAbove, sOffsetLeft, sOffsetAboveRight;
Bool bAboveAvail = xIsAvailable(rcMbDataAbove) && rcMbDataAbove.getMbIcp().getIcAct();
Bool bLeftAvail = xIsAvailable(rcMbDataLeft) && rcMbDataLeft.getMbIcp().getIcAct();
Bool bAboveRightAvail = xIsAvailable(rcMbDataAboveRight) && rcMbDataAboveRight.getMbIcp().getIcAct();
if( bAboveAvail )
{
ePrevMbMode = rcMbDataAbove.getMbMode();
cPrevMbIcp = rcMbDataAbove.getMbIcp();
switch( ePrevMbMode )
{
case MODE_SKIP:
case MODE_16x16:
if( cPrevMbIcp.getIcAct() )
sOffsetAbove = cPrevMbIcp.getIcp().getOffset();
else
bAboveAvail = false;
break;
default:
bAboveAvail = false;
break;
}
}
if( bLeftAvail )
{
ePrevMbMode = rcMbDataLeft.getMbMode();
cPrevMbIcp = rcMbDataLeft.getMbIcp();
switch( ePrevMbMode )
{
case MODE_SKIP:
case MODE_16x16:
if( cPrevMbIcp.getIcAct() )
sOffsetLeft = cPrevMbIcp.getIcp().getOffset();
else
bLeftAvail = false;
break;
default:
bLeftAvail = false;
break;
}
}
if( bAboveRightAvail )
{
/********* The beginning of a bug-fix 4/4 provided by Sejong in JVT-X042 ***********/
ePrevMbMode = rcMbDataAboveRight.getMbMode();
cPrevMbIcp = rcMbDataAboveRight.getMbIcp();
/********* The end of a bug-fix 4/4 provided by Sejong in JVT-X042 ***********/
switch( ePrevMbMode )
{
case MODE_SKIP:
case MODE_16x16:
if( cPrevMbIcp.getIcAct() )
sOffsetAboveRight = cPrevMbIcp.getIcp().getOffset();
else
bAboveRightAvail = false;
break;
default:
bAboveRightAvail = false;
break;
}
}
if( bAboveAvail && bLeftAvail && bAboveRightAvail )
{
#define MEDIAN(a,b,c) ((a)>(b)?(a)>(c)?(b)>(c)?(b):(c):(a):(b)>(c)?(a)>(c)?(a):(c):(b))
sOffset = MEDIAN(sOffsetAbove,sOffsetLeft,sOffsetAboveRight);
bIcpPredictorSet = true;
#undef MEDIAN
}
}
if ( !bIcpPredictorSet )
rcIcp.setPredOffset( 0 );
else
rcIcp.setPredOffset( sOffset );
}
#endif
#if JMVM_ONLY // JVT-W081
ErrVal
MbDataAccess::deriveDisparity( MbDataAccess& rcMbDataAccess, GDV& disparity, GDV& gdv )
{
Mv dis;
Mv cDvPred;
Mv cMvCol;
Int uiMbX = Int(rcMbDataAccess.getMbX())*2; //JVT-Z021
Int uiMbY = Int(rcMbDataAccess.getMbY())*2; //JVT-Z021
UInt uiMbInCol = rcMbDataAccess.getSH().getSPS().getFrameHeightInMbs()*2; //JVT-Z021
UInt uiMbInRow = rcMbDataAccess.getSH().getSPS().getFrameWidthInMbs()*2; //JVT-Z021
B4x4Idx cIdx =0;
cDvPred.set(gdv.getHor()<<3,gdv.getVer()<<3); //JVT-Z021
if (Int(cDvPred.getHor())>0)
{
dis.setHor( cDvPred.getHor() >> 3 ); //JVT-Z021
dis.setHor( dis.getHor() + ( cDvPred.getHor()%8 > 3 ? 1 : 0)); //JVT-Z021
}
else
{
dis.setHor( cDvPred.getHor() >> 3 );
dis.setHor( dis.getHor() + ( cDvPred.getHor()%8 <-3 ? -1 : 0)); //JVT-Z021
}
if ( ( uiMbX + Int(dis.getHor()) < (Int(uiMbInRow)-1)) && ( uiMbX + Int(dis.getHor()) > -1) ) //JVT-Z021
{
disparity.setHor( dis.getHor() + Short(uiMbX));
}
else if (uiMbX + Int(dis.getHor()) > Int(uiMbInRow)-2) //JVT-Z021
{
disparity.setHor(Short(uiMbInRow)-2); //JVT-Z021
}
else
{
disparity.setHor(0);
}
if (Int(cDvPred.getVer())>0)
{
dis.setVer( cDvPred.getVer() >> 3 );//JVT-Z021
dis.setVer( dis.getVer() + ( cDvPred.getVer()%8 > 3 ? 1 : 0));//JVT-Z021
}
else
{
dis.setVer( cDvPred.getVer() >> 3 );//JVT-Z021
dis.setVer( dis.getVer() + ( cDvPred.getVer()%8 <-3 ? -1 : 0));//JVT-Z021
}
if ( ( uiMbY + Int(dis.getVer()) < Int(uiMbInCol)-1) && ( uiMbY + Int(dis.getVer()) > -1) )
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?