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

📄 recpicbuffer.cpp

📁 JMVM MPEG MVC/3DAV 测试平台 国际通用标准
💻 CPP
📖 第 1 页 / 共 3 页
字号:
  RecPicBufUnitList::iterator end                 = m_cUsedRecPicBufUnitList.end  ();
  for( ; iter != end; iter++ )
  {
    if( (*iter)->isNeededForRef() )
    {
      uiCurrNumRefFrames++;
    }
  }
  ROTRS( uiCurrNumRefFrames <= m_uiNumRefFrames, Err::m_nOK );

  //===== sliding window reference picture update =====
  //--- look for last ref frame that shall be removed ---
  UInt uiRefFramesToRemove = uiCurrNumRefFrames - m_uiNumRefFrames;
  iter                     = m_cUsedRecPicBufUnitList.begin();
  for( ; iter != end; iter++ )
  {
    if( (*iter)->isNeededForRef() )
    {
      uiRefFramesToRemove--;
      if( uiRefFramesToRemove == 0 )
      {
        break;
      }
    }
  }
  ROT( uiRefFramesToRemove );
  //--- delete reference label ---
  end  = ++iter;
  iter = m_cUsedRecPicBufUnitList.begin();
  for( ; iter != end; iter++ )
  {
    if( (*iter)->isNeededForRef() )
    {
      RNOK( (*iter)->markNonRef() );
    }
  }

  return Err::m_nOK;
}


ErrVal
RecPicBuffer::xDumpRecPicBuffer()
{
#if 1 // NO_DEBUG
  return Err::m_nOK;
#endif
  
  printf( "\nRECONSTRUCTED PICTURE BUFFER:\n" );
  RecPicBufUnitList::iterator iter  = m_cUsedRecPicBufUnitList.begin();
  RecPicBufUnitList::iterator end   = m_cUsedRecPicBufUnitList.end  ();
  for( Int iIndex = 0; iter != end; iter++ )
  {
    RecPicBufUnit* p = (*iter);
    printf( "\tPOS=%d:\tFN=%d\tViewId=%d\tPoc=%d\t%s\t", iIndex, p->getFrameNum(), 
            p->getViewId(), p->getPoc(), (p->isNeededForRef()?"REF":"   ") );
    if(  p->isOutputted() )   printf("Outputted  ");
    if( !p->isExisting () )   printf("NotExisting  ");
    printf("\n");
  }
  printf("\n");
  return Err::m_nOK;
}



// ----------------------------------------------------------------------
//
// FUNCTION:	AddMultiviewRefsToList
//
// INPUTS:	recPicBufUnitList:  A list of refernce pictures potentially
//				    containing multiview references.
//		rcList:  A RefFrameList object to add multiview references to.
//		refDirection:  Direction of references to add to rcList. 
//
// PURPOSE:	This function goes through each reference in recPicBufUnitList,
//		finds all multiview references with the given refDirection,
//		and adds them to rcList.  
//
// MODIFIED:	Tue Mar 14, 2006
//
// ----------------------------------------------------------------------
// modified to be a member of RecPicBuffer 26 Dec, 2006
// and the format has also been adjusted (AddMultiviewRef)
// Simplified again for JVT-V043 7 Feb. 2007
// and some cleanup
ErrVal 
RecPicBuffer::AddMultiviewRef( RecPicBufUnitList& recPicBufUnitList,
			                          RefFrameList& rcList, const int maxListSize,
			                          const MultiviewReferenceDirection refDirection, SliceHeader&   rcSliceheader) {

  RefFrameList tempList;
  RecPicBufUnitList::iterator iter;

  for (iter  = recPicBufUnitList.begin();iter != recPicBufUnitList.end(); iter++) {
    if ( refDirection == (*iter)->GetMultiviewReferenceDirection() ) {
			if(m_pcPicEncoder->derivation_Inter_View_Flag((*iter)->getViewId(), rcSliceheader)){                        //JVT-W056  Samsung
				RecPicBufUnit* bufUnitToAdd = (*iter);             
				rcList.add( bufUnitToAdd->getRecFrame() );
			}
    }
  }
  return Err::m_nOK;
}

