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

📄 framemng.cpp

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


ErrVal FrameMng::xSetInitialReferenceListBFrame( SliceHeader& rcSH )
{
  RefPicList<RefPic>& rcList0 = rcSH.getRefPicList( FRAME, LIST_0 );
  RefPicList<RefPic>& rcList1 = rcSH.getRefPicList( FRAME, LIST_1 );
  UInt                uiFirstPosWithGreaterPoc, uiPos;
  FUIter              iter;

  //====== set Poc ordered short-term list and get index with smallest Poc greater than current ======
  m_cPocOrderedFrameList.reset();
  if( ! rcSH.getUseBasePredictionFlag() ) 
    m_cShortTermList.setRefFrameListFGS( m_cPocOrderedFrameList );
  else
    m_cShortTermList.setRefFrameList( m_cPocOrderedFrameList );

	const PicType ePicType = rcSH.getPicType();
	uiFirstPosWithGreaterPoc = xSortPocOrderedList( m_cPocOrderedFrameList, m_pcCurrentFrameUnit->getPic( ePicType )->getPoc() );

  //===== set short term reference frames =====
  for( uiPos = uiFirstPosWithGreaterPoc - 1; uiPos != MSYS_UINT_MAX; uiPos-- )
  {
    rcList0.next().setFrame( m_cPocOrderedFrameList.get( uiPos ) );
  }
  for( uiPos = uiFirstPosWithGreaterPoc; uiPos != m_cPocOrderedFrameList.size(); uiPos++ )
  {
    rcList0.next().setFrame( m_cPocOrderedFrameList.get( uiPos ) );
    rcList1.next().setFrame( m_cPocOrderedFrameList.get( uiPos ) );
  }
  for( uiPos = uiFirstPosWithGreaterPoc - 1; uiPos != MSYS_UINT_MAX; uiPos-- )
  {
    rcList1.next().setFrame( m_cPocOrderedFrameList.get( uiPos ) );
  }

  return Err::m_nOK;
}

ErrVal FrameMng::xSetInitialReferenceListPFields( SliceHeader& rcSH )
{
  //----- initial frame list for short term pictures -----
  m_acTmpShortTermRefList[LIST_0].reset();
  m_cShortTermList.setRefFrameUnitList( m_acTmpShortTermRefList[LIST_0] );

  RNOK( xSetInitialReferenceFieldList( rcSH, LIST_0 ) );

  return Err::m_nOK;
}

ErrVal FrameMng::xSetInitialReferenceListBFields( SliceHeader& rcSH )
{
  UInt uiFirstPosWithGreaterPoc, uiPos;

  //====== set POC ordered short-term list and get index with smallest POC greater than current ======
  m_cPocOrderedFrameList.reset();
  m_cShortTermList.setRefFrameList( m_cPocOrderedFrameList );

  const PicType ePicType = rcSH.getPicType();
  uiFirstPosWithGreaterPoc = xSortPocOrderedList( m_cPocOrderedFrameList, m_pcCurrentFrameUnit->getPic( ePicType )->getPoc() );

  //----- initial frame list for short term pictures -----
  m_acTmpShortTermRefList[LIST_0].reset();
  m_acTmpShortTermRefList[LIST_1].reset();
  for( uiPos = uiFirstPosWithGreaterPoc - 1; uiPos != MSYS_UINT_MAX; uiPos-- )
  {
    m_acTmpShortTermRefList[LIST_0].add( m_cPocOrderedFrameList.get( uiPos )->getFrameUnit() );
  }
  for( uiPos = uiFirstPosWithGreaterPoc; uiPos != m_cPocOrderedFrameList.size(); uiPos++ )
  {
    m_acTmpShortTermRefList[LIST_0].add( m_cPocOrderedFrameList.get( uiPos )->getFrameUnit() );
    m_acTmpShortTermRefList[LIST_1].add( m_cPocOrderedFrameList.get( uiPos )->getFrameUnit() );
  }
  for( uiPos = uiFirstPosWithGreaterPoc - 1; uiPos != MSYS_UINT_MAX; uiPos-- )
  {
    m_acTmpShortTermRefList[LIST_1].add( m_cPocOrderedFrameList.get( uiPos )->getFrameUnit() );
  }

  RNOK( xSetInitialReferenceFieldList( rcSH, LIST_0 ) );
  RNOK( xSetInitialReferenceFieldList( rcSH, LIST_1 ) );

  return Err::m_nOK;
}

