Ignore:
Timestamp:
2 Jul 2014, 18:11:25 (10 years ago)
Author:
tech
Message:

Update to HM-14.0

Integration of:

#define H_MV_HLS_8_SYN_Q0041_03 1 #3 Syntax only (HS /Q0041/hybrid scalability) The proposed text was endorsed, with non-editorial open issues considered as follows …: #define H_MV_HLS_7_OTHER_P0187_1 0 (OTHER/P0187/NoOutputOfPriorPicsFlag) #1 Inference of NoOutputOfPriorPicsFlag and proposes to take into account colour format and bit depth for the inference in addition to spatial resolution
#define H_MV_HLS_8_SYN_39_19 1
#39 Syntax only + (PS/Q0165,Q0078/presence of num_add_output_layer_sets) proposal 2. change condition for presence of num_add_output_layer_sets to avoid sending it when there is only one layer set.
#define H_MV_HLS_8_HRD_Q0101_04 1 #4 (HRD /Q0101/Bitstream part buffer) On Bitstream Partition Buffer. Decision (BF/Cleanup): Adopt (sub-proposals 1–11, refined as described).
#define H_MV_HLS_8_PPS_NODOC_NN 1
#NN (PPS /NODOC/reserved flag): Add a flag in PPS for SHVC color gamut scalability
#define H_MV_HLS_8_MIS_Q0177_47 1 #47 (MISC /Q0177/EOS NAL) proposal 2: clarification of description of end of sequence NAL unit
#define H_MV_HLS_8_HRD_Q0182_05 1
#5 (HRD /Q0182/Bitstream part buffer) Decision (BF/Cleanup/Ed): Adopted (such that we use the main proposal for sub-proposal 1, and alternative 1 for sub-proposal 2). + #define H_MV_HLS_8_HRD_Q0182_06 0 #6 (HRD /Q0182/hrd_parameters) Sub-proposal 2 Alternative 1: Clarify that the VPS hrd_parameters( ) syntax structure that applies to the layer set which is associated with the bitstream partition initial arrival time SEI message is used to determine the lengths of the nal_initial_arrival_delay[ i ] and vcl_initial_arrival_delay[ i ] syntax elements. Decision (BF/Cleanup/Ed): Adopted alternative 1 for sub-proposal 2
#define H_MV_HLS_8_SPS_NODOC_48 1
#48 (SPS /NODOC/PPS extension cleanups) Alignment with RExt
#define H_MV_HLS_8_DBP_NODOC_42 1 #42 (DBP /NODOC/sharing) Remove sub-DPB sharing and processes that mark inter-layer reference pictures as "unused for reference"
#define H_MV_HLS_8_RPS_Q0100_36 1
#36 (RPS /Q0100/constraint to semantics) v3, add constraint to RPS semantics
#define H_MV_HLS_8_POC_Q0142_32 1 #32 (POC /Q0142/poc_lsb_not_present_flag) v2: Add semantic constraints to poc_lsb_not_present_flag.
#define H_MV_HLS_8_HRD_Q0102_08 1
#8 (HRD /Q0102/sps_max_dec_pic_buffering_minus1) Sub-proposal 2: A semantics bug fix is proposed for sps_max_dec_pic_buffering_minus1 as a bug-fix. In discussion, the first option was preferred. Decision (BF/Cleanup/Ed.): Adopt.
#define H_MV_HLS_8_MIS_Q0102_30 1 #30 (MISC /Q0102/loop index) proposal 3, change the max loop index for signaling bit rate and pic rate info to MaxSubLayersInLayerSetMinus1
#define H_MV_HLS_8_GEN_Q0108_13 1
#13 (GEN /Q0108/STSA TemporalId) Agreed to remove restriction from proposal 2, to allow STSA pics of non-base layers to have TemporalId equal to 0.
#define H_MV_HLS_8_PMS_Q0195_21 1 #21 (PS /Q0195/constraint update_ref_format_flag) proposal 2: add a semantic constraint on the value of update_ref_format_flag
#define H_MV_HLS_8_PMS_Q0195_20 1
#20 (PS /Q0195/syntax table rep format) proposal 1: restructure syntax table for sending of rep_format_idx_present_flag and vps_num_ref_formats_minus1
#define H_MV_HLS_8_MIS_Q0177_22 1 #22 (MISC /Q0177/inference sps_temporal_id_nesting_flag) proposal 1: modify inference rule for sps_temporal_id_nesting_flag when it is not present
#define H_MV_HLS_8_PMS_Q0165_18 1
#18 (PS /Q0165/disallow an empty layer set) proposal 1.a), add a constraint to disallow an empty layer set
#define H_MV_HLS_8_RPS_Q0060_17 1 #17 (RPS /Q0060/condition refLayerPicIdc) Proposal 2: Add a condition to the derivation of refLayerPicIdc of (TemporalId == 0)
#define H_MV_HLS_8_POC_Q0146_15 1
#15 (POC /Q0146/inference of poc_msb_val_present_flag) Proposal 1.1: Change inference rule in semantics of poc_msb_val_present_flag

