ErrVal
RecPicBuffer::xMMCO( SliceHeader* pcSliceHeader )
{
  ROF( pcSliceHeader );

  MmcoOp            eMmcoOp;
  const MmcoBuffer& rcMmcoBuffer  = pcSliceHeader->getMmcoBuffer();
  Int               iIndex        = 0;
  UInt              uiVal1, uiVal2;

  while( MMCO_END != ( eMmcoOp = rcMmcoBuffer.get( iIndex++ ).getCommand( uiVal1, uiVal2 ) ) )
  {
    switch( eMmcoOp )
    {
    case MMCO_SHORT_TERM_UNUSED:
      RNOK( xMarkShortTermUnused( m_pcCurrRecPicBufUnit, uiVal1 ) );
      break;
    case MMCO_RESET:
    case MMCO_MAX_LONG_TERM_IDX:
    case MMCO_ASSIGN_LONG_TERM:
    case MMCO_LONG_TERM_UNUSED:
    case MMCO_SET_LONG_TERM:
    default:
      RERR();
    }
  }
  return Err::m_nOK;
}
ErrVal
RecPicBuffer::xCheckMissingPics( SliceHeader*   pcSliceHeader,
                                 PicBufferList& rcOutputList,
                                 PicBufferList& rcUnusedList )
{
  ROTRS( pcSliceHeader->isIdrNalUnit(), Err::m_nOK );
  ROTRS( ( ( m_uiLastRefFrameNum + 1 ) % m_uiMaxFrameNum ) == pcSliceHeader->getFrameNum(), Err::m_nOK );

  UInt  uiMissingFrames = pcSliceHeader->getFrameNum() - m_uiLastRefFrameNum - 1;
  if( pcSliceHeader->getFrameNum() <= m_uiLastRefFrameNum )
  {
    uiMissingFrames += m_uiMaxFrameNum;
  }
  ROF( pcSliceHeader->getSPS().getRequiredFrameNumUpdateBehaviourFlag() );
  
  for( UInt uiIndex = 1; uiIndex <= uiMissingFrames; uiIndex++ )
  {
    Bool  bTreatAsIdr   = ( m_cUsedRecPicBufUnitList.empty() );
    Int   iPoc          = ( bTreatAsIdr ? 0 : m_cUsedRecPicBufUnitList.back()->getPoc() );
    UInt  uiFrameNum    = ( m_uiLastRefFrameNum + uiIndex ) % m_uiMaxFrameNum;

    RNOK( m_pcCurrRecPicBufUnit->initNonEx( iPoc, uiFrameNum ) );
    RNOK( xStorePicture( m_pcCurrRecPicBufUnit, rcOutputList, rcUnusedList, pcSliceHeader, bTreatAsIdr ) );
  }

  m_uiLastRefFrameNum = ( m_uiLastRefFrameNum + uiMissingFrames ) % m_uiMaxFrameNum;
  return Err::m_nOK;
}
ErrVal
RecPicBufUnit::markNonRef()
{
  ROF( m_bNeededForReference );
  m_bNeededForReference = false;
  return Err::m_nOK;
}
ErrVal
RecPicBuffer::create( RecPicBuffer*& rpcRecPicBuffer )
{
  rpcRecPicBuffer = new RecPicBuffer();
  ROF( rpcRecPicBuffer );
  return Err::m_nOK;
}
示例#5
0
ErrVal
BitReadBuffer::create( BitReadBuffer*& rpcBitReadBuffer )
{
    rpcBitReadBuffer = new BitReadBuffer;
    ROF( rpcBitReadBuffer );
    return Err::m_nOK;
}
ErrVal
RecPicBuffer::xStorePicture( RecPicBufUnit* pcRecPicBufUnit,
                             PicBufferList& rcOutputList,
                             PicBufferList& rcUnusedList,
                             SliceHeader*   pcSliceHeader,
                             Bool           bTreatAsIdr )
{
  ROF( pcRecPicBufUnit == m_pcCurrRecPicBufUnit );

  if( bTreatAsIdr )
  {
    RNOK( xClearOutputAll( rcOutputList, rcUnusedList ) );
    m_cUsedRecPicBufUnitList.push_back( pcRecPicBufUnit );
  }
  else
  {
    m_cUsedRecPicBufUnitList.push_back( pcRecPicBufUnit );

    if( !pcSliceHeader->getInterViewRef()) // 
    {
    RNOK( xUpdateMemory( pcSliceHeader ) );
    }
    RNOK( xOutput( rcOutputList, rcUnusedList ) );
  }
  RNOK( xDumpRecPicBuffer() );

  m_pcCurrRecPicBufUnit = m_cFreeRecPicBufUnitList.popFront();

  return Err::m_nOK;
}
示例#7
0
ErrVal
SliceEncoder::updatePictureResTransform( ControlData&     rcControlData,
                                         UInt          uiMbInRow )
{
  ROF( m_bInitDone );

  SliceHeader&  rcSliceHeader         = *rcControlData.getSliceHeader           ();
  MbDataCtrl*   pcMbDataCtrl          =  rcControlData.getMbDataCtrl            ();
  MbDataCtrl*   pcBaseLayerCtrl       =  rcControlData.getBaseLayerCtrl         ();
  UInt          uiMbAddress           =  0;
  UInt          uiLastMbAddress       =  rcSliceHeader.getMbInPic() - 1;

  //====== initialization ======
  RNOK( pcMbDataCtrl->initSlice( rcSliceHeader, DECODE_PROCESS, false, NULL ) );

  // Update the macroblock state
  // Must be done after the bit-stream has been constructed
  for( ; uiMbAddress <= uiLastMbAddress; )
  {
    UInt          uiMbY               = 0;
    UInt          uiMbX               = 0;
    MbDataAccess* pcMbDataAccess      = 0;
    MbDataAccess* pcMbDataAccessBase  = 0;

    rcSliceHeader.getMbPositionFromAddress( uiMbY, uiMbX, uiMbAddress );
    RNOK( pcMbDataCtrl      ->initMb          ( pcMbDataAccess,     uiMbY, uiMbX ) );
    if( pcBaseLayerCtrl )
    {
      RNOK( pcBaseLayerCtrl ->initMb          ( pcMbDataAccessBase, uiMbY, uiMbX ) );
      pcMbDataAccess->setMbDataAccessBase( pcMbDataAccessBase );
    }

    // modify QP values (as specified in G.8.1.5.1.2)
    if( pcMbDataAccess->getMbData().getMbCbp() == 0 && ( pcMbDataAccess->getMbData().getMbMode() == INTRA_BL || pcMbDataAccess->getMbData().getResidualPredFlag() ) )
    {
      pcMbDataAccess->getMbData().setQp   ( pcMbDataAccessBase->getMbData().getQp() );
      pcMbDataAccess->getMbData().setQp4LF( pcMbDataAccessBase->getMbData().getQp() );
    }

    // if cbp==0, tranform size is not transmitted, in this case inherit the transform size from base layer
    if( ( pcMbDataAccess->getMbData().getResidualPredFlag() && ! pcMbDataAccess->getMbData().isIntra() && ! pcMbDataAccessBase->getMbData().isIntra() ) || ( pcMbDataAccess->getMbData().getMbMode() == INTRA_BL ) )
    {
      if( ( pcMbDataAccess->getMbData().getMbCbp() & 0x0F ) == 0 )
      {
        pcMbDataAccess->getMbData().setTransformSize8x8( pcMbDataAccessBase->getMbData().isTransformSize8x8() );
      }
    }

    // set I_PCM mode (for deblocking) when CBP is 0, mbMode is I_BL, and base layer mbMode is I_PCM
    if( pcMbDataAccess->getMbData().getMbCbp() == 0 && pcMbDataAccess->getMbData().isIntraBL() && pcMbDataAccessBase->getMbData().isPCM() )
    {
      pcMbDataAccess->getMbData().setMbMode( MODE_PCM );
    }

    uiMbAddress++;
  }

  return Err::m_nOK;
}
示例#8
0
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;
}
示例#9
0
ErrVal
InputPicBuffer::init()
{
  ROF( m_cInputUnitList.empty() );
  m_uiContFrameNumber = 0;
  m_bInit             = true;
  return Err::m_nOK;
}
ErrVal ControlMngH264AVCEncoder::initMbForFiltering( MbDataAccess*& rpcMbDataAccess, UInt uiMbY, UInt uiMbX, Bool bMbAff )
{
  ROF( m_uiCurrLayer < MAX_LAYERS );

//  m_pcMbDataCtrl->initMb( rpcMbDataAccess, uiMbY, uiMbX );//test

  RNOK( m_apcYuvFullPelBufferCtrl[m_uiCurrLayer]->initMb( uiMbY, uiMbX, bMbAff ) );
  return Err::m_nOK;
}
示例#11
0
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;
}
示例#12
0
ErrVal
MbParser::initSlice( MbSymbolReadIf* pcMbSymbolReadIf )
{
  ROF( pcMbSymbolReadIf );
  m_pcMbSymbolReadIf  = pcMbSymbolReadIf;
  m_bPrevIsSkipped    = false;
  m_bInitDone         = true;
  return Err::m_nOK;
}
示例#13
0
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;
}
示例#14
0
ErrVal
RecPicBuffer::init( YuvBufferCtrl*  pcYuvBufferCtrlFullPel,
                    YuvBufferCtrl*  pcYuvBufferCtrlHalfPel )
{
  ROT( m_bInitDone );
  ROF( pcYuvBufferCtrlFullPel );
  ROF( pcYuvBufferCtrlHalfPel );

  m_pcYuvBufferCtrlFullPel  = pcYuvBufferCtrlFullPel;
  m_pcYuvBufferCtrlHalfPel  = pcYuvBufferCtrlHalfPel;
  m_uiNumRefFrames          = 0;
  m_uiMaxFrameNum           = 0;
  m_uiLastRefFrameNum       = MSYS_UINT_MAX;
  m_pcCurrRecPicBufUnit     = NULL;
  m_bInitDone               = true;
  m_codeAsVFrame            = false;

  return Err::m_nOK;
}
示例#15
0
文件: MbMvData.cpp 项目: hwyhit/JSVM
ErrVal
MbMotionData::setRefPicIdcs( RefFrameList* pcRefFrameList )
{
  for( UInt ui = 0; ui < 4; ui++ )
  {
    RefPicIdc cRefPicIdc;
    SChar     scRefIdx = m_ascRefIdx[ui];
    if( scRefIdx > 0 )
    {
      ROF( pcRefFrameList );
      ROF( scRefIdx <= (Int)pcRefFrameList->getActive() );
      const Frame* pcFrame = (*pcRefFrameList)[ scRefIdx ];
      ROF( pcFrame );
      cRefPicIdc.set( pcFrame );
    }
    m_acRefPicIdc[ui] = cRefPicIdc;
  }
  return Err::m_nOK;
}
示例#16
0
ErrVal
RecPicBuffer::xClearOutputAll( PicBufferList& rcOutputList,
                               PicBufferList& rcUnusedList )
{
  //===== create output list =====
  RecPicBufUnitList           cOutputList;
  Int                         iMinPoc = MSYS_INT_MAX;
  Int                         iMaxPoc = MSYS_INT_MIN;
  RecPicBufUnitList::iterator iter    = m_cUsedRecPicBufUnitList.begin();
  RecPicBufUnitList::iterator end     = m_cUsedRecPicBufUnitList.end  ();
  for( ; iter != end; iter++ )
  {
    Bool bOutput = ( ! (*iter)->isOutputted() && (*iter)->isExisting() );
    if( bOutput )
    {
      cOutputList.push_back( *iter );
      if( (*iter)->getPoc() < iMinPoc )   iMinPoc = (*iter)->getPoc();
      if( (*iter)->getPoc() > iMaxPoc )   iMaxPoc = (*iter)->getPoc();
    }
  }

  //===== real output =====
  for( Int iPoc = iMinPoc; iPoc <= iMaxPoc; iPoc++ )
  {
    iter = cOutputList.begin();
    end  = cOutputList.end  ();
    for( ; iter != end; iter++ )
    {
      if( (*iter)->getPoc() == iPoc )
      {
        RecPicBufUnit* pcRecPicBufUnit = *iter;
        cOutputList.remove( pcRecPicBufUnit );

        //--- output ---
        PicBuffer* pcPicBuffer = pcRecPicBufUnit->getPicBuffer();
        ROF( pcPicBuffer );
        pcRecPicBufUnit->getRecFrame()->store( pcPicBuffer );
        rcOutputList.push_back( pcPicBuffer );
        rcUnusedList.push_back( pcPicBuffer );
        break; // only one picture per poc
      }
    }
  }
  ROT( cOutputList.size() );

  //===== uninit all elements and move to free list =====
  while( m_cUsedRecPicBufUnitList.size() )
  {
    RecPicBufUnit* pcRecPicBufUnit = m_cUsedRecPicBufUnitList.popFront();
    RNOK( pcRecPicBufUnit->uninit() );
    m_cFreeRecPicBufUnitList.push_back( pcRecPicBufUnit );
  }
  return Err::m_nOK;
}
示例#17
0
ErrVal
InputPicBuffer::add( PicBuffer* pcInputPicBuffer )
{
  ROF( m_bInit );

  //===== add to list =====
  InputAccessUnit* pcInputAccessUnit = new InputAccessUnit( m_uiContFrameNumber++, pcInputPicBuffer );
  m_cInputUnitList.push_back( pcInputAccessUnit );

  return Err::m_nOK;
}
示例#18
0
ErrVal
NalUnitParser::uninit()
{
  ROF( m_bInitialized );
  ROT( m_bNalUnitInitialized );
  m_bInitialized          = false;
  m_bNalUnitInitialized   = false;
  m_pcBitReadBuffer       = 0;
  m_pcHeaderSymbolReadIf  = 0;
  return Err::m_nOK;
}
示例#19
0
文件: Frame.cpp 项目: Aldream/jsvm
ErrVal
Frame::xUpdatePicParameters()
{
  //===== set in associated frame or top and bot field =====
  if( m_ePicType == FRAME )
  {
    if( m_pcFrameTopField )
    {
      m_pcFrameTopField->m_cPicParameters     = m_cPicParameters;
      m_pcFrameTopField->m_cPicParametersBot  = m_cPicParametersBot;
    }
    if( m_pcFrameBotField )
    {
      m_pcFrameBotField->m_cPicParameters     = m_cPicParameters;
      m_pcFrameBotField->m_cPicParametersBot  = m_cPicParametersBot;
    }
  }
  else if( m_ePicType == TOP_FIELD )
  {
    ROF( m_pcFrame );
    m_pcFrame->m_cPicParameters     = m_cPicParameters;
    m_pcFrame->m_cPicParametersBot  = m_cPicParametersBot;
    if( m_pcFrame->m_pcFrameBotField )
    {
      m_pcFrameBotField->m_cPicParameters     = m_cPicParameters;
      m_pcFrameBotField->m_cPicParametersBot  = m_cPicParametersBot;
    }
  }
  else if( m_ePicType == BOT_FIELD )
  {
    ROF( m_pcFrame );
    m_pcFrame->m_cPicParameters     = m_cPicParameters;
    m_pcFrame->m_cPicParametersBot  = m_cPicParametersBot;
    if( m_pcFrame->m_pcFrameTopField )
    {
      m_pcFrameTopField->m_cPicParameters     = m_cPicParameters;
      m_pcFrameTopField->m_cPicParametersBot  = m_cPicParametersBot;
    }
  }
  return Err::m_nOK;
}
示例#20
0
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 ControlMngH264AVCDecoder::initMbForFiltering( UInt uiMbIndex )
{
  ROF( m_uiCurrLayer < MAX_LAYERS );
  
  UInt uiMbY, uiMbX;

  uiMbY = uiMbIndex         / m_auiMbXinFrame[m_uiCurrLayer];
  uiMbX = uiMbIndex - uiMbY * m_auiMbXinFrame[m_uiCurrLayer];

  RNOK( m_apcYuvFullPelBufferCtrl[m_uiCurrLayer]->initMb( uiMbY, uiMbX ) );

  return Err::m_nOK;
}
示例#22
0
ErrVal SliceEncoder::uninit()
{
  ROF( m_bInitDone );
  m_pcMbEncoder =  NULL;
  m_pcMbCoder =  NULL;
  m_pcControlMng =  NULL;
  m_bInitDone = false;

  m_uiFrameCount = 0;
  m_eSliceType =  I_SLICE;
  m_bTraceEnable = false;
  return Err::m_nOK;
}
示例#23
0
ErrVal
RecPicBufUnit::create( RecPicBufUnit*&              rpcRecPicBufUnit,
                       YuvBufferCtrl&               rcYuvBufferCtrlFullPel,
                       YuvBufferCtrl&               rcYuvBufferCtrlHalfPel,
                       const SequenceParameterSet&  rcSPS )
{
  rpcRecPicBufUnit = new RecPicBufUnit();
  ROF( rpcRecPicBufUnit );

  rpcRecPicBufUnit->m_pcReconstructedFrame  = new IntFrame  ( rcYuvBufferCtrlFullPel,
                                                              rcYuvBufferCtrlHalfPel );
  rpcRecPicBufUnit->m_pcMbDataCtrl          = new MbDataCtrl();
  ROF( rpcRecPicBufUnit->m_pcReconstructedFrame );
  ROF( rpcRecPicBufUnit->m_pcMbDataCtrl );
    
  RNOK( rpcRecPicBufUnit->m_pcReconstructedFrame  ->init() );
  RNOK( rpcRecPicBufUnit->m_pcMbDataCtrl          ->init( rcSPS ) );

  rpcRecPicBufUnit->m_pcReconstructedFrame->setRecPicBufUnit( rpcRecPicBufUnit );

  return Err::m_nOK;
}
示例#24
0
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 ControlMngH264AVCDecoder::initMbForParsing( MbDataAccess*& rpcMbDataAccess, UInt uiMbIndex )
{
  ROF( m_uiCurrLayer < MAX_LAYERS );
  
  UInt uiMbY, uiMbX;

  uiMbY = uiMbIndex         / m_auiMbXinFrame[m_uiCurrLayer];
  uiMbX = uiMbIndex - uiMbY * m_auiMbXinFrame[m_uiCurrLayer];

  RNOK( m_pcMbDataCtrl                          ->initMb( rpcMbDataAccess, uiMbY, uiMbX ) );
  RNOK( m_apcYuvFullPelBufferCtrl[m_uiCurrLayer]->initMb(                  uiMbY, uiMbX ) );

  return Err::m_nOK;
}
示例#26
0
ErrVal
RecPicBuffer::initCurrRecPicBufUnit( RecPicBufUnit*&  rpcCurrRecPicBufUnit,
                                     PicBuffer*       pcPicBuffer,
                                     SliceHeader*     pcSliceHeader,
                                     PicBufferList&   rcOutputList,
                                     PicBufferList&   rcUnusedList, 
									 MultiviewReferenceDirection refDirection)
{
  ROF( m_bInitDone );
  ROF( pcPicBuffer );
  ROF( pcSliceHeader );

  //===== check for missing pictures =====
  if (NOT_MULTIVIEW == refDirection) {
    // Do not check for missing pics if we are initializing for a 
    // multiview reference because the frame numbers are not meaningful
    // for multiview references and errors will result.
    RNOK( xCheckMissingPics( pcSliceHeader, rcOutputList, rcUnusedList ) );
  }

  

  //===== initialize current DPB unit =====
  RNOK( m_pcCurrRecPicBufUnit->init( pcSliceHeader, pcPicBuffer ) );

  //===== load picture =====
  RNOK( m_pcCurrRecPicBufUnit->getRecFrame()->load( pcPicBuffer ) );


  m_pcCurrRecPicBufUnit->SetMultiviewReferenceDirection(refDirection);

// the set of refDirection to NOT_MULTIVIEW has been done too much times, many of them are unnecessary
  //===== set reference =====
  rpcCurrRecPicBufUnit = m_pcCurrRecPicBufUnit;

  return Err::m_nOK;
}
示例#27
0
ErrVal
SliceEncoder::updateBaseLayerResidual( ControlData&     rcControlData,
                                         UInt          uiMbInRow )
{
  ROF( m_bInitDone );

  SliceHeader&  rcSliceHeader         = *rcControlData.getSliceHeader           ();
  MbDataCtrl*   pcMbDataCtrl          =  rcControlData.getMbDataCtrl            ();
  MbDataCtrl*   pcBaseLayerCtrl       =  rcControlData.getBaseLayerCtrl         ();
  Frame*     pcBaseLayerSbb        =  rcControlData.getBaseLayerSbb         ();
  UInt          uiMbAddress           =  0;
  UInt          uiLastMbAddress       =  rcSliceHeader.getMbInPic() - 1;

  //====== initialization ======
  RNOK( pcMbDataCtrl->initSlice( rcSliceHeader, DECODE_PROCESS, false, NULL ) );

  for( ; uiMbAddress <= uiLastMbAddress; )
  {
    UInt          uiMbY               = uiMbAddress / uiMbInRow;
    UInt          uiMbX               = uiMbAddress % uiMbInRow;
    MbDataAccess* pcMbDataAccess      = 0;
    MbDataAccess* pcMbDataAccessBase  = 0;

    RNOK( pcMbDataCtrl      ->initMb          ( pcMbDataAccess,     uiMbY, uiMbX ) );
    if( pcBaseLayerCtrl )
    {
      RNOK( pcBaseLayerCtrl ->initMb          ( pcMbDataAccessBase, uiMbY, uiMbX ) );
      //pcMbDataAccess->setMbDataAccessBase( pcMbDataAccessBase );
    }

    // Update the state of the baselayer residual data -- it may be reused in subsequent layers - [email protected]
    if( !pcMbDataAccess->getMbData().getResidualPredFlag() )
    {
      if( pcBaseLayerSbb && ( pcMbDataAccess->getMbData().isIntra() || ! pcMbDataAccess->getMbData().getResidualPredFlag() ) )
      {
        YuvPicBuffer* pcBaseResidual = pcBaseLayerSbb->getFullPelYuvBuffer();

        pcBaseResidual->getBufferCtrl().initMb( uiMbY, uiMbX, false);
        pcBaseResidual->clearCurrMb();
      }
    }

    uiMbAddress++;
  }

  return Err::m_nOK;
}
示例#28
0
ErrVal
RecPicBuffer::uninit()
{
  ROF( m_bInitDone );

  RNOK( xDeleteData() );

  m_pcYuvBufferCtrlFullPel  = NULL;
  m_pcYuvBufferCtrlHalfPel  = NULL;
  m_uiNumRefFrames          = 0;
  m_uiMaxFrameNum           = 0;
  m_uiLastRefFrameNum       = MSYS_UINT_MAX;
  m_bInitDone               = false;
  m_codeAsVFrame            = false;

  return Err::m_nOK;
}
ErrVal ControlMngH264AVCDecoder::initMbForParsing( MbDataAccess*& rpcMbDataAccess, UInt uiMbIndex )
{
  ROF( m_uiCurrLayer < MAX_LAYERS );
  
  UInt uiMbY, uiMbX;

  uiMbY = uiMbIndex         / m_auiMbXinFrame[m_uiCurrLayer];
  uiMbX = uiMbIndex - uiMbY * m_auiMbXinFrame[m_uiCurrLayer];

  RNOK( m_pcMbDataCtrl                          ->initMb( rpcMbDataAccess, uiMbY, uiMbX ) );
#ifdef   LF_INTERLACE
  RNOK( m_apcYuvFullPelBufferCtrl[m_uiCurrLayer]->initMb(                  uiMbY, uiMbX, m_bMbAff ) ); // for future use
#else //!LF_INTERLACE
  RNOK( m_apcYuvFullPelBufferCtrl[m_uiCurrLayer]->initMb(                  uiMbY, uiMbX ) );
#endif //LF_INTERLACE

  return Err::m_nOK;
}
示例#30
0
ErrVal
RecPicBuffer::xCreateData( UInt                         uiMaxFramesInDPB,
                           const SequenceParameterSet&  rcSPS )
{
  ROF( m_bInitDone );
  RNOK( xDeleteData() );

  while( uiMaxFramesInDPB-- )
  {
    RecPicBufUnit* pcRecPicBufUnit = 0;
    RNOK( RecPicBufUnit::create( pcRecPicBufUnit, *m_pcYuvBufferCtrlFullPel, *m_pcYuvBufferCtrlHalfPel, rcSPS ) );
    m_cFreeRecPicBufUnitList.push_back( pcRecPicBufUnit );
  }
  RNOK( RecPicBufUnit::create( m_pcCurrRecPicBufUnit, *m_pcYuvBufferCtrlFullPel, *m_pcYuvBufferCtrlHalfPel, rcSPS ) );
  RNOK( m_pcCurrRecPicBufUnit->uninit() );

  return Err::m_nOK;
}