mbdatactrl.cpp

来自「SVC最新更新代码」· C++ 代码 · 共 1,734 行 · 第 1/5 页

CPP
1,734
字号
    uiIdxColBot       = uiIdxColTop + m_uiMbStride;
    if( uiIdxColBot >= m_pcSliceHeader->getMbInPic() )
    {
      uiIdxColBot = uiIdxColTop;
    }
  }
  else if( ! m_pcSliceHeader->getBottomFieldFlag() )
  {
    uiIdxColTop       = uiCurrIdx   + m_iColocatedOffset;
    uiIdxColBot       = uiIdxColTop - m_iColocatedOffset + m_iMbPerLine;
  }
  else
  {
    uiIdxColBot       = uiCurrIdx   - m_iColocatedOffset;
    uiIdxColTop       = uiIdxColBot + m_iColocatedOffset - m_iMbPerLine;
  }
  
  if( m_pcMbDataAccess )
  {
    m_ucLastMbQp    = m_pcMbDataAccess->getMbData().getQp();
    m_ucLastMbQp4LF = m_pcMbDataAccess->getMbData().getQp4LF();
  }

  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, m_ucLastMbQp4LF, uiSliceId, m_pcSliceHeader->getSliceType() );
      rcMbDataCurr.clear();
      m_uiMbProcessed++;
    }
    else
    {
      //allready assigned;
      if( ENCODE_PROCESS != m_eProcessingState )
      {
       AF();
      }
      else
      {
        if( iForceQp != -1 )
        {
          m_ucLastMbQp = iForceQp;
        }
      }
    }
  }

  const Bool bColocatedField = ( m_pcMbDataCtrl0L1 == NULL ) ? true : m_pcMbDataCtrl0L1->isPicCodedField();

  Int icurrSliceGroupID = getSliceGroupIDofMb(uiMbY * (m_uiMbStride>>(UInt)m_pcSliceHeader->getFieldPicFlag()) + uiMbX ); //TMM_INTERLACE

  m_pcMbDataAccess = new (m_pcMbDataAccess) MbDataAccess( rcMbDataCurr,                                      // current
                                                          	rcMbDataComp,                                    // complementary
                                                          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  
																													((bMbAff && (uiMbY % 2 == 1)) ? xGetOutMbData() : xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY-1, uiMbX+1, bLf )), // above right
																													xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY-2, uiMbX  , bLf ), // above above
																													xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY-2, uiMbX-1, bLf ), // above above left
																													xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY-2, uiMbX+1, bLf ), // above above right
																													xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY+1, uiMbX-1, bLf ), // below left
                                                          xGetOutMbData(),                                   // unvalid
																													xGetColMbData( uiIdxColTop ),
																													xGetColMbData( uiIdxColBot ),
                                                         *m_pcSliceHeader,
                                                          uiMbX,
                                                          uiMbY,
																													bTopMb,
																													m_bUseTopField,
                                                          bColocatedField,// TMM_INTERLACE
                                                          m_ucLastMbQp, m_ucLastMbQp4LF );

  ROT( NULL == m_pcMbDataAccess );

  rpcMbDataAccess = m_pcMbDataAccess;

  return Err::m_nOK;
}






ControlData::ControlData()
: m_pcMbDataCtrl         ( 0   )
, m_pcMbDataCtrl0L1( 0 )
, m_pcSliceHeader        ( 0   )
, m_pcSliceHeaderBot     ( 0 )
, m_dLambda              ( 0   )
, m_pcBaseLayerRec       ( 0   )
, m_pcBaseLayerSbb       ( 0   )
, m_pcBaseLayerCtrl      ( 0   )
, m_pcBaseLayerCtrlField ( 0   )
, m_uiUseBLMotion        ( 0   )
, m_dScalingFactor       ( 1.0 )
, m_bSpatialScalability  ( false)
{
}

ControlData::~ControlData()
{
}

Void
ControlData::clear()
{
  m_pcMbDataCtrl0L1 = 0;
  m_pcBaseLayerRec       = 0;
  m_pcBaseLayerSbb       = 0;
  m_pcBaseLayerCtrl      = 0;
  m_pcBaseLayerCtrlField = 0;
  m_uiUseBLMotion        = 0;
  m_dScalingFactor       = 1.0;
}