File:
1 edited

Legend:

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

    r884 r962  
    7070    m_pScaleOffsetFile  = 0;
    7171#endif
     72
     73#if H_MV_HLS_7_VPS_P0300_27
     74    m_markedForOutput = false;
     75#endif
     76
    7277}
    7378
     
    152157  Bool openedReconFile = false; // reconstruction file not yet opened. (must be performed after SPS is seen)
    153158#else
    154 #if H_3D
     159
    155160  Int  pocCurrPic        = -MAX_INT;     
    156161  Int  pocLastPic        = -MAX_INT;   
    157 #endif
    158 
     162
     163#if H_MV_HLS_7_VPS_P0300_27
     164  Int  layerIdLastPic    = -MAX_INT;
     165#endif
    159166  Int  layerIdCurrPic    = 0;
    160167
     
    188195    Bool newSliceDiffPoc   = false;
    189196    Bool newSliceDiffLayer = false;
    190     Bool sliceSkippedFlag = false;
    191 #if H_3D
     197    Bool sliceSkippedFlag  = false;
    192198    Bool allLayersDecoded  = false;     
    193 #endif
    194199#endif
    195200    if (nalUnit.empty())
     
    210215          || nalu.m_layerId > MAX_NUM_LAYER_IDS-1
    211216          || (nalu.m_nalUnitType == NAL_UNIT_VPS && nalu.m_layerId > 0)           
    212           || (nalu.m_nalUnitType == NAL_UNIT_EOB && nalu.m_layerId > 0)           
     217          || (nalu.m_nalUnitType == NAL_UNIT_EOB && nalu.m_layerId > 0)   
     218#if H_MV_HLS_8_MIS_Q0177_47
     219          || (nalu.m_nalUnitType == NAL_UNIT_EOS && nalu.m_layerId > 0)   
     220#endif
    213221         )
    214222      {
     
    229237        // - nalu.isSlice() == true     
    230238
     239#if H_MV_HLS_7_VPS_P0300_27
     240        if ( nalu.m_nalUnitType == NAL_UNIT_VPS )
     241        {
     242          m_vps = m_tDecTop[decIdx]->getPrefetchedVPS();
     243          if ( m_targetDecLayerIdSetFileEmpty )
     244          {
     245            TComVPS* vps = m_vps;
     246#else
    231247        // Update TargetDecLayerIdList only when not specified by layer id file, specification by file might actually out of conformance.
    232248        if (nalu.m_nalUnitType == NAL_UNIT_VPS && m_targetDecLayerIdSetFileEmpty )
    233249        {
    234250          TComVPS* vps = m_tDecTop[decIdx]->getPrefetchedVPS();
     251#endif
    235252          if ( m_targetOptLayerSetIdx == -1 )
    236253          {
     
    238255            m_targetOptLayerSetIdx = vps->getVpsNumLayerSetsMinus1();
    239256          }
     257#if H_MV_HLS_8_HRD_Q0102_08
     258          for (Int dI = 0; dI < m_numDecoders; dI++ )
     259          {
     260            m_tDecTop[decIdx]->setTargetOptLayerSetIdx( m_targetOptLayerSetIdx );
     261          }
     262#endif
    240263
    241264          if ( m_targetOptLayerSetIdx < 0 || m_targetOptLayerSetIdx >= vps->getNumOutputLayerSets() )
     
    246269          m_targetDecLayerIdSet = vps->getTargetDecLayerIdList( m_targetOptLayerSetIdx );
    247270        }
    248 
     271#if H_MV_HLS_7_VPS_P0300_27
     272      }
     273#endif
    249274#if H_3D
    250275        if (nalu.m_nalUnitType == NAL_UNIT_VPS )
     
    257282        {
    258283          layerIdCurrPic = nalu.m_layerId;
    259 #if H_3D
    260284          pocCurrPic     = m_tDecTop[decIdx]->getCurrPoc();
    261 #endif
    262285          decIdxCurrPic  = decIdx;
    263286          firstSlice     = false;
     
    266289        if ( bNewPicture || !bitstreamFile )
    267290        {
     291#if H_MV_HLS_7_VPS_P0300_27
     292          layerIdLastPic    = layerIdCurrPic;
     293#endif
    268294          layerIdCurrPic    = nalu.m_layerId;
    269 #if H_3D         
    270295          pocLastPic        = pocCurrPic;
    271296          pocCurrPic        = m_tDecTop[decIdx]->getCurrPoc();
    272 #endif         
    273297          decIdxLastPic     = decIdxCurrPic;
    274298          decIdxCurrPic     = decIdx;
    275 #if H_3D
    276299          allLayersDecoded = ( pocCurrPic != pocLastPic );
    277 #endif
    278300        }
    279301#else
     
    318340        assert( decIdxLastPic != -1 );
    319341        m_tDecTop[decIdxLastPic]->endPicDecoding(poc, pcListPic, m_targetDecLayerIdSet );
     342#if H_MV_HLS_7_VPS_P0300_27
     343        xMarkForOutput( allLayersDecoded, poc, layerIdLastPic );
     344#endif
    320345#else
    321346        m_cTDecTop.executeLoopFilters(poc, pcListPic);
     
    324349      loopFiltered = (nalu.m_nalUnitType == NAL_UNIT_EOS);
    325350    }
     351#if !FIX_WRITING_OUTPUT
     352#if SETTING_NO_OUT_PIC_PRIOR
     353    if (bNewPicture && m_cTDecTop.getIsNoOutputPriorPics())
     354    {
     355      m_cTDecTop.checkNoOutputPriorPics( pcListPic );
     356    }
     357#endif
     358#endif
    326359#if H_3D
    327360    if ( allLayersDecoded || !bitstreamFile )
     
    351384        m_reconOpen[decIdxLastPic] = true;
    352385      }
     386#if FIX_WRITING_OUTPUT
     387      // write reconstruction to file
     388      if( bNewPicture )
     389      {
     390        // Bumping after picture has been decoded
     391#if ENC_DEC_TRACE
     392        g_bJustDoIt = true; 
     393        writeToTraceFile( "Bumping after decoding \n", g_decTracePicOutput  );         
     394        g_bJustDoIt = false; 
     395#endif
     396        xWriteOutput( pcListPic, decIdxLastPic, nalu.m_temporalId );
     397      }
     398#if SETTING_NO_OUT_PIC_PRIOR
     399      if ( (bNewPicture || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_CRA) && m_tDecTop[decIdxLastPic]->getNoOutputPriorPicsFlag() )
     400      {
     401        m_tDecTop[decIdxLastPic]->checkNoOutputPriorPics( pcListPic );
     402        m_tDecTop[decIdxLastPic]->setNoOutputPriorPicsFlag (false);
     403      }
     404#endif
     405#endif
    353406      if ( bNewPicture && newSliceDiffPoc &&
    354407#else
     
    356409        openedReconFile  = true;
    357410      }
     411#if FIX_WRITING_OUTPUT
     412      // write reconstruction to file
     413      if( bNewPicture )
     414      {
     415        xWriteOutput( pcListPic, nalu.m_temporalId );
     416      }
     417#if SETTING_NO_OUT_PIC_PRIOR
     418      if ( (bNewPicture || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_CRA) && m_cTDecTop.getNoOutputPriorPicsFlag() )
     419      {
     420        m_cTDecTop.checkNoOutputPriorPics( pcListPic );
     421        m_cTDecTop.setNoOutputPriorPicsFlag (false);
     422      }
     423#endif
     424#endif
    358425      if ( bNewPicture &&
    359426#endif
     
    373440      {
    374441#if H_MV
     442#if FIX_OUTPUT_EOS
     443        xWriteOutput( pcListPic, decIdxLastPic, nalu.m_temporalId );
     444#else
    375445        xFlushOutput( pcListPic, decIdxLastPic );
     446#endif
     447#else
     448#if FIX_OUTPUT_EOS
     449        xWriteOutput( pcListPic, nalu.m_temporalId );
    376450#else
    377451        xFlushOutput( pcListPic );
    378452#endif
    379       }
    380       // write reconstruction to file
     453
     454#endif
     455      }
     456      // write reconstruction to file -- for additional bumping as defined in C.5.2.3
     457#if H_MV
     458      // Above comment seems to be wrong
     459#endif
     460#if FIX_WRITING_OUTPUT
     461      if(!bNewPicture && nalu.m_nalUnitType >= NAL_UNIT_CODED_SLICE_TRAIL_N && nalu.m_nalUnitType <= NAL_UNIT_RESERVED_VCL31)
     462#else
    381463      if(bNewPicture)
    382       {
    383 #if H_MV
    384         xWriteOutput( pcListPic, decIdxLastPic, nalu.m_temporalId );
    385       }
    386     }
    387   }
    388 
     464#endif
     465      {
     466#if H_MV       
     467        // Bumping after reference picture set has been applied (here after first vcl nalu.
     468#if ENC_DEC_TRACE
     469        g_bJustDoIt = true; 
     470        writeToTraceFile( "Bumping after reference picture set has been applied \n", g_decTracePicOutput  );         
     471        g_bJustDoIt = false; 
     472#endif
     473
     474        xWriteOutput( m_tDecTop[decIdxCurrPic]->getListPic(), decIdxCurrPic, nalu.m_temporalId );
     475#else
     476        xWriteOutput( pcListPic, nalu.m_temporalId );
     477#endif
     478      }
     479    }
     480  }
     481#if H_MV
    389482#if H_3D
    390483  if( m_cCamParsCollector.isInitialized() )
     
    397490    xFlushOutput( m_tDecTop[decIdx]->getListPic(), decIdx );
    398491  }
    399 #else
    400         xWriteOutput( pcListPic, nalu.m_temporalId );
    401       }
    402     }
    403   }
    404  
     492#else 
    405493  xFlushOutput( pcListPic );
    406494  // delete buffers
     
    497585  TComList<TComPic*>::iterator iterPic   = pcListPic->begin();
    498586  Int numPicsNotYetDisplayed = 0;
     587  Int dpbFullness = 0;
     588#if H_MV
     589  // preliminary fix
     590  TComSPS* activeSPS = m_tDecTop[0]->getActiveSPS();
     591#else
     592  TComSPS* activeSPS = m_cTDecTop.getActiveSPS();
     593#endif
     594  UInt numReorderPicsHighestTid;
     595  UInt maxDecPicBufferingHighestTid;
     596  UInt maxNrSublayers = activeSPS->getMaxTLayers();
     597
     598  if(m_iMaxTemporalLayer == -1 || m_iMaxTemporalLayer >= maxNrSublayers)
     599  {
     600    numReorderPicsHighestTid = activeSPS->getNumReorderPics(maxNrSublayers-1);
     601    maxDecPicBufferingHighestTid =  activeSPS->getMaxDecPicBuffering(maxNrSublayers-1);
     602  }
     603  else
     604  {
     605    numReorderPicsHighestTid = activeSPS->getNumReorderPics(m_iMaxTemporalLayer);
     606    maxDecPicBufferingHighestTid = activeSPS->getMaxDecPicBuffering(m_iMaxTemporalLayer);
     607  }
    499608 
    500609  while (iterPic != pcListPic->end())
     
    508617    {
    509618      numPicsNotYetDisplayed++;
     619      dpbFullness++;
     620    }
     621    else if(pcPic->getSlice( 0 )->isReferenced())
     622    {
     623      dpbFullness++;
    510624    }
    511625    iterPic++;
     
    533647          && pcPicBottom->getOutputMark() && (numPicsNotYetDisplayed >  pcPicBottom->getNumReorderPics(tId) && (pcPicTop->getPOC() == m_pocLastDisplay[decIdx]+1 || m_pocLastDisplay[decIdx]<0)))
    534648#else
    535       if ( pcPicTop->getOutputMark() && (numPicsNotYetDisplayed >  pcPicTop->getNumReorderPics(tId) && !(pcPicTop->getPOC()%2) && pcPicBottom->getPOC() == pcPicTop->getPOC()+1)
    536           && pcPicBottom->getOutputMark() && (numPicsNotYetDisplayed >  pcPicBottom->getNumReorderPics(tId) && (pcPicTop->getPOC() == m_iPOCLastDisplay+1 || m_iPOCLastDisplay<0)))
     649      if ( pcPicTop->getOutputMark() && pcPicBottom->getOutputMark() &&
     650          (numPicsNotYetDisplayed >  numReorderPicsHighestTid || dpbFullness > maxDecPicBufferingHighestTid) &&
     651          (!(pcPicTop->getPOC()%2) && pcPicBottom->getPOC() == pcPicTop->getPOC()+1) &&
     652          (pcPicTop->getPOC() == m_iPOCLastDisplay+1 || m_iPOCLastDisplay < 0))
    537653#endif
    538654      {
     
    552668        assert( conf   .getScaledFlag() );
    553669        assert( defDisp.getScaledFlag() );
     670#if ENC_DEC_TRACE
     671        g_bJustDoIt = true; 
     672        writeToTraceFile( "OutputPic Poc"   , pcPic->getPOC    (), g_decTracePicOutput  );
     673        writeToTraceFile( "OutputPic LayerId", pcPic->getLayerId(), g_decTracePicOutput );         
     674        g_bJustDoIt = false; 
     675#endif
    554676        m_tVideoIOYuvReconFile[decIdx]->write( pcPicTop->getPicYuvRec(), pcPicBottom->getPicYuvRec(),
    555677#else
     
    613735
    614736#if H_MV
    615       if ( pcPic->getOutputMark() && (numPicsNotYetDisplayed >  pcPic->getNumReorderPics(tId) && pcPic->getPOC() > m_pocLastDisplay[decIdx]))
     737      if(pcPic->getOutputMark() && pcPic->getPOC() > m_pocLastDisplay[decIdx] &&
     738        (numPicsNotYetDisplayed >  numReorderPicsHighestTid || dpbFullness > maxDecPicBufferingHighestTid))
    616739#else     
    617       if ( pcPic->getOutputMark() && (numPicsNotYetDisplayed >  pcPic->getNumReorderPics(tId) && pcPic->getPOC() > m_iPOCLastDisplay))
     740      if(pcPic->getOutputMark() && pcPic->getPOC() > m_iPOCLastDisplay &&
     741        (numPicsNotYetDisplayed >  numReorderPicsHighestTid || dpbFullness > maxDecPicBufferingHighestTid))
    618742#endif
    619743      {
    620744        // write to file
    621745        numPicsNotYetDisplayed--;
     746        if(pcPic->getSlice(0)->isReferenced() == false)
     747        {
     748          dpbFullness--;
     749        }
    622750#if H_MV
    623751      if ( m_pchReconFiles[decIdx] )
     
    631759        assert( conf   .getScaledFlag() );
    632760        assert( defDisp.getScaledFlag() );
     761#if ENC_DEC_TRACE
     762        g_bJustDoIt = true; 
     763        writeToTraceFile( "OutputPic Poc"   , pcPic->getPOC    (), g_decTracePicOutput  );
     764        writeToTraceFile( "OutputPic LayerId", pcPic->getLayerId(), g_decTracePicOutput );         
     765        g_bJustDoIt = false;
     766#endif
    633767        m_tVideoIOYuvReconFile[decIdx]->write( pcPic->getPicYuvRec(),
    634768#else
     
    665799        }
    666800        pcPic->setOutputMark(false);
     801#if H_MV_HLS_7_VPS_P0300_27
     802        pcPic->setPicOutputFlag(false);
     803#endif
    667804      }
    668805     
     
    715852        assert( conf   .getScaledFlag() );
    716853        assert( defDisp.getScaledFlag() );
     854#if ENC_DEC_TRACE
     855        g_bJustDoIt = true; 
     856        writeToTraceFile( "OutputPic Poc"   , pcPic->getPOC    (), g_decTracePicOutput  );
     857        writeToTraceFile( "OutputPic LayerId", pcPic->getLayerId(), g_decTracePicOutput );         
     858        g_bJustDoIt = false; 
     859#endif
    717860        m_tVideoIOYuvReconFile[decIdx]->write( pcPicTop->getPicYuvRec(), pcPicBottom->getPicYuvRec(),
    718861#else
     
    802945        assert( conf   .getScaledFlag() );
    803946        assert( defDisp.getScaledFlag() );
     947#if ENC_DEC_TRACE
     948        g_bJustDoIt = true; 
     949        writeToTraceFile( "OutputPic Poc"   , pcPic->getPOC    (), g_decTracePicOutput  );
     950        writeToTraceFile( "OutputPic LayerId", pcPic->getLayerId(), g_decTracePicOutput );         
     951        g_bJustDoIt = false; 
     952#endif
    804953        m_tVideoIOYuvReconFile[decIdx]->write( pcPic->getPicYuvRec(),
    805954#else
     
    836985        }
    837986        pcPic->setOutputMark(false);
     987#if H_MV_HLS_7_VPS_P0300_27
     988        pcPic->setPicOutputFlag(false);
     989#endif
    838990      }
    839991#if !H_MV
     
    9091061    m_tDecTop[ decIdx ]->setIvPicLists( &m_ivPicLists );
    9101062    m_tDecTop[ decIdx ]->setLayerInitilizedFlags( m_layerInitilizedFlags );
     1063#if    H_MV_HLS_8_HRD_Q0102_08
     1064    m_tDecTop[ decIdx ]->setTargetOptLayerSetIdx( m_targetOptLayerSetIdx );   
     1065#endif
    9111066
    9121067#if H_3D
     
    9411096  };
    9421097  return decIdx;
     1098
    9431099}
     1100
     1101
     1102#if H_MV_HLS_7_VPS_P0300_27
     1103Void TAppDecTop::xMarkForOutput( Bool allLayersDecoded, Int pocLastPic, Int layerIdLastPic )
     1104
     1105  vector<Int> targetOptLayerIdList = m_vps->getTargetOptLayerIdList( m_targetOptLayerSetIdx );
     1106
     1107  if (m_vps->getAltOutputLayerFlagVar( m_targetOptLayerSetIdx ) )
     1108  {
     1109    assert( targetOptLayerIdList.size() == 1 );
     1110    Int targetLayerId = targetOptLayerIdList[0];     
     1111
     1112    TComPic* curPic = m_ivPicLists.getPic( layerIdLastPic, pocLastPic );
     1113    assert( curPic != NULL );
     1114
     1115    if ( layerIdLastPic == targetLayerId )
     1116    {
     1117      if ( curPic->getPicOutputFlag() )
     1118      {
     1119        curPic->setOutputMark( true );
     1120      }
     1121      else
     1122      {       
     1123        xMarkAltOutPic( targetLayerId, pocLastPic );
     1124      }
     1125      m_markedForOutput = true;
     1126    }
     1127    else if ( ( layerIdLastPic > targetLayerId || allLayersDecoded ) && !m_markedForOutput )
     1128    {
     1129      xMarkAltOutPic( targetLayerId, pocLastPic );
     1130    }
     1131
     1132    if ( allLayersDecoded )
     1133    {
     1134      m_markedForOutput = false;
     1135    }
     1136  }
     1137  else
     1138  {
     1139    for( Int dI = 0; dI < m_numDecoders; dI++ )
     1140    {     
     1141      Int layerId = m_tDecTop[dI]->getLayerId();
     1142      TComPic* curPic = m_ivPicLists.getPic( layerId, pocLastPic );
     1143      if ( curPic != NULL )
     1144      {
     1145        if ( curPic->getReconMark() )
     1146        {
     1147          Bool isTargetOptLayer = std::find(targetOptLayerIdList.begin(), targetOptLayerIdList.end(), layerId) != targetOptLayerIdList.end();
     1148          curPic->setOutputMark( isTargetOptLayer ? curPic->getPicOutputFlag() : false );
     1149        }
     1150      }
     1151    }
     1152  }
     1153}
     1154#endif
    9441155#endif
    9451156//! \}
Note: See TracChangeset for help on using the changeset viewer.