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

📄 mbdatactrl.cpp

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 CPP
📖 第 1 页 / 共 4 页
字号:
  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() );
  ROTRS( uiCurrSliceID != getSliceGroupIDofMb(iMbY * (m_uiMbStride>>(UInt)m_pcSliceHeader->getFieldPicFlag()) + iMbX ) , xGetOutMbData() ); //TMM_INTERLACE

  // 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 Bool bFieldFlag, const Int iForceQp )
{
  UInt     uiCurrIdx    = uiMbY        * m_uiMbStride + uiMbX + m_uiMbOffset;
  MbData&  rcMbDataCurr = m_pcMbData[ uiCurrIdx ];
  rcMbDataCurr.setFieldFlag( bFieldFlag );

  return initMb( rpcMbDataAccess, uiMbY, uiMbX, iForceQp );
}

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);
  Bool     bMbAff       = m_pcSliceHeader->isMbAff();
  Bool     bTopMb       = ((bMbAff && (uiMbY % 2)) ? false : true);
  UInt     uiMbYComp    = ( bMbAff ? ( bTopMb ? uiMbY+1 : uiMbY-1 ) : uiMbY );
  UInt     uiCurrIdx    = uiMbY * m_uiMbStride + uiMbX + m_uiMbOffset;
  UInt     uiCompIdx    = uiMbYComp    * m_uiMbStride + uiMbX + m_uiMbOffset;
  ROT( uiCompIdx >= m_uiSize );
  ROT( uiCurrIdx >= m_uiSize );
  MbData&  rcMbDataCurr = m_pcMbData[ uiCurrIdx ];
	MbData&  rcMbDataComp = m_pcMbData[ uiCompIdx ];


    //----- get co-located MbIndex -----
  UInt     uiIdxColTop;
  UInt     uiIdxColBot;
  if( ! m_pcSliceHeader->getFieldPicFlag() )
  {
    UInt  uiMbYColTop = 2 * ( uiMbY / 2 );
    uiIdxColTop       = uiMbYColTop * m_uiMbStride + uiMbX + m_uiMbOffset;
    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();
  }

  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++;
			m_cMbProcessed.get(uiCurrIdx) = true;
    }
    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,
                                                         *m_cpDFPBuffer.get( uiSliceId ),
                                                          uiMbX,
                                                          uiMbY,
																													bTopMb,
																													m_bUseTopField,
                                                          bColocatedField,// TMM_INTERLACE
                                                          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);
  Bool     bMbAff       = m_pcSliceHeader->isMbAff();
  Bool     bTopMb       = ((bMbAff && (uiMbY % 2)) ? false : true);
  UInt     uiMbYComp    = ( bMbAff ? ( bTopMb ? uiMbY+1 : uiMbY-1 ) : uiMbY );
  UInt     uiCurrIdx    = uiMbY * m_uiMbStride + uiMbX + m_uiMbOffset;
  UInt     uiCompIdx    = uiMbYComp    * m_uiMbStride + uiMbX + m_uiMbOffset;
  ROT( uiCompIdx >= m_uiSize );
  ROT( uiCurrIdx >= m_uiSize );
  MbData&  rcMbDataCurr = m_pcMbData[ uiCurrIdx ];
	MbData&  rcMbDataComp = m_pcMbData[ uiCompIdx ];


    //----- get co-located MbIndex -----
  UInt     uiIdxColTop;
  UInt     uiIdxColBot;
  if( ! m_pcSliceHeader->getFieldPicFlag() )
  {
    UInt  uiMbYColTop = 2 * ( uiMbY / 2 );
    uiIdxColTop       = uiMbYColTop * m_uiMbStride + uiMbX + m_uiMbOffset;
    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();
  }

  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++;
      m_cMbProcessed.get(uiCurrIdx) = true;
    }
    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(); // TMM_INTERLACE
//  Int icurrSliceGroupID = getSliceGroupIDofMb(uiMbY * m_uiMbStride + uiMbX + m_uiMbOffset);
  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
																													pcMbDataCtrlRef->getMbData( uiIdxColTop),
                                                          pcMbDataCtrlRef->getMbData( uiIdxColBot),
                                                          *m_pcSliceHeader,
                                                          *m_cpDFPBuffer.get( uiSliceId ),
                                                          uiMbX,
                                                          uiMbY,
																													bTopMb,
																													m_bUseTopField,
																													bColocatedField,
                                                           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
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_pcSliceHeaderBot     ( 0 )
, m_dLambda              ( 0   )
, m_pcBaseLayerRec       ( 0   )
, m_pcBaseLayerSbb       ( 0   )
, m_pcBaseLayerCtrl      ( 0   )
, m_pcBaseLayerCtrlField ( 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)

⌨️ 快捷键说明

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