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

📄 mbdatactrl.cpp

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 CPP
📖 第 1 页 / 共 4 页
字号:
  //////////////////////////////////////////////////////////
  //VBL
  ///////////////////////////////////////////////////////////
  MbDataCtrl *pcBaseMbDataCtrl = &rcBaseMbDataCtrl;
  MbDataCtrl *pcVBLMbDataCtrl  = NULL;

  pcVBLMbDataCtrl=xBuildVirtualBaseLayer(pcBaseMbDataCtrl,m_bBuildInterlacePred,pcParameters);
  /////////////////////////////////////////////////////////////
  
 for( Int iMbY = iMbOrigY ; iMbY < iMbEndY; iMbY++)
  for(Int iMbX = iMbOrigX ; iMbX < iMbEndX; iMbX++)
			{
    MbData& rcMbDes = m_pcMbData[iMbY*uiMbStride + iMbX];
    RNOK( rcMbDes.copyMotionBL( pcVBLMbDataCtrl->m_pcMbData[(iMbY - iMbOrigY)*uiMbStride + (iMbX - iMbOrigX)], bDirect8x8, m_uiSliceId ) );
    rcMbDes.setInCropWindowFlag( true );
	 }

  //////////////////////////////////////////////////////////
  //VBL
  ///////////////////////////////////////////////////////////
  if( pcVBLMbDataCtrl !=pcBaseMbDataCtrl)
  {
    pcVBLMbDataCtrl->uninit();
    delete pcVBLMbDataCtrl;
	}
  /////////////////////////////////////////////////////////////

			return Err::m_nOK;
}

// motion upsampling with any cropping and upsampling factor
ErrVal
MbDataCtrl::xUpsampleMotionESS( MbDataCtrl&       rcBaseMbDataCtrl,
                                ResizeParameters* pcParameters )
{
  Bool bDirect8x8 = rcBaseMbDataCtrl.xGetDirect8x8InferenceFlag();
  
  if( pcParameters->m_iExtendedSpatialScalability == ESS_PICT )
  {
  Int index = m_pcSliceHeader->getPoc();
		pcParameters->setPoc( index );
  pcParameters->setCurrentPictureParametersWith(index);
  }

  Int     iScaledBaseOrigX = pcParameters->m_iPosX;
  Int     iScaledBaseOrigY = pcParameters->m_iPosY; 
  Int     iMbOrigX = (iScaledBaseOrigX+15) / 16;
	Int     iMbOrigY = (iScaledBaseOrigY+15) / 16;
	Int     iMbEndX = (iScaledBaseOrigX+pcParameters->m_iOutWidth) / 16;
	Int     iMbEndY = (iScaledBaseOrigY+pcParameters->m_iOutHeight) / 16;
  Int     aiPelOrig[2];  

  UInt	uiBaseMbStride, uiBLMbOffset, uiConfig=0;
  UInt	uiMbStride   = m_iMbPerLine;
  
  //////////////////////////////////////////////////////////
  //VBL
  //////////////////////////////////////////////////////////
  MbDataCtrl *pcBaseMbDataCtrl = &rcBaseMbDataCtrl;
  MbDataCtrl *pcVBLMbDataCtrl  = NULL;

  pcVBLMbDataCtrl=xBuildVirtualBaseLayer(pcBaseMbDataCtrl,m_bBuildInterlacePred,pcParameters);
	
  // SET PICTURE SIZE PARAMETERS 
  xInitVBLUpsampleData(pcVBLMbDataCtrl,pcParameters,uiConfig,iMbOrigY,iMbEndY ,iScaledBaseOrigY,uiBaseMbStride);
  /////////////////////////////////////////////////////////////

  
  // loop on MBs of high res picture
  //--------------------------------
  for( Int iMbY = 0; iMbY < m_iMbPerColumn; iMbY++ )
  {
    for( Int iMbX = 0; iMbX < m_iMbPerLine;   iMbX++ )
    {
      //VBL
      xInitVBLPelOrig( pcVBLMbDataCtrl,uiConfig,iMbX,iMbY,iScaledBaseOrigX,iScaledBaseOrigY,aiPelOrig,uiBLMbOffset);

      // get current high res MB and upsampling
      MbData& rcMbDes = m_pcMbData[iMbY*uiMbStride + iMbX];

			rcMbDes.configureFieldFrameMode( m_bBuildInterlacePred );	

      // check if MB is inside cropping window - if not, no upsampling is performed
      if ( (iMbX >= iMbOrigX) && (iMbX < iMbEndX) && (iMbY >= iMbOrigY) && (iMbY < iMbEndY) )
      {
         RNOK(rcMbDes.upsampleMotionESS(pcVBLMbDataCtrl->m_pcMbData+uiBLMbOffset,
                                         uiBaseMbStride,
                                         aiPelOrig,
										                     bDirect8x8,
                                         pcParameters));
           rcMbDes.setInCropWindowFlag( true );
		  }
      else
      {
          rcMbDes.noUpsampleMotion();
      }
	 } // end of for( Int iMbX = 0; iMbX < m_iMbPerLine;   iMbX++ )
  } // end of for( Int iMbY = 0; iMbY < m_iMbPerColumn; iMbY++ )

 //////////////////////////////////////////////////////////
  //VBL
  ///////////////////////////////////////////////////////////
  // RESET PICTURE SIZE PARAMETERS 
	xUninitVBLUpsampleData( pcParameters, uiConfig );
  
  if( pcVBLMbDataCtrl != pcBaseMbDataCtrl)
  {
    pcVBLMbDataCtrl->uninit();
    delete pcVBLMbDataCtrl;
  }
  /////////////////////////////////////////////////////////////

  return Err::m_nOK;
}


