diff --git a/source/Lib/CommonLib/SEI.cpp b/source/Lib/CommonLib/SEI.cpp index ce9faa4a14c43d67e028634537cea8ec80ce5d32..6b3d7148b72f3d0557e1cc7f643b314b4ed89de6 100644 --- a/source/Lib/CommonLib/SEI.cpp +++ b/source/Lib/CommonLib/SEI.cpp @@ -141,10 +141,21 @@ void SEIPictureTiming::copyTo (SEIPictureTiming& target) const target.m_numNalusInDuMinus1 = m_numNalusInDuMinus1; target.m_duCpbRemovalDelayMinus1 = m_duCpbRemovalDelayMinus1; target.m_cpbAltTimingInfoPresentFlag = m_cpbAltTimingInfoPresentFlag; +#if JVET_R0413_HRD_TIMING_INFORMATION + target.m_nalCpbAltInitialRemovalDelayDelta = m_nalCpbAltInitialRemovalDelayDelta; + target.m_nalCpbAltInitialRemovalOffsetDelta = m_nalCpbAltInitialRemovalOffsetDelta; + target.m_nalCpbDelayOffset = m_nalCpbDelayOffset; + target.m_nalCpbDelayOffset = m_nalCpbDelayOffset; + target.m_vclCpbAltInitialRemovalDelayDelta = m_vclCpbAltInitialRemovalDelayDelta; + target.m_vclCpbAltInitialRemovalOffsetDelta = m_vclCpbAltInitialRemovalOffsetDelta; + target.m_vclCpbDelayOffset = m_vclCpbDelayOffset; + target.m_vclCpbDelayOffset = m_vclCpbDelayOffset; +#else target.m_cpbAltInitialCpbRemovalDelayDelta = m_cpbAltInitialCpbRemovalDelayDelta; target.m_cpbAltInitialCpbRemovalOffsetDelta = m_cpbAltInitialCpbRemovalOffsetDelta; target.m_cpbDelayOffset = m_cpbDelayOffset; target.m_dpbDelayOffset = m_dpbDelayOffset; +#endif } // Static member diff --git a/source/Lib/CommonLib/SEI.h b/source/Lib/CommonLib/SEI.h index d51f7ccde4870090151343a99b7ce07485fbbd1d..90451739bea8673b2993244fb9e0c0791c6bd19b 100644 --- a/source/Lib/CommonLib/SEI.h +++ b/source/Lib/CommonLib/SEI.h @@ -367,10 +367,21 @@ public: std::vector<uint32_t> m_numNalusInDuMinus1; std::vector<uint32_t> m_duCpbRemovalDelayMinus1; bool m_cpbAltTimingInfoPresentFlag; +#if JVET_R0413_HRD_TIMING_INFORMATION + std::vector<std::vector<uint32_t>> m_nalCpbAltInitialRemovalDelayDelta; + std::vector<std::vector<uint32_t>> m_nalCpbAltInitialRemovalOffsetDelta; + std::vector<uint32_t> m_nalCpbDelayOffset; + std::vector<uint32_t> m_nalDpbDelayOffset; + std::vector<std::vector<uint32_t>> m_vclCpbAltInitialRemovalDelayDelta; + std::vector<std::vector<uint32_t>> m_vclCpbAltInitialRemovalOffsetDelta; + std::vector<uint32_t> m_vclCpbDelayOffset; + std::vector<uint32_t> m_vclDpbDelayOffset; +#else std::vector<std::vector<uint32_t>> m_cpbAltInitialCpbRemovalDelayDelta; std::vector<std::vector<uint32_t>> m_cpbAltInitialCpbRemovalOffsetDelta; std::vector<uint32_t> m_cpbDelayOffset; std::vector<uint32_t> m_dpbDelayOffset; +#endif int m_ptDisplayElementalPeriodsMinus1; }; diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index e0efc55a8f48527ed37dd694b10e2cc0079116dd..161aae603acf2f45e4e2ce39df15f43dd1a26a90 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -163,6 +163,8 @@ #define JVET_R0100 1 // JVET-R0100: Proposal 1 DUI Signalling and inference +#define JVET_R0413_HRD_TIMING_INFORMATION 1 // JVET-R0413: HRD timing parameters signalling + //########### place macros to be be kept below this line ############### #define JVET_R0164_MEAN_SCALED_SATD 1 // JVET-R0164: Use a mean scaled version of SATD in encoder decisions diff --git a/source/Lib/DecoderLib/SEIread.cpp b/source/Lib/DecoderLib/SEIread.cpp index 87a52a4df00a23f73c3493b993a9276075e6b677..65056ae9fdf13c03c878e5a5aac42c6e7aeb8090 100644 --- a/source/Lib/DecoderLib/SEIread.cpp +++ b/source/Lib/DecoderLib/SEIread.cpp @@ -713,6 +713,61 @@ void SEIReader::xParseSEIPictureTiming(SEIPictureTiming& sei, uint32_t payloadSi sei_read_flag( pDecodedMessageOutputStream, symbol, "cpb_alt_timing_info_present_flag" ); sei.m_cpbAltTimingInfoPresentFlag = symbol; if( sei.m_cpbAltTimingInfoPresentFlag ) { +#if JVET_R0413_HRD_TIMING_INFORMATION + if (bp.m_bpNalCpbParamsPresentFlag) + { + sei.m_nalCpbAltInitialRemovalDelayDelta.resize(bp.m_bpMaxSubLayers); + sei.m_nalCpbAltInitialRemovalOffsetDelta.resize(bp.m_bpMaxSubLayers); + sei.m_nalCpbDelayOffset.resize(bp.m_bpMaxSubLayers); + sei.m_nalDpbDelayOffset.resize(bp.m_bpMaxSubLayers); + for (int i = (bp.m_sublayerInitialCpbRemovalDelayPresentFlag ? 0 : bp.m_bpMaxSubLayers - 1); + i <= bp.m_bpMaxSubLayers - 1; ++i) + { + sei.m_nalCpbAltInitialRemovalDelayDelta[i].resize(bp.m_bpCpbCnt); + sei.m_nalCpbAltInitialRemovalOffsetDelta[i].resize(bp.m_bpCpbCnt); + for (int j = 0; j < bp.m_bpCpbCnt; j++) + { + sei_read_code(pDecodedMessageOutputStream, bp.m_initialCpbRemovalDelayLength, symbol, + "nal_cpb_alt_initial_cpb_removal_delay_delta[ i ][ j ]"); + sei.m_nalCpbAltInitialRemovalDelayDelta[i][j] = symbol; + sei_read_code(pDecodedMessageOutputStream, bp.m_initialCpbRemovalDelayLength, symbol, + "nal_cpb_alt_initial_cpb_removal_offset_delta[ i ][ j ]"); + sei.m_nalCpbAltInitialRemovalOffsetDelta[i][j] = symbol; + } + sei_read_code(pDecodedMessageOutputStream, bp.m_initialCpbRemovalDelayLength, sei.m_nalCpbDelayOffset[i], + "nal_cpb_delay_offset[ i ]"); + sei_read_code(pDecodedMessageOutputStream, bp.m_initialCpbRemovalDelayLength, sei.m_nalDpbDelayOffset[i], + "nal_dpb_delay_offset[ i ]"); + } + } + + if (bp.m_bpVclCpbParamsPresentFlag) + { + sei.m_vclCpbAltInitialRemovalDelayDelta.resize(bp.m_bpMaxSubLayers); + sei.m_vclCpbAltInitialRemovalOffsetDelta.resize(bp.m_bpMaxSubLayers); + sei.m_vclCpbDelayOffset.resize(bp.m_bpMaxSubLayers); + sei.m_vclDpbDelayOffset.resize(bp.m_bpMaxSubLayers); + for (int i = (bp.m_sublayerInitialCpbRemovalDelayPresentFlag ? 0 : bp.m_bpMaxSubLayers - 1); + i <= bp.m_bpMaxSubLayers - 1; ++i) + { + sei.m_vclCpbAltInitialRemovalDelayDelta[i].resize(bp.m_bpCpbCnt); + sei.m_vclCpbAltInitialRemovalOffsetDelta[i].resize(bp.m_bpCpbCnt); + for (int j = 0; j < bp.m_bpCpbCnt; j++) + { + sei_read_code(pDecodedMessageOutputStream, bp.m_initialCpbRemovalDelayLength, symbol, + "vcl_cpb_alt_initial_cpb_removal_delay_delta[ i ][ j ]"); + sei.m_vclCpbAltInitialRemovalDelayDelta[i][j] = symbol; + sei_read_code(pDecodedMessageOutputStream, bp.m_initialCpbRemovalDelayLength, symbol, + "vcl_cpb_alt_initial_cpb_removal_offset_delta[ i ][ j ]"); + sei.m_vclCpbAltInitialRemovalOffsetDelta[i][j] = symbol; + } + sei_read_code(pDecodedMessageOutputStream, bp.m_initialCpbRemovalDelayLength, sei.m_vclCpbDelayOffset[i], + "vcl_cpb_delay_offset[ i ]"); + sei_read_code(pDecodedMessageOutputStream, bp.m_initialCpbRemovalDelayLength, sei.m_vclDpbDelayOffset[i], + "vcl_dpb_delay_offset[ i ]"); + } + } +#else sei.m_cpbAltInitialCpbRemovalDelayDelta.resize(bp.m_bpMaxSubLayers); sei.m_cpbAltInitialCpbRemovalOffsetDelta.resize(bp.m_bpMaxSubLayers); sei.m_cpbDelayOffset.resize(bp.m_bpMaxSubLayers); @@ -736,13 +791,38 @@ void SEIReader::xParseSEIPictureTiming(SEIPictureTiming& sei, uint32_t payloadSi sei_read_code(pDecodedMessageOutputStream, bp.m_initialCpbRemovalDelayLength, sei.m_dpbDelayOffset[i], "dpb_delay_offset[ i ]"); } +#endif } } else { sei.m_cpbAltTimingInfoPresentFlag = false; +#if JVET_R0413_HRD_TIMING_INFORMATION + sei.m_nalCpbAltInitialRemovalDelayDelta.resize(bp.m_bpMaxSubLayers); + sei.m_nalCpbAltInitialRemovalOffsetDelta.resize(bp.m_bpMaxSubLayers); + sei.m_nalCpbDelayOffset.resize(bp.m_bpMaxSubLayers, 0); + sei.m_nalDpbDelayOffset.resize(bp.m_bpMaxSubLayers, 0); + for (int i = (bp.m_sublayerInitialCpbRemovalDelayPresentFlag ? 0 : bp.m_bpMaxSubLayers - 1); + i <= bp.m_bpMaxSubLayers - 1; ++i) + { + sei.m_nalCpbAltInitialRemovalDelayDelta[i].resize(bp.m_bpCpbCnt, 0); + sei.m_nalCpbAltInitialRemovalOffsetDelta[i].resize(bp.m_bpCpbCnt, 0); + } + + sei.m_vclCpbAltInitialRemovalDelayDelta.resize(bp.m_bpMaxSubLayers); + sei.m_vclCpbAltInitialRemovalOffsetDelta.resize(bp.m_bpMaxSubLayers); + sei.m_vclCpbDelayOffset.resize(bp.m_bpMaxSubLayers, 0); + sei.m_vclDpbDelayOffset.resize(bp.m_bpMaxSubLayers, 0); + for (int i = (bp.m_sublayerInitialCpbRemovalDelayPresentFlag ? 0 : bp.m_bpMaxSubLayers - 1); + i <= bp.m_bpMaxSubLayers - 1; ++i) + { + sei.m_vclCpbAltInitialRemovalDelayDelta[i].resize(bp.m_bpCpbCnt, 0); + sei.m_vclCpbAltInitialRemovalOffsetDelta[i].resize(bp.m_bpCpbCnt, 0); + } +#else sei.m_cpbDelayOffset.resize(bp.m_bpMaxSubLayers, 0); sei.m_dpbDelayOffset.resize(bp.m_bpMaxSubLayers, 0); +#endif } for( int i = temporalId; i < bp.m_bpMaxSubLayers - 1; i ++ ) diff --git a/source/Lib/EncoderLib/SEIwrite.cpp b/source/Lib/EncoderLib/SEIwrite.cpp index 5e05748a22f384cd15a03eab89fad8a0a36df8d5..09ae4a7696d49394101f92ef2f40137abb2a3a9f 100644 --- a/source/Lib/EncoderLib/SEIwrite.cpp +++ b/source/Lib/EncoderLib/SEIwrite.cpp @@ -354,6 +354,40 @@ void SEIWriter::xWriteSEIPictureTiming(const SEIPictureTiming& sei, const SEIBuf WRITE_FLAG( sei.m_cpbAltTimingInfoPresentFlag, "cpb_alt_timing_info_present_flag" ); if( sei.m_cpbAltTimingInfoPresentFlag ) { +#if JVET_R0413_HRD_TIMING_INFORMATION + if (bp.m_bpNalCpbParamsPresentFlag) + { + for (int i = (bp.m_sublayerInitialCpbRemovalDelayPresentFlag ? 0 : bp.m_bpMaxSubLayers - 1); i <= bp.m_bpMaxSubLayers - 1; ++i) + { + for (int j = 0; j < bp.m_bpCpbCnt; j++) + { + WRITE_CODE(sei.m_nalCpbAltInitialRemovalDelayDelta[i][j], bp.m_initialCpbRemovalDelayLength, + "nal_cpb_alt_initial_cpb_removal_delay_delta[ i ][ j ]"); + WRITE_CODE(sei.m_nalCpbAltInitialRemovalOffsetDelta[i][j], bp.m_initialCpbRemovalDelayLength, + "nal_cpb_alt_initial_cpb_removal_offset_delta[ i ][ j ]"); + } + WRITE_CODE(sei.m_nalCpbDelayOffset[i], bp.m_initialCpbRemovalDelayLength, "nal_cpb_delay_offset[ i ]"); + WRITE_CODE(sei.m_nalDpbDelayOffset[i], bp.m_initialCpbRemovalDelayLength, "nal_dpb_delay_offset[ i ]"); + } + } + + if (bp.m_bpVclCpbParamsPresentFlag) + { + for (int i = (bp.m_sublayerInitialCpbRemovalDelayPresentFlag ? 0 : bp.m_bpMaxSubLayers - 1); + i <= bp.m_bpMaxSubLayers - 1; ++i) + { + for (int j = 0; j < bp.m_bpCpbCnt; j++) + { + WRITE_CODE(sei.m_vclCpbAltInitialRemovalDelayDelta[i][j], bp.m_initialCpbRemovalDelayLength, + "vcl_cpb_alt_initial_cpb_removal_delay_delta[ i ][ j ]"); + WRITE_CODE(sei.m_vclCpbAltInitialRemovalOffsetDelta[i][j], bp.m_initialCpbRemovalDelayLength, + "vcl_cpb_alt_initial_cpb_removal_offset_delta[ i ][ j ]"); + } + WRITE_CODE(sei.m_vclCpbDelayOffset[i], bp.m_initialCpbRemovalDelayLength, "vcl_cpb_delay_offset[ i ]"); + WRITE_CODE(sei.m_vclDpbDelayOffset[i], bp.m_initialCpbRemovalDelayLength, "vcl_dpb_delay_offset[ i ]"); + } + } +#else for (int i = (bp.m_sublayerInitialCpbRemovalDelayPresentFlag ? 0 : bp.m_bpMaxSubLayers - 1); i <= bp.m_bpMaxSubLayers - 1; ++i) { @@ -367,6 +401,7 @@ void SEIWriter::xWriteSEIPictureTiming(const SEIPictureTiming& sei, const SEIBuf WRITE_CODE(sei.m_cpbDelayOffset[i], bp.m_initialCpbRemovalDelayLength, "cpb_delay_offset[ i ]"); WRITE_CODE(sei.m_dpbDelayOffset[i], bp.m_initialCpbRemovalDelayLength, "dpb_delay_offset[ i ]"); } +#endif } } for( int i = temporalId; i < bp.m_bpMaxSubLayers - 1; i ++ )