mbdatactrl.cpp

来自「JVT-S203 contains the JSVM 6 reference s」· C++ 代码 · 共 1,073 行 · 第 1/3 页

CPP
1,073
字号
    for( Int iMbX = 0; iMbX < m_iMbPerLine;   iMbX++ )
    {
      // get current high res MB and upsampling
      MbData& rcMbDes = m_pcMbData[iMbY*m_uiMbStride+iMbX];

      // check if MB is inside cropping window - if not, no upsampling is performed
      if ( (iMbX >= (iScaledBaseOrigX+15) / 16) && (iMbX < (iScaledBaseOrigX+iScaledBaseWidth) / 16) &&
           (iMbY >= (iScaledBaseOrigY+15) / 16) && (iMbY < (iScaledBaseOrigY+iScaledBaseHeight) / 16) )
      {
          aiPelOrig[0]=(Int)16*iMbX-iScaledBaseOrigX;
          aiPelOrig[1]=(Int)16*iMbY-iScaledBaseOrigY;
          RNOK(rcMbDes.upsampleMotionESS(rcBaseMbDataCtrl.m_pcMbData, 
                                         rcBaseMbDataCtrl.m_uiMbStride,
                                         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++ )

  return Err::m_nOK;
}
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::copyBaseResidualAvailFlags( MbDataCtrl& rcSrcMbDataCtrl )
{
  for( UInt uiMbIdx = 0 ; uiMbIdx < m_uiSize; uiMbIdx ++ )
    m_pcMbData[uiMbIdx].setResidualAvailFlagsBase( rcSrcMbDataCtrl.m_pcMbData[uiMbIdx].getResidualAvailFlagsBase() );

  return Err::m_nOK;
}


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;

  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;
}


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;

  if( rcSH.isInterB() )
  {
    if( rcSH.getNalUnitType() != NAL_UNIT_CODED_SLICE_IDR_SCALABLE &&
        rcSH.getNalUnitType() != NAL_UNIT_CODED_SLICE_SCALABLE     && bDecoder )
    {
      const RefPic& rcRefPic0L1 = rcSH.getRefPic( 1, LIST_1 );
      AOF_DBG( rcRefPic0L1.isAvailable() );
      const FrameUnit* pcFU = rcRefPic0L1.getPic().getFrameUnit();

      m_pcMbDataCtrl0L1 = pcFU->getMbDataCtrl();
    }

    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.getDeblockingFilterParameter().getCopy() );
    m_bDirect8x8InferenceFlag = rcSH.getSPS().getDirect8x8InferenceFlag();
  }
  m_pcSliceHeader = &rcSH;


  Int iMbPerColumn  = rcSH.getSPS().getFrameHeightInMbs ();
  m_iMbPerLine      = rcSH.getSPS().getFrameWidthInMbs  ();
  m_uiMbOffset      = 0;
  m_uiMbStride      = m_iMbPerLine;
  m_iMbPerColumn    = iMbPerColumn;
  m_ucLastMbQp      = rcSH.getPicQp();

  H264AVC_DELETE_CLASS( m_pcMbDataAccess );
  return Err::m_nOK;
}


const MbData& MbDataCtrl::xGetColMbData( UInt uiIndex )
{
  return (( m_pcMbDataCtrl0L1 == NULL ) ? xGetOutMbData() : m_pcMbDataCtrl0L1->getMbData( uiIndex ));
}

const MbData& MbDataCtrl::xGetRefMbData( UInt uiSliceId, Int uiCurrSliceID, Int iMbY, Int iMbX, Bool bLoopFilter )
{
  // check whether ref mb is inside
  ROTRS( iMbX < 0,               xGetOutMbData() );
  ROTRS( iMbY < 0,               xGetOutMbData() );
  ROTRS( iMbX >= m_iMbPerLine,   xGetOutMbData() );
  ROTRS( iMbY >= m_iMbPerColumn, xGetOutMbData() );

  //--ICU/ETRI FMO Implementation
  ROTRS( uiCurrSliceID != getSliceGroupIDofMb(iMbY * m_uiMbStride + iMbX + m_uiMbOffset ) , xGetOutMbData() );

  // get the ref mb data
  const MbData& rcMbData = getMbData( iMbY * m_uiMbStride + iMbX + m_uiMbOffset );
  // test slice id
  return (( rcMbData.getSliceId() == uiSliceId || bLoopFilter ) ? rcMbData : xGetOutMbData() );
}


