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

📄 sliceencoder.cpp

📁 JVT-Z203_jsvm.rar
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    }

    // JVT-W043 {
    if ( bRateControlEnable && !pcJSVMParams->m_uiLayerId )
    {
      pcGenericRC->m_iNumberofHeaderBits           += pcGenericRC->m_iRCHeaderBits;
      pcGenericRC->m_iNumberofBasicUnitHeaderBits  += pcGenericRC->m_iRCHeaderBits;
      pcGenericRC->m_iNumberofTextureBits          += pcGenericRC->m_iRCTextureBits;
      pcGenericRC->m_iNumberofBasicUnitTextureBits += pcGenericRC->m_iRCTextureBits;
      pcGenericRC->m_pcJSVMParams->NumberofCodedMacroBlocks++;
    }
    // JVT-W043 }
		//JVT-X046 {
    uiCodedMBNumber++;
		if (m_uiSliceMode==1) //fixed slice size in number of MBs
		{
			if (uiCodedMBNumber >= m_uiSliceArgument)// this slice is done
			{
				RNOK( m_pcMbCoder       ->encode         ( *pcMbDataAccess,
					pcMbDataAccessBase,
					true, true ) );
				rcControlData.m_uiCurrentFirstMB = rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress );
				rcSliceHeader.setNumMbsInSlice(uiCodedMBNumber);
				if (rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress)==-1)
					rcControlData.m_bSliceGroupAllCoded = true;
				break;
			}
			else
			{
				RNOK( m_pcMbCoder       ->encode         ( *pcMbDataAccess,
					pcMbDataAccessBase,
					(uiMbAddress == uiLastMbAddress), 
					true ) );
			}
		}
		else if(m_uiSliceMode==2) //fixed slice size in number of bytes
		{
			RNOK( m_pcMbCoder       ->encode         ( *pcMbDataAccess,
				pcMbDataAccessBase,
				(uiMbAddress == uiLastMbAddress), 
				true ) );
			if ((rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress)==-1) && (!m_pcMbCoder->bSliceCodedDone))
				rcControlData.m_bSliceGroupAllCoded = true;
			if (m_pcMbCoder->bSliceCodedDone==true)	
			{
				rcControlData.m_uiCurrentFirstMB = uiMbAddress;
				rcSliceHeader.setNumMbsInSlice(uiCodedMBNumber-1);

				//set SliceId equal to zero because this MBData belong to the next slice
				MbData* tempMbData;
				tempMbData=pcMbDataCtrl->xGetMbData(rcControlData.m_uiCurrentFirstMB);
				tempMbData->setSliceId( 0 );
				break;
			}
		}
		else 
		{
			RNOK( m_pcMbCoder       ->encode         ( *pcMbDataAccess,
				pcMbDataAccessBase,
				(uiMbAddress == uiLastMbAddress), 
				true ) );
		}
		//JVT-X046 }
    uiMbAddress = rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress );
		//JVT-X046 {
		if (uiMbAddress==-1)
		{
			rcControlData.m_bSliceGroupAllCoded=true;
			break;
		}
		//JVT-X046 }
  }

	if( ePicType!=FRAME )
	{
		if( pcFrame )             RNOK( pcFrame            ->removeFieldBuffer( ePicType ) );
		if( pcRecSubband )        RNOK( pcRecSubband       ->removeFieldBuffer( ePicType ) );
		if( pcPredSignal )        RNOK( pcPredSignal       ->removeFieldBuffer( ePicType ) );
		if( pcBaseLayerFrame )    RNOK( pcBaseLayerFrame   ->removeFieldBuffer( ePicType ) );
		if( pcBaseLayerResidual ) RNOK( pcBaseLayerResidual->removeFieldBuffer( ePicType ) );
	}

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

  return Err::m_nOK;
}




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

  SliceHeader&  rcSliceHeader           = *rcControlData.getSliceHeader           ( ePicType );
  MbDataCtrl*   pcMbDataCtrl      =  rcControlData.getMbDataCtrl            ();
  MbDataCtrl*   pcBaseLayerCtrl   =  rcControlData.getBaseLayerCtrl         ();
  
  //====== initialization ======
  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;
  if( ePicType!=FRAME )
	{
		if( pcFrame )      RNOK( pcFrame     ->addFieldBuffer( ePicType ) );
		if( pcRecSubband ) RNOK( pcRecSubband->addFieldBuffer( ePicType ) );
		if( pcBaseLayer )  RNOK( pcBaseLayer ->addFieldBuffer( ePicType ) );
		if( pcPredSignal ) RNOK( pcPredSignal->addFieldBuffer( ePicType ) );
	}
  
	//JVT-X046 {
	UInt uiCodedMBNumber = 0;
	m_pcMbCoder->bSliceCodedDone = false;
	//JVT-X046 }

  //===== loop over macroblocks =====
  for(  ; uiMbAddress <= uiLastMbAddress;  ) //--ICU/ETRI FMO Implementation
  {
    // JVT-W043 {
    if ( bRateControlEnable && !pcJSVMParams->m_uiLayerId )
    {
      pcGenericRC->m_pcJSVMParams->current_mb_nr = uiMbAddress;
      if( pcGenericRC->m_pcJSVMParams->basicunit == pcGenericRC->m_pcJSVMParams->FrameSizeInMbs ) {
        // qp remains unchanged
      }
      // basic unit layer rate control
      else if ( pcGenericRC->m_pcJSVMParams->RCUpdateMode == RC_MODE_1 ) {
        if( pcGenericRC->m_pcJSVMParams->NumberofCodedMacroBlocks > 0 
          && (pcGenericRC->m_pcJSVMParams->NumberofCodedMacroBlocks % pcGenericRC->m_pcJSVMParams->BasicUnit) == 0 ) {
            // frame coding
            if( pcGenericRC->m_pcJSVMParams->frame_mbs_only_flag ) {
              pcQuadraticRC->updateRCModel();
              if ( pcJSVMParams->m_uiIntraPeriod != 1 )
                pcGenericRC->m_pcJSVMParams->qp = pcQuadraticRC->updateQPRC2(pcGenericRC->m_iTopFieldFlag);
              else
                pcGenericRC->m_pcJSVMParams->qp = pcQuadraticRC->updateQPRC1(pcGenericRC->m_iTopFieldFlag);
            }
          }
      }
    }
    // JVT-W043 }
    ETRACE_NEWMB( uiMbAddress );

    MbDataAccess* pcMbDataAccess     = NULL;
    MbDataAccess* pcMbDataAccessBase = NULL;
    UInt          uiMbY, uiMbX;
    Double        dCost              = 0;

    rcSliceHeader.getMbPositionFromAddress    ( uiMbY, uiMbX, uiMbAddress );

    RNOK( pcMbDataCtrl      ->initMb          ( pcMbDataAccess,     uiMbY, uiMbX ) );
    if( pcBaseLayerCtrl )
    {
      RNOK( pcBaseLayerCtrl ->initMb          ( pcMbDataAccessBase, uiMbY, uiMbX ) );
    }
    RNOK( m_pcControlMng    ->initMbForCoding ( *pcMbDataAccess,    uiMbY, uiMbX, false, false ) );
    pcMbDataAccess->setMbDataAccessBase( pcMbDataAccessBase );
    pcMbDataAccess->getMbData().setFieldFlag(ePicType!=FRAME);

    // JVT-W043 {
    if ( bRateControlEnable && !pcJSVMParams->m_uiLayerId )
    {
      pcMbDataAccess->getMbData().setQp( pcGenericRC->m_pcJSVMParams->qp );
    }
    // JVT-W043 }

    if( ! rcSliceHeader.getNoInterLayerPredFlag() )
    {
      m_pcMbEncoder->setBaseModeAllowedFlag( m_apabBaseModeFlagAllowedArrays[0][uiMbAddress] );
    }

    RNOK( m_pcMbEncoder     ->encodeIntra     ( *pcMbDataAccess,
                                                pcMbDataAccessBase,
                                                 pcFrame                   ->getPic( ePicType ),
                                                 pcFrame                   ->getPic( ePicType ),
                                                 pcRecSubband              ->getPic( ePicType ),
																								 pcBaseLayer ? pcBaseLayer ->getPic( ePicType ) : NULL,
																								 pcPredSignal              ->getPic( ePicType ),
                                                 dLambda,
                                                 dCost) );

    //JVT-X046 {
		uiCodedMBNumber++;
		if (m_uiSliceMode==1) //fixed slice size in number of MBs
		{		
			if (uiCodedMBNumber >= m_uiSliceArgument)//reach the fixed MB number
			{
				RNOK( m_pcMbCoder       ->encode          ( *pcMbDataAccess,
					pcMbDataAccessBase,
					true, true ) );
				rcControlData.m_uiCurrentFirstMB = rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress );
				rcControlData.getSliceHeader(ePicType)->setNumMbsInSlice(uiCodedMBNumber);
				if (rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress)==-1)
					rcControlData.m_bSliceGroupAllCoded = true;
				break;
			}
			else
			{
				RNOK( m_pcMbCoder       ->encode          ( *pcMbDataAccess,
					pcMbDataAccessBase,
					( uiMbAddress == uiLastMbAddress ), true ) );
			}
		}
		else if(m_uiSliceMode==2) //fixed slice size in number of MBs
		{
			RNOK( m_pcMbCoder       ->encode          ( *pcMbDataAccess,
				pcMbDataAccessBase,
				( uiMbAddress == uiLastMbAddress ), true ) );
			if ((rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress)==-1) && (!m_pcMbCoder->bSliceCodedDone))
				rcControlData.m_bSliceGroupAllCoded = true;
			if (m_pcMbCoder->bSliceCodedDone==true)// this slice is done
			{
				rcControlData.m_uiCurrentFirstMB = uiMbAddress;
				rcControlData.getSliceHeader(ePicType)->setNumMbsInSlice(uiCodedMBNumber-1);

				MbData* tempMbData;//set SliceId equal to zero because this MBData belong to the next slice
				tempMbData = pcMbDataCtrl->xGetMbData(rcControlData.m_uiCurrentFirstMB);
				tempMbData->setSliceId( 0 );
				break;
			}
		}
		else
		{
			RNOK( m_pcMbCoder       ->encode          ( *pcMbDataAccess,
			pcMbDataAccessBase,
			( uiMbAddress == uiLastMbAddress ), true ) );
		}
		//JVT-X046 }

    // JVT-W043 {
    if ( bRateControlEnable && !pcJSVMParams->m_uiLayerId )
    {
      pcGenericRC->m_iNumberofHeaderBits           += pcGenericRC->m_iRCHeaderBits;
      pcGenericRC->m_iNumberofBasicUnitHeaderBits  += pcGenericRC->m_iRCHeaderBits;
      pcGenericRC->m_iNumberofTextureBits          += pcGenericRC->m_iRCTextureBits;
      pcGenericRC->m_iNumberofBasicUnitTextureBits += pcGenericRC->m_iRCTextureBits;
      pcGenericRC->m_pcJSVMParams->NumberofCodedMacroBlocks++;
    }
    // JVT-W043 }
    uiMbAddress = rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress );
		//JVT-X046 {
		if (uiMbAddress==-1)
		{
			rcControlData.m_bSliceGroupAllCoded = true;
			break;
		}
		//JVT-X046 }
  }

  if( ePicType!=FRAME )
	{
		if( pcFrame )      RNOK( pcFrame     ->removeFieldBuffer( ePicType ) );
		if( pcRecSubband ) RNOK( pcRecSubband->removeFieldBuffer( ePicType ) );
		if( pcBaseLayer )  RNOK( pcBaseLayer ->removeFieldBuffer( ePicType ) );
		if( pcPredSignal ) RNOK( pcPredSignal->removeFieldBuffer( ePicType ) );
	}

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

  return Err::m_nOK;
}

