motioncompensation.cpp

来自「JMVM MPEG MVC/3DAV 测试平台 国际通用标准」· C++ 代码 · 共 1,966 行 · 第 1/5 页

CPP
1,966
字号
  {
    YuvPicBuffer* pcRefBuffer = rcMc8x8D.m_apcRefBuffer[n];
    if( NULL != pcRefBuffer )
    {
      const Mv cMv = rcMc8x8D.m_aacMv[n][eSParIdx];
      m_pcQuarterPelFilter->predBlk( apcTarBuffer[n], pcRefBuffer, cIdx, cMv, iSizeY, iSizeX );
    }
  }
}



Void MotionCompensation::xPredChroma( YuvMbBuffer* apcTarBuffer[2], Int iSizeX, Int iSizeY, MC8x8D& rcMc8x8D, SParIdx4x4 eSParIdx )
{
  B4x4Idx cIdx( rcMc8x8D.m_cIdx + eSParIdx );

  for( Int n = 0; n < 2; n++ )
  {
    YuvPicBuffer* pcRefBuffer = rcMc8x8D.m_apcRefBuffer[n];
    if( NULL != pcRefBuffer )
    {
      Mv cMv = rcMc8x8D.m_aacMv[n][eSParIdx];

      xPredChroma( apcTarBuffer[n], pcRefBuffer, cIdx, cMv, iSizeY, iSizeX );
    }
  }
}


Void MotionCompensation::xPredLuma( YuvMbBuffer* pcRecBuffer, Int iSizeX, Int iSizeY, MC8x8D& rcMc8x8D )
{
  YuvMbBuffer* apcTarBuffer[2];
  m_pcSampleWeighting->getTargetBuffers( apcTarBuffer, pcRecBuffer, rcMc8x8D.m_apcPW[LIST_0], rcMc8x8D.m_apcPW[LIST_1] );                                    

  for( Int n = 0; n < 2; n++ )
  {
    YuvPicBuffer* pcRefBuffer = rcMc8x8D.m_apcRefBuffer[n];
    if( NULL != pcRefBuffer )
    {
      const Mv cMv = rcMc8x8D.m_aacMv[n][0];
      m_pcQuarterPelFilter->predBlk( apcTarBuffer[n], pcRefBuffer, rcMc8x8D.m_cIdx, cMv, iSizeY, iSizeX );
    }
  }
  m_pcSampleWeighting->weightLumaSamples( pcRecBuffer, iSizeX, iSizeY, rcMc8x8D.m_cIdx, rcMc8x8D.m_apcPW[LIST_0], rcMc8x8D.m_apcPW[LIST_1] );
}




Void MotionCompensation::xPredChroma( YuvMbBuffer* pcRecBuffer, Int iSizeX, Int iSizeY, MC8x8D& rcMc8x8D )
{
  YuvMbBuffer* apcTarBuffer[2];
  m_pcSampleWeighting->getTargetBuffers( apcTarBuffer, pcRecBuffer, rcMc8x8D.m_apcPW[LIST_0], rcMc8x8D.m_apcPW[LIST_1] );                                    

  for( Int n = 0; n < 2; n++ )
  {
    YuvPicBuffer* pcRefBuffer = rcMc8x8D.m_apcRefBuffer[n];
    if( NULL != pcRefBuffer )
    {
      Mv cMv = rcMc8x8D.m_aacMv[n][0];
      xPredChroma( apcTarBuffer[n], pcRefBuffer, rcMc8x8D.m_cIdx, cMv, iSizeY, iSizeX );
    }
  }
  m_pcSampleWeighting->weightChromaSamples( pcRecBuffer, iSizeX, iSizeY, rcMc8x8D.m_cIdx, rcMc8x8D.m_apcPW[LIST_0], rcMc8x8D.m_apcPW[LIST_1] );
}