ErrVal FrameMng::xSetInitialReferenceFieldList( SliceHeader& rcSH, ListIdx eListIdx )
{
  const PicType           eCurrentPicType   = rcSH.getPicType();
  const PicType           eOppositePicType  = ( eCurrentPicType == TOP_FIELD ? BOT_FIELD : TOP_FIELD );
  RefPicList<FrameUnit*>& rcShortList       = m_acTmpShortTermRefList             [eListIdx];
  RefPicList<RefPic>&     rcList            = rcSH.getRefPicList( eCurrentPicType, eListIdx );

  ROTRS( rcList.full(), Err::m_nOK );

  //----- initialize field list for short term pictures -----
  UInt  uiCurrentParityIndex  = 0;
  UInt  uiOppositeParityIndex = 0;

  while( uiCurrentParityIndex < rcShortList.size() || uiOppositeParityIndex < rcShortList.size() )
  {
    //--- current parity ---
    while( uiCurrentParityIndex < rcShortList.size() )
    {
      FrameUnit* pcFU = rcShortList.get( uiCurrentParityIndex++ );

      if( pcFU->isUsed( eCurrentPicType ) )
      {
				if( ! rcSH.getUseBasePredictionFlag() )
					rcList.next().setFrame( pcFU->getFGSPicBuffer() ? pcFU->getFGSPic( eCurrentPicType ) : pcFU->getPic( eCurrentPicType ) );
				else
					rcList.next().setFrame( pcFU->getPic( eCurrentPicType ) );
        break;
      }
    }
    //--- opposite parity ---
    while( uiOppositeParityIndex < rcShortList.size() )
    {
      FrameUnit* pcFU = rcShortList.get( uiOppositeParityIndex++ );

      if( pcFU->isUsed( eOppositePicType ) )
      {
				if( ! rcSH.getUseBasePredictionFlag() )
					rcList.next().setFrame( pcFU->getFGSPicBuffer() ? pcFU->getFGSPic( eOppositePicType ) : pcFU->getPic( eOppositePicType ) );
				else
					rcList.next().setFrame( pcFU->getPic( eOppositePicType ) );
        break;
      }
    }
  }

  return Err::m_nOK;
}

ErrVal FrameMng::xSetFrameFieldLists( SliceHeader& rcSH, ListIdx eListIdx )
{
  RefPicList<RefPic>& rcFrameList    = rcSH.getRefPicList(     FRAME, eListIdx );
  RefPicList<RefPic>& rcTopFieldList = rcSH.getRefPicList( TOP_FIELD, eListIdx );
  RefPicList<RefPic>& rcBotFieldList = rcSH.getRefPicList( BOT_FIELD, eListIdx );

  //===== generate list for field macroblocks =====
  for( UInt uiFrmIdx = 0; uiFrmIdx < rcFrameList.size(); uiFrmIdx++ )
  {
    const Frame* pcFrame    = rcFrameList.get( uiFrmIdx ).getFrame();
    const Frame* pcTopField = NULL;
    const Frame* pcBotField = NULL;

    if( pcFrame == rcFrameList.get( uiFrmIdx ).getFrame()->getFrameUnit()->getPic( FRAME ) )
    {
      pcTopField = pcFrame->getFrameUnit()->getPic( TOP_FIELD );
      pcBotField = pcFrame->getFrameUnit()->getPic( BOT_FIELD );
    }
    else
    {
      pcTopField = pcFrame->getFrameUnit()->getFGSPic( TOP_FIELD );
      pcBotField = pcFrame->getFrameUnit()->getFGSPic( BOT_FIELD );
    }

    rcTopFieldList.next().setFrame( pcTopField );
    rcTopFieldList.next().setFrame( pcBotField );

    rcBotFieldList.next().setFrame( pcBotField );
    rcBotFieldList.next().setFrame( pcTopField );
  }
  return Err::m_nOK;
}

ErrVal FrameMng::xCheckReferenceListSwitching( SliceHeader& rcSH )
{
	const PicType ePicType = rcSH.getPicType();
  RefPicList<RefPic>& rcList0 = rcSH.getRefPicList( ePicType, LIST_0 );
  RefPicList<RefPic>& rcList1 = rcSH.getRefPicList( ePicType, LIST_1 );

  ROTRS( rcList1.size() < 2 || rcList0.size() != rcList1.size(), Err::m_nOK );

  for( UInt uiPos = 0; uiPos < rcList1.size(); uiPos++ )
  {
    if( rcList1.get( uiPos ) != rcList0.get( uiPos ) )
    {
      return Err::m_nOK;
    }
  }
  rcList1.switchFirstEntries();
  return Err::m_nOK;
}



