mbdatactrl.cpp

来自「JMVM MPEG MVC/3DAV 测试平台 国际通用标准」· C++ 代码 · 共 1,133 行 · 第 1/3 页

CPP
1,133
字号
    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
MbDataCtrl::uninitFgsBQData()
{
  delete [] m_pacFgsBQMbQP;
  delete [] m_pauiFgsBQMbCbp;
  delete [] m_pauiFgsBQBCBP;
  delete [] m_pabFgsBQ8x8Trafo;
  m_pacFgsBQMbQP      = 0;
  m_pauiFgsBQMbCbp    = 0;
  m_pauiFgsBQBCBP    = 0;
  m_pabFgsBQ8x8Trafo  = 0;
  return Err::m_nOK;
}









ControlData::ControlData()
: m_pcMbDataCtrl        ( 0   )
, m_pcSliceHeader       ( 0   )
, m_dLambda             ( 0   )
, m_pcBaseLayerRec      ( 0   )
, m_pcBaseLayerSbb      ( 0   )
, m_pcBaseLayerCtrl     ( 0   )
, m_pcBaseCtrlData      ( 0   )
, m_uiUseBLMotion       ( 0   )
, m_dScalingFactor      ( 1.0 )
, m_pacFGSMbQP          ( 0 )
, m_pauiFGSMbCbp        ( 0 )
, m_pabFGS8x8Trafo      ( 0 )
, m_bIsNormalMbDataCtrl ( true )
, m_pacBQMbQP           ( 0 )
, m_pauiBQMbCbp         ( 0 )
, m_pabBQ8x8Trafo       ( 0 )
, m_paeBQMbMode         ( 0 )
, m_pusBQFwdBwd         ( 0 )
, m_iSpatialScalabilityType ( 0 ) 
, m_bSpatialScalability ( false)//SSUN@SHARP
{
  m_paacBQMotionData[0] = m_paacBQMotionData[1] = 0;
}

ControlData::~ControlData()
{
  AOT( m_pacBQMbQP );
  AOT( m_pauiBQMbCbp );
  AOT( m_pabBQ8x8Trafo );
  AOT( m_pacFGSMbQP );
  AOT( m_pauiFGSMbCbp );
  AOT( m_pabFGS8x8Trafo );
}

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

  m_bIsNormalMbDataCtrl = true;
}

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

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

  return Err::m_nOK;
}

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

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

  return Err::m_nOK;
}

ErrVal
ControlData::initBQData( UInt uiNumMb )
{
  ROT( m_pacBQMbQP );
  ROT( m_pauiBQMbCbp );
  ROT( m_pabBQ8x8Trafo );
  ROFS( ( m_pacBQMbQP      = new UChar [uiNumMb] ) );
  ROFS( ( m_pauiBQMbCbp    = new UInt  [uiNumMb] ) );
  ROFS( ( m_pabBQ8x8Trafo  = new Bool  [uiNumMb] ) );
  ROFS( ( m_paeBQMbMode    = new MbMode[uiNumMb] ) );
  ROFS( ( m_pusBQFwdBwd    = new UShort[uiNumMb] ) );
  ROFS( ( m_paacBQMotionData[0] = new MbMotionData[uiNumMb] ) );
  ROFS( ( m_paacBQMotionData[1] = new MbMotionData[uiNumMb] ) );
  return Err::m_nOK;
}

ErrVal
ControlData::uninitBQData()
{
  delete [] m_pacBQMbQP;
  delete [] m_pauiBQMbCbp;
  delete [] m_pabBQ8x8Trafo;
  delete [] m_paeBQMbMode;
  delete [] m_pusBQFwdBwd;
  delete [] m_paacBQMotionData[0];
  delete [] m_paacBQMotionData[1];
  m_pacBQMbQP     = 0;
  m_pauiBQMbCbp   = 0;
  m_pabBQ8x8Trafo = 0;
  m_paeBQMbMode   = 0;
  m_pusBQFwdBwd   = 0;
  m_paacBQMotionData[0] = 0;
  m_paacBQMotionData[1] = 0;
  return Err::m_nOK;
}


