Ignore:
Timestamp:
4 Sep 2015, 21:28:58 (9 years ago)
Author:
tech
Message:

Clean-ups. HLS.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HTM-15.0-dev0/source/App/TAppDecoder/TAppDecTop.cpp

    r1313 r1317  
    6464{
    6565#if NH_MV
    66   for (Int i = 0; i < MAX_NUM_LAYER_IDS; i++)
    67   {
    68     m_layerIdToDecIdx[i] = -1;
    69     m_layerInitilizedFlags[i] = false;
    70   }
     66  for (Int i = 0; i < MAX_NUM_LAYER_IDS; i++)
     67  {
     68    m_layerIdToDecIdx                     [i] = -1;
     69    m_layerInitilizedFlag                 [i] = false;
     70    m_eosInLayer                          [i] = false;
     71    m_firstPicInLayerDecodedFlag          [i] = false;
     72    m_pocDecrementedInDpbFlag             [i] = false;
     73    m_decodingOrder                       [i] = 0;
     74    m_lastPresentPocResetIdc              [i] = MIN_INT;
     75    m_firstPicInPocResettingPeriodReceived[i] = true;
     76    m_noRaslOutputFlagAssocIrap           [i] = false;
     77  }
     78
     79  m_curPic                          = NULL;
     80  m_vps                             = NULL;
     81  m_sps                             = NULL;
     82  m_pps                             = NULL;
     83  m_initilizedFromVPS               = false;
     84  m_firstSliceInBitstream           = true;
     85  m_newVpsActivatedbyCurAu          = false;
     86  m_newVpsActivatedbyCurPic         = false;
     87  m_handleCraAsBlaFlag              = false;
     88  m_handleCraAsBlaFlagSetByExtMeans = false;
     89  m_noClrasOutputFlag               = false;
     90  m_noClrasOutputFlagSetByExtMeans  = false;
     91  m_layerResetFlag                  = false;
     92  m_totalNumofPicsReceived          = 0;
     93  m_cvsStartFound                   = false;
    7194#endif
    7295#if NH_3D
    73     m_pScaleOffsetFile  = 0;
     96    m_pScaleOffsetFile              = 0;
    7497#endif
    75 
     98}
     99
     100Void TAppDecTop::create()
     101{
    76102#if NH_MV
    77     m_markedForOutput = false;
     103#if ENC_DEC_TRACE
     104  if ( g_hTrace == NULL )
     105  {
     106    g_hTrace = fopen( "TraceDec.txt", "wb" );
     107    g_bJustDoIt = g_bEncDecTraceDisable;
     108    g_nSymbolCounter = 0;
     109  }
    78110#endif
    79 
    80 }
    81 
    82 Void TAppDecTop::create()
    83 {
     111#endif
    84112}
    85113
     
    115143  {
    116144    free (m_pchScaleOffsetFile);
    117     m_pchScaleOffsetFile = NULL; 
     145    m_pchScaleOffsetFile = NULL;
    118146  }
    119147#endif
     
    132160 .
    133161 */
     162
     163#if NH_MV
    134164Void TAppDecTop::decode()
    135165{
     166  // create & initialize internal classes
     167  xInitFileIO  ();
     168  xCreateDecLib();
     169  xInitDecLib  ();
     170
     171  InputByteStream bytestream(m_bitstreamFile);
     172
     173  while ( m_bitstreamFile )
     174  {
     175    AnnexBStats stats = AnnexBStats();
     176    InputNALUnit nalu;
     177
     178    byteStreamNALUnit(bytestream, nalu.getBitstream().getFifo(), stats);
     179
     180    if (nalu.getBitstream().getFifo().empty())
     181    {
     182      /* this can happen if the following occur:
     183       *  - empty input file
     184       *  - two back-to-back start_code_prefixes
     185       *  - start_code_prefix immediately followed by EOF
     186       */
     187      fprintf(stderr, "Warning: Attempt to decode an empty NAL unit\n");
     188    }
     189    else
     190    {
     191      read(nalu);
     192
     193      if ( m_printReceivedNalus )
     194      {
     195        std::cout << "Received NAL unit: ";
     196        nalu.print();
     197        std::cout << std::endl;
     198      }
     199
     200      if ( xExtractAndRewrite( &nalu )
     201          && nalu.m_nuhLayerId <= MAX_NUM_LAYER_IDS-1
     202          && !(nalu.m_nalUnitType == NAL_UNIT_VPS && nalu.m_nuhLayerId > 0)
     203          && !(nalu.m_nalUnitType == NAL_UNIT_EOB && nalu.m_nuhLayerId > 0)
     204         )
     205      {
     206        xGetDecoderIdx( nalu.m_nuhLayerId , true );
     207        if( nalu.isSlice() )
     208        {
     209          xProcessVclNalu   ( nalu );
     210        }
     211        else
     212        {
     213          xProcessNonVclNalu( nalu );
     214        }
     215      }
     216    }
     217  }
     218 xTerminateDecoding();
     219}
     220#endif
     221
     222#if !NH_MV
     223Void TAppDecTop::decode()
     224{
    136225  Int                 poc;
    137 #if NH_MV
    138   poc = -1;
    139 #endif
    140226  TComList<TComPic*>* pcListPic = NULL;
    141227
     
    146232    exit(EXIT_FAILURE);
    147233  }
    148 #if NH_3D
    149   if( m_pchScaleOffsetFile )
    150   {
    151     m_pScaleOffsetFile = ::fopen( m_pchScaleOffsetFile, "wt" );
    152     AOF( m_pScaleOffsetFile );
    153   }
    154 #endif
    155234
    156235  InputByteStream bytestream(bitstreamFile);
     
    169248  xCreateDecLib();
    170249  xInitDecLib  ();
    171 #if !NH_MV
     250
    172251  m_iPOCLastDisplay += m_iSkipFrame;      // set the last displayed POC correctly for skip forward.
    173252
    174253  // main decoder loop
    175254  Bool openedReconFile = false; // reconstruction file not yet opened. (must be performed after SPS is seen)
    176 #else
    177 
    178   Int  pocCurrPic        = -MAX_INT;     
    179   Int  pocLastPic        = -MAX_INT;   
    180 
    181   Int  layerIdLastPic    = -MAX_INT;
    182   Int  layerIdCurrPic    = 0;
    183 
    184   Int  decIdxLastPic     = 0;
    185   Int  decIdxCurrPic     = 0;
    186 
    187   Bool firstSlice        = true;
    188 #endif
    189255  Bool loopFiltered = false;
    190256
     
    201267    streampos location = bitstreamFile.tellg();
    202268#endif
    203 #if NH_MV
    204 #if ENC_DEC_TRACE
    205     Int64 symCount = g_nSymbolCounter;
    206 #endif
    207 #endif
    208269    AnnexBStats stats = AnnexBStats();
    209270
     
    213274    // call actual decoding function
    214275    Bool bNewPicture = false;
    215 #if NH_MV
    216     Bool newSliceDiffPoc   = false;
    217     Bool newSliceDiffLayer = false;
    218     Bool sliceSkippedFlag  = false;
    219     Bool allLayersDecoded  = false;     
    220 #endif
    221276    if (nalu.getBitstream().getFifo().empty())
    222277    {
     
    231286    {
    232287      read(nalu);
    233 #if NH_MV     
    234       if( (m_iMaxTemporalLayer >= 0 && nalu.m_temporalId > m_iMaxTemporalLayer)
    235           || !isNaluWithinTargetDecLayerIdSet(&nalu)
    236           || nalu.m_nuhLayerId > MAX_NUM_LAYER_IDS-1
    237           || (nalu.m_nalUnitType == NAL_UNIT_VPS && nalu.m_nuhLayerId > 0)           
    238           || (nalu.m_nalUnitType == NAL_UNIT_EOB && nalu.m_nuhLayerId > 0)             
    239          )
     288
     289      if( (m_iMaxTemporalLayer >= 0 && nalu.m_temporalId > m_iMaxTemporalLayer) || !isNaluWithinTargetDecLayerIdSet(&nalu)  )
    240290      {
    241291        bNewPicture = false;
    242         if ( !bitstreamFile )
    243         {
    244           decIdxLastPic     = decIdxCurrPic;
    245         }
    246292      }
    247293      else
    248       {
    249         Int decIdx     = xGetDecoderIdx( nalu.m_nuhLayerId , true );     
    250         newSliceDiffLayer = nalu.isSlice() && ( nalu.m_nuhLayerId != layerIdCurrPic ) && !firstSlice;
    251         newSliceDiffPoc   = m_tDecTop[decIdx]->decode(nalu, m_iSkipFrame, m_pocLastDisplay[decIdx], newSliceDiffLayer, sliceSkippedFlag );
    252         // decode function only returns true when all of the following conditions are true
    253         // - poc in particular layer changes
    254         // - nalu does not belong to first slice in layer
    255         // - nalu.isSlice() == true     
    256 
    257         bNewPicture       = ( newSliceDiffLayer || newSliceDiffPoc ) && !sliceSkippedFlag;
    258         if ( nalu.isSlice() && firstSlice && !sliceSkippedFlag )       
    259         {
    260           layerIdCurrPic = nalu.m_nuhLayerId;
    261           pocCurrPic     = m_tDecTop[decIdx]->getCurrPoc();
    262           decIdxCurrPic  = decIdx;
    263           firstSlice     = false;
    264 
    265           /// Use VPS activated by the first slice to determine OLS
    266           m_vps = m_tDecTop[decIdx]->getActiveVPS( );
    267           if ( m_targetDecLayerIdSetFileEmpty )
    268           {           
    269             if ( m_targetOptLayerSetIdx == -1 )
    270             {
    271               m_targetOptLayerSetIdx = m_tDecTop[decIdx]->getTargetOlsIdx();
    272             }
    273             else
    274             {
    275               assert( m_tDecTop[decIdx]->getTargetOlsIdx() == m_targetOptLayerSetIdx );
    276             }
    277 
    278             if ( m_targetOptLayerSetIdx < 0 || m_targetOptLayerSetIdx >= m_vps->getNumOutputLayerSets() )
    279             {
    280               fprintf(stderr, "\ntarget output layer set index must be in the range of 0 to %d, inclusive \n", m_vps->getNumOutputLayerSets() - 1 );           
    281               exit(EXIT_FAILURE);
    282             }
    283             m_targetDecLayerIdSet = m_vps->getTargetDecLayerIdList( m_targetOptLayerSetIdx );
    284           }
    285 
    286           if (m_outputVpsInfo )
    287           {
    288             m_vps->printScalabilityId();
    289             m_vps->printLayerDependencies();
    290             m_vps->printLayerSets();
    291             m_vps->printPTL();
    292           }
    293         }       
    294 
    295         if ( bNewPicture || !bitstreamFile || nalu.m_nalUnitType == NAL_UNIT_EOS )
    296         {
    297           layerIdLastPic    = layerIdCurrPic;
    298           layerIdCurrPic    = nalu.m_nuhLayerId;
    299           pocLastPic        = pocCurrPic;
    300           pocCurrPic        = m_tDecTop[decIdx]->getCurrPoc();
    301           decIdxLastPic     = decIdxCurrPic;
    302           decIdxCurrPic     = decIdx;
    303           allLayersDecoded = ( pocCurrPic != pocLastPic ) && ( nalu.m_nalUnitType != NAL_UNIT_EOS );
    304         }
    305 #else
    306       if( (m_iMaxTemporalLayer >= 0 && nalu.m_temporalId > m_iMaxTemporalLayer) || !isNaluWithinTargetDecLayerIdSet(&nalu)  )
    307       {
    308         bNewPicture = false;
    309       }
    310       else
    311294      {
    312295        bNewPicture = m_cTDecTop.decode(nalu, m_iSkipFrame, m_iPOCLastDisplay);
    313 #endif
    314296        if (bNewPicture)
    315297        {
     
    327309          bytestream.reset();
    328310#endif
    329 #if H_MV_ENC_DEC_TRAC
    330 #if ENC_DEC_TRACE
    331           const Bool resetCounter = false;
    332           if ( resetCounter )
    333           {
    334             g_nSymbolCounter  = symCount; // Only reset counter SH becomes traced twice
    335           }
    336           else
    337           {
    338             g_disableHLSTrace = true;     // Tracing of second parsing of SH is not carried out
    339           }     
    340 #endif
    341 #endif
    342311        }
    343312      }
     
    345314
    346315    if ( (bNewPicture || !bitstreamFile || nalu.m_nalUnitType == NAL_UNIT_EOS) &&
    347 #if NH_MV     
    348       !m_tDecTop[decIdxLastPic]->getFirstSliceInSequence () )
    349 #else
     316
    350317      !m_cTDecTop.getFirstSliceInSequence () )
    351 #endif
    352318
    353319    {
    354320      if (!loopFiltered || bitstreamFile)
    355321      {
    356 #if NH_MV
    357         assert( decIdxLastPic != -1 );
    358         m_tDecTop[decIdxLastPic]->endPicDecoding(poc, pcListPic, m_targetDecLayerIdSet );
    359         xMarkForOutput( allLayersDecoded, poc, layerIdLastPic );
    360 #else
    361322        m_cTDecTop.executeLoopFilters(poc, pcListPic);
    362 #endif
    363323      }
    364324      loopFiltered = (nalu.m_nalUnitType == NAL_UNIT_EOS);
    365325      if (nalu.m_nalUnitType == NAL_UNIT_EOS)
    366326      {
    367 #if NH_MV     
    368         m_tDecTop[decIdxLastPic]->setFirstSliceInSequence(true);
    369 #else
    370327        m_cTDecTop.setFirstSliceInSequence(true);
    371 #endif
    372328      }
    373329    }
    374330    else if ( (bNewPicture || !bitstreamFile || nalu.m_nalUnitType == NAL_UNIT_EOS ) &&
    375 #if NH_MV     
    376               m_tDecTop[decIdxLastPic]->getFirstSliceInSequence () )
    377 #else
    378               m_cTDecTop.getFirstSliceInSequence () )
    379 #endif
    380     {
    381 #if NH_MV     
    382       m_tDecTop[decIdxLastPic]->setFirstSliceInPicture (true);
    383 #else
     331              m_cTDecTop.getFirstSliceInSequence () )
     332    {
    384333      m_cTDecTop.setFirstSliceInPicture (true);
    385 #endif
    386     }
    387 
    388 #if NH_3D
    389     if ( allLayersDecoded || !bitstreamFile )
    390     {
    391       for( Int dI = 0; dI < m_numDecoders; dI++ )
    392       {
    393         TComPic* picLastCoded = m_ivPicLists.getPic( m_tDecTop[dI]->getLayerId(), pocLastPic );
    394         assert( picLastCoded != NULL );       
    395         picLastCoded->compressMotion(1);
    396       }
    397     }
    398 #endif
     334   }
    399335
    400336    if( pcListPic )
    401337    {
    402 #if NH_MV
    403       if ( m_pchReconFiles[decIdxLastPic] && !m_reconOpen[decIdxLastPic] )
    404 #else
    405338      if ( m_pchReconFile && !openedReconFile )
    406 #endif
    407339      {
    408340        const BitDepths &bitDepths=pcListPic->front()->getPicSym()->getSPS().getBitDepths(); // use bit depths of first reconstructed picture.
     
    414346          }
    415347        }
    416 #if NH_MV
    417         m_tVideoIOYuvReconFile[decIdxLastPic]->open( m_pchReconFiles[decIdxLastPic], true, m_outputBitDepth, m_outputBitDepth, bitDepths.recon ); // write mode
    418         m_reconOpen[decIdxLastPic] = true;
     348        m_cTVideoIOYuvReconFile.open( m_pchReconFile, true, m_outputBitDepth, m_outputBitDepth, bitDepths.recon ); // write mode
     349        openedReconFile = true;
    419350      }
    420351      // write reconstruction to file
    421352      if( bNewPicture )
    422353      {
    423         // Bumping after picture has been decoded
    424 #if ENC_DEC_TRACE
    425         g_bJustDoIt = true; 
    426         writeToTraceFile( "Bumping after decoding \n", g_decTracePicOutput  );         
    427         g_bJustDoIt = false; 
    428 #endif
    429         xWriteOutput( pcListPic, decIdxLastPic, nalu.m_temporalId );
    430       }
    431       if ( (bNewPicture || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_CRA) && m_tDecTop[decIdxLastPic]->getNoOutputPriorPicsFlag() )
    432       {
    433         m_tDecTop[decIdxLastPic]->checkNoOutputPriorPics( pcListPic );
    434         m_tDecTop[decIdxLastPic]->setNoOutputPriorPicsFlag (false);
    435       }
    436 
    437       if ( bNewPicture && newSliceDiffPoc &&
    438 #else
    439         m_cTVideoIOYuvReconFile.open( m_pchReconFile, true, m_outputBitDepth, m_outputBitDepth, bitDepths.recon ); // write mode
    440         openedReconFile = true;
    441       }
    442       // write reconstruction to file
    443       if( bNewPicture )
    444       {
    445354        xWriteOutput( pcListPic, nalu.m_temporalId );
    446355      }
     
    452361
    453362      if ( bNewPicture &&
    454 #endif
    455363           (   nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_IDR_W_RADL
    456364            || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_IDR_N_LP
     
    459367            || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_BLA_W_LP ) )
    460368      {
    461 #if NH_MV
    462         xFlushOutput( pcListPic, decIdxLastPic );
    463 #else
     369
    464370        xFlushOutput( pcListPic );
    465 #endif
    466371      }
    467372      if (nalu.m_nalUnitType == NAL_UNIT_EOS)
    468373      {
    469 #if NH_MV
    470         xWriteOutput( pcListPic, decIdxCurrPic, nalu.m_temporalId );
    471 #else
     374
    472375        xWriteOutput( pcListPic, nalu.m_temporalId );
    473 #endif
    474 #if NH_MV
    475         m_tDecTop[decIdxCurrPic]->setFirstSliceInPicture (false);
    476 #else
    477376        m_cTDecTop.setFirstSliceInPicture (false);
    478 #endif
    479377      }
    480378      // write reconstruction to file -- for additional bumping as defined in C.5.2.3
    481 #if NH_MV
    482       // Above comment seems to be wrong
    483 #endif
    484379      if(!bNewPicture && nalu.m_nalUnitType >= NAL_UNIT_CODED_SLICE_TRAIL_N && nalu.m_nalUnitType <= NAL_UNIT_RESERVED_VCL31)
    485380      {
    486 #if NH_MV       
    487         // Bumping after reference picture set has been applied (here after first vcl nalu.
    488 #if ENC_DEC_TRACE
    489         g_bJustDoIt = true; 
    490         writeToTraceFile( "Bumping after reference picture set has been applied \n", g_decTracePicOutput  );         
    491         g_bJustDoIt = false; 
    492 #endif
    493 
    494         xWriteOutput( m_tDecTop[decIdxCurrPic]->getListPic(), decIdxCurrPic, nalu.m_temporalId );
    495 #else
    496381        xWriteOutput( pcListPic, nalu.m_temporalId );
    497 #endif
    498       }
    499     }
    500   }
    501 #if NH_MV
    502 #if NH_3D
    503   if( m_cCamParsCollector.isInitialized() )
    504   {
    505     m_cCamParsCollector.setSlice( 0 );
    506   }
    507 #endif
    508   for(UInt decIdx = 0; decIdx < m_numDecoders; decIdx++)
    509   {
    510     xFlushOutput( m_tDecTop[decIdx]->getListPic(), decIdx );
    511   }
    512 #else 
     382      }
     383    }
     384  }
     385
    513386  xFlushOutput( pcListPic );
    514387  // delete buffers
     
    516389  // destroy internal classes
    517390  xDestroyDecLib();
     391}
    518392#endif
    519 }
    520393
    521394// ====================================================================================================================
     
    527400#if NH_MV
    528401  // initialize global variables
    529   initROM(); 
     402  initROM();
    530403#if NH_3D_DMM
    531404  initWedgeLists();
     
    548421    {
    549422      m_tVideoIOYuvReconFile[decIdx]->close();
    550       delete m_tVideoIOYuvReconFile[decIdx]; 
     423      delete m_tVideoIOYuvReconFile[decIdx];
    551424      m_tVideoIOYuvReconFile[decIdx] = NULL ;
    552425    }
     
    554427    if( m_tDecTop[decIdx] )
    555428    {
     429#if !NH_MV
    556430      m_tDecTop[decIdx]->deletePicBuffer();
     431#endif
    557432      m_tDecTop[decIdx]->destroy() ;
    558433    }
    559     delete m_tDecTop[decIdx] ; 
     434    delete m_tDecTop[decIdx] ;
    560435    m_tDecTop[decIdx] = NULL ;
    561436  }
     
    571446#if NH_3D
    572447  m_cCamParsCollector.uninit();
    573   if( m_pScaleOffsetFile ) 
    574   { 
    575     ::fclose( m_pScaleOffsetFile ); 
     448  if( m_pScaleOffsetFile )
     449  {
     450    ::fclose( m_pScaleOffsetFile );
    576451  }
    577452#endif
     
    584459  m_cCamParsCollector.setCodeScaleOffsetFile( m_pScaleOffsetFile );
    585460#endif
    586 #if !NH_MV
     461#if NH_MV
     462  m_dpb.setPrintPicOutput(m_printPicOutput);
     463#else
    587464  // initialize decoder class
    588465  m_cTDecTop.init();
     
    599476}
    600477
     478
     479#if !NH_MV
    601480/** \param pcListPic list of pictures to be written to file
    602481    \param tId       temporal sub-layer ID
    603482 */
    604 #if NH_MV
    605 Void TAppDecTop::xWriteOutput( TComList<TComPic*>* pcListPic, Int decIdx, Int tId )
    606 #else
    607483Void TAppDecTop::xWriteOutput( TComList<TComPic*>* pcListPic, UInt tId )
    608 #endif
    609484{
    610485  if (pcListPic->empty())
     
    625500  {
    626501    numReorderPicsHighestTid = activeSPS->getNumReorderPics(maxNrSublayers-1);
    627     maxDecPicBufferingHighestTid =  activeSPS->getMaxDecPicBuffering(maxNrSublayers-1); 
     502    maxDecPicBufferingHighestTid =  activeSPS->getMaxDecPicBuffering(maxNrSublayers-1);
    628503  }
    629504  else
    630505  {
    631506    numReorderPicsHighestTid = activeSPS->getNumReorderPics(m_iMaxTemporalLayer);
    632     maxDecPicBufferingHighestTid = activeSPS->getMaxDecPicBuffering(m_iMaxTemporalLayer); 
     507    maxDecPicBufferingHighestTid = activeSPS->getMaxDecPicBuffering(m_iMaxTemporalLayer);
    633508  }
    634509
     
    636511  {
    637512    TComPic* pcPic = *(iterPic);
    638 #if NH_MV
    639     if(pcPic->getOutputMark() && pcPic->getPOC() > m_pocLastDisplay[decIdx])
    640 #else
    641513    if(pcPic->getOutputMark() && pcPic->getPOC() > m_iPOCLastDisplay)
    642 #endif
    643514    {
    644515       numPicsNotYetDisplayed++;
     
    671542      TComPic* pcPicBottom = *(iterPic);
    672543
    673 #if NH_MV
    674       if ( pcPicTop->getOutputMark() && pcPicBottom->getOutputMark() &&
    675         (numPicsNotYetDisplayed >  numReorderPicsHighestTid || dpbFullness > maxDecPicBufferingHighestTid) &&
    676         (!(pcPicTop->getPOC()%2) && pcPicBottom->getPOC() == pcPicTop->getPOC()+1) &&
    677         (pcPicTop->getPOC() == m_pocLastDisplay[decIdx]+1 || m_pocLastDisplay[decIdx] < 0))
    678 #else
    679544      if ( pcPicTop->getOutputMark() && pcPicBottom->getOutputMark() &&
    680545          (numPicsNotYetDisplayed >  numReorderPicsHighestTid || dpbFullness > maxDecPicBufferingHighestTid) &&
    681546          (!(pcPicTop->getPOC()%2) && pcPicBottom->getPOC() == pcPicTop->getPOC()+1) &&
    682547          (pcPicTop->getPOC() == m_iPOCLastDisplay+1 || m_iPOCLastDisplay < 0))
    683 #endif
    684548      {
    685549        // write to file
    686550        numPicsNotYetDisplayed = numPicsNotYetDisplayed-2;
    687 #if NH_MV
    688       if ( m_pchReconFiles[decIdx] )
    689 #else
    690551        if ( m_pchReconFile )
    691 #endif
    692552        {
    693553          const Window &conf = pcPicTop->getConformanceWindow();
     
    708568          if (display)
    709569          {
    710 #if NH_MV
    711         assert( conf   .getScaledFlag() );
    712         assert( defDisp.getScaledFlag() );
    713 #if ENC_DEC_TRACE
    714         g_bJustDoIt = true; 
    715         writeToTraceFile( "OutputPic Poc"   , pcPic->getPOC    (), g_decTracePicOutput  );
    716         writeToTraceFile( "OutputPic LayerId", pcPic->getLayerId(), g_decTracePicOutput );         
    717         g_bJustDoIt = false; 
    718 #endif
    719         m_tVideoIOYuvReconFile[decIdx]->write( pcPicTop->getPicYuvRec(), pcPicBottom->getPicYuvRec(),
    720 #else
    721570        m_cTVideoIOYuvReconFile.write( pcPicTop->getPicYuvRec(), pcPicBottom->getPicYuvRec(),
    722 #endif
    723571                                           m_outputColourSpaceConvert,
    724572                                           conf.getWindowLeftOffset() + defDisp.getWindowLeftOffset(),
    725573                                           conf.getWindowRightOffset() + defDisp.getWindowRightOffset(),
    726574                                           conf.getWindowTopOffset() + defDisp.getWindowTopOffset(),
    727 #if NH_3D
    728                                            conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset(), m_depth420OutputFlag && pcPicTop->getIsDepth() ? CHROMA_420 : NUM_CHROMA_FORMAT, isTff );
    729 #else
    730575                                           conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset(), NUM_CHROMA_FORMAT, isTff );
    731 #endif
    732576          }
    733577        }
    734578
    735579        // update POC of display order
    736 #if NH_MV
    737         m_pocLastDisplay[decIdx] = pcPic->getPOC();
    738 #else
    739580        m_iPOCLastDisplay = pcPicBottom->getPOC();
    740 #endif
    741581
    742582        // erase non-referenced picture in the reference picture list after display
     
    768608      pcPic = *(iterPic);
    769609
    770 #if NH_MV
    771       if(pcPic->getOutputMark() && pcPic->getPOC() > m_pocLastDisplay[decIdx] &&
    772         (numPicsNotYetDisplayed >  numReorderPicsHighestTid || dpbFullness > maxDecPicBufferingHighestTid))
    773 #else     
    774610      if(pcPic->getOutputMark() && pcPic->getPOC() > m_iPOCLastDisplay &&
    775611        (numPicsNotYetDisplayed >  numReorderPicsHighestTid || dpbFullness > maxDecPicBufferingHighestTid))
    776 #endif
    777612      {
    778613        // write to file
     
    782617          dpbFullness--;
    783618        }
    784 #if NH_MV
    785       if ( m_pchReconFiles[decIdx] )
    786 #else
    787619        if ( m_pchReconFile )
    788 #endif
    789620        {
    790621          const Window &conf    = pcPic->getConformanceWindow();
    791622          const Window defDisp = m_respectDefDispWindow ? pcPic->getDefDisplayWindow() : Window();
    792 #if NH_MV
    793         assert( conf   .getScaledFlag() );
    794         assert( defDisp.getScaledFlag() );
    795 #if ENC_DEC_TRACE
    796         g_bJustDoIt = true; 
    797         writeToTraceFile( "OutputPic Poc"   , pcPic->getPOC    (), g_decTracePicOutput  );
    798         writeToTraceFile( "OutputPic LayerId", pcPic->getLayerId(), g_decTracePicOutput );         
    799         g_bJustDoIt = false;
    800 #endif
    801         m_tVideoIOYuvReconFile[decIdx]->write( pcPic->getPicYuvRec(),
    802 #else
     623
    803624          m_cTVideoIOYuvReconFile.write( pcPic->getPicYuvRec(),
    804 #endif
    805625                                         m_outputColourSpaceConvert,
    806626                                         conf.getWindowLeftOffset() + defDisp.getWindowLeftOffset(),
    807627                                         conf.getWindowRightOffset() + defDisp.getWindowRightOffset(),
    808628                                         conf.getWindowTopOffset() + defDisp.getWindowTopOffset(),
    809                                          conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset(),
    810 #if NH_3D
    811                                           m_depth420OutputFlag && pcPic->getIsDepth() ? CHROMA_420 : NUM_CHROMA_FORMAT,
    812 #else
    813                                           NUM_CHROMA_FORMAT,
    814 #endif
    815            m_bClipOutputVideoToRec709Range   );
     629                                         conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset(),
     630                                         NUM_CHROMA_FORMAT, m_bClipOutputVideoToRec709Range  );
    816631        }
    817632
    818633        // update POC of display order
    819 #if NH_MV
    820         m_pocLastDisplay[decIdx] = pcPic->getPOC();
    821 #else
    822634        m_iPOCLastDisplay = pcPic->getPOC();
    823 #endif
    824635
    825636        // erase non-referenced picture in the reference picture list after display
     
    832643        }
    833644        pcPic->setOutputMark(false);
    834 #if NH_MV
    835         pcPic->setPicOutputFlag(false);
    836 #endif
    837645      }
    838646
     
    844652/** \param pcListPic list of pictures to be written to file
    845653 */
    846 #if NH_MV
    847 Void TAppDecTop::xFlushOutput( TComList<TComPic*>* pcListPic, Int decIdx )
    848 #else
    849654Void TAppDecTop::xFlushOutput( TComList<TComPic*>* pcListPic )
    850 #endif
    851655{
    852656  if(!pcListPic || pcListPic->empty())
     
    873677      {
    874678        // write to file
    875 #if NH_MV
    876       if ( m_pchReconFiles[decIdx] )
    877 #else
     679
    878680        if ( m_pchReconFile )
    879 #endif
    880681        {
    881682          const Window &conf = pcPicTop->getConformanceWindow();
    882683          const Window  defDisp = m_respectDefDispWindow ? pcPicTop->getDefDisplayWindow() : Window();
    883684          const Bool isTff = pcPicTop->isTopField();
    884 #if NH_MV
    885         assert( conf   .getScaledFlag() );
    886         assert( defDisp.getScaledFlag() );
    887 #if ENC_DEC_TRACE
    888         g_bJustDoIt = true; 
    889         writeToTraceFile( "OutputPic Poc"   , pcPic->getPOC    (), g_decTracePicOutput  );
    890         writeToTraceFile( "OutputPic LayerId", pcPic->getLayerId(), g_decTracePicOutput );         
    891         g_bJustDoIt = false; 
    892 #endif
    893         m_tVideoIOYuvReconFile[decIdx]->write( pcPicTop->getPicYuvRec(), pcPicBottom->getPicYuvRec(),
    894 #else
    895685          m_cTVideoIOYuvReconFile.write( pcPicTop->getPicYuvRec(), pcPicBottom->getPicYuvRec(),
    896 #endif
    897686                                         m_outputColourSpaceConvert,
    898687                                         conf.getWindowLeftOffset() + defDisp.getWindowLeftOffset(),
    899688                                         conf.getWindowRightOffset() + defDisp.getWindowRightOffset(),
    900689                                         conf.getWindowTopOffset() + defDisp.getWindowTopOffset(),
    901 #if NH_3D
    902                                          conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset(), m_depth420OutputFlag && pcPicTop->getIsDepth() ? CHROMA_420 : NUM_CHROMA_FORMAT, isTff );
    903 #else
    904690                                         conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset(), NUM_CHROMA_FORMAT, isTff );
    905 #endif
    906691        }
    907692
    908693        // update POC of display order
    909 #if NH_MV
    910       m_pocLastDisplay[decIdx] = pcPic->getPOC();
    911 #else
    912694        m_iPOCLastDisplay = pcPicBottom->getPOC();
    913 #endif       
     695
    914696        // erase non-referenced picture in the reference picture list after display
    915697        if ( !pcPicTop->getSlice(0)->isReferenced() && pcPicTop->getReconMark() == true )
     
    954736      {
    955737        // write to file
    956 #if NH_MV
    957       if ( m_pchReconFiles[decIdx] )
    958 #else
    959738        if ( m_pchReconFile )
    960 #endif
    961739        {
    962740          const Window &conf    = pcPic->getConformanceWindow();
    963741          const Window  defDisp = m_respectDefDispWindow ? pcPic->getDefDisplayWindow() : Window();
    964 #if NH_MV
    965         assert( conf   .getScaledFlag() );
    966         assert( defDisp.getScaledFlag() );
    967 #if ENC_DEC_TRACE
    968         g_bJustDoIt = true; 
    969         writeToTraceFile( "OutputPic Poc"   , pcPic->getPOC    (), g_decTracePicOutput  );
    970         writeToTraceFile( "OutputPic LayerId", pcPic->getLayerId(), g_decTracePicOutput );         
    971         g_bJustDoIt = false; 
    972 #endif
    973         m_tVideoIOYuvReconFile[decIdx]->write( pcPic->getPicYuvRec(),
    974 #else
    975742          m_cTVideoIOYuvReconFile.write( pcPic->getPicYuvRec(),
    976 #endif
    977743                                         m_outputColourSpaceConvert,
    978744                                         conf.getWindowLeftOffset() + defDisp.getWindowLeftOffset(),
    979745                                         conf.getWindowRightOffset() + defDisp.getWindowRightOffset(),
    980746                                         conf.getWindowTopOffset() + defDisp.getWindowTopOffset(),
    981                                          conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset(),
    982 #if NH_3D
    983                                          m_depth420OutputFlag && pcPic->getIsDepth() ? CHROMA_420 : NUM_CHROMA_FORMAT
    984 #else
    985                                          NUM_CHROMA_FORMAT
    986 #endif
    987                                          , m_bClipOutputVideoToRec709Range);
     747                                         conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset(),
     748                                         NUM_CHROMA_FORMAT, m_bClipOutputVideoToRec709Range );
    988749        }
    989750
    990751        // update POC of display order
    991 #if NH_MV
    992       m_pocLastDisplay[decIdx] = pcPic->getPOC();
    993 #else
    994752        m_iPOCLastDisplay = pcPic->getPOC();
    995 #endif
    996 
    997753        // erase non-referenced picture in the reference picture list after display
    998754        if ( !pcPic->getSlice(0)->isReferenced() && pcPic->getReconMark() == true )
     
    1004760        }
    1005761        pcPic->setOutputMark(false);
    1006 #if NH_MV
    1007         pcPic->setPicOutputFlag(false);
    1008 #endif
    1009       }
    1010 #if !NH_MV
     762      }
    1011763      if(pcPic != NULL)
    1012764      {
     
    1015767        pcPic = NULL;
    1016768      }
    1017 #endif
    1018769      iterPic++;
    1019770    }
    1020771  }
    1021 #if NH_MV
    1022   m_pocLastDisplay[decIdx] = -MAX_INT;
    1023 #else
    1024772  pcListPic->clear();
    1025773  m_iPOCLastDisplay = -MAX_INT;
     774}
    1026775#endif
    1027 }
    1028 
    1029776/** \param nalu Input nalu to check whether its LayerId is within targetDecLayerIdSet
    1030777 */
     778#if NH_MV
     779Bool TAppDecTop::xIsNaluInTargetDecLayerIdSet( InputNALUnit* nalu )
     780#else
    1031781Bool TAppDecTop::isNaluWithinTargetDecLayerIdSet( InputNALUnit* nalu )
     782#endif
    1032783{
    1033784  if ( m_targetDecLayerIdSet.size() == 0 ) // By default, the set is empty, meaning all LayerIds are allowed
     
    1037788  for (std::vector<Int>::iterator it = m_targetDecLayerIdSet.begin(); it != m_targetDecLayerIdSet.end(); it++)
    1038789  {
     790    if ( nalu->m_nuhLayerId == (*it) )
     791    {
     792      return true;
     793    }
     794  }
     795  return false;
     796}
     797
    1039798#if NH_MV
    1040     if ( nalu->m_nuhLayerId == (*it) )
    1041 #else
    1042     if ( nalu->m_nuhLayerId == (*it) )
     799
     800Bool TAppDecTop::xExtractAndRewrite( InputNALUnit* nalu )
     801{
     802  Bool naluInSubStream;
     803  if ( !m_initilizedFromVPS )
     804  {
     805    naluInSubStream = true; // No active VPS yet. Wait for slice activating one.
     806  }
     807  else
     808  {
     809    if ( m_decProcCvsg == CLAUSE_8 )
     810    {
     811      // 8.1.2->clause 10
     812
     813      // sub-bitstream extraction process as specified in clause 10
     814      naluInSubStream = true;
     815      if ( nalu->m_temporalId > m_highestTid || !xIsNaluInTargetDecLayerIdSet(nalu) )
     816      {
     817        naluInSubStream = false;
     818      }
     819    }
     820    else
     821    {
     822      // F.8.1.2
     823      Int targetDecLayerSetIdx = m_vps->olsIdxToLsIdx( m_targetOptLayerSetIdx );
     824      if ( targetDecLayerSetIdx <= m_vps->getVpsNumLayerSetsMinus1() && m_vps->getVpsBaseLayerInternalFlag() )
     825      {
     826        // - If TargetDecLayerSetIdx is less than or equal to vps_num_layer_sets_minus1 and
     827        //   vps_base_layer_internal_flag is equal to 1, the following applies:
     828        //   - The sub-bitstream extraction process as specified in clause 10 is applied with the CVSG, HighestTid and
     829        //     TargetDecLayerIdList as inputs, and the output is assigned to a bitstream referred to as BitstreamToDecode.
     830
     831        naluInSubStream = true;
     832        if ( nalu->m_temporalId > m_highestTid || !xIsNaluInTargetDecLayerIdSet(nalu) )
     833        {
     834          naluInSubStream = false;
     835        }
     836
     837      }
     838      else if ( targetDecLayerSetIdx <= m_vps->getVpsNumLayerSetsMinus1() && !m_vps->getVpsBaseLayerInternalFlag() )
     839      {
     840        // - Otherwise, if TargetDecLayerSetIdx is less than or equal to vps_num_layer_sets_minus1 and vps_base_layer_internal_flag
     841        //   is equal to 0, the following applies:
     842        //   - The sub-bitstream extraction process as specified in clause F.10.1 is applied with the CVSG, HighestTid and
     843        //     TargetDecLayerIdList as inputs, and the output is assigned to a bitstream referred to as BitstreamToDecode.
     844
     845        naluInSubStream = true;
     846        if ( nalu->m_temporalId > m_highestTid || !xIsNaluInTargetDecLayerIdSet(nalu) )
     847        {
     848          naluInSubStream = false;
     849        }
     850      }
     851      else if ( targetDecLayerSetIdx > m_vps->getVpsNumLayerSetsMinus1() && m_vps->getNumLayersInIdList( targetDecLayerSetIdx ) == 1 )
     852      {
     853        // - Otherwise, if TargetDecLayerSetIdx is greater than vps_num_layer_sets_minus1 and
     854        //   NumLayersInIdList[ TargetDecLayerSetIdx ] is equal to 1, the following applies:
     855        //   - The independent non-base layer rewriting process of clause F.10.2 is applied with the CVSG, HighestTid and
     856        //     TargetDecLayerIdList[ 0 ] as inputs, and the output is assigned to a bitstream referred to as BitstreamToDecode.
     857
     858        Int assingedBaseLayerId = m_targetDecLayerIdSet[0];
     859        naluInSubStream = true;
     860
     861        if ( nalu->m_nalUnitType != NAL_UNIT_SPS &&
     862          nalu->m_nalUnitType != NAL_UNIT_PPS &&
     863          nalu->m_nalUnitType != NAL_UNIT_EOB &&
     864          nalu->m_nuhLayerId != assingedBaseLayerId )
     865        {
     866          naluInSubStream = false;
     867        }
     868
     869        if ( ( nalu->m_nalUnitType == NAL_UNIT_SPS || nalu->m_nalUnitType != NAL_UNIT_PPS ) &&
     870          !( nalu->m_nuhLayerId == 0 || nalu->m_nuhLayerId == assingedBaseLayerId ) )
     871        {
     872          naluInSubStream = false;
     873        }
     874
     875        if ( nalu->m_nalUnitType == NAL_UNIT_VPS )
     876        {
     877          naluInSubStream = false;
     878        }
     879
     880        if ( nalu->m_temporalId > m_highestTid )
     881        {
     882          naluInSubStream = false;
     883        }
     884               
     885        // For now, don't do the layer id change here, but change smallest layer id.
     886        // To be verified.         
     887        //if ( naluInSubStream )
     888        //{
     889        //  nalu->m_nuhLayerId = 0;
     890        //}
     891      }
     892      else
     893      {
     894        // - Otherwise, the following applies:
     895        //   - The sub-bitstream extraction process as specified in clause F.10.3 is applied with the CVSG, HighestTid and
     896        //     TargetDecLayerIdList as inputs, and the output is assigned to a bitstream referred to as BitstreamToDecode.
     897
     898        naluInSubStream = true;
     899
     900        if ( nalu->m_nalUnitType != NAL_UNIT_VPS &&
     901          nalu->m_nalUnitType != NAL_UNIT_SPS &&
     902          nalu->m_nalUnitType != NAL_UNIT_PPS &&
     903          nalu->m_nalUnitType != NAL_UNIT_EOS &&
     904          nalu->m_nalUnitType != NAL_UNIT_EOB &&
     905          !xIsNaluInTargetDecLayerIdSet(nalu) )
     906        {
     907          naluInSubStream = false;
     908        }
     909
     910        if ( ( nalu->m_nalUnitType == NAL_UNIT_VPS ||
     911          nalu->m_nalUnitType == NAL_UNIT_SPS ||
     912          nalu->m_nalUnitType == NAL_UNIT_PPS ||
     913          nalu->m_nalUnitType == NAL_UNIT_EOS    ) &&
     914          !( nalu->m_nuhLayerId == 0 || xIsNaluInTargetDecLayerIdSet(nalu) )
     915          )
     916        {
     917          naluInSubStream = false;
     918        }
     919
     920        if ( nalu->m_temporalId > m_highestTid )
     921        {
     922          naluInSubStream = false;
     923        }
     924        // TBD: vps_base_layer_available_flag in each VPS is set equal to 0.
     925      }
     926    }
     927  }
     928
     929  return naluInSubStream;
     930}
     931
     932Void TAppDecTop::xProcessVclNalu( InputNALUnit nalu )
     933{
     934  TDecTop* dec  = xGetDecoder( nalu );
     935
     936  // Decode slice header of slice of current or new picture.
     937  dec->decodeSliceHeader( nalu );
     938
     939  // Check if slice belongs to current or new picture
     940  Bool sliceIsFirstOfNewPicture = dec->getFirstSliceSegementInPicFlag();
     941
     942  if ( !xIsSkipVclNalu( nalu, sliceIsFirstOfNewPicture ) )
     943  {
     944    if ( sliceIsFirstOfNewPicture )
     945    {
     946      xDetectNewPocResettingPeriod( nalu );
     947      Bool sliceIsFirstOfNewAU = xDetectNewAu( nalu );
     948      xFinalizePreviousPictures ( sliceIsFirstOfNewAU );
     949      xDecodeFirstSliceOfPicture( nalu, sliceIsFirstOfNewAU );
     950    }
     951    else
     952    {
     953      xDecodeFollowSliceOfPicture( nalu );
     954    }
     955  }
     956}
     957
     958Bool TAppDecTop::xIsSkipVclNalu( InputNALUnit& nalu, Bool isFirstSliceOfPic )
     959{
     960
     961  TDecTop* dec = xGetDecoder( nalu );
     962
     963  m_handleCraAsBlaFlagSetByExtMeans = false;
     964  Bool skipNalu = false;
     965
     966  if ( isFirstSliceOfPic )
     967  {
     968    m_totalNumofPicsReceived++;
     969  }
     970
     971  if (!m_cvsStartFound )
     972  {
     973    // Skip as specified by decoder option. (Not normative!)
     974    if ( m_totalNumofPicsReceived <= m_iSkipFrame )
     975    {
     976      skipNalu = true;
     977      if ( isFirstSliceOfPic )
     978      {
     979        std::cout << "Layer " << std::setfill(' ') << std::setw(2) << nalu.m_nuhLayerId
     980          << "   POC    ? Skipping picture." << std::setw(5) << m_totalNumofPicsReceived - 1 << std::endl;
     981      }
     982    }
     983    else
     984    {     
     985      if ( dec->getIsInOwnTargetDecLayerIdList() )
     986      {
     987        // Search for initial IRAP access unit
     988        Bool canBeSliceOfInitialIrapAu = nalu.isIrap() && ( dec->decProcClause8() || nalu.m_nuhLayerId == dec->getSmallestLayerId() );
     989
     990        if ( !canBeSliceOfInitialIrapAu )
     991        {
     992          skipNalu = true;
     993          if ( isFirstSliceOfPic )
     994          {
     995            std::cout << "Layer " << std::setfill(' ') << std::setw(2) << nalu.m_nuhLayerId
     996              << "   POC    ? Not an initial IRAP AU. Skipping picture." << std::setw(5) << m_totalNumofPicsReceived - 1 << std::endl;
     997          }
     998        }
     999        else
     1000        {
     1001          m_cvsStartFound = true;
     1002          if( nalu.isCra() )
     1003          {
     1004            // Ensure that NoRaslOutputFlag of picture is equal to 1.
     1005            m_handleCraAsBlaFlagSetByExtMeans = true;
     1006            m_handleCraAsBlaFlag = true;
     1007          }
     1008        }
     1009      }
     1010      else
     1011      {
     1012        skipNalu = true;
     1013      }
     1014    }
     1015  }
     1016  else
     1017  {
     1018    assert( dec->getIsInOwnTargetDecLayerIdList() );
     1019  }
     1020  return skipNalu;
     1021}
     1022
     1023Void TAppDecTop::xProcessNonVclNalu( InputNALUnit nalu )
     1024{
     1025  xGetDecoder(nalu)->decodeNonVclNalu( nalu );
     1026
     1027  if (  nalu.m_nalUnitType == NAL_UNIT_EOS )
     1028  {
     1029    m_eosInLayer[ nalu.m_nuhLayerId ] = true;
     1030  }
     1031}
     1032Void TAppDecTop::xTerminateDecoding()
     1033{
     1034    xFinalizePic( true );
     1035    xFinalizeAU ( );
     1036
     1037#if NH_3D
     1038  if( m_cCamParsCollector.isInitialized() )
     1039  {
     1040    m_cCamParsCollector.setSlice( 0 );
     1041  }
    10431042#endif
    1044     {
    1045       return true;
    1046     }
    1047   }
    1048   return false;
    1049 }
    1050 
    1051 #if NH_MV
     1043   xFlushOutput();
     1044   m_dpb.emptyAllSubDpbs();
     1045}
     1046
     1047
     1048//////////////////////////////
     1049/// Process slices
     1050//////////////////////////////
     1051
     1052Void TAppDecTop::xDecodeFirstSliceOfPicture( InputNALUnit nalu, Bool sliceIsFirstOfNewAu )
     1053{
     1054  TDecTop* dec = xGetDecoder(nalu);
     1055  // Initialize from VPS of first slice
     1056
     1057  // Get current SPS and PPS
     1058  TComSlice* slicePilot = dec->getSlicePilot();
     1059  m_vps = slicePilot->getVPS();
     1060  m_sps = slicePilot->getSPS();
     1061  m_pps = slicePilot->getPPS();
     1062
     1063  /// Use VPS activated by the first slice to initialized decoding
     1064  if( !m_initilizedFromVPS )
     1065  {
     1066    xF811GeneralDecProc( nalu );
     1067    m_initilizedFromVPS = true;
     1068    m_newVpsActivatedbyCurAu  = true; //TBD
     1069    m_newVpsActivatedbyCurPic = true;
     1070#if NH_3D
     1071    m_dpb.setVPS( m_vps );
     1072#endif
     1073  }
     1074
     1075  // Create new sub-DBP if not existing
     1076  m_dpb.getSubDpb( nalu.m_nuhLayerId, true );
     1077
     1078  // Create a new picture initialize and make it the current picture
     1079  assert( m_curPic == NULL );
     1080  m_curPic = new TComPic;
     1081
     1082  m_curPic->create(*m_sps, *m_pps, true);
     1083
     1084  m_curPic->setLayerId                      ( nalu.m_nuhLayerId );
     1085  m_curPic->setDecodingOrder                ( m_decodingOrder[ nalu.m_nuhLayerId ]);
     1086  m_curPic->setIsFstPicOfAllLayOfPocResetPer( m_newPicIsFstPicOfAllLayOfPocResetPer );
     1087  m_curPic->setIsPocResettingPic            ( m_newPicIsPocResettingPic );
     1088  m_curPic->setActivatesNewVps              ( m_newVpsActivatedbyCurPic );
     1089
     1090  dec     ->activatePSsAndInitPicOrSlice( m_curPic );
     1091
     1092  m_decodingOrder[ nalu.m_nuhLayerId ]++;
     1093
     1094  // Insert pic to current AU
     1095  // ( There is also a "current AU in the DBP", however the DBP AU will include the current
     1096  //   picture only after it is inserted to the DBP )
     1097  m_curAu.addPic(  m_curPic, true );
     1098
     1099  // Invoke Claus 8 and Annex F decoding process for a picture (only parts before POC derivation ).
     1100  xPicDecoding( START_PIC, sliceIsFirstOfNewAu );
     1101
     1102  if (m_decProcCvsg == ANNEX_F )
     1103  {
     1104    // Do output before POC derivation
     1105    xF13522OutputAndRemOfPicsFromDpb( true );
     1106  }
     1107
     1108  // Decode POC and apply reference picture set
     1109  dec->setDecProcPocAndRps( m_decProcPocAndRps );
     1110  dec->decodePocAndRps( );
     1111
     1112  // Do output after POC and RPS derivation
     1113  if (m_decProcCvsg == CLAUSE_8 )
     1114  {
     1115    xC522OutputAndRemOfPicsFromDpb( );
     1116  }
     1117  else if (m_decProcCvsg == ANNEX_F )
     1118  {
     1119    xF13522OutputAndRemOfPicsFromDpb( false );
     1120  }
     1121  else
     1122  {
     1123    assert(false);
     1124  }
     1125
     1126  // Generate unavailable reference pictures
     1127  dec->genUnavailableRefPics( );
     1128
     1129  // decode first slice segment
     1130  dec->decodeSliceSegment( nalu );
     1131
     1132  m_firstSliceInBitstream = false;
     1133}
     1134
     1135Void TAppDecTop::xDecodeFollowSliceOfPicture( InputNALUnit nalu )
     1136{
     1137  // decode following segment
     1138    TDecTop* dec = xGetDecoder( nalu );
     1139    dec->activatePSsAndInitPicOrSlice( NULL );
     1140    dec->decodeSliceSegment          ( nalu );
     1141}
     1142
     1143Void TAppDecTop::xFinalizePreviousPictures( Bool sliceIsFirstOfNewAU )
     1144{
     1145  Bool curPicIsLastInAu = sliceIsFirstOfNewAU && (m_curPic != NULL);
     1146  // When slice belongs to new picture, finalize current picture.
     1147  if( m_curPic != NULL )
     1148  {
     1149    xFinalizePic( curPicIsLastInAu );
     1150
     1151    if (m_curPic->isIrap() )
     1152    {
     1153      m_noRaslOutputFlagAssocIrap[ m_curPic->getLayerId() ] = m_curPic->getNoRaslOutputFlag();
     1154    }
     1155
     1156    m_tDecTop[ xGetDecoderIdx( m_curPic->getLayerId() )]->finalizePic();
     1157    m_curPic->getPicYuvRec()->extendPicBorder();
     1158    m_newVpsActivatedbyCurPic = false;
     1159  }
     1160
     1161  // When slice belongs to new AU, finalize current AU.
     1162  if ( curPicIsLastInAu && !m_curAu.empty() )
     1163  {
     1164    xFinalizeAU( );
     1165    m_newVpsActivatedbyCurAu = false;
     1166    m_curAu.clear();
     1167  }
     1168  m_curPic = NULL;
     1169}
     1170
     1171
     1172Void TAppDecTop::xFinalizePic(Bool curPicIsLastInAu )
     1173{
     1174  if ( m_curPic != NULL )
     1175  {
     1176    m_tDecTop[ xGetDecoderIdx(m_curPic->getLayerId() ) ]->executeLoopFilters( ); // 8.7
     1177
     1178    // Invoke Claus 8 and F.8 decoding process for a picture (only parts after POC derivation )
     1179    xPicDecoding(FINALIZE_PIC, curPicIsLastInAu );
     1180
     1181    if( m_decProcCvsg == CLAUSE_8 )
     1182    {
     1183      xC523PicDecMarkAddBumpAndStor    ( );
     1184    }
     1185    else if ( m_decProcCvsg == ANNEX_F )
     1186    {
     1187      xF13523PicDecMarkAddBumpAndStor  ( curPicIsLastInAu );
     1188    }
     1189  }
     1190}
     1191
     1192Void TAppDecTop::xFinalizeAU()
     1193{
     1194#if NH_3D
     1195  if ( !m_curAu.empty())
     1196  {
     1197    for (TComList<TComPic*>::iterator it = m_curAu.begin(); it != m_curAu.end(); it++)
     1198    {
     1199      TComPic* pic = (*it);
     1200      if ( !pic->getHasGeneratedRefPics() )
     1201      {
     1202        pic->compressMotion(1);
     1203      }
     1204    }
     1205  }
     1206#endif
     1207}
     1208
     1209
     1210Void TAppDecTop::xF811GeneralDecProc( InputNALUnit nalu )
     1211{
     1212  ////////////////////////////////////////////////////////////////////////////////
     1213  // F.8.1 General decoding process
     1214  ////////////////////////////////////////////////////////////////////////////////
     1215
     1216  // The following applies at the beginning of decoding a CVSG, after activating the VPS RBSP that is active for
     1217  // the entire CVSG and before decoding any VCL NAL units of the CVSG:
     1218
     1219  if ( !m_vps->getVpsExtensionFlag() )
     1220  {
     1221    //-   If vps_extension( ) is not present in the active VPS or a decoding process specified in this annex is not in use,
     1222    //   clause 8.1.2 is invoked with the CVSG as input.
     1223    x812CvsgDecodingProcess( xGetDecoderIdx( nalu.m_nuhLayerId ) );
     1224    m_decProcCvsg = CLAUSE_8;
     1225  }
     1226  else
     1227  {
     1228    // - Otherwise (vps_extension( ) is present in the active VPS and a decoding process specified in this annex is in use),
     1229    xF812CvsgDecodingProcess( xGetDecoderIdx( nalu.m_nuhLayerId ) );
     1230    xF13521InitDpb();
     1231    m_decProcCvsg = ANNEX_F;
     1232  }
     1233
     1234  if ( m_printVpsInfo  && ( m_decProcCvsg == ANNEX_F ) )
     1235  {
     1236    m_vps->printScalabilityId();
     1237    m_vps->printLayerDependencies();
     1238    m_vps->printLayerSets();
     1239    m_vps->printPTL();
     1240  }
     1241}
     1242
     1243Void   TAppDecTop::xPicDecoding( DecProcPart curPart, Bool picPosInAuIndication )
     1244{
     1245  if ( m_decProcCvsg == CLAUSE_8 )
     1246  {
     1247    // F.8.1.1 -> 8.1.2 -> 8.1.3
     1248    x813decProcForCodPicWithLIdZero  ( curPart );
     1249  }
     1250  else if ( m_decProcCvsg == ANNEX_F )
     1251  {
     1252    if ( m_targetOptLayerSetIdx == 0  )
     1253    {
     1254      // F.8.1.1 -> F.8.1.2 -> 8.1.3
     1255      x813decProcForCodPicWithLIdZero  ( curPart );
     1256    }
     1257    else
     1258    {
     1259      // F.8.1.1 -> F.8.1.2 -> F.8.1.3
     1260      xF813ComDecProcForACodedPic( curPart, picPosInAuIndication );
     1261    }
     1262  }
     1263  else
     1264  {
     1265    assert( false );
     1266  }
     1267}
     1268
     1269Void TAppDecTop::x812CvsgDecodingProcess( Int decIdx )
     1270{
     1271  ///////////////////////////////////////////////////////////////////////////////////////
     1272  //  8.1.2 CVSG decoding process
     1273  ///////////////////////////////////////////////////////////////////////////////////////
     1274
     1275  // The layer identifier list TargetDecLayerIdList, which specifies the list of nuh_layer_id values,
     1276  // in increasing order of nuh_layer_id values, of the NAL units to be decoded, is specified as follows:
     1277
     1278  Bool externalMeansToSetTargetDecLayerIdList = !m_targetDecLayerIdSetFileEmpty;
     1279
     1280  if ( externalMeansToSetTargetDecLayerIdList )
     1281  {
     1282    // - If some external means, not specified in this Specification, is available to set TargetDecLayerIdList,
     1283    //   TargetDecLayerIdList is set by the external means.
     1284    assert( !m_targetDecLayerIdSet.empty() ); // Already done when parsing cfg ile
     1285  }
     1286  else
     1287  {
     1288    //-  Otherwise, TargetDecLayerIdList contains only one nuh_layer_id value that is equal to 0.
     1289    m_targetDecLayerIdSet.clear();
     1290    m_targetDecLayerIdSet.push_back( 0 );
     1291  }
     1292
     1293  // The variable HighestTid, which identifies the highest temporal sub-layer to be decoded, is specified as follows:
     1294  Bool externalMeansSetHighestTid = ( m_iMaxTemporalLayer != -1 );
     1295  if ( externalMeansSetHighestTid )
     1296  {
     1297    //- If some external means, not specified in this Specification, is available to set HighestTid,
     1298    //  HighestTid is set by the external means.
     1299    m_highestTid = m_iMaxTemporalLayer;
     1300  }
     1301  else
     1302  {
     1303    //-  Otherwise, HighestTid is set equal to sps_max_sub_layers_minus1.
     1304    m_highestTid = m_sps->getSpsMaxSubLayersMinus1();
     1305  }
     1306
     1307  //The variable SubPicHrdFlag is specified as follows:
     1308  //- If the decoding process is invoked in a bitstream conformance test as specified in clause C.1, SubPicHrdFlag is set as specified in clause C.1.
     1309  //- Otherwise, SubPicHrdFlag is set equal to ( SubPicHrdPreferredFlag  &&  sub_pic_hrd_params_present_flag ).
     1310
     1311  // The sub-bitstream extraction process as specified in clause 10 is applied with the CVSG, HighestTid and TargetDecLayerIdList as inputs, and the output is assigned to a bitstream referred to as BitstreamToDecode.
     1312}
     1313
     1314Void TAppDecTop::x813decProcForCodPicWithLIdZero( DecProcPart curPart )
     1315{
     1316  ////////////////////////////////////////////////////////////////////////////////
     1317  // 8.1.3 Decoding process for a coded picture with nuh_layer_id equal to 0.
     1318  ////////////////////////////////////////////////////////////////////////////////
     1319
     1320  if ( curPart == START_PIC )
     1321  {
     1322    Int nuhLayerId = m_curPic->getLayerId();
     1323
     1324    if ( ( m_curPic->isBla() && m_curPic->getSlice(0)->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_W_LP ) || m_curPic->isCra() )
     1325    {
     1326      // Not needed.
     1327      // When the current picture is a BLA picture that has nal_unit_type equal to BLA_W_LP or is a CRA picture, the following applies:
     1328      // -  If some external means not specified in this Specification is available to set the variable UseAltCpbParamsFlag to a value, UseAltCpbParamsFlag is set equal to the value provided by the external means.
     1329      // -  Otherwise, the value of UseAltCpbParamsFlag is set equal to 0.
     1330    }
     1331
     1332    if ( m_curPic->isIrap() )
     1333    {
     1334      // When the current picture is an IRAP picture, the following applies:
     1335      if ( m_curPic->isIdr() || m_curPic->isBla() || m_curPic->getDecodingOrder() == 0 || m_eosInLayer[ nuhLayerId ] )
     1336      {
     1337        // -  If the current picture is an IDR picture, a BLA picture, the first picture in the bitstream in decoding order,
     1338        //    or the first picture that follows an end of sequence NAL unit in decoding order, the variable NoRaslOutputFlag
     1339        //    is set equal to 1.
     1340
     1341        m_curPic->setNoRaslOutputFlag( true );
     1342      }
     1343      else if ( m_handleCraAsBlaFlagSetByExtMeans )
     1344      {
     1345        // -  Otherwise, if some external means not specified in this Specification is available to set the variable HandleCraAsBlaFlag
     1346        //    to a value for the current picture, the variable HandleCraAsBlaFlag is set equal to the value provided by
     1347        //    the external means and the variable NoRaslOutputFlag is set equal to HandleCraAsBlaFlag.
     1348
     1349        m_curPic->setNoRaslOutputFlag( m_handleCraAsBlaFlag );
     1350      }
     1351      else
     1352      {
     1353        // -  Otherwise, the variable HandleCraAsBlaFlag is set equal to 0 and the variable NoRaslOutputFlag is set equal to 0.
     1354        m_handleCraAsBlaFlag = false;
     1355        m_curPic->setNoRaslOutputFlag( false );
     1356      }
     1357    }
     1358
     1359    m_decProcPocAndRps = CLAUSE_8;
     1360  }
     1361  else if ( curPart == FINALIZE_PIC )
     1362  {
     1363    // -  PicOutputFlag is set as follows:
     1364    if (m_curPic->isRasl() && m_noRaslOutputFlagAssocIrap[ m_curPic->getLayerId() ] )
     1365    {
     1366      // -  If the current picture is a RASL picture and NoRaslOutputFlag of the associated IRAP picture is equal to 1,
     1367      //    PicOutputFlag is set equal to 0.
     1368      m_curPic->setPicOutputFlag( false );
     1369    }
     1370    else
     1371    {
     1372      // -  Otherwise, PicOutputFlag is set equal to pic_output_flag.
     1373      m_curPic->setPicOutputFlag( m_curPic->getSlice(0)->getPicOutputFlag() );
     1374    }
     1375
     1376    // 4.  After all slices of the current picture have been decoded, the decoded picture is marked as "used for short-term reference".
     1377    m_curPic->markAsUsedForShortTermReference();
     1378  }
     1379}
     1380
     1381// F.8.1.2
     1382Void TAppDecTop::xF812CvsgDecodingProcess( Int decIdx )
     1383{
     1384  ///////////////////////////////////////////////////////////////////////////////////////
     1385  //  F.8.1.2 CVSG decoding process
     1386 ///////////////////////////////////////////////////////////////////////////////////////
     1387
     1388  // The variable TargetOlsIdx, which specifies the index to the list of the OLSs
     1389  // specified by the VPS, of the target OLS, is specified as follows:
     1390
     1391
     1392  // If some external means, not specified in this Specification, is available to set
     1393  // TargetOlsIdx, TargetOlsIdx is set by the external means.
     1394
     1395  // For this decoder the TargetOlsIdx is always set by external means:
     1396  // When m_targetOptLayerSetIdx is equal to -1,  TargetOlsIdx is set to getVpsNumLayerSetsMinus1 (which has already been done in TDecTop, since needed there for parsing)
     1397  // Otherwise m_targetOptLayerSetIdx is used directly.
     1398
     1399  if ( m_targetOptLayerSetIdx == -1 )
     1400  {
     1401    m_targetOptLayerSetIdx = m_tDecTop[decIdx]->getTargetOlsIdx();
     1402  }
     1403  else
     1404  {
     1405    assert( m_tDecTop[decIdx]->getTargetOlsIdx() == m_targetOptLayerSetIdx );
     1406  }
     1407
     1408  m_targetDecLayerSetIdx = m_vps->olsIdxToLsIdx( m_targetOptLayerSetIdx );
     1409  m_targetDecLayerIdSet  = m_vps->getTargetDecLayerIdList( m_targetOptLayerSetIdx );
     1410
     1411
     1412  if ( m_targetOptLayerSetIdx < 0 || m_targetOptLayerSetIdx >= m_vps->getNumOutputLayerSets() )
     1413  {
     1414    fprintf(stderr, "\ntarget output layer set index must be in the range of 0 to %d, inclusive \n", m_vps->getNumOutputLayerSets() - 1 );
     1415    exit(EXIT_FAILURE);
     1416  }
     1417
     1418  if ( !m_vps->getVpsBaseLayerAvailableFlag() )
     1419  {
     1420    if(  m_targetDecLayerSetIdx < m_vps->getFirstAddLayerSetIdx() || m_targetDecLayerSetIdx > m_vps->getLastAddLayerSetIdx() )
     1421    {
     1422      // When vps_base_layer_available_flag is equal to 0, OlsIdxToLsIdx[ TargetOlsIdx ] shall be in the range of FirstAddLayerSetIdx to LastAddLayerSetIdx, inclusive.
     1423      fprintf(stderr, "\nvps_base_layer_available_flag is equal to 0, OlsIdxToLsIdx[ TargetOlsIdx ] shall be in the range of %d to %d, inclusive \n", m_vps->getFirstAddLayerSetIdx(), m_vps->getLastAddLayerSetIdx() );
     1424      exit(EXIT_FAILURE);
     1425    }
     1426  }
     1427
     1428  if ( !m_vps->getVpsBaseLayerInternalFlag() && m_targetOptLayerSetIdx <= 0 )
     1429  {
     1430    // When vps_base_layer_internal_flag is equal to 0, TargetOlsIdx shall be greater than 0.
     1431    fprintf(stderr, "\nvps_base_layer_internal_flag is equal to 0, TargetOlsIdx shall be greater than 0.\n" );
     1432    exit(EXIT_FAILURE);
     1433  }
     1434
     1435  // The variable HighestTid, which identifies the highest temporal sub-layer to be decoded,
     1436  // is specified as follows:
     1437
     1438  Bool externalMeansSetHighestTid = ( m_iMaxTemporalLayer != -1 );
     1439  if ( externalMeansSetHighestTid )
     1440  {
     1441    m_highestTid = m_iMaxTemporalLayer;
     1442  }
     1443  else
     1444  {
     1445    m_highestTid = m_sps->getSpsMaxSubLayersMinus1();
     1446  }
     1447
     1448  // The variable SubPicHrdPreferredFlag is either specified by external means, or when not specified by external means, set equal to 0.
     1449  // The variable SubPicHrdFlag is specified as follows:
     1450  // -  If the decoding process is invoked in a bitstream conformance test as specified in clause F.13.1, SubPicHrdFlag is set as specified in clause F.13.1.
     1451  // -  Otherwise, SubPicHrdFlag is set equal to ( SubPicHrdPreferredFlag  &&  sub_pic_hrd_params_present_flag ), where sub_pic_hrd_params_present_flag is found in any hrd_parameters( ) syntax structure that applies to at least one bitstream partition of the output layer set idenified by TargetOlsIdx.
     1452  // -  TBD in case that needed some when.
     1453
     1454  // A bitstream to be decoded, BitstreamToDecode, is specified as follows:
     1455  //   - Extraction is done in xExtractAndRewrite();
     1456
     1457  //   - SmallestLayerId is already derived in  TDecTop:: initFromActiveVps, since required for SH parsing.
     1458  m_smallestLayerId = m_tDecTop[decIdx]->getSmallestLayerId();
     1459
     1460  // When vps_base_layer_internal_flag is equal to 0, vps_base_layer_available_flag is equal to 1,
     1461  // and TargetDecLayerSetIdx is in the range of 0 to vps_num_layer_sets_minus1, inclusive,
     1462  // the following applies:
     1463  if ( !m_vps->getVpsBaseLayerInternalFlag() && m_vps->getVpsBaseLayerAvailableFlag() &&
     1464       ( m_targetDecLayerSetIdx >= 0 && m_targetDecLayerSetIdx <= m_vps->getVpsNumLayerSetsMinus1() ) )
     1465  {
     1466
     1467    // TBD: The size of the sub-DPB for the layer with nuh_layer_id equal to 0 is set equal to 1.
     1468
     1469    // TBD: The values of pic_width_in_luma_samples, pic_height_in_luma_samples, chroma_format_idc,
     1470    // separate_colour_plane_flag, bit_depth_luma_minus8, bit_depth_chroma_minus8, conf_win_left_offset,
     1471    // conf_win_right_offset, conf_win_top_offset, and conf_win_bottom_offset for decoded pictures
     1472    // with nuh_layer_id equal to 0 are set equal to the values of pic_width_vps_in_luma_samples,
     1473    // pic_height_vps_in_luma_samples, chroma_format_vps_idc, separate_colour_plane_vps_flag,
     1474    // bit_depth_vps_luma_minus8, bit_depth_vps_chroma_minus8, conf_win_vps_left_offset,
     1475    // conf_win_vps_right_offset, conf_win_vps_top_offset, and conf_win_vps_bottom_offset respectively,
     1476    // of the vps_rep_format_idx[ 0 ]-th rep_format( ) syntax structure in the active VPS.
     1477
     1478    // The variable BaseLayerOutputFlag is set equal to ( TargetOptLayerIdList[ 0 ]  = =  0 ).
     1479
     1480    m_baseLayerOutputFlag = ( m_vps->getTargetOptLayerIdList( m_targetOptLayerSetIdx )[ 0 ] == 0 );
     1481
     1482    // NOTE - The BaseLayerOutputFlag for each access unit is to be sent by an external means to
     1483    // the base layer decoder for controlling the output of base layer decoded pictures.
     1484    // BaseLayerOutputFlag equal to 1 indicates that the base layer is an output layer.
     1485    // BaseLayerOutputFlag equal to 0 indicates that the base layer is not an output layer.
     1486
     1487    // The variable LayerInitializedFlag[ i ] is set equal to 0 for all values of i from 0
     1488    // to vps_max_layer_id, inclusive, and the variable FirstPicInLayerDecodedFlag[ i ] is set
     1489    // equal to 0 for all values of i from 0 to vps_max_layer_id, inclusive.
     1490
     1491    for (Int i = 0; i <= m_vps->getVpsMaxLayerId(); i++ )
     1492    {
     1493      m_layerInitilizedFlag       [ i ] = false;
     1494      m_firstPicInLayerDecodedFlag[ i ] = false;
     1495    }
     1496  }
     1497}
     1498
     1499Void TAppDecTop::xC522OutputAndRemOfPicsFromDpb( )
     1500{
     1501  ////////////////////////////////////////////////////////////////////////////////
     1502  // C.5.2.2 Output and removal of pictures from the DPB
     1503  ////////////////////////////////////////////////////////////////////////////////
     1504
     1505//  The output and removal of pictures from the DPB before the decoding of the current picture
     1506//  (but after parsing the slice header of the first slice of the current picture) happens instantaneously
     1507//  when the first decoding unit of the access unit containing the current picture is removed from the CPB and proceeds as follows:
     1508//  - The decoding process for RPS as specified in clause 8.3.2 is invoked.
     1509
     1510  Int nuhLayerId = m_curPic->getLayerId();
     1511  const TComSPS* sps = m_curPic->getSlice(0)->getSPS();
     1512  assert( nuhLayerId == 0 );
     1513
     1514  if( ( m_curPic->isIrap() && m_curPic->getNoRaslOutputFlag() == 1) && m_curPic->getDecodingOrder() != 0 )
     1515  {
     1516    // - If the current picture is an IRAP picture with NoRaslOutputFlag equal to 1 that is not picture 0,
     1517    //   the following ordered steps are applied:
     1518
     1519    // 1.  The variable NoOutputOfPriorPicsFlag is derived for the decoder under test as follows:
     1520    Int noOutputOfPriorPicsFlag;
     1521    if( m_curPic->isCra() )
     1522    {
     1523      //-  If the current picture is a CRA picture, NoOutputOfPriorPicsFlag is set equal to 1
     1524      // (regardless of the value of no_output_of_prior_pics_flag).
     1525      noOutputOfPriorPicsFlag = true;
     1526    }
     1527    else if ( 0  )
     1528    {
     1529      // TBD
     1530      //- Otherwise, if the value of pic_width_in_luma_samples, pic_height_in_luma_samples, chroma_format_idc,
     1531      //  separate_colour_plane_flag, bit_depth_luma_minus8, bit_depth_chroma_minus8 or sps_max_dec_pic_buffering_minus1[ HighestTid ]
     1532      //  derived from the active SPS is different from the value of pic_width_in_luma_samples, pic_height_in_luma_samples,
     1533      //  chroma_format_idc, separate_colour_plane_flag, bit_depth_luma_minus8, bit_depth_chroma_minus8 or
     1534      //  sps_max_dec_pic_buffering_minus1[ HighestTid ], respectively, derived from the SPS active for the preceding picture,
     1535      //  NoOutputOfPriorPicsFlag may (but should not) be set to 1 by the decoder under test,
     1536      //  regardless of the value of no_output_of_prior_pics_flag.
     1537      //     NOTE - Although setting NoOutputOfPriorPicsFlag equal to no_output_of_prior_pics_flag is preferred under these conditions,
     1538      //            the decoder under test is allowed to set NoOutputOfPriorPicsFlag to 1 in this case.
     1539    }
     1540    else
     1541    {
     1542      noOutputOfPriorPicsFlag = m_curPic->getSlice(0)->getNoOutputPriorPicsFlag();
     1543    }
     1544    //  2.  The value of NoOutputOfPriorPicsFlag derived for the decoder under test is applied for the HRD as follows:
     1545    if (noOutputOfPriorPicsFlag)
     1546    {
     1547      //-  If NoOutputOfPriorPicsFlag is equal to 1, all picture storage buffers in the DPB are emptied
     1548      //   without output of the pictures they contain and the DPB fullness is set equal to 0.
     1549      m_dpb.emptySubDpb( nuhLayerId );
     1550    }
     1551    else if (!noOutputOfPriorPicsFlag)
     1552    {
     1553      //  -  Otherwise (NoOutputOfPriorPicsFlag is equal to 0), all picture storage buffers containing a picture that
     1554      //     is marked as "not needed for output" and "unused for reference" are emptied (without output) and all non-empty
     1555      //     picture storage buffers in the DPB are emptied by repeatedly invoking the "bumping" process specified in clause C.5.2.4
     1556      //     and the DPB fullness is set equal to 0.
     1557
     1558      m_dpb.emptySubDpbNotNeedForOutputAndUnusedForRef( nuhLayerId );
     1559      while( m_dpb.getSubDpb( nuhLayerId, false  )->size() != 0 )
     1560      {
     1561        xC524Bumping();
     1562      }
     1563    }
     1564  }
     1565  else if ( !( m_curPic->isIrap() && m_curPic->getNoRaslOutputFlag() == 0 ) )
     1566  {
     1567    //  -  Otherwise (the current picture is not an IRAP picture with NoRaslOutputFlag equal to 1),
     1568    //     all picture storage buffers containing a picture which are marked as "not needed for output" and "unused for reference"
     1569    //     are emptied (without output). For each picture storage buffer that is emptied, the DPB fullness is decremented by one.
     1570
     1571    m_dpb.emptySubDpbNotNeedForOutputAndUnusedForRef( nuhLayerId );
     1572
     1573    Bool repeat = true;
     1574
     1575    while( repeat )
     1576    {
     1577      TComSubDpb* dpb = m_dpb.getSubDpb( nuhLayerId, false );
     1578      TComList<TComPic*> picsMarkedForOutput = dpb->getPicsMarkedNeedForOutput();
     1579      // When one or more of the following conditions are true, the "bumping" process specified in clause C.5.2.4
     1580      // is invoked repeatedly while further decrementing the DPB fullness by one for each additional picture storage buffer that
     1581      // is emptied, until none of the following conditions are true:
     1582
     1583      // -  The number of pictures in the DPB that are marked as "needed for output" is greater
     1584      //    than sps_max_num_reorder_pics[ HighestTid ].
     1585      Bool cond1 = ( picsMarkedForOutput.size() > sps->getSpsMaxNumReorderPics( m_highestTid ) );
     1586
     1587      //  -  sps_max_latency_increase_plus1[ HighestTid ] is not equal to 0 and there is at least one picture in the DPB
     1588      //     that is marked as "needed for output" for which the associated variable PicLatencyCount is greater than or equal
     1589      //     to SpsMaxLatencyPictures[ HighestTid ].
     1590      Bool anyPicWithGtOrEqLatencyCnt = false;
     1591      for (TComList<TComPic*>::iterator itP = picsMarkedForOutput.begin(); itP != picsMarkedForOutput.end() && !anyPicWithGtOrEqLatencyCnt; itP++ )
     1592      {
     1593        anyPicWithGtOrEqLatencyCnt = anyPicWithGtOrEqLatencyCnt || ( (*itP)->getPicLatencyCount() >= sps->getSpsMaxLatencyPictures( m_highestTid ));
     1594      }
     1595      Bool cond2 = ( sps->getSpsMaxLatencyIncreasePlus1( m_highestTid ) != 0 ) && anyPicWithGtOrEqLatencyCnt;
     1596
     1597      //  -  The number of pictures in the DPB is greater than or equal to sps_max_dec_pic_buffering_minus1[ HighestTid ] + 1.
     1598      Bool cond3 = ( dpb->size() >= ( sps->getSpsMaxDecPicBufferingMinus1( m_highestTid ) + 1 ));
     1599
     1600      if ( cond1 || cond2 || cond3 )
     1601      {
     1602        xC524Bumping();
     1603      }
     1604      else
     1605      {
     1606        repeat = false;
     1607      }
     1608    }
     1609  }
     1610}
     1611
     1612Void TAppDecTop::xC523PicDecMarkAddBumpAndStor()
     1613{
     1614  ///////////////////////////////////////////////////////////////////////////////////////
     1615  // C.5.2.3 Picture decoding, marking, additional bumping and storage 
     1616  ///////////////////////////////////////////////////////////////////////////////////////
     1617 
     1618  Int nuhLayerId = m_curPic->getLayerId();
     1619  const TComSPS* sps = m_curPic->getSlice(0)->getSPS();
     1620  // The processes specified in this clause happen instantaneously when the last decoding unit of access unit n containing the
     1621  // current picture is removed from the CPB.
     1622  if (m_curPic->getPicOutputFlag() )
     1623  {
     1624    // When the current picture has PicOutputFlag equal to 1, for each picture in the DPB that is marked as "needed for output"
     1625    // and follows the current picture in output order, the associated variable PicLatencyCount is set equal to PicLatencyCount + 1.
     1626    TComSubDpb* dpb = m_dpb.getSubDpb( nuhLayerId, false);
     1627
     1628    for (TComSubDpb::iterator itP = dpb->begin(); itP != dpb->end(); itP++)
     1629    {
     1630      TComPic* pic = (*itP);
     1631      if ( pic->getOutputMark() && pic->getPOC() > m_curPic->getPOC() )
     1632      {
     1633        pic->setPicLatencyCount( pic->getPicLatencyCount() + 1 );
     1634      }
     1635    }
     1636  }
     1637
     1638  // The current picture is considered as decoded after the last decoding unit of the picture is decoded.
     1639  // The current decoded picture is stored in an empty picture storage buffer in the DPB and the following applies:
     1640  m_dpb.addNewPic( m_curPic );
     1641
     1642
     1643  if (m_curPic->getPicOutputFlag())
     1644  {
     1645    // - If the current decoded picture has PicOutputFlag equal to 1, it is marked as "needed for output" and its associated
     1646    //   variable PicLatencyCount is set equal to 0.
     1647    m_curPic->setOutputMark( true );
     1648    m_curPic->setPicLatencyCount( 0 );
     1649  }
     1650  else if (!m_curPic->getPicOutputFlag() )
     1651  {
     1652    // - Otherwise (the current decoded picture has PicOutputFlag equal to 0), it is marked as "not needed for output".
     1653    m_curPic->setOutputMark( false );
     1654  }
     1655
     1656  // The current decoded picture is marked as "used for short-term reference".
     1657  m_curPic->markAsUsedForShortTermReference();
     1658
     1659  Bool repeat = true;
     1660
     1661  while( repeat )
     1662  {
     1663    TComSubDpb* dpb = m_dpb.getSubDpb( nuhLayerId, false );
     1664    TComList<TComPic*> picsMarkedForOutput = dpb->getPicsMarkedNeedForOutput();
     1665
     1666    // When one or more of the following conditions are true, the "bumping" process specified in clause C.5.2.4
     1667    // is invoked repeatedly until none of the following conditions are true:
     1668
     1669    // - The number of pictures in the DPB that are marked as "needed for output" is greater than sps_max_num_reorder_pics[ HighestTid ].
     1670    Bool cond1 = ( picsMarkedForOutput.size() > sps->getSpsMaxNumReorderPics( m_highestTid ) );
     1671
     1672    // - sps_max_latency_increase_plus1[ HighestTid ] is not equal to 0 and there is at least one picture in the DPB that is marked
     1673    //   as "needed for output" for which the associated variable PicLatencyCount that is greater than or equal to
     1674    //   SpsMaxLatencyPictures[ HighestTid ].
     1675    Bool anyPicWithGtOrEqLatencyCnt = false;
     1676    for (TComList<TComPic*>::iterator itP = picsMarkedForOutput.begin(); itP != picsMarkedForOutput.end() && !anyPicWithGtOrEqLatencyCnt; itP++ )
     1677    {
     1678      anyPicWithGtOrEqLatencyCnt = anyPicWithGtOrEqLatencyCnt || ( (*itP)->getPicLatencyCount() >= sps->getSpsMaxLatencyPictures( m_highestTid ));
     1679    }
     1680    Bool cond2 = ( sps->getSpsMaxLatencyIncreasePlus1( m_highestTid ) != 0 ) && anyPicWithGtOrEqLatencyCnt;
     1681
     1682    if ( cond1 || cond2 )
     1683    {
     1684      xC524Bumping();
     1685    }
     1686    else
     1687    {
     1688      repeat = false;
     1689    }
     1690  }
     1691}
     1692
     1693Void TAppDecTop::xC524Bumping( )
     1694{
     1695  ////////////////////////////////////////////////////////////////////////////////
     1696  // C.5.2.4 "Bumping" process
     1697  ////////////////////////////////////////////////////////////////////////////////
     1698
     1699  // The "bumping" process consists of the following ordered steps:
     1700
     1701  // 1.  The picture that is first for output is selected as the one having the smallest value of PicOrderCntVal of all pictures
     1702  //     in the DPB marked as "needed for output".
     1703  TComPic* pic = *(m_dpb.getSubDpb( 0, false)->getPicsMarkedNeedForOutput().begin()); // pics are sorted, so take first
     1704
     1705  // 2.  The picture is cropped, using the conformance cropping window specified in the active SPS for the picture,
     1706  //     the cropped picture is output, and the picture is marked as "not needed for output".
     1707  xCropAndOutput( pic );
     1708  pic->setOutputMark( false );
     1709
     1710  //3.  When the picture storage buffer that included the picture that was cropped and output contains a picture marked
     1711  //    as "unused for reference", the picture storage buffer is emptied.
     1712  if (pic->getMarkedUnUsedForReference() )
     1713  {
     1714    m_dpb.removePic( pic );
     1715  }
     1716
     1717  // NOTE - For any two pictures picA and picB that belong to the same CVS and are output by the "bumping process", when picA
     1718  //        is output earlier than picB, the value of PicOrderCntVal of picA is less than the value of PicOrderCntVal of picB.
     1719}
     1720
     1721
     1722Void TAppDecTop::xF813ComDecProcForACodedPic( DecProcPart curPart, Bool picPosInAuIndication )
     1723{
     1724  ////////////////////////////////////////////////////////////////////////////////
     1725  // F.8.1.3  Common decoding process for a coded picture
     1726  ////////////////////////////////////////////////////////////////////////////////
     1727
     1728  // PicPosInAuIndication is interpreted based on curPart.
     1729  // - If curPart is equal to START_PIC               , it indicates whether the current pic is the first in the current AU.
     1730  // - Otherwise (if curPart is equal to FINALIZE_PIC), it indicates whether the current pic is the last  in the current AU.
     1731
     1732  if (curPart == START_PIC )
     1733  {
     1734    Bool curPicIsFirstInAu = picPosInAuIndication;
     1735
     1736    Int nuhLayerId = m_curPic->getLayerId();
     1737
     1738    if ( !m_vps->getVpsBaseLayerInternalFlag() && m_vps->getVpsBaseLayerAvailableFlag() &&
     1739      ( m_targetDecLayerSetIdx >= 0 && m_targetDecLayerSetIdx <= m_vps->getVpsNumLayerSetsMinus1() ) &&
     1740      m_curPic->getSlice(0)->getTemporalId() <= m_vps->getSubLayersVpsMaxMinus1( 0 ) && curPicIsFirstInAu )
     1741    {
     1742      // When vps_base_layer_internal_flag is equal to 0, vps_base_layer_available_flag is equal to 1,
     1743      // TargetDecLayerSetIdx is in the range of 0 to vps_num_layer_sets_minus1, inclusive,
     1744      // TemporalId is less than or equal to sub_layers_vps_max_minus1[ 0 ], and the current picture
     1745      // is the first coded picture of an access unit, clause F.8.1.8 is invoked prior to decoding the current picture.
     1746
     1747      assert( false ); //TBD
     1748    }
     1749
     1750    //  When the current picture is an IRAP picture, the variable HandleCraAsBlaFlag is derived as specified in the following:
     1751    if ( m_curPic->isIrap() )
     1752    {
     1753      if ( m_handleCraAsBlaFlagSetByExtMeans )
     1754      {
     1755        // If some external means not specified in this Specification is available to set the variable HandleCraAsBlaFlag to
     1756        // a value for the current picture, the variable HandleCraAsBlaFlag is set equal to the value provided by the external means.
     1757      }
     1758      else
     1759      {
     1760        // - Otherwise, the variable HandleCraAsBlaFlag is set equal to 0.
     1761        m_handleCraAsBlaFlag = false;
     1762      }
     1763    }
     1764
     1765    if ( m_curPic->isIrap() && nuhLayerId == m_smallestLayerId )
     1766    {
     1767      // When the current picture is an IRAP picture and has nuh_layer_id equal to SmallestLayerId, the following applies:
     1768      // The variable NoClrasOutputFlag is specified as follows:
     1769
     1770      if( m_firstSliceInBitstream )
     1771      {
     1772        //  - If the current picture is the first picture in the bitstream, NoClrasOutputFlag is set equal to 1.
     1773        m_curPic->setNoClrasOutputFlag(true );
     1774      }
     1775      else if( m_eosInLayer[ 0 ] || m_eosInLayer[ nuhLayerId ] )
     1776      {
     1777        //  - Otherwise, if the current picture is included in the first access unit that follows an access unit
     1778        //    including an end of sequence NAL unit with nuh_layer_id equal to SmallestLayerId or 0 in decoding order,
     1779        //    NoClrasOutputFlag is set equal to 1.
     1780
     1781        m_curPic->setNoClrasOutputFlag(true );
     1782      }
     1783      else if ( m_curPic->isBla() || (m_curPic->isCra() && m_handleCraAsBlaFlag ))
     1784      {
     1785        //  - Otherwise, if the current picture is a BLA picture or a CRA picture with HandleCraAsBlaFlag equal to 1,
     1786        //    NoClrasOutputFlag is set equal to 1.
     1787        m_curPic->setNoClrasOutputFlag(true );
     1788      }
     1789      else if ( m_curPic->isIdr() && m_curPic->getSlice(0)->getCrossLayerBlaFlag() )
     1790      {
     1791        //  - Otherwise, if the current picture is an IDR picture with cross_layer_bla_flag is equal to 1,
     1792        //    NoClrasOutputFlag is set equal to 1.
     1793        m_curPic->setNoClrasOutputFlag(true );
     1794      }
     1795      else if ( m_noClrasOutputFlagSetByExtMeans )
     1796      {
     1797        m_curPic->setNoClrasOutputFlag( m_noClrasOutputFlag );
     1798        //  - Otherwise, if some external means, not specified in this Specification, is available to set NoClrasOutputFlag,
     1799        //    NoClrasOutputFlag is set by the external means.
     1800      }
     1801      else
     1802      {
     1803        //  - Otherwise, NoClrasOutputFlag is set equal to 0.
     1804        m_curPic->setNoClrasOutputFlag(false );
     1805      }
     1806
     1807      //-  When NoClrasOutputFlag is equal to 1, the variable LayerInitializedFlag[ i ] is set equal to 0 for all values
     1808      //  of i from 0 to vps_max_layer_id, inclusive, and the variable FirstPicInLayerDecodedFlag[ i ] is set equal to 0
     1809      //  for all values of i from 0 to vps_max_layer_id, inclusive.
     1810      if ( m_curPic->getNoClrasOutputFlag( ) )
     1811      {
     1812        for (Int i = 0; i <= m_vps->getVpsMaxLayerId(); i++)
     1813        {
     1814          m_layerInitilizedFlag       [i] = false;
     1815          m_firstPicInLayerDecodedFlag[i] = false;
     1816        }
     1817      }
     1818    }
     1819
     1820    // The variables LayerResetFlag and dolLayerId are derived as follows:
     1821    Int dolLayerId = -1;
     1822    if ( m_curPic->isIrap() && nuhLayerId > m_smallestLayerId )
     1823    {
     1824      // - If the current picture is an IRAP picture and has nuh_layer_id nuhLayerId greater than SmallestLayerId,
     1825      //   the following applies:
     1826
     1827      if( m_eosInLayer[ nuhLayerId ] )
     1828      {
     1829        // -  If the current picture is the first picture, in decoding order, that follows an end of sequence NAL unit with
     1830        //    nuh_layer_id equal to nuhLayerId, LayerResetFlag is set equal to 1 and dolLayerId is set equal to the nuh_layer_id
     1831        //    value of the current NAL unit.
     1832
     1833        m_layerResetFlag = true;
     1834        dolLayerId = nuhLayerId;
     1835      }
     1836      else  if( ( m_curPic->isCra() && m_handleCraAsBlaFlag ) ||
     1837        (m_curPic->isIdr() && m_curPic->getSlice(0)->getCrossLayerBlaFlag() ) || m_curPic->isBla() )
     1838      {
     1839        // - Otherwise, if the current picture is a CRA picture with HandleCraAsBlaFlag equal to 1, an IDR picture with
     1840        //   cross_layer_bla_flag is equal to 1 or a BLA picture, LayerResetFlag is set equal to 1 and dolLayerId is set
     1841        //   equal to the nuh_layer_id value of the current NAL unit.
     1842        m_layerResetFlag = true;
     1843        dolLayerId = nuhLayerId;
     1844      }
     1845      else
     1846      {
     1847        // -   Otherwise, LayerResetFlag is set equal to 0.
     1848        m_layerResetFlag = false;
     1849      }
     1850
     1851      // NOTE 1 - An end of sequence NAL unit, a CRA picture with HandleCraAsBlaFlag equal to 1, an IDR picture with
     1852      // cross_layer_bla_flag equal to 1, or a BLA picture, each with nuh_layer_id nuhLayerId greater than SmallestLayerId,
     1853      // may be present to indicate a discontinuity of the layer with nuh_layer_id equal to nuhLayerId and its predicted layers.
     1854
     1855      if (m_layerResetFlag )
     1856      {
     1857        //When LayerResetFlag is equal to 1, the following applies:
     1858        //  - The values of LayerInitializedFlag and FirstPicInLayerDecodedFlag are updated as follows:
     1859
     1860        for( Int i = 0; i < m_vps->getNumPredictedLayers( dolLayerId ); i++ )
     1861        {
     1862          Int iLayerId = m_vps->getIdPredictedLayer(  dolLayerId , i );
     1863          m_layerInitilizedFlag       [ iLayerId ] = false;
     1864          m_firstPicInLayerDecodedFlag[ iLayerId ] = false;
     1865        }
     1866
     1867        //  - Each picture that is in the DPB and has nuh_layer_id equal to dolLayerId is marked as "unused for reference".
     1868        m_dpb.markSubDpbAsUnusedForReference( dolLayerId );
     1869
     1870        //  - When NumPredictedLayers[ dolLayerId ] is greater than 0, each picture that is in the DPB and has nuh_layer_id
     1871        //    equal to any value of IdPredictedLayer[ dolLayerId ][ i ] for the values of i in the range of 0 to
     1872        //    NumPredictedLayers[ dolLayerId ] - 1, inclusive, is marked as "unused for reference".
     1873
     1874        for( Int i = 0; i <= m_vps->getNumPredictedLayers( dolLayerId )- 1; i++  )
     1875        {
     1876          m_dpb.markSubDpbAsUnusedForReference( m_vps->getIdPredictedLayer( dolLayerId, i ) );
     1877        }
     1878      }
     1879    }
     1880    else
     1881    {
     1882      // - Otherwise, LayerResetFlag is set equal to 0.
     1883      m_layerResetFlag = false;
     1884    }
     1885
     1886    if ( m_curPic->isIrap() )
     1887    {
     1888      // When the current picture is an IRAP picture, the following applies:
     1889
     1890      if ( m_curPic->isIdr() || m_curPic->isBla() || m_curPic->getDecodingOrder() == 0 || m_eosInLayer[nuhLayerId] )
     1891      {
     1892        // - If the current picture with a particular value of nuh_layer_id is an IDR picture, a BLA picture, the first picture
     1893        //   with that particular value of nuh_layer_id in the bitstream in decoding order or the first picture with that
     1894        //   particular value of nuh_layer_id that follows an end of sequence NAL unit with that particular value of nuh_layer_id
     1895        //   in decoding order, the variable NoRaslOutputFlag is set equal to 1.
     1896
     1897        m_curPic->setNoRaslOutputFlag(  true );
     1898      }
     1899      else if ( m_layerInitilizedFlag[ nuhLayerId ] == 0 && xAllRefLayersInitilized( nuhLayerId ) )
     1900      {
     1901        // Otherwise, if LayerInitializedFlag[ nuh_layer_id ] is equal to 0 and LayerInitializedFlag[ refLayerId ] is equal to 1
     1902        // for all values of refLayerId equal to IdDirectRefLayer[ nuh_layer_id ][ j ], where j is in the range of 0 to
     1903        // NumDirectRefLayers[ nuh_layer_id ] - 1, inclusive, the variable NoRaslOutputFlag is set equal to 1.
     1904
     1905        m_curPic->setNoRaslOutputFlag(  true );
     1906      }
     1907      else
     1908      {
     1909        // - Otherwise, the variable NoRaslOutputFlag is set equal to HandleCraAsBlaFlag.
     1910        m_curPic->setNoRaslOutputFlag(  m_handleCraAsBlaFlag );
     1911      }
     1912    }
     1913
     1914    // The following applies for the decoding of the current picture:
     1915    if ( m_curPic->isIrap() && m_curPic->getNoRaslOutputFlag() && (
     1916      ( nuhLayerId == 0 ) ||
     1917      ( m_layerInitilizedFlag[ nuhLayerId ] == 0   && m_vps->getNumDirectRefLayers( nuhLayerId ) == 0  ) ||
     1918      ( m_layerInitilizedFlag[ nuhLayerId ] == 0 && xAllRefLayersInitilized( nuhLayerId ) )
     1919      ) )
     1920    {
     1921      // When the current picture is an IRAP picture with NoRaslOutputFlag equal to 1 and one of the following conditions is true,
     1922      // LayerInitializedFlag[ nuh_layer_id ] is set equal to 1:
     1923      // - nuh_layer_id is equal to 0.
     1924      // - LayerInitializedFlag[ nuh_layer_id ] is equal to 0 and NumDirectRefLayers[ nuh_layer_id ] is equal to 0.
     1925      // - LayerInitializedFlag[ nuh_layer_id ] is equal to 0 and LayerInitializedFlag[ refLayerId ] is equal to 1 for all values of
     1926      //   refLayerId equal to IdDirectRefLayer[ nuh_layer_id ][ j ], where j is in the range of 0 to NumDirectRefLayers[ nuh_layer_id ] - 1, inclusive.
     1927
     1928      m_layerInitilizedFlag[ nuhLayerId ] = true;
     1929    }
     1930
     1931    // The following applies for the decoding of the current picture:
     1932
     1933    if ( nuhLayerId == 0 )
     1934    {
     1935      //  If the current picture has nuh_layer_id equal to 0, the decoding process for the current picture takes as inputs the syntax elements
     1936      //  and upper-case variables from clause F.7 and the decoding process for a coded picture with nuh_layer_id equal to 0 as specified in clause F.8.1.4
     1937      //  is invoked.
     1938
     1939      xF814decProcForCodPicWithLIdZero( curPart );
     1940    }
     1941    else
     1942    {
     1943      Bool decodedPicWithLayerIdZeroProvided = false;
     1944      if ( !m_vps->getVpsBaseLayerInternalFlag() && m_vps->getVpsBaseLayerAvailableFlag() &&
     1945        ( m_targetDecLayerSetIdx >= 0 && m_targetDecLayerSetIdx <= m_vps->getVpsNumLayerSetsMinus1() ) &&
     1946        m_curPic->getSlice(0)->getTemporalId() <= m_vps->getSubLayersVpsMaxMinus1( 0 ) && curPicIsFirstInAu
     1947        && decodedPicWithLayerIdZeroProvided )
     1948      {
     1949        assert( false ); //TBD
     1950        //TBD: Hybrid scalability
     1951        //  When vps_base_layer_internal_flag is equal to 0, vps_base_layer_available_flag is equal to 1,
     1952        //  TargetDecLayerSetIdx is in the range of 0 to vps_num_layer_sets_minus1, inclusive,
     1953        //  TemporalId is less than or equal to sub_layers_vps_max_minus1[ 0 ], the current picture
     1954        //  is the first coded picture of an access unit, and a decoded picture with nuh_layer_id equal
     1955        //  to 0 is provided by external means for the current access unit, clause F.8.1.9 is invoked
     1956        //  after the decoding of the slice segment header of the first slice segment, in decoding order,
     1957        //  of the current picture, but prior to decoding any slice segment of the first
     1958        //  coded picture of the access unit.
     1959      }
     1960
     1961      m_decProcPocAndRps = ANNEX_F;
     1962      // For the decoding of the slice segment header of the first slice segment, in decoding order, of the current picture,
     1963      // the decoding process for starting the decoding of a coded picture with nuh_layer_id greater than 0 specified in
     1964      // clause F.8.1.5 is invoked.  --> This is done in the loop when receiving slices.
     1965
     1966      // The decoding process is already selected before.
     1967    }
     1968  }
     1969  else if( curPart == FINALIZE_PIC )
     1970  {
     1971    Bool curPicIsLastInAu = picPosInAuIndication;
     1972
     1973    if (m_curPic->getLayerId() == 0 )
     1974    {
     1975      xF814decProcForCodPicWithLIdZero( curPart );
     1976    }
     1977    else
     1978    {
     1979      // - After all slices of the current picture have been decoded, the decoding process for ending the decoding of a
     1980      //   coded picture with nuh_layer_id greater than 0 specified in clause F.8.1.6 is invoked.
     1981      xF816decProcEndDecOfCodPicLIdGrtZero( );
     1982    }
     1983
     1984    TComSlice* slice = m_curPic->getSlice(0);
     1985    const TComVPS* vps = slice->getVPS();
     1986
     1987    if ( curPicIsLastInAu )
     1988    {
     1989      //When the current picture is the last coded picture in an access unit in BitstreamToDecode, the following steps apply after
     1990      // the decoding of the current picture, prior to the decoding of the next picture:
     1991
     1992      //-  PicOutputFlag is updated as follows:
     1993      TComPic* picAtOutputLayer = NULL;
     1994      Int outputLayerId = -1;
     1995
     1996      // Try to find pic at output layer.
     1997      if( vps->getAltOutputLayerFlag( m_targetOptLayerSetIdx ) )
     1998      {
     1999        // When alt_output_layer_flag is equal to 1, the target output layer set can only contain one output layer.
     2000        assert( vps->getNumOutputLayersInOutputLayerSet( m_targetOptLayerSetIdx ) == 1 );
     2001        outputLayerId = vps->getTargetOptLayerIdList(m_targetOptLayerSetIdx)[0];
     2002        picAtOutputLayer = m_curAu.getPic( outputLayerId );
     2003      }
     2004
     2005      if ( vps->getAltOutputLayerFlag( m_targetOptLayerSetIdx ) &&
     2006        ( picAtOutputLayer == NULL || (picAtOutputLayer != NULL && !picAtOutputLayer->getPicOutputFlag() ) ) )
     2007      {
     2008        // If alt_output_layer_flag[ TargetOlsIdx ] is equal to 1 and the current access unit either does
     2009        // not contain a picture at the output layer or contains a picture at the output layer that has PicOutputFlag equal to 0:
     2010
     2011        // - The list nonOutputLayerPictures is set to be the list of the pictures of the access unit with PicOutputFlag equal to 1 and
     2012        //   with nuh_layer_id values among the nuh_layer_id values of the reference layers of the output layer.
     2013        TComList<TComPic*> nonOutputLayerPictures;
     2014        for( TComList<TComPic*>::iterator itP= m_curAu.begin();  itP != m_curAu.end() ; itP++ )
     2015        {
     2016          TComPic* pic = (*itP);
     2017          Bool isRefernceLayerOfOutputLayer = false;
     2018          for ( Int i = 0; i < vps->getNumRefLayers( outputLayerId ) && !isRefernceLayerOfOutputLayer; i++ )
     2019          {
     2020            if ( pic->getLayerId() == vps->getIdRefLayer(outputLayerId, i) )
     2021            {
     2022              isRefernceLayerOfOutputLayer = true;
     2023            }
     2024          }
     2025
     2026          if ( pic->getPicOutputFlag() && isRefernceLayerOfOutputLayer )
     2027          {
     2028            nonOutputLayerPictures.pushBack( pic );
     2029          }
     2030        }
     2031
     2032
     2033        if (nonOutputLayerPictures.size() != 0 )
     2034        {
     2035          // -  When the list nonOutputLayerPictures is not empty,
     2036          //    The picture with the highest nuh_layer_id value among the list nonOutputLayerPictures is removed from the list nonOutputLayerPictures.
     2037          //    As in AU the picture with the highest layer id is the last
     2038          nonOutputLayerPictures.pop_back();
     2039        }
     2040
     2041        //  -  PicOutputFlag for each picture that is included in the list nonOutputLayerPictures is set equal to 0.
     2042        for( TComList<TComPic*>::iterator itP= nonOutputLayerPictures.begin();  itP != nonOutputLayerPictures.end() ; itP++ )
     2043        {
     2044          (*itP)->setPicOutputFlag( false );
     2045        }
     2046      }
     2047      else
     2048      {
     2049        //Otherwise, PicOutputFlag for pictures that are not included in an output layer is set equal to 0.
     2050        for( TComList<TComPic*>::iterator itP= m_curAu.begin();  itP != m_curAu.end() ; itP++ )
     2051        {
     2052          TComPic* pic = (*itP);
     2053
     2054          Bool includedInOutputLayer = false;
     2055          for (Int i = 0 ; i < vps->getNumOutputLayersInOutputLayerSet( m_targetOptLayerSetIdx ) && !includedInOutputLayer; i++)
     2056          {
     2057            includedInOutputLayer = ( pic->getLayerId() ==  vps->getTargetOptLayerIdList(m_targetOptLayerSetIdx)[i]);
     2058          }
     2059
     2060          if ( !includedInOutputLayer )
     2061          {
     2062            pic->setPicOutputFlag( false );
     2063          }
     2064        }
     2065      }
     2066
     2067      // When vps_base_layer_internal_flag is equal to 0, vps_base_layer_available_flag is equal to 1 and
     2068      // TargetDecLayerSetIdx is in the range of 0 to vps_num_layer_sets_minus1, inclusive
     2069
     2070      if( !vps->getVpsBaseLayerInternalFlag() && vps->getVpsBaseLayerAvailableFlag() && ( m_targetDecLayerSetIdx >= 0 && m_targetDecLayerSetIdx <= vps->getVpsNumLayerSetsMinus1()   ) )
     2071      {
     2072        if( !m_baseLayerOutputFlag )
     2073        {
     2074          // Check if base layer is a reference layer of the output layer
     2075          // and if the access unit does not contain a picture at any other reference layer of the output layer
     2076          Bool baseLayerIsRefOfOutputLayer = false;
     2077          Bool auDoesNotContainPicAtAnyOtherRefLayerOfOptLayer = true;
     2078          if ( vps->getAltOutputLayerFlag( m_targetOptLayerSetIdx ))
     2079          {
     2080            assert( outputLayerId >= 0 );
     2081
     2082            for (Int i = 0; i < vps->getNumRefLayers( outputLayerId ); i++ )
     2083            {
     2084              Int refLayerId = vps->getIdRefLayer(outputLayerId, i);
     2085              if( refLayerId == 0 )
     2086              {
     2087                baseLayerIsRefOfOutputLayer = true;
     2088              }
     2089              else
     2090              {
     2091                if ( m_curAu.getPic( refLayerId ) != NULL )
     2092                {
     2093                  auDoesNotContainPicAtAnyOtherRefLayerOfOptLayer = false;
     2094                }
     2095              }
     2096            }
     2097          }
     2098
     2099          // If alt_output_layer_flag[ TargetOlsIdx ] is equal to 1, the base layer is a reference layer of the output layer,
     2100          // the access unit does not contain a picture at the output layer or contains a picture at the output layer that has
     2101          // PicOutputFlag equal to 0, and the access unit does not contain a picture at any other reference layer of the output layer,
     2102          // BaseLayerPicOutputFlag is set equal to 1
     2103
     2104          if ( vps->getAltOutputLayerFlag( m_targetOptLayerSetIdx ) && baseLayerIsRefOfOutputLayer
     2105            && ( ( picAtOutputLayer == NULL ) || ( picAtOutputLayer != NULL && !picAtOutputLayer->getPicOutputFlag()  ) )
     2106            &&  auDoesNotContainPicAtAnyOtherRefLayerOfOptLayer )
     2107          {
     2108            m_baseLayerPicOutputFlag = true;
     2109          }
     2110          else
     2111          {
     2112            m_baseLayerPicOutputFlag = false;
     2113          }
     2114        }
     2115        else
     2116        {
     2117          m_baseLayerPicOutputFlag = true;
     2118        }
     2119
     2120        // NOTE 3 - The BaseLayerPicOutputFlag for each access unit is to be sent by an external means
     2121        // to the base layer decoder for controlling the output of base layer decoded pictures.
     2122        // BaseLayerPicOutputFlag equal to 1 for an access unit specifies that the base layer picture of the access unit is to be output.
     2123        // BaseLayerPicOutputFlag equal to 0 for an access unit specifies that the base layer picture of the access unit is not to be output.
     2124
     2125        //  The sub-DPB for the layer with nuh_layer_id equal to 0 is set to be empty.
     2126        m_dpb.emptySubDpb( 0 );
     2127      }
     2128
     2129      // The variable AuOutputFlag that is associated with the current access unit is derived as follows:
     2130
     2131      // Derive if at least one picture in the current access unit has PicOutputFlag equal to 1
     2132      Bool atLeastOnePicInAuWithPicOptFlagOne = false;
     2133      for( TComList<TComPic*>::iterator itP= m_curAu.begin();  itP != m_curAu.end() ; itP++ )
     2134      {
     2135        if ( (*itP)->getPicOutputFlag() )
     2136        {
     2137          atLeastOnePicInAuWithPicOptFlagOne = true;
     2138        }
     2139      }
     2140
     2141      //If at least one picture in the current access unit has PicOutputFlag equal to 1
     2142      if ( atLeastOnePicInAuWithPicOptFlagOne )
     2143      {
     2144        m_auOutputFlag = true;
     2145      }
     2146      else
     2147      {
     2148        m_auOutputFlag = false;
     2149      }
     2150
     2151      // The variable PicLatencyCount that is associated with the current access unit is set equal to 0.
     2152      m_curAu.setPicLatencyCount( 0 );
     2153
     2154
     2155      if ( m_auOutputFlag )
     2156      {
     2157        // for each access unit in the DPB
     2158        // that has at least one picture marked as "needed for output" and
     2159        // follows the current access unit in output order, the associated
     2160        // variable PicLatencyCount is set equal to PicLatencyCount + 1.
     2161
     2162        TComList<TComAu*> aus = m_dpb.getAusHavingPicsMarkedForOutput(); // <-- current AU is actually not yet in DPB, but this does not matter here.
     2163
     2164        for(TComList<TComAu*>::iterator itA= aus.begin(); ( itA!=aus.end()); itA++)
     2165        {
     2166          if( m_curAu.getPoc() < (*itA)->getPoc())
     2167          {
     2168            (*itA)->setPicLatencyCount( (*itA)->getPicLatencyCount() + 1 );
     2169          }
     2170        }
     2171      }
     2172    }
     2173  }
     2174}
     2175
     2176Void TAppDecTop::xF814decProcForCodPicWithLIdZero( DecProcPart curPart )
     2177{
     2178  ////////////////////////////////////////////////////////////////////////////////
     2179  // F.8.1.4 Decoding process for a coded picture with nuh_layer_id equal to 0
     2180  ////////////////////////////////////////////////////////////////////////////////
     2181
     2182  x813decProcForCodPicWithLIdZero( curPart );
     2183
     2184  if (curPart == START_PIC )
     2185  {
     2186    m_decProcPocAndRps = ANNEX_F;
     2187  }
     2188  else if (curPart == FINALIZE_PIC )
     2189  {
     2190    if ( !m_firstPicInLayerDecodedFlag[0] )
     2191    {
     2192      m_firstPicInLayerDecodedFlag[0] = true;
     2193    }
     2194  }
     2195}
     2196
     2197Void TAppDecTop::xF13521InitDpb()
     2198{
     2199  ////////////////////////////////////////////////////////////////////////////////
     2200  // F.13.5.2.1 General
     2201  ////////////////////////////////////////////////////////////////////////////////
     2202
     2203  const TComDpbSize* dpbSize = m_vps->getDpbSize();
     2204  m_maxNumReorderPics       = dpbSize->getMaxVpsNumReorderPics      ( m_targetOptLayerSetIdx, m_highestTid );
     2205  m_maxLatencyIncreasePlus1 = dpbSize->getMaxVpsLatencyIncreasePlus1( m_targetOptLayerSetIdx, m_highestTid );
     2206  m_maxLatencyValue         = dpbSize->getVpsMaxLatencyPictures     ( m_targetOptLayerSetIdx, m_highestTid );
     2207
     2208  for(Int i = 0; i < MAX_NUM_LAYER_IDS; i++)
     2209  {
     2210    m_maxDecPicBufferingMinus1[ i ] = MIN_INT;
     2211  }
     2212  for( Int i = 0; i <= m_vps->getMaxLayersMinus1(); i++ )
     2213  {
     2214    Int currLayerId = m_vps->getLayerIdInNuh( i );
     2215    for(Int layerIdx = 0 ; layerIdx < m_vps->getNumLayersInIdList( m_targetDecLayerSetIdx); layerIdx++ )
     2216    {
     2217      if( m_vps->getLayerSetLayerIdList( m_targetDecLayerSetIdx, layerIdx ) == currLayerId )
     2218      {
     2219        m_maxDecPicBufferingMinus1[currLayerId] = dpbSize->getMaxVpsDecPicBufferingMinus1( m_targetDecLayerSetIdx, layerIdx, m_highestTid );
     2220      }
     2221    }
     2222  }
     2223}
     2224
     2225Void TAppDecTop::xF13522OutputAndRemOfPicsFromDpb( Bool beforePocDerivation )
     2226{
     2227  ////////////////////////////////////////////////////////////////////////////////
     2228  // F.13.5.2.2 Output and removal of pictures from the DPB
     2229  ////////////////////////////////////////////////////////////////////////////////
     2230
     2231  if( beforePocDerivation )
     2232  {
     2233    // F.13.5.2.2
     2234    // Part before POC and RPS derivation.
     2235
     2236    if( m_curPic->getDecodingOrder() != 0 )
     2237    {
     2238      // When the current picture is not picture 0 in the current layer,
     2239      // the output and removal of pictures in the current layer, with nuh_layer_id equal to currLayerId,
     2240      // from the DPB before the decoding of the current picture, i.e., picture n, but after parsing the
     2241      // slice header of the first slice of the current picture and before the invocation of the decoding
     2242      // process for picture order count, happens instantaneously when the first decoding unit of the current
     2243      // picture is removed from the CPB and proceeds as follows:
     2244
     2245      if( m_curPic->getIsPocResettingPic() )
     2246      {
     2247        // When the current picture is a POC resetting picture, all pictures in the DPB that do
     2248        // not belong to the current access unit and that are marked as "needed for output" are
     2249        // output, starting with pictures with the smallest value of PicOrderCntVal of all pictures
     2250        // excluding those in the current access unit in the DPB, in ascending order of the PicOrderCntVal
     2251        // values, and pictures with the same value of PicOrderCntVal are output in ascending order
     2252        // of the nuh_layer_id values. When a picture is output, it is cropped using the conformance cropping
     2253        // window specified in the active SPS for the picture, the cropped picture is output, and
     2254        // the picture is marked as "not needed for output"
     2255
     2256        TComList<TComAu*>* aus = m_dpb.getAus(); // Theses are sorted by POC.
     2257        for (TComList<TComAu*>::iterator itA = aus->begin(); itA != aus->end(); itA++ )
     2258        {
     2259          //Pictures in AUs are sorted by nuh_layer_id;
     2260          for (TComAu::iterator itP = (*itA)->begin(); itP != (*itA)->end(); itP++ )
     2261          {
     2262            TComPic* pic = (*itP);
     2263            if ( !m_curAu.containsPic( pic ) )
     2264            {
     2265              xCropAndOutput( pic );
     2266              pic->setOutputMark( false );
     2267            }
     2268          }
     2269        }
     2270      }
     2271    }
     2272  }
     2273  else if ( !beforePocDerivation )
     2274  {
     2275    //  The variable listOfSubDpbsToEmpty is derived as follows:
     2276
     2277    Int nuhLayerId = m_curPic->getLayerId();
     2278    TComList<TComSubDpb*> listOfSubDpbsToEmpty;
     2279
     2280    if ( m_newVpsActivatedbyCurAu && ( m_curPic->isIrap()&& nuhLayerId == m_smallestLayerId
     2281      && m_curPic->getNoRaslOutputFlag() && m_curPic->getNoClrasOutputFlag() ) )
     2282    {
     2283      // If a new VPS is activated by the current access unit or the current picture is IRAP picture
     2284      // with nuh_layer_id equal to SmallestLayerId,   NoRaslOutputFlag equal to 1, and NoClrasOutputFlag equal to 1,
     2285      // listOfSubDpbsToEmpty is set equal to all the sub-DPBs.
     2286      listOfSubDpbsToEmpty = (*m_dpb.getSubDpbs());
     2287    }
     2288    else if (m_curPic->isIrap() && m_vps->getNumDirectRefLayers( nuhLayerId ) == 0 &&
     2289      nuhLayerId > m_smallestLayerId && m_curPic->getNoRaslOutputFlag() && m_layerResetFlag  )
     2290    {
     2291      // Otherwise, if the current picture is an IRAP picture with any nuh_layer_id value indepLayerId
     2292      // such that NumDirectRefLayers[ indepLayerId ] is equal to 0 and indepLayerId is greater than
     2293      // SmallestLayerId, and with NoRaslOutputFlag equal to 1, and LayerResetFlag is equal to 1,
     2294
     2295      // listOfSubDpbsToEmpty is set equal to the sub-DPBs containing the current layer and the sub-DPBs
     2296      // containing the predicted layers of the current layer.
     2297
     2298      listOfSubDpbsToEmpty.pushBack( m_dpb.getSubDpb( nuhLayerId, false  ) );
     2299      for( Int i = 0; i < m_vps->getNumPredictedLayers( nuhLayerId ); i++  )
     2300      {
     2301        listOfSubDpbsToEmpty.pushBack( m_dpb.getSubDpb( m_vps->getIdPredictedLayer( nuhLayerId, i), false  ) );
     2302      }
     2303    }
     2304    else
     2305    {
     2306      // Otherwise, crossLayerBufferEmptyFlag is set equal to 0.
     2307
     2308      // The SPEC seems to have an issue here. Use current subDpb as in form F.13.3.2
     2309      listOfSubDpbsToEmpty.pushBack( m_dpb.getSubDpb( nuhLayerId, false  ) );
     2310    }
     2311
     2312    // If the current picture is an IRAP picture with NoRaslOutputFlag equal to 1 and any of
     2313    // the following conditions is true:
     2314    //   - nuh_layer_id equal to SmallestLayerId,
     2315    //   - nuh_layer_id of the current layer is greater than SmallestLayerId, and NumDirectRefLayers[ nuh_layer_id ]
     2316    //     is equal to 0,
     2317
     2318    if ( m_curPic->isIrap() && m_curPic->getNoRaslOutputFlag() && (
     2319      ( nuhLayerId == m_smallestLayerId ) ||
     2320      ( ( nuhLayerId > m_smallestLayerId ) && m_vps->getNumDirectRefLayers( nuhLayerId ) == 0 ) )
     2321      )
     2322    {
     2323      // 1. The variable NoOutputOfPriorPicsFlag is derived for the decoder under test as follows:
     2324      Bool noOutputOfPriorPicsFlag;
     2325      if( m_curPic->isCra() )
     2326      {
     2327        noOutputOfPriorPicsFlag = true;
     2328        // - If the current picture is a CRA picture, NoOutputOfPriorPicsFlag is set equal to 1
     2329        // (regardless of the value of no_output_of_prior_pics_flag).
     2330      }
     2331      else if ( false )
     2332      {
     2333        // TBD
     2334        // - Otherwise, if the value of pic_width_in_luma_samples, pic_height_in_luma_samples,
     2335        //   chroma_format_idc, bit_depth_luma_minus8, bit_depth_chroma_minus8, separate_colour_plane_flag,
     2336        //   or sps_max_dec_pic_buffering_minus1[ HighestTid ] derived from the active SPS for the current
     2337        //   layer is different from the value of pic_width_in_luma_samples, pic_height_in_luma_samples,
     2338        //   chroma_format_idc, bit_depth_luma_minus8, bit_depth_chroma_minus8, separate_colour_plane_flag,
     2339        //   or sps_max_dec_pic_buffering_minus1[ HighestTid ], respectively, derived from the SPS that
     2340        //   was active for the current layer when decoding the preceding picture in the current layer,
     2341        //   NoOutputOfPriorPicsFlag may (but should not) be set equal to 1 by the decoder under test,
     2342        //   regardless of the value of no_output_of_prior_pics_flag.
     2343        //    NOTE - Although setting NoOutputOfPriorPicsFlag equal to no_output_of_prior_pics_flag is preferred
     2344        //    under these conditions, the decoder under test is allowed to set NoOutputOfPriorPicsFlag to 1 in this case.
     2345        // - Otherwise, NoOutputOfPriorPicsFlag is set equal to no_output_of_prior_pics_flag.
     2346
     2347        // assert( 1 );
     2348      }
     2349      else
     2350      {
     2351        // - Otherwise, NoOutputOfPriorPicsFlag is set equal to no_output_of_prior_pics_flag.
     2352        noOutputOfPriorPicsFlag = m_curPic->getSlice(0)->getNoOutputPriorPicsFlag();
     2353      }
     2354
     2355      // 2. The value of NoOutputOfPriorPicsFlag derived for the decoder under test is applied for the HRD as follows:
     2356      if ( !noOutputOfPriorPicsFlag )
     2357      {
     2358        // - If NoOutputOfPriorPicsFlag is equal to 0, all non-empty picture storage buffers in all the sub-DPBs included
     2359        //   in listOfSubDpbsToEmpty are output by repeatedly invoking the "bumping" process specified in clause
     2360        //   F.13.5.2.4 until all these pictures are marked as "not needed for output".
     2361
     2362        Bool repeat = true;
     2363        while (repeat )
     2364        {
     2365          Bool allPicsMarkedNotNeedForOutput = true;
     2366          for (TComList<TComSubDpb*>::iterator itS = listOfSubDpbsToEmpty.begin(); itS != listOfSubDpbsToEmpty.end() && allPicsMarkedNotNeedForOutput; itS++ )
     2367          {
     2368            allPicsMarkedNotNeedForOutput = allPicsMarkedNotNeedForOutput && ( (*itS)->areAllPicsMarkedNotNeedForOutput() );
     2369          }
     2370
     2371          if ( !allPicsMarkedNotNeedForOutput )
     2372          {
     2373            xF13524Bumping( m_dpb.getAusHavingPicsMarkedForOutput() );
     2374          }
     2375          else
     2376          {
     2377            repeat = false;
     2378          }
     2379        }
     2380      }
     2381      else
     2382      {
     2383        // - Otherwise (NoOutputOfPriorPicsFlag is equal to 1), all picture storage buffers containing a picture
     2384        //   that is marked as "not needed for output" and "unused for reference" are emptied (without output),
     2385        //   all pictures that are contained in a sub-DPB included in listOfSubDpbsToEmpty are emptied, and the sub-DPB
     2386        //   fullness of each sub-DPB is decremented by the number of picture storage buffers emptied in that sub-DPB.
     2387        m_dpb.emptyNotNeedForOutputAndUnusedForRef();
     2388
     2389        for( TComList<TComSubDpb*>::iterator iS = listOfSubDpbsToEmpty.begin(); iS != listOfSubDpbsToEmpty.end(); iS++)
     2390        {
     2391          m_dpb.emptySubDpbs( &listOfSubDpbsToEmpty );
     2392        }
     2393      }
     2394    }
     2395    else
     2396    {
     2397      // -  Otherwise, all picture storage buffers that contain a picture in the current layer and that are marked as
     2398      //   "not needed for output" and "unused for reference" are emptied (without output). For each picture storage buffer that is emptied,
     2399      //   the sub-DPB fullness is decremented by one.
     2400
     2401      m_dpb.emptySubDpbNotNeedForOutputAndUnusedForRef( nuhLayerId );
     2402
     2403      //    When one or more of the following conditions are true, the "bumping" process specified in clause F.13.5.2.4
     2404      //    is invoked repeatedly until none of the following conditions are true:
     2405
     2406      Bool repeat = true;
     2407      while ( repeat )
     2408      {
     2409        TComList<TComAu*> aus = m_dpb.getAusHavingPicsMarkedForOutput();
     2410
     2411        // The number of access units that contain at least one decoded picture in the DPB marked
     2412        // as "needed for output" is greater than MaxNumReorderPics.
     2413        Bool cond1 = ( aus.size() > m_maxNumReorderPics );
     2414
     2415        // MaxLatencyIncreasePlus1 is not equal to 0 and there is at least one access unit
     2416        // that contains at least one decoded picture in the DPB marked as "needed for output"
     2417        // for which the associated variable PicLatencyCount is greater than or equal to MaxLatencyValue.
     2418        Bool auWithGreaterLatencyCount = false;
     2419        for(TComList<TComAu*>::iterator itA= aus.begin(); ( itA!=aus.end()) && !auWithGreaterLatencyCount ; itA++)
     2420        {
     2421          if ( (*itA)->getPicLatencyCount() > m_maxLatencyValue )
     2422          {
     2423            auWithGreaterLatencyCount = true;
     2424          }
     2425        }
     2426
     2427        Bool cond2 = (m_maxLatencyIncreasePlus1 != 0 ) && auWithGreaterLatencyCount;
     2428
     2429        // The number of pictures in the sub-DPB is greater than or equal to MaxDecPicBufferingMinus1 + 1.
     2430        Bool cond3 = ( m_dpb.getSubDpb( nuhLayerId, false )->size() >= m_maxDecPicBufferingMinus1[ nuhLayerId ] + 1 );
     2431
     2432        if ( cond1  || cond2 || cond3 )
     2433        {
     2434          xF13524Bumping( aus );
     2435        }
     2436        else
     2437        {
     2438          repeat = false;
     2439        }
     2440      }
     2441    }
     2442  }
     2443}
     2444
     2445Void TAppDecTop::xF13523PicDecMarkAddBumpAndStor( Bool curPicIsLastInAu )
     2446{
     2447  ////////////////////////////////////////////////////////////////////////////////
     2448  // F.13.5.2.3 Picture decoding, marking, additional bumping and storage
     2449  ////////////////////////////////////////////////////////////////////////////////
     2450
     2451  const TComVPS* vps = m_curPic->getSlice(0)->getVPS();
     2452
     2453  // The current picture is considered as decoded after the last decoding unit of
     2454  // the picture is decoded. The current decoded picture is stored in an empty picture
     2455  // storage buffer in the sub-DPB.
     2456
     2457  m_dpb.addNewPic( m_curPic );
     2458
     2459  if ( curPicIsLastInAu )
     2460  {
     2461    // When the current picture is the last picture in an access unit, the following applies
     2462    // for each decoded picture with nuh_layer_id greater than or
     2463    // equal to ( vps_base_layer_internal_flag ? 0 : 1 ) of the access unit:
     2464
     2465    for( TComList<TComPic*>::iterator itP = m_curAu.begin(); itP != m_curAu.end(); itP++ )
     2466    {
     2467      TComPic* pic = (*itP);
     2468      if( pic->getLayerId() >= ( vps->getVpsBaseLayerInternalFlag() ? 0 : 1 ) )
     2469      {
     2470        if ( pic->getPicOutputFlag() )
     2471        {
     2472          //If the decoded picture has PicOutputFlag equal to 1, it is marked as "needed for output".
     2473          pic->setOutputMark( true );
     2474        }
     2475        else
     2476        {
     2477          // Otherwise it is marked as "not needed for output".
     2478          pic->setOutputMark( false );
     2479        }
     2480        // NOTE - Prior to investigating the conditions above, PicOutputFlag
     2481        // of each picture of the access unit is updated as specified in clause F.8.1.2.
     2482      }
     2483    }
     2484  }
     2485
     2486  // The current decoded picture is marked as "used for short-term reference".
     2487  m_curPic->markAsUsedForShortTermReference();
     2488
     2489
     2490  Bool repeat = true;
     2491  while ( repeat )
     2492  {
     2493    TComList<TComAu*> aus = m_dpb.getAusHavingPicsMarkedForOutput();
     2494
     2495    // When one or more of the following conditions are true,
     2496    // the "bumping" process specified in clause F.13.5.2.4 is invoked
     2497    // repeatedly until none of the following conditions are true:
     2498
     2499    // - The number of access units that contain at least one decoded picture in the DPB marked
     2500    //   as "needed for output" is greater than MaxNumReorderPics.
     2501    Bool cond1 = ( aus.size() > m_maxNumReorderPics );
     2502
     2503    // - MaxLatencyIncreasePlus1 is not equal to 0 and there is at least one access unit
     2504    //   that contains at least one decoded picture in the DPB marked as "needed for output"
     2505    //   for which the associated variable PicLatencyCount is greater than or equal to MaxLatencyValue.
     2506    Bool auWithGreaterLatencyCount = false;
     2507    for(TComList<TComAu*>::iterator itA= aus.begin(); ( itA!=aus.end()) && !auWithGreaterLatencyCount ; itA++)
     2508    {
     2509      if ( (*itA)->getPicLatencyCount() > m_maxLatencyValue )
     2510      {
     2511        auWithGreaterLatencyCount = true;
     2512      }
     2513    }
     2514
     2515    Bool cond2 = (m_maxLatencyIncreasePlus1 != 0 ) && auWithGreaterLatencyCount;
     2516
     2517    if ( cond1  || cond2 )
     2518    {
     2519      xF13524Bumping( aus );
     2520    }
     2521    else
     2522    {
     2523      repeat = false;
     2524    }
     2525  }
     2526}
     2527
     2528Void TAppDecTop::xF13524Bumping( TComList<TComAu*> aus )
     2529{
     2530  ////////////////////////////////////////////////////////////////////////////////
     2531  // F.13.5.2.4 "Bumping" process
     2532  ////////////////////////////////////////////////////////////////////////////////
     2533
     2534  // The picture or pictures that are first for output are selected as the ones having the
     2535  // smallest value of PicOrderCntVal of all pictures in the DPB marked as "needed for output".
     2536
     2537  assert( !aus.empty() );
     2538
     2539  // Create copy, since original AU from DBP is modified when removing pic.
     2540  TComAu auWithSmallestPoc = *((*aus.begin())); // List is sorted, hence the AU with smallest POC is the first.
     2541
     2542  for(TComAu::iterator itP= auWithSmallestPoc.begin(); ( itP!=auWithSmallestPoc.end() ); itP++)
     2543  {
     2544    TComPic* pic = (*itP);
     2545
     2546    if (pic->getOutputMark() )
     2547    {
     2548      // Each of these pictures is, in ascending nuh_layer_id order, cropped,
     2549      // using the conformance cropping window specified in the active SPS for the picture,
     2550      // the cropped picture is output, and the picture is marked as "not needed for output".
     2551
     2552      // pictures are sorted in the AU in ascending nuh_layer_id order.
     2553
     2554
     2555      xCropAndOutput( pic );
     2556      pic->setOutputMark( false );
     2557
     2558      // Each picture storage buffer that contains a picture marked as "unused for reference"
     2559      // and that was one of the pictures cropped and output is emptied and the fullness of
     2560      // the associated sub-DPB is decremented by one.
     2561
     2562      if (pic->getMarkedUnUsedForReference() )
     2563      {
     2564        m_dpb.removePic( pic );
     2565      }
     2566    }
     2567  }
     2568}
     2569
     2570Void TAppDecTop::xF816decProcEndDecOfCodPicLIdGrtZero()
     2571{
     2572  ////////////////////////////////////////////////////////////////////////////////
     2573  // F.8.1.6  Decoding process for ending the decoding of a coded picture with nuh_layer_id greater than 0
     2574  ////////////////////////////////////////////////////////////////////////////////
     2575
     2576  const TComSlice* slice = m_curPic->getSlice( 0 );
     2577  const Int nuhLayerId   = m_curPic->getLayerId();
     2578
     2579  assert(  nuhLayerId != 0 );
     2580
     2581  //The marking of decoded pictures is modified as specified in the following:
     2582  for (Int i = 0; i < m_curPic->getDecodedRps()->m_numActiveRefLayerPics0;i++ )
     2583  {
     2584    m_curPic->getDecodedRps()->m_refPicSetInterLayer0[i]->markAsUsedForShortTermReference();
     2585  }
     2586
     2587  for (Int i = 0; i < m_curPic->getDecodedRps()->m_numActiveRefLayerPics1;i++ )
     2588  {
     2589    m_curPic->getDecodedRps()->m_refPicSetInterLayer1[i]->markAsUsedForShortTermReference();
     2590  }
     2591
     2592  // PicOutputFlag is set as follows:
     2593  if ( !m_layerInitilizedFlag[ nuhLayerId ] )
     2594  {
     2595    // - If LayerInitializedFlag[ nuh_layer_id ] is equal to 0, PicOutputFlag is set equal to 0.
     2596    m_curPic->setPicOutputFlag( false );
     2597  }
     2598  else if (m_curPic->isRasl( ) && m_noRaslOutputFlagAssocIrap[ nuhLayerId] )
     2599  {
     2600    // - Otherwise, if the current picture is a RASL picture and NoRaslOutputFlag of the associated IRAP picture is equal to 1,
     2601    //   PicOutputFlag is set equal to 0.
     2602
     2603    m_curPic->setPicOutputFlag( false );
     2604  }
     2605  else
     2606  {
     2607    // - Otherwise, PicOutputFlag is set equal to pic_output_flag.
     2608    m_curPic->setPicOutputFlag( slice->getPicOutputFlag() );
     2609  }
     2610
     2611  // The decoded picture is marked as "used for short-term reference".
     2612  m_curPic->markAsUsedForShortTermReference();
     2613
     2614  if ( !m_firstPicInLayerDecodedFlag[ nuhLayerId ] )
     2615  {
     2616    // When FirstPicInLayerDecodedFlag[ nuh_layer_id ] is equal to 0, FirstPicInLayerDecodedFlag[ nuh_layer_id ] is set equal to 1.
     2617    m_firstPicInLayerDecodedFlag[ nuhLayerId ] = true;
     2618  }
     2619}
     2620
     2621TDecTop* TAppDecTop::xGetDecoder( InputNALUnit& nalu )
     2622{
     2623  return m_tDecTop[ xGetDecoderIdx( nalu.m_nuhLayerId )];
     2624}
     2625
     2626
    10522627Int TAppDecTop::xGetDecoderIdx( Int layerId, Bool createFlag /*= false */ )
    10532628{
    1054   Int decIdx = -1; 
    1055 
    1056   if ( layerId > MAX_NUM_LAYER_IDS-1 ) 
    1057   {
    1058     return decIdx; 
    1059   }
    1060 
    1061   if ( m_layerIdToDecIdx[ layerId ] != -1 ) 
    1062   {     
    1063     decIdx = m_layerIdToDecIdx[ layerId ]; 
     2629  Int decIdx = -1;
     2630
     2631  if ( layerId > MAX_NUM_LAYER_IDS-1 )
     2632  {
     2633    return decIdx;
     2634  }
     2635
     2636  if ( m_layerIdToDecIdx[ layerId ] != -1 )
     2637  {
     2638    decIdx = m_layerIdToDecIdx[ layerId ];
    10642639  }
    10652640  else
    1066   {     
    1067     assert ( createFlag ); 
    1068     assert( m_numDecoders < MAX_NUM_LAYERS ); 
    1069 
    1070     decIdx = m_numDecoders; 
     2641  {
     2642    assert ( createFlag );
     2643    assert( m_numDecoders < MAX_NUM_LAYERS );
     2644
     2645    decIdx = m_numDecoders;
    10712646
    10722647    // Init decoder
     
    10762651    m_tDecTop[ decIdx ]->setLayerId( layerId );
    10772652    m_tDecTop[ decIdx ]->setDecodedPictureHashSEIEnabled(m_decodedPictureHashSEIEnabled);
    1078     m_tDecTop[ decIdx ]->setIvPicLists( &m_ivPicLists );
    1079     m_tDecTop[ decIdx ]->setLayerInitilizedFlags( m_layerInitilizedFlags );
    1080     m_tDecTop[ decIdx ]->setTargetOlsIdx( m_targetOptLayerSetIdx );   
     2653    m_tDecTop[ decIdx ]->setDpb( &m_dpb );
     2654    m_tDecTop[ decIdx ]->setTargetOlsIdx( m_targetOptLayerSetIdx );
     2655    m_tDecTop[ decIdx ]->setFirstPicInLayerDecodedFlag( m_firstPicInLayerDecodedFlag );
     2656    m_tDecTop[ decIdx ]->setPocDecrementedInDPBFlag   ( m_pocDecrementedInDpbFlag    );
     2657    m_tDecTop[ decIdx ]->setLastPresentPocResetIdc    ( m_lastPresentPocResetIdc );
     2658
     2659
    10812660#if O0043_BEST_EFFORT_DECODING
    10822661    m_cTDecTop[ decIdx ]->setForceDecodeBitDepth(m_forceDecodeBitDepth);
     
    10912670#endif
    10922671
    1093     // append pic list of new decoder to PicLists
    1094     assert( m_ivPicLists.size() == m_numDecoders );
    1095     m_ivPicLists.push_back( m_tDecTop[ decIdx ]->getListPic() );
    1096 
    1097     // create recon file related stuff     
     2672    // append pic list of new decoder to PicLists
     2673
     2674    // create recon file related stuff
    10982675    Char* pchTempFilename = NULL;
    10992676    if ( m_pchReconFile )
    1100     {     
    1101       Char buffer[4];     
     2677    {
     2678      Char buffer[4];
    11022679      sprintf(buffer,"_%i", layerId );
    1103       assert ( m_pchReconFile ); 
     2680      assert ( m_pchReconFile );
    11042681      xAppendToFileNameEnd( m_pchReconFile , buffer, pchTempFilename );
    11052682      assert( m_pchReconFiles.size() == m_numDecoders );
    11062683    }
    11072684
    1108     m_pchReconFiles.push_back( pchTempFilename );   
     2685    m_pchReconFiles.push_back( pchTempFilename );
    11092686
    11102687    m_tVideoIOYuvReconFile[ decIdx ] = new TVideoIOYuv;
    11112688    m_reconOpen           [ decIdx ] = false;
    11122689
    1113     // set others
    1114     m_pocLastDisplay      [ decIdx ] = -MAX_INT;
    1115     m_layerIdToDecIdx     [ layerId ] = decIdx;
    1116 
    1117     m_numDecoders++;
     2690    // set others
     2691    m_layerIdToDecIdx     [ layerId ] = decIdx;
     2692
     2693    m_numDecoders++;
    11182694  };
    11192695  return decIdx;
     
    11212697}
    11222698
    1123 Void TAppDecTop::xMarkForOutput( Bool allLayersDecoded, Int pocLastPic, Int layerIdLastPic )
     2699Int TAppDecTop::xPreDecodePoc( InputNALUnit& nalu )
    11242700
    1125   vector<Int> targetOptLayerIdList = m_vps->getTargetOptLayerIdList( m_targetOptLayerSetIdx );
    1126 
    1127   if (m_vps->getAltOutputLayerFlagVar( m_targetOptLayerSetIdx ) )
    1128   {
    1129     assert( targetOptLayerIdList.size() == 1 );
    1130     Int targetLayerId = targetOptLayerIdList[0];     
    1131 
    1132     TComPic* curPic = m_ivPicLists.getPic( layerIdLastPic, pocLastPic );
    1133     assert( curPic != NULL );
    1134 
    1135     if ( layerIdLastPic == targetLayerId )
    1136     {
    1137       if ( curPic->getPicOutputFlag() )
    1138       {
    1139         curPic->setOutputMark( true );
     2701  // - According to F.7.4.2.4.4, the POC of the current picture is required to detect whether it is the first in a new AU
     2702  // - F.8.1.3 needs to know if the current picture is the first of an AU
     2703  //   actually before its POC has been decoded.
     2704
     2705  // Thus, in the software implementation the processes can not be invoked in the same order as in the Spec.
     2706  // For this, this function decodes the POC before invoking F.8.1.3. However, this is done without
     2707  // altering member variables
     2708
     2709  // Do some stuff from F.8.1.3 required for POC derivation, which is not depending on AU detection.
     2710  TDecTop* dec          = xGetDecoder( nalu );
     2711  TComSlice* slicePilot = dec->getSlicePilot();
     2712  Int nuhLayerId        = nalu.m_nuhLayerId;
     2713  Int smallestLayerId   = dec->getSmallestLayerId();
     2714
     2715  Int handleCraAsBlaFlag;
     2716  if ( nalu.isIrap() )
     2717  {
     2718    if ( !m_handleCraAsBlaFlagSetByExtMeans )
     2719    {
     2720      handleCraAsBlaFlag = false;
     2721    }
     2722  }
     2723
     2724  Bool firstPicInLayerDecodedFlag = m_firstPicInLayerDecodedFlag[ nalu.m_nuhLayerId ];
     2725 
     2726  if ( nalu.isIrap() && nuhLayerId == smallestLayerId )
     2727  {
     2728    Int noClrasOutputFlag;
     2729    if( m_firstSliceInBitstream )
     2730    {
     2731      noClrasOutputFlag = true;
     2732    }
     2733    else if( m_eosInLayer[ 0 ] || m_eosInLayer[ nuhLayerId ] )
     2734    {
     2735      noClrasOutputFlag = true;
     2736    }
     2737    else if ( nalu.isBla() || (nalu.isCra() && handleCraAsBlaFlag ))
     2738    {
     2739      noClrasOutputFlag = true;
     2740    }
     2741    else if ( nalu.isIdr() && slicePilot->getCrossLayerBlaFlag() )
     2742    {
     2743      noClrasOutputFlag = true;
     2744    }
     2745    else if ( m_noClrasOutputFlagSetByExtMeans )
     2746    {
     2747      noClrasOutputFlag = m_noClrasOutputFlag;
     2748    }
     2749    else
     2750    {     
     2751      noClrasOutputFlag  = false;
     2752    }
     2753
     2754    if( noClrasOutputFlag )
     2755    {
     2756      firstPicInLayerDecodedFlag = false;
     2757    }   
     2758  }
     2759
     2760  // Derive POC
     2761  return dec->preDecodePoc(firstPicInLayerDecodedFlag, m_newPicIsFstPicOfAllLayOfPocResetPer, m_newPicIsPocResettingPic );
     2762}
     2763
     2764Bool TAppDecTop::xDetectNewAu( InputNALUnit& nalu )
     2765{
     2766  TDecTop*        dec        = xGetDecoder( nalu );
     2767  TComSlice*      slicePilot = dec->getSlicePilot();
     2768  const TComVPS*  vps        = slicePilot->getVPS();
     2769
     2770  Bool firstVclNaluOfAu;
     2771
     2772  if (m_curPic == NULL )
     2773  {
     2774    // No picture decoded yet, so we have a new AU.
     2775    firstVclNaluOfAu = true;
     2776  }
     2777  else
     2778  {
     2779    if ( !vps->getVpsExtensionFlag() )
     2780    {
     2781      // Decoding according to clause 8, hence one pic per AU.
     2782      firstVclNaluOfAu = slicePilot->getFirstSliceSegementInPicFlag();
     2783    }
     2784    else
     2785    {
     2786      if ( dec->getTargetOlsIdx() == 0 )
     2787      {
     2788        // Only the base layer is decoded, hence one pic per AU.
     2789        firstVclNaluOfAu = slicePilot->getFirstSliceSegementInPicFlag();
    11402790      }
    11412791      else
    1142       {       
    1143         xMarkAltOutPic( targetLayerId, pocLastPic );
    1144       }
    1145       m_markedForOutput = true;
    1146     }
    1147     else if ( ( layerIdLastPic > targetLayerId || allLayersDecoded ) && !m_markedForOutput )
    1148     {
    1149       xMarkAltOutPic( targetLayerId, pocLastPic );
    1150     }
    1151 
    1152     if ( allLayersDecoded )
    1153     {
    1154       m_markedForOutput = false;
    1155     }
     2792      {
     2793        // F.7.4.2.4.4  Order of NAL units and coded pictures and association to access units   
     2794        //  An access unit consists of one or more coded pictures, each with a distinct value of
     2795        //  nuh_layer_id, and zero or more non-VCL NAL units.
     2796
     2797        //  A VCL NAL unit is the first VCL NAL unit of an access unit, when all of the following conditions are true:
     2798        //  -  first_slice_segment_in_pic_flag is equal to 1.
     2799        //  -  At least one of the following conditions is true:
     2800        //     - The previous picture in decoding order belongs to a different POC resetting period
     2801        //       than the picture containing the VCL NAL unit.
     2802        Bool prevPicDiffPocResetPeriod = m_newPicIsFstPicOfAllLayOfPocResetPer;
     2803
     2804        //     - PicOrderCntVal derived for the VCL NAL unit differs from the PicOrderCntVal of the
     2805        //       previous picture in decoding order.
     2806        Bool prevPicDiffPoc = ( xPreDecodePoc( nalu ) != m_curPic->getPOC() );
     2807
     2808        if( slicePilot->getFirstSliceSegementInPicFlag() && ( prevPicDiffPocResetPeriod || prevPicDiffPoc ) )
     2809        {
     2810          firstVclNaluOfAu = true;
     2811        }
     2812        else
     2813        {
     2814          firstVclNaluOfAu = false;
     2815        }
     2816      }
     2817    }
     2818  }
     2819  return firstVclNaluOfAu;
     2820}
     2821
     2822Void TAppDecTop::xDetectNewPocResettingPeriod( InputNALUnit& nalu )
     2823{
     2824  TDecTop* dec  = xGetDecoder( nalu );
     2825  dec->inferPocResetPeriodId();
     2826
     2827
     2828  Int pocResetIdc         = dec->getSlicePilot()->getPocResetIdc();
     2829  Int newPocResetPeriodId = dec->getSlicePilot()->getPocResetPeriodId();
     2830
     2831  Int curPocResetPeriodId = ( m_curPic != NULL)  ? m_curPic->getPocResetPeriodId() : MIN_INT;
     2832
     2833  // Check if new picture starts a new poc resetting period.
     2834  if(  ( pocResetIdc == 1 || pocResetIdc == 2 ) &&  ( curPocResetPeriodId != newPocResetPeriodId ) )
     2835  {
     2836    for (Int i = 0; i < MAX_NUM_LAYER_IDS; i++ )
     2837    {
     2838      m_firstPicInPocResettingPeriodReceived[ i ] = false;
     2839    }
     2840    m_newPicIsFstPicOfAllLayOfPocResetPer = true;
    11562841  }
    11572842  else
    1158   {
    1159     for( Int dI = 0; dI < m_numDecoders; dI++ )
    1160     {     
    1161       Int layerId = m_tDecTop[dI]->getLayerId();
    1162       TComPic* curPic = m_ivPicLists.getPic( layerId, pocLastPic );
    1163       if ( curPic != NULL )
    1164       {
    1165         if ( curPic->getReconMark() )
    1166         {
    1167           Bool isTargetOptLayer = std::find(targetOptLayerIdList.begin(), targetOptLayerIdList.end(), layerId) != targetOptLayerIdList.end();
    1168           curPic->setOutputMark( isTargetOptLayer ? curPic->getPicOutputFlag() : false );
    1169         }
    1170       }
    1171     }
    1172   }
    1173 }
    1174 
    1175 Void TAppDecTop::xMarkAltOutPic( Int targetOutputLayer, Int pocLastPic )
    1176 {
    1177   Int optLayerIdxInVps = m_vps->getLayerIdInNuh( targetOutputLayer );
    1178   Int highestNuhLayerId = -1;
    1179   TComPic* picWithHighestNuhLayerId = NULL;
    1180   for (Int dIdx = 0; dIdx < m_numDecoders; dIdx++)
    1181   {
    1182     Int curLayerId = m_tDecTop[dIdx]->getLayerId();
    1183     Int curLayerIdxInVps = m_vps->getLayerIdInNuh( curLayerId  );
    1184     if ( m_vps->getDependencyFlag(optLayerIdxInVps, curLayerIdxInVps ) )
    1185     {
    1186       TComPic* curPic = m_ivPicLists.getPic( curLayerId, pocLastPic );
    1187       if (curPic != NULL)
    1188       {
    1189         if (curPic->getReconMark() && curPic->getPicOutputFlag() )
    1190         {
    1191           curPic->setOutputMark   ( false );
    1192           curPic->setPicOutputFlag( false );
    1193           if ( curLayerId > highestNuhLayerId)
    1194           {
    1195             highestNuhLayerId = curLayerId ;
    1196             picWithHighestNuhLayerId = curPic;
    1197           }           
    1198         }
    1199       }
    1200     }
    1201   }
    1202   if ( picWithHighestNuhLayerId != NULL )
    1203   {
    1204     picWithHighestNuhLayerId->setPicOutputFlag(true);
    1205     picWithHighestNuhLayerId->setOutputMark   (true);
    1206   }
     2843  {
     2844    m_newPicIsFstPicOfAllLayOfPocResetPer = false;
     2845  }
     2846
     2847  // Check if current picture is a poc resetting picture (thus the first picture of this layer within the POC resetting period.
     2848  if ( !m_firstPicInPocResettingPeriodReceived[ nalu.m_nuhLayerId ] )
     2849  {
     2850    m_newPicIsPocResettingPic = true;
     2851    m_firstPicInPocResettingPeriodReceived[ nalu.m_nuhLayerId ] = true;
     2852  }
     2853  else
     2854  {
     2855    m_newPicIsPocResettingPic = false;
     2856  }
     2857
     2858}
     2859
     2860Bool TAppDecTop::xAllRefLayersInitilized( Int curLayerId )
     2861{
     2862  Bool allRefLayersInitilizedFlag = true;
     2863  for (Int i = 0; i < m_vps->getNumDirectRefLayers( curLayerId  ); i++ )
     2864  {
     2865    Int refLayerId = m_vps->getIdDirectRefLayer( curLayerId, i );
     2866    allRefLayersInitilizedFlag = allRefLayersInitilizedFlag && m_layerInitilizedFlag[ refLayerId ];
     2867  }
     2868
     2869  return allRefLayersInitilizedFlag;
     2870}
     2871
     2872Void TAppDecTop::xInitFileIO()
     2873{
     2874  m_bitstreamFile.open(m_pchBitstreamFile, ifstream::in | ifstream::binary);
     2875
     2876  if ( !m_bitstreamFile)
     2877  {
     2878    fprintf(stderr, "\nUnable to open bitstream file `%s' for reading\n", m_pchBitstreamFile);
     2879    exit(EXIT_FAILURE);
     2880  }
     2881
     2882  if (!m_outputDecodedSEIMessagesFilename.empty() && m_outputDecodedSEIMessagesFilename!="-")
     2883  {
     2884    m_seiMessageFileStream.open(m_outputDecodedSEIMessagesFilename.c_str(), std::ios::out);
     2885    if (!m_seiMessageFileStream.is_open() || !m_seiMessageFileStream.good())
     2886    {
     2887      fprintf(stderr, "\nUnable to open file `%s' for writing decoded SEI messages\n", m_outputDecodedSEIMessagesFilename.c_str());
     2888      exit(EXIT_FAILURE);
     2889    }
     2890  }
     2891
     2892#if NH_3D
     2893  if( m_pchScaleOffsetFile )
     2894  {
     2895    m_pScaleOffsetFile = ::fopen( m_pchScaleOffsetFile, "wt" );
     2896    if (!m_pScaleOffsetFile)
     2897    {
     2898      fprintf(stderr, "\nUnable to open file `%s' for writing decoded Camera Parameters messages\n", m_pchScaleOffsetFile);
     2899      exit(EXIT_FAILURE);
     2900    }
     2901  }
     2902#endif
     2903}
     2904
     2905Void TAppDecTop::xOpenReconFile( TComPic* curPic )
     2906{
     2907  Int decIdx = xGetDecoderIdx( curPic->getLayerId() );
     2908
     2909  if ( m_pchReconFile && !m_reconOpen[decIdx] )
     2910  {
     2911    const BitDepths &bitDepths= curPic->getPicSym()->getSPS().getBitDepths(); // use bit depths of first reconstructed picture.
     2912    for (UInt channelType = 0; channelType < MAX_NUM_CHANNEL_TYPE; channelType++)
     2913    {
     2914      if (m_outputBitDepth[channelType] == 0)
     2915      {
     2916        m_outputBitDepth[channelType] = bitDepths.recon[channelType];
     2917      }
     2918    }
     2919
     2920    m_tVideoIOYuvReconFile[decIdx]->open( m_pchReconFiles[decIdx], true, m_outputBitDepth, m_outputBitDepth, bitDepths.recon ); // write mode
     2921    m_reconOpen[decIdx] = true;
     2922  }
     2923}
     2924
     2925Void TAppDecTop::xFlushOutput()
     2926{
     2927  Bool repeat = true;
     2928  while ( repeat )
     2929  {
     2930    if( m_decProcCvsg == ANNEX_F )
     2931    {
     2932      TComList<TComAu*> aus = m_dpb.getAusHavingPicsMarkedForOutput();
     2933      if ( !aus.empty() )
     2934      {
     2935        xF13524Bumping( aus );
     2936      }     
     2937      else
     2938      {
     2939        repeat = false;
     2940      }
     2941    }     
     2942    else if( m_decProcCvsg == CLAUSE_8 )
     2943    {
     2944      TComList<TComPic*> picsMarkedForOutput = m_dpb.getSubDpb( 0, false )->getPicsMarkedNeedForOutput();
     2945      if (!picsMarkedForOutput.empty())
     2946      {
     2947        xC524Bumping();
     2948      }
     2949      else
     2950      {
     2951        repeat = false;
     2952      }
     2953    }
     2954  }
     2955}
     2956
     2957Void TAppDecTop::xCropAndOutput( TComPic* curPic )
     2958{
     2959
     2960  if ( m_printPicOutput )
     2961  {
     2962    std::cout << "  Output picture: ";
     2963    curPic->print( 2 );
     2964    std::cout << std::endl;
     2965  }
     2966
     2967  assert( !curPic->getHasGeneratedRefPics() );
     2968  assert( !curPic->getIsGenerated()         );
     2969
     2970  Int decIdx = xGetDecoderIdx( curPic->getLayerId() );
     2971
     2972  if (!m_reconOpen[ decIdx ])
     2973  {
     2974    xOpenReconFile( curPic );
     2975  }
     2976
     2977  if ( m_pchReconFiles[ decIdx ] )
     2978  {
     2979    const Window &conf    = curPic->getConformanceWindow();
     2980    const Window  defDisp = m_respectDefDispWindow ? curPic->getDefDisplayWindow() : Window();
     2981
     2982    assert( conf   .getScaledFlag() );
     2983    assert( defDisp.getScaledFlag() );
     2984
     2985    m_tVideoIOYuvReconFile[decIdx]->write( curPic->getPicYuvRec(),
     2986      m_outputColourSpaceConvert,
     2987      conf.getWindowLeftOffset()   + defDisp.getWindowLeftOffset(),
     2988      conf.getWindowRightOffset()  + defDisp.getWindowRightOffset(),
     2989      conf.getWindowTopOffset()    + defDisp.getWindowTopOffset(),
     2990      conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset(),
     2991#if NH_3D
     2992      m_depth420OutputFlag && curPic->getIsDepth() ? CHROMA_420 : NUM_CHROMA_FORMAT
     2993#else
     2994      NUM_CHROMA_FORMAT
     2995#endif
     2996      , m_bClipOutputVideoToRec709Range);
     2997  }
     2998}
     2999
     3000UInt TAppDecTop::getNumberOfChecksumErrorsDetected() const
     3001{
     3002  UInt numOfChecksumErrors = 0;
     3003  for (Int i = 0; i < m_numDecoders; i++ )
     3004  {
     3005    numOfChecksumErrors += getNumberOfChecksumErrorsDetected( i );
     3006  }
     3007  return numOfChecksumErrors;
    12073008}
    12083009
Note: See TracChangeset for help on using the changeset viewer.