ErrVal MbDataCtrl::initMb( MbDataAccess*& rpcMbDataAccess, UInt uiMbY, UInt uiMbX, const Int iForceQp )
{
  ROF( m_bInitDone );

  AOT_DBG( uiMbY * m_uiMbStride + uiMbX + m_uiMbOffset >= m_uiSize );

  Bool     bLf          = (m_eProcessingState == POST_PROCESS);
  UInt     uiCurrIdx    = uiMbY * m_uiMbStride + uiMbX + m_uiMbOffset;
  MbData&  rcMbDataCurr = m_pcMbData[ uiCurrIdx ];


  if( m_pcMbDataAccess )
  {
    m_ucLastMbQp = m_pcMbDataAccess->getMbData().getQp();
  }

  UInt uiSliceId = rcMbDataCurr.getSliceId();
  if( PARSE_PROCESS == m_eProcessingState || ENCODE_PROCESS == m_eProcessingState)
  {
    if( 0 == uiSliceId )
    {
      uiSliceId = m_uiSliceId;
      rcMbDataCurr.getMbTCoeffs().clear();
      rcMbDataCurr.initMbData( m_ucLastMbQp, uiSliceId );
      rcMbDataCurr.clear();
      m_uiMbProcessed++;
    }
    else
    {
      //allready assigned;
      if( ENCODE_PROCESS != m_eProcessingState )
      {
       AF();
      }
      else
      {
        if( iForceQp != -1 )
        {
          m_ucLastMbQp = iForceQp;
        }
      }
    }
  }

  Int icurrSliceGroupID = getSliceGroupIDofMb(uiMbY * m_uiMbStride + uiMbX + m_uiMbOffset);

  m_pcMbDataAccess = new (m_pcMbDataAccess) MbDataAccess(
                                       rcMbDataCurr,                                      // current
                                       xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY,   uiMbX-1, bLf ), // left        //--ICU/ETRI FMO Implementation
                                       xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY-1, uiMbX  , bLf ), // above       //--ICU/ETRI FMO Implementation
                                       xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY-1, uiMbX-1, bLf ), // above left  //--ICU/ETRI FMO Implementation
                                       xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY-1, uiMbX+1, bLf ), // above right //--ICU/ETRI FMO Implementation
                                       xGetOutMbData(),                                   // unvalid
                                       xGetColMbData( uiCurrIdx ),
                                       *m_pcSliceHeader,
                                       *m_cpDFPBuffer.get( uiSliceId ),
                                       uiMbX,
                                       uiMbY,
                                       m_ucLastMbQp );


  ROT( NULL == m_pcMbDataAccess );

  rpcMbDataAccess = m_pcMbDataAccess;

  return Err::m_nOK;
}

//TMM_EC {{
ErrVal MbDataCtrl::initMbTDEnhance( MbDataAccess*& rpcMbDataAccess, MbDataCtrl *pcMbDataCtrl, MbDataCtrl *pcMbDataCtrlRef, UInt uiMbY, UInt uiMbX, const Int iForceQp )
{
  ROF( m_bInitDone );

  AOT_DBG( uiMbY * m_uiMbStride + uiMbX + m_uiMbOffset >= m_uiSize );

  Bool     bLf          = (m_eProcessingState == POST_PROCESS);
  UInt     uiCurrIdx    = uiMbY * m_uiMbStride + uiMbX + m_uiMbOffset;
  MbData&  rcMbDataCurr = m_pcMbData[ uiCurrIdx ];


  if( m_pcMbDataAccess )
  {
    m_ucLastMbQp = m_pcMbDataAccess->getMbData().getQp();
  }

  UInt uiSliceId = rcMbDataCurr.getSliceId();
  if( PARSE_PROCESS == m_eProcessingState || ENCODE_PROCESS == m_eProcessingState)
  {
    if( 0 == uiSliceId )
    {
      uiSliceId = m_uiSliceId;
      rcMbDataCurr.getMbTCoeffs().clear();
      rcMbDataCurr.initMbData( m_ucLastMbQp, uiSliceId );
      rcMbDataCurr.clear();
      m_uiMbProcessed++;
    }
    else
    {
      //allready assigned;
      if( ENCODE_PROCESS != m_eProcessingState )
      {
        AF();
      }
      else
      {
        if( iForceQp != -1 )
        {
          m_ucLastMbQp = iForceQp;
        }
      }
    }
  }

  Int icurrSliceGroupID = getSliceGroupIDofMb(uiMbY * m_uiMbStride + uiMbX + m_uiMbOffset);

  m_pcMbDataAccess = new (m_pcMbDataAccess) MbDataAccess(
                                       rcMbDataCurr,                                      // current
                                       xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY,   uiMbX-1, bLf ), // left
                                       xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY-1, uiMbX  , bLf ), // above
                                       xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY-1, uiMbX-1, bLf ), // above left
                                       xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY-1, uiMbX+1, bLf ), // above right
                                       xGetOutMbData(),                                   // unvalid
																			 pcMbDataCtrlRef->getMbData( uiMbX, uiMbY),
                                       *m_pcSliceHeader,
                                       *m_cpDFPBuffer.get( uiSliceId ),
                                       uiMbX,
                                       uiMbY,
                                       m_ucLastMbQp );


  ROT( NULL == m_pcMbDataAccess );

  rpcMbDataAccess = m_pcMbDataAccess;

  return Err::m_nOK;
}
//TMM_EC }}