ErrVal MotionCompensation::compensateMb( MbDataAccess& rcMbDataAccess, 
                                         YuvMbBuffer* pcRecBuffer, 
                                         Bool bFaultTolerant, 
                                         Bool bCalcMv )
{
  MbMode eMbMode  = rcMbDataAccess.getMbData().getMbMode();

#if JMVM_ONLY  // JVT-U052
  MbIcp cMbIcp;
#endif

  switch( eMbMode )
  {
  case MODE_16x16:
    {
      if( bCalcMv )
        xCalc16x16( rcMbDataAccess, NULL );

      MC8x8D cMC8x8D( B_8x8_0 );
      xGetMbPredData( rcMbDataAccess, cMC8x8D );

#if JMVM_ONLY  // JVT-U052
      if( rcMbDataAccess.getSH().getIcEnable() )
      {
        if (rcMbDataAccess.getMbData().getMbIcp().getIcAct())
          xInverseDPCMIcp( rcMbDataAccess );

        cMbIcp = rcMbDataAccess.getMbData().getMbIcp();
        xPredLuma( cMbIcp, pcRecBuffer, 16, 16, cMC8x8D );
      }
      else
      {
        xPredLuma(   pcRecBuffer, 16, 16, cMC8x8D );
      }
#else
      xPredLuma(   pcRecBuffer, 16, 16, cMC8x8D );
#endif

      xPredChroma( pcRecBuffer,  8,  8, cMC8x8D );
    }
    break;
  case MODE_16x8:
    {
      if( bCalcMv )
        xCalc16x8( rcMbDataAccess, NULL );

      MC8x8D cMC8x8D0( B_8x8_0 );
      MC8x8D cMC8x8D1( B_8x8_2 );

      xGetMbPredData( rcMbDataAccess, cMC8x8D0 );
      xGetMbPredData( rcMbDataAccess, cMC8x8D1 );

      xPredLuma(   pcRecBuffer, 16, 8, cMC8x8D0 );
      xPredLuma(   pcRecBuffer, 16, 8, cMC8x8D1 );
      xPredChroma( pcRecBuffer,  8, 4, cMC8x8D0 );
      xPredChroma( pcRecBuffer,  8, 4, cMC8x8D1 );
    }
    break;
  case MODE_8x16:
    {
      if( bCalcMv )
        xCalc8x16( rcMbDataAccess, NULL );

      MC8x8D cMC8x8D0( B_8x8_0 );
      MC8x8D cMC8x8D1( B_8x8_1 );

      xGetMbPredData( rcMbDataAccess, cMC8x8D0 );
      xGetMbPredData( rcMbDataAccess, cMC8x8D1 );

      xPredLuma(   pcRecBuffer, 8, 16, cMC8x8D0 );
      xPredLuma(   pcRecBuffer, 8, 16, cMC8x8D1 );
      xPredChroma( pcRecBuffer, 4,  8, cMC8x8D0 );
      xPredChroma( pcRecBuffer, 4,  8, cMC8x8D1 );
    }
    break;
  case MODE_SKIP:
    {
      if( rcMbDataAccess.getSH().isInterB() )
      {
        Bool bValid;
        B8x8Idx c8x8Idx;
        RNOK( compensateDirectBlock( rcMbDataAccess, pcRecBuffer, c8x8Idx, bValid, bFaultTolerant, bCalcMv ) ); c8x8Idx++;
        ROF ( bValid )
        RNOK( compensateDirectBlock( rcMbDataAccess, pcRecBuffer, c8x8Idx, bValid, bFaultTolerant, bCalcMv ) ); c8x8Idx++;
        ROF ( bValid )
        RNOK( compensateDirectBlock( rcMbDataAccess, pcRecBuffer, c8x8Idx, bValid, bFaultTolerant, bCalcMv ) ); c8x8Idx++;
        ROF ( bValid )
        RNOK( compensateDirectBlock( rcMbDataAccess, pcRecBuffer, c8x8Idx, bValid, bFaultTolerant, bCalcMv ) );
        ROF ( bValid )

#if JMVM_ONLY  // JVT-U052
        if( rcMbDataAccess.getSH().getIcEnable() )
        {
          IntMC8x8D cMC8x8D( B_8x8_0 );

		  //JVT-W031
		  if( rcMbDataAccess.getMbData().getSkipFlag() )
		  {
		    Icp cIcp = rcMbDataAccess.getMbData().getMbIcp().getIcp();
			cIcp.setIcAct( cIcp.getPredIcAct() );
			rcMbDataAccess.getMbData().getMbIcp().setAllIcp( cIcp );
		  }
		  // ---

          if( rcMbDataAccess.getMbData().getMbIcp().getIcAct() )
          {
            xInverseDPCMIcp( rcMbDataAccess );
            cMbIcp = rcMbDataAccess.getMbData().getMbIcp();
            xIcForPredLuma( cMbIcp, pcRecBuffer, cMC8x8D.m_cIdx, 16, 16 );
          }
        }
#endif
      }
      else
      {
        if( bCalcMv )
          rcMbDataAccess.getMvPredictorSkipMode();

        MC8x8D cMC8x8D( B_8x8_0 );
        xGetMbPredData( rcMbDataAccess, cMC8x8D );

#if JMVM_ONLY  // JVT-U052
        if ( rcMbDataAccess.getSH().getIcEnable() )
        {
          cMbIcp = rcMbDataAccess.getMbData().getMbIcp();
          xPredLuma( cMbIcp, pcRecBuffer, 16, 16, cMC8x8D );
        }
        else
          xPredLuma(   pcRecBuffer, 16, 16, cMC8x8D );
#else
        xPredLuma(   pcRecBuffer, 16, 16, cMC8x8D );
#endif
        xPredChroma( pcRecBuffer,  8,  8, cMC8x8D );
        return Err::m_nOK;
      }
    }
    break;
  case MODE_8x8:
  case MODE_8x8ref0:
    {
      if( bCalcMv )
        xCalc8x8( rcMbDataAccess, NULL, bFaultTolerant );
      xPredMb8x8Mode( rcMbDataAccess, pcRecBuffer );
    }
    break;
  default:
    break;
  }

  return Err::m_nOK;
}

