diff --git a/source/Lib/CommonLib/HRD.h b/source/Lib/CommonLib/HRD.h index b236a10b74d690b6f1a7f9bd897328f1c6055fee..290054c3b9fa77fd1fe69013ced09f616ed38553 100644 --- a/source/Lib/CommonLib/HRD.h +++ b/source/Lib/CommonLib/HRD.h @@ -163,6 +163,9 @@ class HRD public: HRD() :m_bufferingPeriodInitialized (false) +#if JVET_Q0818_PT_SEI + , m_pictureTimingAvailable (false) +#endif {}; virtual ~HRD() @@ -179,11 +182,20 @@ public: void setBufferingPeriodSEI(const SEIBufferingPeriod* bp) { bp->copyTo(m_bufferingPeriodSEI); m_bufferingPeriodInitialized = true; } const SEIBufferingPeriod* getBufferingPeriodSEI() const { return m_bufferingPeriodInitialized ? &m_bufferingPeriodSEI : nullptr; } +#if JVET_Q0818_PT_SEI + void setPictureTimingSEI(const SEIPictureTiming* pt) { pt->copyTo(m_pictureTimingSEI); m_pictureTimingAvailable = true; } + const SEIPictureTiming* getPictureTimingSEI() const { return m_pictureTimingAvailable ? &m_pictureTimingSEI : nullptr; } +#endif + protected: HRDParameters m_hrdParams; TimingInfo m_timingInfo; bool m_bufferingPeriodInitialized; SEIBufferingPeriod m_bufferingPeriodSEI; +#if JVET_Q0818_PT_SEI + bool m_pictureTimingAvailable; + SEIPictureTiming m_pictureTimingSEI; +#endif }; #endif //__HRD__ diff --git a/source/Lib/CommonLib/SEI.h b/source/Lib/CommonLib/SEI.h index a214052564b2c582c38f8d2fd461bce7b134ee78..6a70e9d17140ae08553609d299cc61ce7856cad3 100644 --- a/source/Lib/CommonLib/SEI.h +++ b/source/Lib/CommonLib/SEI.h @@ -355,6 +355,9 @@ public: , m_cpbAltTimingInfoPresentFlag (false) , m_cpbDelayOffset (0) , m_dpbDelayOffset (0) +#if JVET_Q0818_PT_SEI + , m_ptDisplayElementalPeriodsMinus1(0) +#endif { ::memset(m_ptSubLayerDelaysPresentFlag, 0, sizeof(m_ptSubLayerDelaysPresentFlag)); ::memset(m_duCommonCpbRemovalDelayMinus1, 0, sizeof(m_duCommonCpbRemovalDelayMinus1)); @@ -383,6 +386,9 @@ public: std::vector<uint32_t> m_cpbAltInitialCpbRemovalOffsetDelta; uint32_t m_cpbDelayOffset; uint32_t m_dpbDelayOffset; +#if JVET_Q0818_PT_SEI + int m_ptDisplayElementalPeriodsMinus1; +#endif }; class SEIDecodingUnitInfo : public SEI diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 648f914518f10fe199f8c765ed5e518f3a9529fb..95b03094ea762df878ac5fc6e1e98557d0a145b5 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -64,6 +64,8 @@ #define JVET_Q0043_RPR_and_Subpics 1 // JVET-Q0043: Disallow for both RPR and subpics to be used together +#define JVET_Q0818_PT_SEI 1 // JVET-Q0818: add display_elemental_periods_minus1 to picture timing SEI message + #define JVET_Q0110_Q0785_CHROMA_BDPCM_420 1 // JVET-Q0110/Q0785: Enable chroma BDPCM for 420, separate contexts for chroma BDPCM and bug-fixes. #define JVET_Q0512_ENC_CHROMA_TS_ACT 1 // JVET-Q0512: encoder-side improvement on enabling chroma transform-skip for ACT diff --git a/source/Lib/DecoderLib/SEIread.cpp b/source/Lib/DecoderLib/SEIread.cpp index f69dff292f77bae5f6b8918a117893ab5d3be481..d37f23cedc8c63d78920da209b46914ffa26c9d3 100644 --- a/source/Lib/DecoderLib/SEIread.cpp +++ b/source/Lib/DecoderLib/SEIread.cpp @@ -169,6 +169,9 @@ void SEIReader::xReadSEImessage(SEIMessages& seis, const NalUnitType nalUnitType SEI *sei = NULL; const SEIBufferingPeriod *bp = NULL; +#if JVET_Q0818_PT_SEI + const SEIPictureTiming *pt = NULL; +#endif if(nalUnitType == NAL_UNIT_PREFIX_SEI) { @@ -206,12 +209,20 @@ void SEIReader::xReadSEImessage(SEIMessages& seis, const NalUnitType nalUnitType { sei = new SEIPictureTiming; xParseSEIPictureTiming((SEIPictureTiming&)*sei, payloadSize, temporalId, *bp, pDecodedMessageOutputStream); +#if JVET_Q0818_PT_SEI + hrd.setPictureTimingSEI( (SEIPictureTiming*) sei ); +#endif } } break; case SEI::FRAME_FIELD_INFO: sei = new SEIFrameFieldInfo; +#if JVET_Q0818_PT_SEI + pt = hrd.getPictureTimingSEI(); + xParseSEIFrameFieldinfo((SEIFrameFieldInfo&) *sei, *pt, payloadSize, pDecodedMessageOutputStream); +#else xParseSEIFrameFieldinfo((SEIFrameFieldInfo&) *sei, payloadSize, pDecodedMessageOutputStream); +#endif break; case SEI::DEPENDENT_RAP_INDICATION: sei = new SEIDependentRAPIndication; @@ -695,9 +706,17 @@ void SEIReader::xParseSEIPictureTiming(SEIPictureTiming& sei, uint32_t payloadSi } } } +#if JVET_Q0818_PT_SEI + sei_read_uvlc( pDecodedMessageOutputStream, symbol, "pt_display_elemental_periods_minus1" ); + sei.m_ptDisplayElementalPeriodsMinus1 = symbol; +#endif } +#if JVET_Q0818_PT_SEI +void SEIReader::xParseSEIFrameFieldinfo(SEIFrameFieldInfo& sei, const SEIPictureTiming& pt, uint32_t payloadSize, std::ostream *pDecodedMessageOutputStream) +#else void SEIReader::xParseSEIFrameFieldinfo(SEIFrameFieldInfo& sei, uint32_t payloadSize, std::ostream *pDecodedMessageOutputStream) +#endif { output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize); @@ -727,6 +746,10 @@ void SEIReader::xParseSEIFrameFieldinfo(SEIFrameFieldInfo& sei, uint32_t payload } sei_read_uvlc( pDecodedMessageOutputStream, symbol, "display_elemental_periods_minus1" ); sei.m_displayElementalPeriodsMinus1 = symbol; +#if JVET_Q0818_PT_SEI + if( pt.m_ptDisplayElementalPeriodsMinus1 != sei.m_displayElementalPeriodsMinus1 ) + msg( WARNING, "Warning: display_elemental_periods_minus1 is different in picture timing and frame field information SEI messages!"); +#endif } sei_read_code( pDecodedMessageOutputStream, 2, symbol, "source_scan_type" ); sei.m_sourceScanType = symbol; diff --git a/source/Lib/DecoderLib/SEIread.h b/source/Lib/DecoderLib/SEIread.h index 50988f70cfb87855d24968517629bfbe2b155f5e..600d6836df6ffc8e0f9fecd7104ad33680cc4ea9 100644 --- a/source/Lib/DecoderLib/SEIread.h +++ b/source/Lib/DecoderLib/SEIread.h @@ -64,7 +64,11 @@ protected: void xParseSEIDecodedPictureHash (SEIDecodedPictureHash& sei, uint32_t payloadSize, std::ostream *pDecodedMessageOutputStream); void xParseSEIBufferingPeriod (SEIBufferingPeriod& sei, uint32_t payloadSize, std::ostream *pDecodedMessageOutputStream); void xParseSEIPictureTiming (SEIPictureTiming& sei, uint32_t payloadSize, const uint32_t temporalId, const SEIBufferingPeriod& bp, std::ostream *pDecodedMessageOutputStream); +#if JVET_Q0818_PT_SEI + void xParseSEIFrameFieldinfo (SEIFrameFieldInfo& sei, const SEIPictureTiming& pt, uint32_t payloadSize, std::ostream *pDecodedMessageOutputStream); +#else void xParseSEIFrameFieldinfo (SEIFrameFieldInfo& sei, uint32_t payloadSize, std::ostream *pDecodedMessageOutputStream); +#endif void xParseSEIDependentRAPIndication (SEIDependentRAPIndication& sei, uint32_t payLoadSize, std::ostream *pDecodedMessageOutputStream); void xParseSEIFramePacking (SEIFramePacking& sei, uint32_t payloadSize, std::ostream *pDecodedMessageOutputStream); void xParseSEIMasteringDisplayColourVolume (SEIMasteringDisplayColourVolume& sei, uint32_t payloadSize, std::ostream *pDecodedMessageOutputStream); diff --git a/source/Lib/EncoderLib/SEIwrite.cpp b/source/Lib/EncoderLib/SEIwrite.cpp index 67f80ebcd343b1ccc0213628b09f410f54269666..cf34d2b0a6e2269fc121bb44b4706441a24ed5a0 100644 --- a/source/Lib/EncoderLib/SEIwrite.cpp +++ b/source/Lib/EncoderLib/SEIwrite.cpp @@ -400,6 +400,9 @@ void SEIWriter::xWriteSEIPictureTiming(const SEIPictureTiming& sei, const SEIBuf } } } +#if JVET_Q0818_PT_SEI + WRITE_UVLC( sei.m_ptDisplayElementalPeriodsMinus1, "pt_display_elemental_periods_minus1" ); +#endif } void SEIWriter::xWriteSEIFrameFieldInfo(const SEIFrameFieldInfo& sei)