// TMM_INTERLACE{
ErrVal SliceEncoder::encodeIntraPictureMbAff( UInt&				 ruiBits,
                                              ControlData& rcControlData,
                                              Frame*    pcOrgFrame,
                                              Frame*    pcFrame,
                                              Frame*    pcRecSubband,
                                              Frame*    pcBaseLayer,
                                              Frame*    pcPredSignal,
                                              UInt				 uiMbInRow,
                                              Double			 dLambda )
{
  ROF( m_bInitDone );

  SliceHeader&  rcSliceHeader           = *rcControlData.getSliceHeader           ( FRAME );
  MbDataCtrl*   pcMbDataCtrl            =  rcControlData.getMbDataCtrl            ();
  MbDataCtrl*   pcBaseLayerCtrl         =  rcControlData.getBaseLayerCtrl         ();
  MbDataCtrl*   pcBaseLayerCtrlField    =  rcControlData.getBaseLayerCtrlField   ();

  //====== initialization ======
  RNOK( pcMbDataCtrl      ->initSlice         ( rcSliceHeader, ENCODE_PROCESS, false, NULL ) );
  if( pcBaseLayerCtrl )
  {
    RNOK( pcBaseLayerCtrl ->initSlice         ( rcSliceHeader, PRE_PROCESS,    false, NULL ) );
  }

  if( pcBaseLayerCtrlField )
  {
    RNOK( pcBaseLayerCtrlField ->initSlice   ( rcSliceHeader, PRE_PROCESS,    false, NULL ) );
  }

  RNOK( m_pcControlMng    ->initSliceForCoding( rcSliceHeader ) );

  UInt uiBits = m_pcMbCoder ->getBitCount();

  Frame* apcOrgFrame  [4] = { NULL, NULL, NULL, NULL };
  Frame* apcFrame     [4] = { NULL, NULL, NULL, NULL };
  Frame* apcRecSubband[4] = { NULL, NULL, NULL, NULL };

⌨️ 快捷键说明

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