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

📄 sliceencoder.cpp

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

  //===== initialization =====
  RNOK( pcMbDataCtrl  ->initSlice         ( rcSliceHeader, ENCODE_PROCESS, false, pcMbDataCtrlL1 ) );
  RNOK( m_pcControlMng->initSliceForCoding( rcSliceHeader ) );
//JVT-W080
	if( getPdsEnable() )
	{
		m_pcMbEncoder->setPdsEnable( getPdsEnable() );
	  m_pcMbEncoder->setFrameWidthInMbs( rcSliceHeader.getSPS().getFrameWidthInMbs() );
		m_pcMbEncoder->setPdsBlockSize( getPdsBlockSize() );
		UInt **ppuiPdsInitialDelayMinus2L0 = getPdsInitialDelayMinus2L0();
		UInt **ppuiPdsInitialDelayMinus2L1 = getPdsInitialDelayMinus2L1();
		m_pcMbEncoder->setPdsInitialDelayMinus2L0( ppuiPdsInitialDelayMinus2L0[rcSliceHeader.getViewId()] );
		m_pcMbEncoder->setPdsInitialDelayMinus2L1( ppuiPdsInitialDelayMinus2L1[rcSliceHeader.getViewId()] );
	}
//~JVT-W080
  //===== loop over macroblocks =====
  for( UInt uiMbAddress = rcSliceHeader.getFirstMbInSlice(); uiMbAddress <= rcSliceHeader.getLastMbInSlice(); uiMbAddress = rcSliceHeader.getFMO()->getNextMBNr( uiMbAddress ) )
  {
    ETRACE_NEWMB( uiMbAddress );

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

    RNOK( pcMbDataCtrl  ->initMb          (  pcMbDataAccess, uiMbY, uiMbX ) );
    RNOK( m_pcControlMng->initMbForCoding ( *pcMbDataAccess, uiMbAddress  ) );
//JVT-W080
    if( getPdsEnable() )
		{
		  m_pcMbEncoder->setCurrMBX             (  uiMbX );
		  m_pcMbEncoder->setCurrMBY             (  uiMbY );
		}
//~JVT-W080

#if JMVM_ONLY  // JVT-W081 
	class MBMotion FMb;
    FMb.m_iViewMode=INTRA_4X4;


	//JVT-Z021

	Mv cDis;

	Bool bIsViewLevel1;

	Mv cCenterL0, cCenterL1;

    //JVT-Z021

	if ( !rcSliceHeader.getAVCFlag() && rcSliceHeader.getMotionSkip() )
	{
		//JVT-Z021

		if(rcSliceHeader.getSPS().getSpsMVC()->getSingleLoopDecoding()) //SLD

		{

			bIsViewLevel1 = (!rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsSldForListX (rcSliceHeader.getViewId(), LIST_1)) ? true : false;

		}

		else

		{

			bIsViewLevel1 = (!rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsForListX (rcSliceHeader.getViewId(), LIST_1)) ? true : false;

		}

		

		//JVT-Z021

		FILE* fMotionFwd = NULL;

		FILE* fMotionBwd = NULL;

        //JVT-Z021

		FILE* fMotion = NULL;
		Int iVIdL0=-1;
		Int iVIdL1=-1;
		Int iCurVId = rcSliceHeader.getViewId();
		uiNumNonAnchorRefsL0 = rcSpsMvc->getNumNonAnchorRefsForListX (rcSliceHeader.getViewId(), LIST_0);
		uiNumNonAnchorRefsL1 = rcSpsMvc->getNumNonAnchorRefsForListX (rcSliceHeader.getViewId(), LIST_1);
		
		if ( !rcSliceHeader.getAnchorPicFlag() )			
		{
			if (!rcSliceHeader.getSPS().getSpsMVC()->getSingleLoopDecoding() )  // JVT-Y042
			{
				for(UInt i=0; i<uiNumNonAnchorRefsL0; i++)
				{
					RNOK( pcMbDataAccess->deriveDisparity(*pcMbDataAccess, disparityL0[i], gdvL0[i] ) );
				}
			}
			else
			{
				if( rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsSldForListX(rcSliceHeader.getViewId(), LIST_0)	> 0)
				{
					RNOK( pcMbDataAccess->deriveDisparity(*pcMbDataAccess, disparityL0[0], gdvL0[0] ) );  
				}
			}

			if (!rcSliceHeader.getSPS().getSpsMVC()->getSingleLoopDecoding() )  // JVT-Y042
			{
				for(UInt i=0; i<uiNumNonAnchorRefsL1; i++)
				{
					RNOK( pcMbDataAccess->deriveDisparity(*pcMbDataAccess, disparityL1[i], gdvL1[i] ) );
				}
			}
			else
			{
				if( rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsSldForListX(rcSliceHeader.getViewId(), LIST_1)	> 0)
				{
					RNOK( pcMbDataAccess->deriveDisparity(*pcMbDataAccess, disparityL1[0],	gdvL1[0] ) );
				}
			}

//JVT-Z021

			if (!rcSliceHeader.getSPS().getSpsMVC()->getSingleLoopDecoding() )

			{

				if(uiNumNonAnchorRefsL0>0)

				{

					iVIdL0 = rcSliceHeader.getSPS().getSpsMVC()->getNonAnchorRefForListX(iCurVId,0,0);

					fMotionFwd = m_pcMbEncoder->getMotionFile(rcSliceHeader, iVIdL0, 0);

				}

				if(uiNumNonAnchorRefsL1>0)

				{

					iVIdL1 = rcSliceHeader.getSPS().getSpsMVC()->getNonAnchorRefForListX(iCurVId,0,1);

					fMotionBwd = m_pcMbEncoder->getMotionFile(rcSliceHeader, iVIdL1, 1);

				}

				pcMbDataAccess->getOrgMbMotionInfo(fMotionFwd, fMotionBwd, disparityL0[0], disparityL1[0], uiCodedFrames, bIsViewLevel1, uiMbInRow, sizeofMB, sizeofFrame);

				pcMbDataAccess->getNewMbMotionInfo(disparityL0[0], disparityL1[0], cCenterL0, cCenterL1);



				RNOK( m_pcMbEncoder->getNeighborMbMotionInfo( *pcMbDataAccess, cCenterL0, cCenterL1, FMb ) );	

			}

			else

			{

				if( rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsSldForListX(rcSliceHeader.getViewId(), LIST_0)	> 0)

				{

					fMotionFwd = fFwdMvSLD;

				}

				if( rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsSldForListX(rcSliceHeader.getViewId(), LIST_1)	> 0)

				{

					fMotionBwd = fBwdMvSLD;

				}

				pcMbDataAccess->getOrgMbMotionInfo(fMotionFwd, fMotionBwd, disparityL0[0], disparityL1[0], uiCodedFrames, bIsViewLevel1, uiMbInRow, sizeofMB, sizeofFrame);

				pcMbDataAccess->getNewMbMotionInfo(disparityL0[0], disparityL1[0], cCenterL0, cCenterL1);



				Mv sldDisparityL0, sldDisparityL1;

				sldDisparityL0.setHor(disparityL0[0].getHor());

				sldDisparityL0.setVer(disparityL0[0].getVer());

				sldDisparityL1.setHor(disparityL1[0].getHor());

				sldDisparityL1.setVer(disparityL1[0].getVer());



				if (rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsSldForListX(rcSliceHeader.getViewId(), LIST_0) > 0 )

				{

					RNOK( pcMbDataAccess->xReadMbInfoFile(fFwdMvSLD, &FMb, sldDisparityL0) );

				}



				if ( FMb.m_iViewMode >= INTRA_4X4 ) 

				{

					if (rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsSldForListX(rcSliceHeader.getViewId(), LIST_1) > 0	)

					{

						RNOK( pcMbDataAccess->xReadMbInfoFile ( fBwdMvSLD, &FMb, sldDisparityL1) );

					}

				}

			}

//JVT-Z021

	}
	}
	RNOK( m_pcMbEncoder ->encodeMacroblock( *pcMbDataAccess,
											 pcFrame,
											 rcList0,
											 rcList1,
											 m_pcCodingParameter->getMotionVectorSearchParams().getNumMaxIter(),
											 m_pcCodingParameter->getMotionVectorSearchParams().getIterSearchRange(),                 
											 dlambda, 
											 //FMb    linsx
											 //JVT-Z021
											 cCenterL0, cCenterL1
											 //JVT-Z021
											 ) );
#else  // JVT-W081
    RNOK( m_pcMbEncoder ->encodeMacroblock( *pcMbDataAccess,
                                             pcFrame,
                                             rcList0,
                                             rcList1,
                                             m_pcCodingParameter->getMotionVectorSearchParams().getNumMaxIter(),
                                             m_pcCodingParameter->getMotionVectorSearchParams().getIterSearchRange(),
                                             dlambda ) );
#endif

#if JMVM_ONLY  // JVT-W081
	if ( m_bMotionSkipEnalbe )
	{
		RNOK( pcMbDataAccess->xWriteMbInfoFile(*pcMbDataAccess, &rcList0, &rcList1 ) );
	}
#endif  // JVT-W081 

    RNOK( m_pcMbCoder   ->encode          ( *pcMbDataAccess, NULL, SST_RATIO_1,
                                             ( uiMbAddress == rcSliceHeader.getLastMbInSlice() ) ) );
  }

