⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sliceencoder.cpp

📁 JMVM MPEG MVC/3DAV 测试平台 国际通用标准
💻 CPP
📖 第 1 页 / 共 3 页
字号:




ErrVal SliceEncoder::encodeIntraPicture( UInt&        ruiBits,
                                         ControlData& rcControlData, 
                                         IntFrame*    pcFrame, 
                                         IntFrame*    pcRecSubband,
                                         IntFrame*    pcBaseLayer,
                                         IntFrame*    pcPredSignal,
                                         UInt         uiMbInRow, 
                                         Double       dLambda )
{
  ROF( m_bInitDone );

  SliceHeader&  rcSliceHeader     = *rcControlData.getSliceHeader           ();
  MbDataCtrl*   pcMbDataCtrl      =  rcControlData.getMbDataCtrl            ();
  MbDataCtrl*   pcBaseLayerCtrl   =  rcControlData.getBaseLayerCtrl         ();
  Int           iSpatialScalabilityType =  rcControlData.getSpatialScalabilityType(); // TMM_ESS

  RNOK( pcMbDataCtrl      ->initSlice         ( rcSliceHeader, ENCODE_PROCESS, false, NULL ) );
  if( pcBaseLayerCtrl )
  {
    RNOK( pcBaseLayerCtrl ->initSlice         ( rcSliceHeader, PRE_PROCESS,    false, NULL ) );
  }
  RNOK( m_pcControlMng    ->initSliceForCoding( rcSliceHeader ) );

  //====== initialization ======
  UInt          uiMbAddress         = rcSliceHeader.getFirstMbInSlice ();
  UInt          uiLastMbAddress     = rcSliceHeader.getLastMbInSlice  ();
  UInt          uiBits              = m_pcMbCoder ->getBitCount       ();

  if(uiMbAddress == -1) return Err::m_nOK;

  //===== loop over macroblocks =====
  for(  ; uiMbAddress <= uiLastMbAddress;  ) //--ICU/ETRI FMO Implementation
  {
    ETRACE_NEWMB( uiMbAddress );

    UInt          uiMbY                 = uiMbAddress / uiMbInRow;
    UInt          uiMbX                 = uiMbAddress % uiMbInRow;
    MbDataAccess* pcMbDataAccess        = 0;
    MbDataAccess* pcMbDataAccessBase    = 0;

    RNOK( pcMbDataCtrl      ->initMb          ( pcMbDataAccess,     uiMbY, uiMbX ) );
    if( pcBaseLayerCtrl )
    {
      RNOK( pcBaseLayerCtrl ->initMb          ( pcMbDataAccessBase, uiMbY, uiMbX ) );
    }
    RNOK( m_pcControlMng    ->initMbForCoding ( *pcMbDataAccess,    uiMbAddress  ) );
    pcMbDataAccess->getMbData().deactivateMotionRefinement();

    RNOK( m_pcMbEncoder     ->encodeIntra     ( *pcMbDataAccess,
                                                pcMbDataAccessBase,
                                                pcFrame,
                                                pcRecSubband,
                                                pcBaseLayer,
                                                pcPredSignal,
                                                dLambda ) );
    RNOK( m_pcMbCoder       ->encode          ( *pcMbDataAccess,
                                                pcMbDataAccessBase,
                                                iSpatialScalabilityType,
                                                ( uiMbAddress == uiLastMbAddress ) ) );

    uiMbAddress = rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress );
  }
  
  ruiBits += m_pcMbCoder->getBitCount() - uiBits;

  return Err::m_nOK;
}