ErrVal
ControlData::init( SliceHeader*  pcSliceHeader,
                   MbDataCtrl*   pcMbDataCtrl,
                   Double        dLambda )
{
  ROF( pcSliceHeader );
  ROF( pcMbDataCtrl  );

  m_pcSliceHeader = pcSliceHeader;
  m_pcMbDataCtrl  = pcMbDataCtrl;
  m_dLambda       = dLambda;
  
  m_pcMbDataCtrl0L1       = 0;
  m_pcBaseLayerRec        = 0;
  m_pcBaseLayerSbb        = 0;
  m_pcBaseLayerCtrl       = 0;
  m_pcBaseLayerCtrlField  = 0;
  m_uiUseBLMotion         = 0;

  return Err::m_nOK;
}

ErrVal
ControlData::init( SliceHeader*  pcSliceHeader )
{
  ROF( pcSliceHeader );
  ROF( m_pcMbDataCtrl  );

  m_pcSliceHeader         = pcSliceHeader;
  
  m_pcMbDataCtrl0L1       = 0;
  m_pcBaseLayerRec        = 0;
  m_pcBaseLayerSbb        = 0;
  m_pcBaseLayerCtrl       = 0;
  m_pcBaseLayerCtrlField  = 0; 
  m_uiUseBLMotion         = 0;

  return Err::m_nOK;
}

const Int MbDataCtrl::getSliceGroupIDofMb(Int mb)
{
  Int iRefSliceID ;
  if(m_pcSliceHeader->getFMO() != NULL)
	iRefSliceID =m_pcSliceHeader->getFMO()->getSliceGroupId(mb );
  else
	iRefSliceID =-1;

  return iRefSliceID ;
}


ErrVal 
MbDataCtrl::getBoundaryMask( Int iMbY, Int iMbX, Bool& rbIntra, UInt& ruiMask, UInt uiCurrentSliceID ) const
{
  ruiMask         = 0;
  UInt uiCurrIdx  = iMbY * m_uiMbStride + iMbX + m_uiMbOffset;
  AOT( uiCurrIdx >= m_uiSize );

  rbIntra = m_pcMbData[uiCurrIdx].isIntraInSlice( uiCurrentSliceID );
  ROTRS( rbIntra, Err::m_nOK );

  Bool bLeftAvailable   = ( iMbX > 0 );
  Bool bTopAvailable    = ( iMbY > 0 );
  Bool bRightAvailable  = ( iMbX < m_iMbPerLine-1 );
  Bool bBottomAvailable = ( iMbY < m_iMbPerColumn-1 );

  if( bTopAvailable )
  {
    {
      Int iIndex = uiCurrIdx - m_uiMbStride;
      ruiMask   |= ( m_pcMbData[iIndex].isIntraInSlice( uiCurrentSliceID ) ? 0x01 : 0 );
    }
    if( bLeftAvailable )
    {
      Int iIndex = uiCurrIdx - m_uiMbStride - 1;
      ruiMask   |= ( m_pcMbData[iIndex].isIntraInSlice( uiCurrentSliceID ) ? 0x80 : 0 );
    }
    if( bRightAvailable )
    {
      Int iIndex = uiCurrIdx - m_uiMbStride + 1;
      ruiMask   |= ( m_pcMbData[iIndex].isIntraInSlice( uiCurrentSliceID ) ? 0x02 : 0 );
    }
  }
  if( bBottomAvailable )
  {
    {
      Int iIndex = uiCurrIdx + m_uiMbStride;
      ruiMask   |= ( m_pcMbData[iIndex].isIntraInSlice( uiCurrentSliceID ) ? 0x10 : 0 );
    }
    if( bLeftAvailable )
    {
      Int iIndex = uiCurrIdx  + m_uiMbStride - 1;
      ruiMask   |= ( m_pcMbData[iIndex].isIntraInSlice( uiCurrentSliceID ) ? 0x20 : 0 );
    }
    if( bRightAvailable )
    {
      Int iIndex = uiCurrIdx + m_uiMbStride + 1;
      ruiMask   |= ( m_pcMbData[iIndex].isIntraInSlice( uiCurrentSliceID ) ? 0x08 : 0 );
    }
  }
  if( bLeftAvailable )
  {
    Int iIndex   = uiCurrIdx - 1;
    ruiMask     |= ( m_pcMbData[iIndex].isIntraInSlice( uiCurrentSliceID ) ? 0x40 : 0 );
  }
  if( bRightAvailable )
  {
    Int iIndex   = uiCurrIdx + 1;
    ruiMask     |= ( m_pcMbData[iIndex].isIntraInSlice( uiCurrentSliceID ) ? 0x04 : 0 );
  }
  return Err::m_nOK;
}