ErrVal
MbDataCtrl::storeFgsBQLayerQpAndCbp()
{
  ROF( m_pacFgsBQMbQP );
  ROF( m_pauiFgsBQMbCbp );
  ROF( m_pauiFgsBQBCBP );
  ROF( m_pabFgsBQ8x8Trafo );
  for( UInt uiMbIndex = 0; uiMbIndex < getSize(); uiMbIndex++ )
  {
    m_pacFgsBQMbQP     [uiMbIndex] = getMbData( uiMbIndex ).getQp();
    m_pauiFgsBQMbCbp   [uiMbIndex] = getMbData( uiMbIndex ).getMbExtCbp();
    m_pauiFgsBQBCBP    [uiMbIndex] = getMbData( uiMbIndex ).getBCBP();
    m_pabFgsBQ8x8Trafo [uiMbIndex] = getMbData( uiMbIndex ).isTransformSize8x8();
    
  }
  return Err::m_nOK;
}

ErrVal
MbDataCtrl::switchFgsBQLayerQpAndCbp()
{
  ROF( m_pacFgsBQMbQP );
  ROF( m_pauiFgsBQMbCbp );
  ROF( m_pauiFgsBQBCBP );
  ROF( m_pabFgsBQ8x8Trafo );
  for( UInt uiMbIndex = 0; uiMbIndex < getSize(); uiMbIndex++ )
  {
    UChar ucQP  = getMbData( uiMbIndex ).getQp();
    UInt  uiCbp = getMbData( uiMbIndex ).getMbExtCbp();
    UInt  uiBCBP= getMbData( uiMbIndex ).getBCBP();
    Bool  bT8x8 = getMbData( uiMbIndex ).isTransformSize8x8();

    getMbDataByIndex( uiMbIndex ).setQp               ( m_pacFgsBQMbQP     [uiMbIndex] );
    getMbDataByIndex( uiMbIndex ).setMbExtCbp         ( m_pauiFgsBQMbCbp   [uiMbIndex] );
    getMbDataByIndex( uiMbIndex ).setBCBP             ( m_pauiFgsBQBCBP    [uiMbIndex] );
    getMbDataByIndex( uiMbIndex ).setTransformSize8x8 ( m_pabFgsBQ8x8Trafo [uiMbIndex] );

    m_pacFgsBQMbQP     [uiMbIndex] = ucQP;
    m_pauiFgsBQMbCbp   [uiMbIndex] = uiCbp;
    m_pauiFgsBQBCBP    [uiMbIndex] = uiBCBP;
    m_pabFgsBQ8x8Trafo [uiMbIndex] = bT8x8;
  }
  return Err::m_nOK;
}

ErrVal
MbDataCtrl::initFgsBQData( UInt uiNumMb )
{
  ROT( m_pacFgsBQMbQP );
  ROT( m_pauiFgsBQMbCbp );
  ROT( m_pauiFgsBQBCBP );
  ROT( m_pabFgsBQ8x8Trafo );
  ROFS( ( m_pacFgsBQMbQP      = new UChar [uiNumMb] ) );
  ROFS( ( m_pauiFgsBQMbCbp    = new UInt  [uiNumMb] ) );
  ROFS( ( m_pauiFgsBQBCBP     = new UInt  [uiNumMb] ) );
  ROFS( ( m_pabFgsBQ8x8Trafo  = new Bool  [uiNumMb] ) );
  return Err::m_nOK;
}

ErrVal

⌨️ 快捷键说明

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