#if JMVM_ONLY  // JVT-W081
ErrVal MotionCompensation::compensateMbMotionSkip ( MbDataAccess& rcMbDataAccess, 
												    YuvMbBuffer* pcRecBuffer,
													Bool bFaultTolerant, 
													Bool bCalcMv ) 
{
  MbMode eMbMode  = rcMbDataAccess.getMbData().getMbMode();

  switch( eMbMode )
  {
  case MODE_16x16:
	  {
		  MC8x8D cMC8x8D( B_8x8_0 );
		  xGetMbPredData( rcMbDataAccess, cMC8x8D );
		  xPredLuma(   pcRecBuffer, 16, 16, cMC8x8D );
		  xPredChroma( pcRecBuffer,  8,  8, cMC8x8D );
	  }
	  break;
  
  case MODE_16x8:
	  {
		  MC8x8D cMC8x8D0( B_8x8_0 );
		  MC8x8D cMC8x8D1( B_8x8_2 );  
		  xGetMbPredData( rcMbDataAccess, cMC8x8D0 );
		  xGetMbPredData( rcMbDataAccess, cMC8x8D1 );		  
		  xPredLuma(   pcRecBuffer, 16, 8, cMC8x8D0 );
		  xPredLuma(   pcRecBuffer, 16, 8, cMC8x8D1 );
		  xPredChroma( pcRecBuffer,  8, 4, cMC8x8D0 );
		  xPredChroma( pcRecBuffer,  8, 4, cMC8x8D1 );
	  }
	  break;
 
  case MODE_8x16:
	  {
		  MC8x8D cMC8x8D0( B_8x8_0 );
		  MC8x8D cMC8x8D1( B_8x8_1 );
		  xGetMbPredData( rcMbDataAccess, cMC8x8D0 );
		  xGetMbPredData( rcMbDataAccess, cMC8x8D1 );
		  xPredLuma(   pcRecBuffer, 8, 16, cMC8x8D0 );
		  xPredLuma(   pcRecBuffer, 8, 16, cMC8x8D1 );
		  xPredChroma( pcRecBuffer, 4,  8, cMC8x8D0 );
		  xPredChroma( pcRecBuffer, 4,  8, cMC8x8D1 );
	  }
	  break;
  
  case MODE_SKIP:
	  {
		  if( rcMbDataAccess.getSH().isInterB() )
		  {
			  Bool bValid;
			  B8x8Idx c8x8Idx;
			      RNOK( compensateDirectBlockMotionSkip( rcMbDataAccess, pcRecBuffer, c8x8Idx, bValid, bFaultTolerant ) ); c8x8Idx++;
			  ROF ( bValid )
				  RNOK( compensateDirectBlockMotionSkip( rcMbDataAccess, pcRecBuffer, c8x8Idx, bValid, bFaultTolerant ) ); c8x8Idx++;
			  ROF ( bValid )
				  RNOK( compensateDirectBlockMotionSkip( rcMbDataAccess, pcRecBuffer, c8x8Idx, bValid, bFaultTolerant ) ); c8x8Idx++;
			  ROF ( bValid )
				  RNOK( compensateDirectBlockMotionSkip( rcMbDataAccess, pcRecBuffer, c8x8Idx, bValid, bFaultTolerant ) );
			  ROF ( bValid )
		  }
		  else
		  {
			  MC8x8D cMC8x8D( B_8x8_0 );
			  xGetMbPredData( rcMbDataAccess, cMC8x8D );			  
			  xPredLuma(   pcRecBuffer, 16, 16, cMC8x8D );
			  xPredChroma( pcRecBuffer,  8,  8, cMC8x8D );
			  return Err::m_nOK;
		  }
	  }
	  break; 
	
  case MODE_8x8:
  case MODE_8x8ref0:
	  {
		  xPredMb8x8Mode( rcMbDataAccess, pcRecBuffer );
	  }
	  break;

  default:
	  break;
  }
  return Err::m_nOK;
}

