diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp index 910fd7d9305261c89b8cd0524bc8f6c7f6f41cfa..108d535e1f5b3cae506bb73795e2f94b2fbea323 100644 --- a/source/Lib/CommonLib/Slice.cpp +++ b/source/Lib/CommonLib/Slice.cpp @@ -205,6 +205,7 @@ void Slice::initSlice() m_tileGroupCcAlfCrEnabledFlag = 0; m_tileGroupCcAlfCbApsId = -1; m_tileGroupCcAlfCrApsId = -1; + m_nuhLayerId = 0; } void Slice::inheritFromPicHeader( PicHeader *picHeader, const PPS *pps, const SPS *sps ) diff --git a/source/Lib/DecoderLib/SEIread.cpp b/source/Lib/DecoderLib/SEIread.cpp index ea60ad99d3b869db29b0165a0b59419a0fa52ddf..7fe22535d163e41a0ec7ee682f2667fe10055f5a 100644 --- a/source/Lib/DecoderLib/SEIread.cpp +++ b/source/Lib/DecoderLib/SEIread.cpp @@ -786,8 +786,8 @@ void SEIReader::xParseSEIBufferingPeriod(SEIBufferingPeriod& sei, uint32_t paylo } #if !JVET_S0181_PROPOSAL2_BUFFERING_PERIOD_CLEANUP sei_read_code( pDecodedMessageOutputStream, 3, code, "bp_max_sub_layers_minus1" ); sei.m_bpMaxSubLayers = code + 1; - sei_read_uvlc( pDecodedMessageOutputStream, code, "bp_cpb_cnt_minus1" ); sei.m_bpCpbCnt = code + 1; #endif + sei_read_uvlc( pDecodedMessageOutputStream, code, "bp_cpb_cnt_minus1" ); sei.m_bpCpbCnt = code + 1; #if JVET_S0181_PROPOSAL1 if (sei.m_bpMaxSubLayers - 1 > 0) { @@ -862,6 +862,10 @@ void SEIReader::xParseSEIPictureTiming(SEIPictureTiming& sei, uint32_t payloadSi #if JVET_S0185_PROPOSAl1_PICTURE_TIMING_CLEANUP sei_read_code( pDecodedMessageOutputStream, bp.m_cpbRemovalDelayLength, symbol, "pt_cpb_removal_delay_minus1[bp_max_sub_layers_minus1]" ); sei.m_auCpbRemovalDelay[bp.m_bpMaxSubLayers - 1] = symbol + 1; + if (bp.m_bpMaxSubLayers == 1) + { + sei.m_ptSubLayerDelaysPresentFlag[0] = true; + } for (int i = temporalId; i < bp.m_bpMaxSubLayers - 1; i++) { sei_read_flag(pDecodedMessageOutputStream, symbol, "pt_sub_layer_delays_present_flag[i]"); @@ -1050,7 +1054,7 @@ void SEIReader::xParseSEIPictureTiming(SEIPictureTiming& sei, uint32_t payloadSi sei.m_duCommonCpbRemovalDelayFlag = symbol; if( sei.m_duCommonCpbRemovalDelayFlag ) { - for( int i = temporalId; i < bp.m_bpMaxSubLayers - 1; i ++ ) + for( int i = temporalId; i <= bp.m_bpMaxSubLayers - 1; i ++ ) { if( sei.m_ptSubLayerDelaysPresentFlag[i] ) { @@ -1065,7 +1069,7 @@ void SEIReader::xParseSEIPictureTiming(SEIPictureTiming& sei, uint32_t payloadSi sei.m_numNalusInDuMinus1[i] = symbol; if( !sei.m_duCommonCpbRemovalDelayFlag && i < sei.m_numDecodingUnitsMinus1 ) { - for( int j = temporalId; j < bp.m_bpMaxSubLayers - 1; j ++ ) + for( int j = temporalId; j <= bp.m_bpMaxSubLayers - 1; j ++ ) { if( sei.m_ptSubLayerDelaysPresentFlag[j] ) { diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp index 135e37d4fd32979a1a18d4c39a2a672451e3d8f5..a9930425829d04e3eea2ab2b00135b4cad7095e3 100644 --- a/source/Lib/EncoderLib/EncGOP.cpp +++ b/source/Lib/EncoderLib/EncGOP.cpp @@ -849,6 +849,10 @@ void EncGOP::xCreatePictureTimingSEI (int IRAPGOPid, SEIMessages& seiMessages, pictureTimingSEI->m_auCpbRemovalDelay[maxNumSubLayers-1] = std::min<int>(std::max<int>(1, m_totalCoded[maxNumSubLayers-1] - m_lastBPSEI[maxNumSubLayers-1]), static_cast<int>(pow(2, static_cast<double>(cpbRemovalDelayLegth)))); // Syntax element signalled as minus, hence the . CHECK( (m_totalCoded[maxNumSubLayers-1] - m_lastBPSEI[maxNumSubLayers-1]) > pow(2, static_cast<double>(cpbRemovalDelayLegth)), " cpbRemovalDelayLegth too small for m_auCpbRemovalDelay[pt_max_sub_layers_minus1] at picture timing SEI " ); const uint32_t temporalId = slice->getTLayer(); + if (maxNumSubLayers == 1) + { + pictureTimingSEI->m_ptSubLayerDelaysPresentFlag[0] = true; + } for( int i = temporalId ; i < maxNumSubLayers - 1 ; i ++ ) { int indexWithinGOP = (m_totalCoded[maxNumSubLayers - 1] - m_lastBPSEI[maxNumSubLayers - 1]) % m_pcCfg->getGOPSize(); diff --git a/source/Lib/EncoderLib/SEIwrite.cpp b/source/Lib/EncoderLib/SEIwrite.cpp index 085fce9de5e058f4709f22fd395caa98a8547c0b..66f8d85f33ebc958717de3a40a7539d44489fc50 100644 --- a/source/Lib/EncoderLib/SEIwrite.cpp +++ b/source/Lib/EncoderLib/SEIwrite.cpp @@ -479,7 +479,7 @@ void SEIWriter::xWriteSEIPictureTiming(const SEIPictureTiming& sei, const SEIBuf WRITE_FLAG( sei.m_duCommonCpbRemovalDelayFlag, "du_commmon_cpb_removal_delay_flag" ); if( sei.m_duCommonCpbRemovalDelayFlag ) { - for( int i = temporalId; i < bp.m_bpMaxSubLayers - 1; i ++ ) + for( int i = temporalId; i <= bp.m_bpMaxSubLayers - 1; i ++ ) { if( sei.m_ptSubLayerDelaysPresentFlag[i] ) WRITE_CODE( sei.m_duCommonCpbRemovalDelayMinus1[i], bp.m_duCpbRemovalDelayIncrementLength, "du_common_cpb_removal_delay_increment_minus1[i]" ); @@ -490,7 +490,7 @@ void SEIWriter::xWriteSEIPictureTiming(const SEIPictureTiming& sei, const SEIBuf WRITE_UVLC( sei.m_numNalusInDuMinus1[i], "num_nalus_in_du_minus1[i]" ); if( !sei.m_duCommonCpbRemovalDelayFlag && i < sei.m_numDecodingUnitsMinus1 ) { - for( int j = temporalId; j < bp.m_bpMaxSubLayers - 1; j ++ ) + for( int j = temporalId; j <= bp.m_bpMaxSubLayers - 1; j ++ ) { if( sei.m_ptSubLayerDelaysPresentFlag[j] ) WRITE_CODE( sei.m_duCpbRemovalDelayMinus1[i * bp.m_bpMaxSubLayers + j], bp.m_duCpbRemovalDelayIncrementLength, "du_cpb_removal_delay_increment_minus1[i][j]" );