ErrVal 
MbDataCtrl::getBoundaryMask_MbAff( Int iMbY, Int iMbX, Bool& rbIntra, UInt& ruiMask, UInt uiCurrentSliceID ) const
{
  ROF( iMbY >= 0 && iMbY < m_iMbPerColumn && iMbX >= 0 && iMbX < m_iMbPerLine );

  Bool  bAvailableTopLeft     = false; //0x001
  Bool  bAvailableTop         = false; //0x002
  Bool  bAvailableTopRight    = false; //0x004
  Bool  bAvailableLeftTop     = false; //0x008
  Bool  bAvailableLeftBot     = false; //0x010
  Bool  bAvailableCurrTop     = false; //0x020
  Bool  bAvailableCurrBot     = false; //0x040
  Bool  bAvailableRightTop    = false; //0x080
  Bool  bAvailableRightBot    = false; //0x100
  Bool  bAvailableBotLeft     = false; //0x200
  Bool  bAvailableBot         = false; //0x400
  Bool  bAvailableBotRight    = false; //0x800

  Int   iMbY0                 = ( iMbY >> 1 ) << 1;
  Int   iMbFieldOffset        = ( iMbY - iMbY0 ) * (Int)m_uiMbStride; 

  Bool  bMbPairAvailableTop   = ( iMbY0 > 0 );
  Bool  bMbPairAvailableBot   = ( iMbY0 < m_iMbPerColumn - 2 );
  Bool  bMbPairAvailableLeft  = ( iMbX  > 0 );
  Bool  bMbPairAvailableRight = ( iMbX  < m_iMbPerLine   - 1 );

  Int   iMbPairTIdxCurr       = iMbY0 * (Int)m_uiMbStride + iMbX + (Int)m_uiMbOffset;
  Int   iMbPairTIdxTop        = iMbPairTIdxCurr - (Int)( m_uiMbStride << 1 );
  Int   iMbPairTIdxBot        = iMbPairTIdxCurr + (Int)( m_uiMbStride << 1 );

  //===== current macroblock pair =====
  {
    Int iMbIdxCurrTop   = iMbPairTIdxCurr + ( m_pcMbData[iMbPairTIdxCurr].getFieldFlag() ? iMbFieldOffset : 0            );
    Int iMbIdxCurrBot   = iMbPairTIdxCurr + ( m_pcMbData[iMbPairTIdxCurr].getFieldFlag() ? iMbFieldOffset : m_uiMbStride );
    bAvailableCurrTop   = m_pcMbData[iMbIdxCurrTop].isIntraInSlice( uiCurrentSliceID );
    bAvailableCurrBot   = m_pcMbData[iMbIdxCurrBot].isIntraInSlice( uiCurrentSliceID );
  }

  //===== reset =====
  ruiMask = 0;
  rbIntra = ( bAvailableCurrTop && bAvailableCurrBot );
  ROTRS( rbIntra, Err::m_nOK ); // current field of current macroblock pair is completely intra coded

  //===== left macroblock pair =====
  if( bMbPairAvailableLeft )
  {
    Int iMbIdxLeftTop   = iMbPairTIdxCurr - 1 + ( m_pcMbData[iMbPairTIdxCurr - 1].getFieldFlag() ? iMbFieldOffset : 0            );
    Int iMbIdxLeftBot   = iMbPairTIdxCurr - 1 + ( m_pcMbData[iMbPairTIdxCurr - 1].getFieldFlag() ? iMbFieldOffset : m_uiMbStride );
    bAvailableLeftTop   = m_pcMbData[iMbIdxLeftTop].isIntraInSlice( uiCurrentSliceID );
    bAvailableLeftBot   = m_pcMbData[iMbIdxLeftBot].isIntraInSlice( uiCurrentSliceID );
  }

  //===== right macroblock pair =====
  if( bMbPairAvailableRight )
  {
    Int iMbIdxRightTop  = iMbPairTIdxCurr + 1 + ( m_pcMbData[iMbPairTIdxCurr + 1].getFieldFlag() ? iMbFieldOffset : 0            );
    Int iMbIdxRightBot  = iMbPairTIdxCurr + 1 + ( m_pcMbData[iMbPairTIdxCurr + 1].getFieldFlag() ? iMbFieldOffset : m_uiMbStride );
    bAvailableRightTop  = m_pcMbData[iMbIdxRightTop].isIntraInSlice( uiCurrentSliceID );
    bAvailableRightBot  = m_pcMbData[iMbIdxRightBot].isIntraInSlice( uiCurrentSliceID );
  }

  if( bMbPairAvailableTop )
  {
    //===== top macroblock pair =====
    {
      Int iMbIdxTop = iMbPairTIdxTop + ( m_pcMbData[iMbPairTIdxTop].getFieldFlag() ? iMbFieldOffset : m_uiMbStride );
      bAvailableTop = m_pcMbData[iMbIdxTop].isIntraInSlice( uiCurrentSliceID );
    }

    //===== top-left macroblock pair =====
    if( bMbPairAvailableLeft )
    {
      Int iMbIdxTopLeft = iMbPairTIdxTop - 1 + ( m_pcMbData[iMbPairTIdxTop - 1].getFieldFlag() ? iMbFieldOffset : m_uiMbStride );
      bAvailableTopLeft = m_pcMbData[iMbIdxTopLeft].isIntraInSlice( uiCurrentSliceID );
    }

    //===== top-right macroblock pair =====
    if( bMbPairAvailableRight )
    {
      Int iMbIdxTopRight = iMbPairTIdxTop + 1 + ( m_pcMbData[iMbPairTIdxTop + 1].getFieldFlag() ? iMbFieldOffset : m_uiMbStride );
      bAvailableTopRight = m_pcMbData[iMbIdxTopRight].isIntraInSlice( uiCurrentSliceID );
    }
  }

  if( bMbPairAvailableBot )
  {
    //===== bottom macroblock pair =====
    {
      Int iMbIdxBot = iMbPairTIdxBot + ( m_pcMbData[iMbPairTIdxBot].getFieldFlag() ? iMbFieldOffset : 0 );
      bAvailableBot = m_pcMbData[iMbIdxBot].isIntraInSlice( uiCurrentSliceID );
    }

    //===== bottom-left macroblock pair =====
    if( bMbPairAvailableLeft )
    {
      Int iMbIdxBotLeft = iMbPairTIdxBot - 1 + ( m_pcMbData[iMbPairTIdxBot - 1].getFieldFlag() ? iMbFieldOffset : 0 );
      bAvailableBotLeft = m_pcMbData[iMbIdxBotLeft].isIntraInSlice( uiCurrentSliceID );
    }

    //===== bottom-right macroblock pair =====
    if( bMbPairAvailableRight )
    {
      Int iMbIdxBotRight = iMbPairTIdxBot + 1 + ( m_pcMbData[iMbPairTIdxBot + 1].getFieldFlag() ? iMbFieldOffset : 0 );
      bAvailableBotRight = m_pcMbData[iMbIdxBotRight].isIntraInSlice( uiCurrentSliceID );
    }
  }

  //===== set mask =====
  ruiMask |= ( bAvailableTopLeft  ? 0x001 : 0 );
  ruiMask |= ( bAvailableTop      ? 0x002 : 0 );
  ruiMask |= ( bAvailableTopRight ? 0

⌨️ 快捷键说明

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