ErrVal
MbDataCtrl::xUninitVBLUpsampleData( ResizeParameters*   pcParameters,
                                    UInt                uiConfig )
{
if ( uiConfig == 2 )	// BL Prog -> VBL Prog -> EL Interl with He>=2.Hb
	{
		pcParameters->m_iOutHeight *= 2;
	}
  else if( uiConfig == 3 )	// BL prog, Frame or Field -> VBL Interl Field -> EL Interl
  {
		pcParameters->m_iInHeight  *= 2;
		pcParameters->m_iOutHeight *= 2;
  }
  else if( uiConfig == 4 )	// BL Field -> VBL Interl -> EL Prog
  {
		pcParameters->m_iInHeight  *= 2;
  }
  return Err::m_nOK;
}

ErrVal
MbDataCtrl::xInitVBLUpsampleData( MbDataCtrl*         pcBaseMbDataCtrl,
                                  ResizeParameters*   pcParameters,
                                  UInt&               ruiConfig,
                                  Int&                riMbOrigY,
                                  Int&                riMbEndY ,
                                  Int&                riScaledBaseOrigY,
                                  UInt&               ruiBaseMbStride     )
{
  const SliceHeader* pcBaseSliceHeader = pcBaseMbDataCtrl->m_pcSliceHeader;
	ROT( NULL == pcBaseSliceHeader);

  Bool  bBaseProg    = !pcBaseSliceHeader->isMbAff() && !pcBaseSliceHeader->getFieldPicFlag();
  //Bool  bBaseProg    = !pcParameters->m_bBaseIsMbAff && !pcParameters->m_bBaseFieldPicFlag; 
  Bool  bBaseField   = pcBaseSliceHeader->getFieldPicFlag();
  //Bool  bBaseField   = pcParameters->m_bBaseFieldPicFlag;
 
	// SET PICTURE SIZE PARAMETERS 
	if ( m_bBuildInterlacePred && bBaseProg && pcParameters->m_iOutHeight>=2*pcParameters->m_iInHeight )
  {
		// BL Prog -> VBL Prog -> EL Interl with He>=2.Hb
		ruiConfig                    = 2;
		riMbOrigY                   += (riMbOrigY%2);
		riMbEndY                    -= (riMbEndY%2);
		riScaledBaseOrigY           /= 2;
		ruiBaseMbStride              = pcBaseMbDataCtrl->m_iMbPerLine;
		pcParameters->m_iOutHeight /= 2;
  }
  else if ( !m_bBuildInterlacePred && bBaseField )
  {
		// BL Field -> VBL Interl -> EL Prog
		ruiConfig                    = 4;
		ruiBaseMbStride              = 2 * pcBaseMbDataCtrl->m_iMbPerLine;
		pcParameters->m_iInHeight  /= 2;
  }
  else if( m_bBuildInterlacePred )
  {
		// BL prog, Frame or Field -> VBL Interl Field -> EL Interl
		ruiConfig                    = 3;
		riMbOrigY                   += (riMbOrigY%2);
		riMbEndY                    -= (riMbEndY%2);
		riScaledBaseOrigY           /= 2;
		ruiBaseMbStride              = 2 * pcBaseMbDataCtrl->m_iMbPerLine;
		pcParameters->m_iInHeight  /= 2;
		pcParameters->m_iOutHeight /= 2;
  }
  else
  {
		// BL Prog -> VBL Prog -> EL Prog
		ruiConfig                    = 1;
		ruiBaseMbStride              = pcBaseMbDataCtrl->m_iMbPerLine;
		if (pcParameters->m_bIsMbAff)
		{
			riMbOrigY                   += (riMbOrigY%2);
			riMbEndY                    -= (riMbEndY%2);
		}
  }

   return Err::m_nOK;
}