ErrVal SliceEncoder::encodeHighPassPicture( UInt&         ruiMbCoded,
                                            UInt&         ruiBits,
                                            SliceHeader&  rcSH,
                                            IntFrame*     pcFrame,
                                            IntFrame*     pcResidual,
                                            IntFrame*     pcPredSignal,
																						IntFrame*			pcSRFrame, // JVT-R091
                                            IntFrame*     pcBaseSubband,
                                            IntFrame*     pcBaseLayer,
                                            MbDataCtrl*   pcMbDataCtrl,
                                            MbDataCtrl*   pcMbDataCtrlBaseMotion,
                                            UInt          uiMbInRow,
                                            Double        dLambda,
                                            Int           iMaxDeltaQp,
                                            Int           iSpatialScalabilityType)
{
  ROF( m_bInitDone );

  RNOK( pcMbDataCtrl  ->initSlice         ( rcSH, PRE_PROCESS, false, NULL ) );
  RNOK( m_pcControlMng->initSliceForCoding( rcSH              ) );

  //====== initialization ======
  UInt            uiMbAddress       = rcSH.getFirstMbInSlice();
  UInt            uiLastMbAddress   = rcSH.getLastMbInSlice();
  UInt            uiBits            = m_pcMbCoder->getBitCount();
  Int             iQPRes            = rcSH.getPicQp();
  Int             iQPIntra          = rcSH.getPicQp(); //- 2;

  IntYuvMbBuffer  cZeroBuffer;
  cZeroBuffer.setAllSamplesToZero();

  //===== loop over macroblocks =====
  for(  ruiMbCoded = 0; uiMbAddress <= uiLastMbAddress;  ) //--ICU/ETRI FMO Implementation
  {
    ETRACE_NEWMB( uiMbAddress );

    UInt          uiMbY                 = uiMbAddress / uiMbInRow;
    UInt          uiMbX                 = uiMbAddress % uiMbInRow;
    MbDataAccess* pcMbDataAccess        = 0;
    Bool          bCoded;


    RNOK( pcMbDataCtrl    ->initMb          (  pcMbDataAccess,    uiMbY, uiMbX ) );
    RNOK( m_pcControlMng  ->initMbForCoding ( *pcMbDataAccess,    uiMbAddress  ) );
    pcMbDataAccess->getMbData().deactivateMotionRefinement();

    MbDataAccess* pcMbDataAccessBase  = 0;

    if( pcMbDataCtrlBaseMotion)
    {
      RNOK( pcMbDataCtrlBaseMotion->initMb  ( pcMbDataAccessBase, uiMbY, uiMbX ) );
    }

    if( pcMbDataAccess->getMbData().isIntra() )
    {
      pcMbDataAccess->getMbData().setQp( iQPIntra );

      RNOK( m_pcMbEncoder ->encodeIntra   ( *pcMbDataAccess, pcMbDataAccessBase, pcFrame, pcResidual, pcBaseLayer, pcPredSignal, dLambda ) );
      RNOK( m_pcMbCoder   ->encode        ( *pcMbDataAccess, pcMbDataAccessBase, iSpatialScalabilityType, (uiMbAddress == uiLastMbAddress ) ) );

			//-- JVT-R091
			// update with best data (intra)
			pcSRFrame->getFullPelYuvBuffer()->loadBuffer( m_pcMbEncoder->getBestIntData() );	
			//--

      ruiMbCoded++;
    }
    else
    {
      pcMbDataAccess->getMbData().setQp( iQPRes );

      m_pcTransform->setClipMode( false );
      RNOK( m_pcMbEncoder ->encodeResidual  ( *pcMbDataAccess, 
                                               pcFrame, 
                                               pcResidual, 
                                               pcBaseSubband,
																							 pcSRFrame, // JVT-R091
																							 bCoded, dLambda, iMaxDeltaQp ) );

      if( pcMbDataAccess->getSH().getBaseLayerId() != MSYS_UINT_MAX && ! pcMbDataAccess->getSH().getAdaptivePredictionFlag() )
      {
        ROF( pcMbDataAccess->getMbData().getResidualPredFlag( PART_16x16 ) );
        pcMbDataAccess->getMbData().setBLSkipFlag( true );
      }

      m_pcTransform->setClipMode( true );

      RNOK( m_pcMbCoder->encode( *pcMbDataAccess, pcMbDataAccessBase, iSpatialScalabilityType, (uiMbAddress == uiLastMbAddress ) ) );

      if( bCoded )
      {
        ruiMbCoded++;
      }


      if( pcMbDataAccess->getMbData().getResidualPredFlag( PART_16x16 ) )
      {
        pcMbDataAccess->getMbData().setMbExtCbp( pcMbDataAccess->getMbData().getMbExtCbp() | pcMbDataAccessBase->getMbData().getMbExtCbp() );
      }

			//-- JVT-R091
			// update with best-data (inter)
			IntYuvMbBuffer	cPredBuffer, cResBuffer;
			cPredBuffer.loadBuffer	( ((IntFrame*)pcSRFrame		)->getFullPelYuvBuffer() );
			cResBuffer.	loadBuffer	( ((IntFrame*)pcResidual  )->getFullPelYuvBuffer() );
			cPredBuffer.add					( cResBuffer );	
			cPredBuffer.clip				();
			pcSRFrame->getFullPelYuvBuffer()->loadBuffer( &cPredBuffer );
			//--

      RNOK( pcPredSignal->getFullPelYuvBuffer()->loadBuffer( &cZeroBuffer ) );
    }

    uiMbAddress = rcSH.getFMO()->getNextMBNr(uiMbAddress);
  }

  ruiBits += m_pcMbCoder->getBitCount() - uiBits;

  return Err::m_nOK;
}


