diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 8e8ba404fae310ec42c0262e2b7c72cb0e8f57b1..e3bd268c9aabbbc64568cb2a9ba20600a18be462 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -282,6 +282,8 @@ #define JVET_N0865_SYNTAX 1 // JVET_N0865 syntax elements +#define RPL_IN_IDR_FIX 1 // JVET_N0865 syntax elements + #define EMULATION_PREVENTION_FIX 1 // fix for start code emulation reported in #270. Diverges from specification text #define HEVC_SEI 0 // SEI messages that are defined in HEVC, but not in VVC diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index 223537e4c5027baea632771c8d80c1dd5d90ce17..b9ac08087227d2af516205bd37652c07ace239b4 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -1877,6 +1877,63 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, ParameterSetManager *para // read colour_plane_id // (separate_colour_plane_flag == 1) is not supported in this version of the standard. +#if RPL_IN_IDR_FIX + READ_CODE(sps->getBitsForPOC(), uiCode, "slice_pic_order_cnt_lsb"); + if (pcSlice->getIdrPicFlag()) + pcSlice->setPOC(uiCode); + else + { + int iPOClsb = uiCode; + int iPrevPOC = prevTid0POC; + int iMaxPOClsb = 1 << sps->getBitsForPOC(); + int iPrevPOClsb = iPrevPOC & (iMaxPOClsb - 1); + int iPrevPOCmsb = iPrevPOC - iPrevPOClsb; + int iPOCmsb; + if ((iPOClsb < iPrevPOClsb) && ((iPrevPOClsb - iPOClsb) >= (iMaxPOClsb / 2))) + { + iPOCmsb = iPrevPOCmsb + iMaxPOClsb; + } + else if ((iPOClsb > iPrevPOClsb) && ((iPOClsb - iPrevPOClsb) > (iMaxPOClsb / 2))) + { + iPOCmsb = iPrevPOCmsb - iMaxPOClsb; + } + else + { + iPOCmsb = iPrevPOCmsb; + } + pcSlice->setPOC(iPOCmsb + iPOClsb); + } + +#if JVET_N0865_SYNTAX + if (pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_GRA) + { + READ_UVLC(uiCode, "recovery_poc_cnt"); + int maxPicOrderCntLsb = (int)pow(2, pcSlice->getSPS()->getBitsForPOC()); + CHECK(uiCode < maxPicOrderCntLsb, "recovery_poc_cnt > MaxPicOrderCntLsb ? 1"); + pcSlice->setRecoveryPocCnt(uiCode); + pcSlice->setRpPicOrderCntVal(pcSlice->getPOC() + pcSlice->getRecoveryPocCnt()); + } + if (pcSlice->getRapPicFlag() || (pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_GRA)) + { + READ_FLAG(uiCode, "no_output_of_prior_pics_flag"); + pcSlice->setNoOutputPriorPicsFlag(uiCode); + } + if (pps->getOutputFlagPresentFlag()) + { + READ_FLAG(uiCode, "pic_output_flag"); + pcSlice->setPicOutputFlag(uiCode ? true : false); + } + else + { + pcSlice->setPicOutputFlag(true); + } +#endif +#endif + +#if RPL_IN_IDR_FIX + if ( !pcSlice->getIdrPicFlag() || sps->getIDRRefParamListPresent() ) + { +#else if( pcSlice->getIdrPicFlag() && !(sps->getIDRRefParamListPresent())) { READ_CODE(sps->getBitsForPOC(), uiCode, "slice_pic_order_cnt_lsb"); @@ -1961,7 +2018,7 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, ParameterSetManager *para pcSlice->setPicOutputFlag(true); } #endif - +#endif //Read L0 related syntax elements if (sps->getNumRPL0() > 0) {