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 + -
显示快捷键?