ErrVal
MbDataCtrl::xInitVBLPelOrig( MbDataCtrl*         pcBaseMbDataCtrl,
                             UInt                uiConfig,
                             Int                 iMbX,
                             Int                 iMbY,
                             Int                 iScaledBaseOrigX,
                             Int                 iScaledBaseOrigY,  
                             Int                 aiPelOrig[2],
                             UInt&               ruiBLMbOffset)
{
			aiPelOrig[0]   = (Int)16 * iMbX - iScaledBaseOrigX;
      if (uiConfig == 1)      // VBL prog -> EL prog
			{
				ruiBLMbOffset   = 0;
        aiPelOrig[1]   = (Int)16 * iMbY - iScaledBaseOrigY;
			}
			else if (uiConfig == 2) // VBL prog -> EL interl && He>=Hb/2
			{
				ruiBLMbOffset   = 0;
        aiPelOrig[1]   = (Int)16 * (iMbY/2) - iScaledBaseOrigY;
			}
			else if (uiConfig == 3) // VBL Interl -> EL Interl
			{
				ruiBLMbOffset   = (iMbY%2) * pcBaseMbDataCtrl->m_iMbPerLine; //EL TOP (BOT) MBs deduced from BL TOP (BOT) MBs
        aiPelOrig[1]   = (Int)16 * (iMbY/2) - iScaledBaseOrigY;
			}
			else if (uiConfig == 4) // VBL Interl Field -> EL prog
			{
				ruiBLMbOffset   = pcBaseMbDataCtrl->m_uiMbOffset; // depends on the current BL field (if top-->0, if bottom-->pcBaseMbDataCtrl->m_uiMbStride)
        aiPelOrig[1]   = (Int)16 * iMbY - iScaledBaseOrigY;
			}

      return Err::m_nOK;
}

//TMM_INTERLACE }

ErrVal
MbDataCtrl::upsampleMotion( MbDataCtrl& rcBaseMbDataCtrl, ResizeParameters* pcParameters )
{
  if(NULL==pcParameters) 
  return copyMotion(rcBaseMbDataCtrl);

	if(pcParameters->m_iSpatialScalabilityType==SST_RATIO_1)
  return copyMotionBL(rcBaseMbDataCtrl, pcParameters);
  
  return xUpsampleMotionESS(rcBaseMbDataCtrl, pcParameters);
}
// TMM_ESS_UNIFIED }


ErrVal MbDataCtrl::uninit()
{
  m_ucLastMbQp      = 0;
  m_uiMbStride      = 0;
  m_uiMbOffset      = 0;
  m_iMbPerLine      = 0;
  m_iMbPerColumn    = 0;
  m_uiMbProcessed   = 0;
  m_uiSliceId       = 0;
  m_pcMbDataCtrl0L1 = 0;

	RNOK( m_cMbProcessed.uninit() );

  for( UInt n = 0; n < m_cpDFPBuffer.size(); n++ )
  {
    delete m_cpDFPBuffer.get( n );
    m_cpDFPBuffer.set( n, NULL );
  }
  RNOK( m_cpDFPBuffer.uninit() );

  m_bInitDone = false;
  return Err::m_nOK;
}

// for SVC to AVC rewrite
ErrVal
MbDataCtrl::copyTCoeffs( MbDataCtrl& rcMbDataCtrl )
{
  for( UInt n = 0; n < m_uiSize; n++ )
  {
    RNOK( m_pcMbData[n].copyTCoeffs( rcMbDataCtrl.m_pcMbData[n] ) );
  }
  return Err::m_nOK;
}

// for SVC to AVC rewrite
ErrVal
MbDataCtrl::copyIntraPred( MbDataCtrl& rcMbDataCtrl )
{
  for( UInt n = 0; n < m_uiSize; n++ )
  {
    RNOK( m_pcMbData[n].copyIntraPred( rcMbDataCtrl.m_pcMbData[n] ) );
  }
  return Err::m_nOK;
}

