diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp index fa5b2144dbe759f7aee61caef0c8a65321f172b3..c221aecc902dfaa8c2b6fb7da63b580c20073ba7 100644 --- a/source/Lib/DecoderLib/DecLib.cpp +++ b/source/Lib/DecoderLib/DecLib.cpp @@ -1976,6 +1976,23 @@ void DecLib::xParsePrefixSEImessages() delete m_prefixSEINALUs.front(); m_prefixSEINALUs.pop_front(); } + xCheckPrefixSEIMessages(m_SEIs); +} + +void DecLib::xCheckPrefixSEIMessages( SEIMessages& prefixSEIs ) +{ + SEIMessages picTimingSEIs = getSeisByType(prefixSEIs, SEI::PICTURE_TIMING); + SEIMessages frameFieldSEIs = getSeisByType(prefixSEIs, SEI::FRAME_FIELD_INFO); + + if (!picTimingSEIs.empty() && !frameFieldSEIs.empty()) + { + SEIPictureTiming *pt = (SEIPictureTiming*) picTimingSEIs.front(); + SEIFrameFieldInfo *ff = (SEIFrameFieldInfo*) frameFieldSEIs.front(); + if( pt->m_ptDisplayElementalPeriodsMinus1 != ff->m_displayElementalPeriodsMinus1 ) + { + msg( WARNING, "Warning: ffi_display_elemental_periods_minus1 is different in picture timing and frame field information SEI messages!"); + } + } } void DecLib::xDecodePicHeader( InputNALUnit& nalu ) diff --git a/source/Lib/DecoderLib/DecLib.h b/source/Lib/DecoderLib/DecLib.h index b1ad6bb88e1f28ea9eb76b50f934c15ed87df3d8..bb15b81eb4c2ef735348d6532529936d1b47122a 100644 --- a/source/Lib/DecoderLib/DecLib.h +++ b/source/Lib/DecoderLib/DecLib.h @@ -320,6 +320,7 @@ protected: } void xParsePrefixSEImessages(); void xParsePrefixSEIsForUnknownVCLNal(); + void xCheckPrefixSEIMessages( SEIMessages& prefixSEIs ); void xCheckNalUnitConstraintFlags( const ConstraintInfo *cInfo, uint32_t naluType ); void xCheckMixedNalUnit(Slice* pcSlice, SPS *sps, InputNALUnit &nalu); diff --git a/source/Lib/DecoderLib/SEIread.cpp b/source/Lib/DecoderLib/SEIread.cpp index 31c07db509dbfa36e2036b21548988dcf9a29939..d5c99310226fc2102819f292a30981e16988617c 100644 --- a/source/Lib/DecoderLib/SEIread.cpp +++ b/source/Lib/DecoderLib/SEIread.cpp @@ -177,7 +177,6 @@ void SEIReader::xReadSEImessage(SEIMessages& seis, const NalUnitType nalUnitType SEI *sei = NULL; const SEIBufferingPeriod *bp = NULL; - const SEIPictureTiming *pt = NULL; if(nalUnitType == NAL_UNIT_PREFIX_SEI) { @@ -225,8 +224,7 @@ void SEIReader::xReadSEImessage(SEIMessages& seis, const NalUnitType nalUnitType break; case SEI::FRAME_FIELD_INFO: sei = new SEIFrameFieldInfo; - pt = hrd.getPictureTimingSEI(); - xParseSEIFrameFieldinfo((SEIFrameFieldInfo&) *sei, *pt, payloadSize, pDecodedMessageOutputStream); + xParseSEIFrameFieldinfo((SEIFrameFieldInfo&) *sei, payloadSize, pDecodedMessageOutputStream); break; case SEI::DEPENDENT_RAP_INDICATION: sei = new SEIDependentRAPIndication; @@ -990,7 +988,7 @@ void SEIReader::xParseSEIPictureTiming(SEIPictureTiming& sei, uint32_t payloadSi sei.m_ptDisplayElementalPeriodsMinus1 = symbol; } -void SEIReader::xParseSEIFrameFieldinfo(SEIFrameFieldInfo& sei, const SEIPictureTiming& pt, uint32_t payloadSize, std::ostream *pDecodedMessageOutputStream) +void SEIReader::xParseSEIFrameFieldinfo(SEIFrameFieldInfo& sei, uint32_t payloadSize, std::ostream *pDecodedMessageOutputStream) { output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize); @@ -1024,10 +1022,6 @@ void SEIReader::xParseSEIFrameFieldinfo(SEIFrameFieldInfo& sei, const SEIPicture sei_read_uvlc( pDecodedMessageOutputStream, symbol, "ffi_display_elemental_periods_minus1" ); #endif sei.m_displayElementalPeriodsMinus1 = symbol; - if( pt.m_ptDisplayElementalPeriodsMinus1 != sei.m_displayElementalPeriodsMinus1 ) - { - msg( WARNING, "Warning: ffi_display_elemental_periods_minus1 is different in picture timing and frame field information SEI messages!"); - } } sei_read_code( pDecodedMessageOutputStream, 2, symbol, "ffi_source_scan_type" ); sei.m_sourceScanType = symbol; diff --git a/source/Lib/DecoderLib/SEIread.h b/source/Lib/DecoderLib/SEIread.h index 8627a85debf8a22968c17dfed12f3672d8f9ff64..996f6e1f350bbc3309adabd7c575e5ecdec41f36 100644 --- a/source/Lib/DecoderLib/SEIread.h +++ b/source/Lib/DecoderLib/SEIread.h @@ -66,7 +66,7 @@ protected: void xParseSEIPictureTiming (SEIPictureTiming& sei, uint32_t payloadSize, const uint32_t temporalId, const SEIBufferingPeriod& bp, std::ostream *pDecodedMessageOutputStream); void xParseSEIScalableNesting (SEIScalableNesting& sei, const NalUnitType nalUnitType, const uint32_t nuhLayerId, uint32_t payloadSize, const VPS* vps, const SPS* sps, HRD &hrd, std::ostream* decodedMessageOutputStream); void xCheckScalableNestingConstraints (const SEIScalableNesting& sei, const NalUnitType nalUnitType, const VPS* vps); - void xParseSEIFrameFieldinfo (SEIFrameFieldInfo& sei, const SEIPictureTiming& pt, uint32_t payloadSize, std::ostream *pDecodedMessageOutputStream); + void xParseSEIFrameFieldinfo (SEIFrameFieldInfo& sei, uint32_t payloadSize, std::ostream *pDecodedMessageOutputStream); void xParseSEIDependentRAPIndication (SEIDependentRAPIndication& sei, uint32_t payLoadSize, std::ostream *pDecodedMessageOutputStream); void xParseSEIFramePacking (SEIFramePacking& sei, uint32_t payloadSize, std::ostream *pDecodedMessageOutputStream); void xParseSEIParameterSetsInclusionIndication(SEIParameterSetsInclusionIndication& sei, uint32_t payloadSize, std::ostream* pDecodedMessageOutputStream);