ErrVal FrameMng::setRefPicLists( SliceHeader& rcSH, Bool bDoNotRemap )
{
  RNOK( xSetReferenceLists( rcSH) );

  if( ! bDoNotRemap )
  {
    //===== remapping =====
    RNOK( xReferenceListRemapping( rcSH, LIST_0 ) );
    RNOK( xReferenceListRemapping( rcSH, LIST_1 ) );
  }

	const PicType   ePicType   = rcSH.getPicType  ();
	//===== MBAFF field lists =====
  if( ePicType == FRAME && rcSH.getSPS().getMbAdaptiveFrameFieldFlag() )
  {
    RNOK( xSetFrameFieldLists( rcSH, LIST_0 ) );
    RNOK( xSetFrameFieldLists( rcSH, LIST_1 ) );
  }
  return Err::m_nOK;
}


ErrVal FrameMng::xSetReferenceLists( SliceHeader& rcSH )
{
  rcSH.getRefPicList( FRAME    , LIST_0 ).reset( 0 );
  rcSH.getRefPicList( FRAME    , LIST_1 ).reset( 0 );
  rcSH.getRefPicList( TOP_FIELD, LIST_0 ).reset( 0 );
  rcSH.getRefPicList( TOP_FIELD, LIST_1 ).reset( 0 );
  rcSH.getRefPicList( BOT_FIELD, LIST_0 ).reset( 0 );
  rcSH.getRefPicList( BOT_FIELD, LIST_1 ).reset( 0 );

  if( rcSH.isIntra() )
  {
    return Err::m_nOK;
  }

	const PicType ePicType = rcSH.getPicType();
	rcSH.getRefPicList( ePicType, LIST_0 ).reset();
  if( ePicType==FRAME && rcSH.getSPS().getMbAdaptiveFrameFieldFlag() )
  {
    rcSH.getRefPicList( TOP_FIELD, LIST_0 ).reset();
    rcSH.getRefPicList( BOT_FIELD, LIST_0 ).reset();
  }
  if( rcSH.isInterB() )
  {
    rcSH.getRefPicList( ePicType, LIST_1 ).reset();
    if( ePicType==FRAME && rcSH.getSPS().getMbAdaptiveFrameFieldFlag() )
    {
      rcSH.getRefPicList( TOP_FIELD, LIST_1 ).reset();
      rcSH.getRefPicList( BOT_FIELD, LIST_1 ).reset();
    }
  }

  //===== initial lists =====
  if( ! rcSH.isInterB() )
  {
    if( ePicType==FRAME )
    {
    RNOK( xSetInitialReferenceListPFrame( rcSH ) );
    }
    else
    {
      RNOK( xSetInitialReferenceListPFields( rcSH ) );
    }
  }
  else
  {
    if( ePicType==FRAME )
    {
    RNOK( xSetInitialReferenceListBFrame( rcSH ) );
    }
    else
    {
      RNOK( xSetInitialReferenceListBFields( rcSH ) );
    }
    RNOK( xCheckReferenceListSwitching( rcSH ) )
  }

  return Err::m_nOK;
}



ErrVal FrameMng::xClearListsIDR( const SliceHeader& rcSH  )
{
  RNOK( xRemoveFromRefList( m_cShortTermList ) );

  //===== output =====
  for( FUIter iter = m_cOrderedPocList.begin(); iter != m_cOrderedPocList.end(); iter++ )
  {
    if( ! rcSH.getNoOutputOfPriorPicsFlag() )
    {
      if( (*iter)->getFGSPicBuffer() )
      {
        (*iter)->getFGSPicBuffer()->setCts( (UInt64)((*iter)->getMaxPoc()) ); // HS: decoder robustness
        m_cPicBufferOutputList.push_back( (*iter)->getFGSPicBuffer() );
      }
      else if ((*iter)->getPicBuffer() )  //JVT-S036 lsj
      {
        (*iter)->getPicBuffer()->setCts( (UInt64)((*iter)->getMaxPoc()) ); // HS: decoder robustness
        m_cPicBufferOutputList.push_back( (*iter)->getPicBuffer() );
      }
    }


    (*iter)->setOutputDone();

    if( xFindAndErase( m_cNonRefList, *iter ) )
    {
       RNOK( xAddToFreeList( (*iter) ) );
    }
  }
  m_cOrderedPocList.clear();
  //bug-fix shenqiu EIDR{
  RNOK(xAddToFreeList( m_cShortTermList ));
  //bug-fix shenqiu EIDR}
  return Err::m_nOK;
}