ErrVal
RecPicBuffer::xInitRefListPSlice( RefFrameList& rcList)
{
  //----- get current frame num -----
  UInt uiCurrFrameNum = m_pcCurrRecPicBufUnit->getFrameNum();

  //----- generate decreasing POC list -----
  for( Int iMaxPicNum = (Int)uiCurrFrameNum; 
       ! CodeAsVFrameP() ; 
	  )
  {
    RecPicBufUnit*              pNext = 0;
    RecPicBufUnitList::iterator iter  = m_cUsedRecPicBufUnitList.begin();
    RecPicBufUnitList::iterator end   = m_cUsedRecPicBufUnitList.end  ();
    for( ; iter != end; iter++ )
    {

	 if (
      (*iter)->isNeededForRef() &&
          (*iter)->getPicNum( uiCurrFrameNum, m_uiMaxFrameNum ) < iMaxPicNum &&
         ( ! pNext ||
          (*iter)->getPicNum( uiCurrFrameNum, m_uiMaxFrameNum ) > pNext->getPicNum( uiCurrFrameNum, m_uiMaxFrameNum ) ) )
      {
        pNext = (*iter);
      }
    }
    if( ! pNext )
    {
      break;
    }
    iMaxPicNum = pNext->getPicNum( uiCurrFrameNum, m_uiMaxFrameNum );
    rcList.add( pNext->getRecFrame() );
  }
// move the inter-view appending out, ying

  return Err::m_nOK;
}


ErrVal
RecPicBuffer::xInitRefListsBSlice( RefFrameList&  rcList0,
                                   RefFrameList&  rcList1)
{
  RefFrameList  cDecreasingPocList;
  RefFrameList  cIncreasingPocList;
  Int           iCurrPoc = m_pcCurrRecPicBufUnit->getPoc();

  //----- generate decreasing Poc list -----
  for( Int iMaxPoc = iCurrPoc; 
       ! CodeAsVFrameP(); 
	  )
  {
    RecPicBufUnit*              pNext = 0;
    RecPicBufUnitList::iterator iter  = m_cUsedRecPicBufUnitList.begin();
    RecPicBufUnitList::iterator end   = m_cUsedRecPicBufUnitList.end  ();
    for( ; iter != end; iter++ )
    {
      if( (*iter)->isNeededForRef() &&
        (*iter)->getPoc() < iMaxPoc &&
        ( ! pNext ||
        (*iter)->getPoc() > pNext->getPoc() ) )
      {
        pNext = (*iter);
      }
    }
    if( ! pNext )
    {
      break;
    }
    iMaxPoc = pNext->getPoc();
    cDecreasingPocList.add( pNext->getRecFrame() );
  }

  //----- generate increasing Poc list -----
  for( Int iMinPoc = iCurrPoc; 
       ! CodeAsVFrameP(); 
	  )
  {
    RecPicBufUnit*              pNext = 0;
    RecPicBufUnitList::iterator iter  = m_cUsedRecPicBufUnitList.begin();
    RecPicBufUnitList::iterator end   = m_cUsedRecPicBufUnitList.end  ();
    for( ; iter != end; iter++ )
    {
      if( (*iter)->isNeededForRef() &&
        (*iter)->getPoc() > iMinPoc &&
        ( ! pNext ||
        (*iter)->getPoc() < pNext->getPoc() ) )
      {
        pNext = (*iter);
      }
    }
    if( ! pNext )
    {
      break;
    }
    iMinPoc = pNext->getPoc();
    cIncreasingPocList.add( pNext->getRecFrame() );
  }

  //----- list 0 and list 1 -----
  UInt uiPos;
  for( uiPos = 0; uiPos < cDecreasingPocList.getSize(); uiPos++ )
  {
    RNOK( rcList0.add( cDecreasingPocList.getEntry( uiPos ) ) );
  }
  for( uiPos = 0; uiPos < cIncreasingPocList.getSize(); uiPos++ )
  {
    RNOK( rcList0.add( cIncreasingPocList.getEntry( uiPos ) ) );
    RNOK( rcList1.add( cIncreasingPocList.getEntry( uiPos ) ) );
  }
  for( uiPos = 0; uiPos < cDecreasingPocList.getSize(); uiPos++ )
  {
    RNOK( rcList1.add( cDecreasingPocList.getEntry( uiPos ) ) );
  }

  //----- check for element switching -----
  if( rcList1.getActive() >= 2 && rcList0.getActive() == rcList1.getActive() )
  {
    Bool bSwitch = true;
    for( uiPos = 0; uiPos < rcList1.getActive(); uiPos++ )
    {
      if( rcList0.getEntry( uiPos ) != rcList1.getEntry( uiPos ) )
      {
        bSwitch = false;
        break;
      }
    }
    if( bSwitch )
    {
      rcList1.switchFirst();
    }
  }

// remove the inter-view appending out 
  return Err::m_nOK;
}


