Changeset 1317 in 3DVCSoftware for branches/HTM-15.0-dev0/source/App/TAppDecoder/TAppDecTop.cpp
- Timestamp:
- 4 Sep 2015, 21:28:58 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HTM-15.0-dev0/source/App/TAppDecoder/TAppDecTop.cpp
r1313 r1317 64 64 { 65 65 #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; 71 94 #endif 72 95 #if NH_3D 73 m_pScaleOffsetFile = 0;96 m_pScaleOffsetFile = 0; 74 97 #endif 75 98 } 99 100 Void TAppDecTop::create() 101 { 76 102 #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 } 78 110 #endif 79 80 } 81 82 Void TAppDecTop::create() 83 { 111 #endif 84 112 } 85 113 … … 115 143 { 116 144 free (m_pchScaleOffsetFile); 117 m_pchScaleOffsetFile = NULL; 145 m_pchScaleOffsetFile = NULL; 118 146 } 119 147 #endif … … 132 160 . 133 161 */ 162 163 #if NH_MV 134 164 Void TAppDecTop::decode() 135 165 { 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 223 Void TAppDecTop::decode() 224 { 136 225 Int poc; 137 #if NH_MV138 poc = -1;139 #endif140 226 TComList<TComPic*>* pcListPic = NULL; 141 227 … … 146 232 exit(EXIT_FAILURE); 147 233 } 148 #if NH_3D149 if( m_pchScaleOffsetFile )150 {151 m_pScaleOffsetFile = ::fopen( m_pchScaleOffsetFile, "wt" );152 AOF( m_pScaleOffsetFile );153 }154 #endif155 234 156 235 InputByteStream bytestream(bitstreamFile); … … 169 248 xCreateDecLib(); 170 249 xInitDecLib (); 171 #if !NH_MV 250 172 251 m_iPOCLastDisplay += m_iSkipFrame; // set the last displayed POC correctly for skip forward. 173 252 174 253 // main decoder loop 175 254 Bool openedReconFile = false; // reconstruction file not yet opened. (must be performed after SPS is seen) 176 #else177 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 #endif189 255 Bool loopFiltered = false; 190 256 … … 201 267 streampos location = bitstreamFile.tellg(); 202 268 #endif 203 #if NH_MV204 #if ENC_DEC_TRACE205 Int64 symCount = g_nSymbolCounter;206 #endif207 #endif208 269 AnnexBStats stats = AnnexBStats(); 209 270 … … 213 274 // call actual decoding function 214 275 Bool bNewPicture = false; 215 #if NH_MV216 Bool newSliceDiffPoc = false;217 Bool newSliceDiffLayer = false;218 Bool sliceSkippedFlag = false;219 Bool allLayersDecoded = false;220 #endif221 276 if (nalu.getBitstream().getFifo().empty()) 222 277 { … … 231 286 { 232 287 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) ) 240 290 { 241 291 bNewPicture = false; 242 if ( !bitstreamFile )243 {244 decIdxLastPic = decIdxCurrPic;245 }246 292 } 247 293 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 true253 // - poc in particular layer changes254 // - nalu does not belong to first slice in layer255 // - nalu.isSlice() == true256 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 OLS266 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 else274 {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 #else306 if( (m_iMaxTemporalLayer >= 0 && nalu.m_temporalId > m_iMaxTemporalLayer) || !isNaluWithinTargetDecLayerIdSet(&nalu) )307 {308 bNewPicture = false;309 }310 else311 294 { 312 295 bNewPicture = m_cTDecTop.decode(nalu, m_iSkipFrame, m_iPOCLastDisplay); 313 #endif314 296 if (bNewPicture) 315 297 { … … 327 309 bytestream.reset(); 328 310 #endif 329 #if H_MV_ENC_DEC_TRAC330 #if ENC_DEC_TRACE331 const Bool resetCounter = false;332 if ( resetCounter )333 {334 g_nSymbolCounter = symCount; // Only reset counter SH becomes traced twice335 }336 else337 {338 g_disableHLSTrace = true; // Tracing of second parsing of SH is not carried out339 }340 #endif341 #endif342 311 } 343 312 } … … 345 314 346 315 if ( (bNewPicture || !bitstreamFile || nalu.m_nalUnitType == NAL_UNIT_EOS) && 347 #if NH_MV 348 !m_tDecTop[decIdxLastPic]->getFirstSliceInSequence () ) 349 #else 316 350 317 !m_cTDecTop.getFirstSliceInSequence () ) 351 #endif352 318 353 319 { 354 320 if (!loopFiltered || bitstreamFile) 355 321 { 356 #if NH_MV357 assert( decIdxLastPic != -1 );358 m_tDecTop[decIdxLastPic]->endPicDecoding(poc, pcListPic, m_targetDecLayerIdSet );359 xMarkForOutput( allLayersDecoded, poc, layerIdLastPic );360 #else361 322 m_cTDecTop.executeLoopFilters(poc, pcListPic); 362 #endif363 323 } 364 324 loopFiltered = (nalu.m_nalUnitType == NAL_UNIT_EOS); 365 325 if (nalu.m_nalUnitType == NAL_UNIT_EOS) 366 326 { 367 #if NH_MV368 m_tDecTop[decIdxLastPic]->setFirstSliceInSequence(true);369 #else370 327 m_cTDecTop.setFirstSliceInSequence(true); 371 #endif372 328 } 373 329 } 374 330 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 { 384 333 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 } 399 335 400 336 if( pcListPic ) 401 337 { 402 #if NH_MV403 if ( m_pchReconFiles[decIdxLastPic] && !m_reconOpen[decIdxLastPic] )404 #else405 338 if ( m_pchReconFile && !openedReconFile ) 406 #endif407 339 { 408 340 const BitDepths &bitDepths=pcListPic->front()->getPicSym()->getSPS().getBitDepths(); // use bit depths of first reconstructed picture. … … 414 346 } 415 347 } 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; 419 350 } 420 351 // write reconstruction to file 421 352 if( bNewPicture ) 422 353 { 423 // Bumping after picture has been decoded424 #if ENC_DEC_TRACE425 g_bJustDoIt = true;426 writeToTraceFile( "Bumping after decoding \n", g_decTracePicOutput );427 g_bJustDoIt = false;428 #endif429 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 #else439 m_cTVideoIOYuvReconFile.open( m_pchReconFile, true, m_outputBitDepth, m_outputBitDepth, bitDepths.recon ); // write mode440 openedReconFile = true;441 }442 // write reconstruction to file443 if( bNewPicture )444 {445 354 xWriteOutput( pcListPic, nalu.m_temporalId ); 446 355 } … … 452 361 453 362 if ( bNewPicture && 454 #endif455 363 ( nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_IDR_W_RADL 456 364 || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_IDR_N_LP … … 459 367 || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_BLA_W_LP ) ) 460 368 { 461 #if NH_MV 462 xFlushOutput( pcListPic, decIdxLastPic ); 463 #else 369 464 370 xFlushOutput( pcListPic ); 465 #endif466 371 } 467 372 if (nalu.m_nalUnitType == NAL_UNIT_EOS) 468 373 { 469 #if NH_MV 470 xWriteOutput( pcListPic, decIdxCurrPic, nalu.m_temporalId ); 471 #else 374 472 375 xWriteOutput( pcListPic, nalu.m_temporalId ); 473 #endif474 #if NH_MV475 m_tDecTop[decIdxCurrPic]->setFirstSliceInPicture (false);476 #else477 376 m_cTDecTop.setFirstSliceInPicture (false); 478 #endif479 377 } 480 378 // write reconstruction to file -- for additional bumping as defined in C.5.2.3 481 #if NH_MV482 // Above comment seems to be wrong483 #endif484 379 if(!bNewPicture && nalu.m_nalUnitType >= NAL_UNIT_CODED_SLICE_TRAIL_N && nalu.m_nalUnitType <= NAL_UNIT_RESERVED_VCL31) 485 380 { 486 #if NH_MV487 // Bumping after reference picture set has been applied (here after first vcl nalu.488 #if ENC_DEC_TRACE489 g_bJustDoIt = true;490 writeToTraceFile( "Bumping after reference picture set has been applied \n", g_decTracePicOutput );491 g_bJustDoIt = false;492 #endif493 494 xWriteOutput( m_tDecTop[decIdxCurrPic]->getListPic(), decIdxCurrPic, nalu.m_temporalId );495 #else496 381 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 513 386 xFlushOutput( pcListPic ); 514 387 // delete buffers … … 516 389 // destroy internal classes 517 390 xDestroyDecLib(); 391 } 518 392 #endif 519 }520 393 521 394 // ==================================================================================================================== … … 527 400 #if NH_MV 528 401 // initialize global variables 529 initROM(); 402 initROM(); 530 403 #if NH_3D_DMM 531 404 initWedgeLists(); … … 548 421 { 549 422 m_tVideoIOYuvReconFile[decIdx]->close(); 550 delete m_tVideoIOYuvReconFile[decIdx]; 423 delete m_tVideoIOYuvReconFile[decIdx]; 551 424 m_tVideoIOYuvReconFile[decIdx] = NULL ; 552 425 } … … 554 427 if( m_tDecTop[decIdx] ) 555 428 { 429 #if !NH_MV 556 430 m_tDecTop[decIdx]->deletePicBuffer(); 431 #endif 557 432 m_tDecTop[decIdx]->destroy() ; 558 433 } 559 delete m_tDecTop[decIdx] ; 434 delete m_tDecTop[decIdx] ; 560 435 m_tDecTop[decIdx] = NULL ; 561 436 } … … 571 446 #if NH_3D 572 447 m_cCamParsCollector.uninit(); 573 if( m_pScaleOffsetFile ) 574 { 575 ::fclose( m_pScaleOffsetFile ); 448 if( m_pScaleOffsetFile ) 449 { 450 ::fclose( m_pScaleOffsetFile ); 576 451 } 577 452 #endif … … 584 459 m_cCamParsCollector.setCodeScaleOffsetFile( m_pScaleOffsetFile ); 585 460 #endif 586 #if !NH_MV 461 #if NH_MV 462 m_dpb.setPrintPicOutput(m_printPicOutput); 463 #else 587 464 // initialize decoder class 588 465 m_cTDecTop.init(); … … 599 476 } 600 477 478 479 #if !NH_MV 601 480 /** \param pcListPic list of pictures to be written to file 602 481 \param tId temporal sub-layer ID 603 482 */ 604 #if NH_MV605 Void TAppDecTop::xWriteOutput( TComList<TComPic*>* pcListPic, Int decIdx, Int tId )606 #else607 483 Void TAppDecTop::xWriteOutput( TComList<TComPic*>* pcListPic, UInt tId ) 608 #endif609 484 { 610 485 if (pcListPic->empty()) … … 625 500 { 626 501 numReorderPicsHighestTid = activeSPS->getNumReorderPics(maxNrSublayers-1); 627 maxDecPicBufferingHighestTid = activeSPS->getMaxDecPicBuffering(maxNrSublayers-1); 502 maxDecPicBufferingHighestTid = activeSPS->getMaxDecPicBuffering(maxNrSublayers-1); 628 503 } 629 504 else 630 505 { 631 506 numReorderPicsHighestTid = activeSPS->getNumReorderPics(m_iMaxTemporalLayer); 632 maxDecPicBufferingHighestTid = activeSPS->getMaxDecPicBuffering(m_iMaxTemporalLayer); 507 maxDecPicBufferingHighestTid = activeSPS->getMaxDecPicBuffering(m_iMaxTemporalLayer); 633 508 } 634 509 … … 636 511 { 637 512 TComPic* pcPic = *(iterPic); 638 #if NH_MV639 if(pcPic->getOutputMark() && pcPic->getPOC() > m_pocLastDisplay[decIdx])640 #else641 513 if(pcPic->getOutputMark() && pcPic->getPOC() > m_iPOCLastDisplay) 642 #endif643 514 { 644 515 numPicsNotYetDisplayed++; … … 671 542 TComPic* pcPicBottom = *(iterPic); 672 543 673 #if NH_MV674 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 #else679 544 if ( pcPicTop->getOutputMark() && pcPicBottom->getOutputMark() && 680 545 (numPicsNotYetDisplayed > numReorderPicsHighestTid || dpbFullness > maxDecPicBufferingHighestTid) && 681 546 (!(pcPicTop->getPOC()%2) && pcPicBottom->getPOC() == pcPicTop->getPOC()+1) && 682 547 (pcPicTop->getPOC() == m_iPOCLastDisplay+1 || m_iPOCLastDisplay < 0)) 683 #endif684 548 { 685 549 // write to file 686 550 numPicsNotYetDisplayed = numPicsNotYetDisplayed-2; 687 #if NH_MV688 if ( m_pchReconFiles[decIdx] )689 #else690 551 if ( m_pchReconFile ) 691 #endif692 552 { 693 553 const Window &conf = pcPicTop->getConformanceWindow(); … … 708 568 if (display) 709 569 { 710 #if NH_MV711 assert( conf .getScaledFlag() );712 assert( defDisp.getScaledFlag() );713 #if ENC_DEC_TRACE714 g_bJustDoIt = true;715 writeToTraceFile( "OutputPic Poc" , pcPic->getPOC (), g_decTracePicOutput );716 writeToTraceFile( "OutputPic LayerId", pcPic->getLayerId(), g_decTracePicOutput );717 g_bJustDoIt = false;718 #endif719 m_tVideoIOYuvReconFile[decIdx]->write( pcPicTop->getPicYuvRec(), pcPicBottom->getPicYuvRec(),720 #else721 570 m_cTVideoIOYuvReconFile.write( pcPicTop->getPicYuvRec(), pcPicBottom->getPicYuvRec(), 722 #endif723 571 m_outputColourSpaceConvert, 724 572 conf.getWindowLeftOffset() + defDisp.getWindowLeftOffset(), 725 573 conf.getWindowRightOffset() + defDisp.getWindowRightOffset(), 726 574 conf.getWindowTopOffset() + defDisp.getWindowTopOffset(), 727 #if NH_3D728 conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset(), m_depth420OutputFlag && pcPicTop->getIsDepth() ? CHROMA_420 : NUM_CHROMA_FORMAT, isTff );729 #else730 575 conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset(), NUM_CHROMA_FORMAT, isTff ); 731 #endif732 576 } 733 577 } 734 578 735 579 // update POC of display order 736 #if NH_MV737 m_pocLastDisplay[decIdx] = pcPic->getPOC();738 #else739 580 m_iPOCLastDisplay = pcPicBottom->getPOC(); 740 #endif741 581 742 582 // erase non-referenced picture in the reference picture list after display … … 768 608 pcPic = *(iterPic); 769 609 770 #if NH_MV771 if(pcPic->getOutputMark() && pcPic->getPOC() > m_pocLastDisplay[decIdx] &&772 (numPicsNotYetDisplayed > numReorderPicsHighestTid || dpbFullness > maxDecPicBufferingHighestTid))773 #else774 610 if(pcPic->getOutputMark() && pcPic->getPOC() > m_iPOCLastDisplay && 775 611 (numPicsNotYetDisplayed > numReorderPicsHighestTid || dpbFullness > maxDecPicBufferingHighestTid)) 776 #endif777 612 { 778 613 // write to file … … 782 617 dpbFullness--; 783 618 } 784 #if NH_MV785 if ( m_pchReconFiles[decIdx] )786 #else787 619 if ( m_pchReconFile ) 788 #endif789 620 { 790 621 const Window &conf = pcPic->getConformanceWindow(); 791 622 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 803 624 m_cTVideoIOYuvReconFile.write( pcPic->getPicYuvRec(), 804 #endif805 625 m_outputColourSpaceConvert, 806 626 conf.getWindowLeftOffset() + defDisp.getWindowLeftOffset(), 807 627 conf.getWindowRightOffset() + defDisp.getWindowRightOffset(), 808 628 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 ); 816 631 } 817 632 818 633 // update POC of display order 819 #if NH_MV820 m_pocLastDisplay[decIdx] = pcPic->getPOC();821 #else822 634 m_iPOCLastDisplay = pcPic->getPOC(); 823 #endif824 635 825 636 // erase non-referenced picture in the reference picture list after display … … 832 643 } 833 644 pcPic->setOutputMark(false); 834 #if NH_MV835 pcPic->setPicOutputFlag(false);836 #endif837 645 } 838 646 … … 844 652 /** \param pcListPic list of pictures to be written to file 845 653 */ 846 #if NH_MV847 Void TAppDecTop::xFlushOutput( TComList<TComPic*>* pcListPic, Int decIdx )848 #else849 654 Void TAppDecTop::xFlushOutput( TComList<TComPic*>* pcListPic ) 850 #endif851 655 { 852 656 if(!pcListPic || pcListPic->empty()) … … 873 677 { 874 678 // write to file 875 #if NH_MV 876 if ( m_pchReconFiles[decIdx] ) 877 #else 679 878 680 if ( m_pchReconFile ) 879 #endif880 681 { 881 682 const Window &conf = pcPicTop->getConformanceWindow(); 882 683 const Window defDisp = m_respectDefDispWindow ? pcPicTop->getDefDisplayWindow() : Window(); 883 684 const Bool isTff = pcPicTop->isTopField(); 884 #if NH_MV885 assert( conf .getScaledFlag() );886 assert( defDisp.getScaledFlag() );887 #if ENC_DEC_TRACE888 g_bJustDoIt = true;889 writeToTraceFile( "OutputPic Poc" , pcPic->getPOC (), g_decTracePicOutput );890 writeToTraceFile( "OutputPic LayerId", pcPic->getLayerId(), g_decTracePicOutput );891 g_bJustDoIt = false;892 #endif893 m_tVideoIOYuvReconFile[decIdx]->write( pcPicTop->getPicYuvRec(), pcPicBottom->getPicYuvRec(),894 #else895 685 m_cTVideoIOYuvReconFile.write( pcPicTop->getPicYuvRec(), pcPicBottom->getPicYuvRec(), 896 #endif897 686 m_outputColourSpaceConvert, 898 687 conf.getWindowLeftOffset() + defDisp.getWindowLeftOffset(), 899 688 conf.getWindowRightOffset() + defDisp.getWindowRightOffset(), 900 689 conf.getWindowTopOffset() + defDisp.getWindowTopOffset(), 901 #if NH_3D902 conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset(), m_depth420OutputFlag && pcPicTop->getIsDepth() ? CHROMA_420 : NUM_CHROMA_FORMAT, isTff );903 #else904 690 conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset(), NUM_CHROMA_FORMAT, isTff ); 905 #endif906 691 } 907 692 908 693 // update POC of display order 909 #if NH_MV910 m_pocLastDisplay[decIdx] = pcPic->getPOC();911 #else912 694 m_iPOCLastDisplay = pcPicBottom->getPOC(); 913 #endif 695 914 696 // erase non-referenced picture in the reference picture list after display 915 697 if ( !pcPicTop->getSlice(0)->isReferenced() && pcPicTop->getReconMark() == true ) … … 954 736 { 955 737 // write to file 956 #if NH_MV957 if ( m_pchReconFiles[decIdx] )958 #else959 738 if ( m_pchReconFile ) 960 #endif961 739 { 962 740 const Window &conf = pcPic->getConformanceWindow(); 963 741 const Window defDisp = m_respectDefDispWindow ? pcPic->getDefDisplayWindow() : Window(); 964 #if NH_MV965 assert( conf .getScaledFlag() );966 assert( defDisp.getScaledFlag() );967 #if ENC_DEC_TRACE968 g_bJustDoIt = true;969 writeToTraceFile( "OutputPic Poc" , pcPic->getPOC (), g_decTracePicOutput );970 writeToTraceFile( "OutputPic LayerId", pcPic->getLayerId(), g_decTracePicOutput );971 g_bJustDoIt = false;972 #endif973 m_tVideoIOYuvReconFile[decIdx]->write( pcPic->getPicYuvRec(),974 #else975 742 m_cTVideoIOYuvReconFile.write( pcPic->getPicYuvRec(), 976 #endif977 743 m_outputColourSpaceConvert, 978 744 conf.getWindowLeftOffset() + defDisp.getWindowLeftOffset(), 979 745 conf.getWindowRightOffset() + defDisp.getWindowRightOffset(), 980 746 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 ); 988 749 } 989 750 990 751 // update POC of display order 991 #if NH_MV992 m_pocLastDisplay[decIdx] = pcPic->getPOC();993 #else994 752 m_iPOCLastDisplay = pcPic->getPOC(); 995 #endif996 997 753 // erase non-referenced picture in the reference picture list after display 998 754 if ( !pcPic->getSlice(0)->isReferenced() && pcPic->getReconMark() == true ) … … 1004 760 } 1005 761 pcPic->setOutputMark(false); 1006 #if NH_MV 1007 pcPic->setPicOutputFlag(false); 1008 #endif 1009 } 1010 #if !NH_MV 762 } 1011 763 if(pcPic != NULL) 1012 764 { … … 1015 767 pcPic = NULL; 1016 768 } 1017 #endif1018 769 iterPic++; 1019 770 } 1020 771 } 1021 #if NH_MV1022 m_pocLastDisplay[decIdx] = -MAX_INT;1023 #else1024 772 pcListPic->clear(); 1025 773 m_iPOCLastDisplay = -MAX_INT; 774 } 1026 775 #endif 1027 }1028 1029 776 /** \param nalu Input nalu to check whether its LayerId is within targetDecLayerIdSet 1030 777 */ 778 #if NH_MV 779 Bool TAppDecTop::xIsNaluInTargetDecLayerIdSet( InputNALUnit* nalu ) 780 #else 1031 781 Bool TAppDecTop::isNaluWithinTargetDecLayerIdSet( InputNALUnit* nalu ) 782 #endif 1032 783 { 1033 784 if ( m_targetDecLayerIdSet.size() == 0 ) // By default, the set is empty, meaning all LayerIds are allowed … … 1037 788 for (std::vector<Int>::iterator it = m_targetDecLayerIdSet.begin(); it != m_targetDecLayerIdSet.end(); it++) 1038 789 { 790 if ( nalu->m_nuhLayerId == (*it) ) 791 { 792 return true; 793 } 794 } 795 return false; 796 } 797 1039 798 #if NH_MV 1040 if ( nalu->m_nuhLayerId == (*it) ) 1041 #else 1042 if ( nalu->m_nuhLayerId == (*it) ) 799 800 Bool 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 932 Void 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 958 Bool 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 1023 Void 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 } 1032 Void 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 } 1043 1042 #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 1052 Void 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 1135 Void TAppDecTop::xDecodeFollowSliceOfPicture( InputNALUnit nalu ) 1136 { 1137 // decode following segment 1138 TDecTop* dec = xGetDecoder( nalu ); 1139 dec->activatePSsAndInitPicOrSlice( NULL ); 1140 dec->decodeSliceSegment ( nalu ); 1141 } 1142 1143 Void 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 1172 Void 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 1192 Void 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 1210 Void 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 1243 Void 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 1269 Void 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 1314 Void 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 1382 Void 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 1499 Void 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 1612 Void 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 1693 Void 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 1722 Void 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 2176 Void 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 2197 Void 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 2225 Void 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 2445 Void 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 2528 Void 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 2570 Void 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 2621 TDecTop* TAppDecTop::xGetDecoder( InputNALUnit& nalu ) 2622 { 2623 return m_tDecTop[ xGetDecoderIdx( nalu.m_nuhLayerId )]; 2624 } 2625 2626 1052 2627 Int TAppDecTop::xGetDecoderIdx( Int layerId, Bool createFlag /*= false */ ) 1053 2628 { 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 ]; 1064 2639 } 1065 2640 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; 1071 2646 1072 2647 // Init decoder … … 1076 2651 m_tDecTop[ decIdx ]->setLayerId( layerId ); 1077 2652 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 1081 2660 #if O0043_BEST_EFFORT_DECODING 1082 2661 m_cTDecTop[ decIdx ]->setForceDecodeBitDepth(m_forceDecodeBitDepth); … … 1091 2670 #endif 1092 2671 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 1098 2675 Char* pchTempFilename = NULL; 1099 2676 if ( m_pchReconFile ) 1100 { 1101 Char buffer[4]; 2677 { 2678 Char buffer[4]; 1102 2679 sprintf(buffer,"_%i", layerId ); 1103 assert ( m_pchReconFile ); 2680 assert ( m_pchReconFile ); 1104 2681 xAppendToFileNameEnd( m_pchReconFile , buffer, pchTempFilename ); 1105 2682 assert( m_pchReconFiles.size() == m_numDecoders ); 1106 2683 } 1107 2684 1108 m_pchReconFiles.push_back( pchTempFilename ); 2685 m_pchReconFiles.push_back( pchTempFilename ); 1109 2686 1110 2687 m_tVideoIOYuvReconFile[ decIdx ] = new TVideoIOYuv; 1111 2688 m_reconOpen [ decIdx ] = false; 1112 2689 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++; 1118 2694 }; 1119 2695 return decIdx; … … 1121 2697 } 1122 2698 1123 Void TAppDecTop::xMarkForOutput( Bool allLayersDecoded, Int pocLastPic, Int layerIdLastPic)2699 Int TAppDecTop::xPreDecodePoc( InputNALUnit& nalu ) 1124 2700 { 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 2764 Bool 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(); 1140 2790 } 1141 2791 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 2822 Void 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; 1156 2841 } 1157 2842 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 2860 Bool 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 2872 Void 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 2905 Void 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 2925 Void 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 2957 Void 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 3000 UInt 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; 1207 3008 } 1208 3009
Note: See TracChangeset for help on using the changeset viewer.