ErrVal
SliceEncoder::encodeSlice( SliceHeader&  rcSliceHeader,
                           IntFrame*     pcFrame,
                           MbDataCtrl*   pcMbDataCtrl,
                           RefFrameList& rcList0,
                           RefFrameList& rcList1,
                           UInt          uiMbInRow,
                           Double        dlambda 
#if JMVM_ONLY  // JVT-W081 
						 , GDV* gdvL0,
						   GDV* gdvL1,
						   UInt uiCodedFrames
#endif  // JVT-W081
						   )
{
  ROF( pcFrame );
  ROF( pcMbDataCtrl );

  //===== get co-located picture =====
  MbDataCtrl* pcMbDataCtrlL1 = NULL;
  if( rcList1.getActive() && rcList1.getEntry( 0 )->getRecPicBufUnit() )
  {
    pcMbDataCtrlL1 = rcList1.getEntry( 0 )->getRecPicBufUnit()->getMbDataCtrl();
  }
  ROT( rcSliceHeader.isInterB() && ! pcMbDataCtrlL1 );

#if JMVM_ONLY  // JVT-W081  
  char c;
  UInt ui;
  Int i, reconL0, reconL1;
  long reconOffset, sizeofMB, sizeofFrame;  
  GDV* disparityL0;
  GDV* disparityL1;
  SpsMvcExtension* rcSpsMvc = rcSliceHeader.getSPS().getSpsMVC();
  UInt uiNumNonAnchorRefsL0;
  UInt uiNumNonAnchorRefsL1;
 
  if ( !rcSliceHeader.getAVCFlag() && rcSliceHeader.getMotionSkip() )
  {	  
	  if (!rcSliceHeader.getSPS().getSpsMVC()->getSingleLoopDecoding() )  // JVT-Y042
	  {
		  uiNumNonAnchorRefsL0 = rcSpsMvc->getNumNonAnchorRefsForListX (rcSliceHeader.getViewId(), LIST_0);
		  uiNumNonAnchorRefsL1 = rcSpsMvc->getNumNonAnchorRefsForListX (rcSliceHeader.getViewId(), LIST_1);		  
	  }
	  else
	  {
		  uiNumNonAnchorRefsL0 = rcSpsMvc->getNumNonAnchorRefsSldForListX (rcSliceHeader.getViewId(), LIST_0);
		  uiNumNonAnchorRefsL1 = rcSpsMvc->getNumNonAnchorRefsSldForListX (rcSliceHeader.getViewId(), LIST_1);
	  }

	  disparityL0 = new GDV [uiNumNonAnchorRefsL0];
	  disparityL1 = new GDV [uiNumNonAnchorRefsL1];
	 
	  if(!rcSliceHeader.getAnchorPicFlag())
	  {
		  reconOffset=0; 
		  sizeofMB = (sizeof(char)*80 + sizeof(Int)*79 + sizeof(UShort) );
		  sizeofFrame = (sizeof(char) + sizeof(Int) + sizeofMB*rcSliceHeader.getMbInPic());

		  if (!rcSliceHeader.getSPS().getSpsMVC()->getSingleLoopDecoding() ) // JVT-Y042
		  {
			  for(ui=0; ui<uiNumNonAnchorRefsL0; ui++)
			  {
				  reconL0 = fseek (fFwdMv[ui], uiCodedFrames * sizeofFrame, 0);
				  fread(&c, sizeof(char),1, fFwdMv[ui]);
				  fread(&i, sizeof(Int), 1, fFwdMv[ui]);
				  if (c!='P' || rcSliceHeader.getPoc() != i) { Err::m_nERR; }
			  }
		  }
		  else
		  {
			  if ( rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsSldForListX(rcSliceHeader.getViewId(), LIST_0) > 0 )
			  {
				  reconL0 = fseek (fFwdMvSLD, uiCodedFrames * sizeofFrame, 0);
				  fread(&c, sizeof(char),1, fFwdMvSLD);
				  fread(&i, sizeof(Int),1, fFwdMvSLD);
				  if (c!='P' || rcSliceHeader.getPoc() != i) { Err::m_nERR; }
			  }
		  }

		  if (!rcSliceHeader.getSPS().getSpsMVC()->getSingleLoopDecoding() ) // JVT-Y042
		  {
			  for(ui=0; ui<uiNumNonAnchorRefsL1; ui++)
			  {
				  reconL1 = fseek (fBwdMv[ui], uiCodedFrames * sizeofFrame, 0);			
				  fread(&c, sizeof(char),1, fBwdMv[ui]);
				  fread(&i, sizeof(Int), 1, fBwdMv[ui]);
				  if (c!='P' || rcSliceHeader.getPoc() != i) { Err::m_nERR; }
			  } 
		  }
		  else
		  {
			  if ( rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsSldForListX(rcSliceHeader.getViewId(), LIST_1) > 0 )
			  {
				  reconL1 = fseek (fBwdMvSLD, uiCodedFrames * sizeofFrame, 0);
				  fread(&c, sizeof(char),1, fBwdMvSLD);
				  fread(&i, sizeof(Int),1, fBwdMvSLD);
				  if (c!='P' || rcSliceHeader.getPoc() != i) { Err::m_nERR; }
			  }

⌨️ 快捷键说明

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