ErrVal MotionCompensation::compensateMbMotionSkip ( MbDataAccess&    rcMbDataAccess,
                                                    RefFrameList&    rcRefFrameList0,
													RefFrameList&    rcRefFrameList1,
													IntYuvMbBuffer*  pcRecBuffer,
													Bool             bCalcMv )
{
  MbMode eMbMode  = rcMbDataAccess.getMbData().getMbMode();

  switch( eMbMode )
  {
  case MODE_16x16:
	  {
		  IntMC8x8D cMC8x8D( B_8x8_0 );
		  Int       iRefIdx0    = rcMbDataAccess.getMbMotionData( LIST_0 ).getRefIdx();
		  Int       iRefIdx1    = rcMbDataAccess.getMbMotionData( LIST_1 ).getRefIdx();
		  IntFrame* pcRefFrame0 = ( iRefIdx0 > 0 ? rcRefFrameList0[ iRefIdx0 ] : NULL );
		  IntFrame* pcRefFrame1 = ( iRefIdx1 > 0 ? rcRefFrameList1[ iRefIdx1 ] : NULL );
		  xGetMbPredData( rcMbDataAccess, pcRefFrame0, pcRefFrame1, cMC8x8D );
		  xPredLuma(   pcRecBuffer, 16, 16, cMC8x8D );
		  xPredChroma( pcRecBuffer,  8,  8, cMC8x8D );
	  }
	  break;

  case MODE_16x8:
	  {
		  IntMC8x8D cMC8x8D0( B_8x8_0 );
		  IntMC8x8D cMC8x8D1( B_8x8_2 );
		  Int       iRefIdx0    = rcMbDataAccess.getMbMotionData( LIST_0 ).getRefIdx( PART_16x8_0 );
		  Int       iRefIdx1    = rcMbDataAccess.getMbMotionData( LIST_1 ).getRefIdx( PART_16x8_0 );
		  IntFrame* pcRefFrame0 = ( iRefIdx0 > 0 ? rcRefFrameList0[ iRefIdx0 ] : NULL );
		  IntFrame* pcRefFrame1 = ( iRefIdx1 > 0 ? rcRefFrameList1[ iRefIdx1 ] : NULL );
		  xGetMbPredData( rcMbDataAccess, pcRefFrame0, pcRefFrame1, cMC8x8D0 );
		  iRefIdx0    = rcMbDataAccess.getMbMotionData( LIST_0 ).getRefIdx( PART_16x8_1 );
		  iRefIdx1    = rcMbDataAccess.getMbMotionData( LIST_1 ).getRefIdx( PART_16x8_1 );
		  pcRefFrame0 = ( iRefIdx0 > 0 ? rcRefFrameList0[ iRefIdx0 ] : NULL );
		  pcRefFrame1 = ( iRefIdx1 > 0 ? rcRefFrameList1[ iRefIdx1 ] : NULL );
		  xGetMbPredData( rcMbDataAccess, pcRefFrame0, pcRefFrame1, cMC8x8D1 );
		  xPredLuma(   pcRecBuffer, 16, 8, cMC8x8D0 );
		  xPredLuma(   pcRecBuffer, 16, 8, cMC8x8D1 );
		  xPredChroma( pcRecBuffer,  8, 4, cMC8x8D0 );
		  xPredChroma( pcRecBuffer,  8, 4, cMC8x8D1 );
	  }
	  break;

  case MODE_8x16:
	  {
		  IntMC8x8D cMC8x8D0( B_8x8_0 );
		  IntMC8x8D cMC8x8D1( B_8x8_1 );
		  Int       iRefIdx0    = rcMbDataAccess.getMbMotionData( LIST_0 ).getRefIdx( PART_8x16_0 );
		  Int       iRefIdx1    = rcMbDataAccess.getMbMotionData( LIST_1 ).getRefIdx( PART_8x16_0 );
		  IntFrame* pcRefFrame0 = ( iRefIdx0 > 0 ? rcRefFrameList0[ iRefIdx0 ] : NULL );
		  IntFrame* pcRefFrame1 = ( iRefIdx1 > 0 ? rcRefFrameList1[ iRefIdx1 ] : NULL );
		  xGetMbPredData( rcMbDataAccess, pcRefFrame0, pcRefFrame1, cMC8x8D0 );
		  iRefIdx0    = rcMbDataAccess.getMbMotionData( LIST_0 ).getRefIdx( PART_8x16_1 );
		  iRefIdx1    = rcMbDataAccess.getMbMotionData( LIST_1 ).getRefIdx( PART_8x16_1 );
		  pcRefFrame0 = ( iRefIdx0 > 0 ? rcRefFrameList0[ iRefIdx0 ] : NULL );
		  pcRefFrame1 = ( iRefIdx1 > 0 ? rcRefFrameList1[ iRefIdx1 ] : NULL );
		  xGetMbPredData( rcMbDataAccess, pcRefFrame0, pcRefFrame1, cMC8x8D1 );
		  xPredLuma(   pcRecBuffer, 8, 16, cMC8x8D0 );
		  xPredLuma(   pcRecBuffer, 8, 16, cMC8x8D1 );
		  xPredChroma( pcRecBuffer, 4,  8, cMC8x8D0 );
		  xPredChroma( pcRecBuffer, 4,  8, cMC8x8D1 );
	  }
	  break;

  case MODE_SKIP:
	  {
		  if( rcMbDataAccess.getSH().isInterB() )
		  {
			  B8x8Idx c8x8Idx;
			  RNOK( compensateDirectBlock( rcMbDataAccess, pcRecBuffer, c8x8Idx, rcRefFrameList0, rcRefFrameList1 ) ); c8x8Idx++;
			  RNOK( compensateDirectBlock( rcMbDataAccess, pcRecBuffer, c8x8Idx, rcRefFrameList0, rcRefFrameList1 ) ); c8x8Idx++;
			  RNOK( compensateDirectBlock( rcMbDataAccess, pcRecBuffer, c8x8Idx, rcRefFrameList0, rcRefFrameList1 ) ); c8x8Idx++;
			  RNOK( compensateDirectBlock( rcMbDataAccess, pcRecBuffer, c8x8Idx, rcRefFrameList0, rcRefFrameList1 ) ); ;
		  }
		  else
		  {
//	TMM_EC {{
			  if ( rcMbDataAccess.getSH().m_eErrorConceal == EC_TEMPORAL_DIRECT)
				  bCalcMv	=	true;
//  TMM_EC }}
			  IntMC8x8D cMC8x8D( B_8x8_0 );
			  
			  Int       iRefIdx0    = rcMbDataAccess.getMbMotionData( LIST_0 ).getRefIdx( PART_8x16_0 );
			  Int       iRefIdx1    = rcMbDataAccess.getMbMotionData( LIST_1 ).getRefIdx( PART_8x16_0 );
			  IntFrame* pcRefFrame0 = ( iRefIdx0 > 0 ? rcRefFrameList0[ iRefIdx0 ] : NULL );
			  IntFrame* pcRefFrame1 = ( iRefIdx1 > 0 ? rcRefFrameList1[ iRefIdx1 ] : NULL );
			  
			  xGetMbPredData( rcMbDataAccess, pcRefFrame0, pcRefFrame1, cMC8x8D );
			  xPredLuma(   pcRecBuffer, 16, 16, cMC8x8D );
			  xPredChroma( pcRecBuffer,  8,  8, cMC8x8D );

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?