ErrVal MbDataCtrl::reset()
{
  m_ucLastMbQp      = 0;
  m_uiMbProcessed   = 0;
  m_uiSliceId       = 0;
  m_pcMbDataCtrl0L1 = 0;
  return Err::m_nOK;
}

ErrVal MbDataCtrl::initSlice( SliceHeader& rcSH, 
                              ProcessingState eProcessingState, 
                              Bool bDecoder, 
                              MbDataCtrl* pcMbDataCtrl )
{
  AOF_DBG( m_bInitDone );

  m_eProcessingState  = eProcessingState;
  m_pcMbDataCtrl0L1   = NULL;
	m_iColocatedOffset  = 0;
  m_bUseTopField      = false;
  m_bPicCodedField    = rcSH.getFieldPicFlag();

  if( rcSH.isInterB() )
  {
    if( rcSH.getNalUnitType() != NAL_UNIT_CODED_SLICE_IDR_SCALABLE &&
        rcSH.getNalUnitType() != NAL_UNIT_CODED_SLICE_SCALABLE     && bDecoder
				&& rcSH.getRefListSize( LIST_1 ) )
    {
	  const RefPic& rcRefPic0L1 = rcSH.getRefPic( 1, rcSH.getPicType(), LIST_1 );
     
     //EIDR bug-fix
		 // const RefPic& rcRefPic0L1 = ( rcSH.getRefListSize(LIST_1) > 1  && rcSH.getRefPic(2, rcSH.getPicType(), LIST_1).getFrame()->getPoc() < rcSH.getRefPic(1, rcSH.getPicType(), LIST_1).getFrame()->getPoc() && rcSH.getRefPic(2, rcSH.getPicType(), LIST_1).getFrame()->getPoc() > rcSH.getPoc()) ?
		//	    								           rcSH.getRefPic( 2, rcSH.getPicType(), LIST_1 ) : rcSH.getRefPic( 1, rcSH.getPicType(), LIST_1 );     
      
      AOF_DBG( rcRefPic0L1.isAvailable() );
      const FrameUnit* pcFU = rcRefPic0L1.getFrame()->getFrameUnit();

      Int iCurrPoc    = rcSH.getPoc();
      Int iTopDiffPoc = iCurrPoc - pcFU->getPic( TOP_FIELD )->getPoc();
      Int iBotDiffPoc = iCurrPoc - pcFU->getPic( BOT_FIELD )->getPoc();

      m_bUseTopField    = ( abs( iTopDiffPoc ) < abs( iBotDiffPoc ) );
      m_pcMbDataCtrl0L1 = pcFU->getMbDataCtrl();

      if( FRAME != rcSH.getPicType() )
      {
        if( rcRefPic0L1.getFrame()->getPicType() != rcSH.getPicType() && m_pcMbDataCtrl0L1->isPicCodedField() )
        {
          m_iColocatedOffset = m_iMbPerLine;
        }
      }
    }

    if( pcMbDataCtrl )
    {
      m_pcMbDataCtrl0L1 = pcMbDataCtrl;
    }
  }

  if( PARSE_PROCESS == m_eProcessingState || ENCODE_PROCESS == m_eProcessingState )
  {
    m_uiSliceId++;

    //manu.mathew@samsung : memory leak fix
    if( m_cpDFPBuffer.get( m_uiSliceId ) )
    {
      delete m_cpDFPBuffer.get( m_uiSliceId );
      m_cpDFPBuffer.set( m_uiSliceId, NULL );
    }
    //--

    m_cpDFPBuffer.set( m_uiSliceId, rcSH.getDeblockingFilterParameterScalable().getCopy() );
   
    m_bDirect8x8InferenceFlag = rcSH.getSPS().getDirect8x8InferenceFlag();
  }
  m_pcSliceHeader = &rcSH;


  Int iMbPerColumn  = rcSH.getSPS().getFrameHeightInMbs ();
  m_iMbPerLine      = rcSH.getSPS().getFrameWidthInMbs  ();
  m_uiMbOffset      = rcSH.getBottomFieldFlag() ? 1 * m_iMbPerLine : 0;
  m_uiMbStride      = rcSH.getFieldPicFlag   () ? 2 * m_iMbPerLine : m_iMbPerLine;
  m_iMbPerColumn    = rcSH.getFieldPicFlag   () ?  iMbPerColumn>>1 : iMbPerColumn;

⌨️ 快捷键说明

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