UInt FrameMng::MaxRefFrames( UInt uiLevel, UInt uiNumMbs )
{
  return m_uiDBPMemory[ uiLevel ] / ( 384 * uiNumMbs );
}



ErrVal FrameMng::outputAll()
{
  FUIter  iter;
  //===== output =====
  for( iter = m_cOrderedPocList.begin(); iter != m_cOrderedPocList.end(); iter++ )
  {
    if( (*iter)->getFGSPicBuffer() )
    {
      (*iter)->getFGSPicBuffer()->setCts( (UInt64)((*iter)->getMaxPoc()) ); // HS: decoder robustness
      m_cPicBufferOutputList.push_back( (*iter)->getFGSPicBuffer() );
    }
    else if ((*iter)->getPicBuffer() )  //JVT-S036 lsj
    {
      (*iter)->getPicBuffer()->setCts( (UInt64)((*iter)->getMaxPoc()) ); // HS: decoder robustness
      m_cPicBufferOutputList.push_back( (*iter)->getPicBuffer() );
    }
    (*iter)->setOutputDone();
  }
  m_cOrderedPocList.erase( m_cOrderedPocList.begin(), iter );

  RNOK( xAddToFreeList( m_cShortTermList ) );
  RNOK( xAddToFreeList( m_cNonRefList ) );

  return Err::m_nOK;
}



ErrVal FrameMng::xSetOutputList( FrameUnit* pcFrameUnit )
{
  ROTRS( m_iEntriesInDPB <= m_iMaxEntriesinDPB, Err::m_nOK );

  //===== get minimum Poc for output =====
  Int     iMinPoctoOuput = MSYS_INT_MAX;
  FUIter  iter;
  for( iter = m_cNonRefList.begin(); iter != m_cNonRefList.end(); iter++ )
  {
    if( (*iter)->getMaxPoc() < iMinPoctoOuput && ( (*iter) != pcFrameUnit) )
    {
      iMinPoctoOuput = (*iter)->getMaxPoc();
    }
  }
  ROT( iMinPoctoOuput == MSYS_INT_MAX );

  //===== output =====
  for( iter = m_cOrderedPocList.begin(); iter != m_cOrderedPocList.end(); iter++ )
  {
    if( (*iter)->getMaxPoc() <= iMinPoctoOuput )
    {
      if( (*iter)->getFGSPicBuffer() )
      {
        (*iter)->getFGSPicBuffer()->setCts( (UInt64)((*iter)->getMaxPoc()) ); // HS: decoder robustness
        m_cPicBufferOutputList.push_back( (*iter)->getFGSPicBuffer() );
      }
      else if ((*iter)->getPicBuffer() )  //JVT-S036 lsj
      {
        (*iter)->getPicBuffer()->setCts( (UInt64)((*iter)->getMaxPoc()) ); // HS: decoder robustness
        m_cPicBufferOutputList.push_back( (*iter)->getPicBuffer() );
      }
      (*iter)->setOutputDone();
      if( xFindAndErase( m_cNonRefList, *iter ) )
      {
        RNOK( xAddToFreeList( *iter ) );
      }
    }
    else
    {
      break;
    }
  }
  m_cOrderedPocList.erase( m_cOrderedPocList.begin(), iter );

  return Err::m_nOK;
}


ErrVal FrameMng::storeFGSPicture( PicBuffer* pcPicBuffer )
{
	const PicType ePicType          = m_pcCurrentFrameUnit->getMbDataCtrl()->getSliceHeader()->getPicType();
	const Bool    bFrameMbsOnlyFlag = m_pcCurrentFrameUnit->getMbDataCtrl()->getSliceHeader()->getSPS().getFrameMbsOnlyFlag();

  UInt uiFGSReconCount = m_pcCurrentFrameUnit->getFGSReconCount();
  m_pcCurrentFrameUnit->getFGSReconstruction(uiFGSReconCount)->copyAll(m_pcCurrentFrameUnit->getFGSIntFrame());
  m_pcCurrentFrameUnit->setFGSReconCount(uiFGSReconCount + 1);

  m_pcCurrentFrameUnit->setFGS( pcPicBuffer );
	m_cPicBufferUnusedList.pushBack( pcPicBuffer );

	m_pcCurrentFrameUnit->getFGSPic( ePicType )->extendFrame( m_pcQuarterPelFilter, bFrameMbsOnlyFlag, true );
  

⌨️ 快捷键说明

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