ErrVal
RecPicBuffer::xRefListRemapping( RefFrameList&  rcList,
                                 ListIdx        eListIdx,
                                 SliceHeader*   pcSliceHeader )
{
  ROF( pcSliceHeader );
  const RplrBuffer& rcRplrBuffer = pcSliceHeader->getRplrBuffer( eListIdx );

  //===== re-ordering ======
  if( rcRplrBuffer.getRefPicListReorderingFlag() )
  {
    UInt  uiPicNumPred    = pcSliceHeader->getFrameNum();
    UInt  uiIndex         = 0;
    UInt  uiCommand       = 0;
    UInt  uiIdentifier    = 0;
// JVT-V043
    UInt  uiCurrViewId    = pcSliceHeader->getViewId();
    Bool  bFirstViewRPLR  = true;
    Bool  bAnchor         = pcSliceHeader->getAnchorPicFlag();
    UInt  uiPicViewIdx    = 0;

    while( RPLR_END != ( uiCommand = rcRplrBuffer.get( uiIndex ).getCommand( uiIdentifier ) ) )
    {
      IntFrame* pcFrame = 0;
      if( uiCommand == RPLR_LONG )
      {
        //===== long-term index =====
        RERR(); // long-term not supported
      }
      else if (uiCommand == RPLR_NEG || uiCommand == RPLR_POS) // JVT-V043 
      {
        //===== short-term index =====
        UInt uiAbsDiff = uiIdentifier + 1;

        //----- set short-term index (pic num) -----
        if( uiCommand == RPLR_NEG )
        {
          if( uiPicNumPred < uiAbsDiff )
          {
            uiPicNumPred -= ( uiAbsDiff - m_uiMaxFrameNum );
          }
          else
          {
            uiPicNumPred -=   uiAbsDiff;
          }
        }
        else // uiCommand == RPLR_POS
        {
          if( uiPicNumPred + uiAbsDiff > m_uiMaxFrameNum - 1 )
          {
            uiPicNumPred += ( uiAbsDiff - m_uiMaxFrameNum );
          }
          else
          {
            uiPicNumPred +=   uiAbsDiff;
          }
        }
        uiIdentifier = uiPicNumPred;

        //----- get frame -----
        RecPicBufUnitList::iterator iter = m_cUsedRecPicBufUnitList.begin();
        RecPicBufUnitList::iterator end  = m_cUsedRecPicBufUnitList.end  ();
        for( ; iter != end; iter++ )
        {
          if( (*iter)->isNeededForRef() &&
              (*iter)->getFrameNum() == uiIdentifier &&
              (*iter)->getViewId() == uiCurrViewId) // JVT-V043
          {
            pcFrame = (*iter)->getRecFrame();
            break;
          }
        }
        if( ! pcFrame )
        {
          fprintf( stderr, "\nERROR: MISSING PICTURE for RPLR\n\n" );
          RERR(); 
        }
        //----- find picture in reference list -----
        UInt uiRemoveIndex = MSYS_UINT_MAX;
        for( UInt uiPos = uiIndex; uiPos < rcList.getActive(); uiPos++ ) // active is equal to size
        {
          if( rcList.getEntry( uiPos ) == pcFrame )
          {
            uiRemoveIndex = uiPos;
            break;
          }
        }

        //----- reference list re-ordering -----
        RNOK( rcList.setElementAndRemove( uiIndex, uiRemoveIndex, pcFrame ) );
        uiIndex++;
      } // short-term
      else // 4 or 5
      {
        if( uiCommand == RPLR_VIEW_NEG && uiIdentifier == 0 && bFirstViewRPLR )
          uiPicViewIdx = 0;
        else 
        {
          UInt uiAbsDiff = uiIdentifier + 1;
// JVT-W066
          UInt uiMaxRef = pcSliceHeader->getSPS().getSpsMVC()->getNumRefsForListX (uiCurrViewId, eListIdx, bAnchor); 

          if( uiCommand == RPLR_VIEW_NEG )
          {
            if( uiPicViewIdx < uiAbsDiff )
            {
              uiPicViewIdx -= ( uiAbsDiff - uiMaxRef );
            }
            else
            {
              uiPicViewIdx -=   uiAbsDiff;
            }
          }

          if( uiCommand == RPLR_VIEW_POS)
          {
            if( uiPicViewIdx + uiAbsDiff >= uiMaxRef )
            {
              uiPicViewIdx += ( uiAbsDiff - uiMaxRef );
            }
            else
            {
              uiPicViewIdx +=   uiAbsDiff;
            }
          }
// JVT-W066
        }
        uiIdentifier = uiPicViewIdx; 
        
        UInt targetViewId = pcSliceHeader->getSPS().getSpsMVC()->getViewIDByViewIndex( pcSliceHeader->getViewId(), uiIdentifier, eListIdx, bAnchor );
        
        //----- get frame -----
        RecPicBufUnitList::iterator iter = m_cUsedRecPicBufUnitList.begin();
        RecPicBufUnitList::iterator end  = m_cUsedRecPicBufUnitList.end  ();
        for( ; iter != end; iter++ )
        {
          if ((*iter)->getViewId() == targetViewId && 
              (*iter)->getPoc()    == pcSliceHeader->getPoc() )
          {
            pcFrame = (*iter)->getRecFrame();
            break;
          }
        }
        if( ! pcFrame )
        {
          fprintf( stderr, "\nERROR: MISSING Inter-View PICTURE for RPLR\n\n" );
          RERR(); 
        }
        //----- find picture in reference list -----
        UInt uiRemoveIndex = MSYS_UINT_MAX;
        for( UInt uiPos = uiIndex; uiPos < rcList.getActive(); uiPos++ ) // active is equal to size
        {
          if( rcList.getEntry( uiPos ) == pcFrame )
          {
            uiRemoveIndex = uiPos;
            break;
          }
        }

        //----- reference list re-ordering -----
        RNOK( rcList.setElementAndRemove( uiIndex, uiRemoveIndex, pcFrame ) );
        uiIndex++;
        bFirstViewRPLR = false;
      } // inter-view 
    } // while
  }

  return Err::m_nOK;
}


ErrVal
RecPicBuffer::xDumpRefList( RefFrameList& rcList,
                            ListIdx       eListIdx  )
{
#if 1 // NO_DEBUG
  return Err::m_nOK;
#endif

  printf( "List %d =", eListIdx );
  for( UInt uiIndex = 1; uiIndex <= rcList.getActive(); uiIndex++ )
  {
    printf( " %d/%d", rcList[uiIndex]->getViewId(), rcList[uiIndex]->getPOC() );
  }
  printf( "\n" );
  fflush(stdout);
  return Err::m_nOK;
}


H264AVC_NAMESPACE_END

⌨️ 快捷键说明

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