diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp index 27e5483bd175579b9367a2e71bc9eb96c7450082..fe59551b3ad03e17642afd88c18c43220488ec49 100644 --- a/source/Lib/DecoderLib/DecLib.cpp +++ b/source/Lib/DecoderLib/DecLib.cpp @@ -428,6 +428,8 @@ bool tryDecodePicture( Picture* pcEncPic, const int expectedPoc, const std::stri DecLib::DecLib() : m_iMaxRefPicNum(0) + , m_isFirstGeneralHrd(true) + , m_prevGeneralHrdParams() , m_associatedIRAPType(NAL_UNIT_INVALID) #if JVET_P0978_RPL_RESTRICTIONS , m_associatedIRAPDecodingOrderNumber(0) @@ -1447,7 +1449,47 @@ void DecLib::xActivateParameterSets( const int layerId ) } xCheckParameterSetConstraints(layerId); } +void DecLib::xCheckGeneralHrdParametersIdentical(const GeneralHrdParams* generalHrdParams1, const GeneralHrdParams* generalHrdParams2) +{ + bool isIdentical = true; + if ((generalHrdParams1->getNumUnitsInTick() != generalHrdParams2->getNumUnitsInTick()) + || (generalHrdParams1->getTimeScale() != generalHrdParams2->getTimeScale()) + || (generalHrdParams1->getGeneralNalHrdParametersPresentFlag() != generalHrdParams2->getGeneralNalHrdParametersPresentFlag()) + || (generalHrdParams1->getGeneralVclHrdParametersPresentFlag() != generalHrdParams2->getGeneralVclHrdParametersPresentFlag()) + || (generalHrdParams1->getGeneralSamPicTimingInAllOlsFlag() != generalHrdParams2->getGeneralSamPicTimingInAllOlsFlag()) + || (generalHrdParams1->getGeneralDecodingUnitHrdParamsPresentFlag() != generalHrdParams2->getGeneralDecodingUnitHrdParamsPresentFlag()) + || (generalHrdParams1->getGeneralDecodingUnitHrdParamsPresentFlag()?(generalHrdParams1->getTickDivisorMinus2() != generalHrdParams2->getTickDivisorMinus2()):0) + || (generalHrdParams1->getBitRateScale() != generalHrdParams2->getBitRateScale()) + || (generalHrdParams1->getCpbSizeScale() != generalHrdParams2->getCpbSizeScale()) + || (generalHrdParams1->getGeneralDecodingUnitHrdParamsPresentFlag() ? (generalHrdParams1->getCpbSizeDuScale() != generalHrdParams2->getCpbSizeDuScale()):0) + || (generalHrdParams1->getHrdCpbCntMinus1() != generalHrdParams2->getHrdCpbCntMinus1()) + ) + { + isIdentical = false; + } + CHECK(!isIdentical, "It is a requirement of bitstream conformance that the content of the general_hrd_parameters( ) syntax structure present in any VPSs or SPSs in the bitstream shall be identical"); +} +void DecLib::xCopyGeneralHrdParameters(GeneralHrdParams* generalHrdParamsDst, const GeneralHrdParams* generalHrdParamsSrc) +{ + generalHrdParamsDst->setNumUnitsInTick(generalHrdParamsSrc->getNumUnitsInTick()); + generalHrdParamsDst->setTimeScale(generalHrdParamsSrc->getTimeScale()); + generalHrdParamsDst->setGeneralNalHrdParametersPresentFlag(generalHrdParamsSrc->getGeneralNalHrdParametersPresentFlag()); + generalHrdParamsDst->setGeneralVclHrdParametersPresentFlag(generalHrdParamsSrc->getGeneralVclHrdParametersPresentFlag()); + generalHrdParamsDst->setGeneralSamPicTimingInAllOlsFlag(generalHrdParamsSrc->getGeneralSamPicTimingInAllOlsFlag()); + generalHrdParamsDst->setGeneralDecodingUnitHrdParamsPresentFlag(generalHrdParamsSrc->getGeneralDecodingUnitHrdParamsPresentFlag()); + if (generalHrdParamsDst->getGeneralDecodingUnitHrdParamsPresentFlag()) + { + generalHrdParamsDst->setTickDivisorMinus2(generalHrdParamsSrc->getTickDivisorMinus2()); + } + generalHrdParamsDst->setBitRateScale(generalHrdParamsSrc->getBitRateScale()); + generalHrdParamsDst->setCpbSizeScale(generalHrdParamsSrc->getCpbSizeScale()); + if (generalHrdParamsDst->getGeneralDecodingUnitHrdParamsPresentFlag()) + { + generalHrdParamsDst->setCpbSizeDuScale(generalHrdParamsSrc->getCpbSizeDuScale()); + } + generalHrdParamsDst->setHrdCpbCntMinus1(generalHrdParamsSrc->getHrdCpbCntMinus1()); +} void DecLib::xCheckParameterSetConstraints(const int layerId) { // Conformance checks @@ -1457,7 +1499,22 @@ void DecLib::xCheckParameterSetConstraints(const int layerId) #if JVET_Q0814_DPB const VPS *vps = slice->getVPS(); #endif - + if (((vps!=nullptr)&&(vps->getVPSGeneralHrdParamsPresentFlag()))||(sps->getGeneralHrdParametersPresentFlag())) + { + if (((vps != nullptr) && (vps->getVPSGeneralHrdParamsPresentFlag())) && (sps->getGeneralHrdParametersPresentFlag())) + { + xCheckGeneralHrdParametersIdentical(vps->getGeneralHrdParameters(),sps->getGeneralHrdParameters()); + } + if (m_isFirstGeneralHrd) + { + xCopyGeneralHrdParameters(&m_prevGeneralHrdParams, sps->getGeneralHrdParametersPresentFlag() ? sps->getGeneralHrdParameters() : vps->getGeneralHrdParameters()); + } + else + { + xCheckGeneralHrdParametersIdentical(&m_prevGeneralHrdParams, sps->getGeneralHrdParametersPresentFlag() ? sps->getGeneralHrdParameters() : vps->getGeneralHrdParameters()); + } + } + m_isFirstGeneralHrd = false; #if SPS_ID_CHECK static std::unordered_map<int, int> m_clvssSPSid; diff --git a/source/Lib/DecoderLib/DecLib.h b/source/Lib/DecoderLib/DecLib.h index c9cc7f40e0785f8ba306a1f54afb18be81718b56..79088fead1635704e45da393c27341671e0e625c 100644 --- a/source/Lib/DecoderLib/DecLib.h +++ b/source/Lib/DecoderLib/DecLib.h @@ -69,6 +69,8 @@ class DecLib { private: int m_iMaxRefPicNum; + bool m_isFirstGeneralHrd; + GeneralHrdParams m_prevGeneralHrdParams; NalUnitType m_associatedIRAPType; ///< NAL unit type of the associated IRAP picture #if JVET_P0978_RPL_RESTRICTIONS @@ -274,6 +276,8 @@ protected: void xCreateUnavailablePicture(int iUnavailablePoc, bool longTermFlag, const int layerId, const bool interLayerRefPicFlag); void xActivateParameterSets( const int layerId ); void xCheckParameterSetConstraints( const int layerId ); + void xCheckGeneralHrdParametersIdentical(const GeneralHrdParams* generalHrdParams1, const GeneralHrdParams* generalHrdParams2); + void xCopyGeneralHrdParameters(GeneralHrdParams* generalHrdParamsDst, const GeneralHrdParams* generalHrdParamsSrc); void xDecodePicHeader( InputNALUnit& nalu ); bool xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDisplay); void xDecodeVPS( InputNALUnit& nalu ); diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index c2fc987af58a328e328326f3b4482998063659ff..418ff1c382e1d3b5246fa7b7007146b8f4e997b1 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -282,10 +282,6 @@ void FDReader::parseFillerData(InputBitstream* bs, uint32_t &fdSize) // ==================================================================================================================== HLSyntaxReader::HLSyntaxReader() -#if JVET_P0118_HRD_ASPECTS - : m_isFirstGeneralHrd(true) - , m_prevGeneralHrdParams(NULL) -#endif { } @@ -1335,32 +1331,6 @@ void HLSyntaxReader::parseGeneralHrdParameters(GeneralHrdParams *hrd) } READ_UVLC(symbol, "hrd_cpb_cnt_minus1"); hrd->setHrdCpbCntMinus1(symbol); CHECK(symbol > 31,"The value of hrd_cpb_cnt_minus1 shall be in the range of 0 to 31, inclusive"); - if (!m_isFirstGeneralHrd) - { - checkGeneralHrdParametersIdentical(hrd); - } - m_prevGeneralHrdParams = hrd; - m_isFirstGeneralHrd = false; -} -void HLSyntaxReader::checkGeneralHrdParametersIdentical(GeneralHrdParams *generalHrd) -{ - bool isIdentical = true; - if ( (generalHrd->getNumUnitsInTick()!= m_prevGeneralHrdParams->getNumUnitsInTick()) - || (generalHrd->getTimeScale()!= m_prevGeneralHrdParams->getTimeScale()) - || (generalHrd->getGeneralNalHrdParametersPresentFlag()!= m_prevGeneralHrdParams->getGeneralNalHrdParametersPresentFlag()) - || (generalHrd->getGeneralVclHrdParametersPresentFlag()!= m_prevGeneralHrdParams->getGeneralVclHrdParametersPresentFlag()) - || (generalHrd->getGeneralSamPicTimingInAllOlsFlag()!= m_prevGeneralHrdParams->getGeneralSamPicTimingInAllOlsFlag()) - || (generalHrd->getGeneralDecodingUnitHrdParamsPresentFlag()!= m_prevGeneralHrdParams->getGeneralDecodingUnitHrdParamsPresentFlag()) - || (generalHrd->getTickDivisorMinus2()!= m_prevGeneralHrdParams->getTickDivisorMinus2()) - || (generalHrd->getBitRateScale()!= m_prevGeneralHrdParams->getBitRateScale()) - || (generalHrd->getCpbSizeScale()!= m_prevGeneralHrdParams->getCpbSizeScale()) - || (generalHrd->getCpbSizeDuScale()!= m_prevGeneralHrdParams->getCpbSizeDuScale()) - || (generalHrd->getHrdCpbCntMinus1()!= m_prevGeneralHrdParams->getHrdCpbCntMinus1()) - ) - { - isIdentical = false; - } - CHECK(!isIdentical, "It is a requirement of bitstream conformance that the content of the general_hrd_parameters( ) syntax structure present in any VPSs or SPSs in the bitstream shall be identical"); } #endif #if JVET_P0118_HRD_ASPECTS diff --git a/source/Lib/DecoderLib/VLCReader.h b/source/Lib/DecoderLib/VLCReader.h index 53be7eb0b49b89dd2fa9eec94ebedd5ead9a9716..c51828fc9bd0f71da47e9c65c335e5742d671592 100644 --- a/source/Lib/DecoderLib/VLCReader.h +++ b/source/Lib/DecoderLib/VLCReader.h @@ -146,11 +146,6 @@ public: class HLSyntaxReader : public VLCReader { -#if JVET_P0118_HRD_ASPECTS -private: - bool m_isFirstGeneralHrd; - GeneralHrdParams* m_prevGeneralHrdParams; -#endif public: HLSyntaxReader(); virtual ~HLSyntaxReader(); @@ -181,7 +176,6 @@ public: void parseProfileTierLevel ( ProfileTierLevel *ptl, int maxNumSubLayersMinus1); #endif #if JVET_P0118_HRD_ASPECTS - void checkGeneralHrdParametersIdentical(GeneralHrdParams *generalHr); void parseOlsHrdParameters(GeneralHrdParams* generalHrd, OlsHrdParams *olsHrd, uint32_t firstSubLayer, uint32_t tempLevelHigh); #else void parseHrdParameters ( HRDParameters *hrd, uint32_t firstSubLayer, uint32_t tempLevelHigh );