#if		JMVM_ONLY
  if ( !rcSliceHeader.getAVCFlag() && rcSliceHeader.getMotionSkip())
  {
	  delete [] disparityL0;
	  delete [] disparityL1;
  }  
#endif //JMVM_ONLY

  return Err::m_nOK;
}


//TMM_WP
ErrVal SliceEncoder::xInitDefaultWeights(Double *pdWeights, UInt uiLumaWeightDenom, 
                                         UInt uiChromaWeightDenom)
{
    const Int iLumaWeight = 1 << uiLumaWeightDenom;
    const Int iChromaWeight = 1 << uiChromaWeightDenom;
    
    pdWeights[0] = iLumaWeight;
    pdWeights[1] = pdWeights[2] = iChromaWeight;

    return Err::m_nOK;
}

ErrVal SliceEncoder::xSetPredWeights( SliceHeader& rcSH, 
                                      IntFrame* pOrgFrame,
                                      RefFrameList& rcRefFrameList0,
                                      RefFrameList& rcRefFrameList1)
    
{
  RNOK( rcSH.getPredWeightTable(LIST_0).uninit() );
  RNOK( rcSH.getPredWeightTable(LIST_1).uninit() );
  RNOK( rcSH.getPredWeightTable(LIST_0).init( rcSH.getNumRefIdxActive( LIST_0) ) );
  RNOK( rcSH.getPredWeightTable(LIST_1).init( rcSH.getNumRefIdxActive( LIST_1) ) );

  ROTRS( rcSH.isIntra(), Err::m_nOK );

  const SampleWeightingParams& rcSWP = m_pcCodingParameter->getSampleWeightingParams(rcSH.getLayerId());

  { // determine denoms
    const UInt uiLumaDenom = rcSWP.getLumaDenom();
    rcSH.setLumaLog2WeightDenom  ( ( uiLumaDenom == MSYS_UINT_MAX ) ? gIntRandom(0,7) : uiLumaDenom );

    const UInt uiChromaDenom = rcSWP.getChromaDenom();
    rcSH.setChromaLog2WeightDenom( ( uiChromaDenom == MSYS_UINT_MAX ) ? gIntRandom(0,7) : uiChromaDenom );
  }

  const Int iChromaScale = 1<<rcSH.getChromaLog2WeightDenom();
  const Int iLumaScale   = 1<<rcSH.getLumaLog2WeightDenom();

   m_pcControlMng->initSliceForWeighting(rcSH);

  if( rcSH.isInterB() )
  {
      ROTRS( 1 != rcSH.getPPS().getWeightedBiPredIdc(), Err::m_nOK );
  }
  else
  {
    ROTRS( ! rcSH.getPPS().getWeightedPredFlag(), Err::m_nOK );
  }

  if( rcSH.isInterB() )
  {
      RNOK( rcSH.getPredWeightTable(LIST_1).initDefaults( rcSH.getLumaLog2WeightDenom(), rcSH.getChromaLog2WeightDenom() ) );
  }
  RNOK( rcSH.getPredWeightTable(LIST_0).initDefaults( rcSH.getLumaLog2WeightDenom(), rcSH.getChromaLog2WeightDenom() ) );

  Double afFwWeight[MAX_REF_FRAMES][3];
  Double afBwWeight[MAX_REF_FRAMES][3];

  Double afFwOffsets[MAX_REF_FRAMES][3];
  Double afBwOffsets[MAX_REF_FRAMES][3];

  Double fDiscardThr = m_pcCodingParameter->getSampleWeightingParams(rcSH.getLayerId()).getDiscardThr();

  /* init arrays with default weights */
  for (UInt x = 0; x < MAX_REF_FRAMES; x++)
  {
      xInitDefaultWeights(afFwWeight[x], rcSH.getLumaLog2WeightDenom(), rcSH.getChromaLog2WeightDenom());
      xInitDefaultWeights(afBwWeight[x], rcSH.getLumaLog2WeightDenom(), rcSH.getChromaLog2WeightDenom());

      afFwOffsets[x][0] = afFwOffsets[x][1] = afFwOffsets[x][2] = 0;
      afBwOffsets[x][0] = afBwOffsets[x][1] = afBwOffsets[x][2] = 0;
  }
  
  if( rcSH.isInterB() )
  {
      RNOK( m_pcMbEncoder->getPredWeights( rcSH, LIST_1, afBwWeight, 
                                           pOrgFrame, rcRefFrameList1 ) );      
      RNOK( rcSH.getPredWeightTable( LIST_1).setPredWeightsAndFlags( iLumaScale, iChromaScale, 
                                                                     afBwWeight, fDiscardThr ) );
  }

  RNOK( m_pcMbEncoder->getPredWeights( rcSH, LIST_0, afFwWeight, pOrgFrame, rcRefFrameList0 ) );
  RNOK( rcSH.getPredWeightTable( LIST_0).setPredWeightsAndFlags( iLumaScale, iChromaScale, 
                                                                 afFwWeight, fDiscardThr ) );  

  return Err::m_nOK;
}
//TMM_WP


H264AVC_NAMESPACE_END

⌨️ 快捷键说明

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