ErrVal
ControlData::storeBQLayerQpAndCbp()
{
  ROF( m_pacBQMbQP );
  ROF( m_pauiBQMbCbp );
  ROF( m_pabBQ8x8Trafo );
  for( UInt uiMbIndex = 0; uiMbIndex < m_pcMbDataCtrl->getSize(); uiMbIndex++ )
  {
    m_pacBQMbQP     [uiMbIndex] = m_pcMbDataCtrl->getMbData( uiMbIndex ).getQp();
    m_pauiBQMbCbp   [uiMbIndex] = m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbExtCbp();
    m_pabBQ8x8Trafo [uiMbIndex] = m_pcMbDataCtrl->getMbData( uiMbIndex ).isTransformSize8x8();
    m_paeBQMbMode   [uiMbIndex] = m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbMode();
    m_pusBQFwdBwd   [uiMbIndex] = m_pcMbDataCtrl->getMbData( uiMbIndex ).getFwdBwd();
    m_paacBQMotionData[0][uiMbIndex].copyFrom( m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbMotionData( ListIdx( 0 ) ) );
    m_paacBQMotionData[1][uiMbIndex].copyFrom( m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbMotionData( ListIdx( 1 ) ) );
  }
  return Err::m_nOK;
}

ErrVal
ControlData::switchBQLayerQpAndCbp()
{
  ROF( m_pacBQMbQP );
  ROF( m_pauiBQMbCbp );
  ROF( m_pabBQ8x8Trafo );
  for( UInt uiMbIndex = 0; uiMbIndex < m_pcMbDataCtrl->getSize(); uiMbIndex++ )
  {
    UChar ucQP  = m_pcMbDataCtrl->getMbData( uiMbIndex ).getQp();
    UInt  uiCbp = m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbExtCbp();
    Bool  bT8x8 = m_pcMbDataCtrl->getMbData( uiMbIndex ).isTransformSize8x8();

    m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setQp               ( m_pacBQMbQP     [uiMbIndex] );
    m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setMbExtCbp         ( m_pauiBQMbCbp   [uiMbIndex] );
    m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setTransformSize8x8 ( m_pabBQ8x8Trafo [uiMbIndex] );

    m_pacBQMbQP     [uiMbIndex] = ucQP;
    m_pauiBQMbCbp   [uiMbIndex] = uiCbp;
    m_pabBQ8x8Trafo [uiMbIndex] = bT8x8;

    MbMode       eMbMode  = m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbMode();
    UShort       usFwdBwd = m_pcMbDataCtrl->getMbData( uiMbIndex ).getFwdBwd();

    m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setMbMode           ( m_paeBQMbMode [uiMbIndex] );
    m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setFwdBwd           ( m_pusBQFwdBwd [uiMbIndex] );

    m_paeBQMbMode   [uiMbIndex] = eMbMode;
    m_pusBQFwdBwd   [uiMbIndex] = usFwdBwd;

    for( UInt ui = 0; ui < 2; ui++ )
    {
      MbMotionData cMbMotionData;
      cMbMotionData.copyFrom( m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbMotionData( ListIdx( ui ) ) );
      m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).getMbMotionData( ListIdx( ui ) ).copyFrom( m_paacBQMotionData[ui][uiMbIndex] );
      m_paacBQMotionData[ui][uiMbIndex].copyFrom( cMbMotionData );
    }
  }
  return Err::m_nOK;
}




ErrVal
ControlData::initFGSData( UInt uiNumMb )
{
  ROT( m_pacFGSMbQP );
  ROT( m_pauiFGSMbCbp );
  ROT( m_pabFGS8x8Trafo );
  ROFS( ( m_pacFGSMbQP      = new UChar [uiNumMb] ) );
  ROFS( ( m_pauiFGSMbCbp    = new UInt  [uiNumMb] ) );
  ROFS( ( m_pabFGS8x8Trafo  = new Bool  [uiNumMb] ) );
  return Err::m_nOK;
}

ErrVal
ControlData::uninitFGSData()
{
  delete [] m_pacFGSMbQP;
  delete [] m_pauiFGSMbCbp;
  delete [] m_pabFGS8x8Trafo;
  m_pacFGSMbQP      = 0;
  m_pauiFGSMbCbp    = 0;
  m_pabFGS8x8Trafo  = 0;
  return Err::m_nOK;
}

ErrVal
ControlData::storeFGSLayerQpAndCbp()
{
  ROF( m_pacFGSMbQP );
  ROF( m_pauiFGSMbCbp );
  ROF( m_pabFGS8x8Trafo );
  for( UInt uiMbIndex = 0; uiMbIndex < m_pcMbDataCtrl->getSize(); uiMbIndex++ )
  {
    m_pacFGSMbQP     [uiMbIndex] = m_pcMbDataCtrl->getMbData( uiMbIndex ).getQp();
    m_pauiFGSMbCbp   [uiMbIndex] = m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbExtCbp();
    m_pabFGS8x8Trafo [uiMbIndex] = m_pcMbDataCtrl->getMbData( uiMbIndex ).isTransformSize8x8();
  }
  return Err::m_nOK;
}

ErrVal
ControlData::switchFGSLayerQpAndCbp()
{
  ROF( m_pacFGSMbQP );
  ROF( m_pauiFGSMbCbp );
  ROF( m_pabFGS8x8Trafo );
  for( UInt uiMbIndex = 0; uiMbIndex < m_pcMbDataCtrl->getSize(); uiMbIndex++ )
  {
    UChar ucQP  = m_pcMbDataCtrl->getMbData( uiMbIndex ).getQp();
    UInt  uiCbp = m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbExtCbp();
    Bool  bT8x8 = m_pcMbDataCtrl->getMbData( uiMbIndex ).isTransformSize8x8();

    m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setQp               ( m_pacFGSMbQP     [uiMbIndex] );
    m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setMbExtCbp         ( m_pauiFGSMbCbp   [uiMbIndex] );
    m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setTransformSize8x8 ( m_pabFGS8x8Trafo [uiMbIndex] );

    m_pacFGSMbQP     [uiMbIndex] = ucQP;
    m_pauiFGSMbCbp   [uiMbIndex] = uiCbp;
    m_pabFGS8x8Trafo [uiMbIndex] = bT8x8;
  }
  return Err::m_nOK;
}











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

  ruiMask               = 0;

  ROTRS( m_pcMbData[uiCurrIdx].isIntra(), 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].isIntra() ? 0x01 :0;
    }

    if( bLeftAvailable )
    {
      Int iIndex = uiCurrIdx - m_uiMbStride - 1;
      ruiMask |= m_pcMbData[iIndex].isIntra() ? 0x80 :0;
    }

    if( bRightAvailable )
    {
      Int iIndex = uiCurrIdx - m_uiMbStride + 1;
      ruiMask |= m_pcMbData[iIndex].isIntra() ? 0x02 :0;
    }
  }

  if( bBottomAvailable )
  {
    {
    Int iIndex = uiCurrIdx + m_uiMbStride;
    ruiMask |= m_pcMbData[iIndex].isIntra() ? 0x10 :0;
    }

    if( bLeftAvailable )
    {
      Int iIndex = uiCurrIdx  + m_uiMbStride - 1;
      ruiMask |= m_pcMbData[iIndex].isIntra() ? 0x20 :0;
    }

    if( bRightAvailable )
    {
      Int iIndex = uiCurrIdx + m_uiMbStride + 1;
      ruiMask |= m_pcMbData[iIndex].isIntra() ? 0x08 :0;
    }
  }

  if( bLeftAvailable )
  {
    Int iIndex = uiCurrIdx-1;
    ruiMask |= m_pcMbData[iIndex].isIntra() ? 0x40 :0;
  }

  if( bRightAvailable )
  {
    Int iIndex = uiCurrIdx + 1;
    ruiMask |= m_pcMbData[iIndex].isIntra() ? 0x04 :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 ;
}

H264AVC_NAMESPACE_END

⌨️ 快捷键说明

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