diff --git a/cfg/sei_processing_order.cfg b/cfg/sei_processing_order.cfg new file mode 100644 index 0000000000000000000000000000000000000000..ee9d570cadc917ef7d422e111ef182fca0b09710 --- /dev/null +++ b/cfg/sei_processing_order.cfg @@ -0,0 +1,29 @@ +#======== SEI messages processing order =============== + +SEIPOEnabled : 1 #Enabling SEI processing order flag +SEIPOPayLoadType : 19 142 211 #SEI PayloadTypes to be processed +SEIPOProcessingOrder : 2 1 0 #Processing order of SEI payload types + + +#I chose 3 SEIs in the attached cfg: (see below). Please check it. +#19: FGC SEI +#142: CTI SEI +#211: NNPFA +#The order: CTI is before FGC. For NNPFA, order is not defined. + + +###================Two more illustrations========================### + +#The order: CTI and NNPFA are before FGC. The preferred order of CTI and NNPFA, order is not defined. +# +##======== SEI messages processing order =============== +#SEIPOEnabled : 1 #Enabling SEI processing order flag +#SEIPOPayLoadType : 19 142 211 #SEI PayloadTypes to be processed +#SEIPOProcessingOrder : 2 1 1 #Processing order of SEI payload types +# +#The order: CTI is before FGC. +# +##======== SEI messages processing order =============== +#SEIPOEnabled : 1 #Enabling SEI processing order flag +#SEIPOPayLoadType : 19 142 #SEI PayloadTypes to be processed +#SEIPOProcessingOrder : 2 1 #Processing order of SEI payload types diff --git a/doc/software-manual.tex b/doc/software-manual.tex index 003198251482ebd7f3bc7111e78446f9322be3e4..7390f04751d67ddc60ecd6fde54250cec15e1884 100644 --- a/doc/software-manual.tex +++ b/doc/software-manual.tex @@ -3734,6 +3734,7 @@ The table below lists the SEI messages defined for Version 1 and Range-Extension 210 & Neural network post-filter characteristics & Table \ref{tab:sei-nn-post-filter-characteristics} \\ 211 & Neural netowrk post-filter activation & Table \ref{tab:sei-nn-post-filter-activation} \\ 212 & Phase indication & Table \ref{tab:sei-phase-indication} \\ + 213 & Processing order SEI messages & Table \ref{tab:sei-processing order}\\ \end{SEIListTable} %% %% SEI messages @@ -5620,6 +5621,21 @@ Specifies the Vertical Phase Denominator minus 1 of Phase Indication SEI message \\ \end{OptionTableNoShorthand} +\begin{OptionTableNoShorthand}{Processing order SEI message encoder parameters}{tab:sei-processing order} +\Option{SEIPOEnabled} & +\Default{false} & +Enables (true) or disables (false) the insertion of processing order SEI message. +\\ +\Option{SEIPOPayLoadType\emph{i}} & +\Default{0} & +Specifies the value of payloadType for the \emph{i}-th SEI message for which information is provided in the SEI processing order SEI message. +\\ +\Option{SEIPOProcessingOrder\emph{i}} & +\Default{0} & +Specifies the preferred order of processing any SEI message with payloadType equal to SEIPOPayLoadType\emph{i}. +\\ +\end{OptionTableNoShorthand} + %\Option{SEITimeCode} & %\Default{false} & %When true, generate time code SEI messages. diff --git a/source/App/EncoderApp/EncApp.cpp b/source/App/EncoderApp/EncApp.cpp index 3480c6b14cf6d05aa788d625824d7e29a168d957..8bd045b16db2a7adbf046667b822ca7a9ad6f7ea 100644 --- a/source/App/EncoderApp/EncApp.cpp +++ b/source/App/EncoderApp/EncApp.cpp @@ -1270,6 +1270,14 @@ void EncApp::xInitLibCfg() m_cEncLib.setSiiSEINumUnitsInShutterInterval(m_siiSEINumUnitsInShutterInterval); m_cEncLib.setSiiSEITimeScale(m_siiSEITimeScale); m_cEncLib.setSiiSEISubLayerNumUnitsInSI(m_siiSEISubLayerNumUnitsInSI); + +#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER + m_cEncLib.setPoSEIEnabled (m_poSEIEnabled); + m_cEncLib.setPoSEIPayloadType (m_poSEIPayloadType); + m_cEncLib.setPoSEIProcessingOrder (m_poSEIProcessingOrder); + m_cEncLib.setPoSEINumofSeiMessages (m_numofSEIMessages); +#endif + m_cEncLib.setVuiParametersPresentFlag ( m_vuiParametersPresentFlag ); m_cEncLib.setSamePicTimingInAllOLS (m_samePicTimingInAllOLS); m_cEncLib.setAspectRatioInfoPresentFlag ( m_aspectRatioInfoPresentFlag); diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp index 62f5a22f3ebbd663972d017c9ce59c04c7016113..fe4895621f66f3eb47e00d1209f8ed5b4d1a72f5 100644 --- a/source/App/EncoderApp/EncAppCfg.cpp +++ b/source/App/EncoderApp/EncAppCfg.cpp @@ -745,6 +745,11 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) SMultiValueInput<uint32_t> cfg_FgcSEICompModelValueComp2 (0, 65535, 0, 256 * 6); SMultiValueInput<unsigned> cfg_siiSEIInputNumUnitsInSI(0, std::numeric_limits<uint32_t>::max(), 0, 7); +#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER + SMultiValueInput<uint16_t> cfg_poSEIPayloadType (0, 65535, 0, 256*2); + SMultiValueInput<uint16_t> cfg_poSEIProcessingOrder (0, 255, 0, 256); +#endif + #if ENABLE_TRACING string sTracingRule; string sTracingFile; @@ -1590,6 +1595,13 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) ("SEIDRINonlinearModel", cfg_driSEINonlinearModel, cfg_driSEINonlinearModel, "List of the piece-wise linear segments for mapping of decoded luma sample values of an auxiliary picture to a scale that is uniformly quantized in terms of disparity in the depth representation information SEI message") ("SEIConstrainedRASL", m_constrainedRaslEncoding, false, "Control generation of constrained RASL encoding SEI message") +#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER + //Processing order of SEI (pos) + ("SEIPOEnabled", m_poSEIEnabled, false, "Specifies whether SEI processing order is applied or not") + ("SEIPOPayLoadType", cfg_poSEIPayloadType, cfg_poSEIPayloadType, "List of payloadType for processing") + ("SEIPOProcessingOrder", cfg_poSEIProcessingOrder, cfg_poSEIProcessingOrder, "List of payloadType processing order") +#endif + ("DebugBitstream", m_decodeBitstreams[0], string( "" ), "Assume the frames up to POC DebugPOC will be the same as in this bitstream. Load those frames from the bitstream instead of encoding them." ) ("DebugPOC", m_switchPOC, -1, "If DebugBitstream is present, load frames up to this POC from this bitstream. Starting with DebugPOC, return to normal encoding." ) ("DecodeBitstream1", m_decodeBitstreams[0], string( "" ), "Assume the frames up to POC DebugPOC will be the same as in this bitstream. Load those frames from the bitstream instead of encoding them." ) @@ -3263,6 +3275,32 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) } +#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER + if (m_poSEIEnabled) + { + assert(cfg_poSEIPayloadType.values.size() > 0); + assert(cfg_poSEIProcessingOrder.values.size() == cfg_poSEIPayloadType.values.size()); + m_numofSEIMessages = (uint32_t)cfg_poSEIPayloadType.values.size(); + m_poSEIPayloadType.resize(m_numofSEIMessages); + m_poSEIProcessingOrder.resize(m_numofSEIMessages); + for (uint32_t i = 0; i < m_numofSEIMessages; i++) + { + m_poSEIPayloadType[i] = cfg_poSEIPayloadType.values[i]; + m_poSEIProcessingOrder[i] = (uint8_t)cfg_poSEIProcessingOrder.values[i]; + //Error check, to avoid same PayloadType with different PayloadOrder + for (uint32_t j = 0; j < i; j++) + { + if (m_poSEIPayloadType[j] == m_poSEIPayloadType[i]) + { + assert(m_poSEIProcessingOrder[j]== m_poSEIProcessingOrder[i]); + } + } + } + assert(m_poSEIPayloadType.size() > 0); + assert(m_poSEIProcessingOrder.size() == m_poSEIPayloadType.size()); + } +#endif + if( m_costMode == COST_LOSSLESS_CODING ) { bool firstSliceLossless = false; @@ -5120,6 +5158,10 @@ void EncAppCfg::xPrintParameter() msg(VERBOSE, "BIM:%d ", m_bimEnabled); msg(VERBOSE, "SEI FGC:%d ", m_fgcSEIEnabled); +#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER + msg(VERBOSE, "SEI processing Order:%d ", m_poSEIEnabled); +#endif + #if EXTENSION_360_VIDEO m_ext360.outputConfigurationSummary(); #endif diff --git a/source/App/EncoderApp/EncAppCfg.h b/source/App/EncoderApp/EncAppCfg.h index 677166d99240330fbc659e4bf44bf615879f8821..e3f016493cf448820eb8f774c659f381d1d384e0 100644 --- a/source/App/EncoderApp/EncAppCfg.h +++ b/source/App/EncoderApp/EncAppCfg.h @@ -774,6 +774,13 @@ protected: bool m_nnPostFilterSEIActivationEnabled; uint32_t m_nnPostFilterSEIActivationId; +#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER + bool m_poSEIEnabled; + std::vector<uint16_t> m_poSEIPayloadType; + std::vector<uint8_t> m_poSEIProcessingOrder; + uint32_t m_numofSEIMessages; +#endif + bool m_constrainedRaslEncoding; bool m_sampleAspectRatioInfoSEIEnabled; diff --git a/source/Lib/CommonLib/SEI.cpp b/source/Lib/CommonLib/SEI.cpp index dbc60dd81ff5fad2bad2cb8f652b68da7563e46e..49f7240158b3cd6e551ef09d4a88be8dbd11dd53 100644 --- a/source/Lib/CommonLib/SEI.cpp +++ b/source/Lib/CommonLib/SEI.cpp @@ -483,6 +483,10 @@ const char *SEI::getSEIMessageString(SEI::PayloadType payloadType) #if JVET_AA0110_PHASE_INDICATION_SEI_MESSAGE case SEI::PHASE_INDICATION: return "Phase Indication"; #endif + +#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER + case SEI::SEI_PROCESSING_ORDER: return "SEI messages Processing order"; +#endif default: return "Unknown"; } } diff --git a/source/Lib/CommonLib/SEI.h b/source/Lib/CommonLib/SEI.h index f5c86e0cda4f613ce9ad477e221880b9c264c9f0..b002e9087b8b89853628f03ada2ba6c247c00ee3 100644 --- a/source/Lib/CommonLib/SEI.h +++ b/source/Lib/CommonLib/SEI.h @@ -97,6 +97,10 @@ public: #if JVET_AA0110_PHASE_INDICATION_SEI_MESSAGE PHASE_INDICATION = 212, #endif + +#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER + SEI_PROCESSING_ORDER = 213, +#endif }; SEI() {} @@ -122,6 +126,21 @@ public: std::vector<unsigned> m_siiSubLayerNumUnitsInSI; }; +#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER +class SEIProcessingOrderInfo : public SEI +{ +public: + PayloadType payloadType() const { return SEI_PROCESSING_ORDER; } + SEIProcessingOrderInfo() {} + virtual ~SEIProcessingOrderInfo() {} + + bool m_posEnabled; + std::vector<uint16_t> m_posPayloadType; + std::vector<uint8_t> m_posProcessingOrder; + uint32_t m_posNumofSeiMessages; +}; +#endif + class SEIEquirectangularProjection : public SEI { public: diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 7e15952cb21b3f0a8f6c2d6fd7a7255e5db4c63d..ca5bd314182422bd27037f0f054f152fa99b6652 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -60,6 +60,7 @@ #define JVET_AA0110_PHASE_INDICATION_SEI_MESSAGE 1 // Software support of Phase Indication SEI message #define JVET_AA0054_CHROMA_FORMAT_FLAG 1 // JVET-AA0054 PROPOSAL2: Signalling improvements to specify output chroma information #define JVET_AA0054_CHROMA_UPSAMPLING_CONSTRAINT 1 // JVET-AA0054 PROPOSAL3: Constraint to prevent chroma upsampling when input chroma format is monochrome or YUV444 +#define JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER 1 // JVET-AA0102 and JVET-AA2027: SEI processing order SEI message in VVC (Draft 1) (SEI processing order SEI message carries information indicating the preferred processing order, as determined by the encoder) //########### place macros to be be kept below this line ############### #define JVET_X0143_ALF_APS_ID_OFFSET 0 // A value between 0 to 7 inclusive. This macro should be kept, or to be defined as a configuration parameter if possible. diff --git a/source/Lib/DecoderLib/SEIread.cpp b/source/Lib/DecoderLib/SEIread.cpp index d4c0b0e82c22f4e3be1c048253227533a3406ed1..6afd8d990d07914c46b411d0e36df956adbe5448 100644 --- a/source/Lib/DecoderLib/SEIread.cpp +++ b/source/Lib/DecoderLib/SEIread.cpp @@ -423,6 +423,12 @@ void SEIReader::xReadSEImessage(SEIMessages& seis, const NalUnitType nalUnitType sei = new SEIPhaseIndication; xParseSEIPhaseIndication((SEIPhaseIndication&)*sei, payloadSize, pDecodedMessageOutputStream); break; +#endif +#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER + case SEI::SEI_PROCESSING_ORDER: + sei = new SEIProcessingOrderInfo; + xParseSEIProcessingOrder((SEIProcessingOrderInfo&) *sei, payloadSize, pDecodedMessageOutputStream); + break; #endif default: for (uint32_t i = 0; i < payloadSize; i++) @@ -577,6 +583,27 @@ void SEIReader::xParseSEIShutterInterval(SEIShutterIntervalInfo& sei, uint32_t p } } +#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER +void SEIReader::xParseSEIProcessingOrder(SEIProcessingOrderInfo& sei, uint32_t payloadSize, std::ostream *decodedMessageOutputStream) +{ + uint32_t i,b; + uint32_t NumSEIMessages, val; + output_sei_message_header(sei, decodedMessageOutputStream, payloadSize); + //Here payload is in Bytes, Since "sei_payloadType" is 2 Bytes + "sei_payloadOrder" is 1 Byte so total = 3 Bytes + //To get Number of SEI messages, just do payloadSize/3 + NumSEIMessages = payloadSize / 3; + sei.m_posPayloadType.resize(NumSEIMessages); + sei.m_posProcessingOrder.resize(NumSEIMessages); + for(i=0,b=0; b < payloadSize; i++,b+=3) + { + sei_read_code(decodedMessageOutputStream, 16, val, "sei_payloadType[i]"); + sei.m_posPayloadType[i] = val; + sei_read_code(decodedMessageOutputStream, 8, val, "sei_processingOrder[i]"); + sei.m_posProcessingOrder[i] = val; + } +} +#endif + /** * parse bitstream bs and unpack a decoded picture hash SEI message * of payloadSize bytes into sei. diff --git a/source/Lib/DecoderLib/SEIread.h b/source/Lib/DecoderLib/SEIread.h index 4efccbc4fad0292b754cea1111762ab3300a7b4e..d15f8b27ca34e2b5292b675d3ac5f38376143541 100644 --- a/source/Lib/DecoderLib/SEIread.h +++ b/source/Lib/DecoderLib/SEIread.h @@ -112,6 +112,9 @@ protected: #if JVET_AA0110_PHASE_INDICATION_SEI_MESSAGE void xParseSEIPhaseIndication(SEIPhaseIndication& sei, uint32_t payloadSize, std::ostream* pDecodedMessageOutputStream); #endif +#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER + void xParseSEIProcessingOrder (SEIProcessingOrderInfo& sei, uint32_t payloadSize, std::ostream *decodedMessageOutputStream); +#endif void sei_read_scode(std::ostream *pOS, uint32_t length, int& code, const char *pSymbolName); void sei_read_code(std::ostream *pOS, uint32_t length, uint32_t &ruiCode, const char *pSymbolName); diff --git a/source/Lib/EncoderLib/EncCfg.h b/source/Lib/EncoderLib/EncCfg.h index f705a6cabfaa8e8a5106750bc30fe3289a2bb45c..cdb346027f5af142a870bb3a6de0efc0ecc908d0 100644 --- a/source/Lib/EncoderLib/EncCfg.h +++ b/source/Lib/EncoderLib/EncCfg.h @@ -838,6 +838,15 @@ protected: int m_driSEINonlinearNumMinus1; std::vector<uint32_t> m_driSEINonlinearModel; std::string m_arSEIFileRoot; // Annotated region SEI - initialized from external file + +#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER + //SEI message processing order + bool m_poSEIEnabled; + std::vector<uint16_t> m_poSEIPayloadType; + std::vector<uint8_t> m_poSEIProcessingOrder; + uint32_t m_numofSEIMessages; +#endif + bool m_constrainedRaslEncoding; //====== Weighted Prediction ======== @@ -2330,6 +2339,18 @@ public: void setRprRASLtoolSwitch(bool b) { m_rprRASLtoolSwitch = b; } bool getRprRASLtoolSwitch() { return m_rprRASLtoolSwitch; } +#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER + //SEI messages processing order + void setPoSEIEnabled(bool b) { m_poSEIEnabled = b; } + bool getPoSEIEnabled() { return m_poSEIEnabled; } + void setPoSEIPayloadType(const std::vector<uint16_t>& b) { m_poSEIPayloadType = b; } + uint16_t getPoSEIPayloadType(uint16_t idx) const { return m_poSEIPayloadType[idx]; } + void setPoSEIProcessingOrder(const std::vector<uint8_t>& b) { m_poSEIProcessingOrder = b; } + uint8_t getPoSEIProcessingOrder(uint8_t idx) const { return m_poSEIProcessingOrder[idx]; } + void setPoSEINumofSeiMessages(uint32_t i) { m_numofSEIMessages = i; } + uint32_t getPoSEINumofSeiMessages() const { return m_numofSEIMessages; } +#endif + void setUseWP ( bool b ) { m_useWeightedPred = b; } void setWPBiPred ( bool b ) { m_useWeightedBiPred = b; } bool getUseWP () { return m_useWeightedPred; } diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp index 4a893aff0c68d2ef0b8ae5f326f4519c172985da..b46de9c895ed09ab3e694c1bc9aa7bd500b22b8f 100644 --- a/source/Lib/EncoderLib/EncGOP.cpp +++ b/source/Lib/EncoderLib/EncGOP.cpp @@ -877,6 +877,14 @@ void EncGOP::xCreateIRAPLeadingSEIMessages (SEIMessages& seiMessages, const SPS seiMessages.push_back(seiNNPostFilterCharacteristics); } } +#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER + if (m_pcCfg->getPoSEIEnabled()) + { + SEIProcessingOrderInfo *seiProcessingOrder = new SEIProcessingOrderInfo; + m_seiEncoder.initSEIProcessingOrderInfo(seiProcessingOrder); + seiMessages.push_back(seiProcessingOrder); + } +#endif } void EncGOP::xCreatePerPictureSEIMessages (int picInGOP, SEIMessages& seiMessages, SEIMessages& nestedSeiMessages, Slice *slice) diff --git a/source/Lib/EncoderLib/SEIEncoder.cpp b/source/Lib/EncoderLib/SEIEncoder.cpp index 76d96354c86f6df88cf0955c0b176963d453fbaf..2a706588f27d2371d222ca6f99e80692f8e0a05e 100644 --- a/source/Lib/EncoderLib/SEIEncoder.cpp +++ b/source/Lib/EncoderLib/SEIEncoder.cpp @@ -553,6 +553,26 @@ void SEIEncoder::initSEIShutterIntervalInfo(SEIShutterIntervalInfo *seiShutterIn } } +#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER +void SEIEncoder::initSEIProcessingOrderInfo(SEIProcessingOrderInfo *seiProcessingOrderInfo) +{ + assert(m_isInitialized); + assert(seiProcessingOrderInfo != nullptr); + + uint32_t numSEIMessages = m_pcCfg->getPoSEINumofSeiMessages(); + seiProcessingOrderInfo->m_posNumofSeiMessages = numSEIMessages; + seiProcessingOrderInfo->m_posEnabled = m_pcCfg->getPoSEIEnabled(); + + seiProcessingOrderInfo->m_posPayloadType.resize(numSEIMessages); + seiProcessingOrderInfo->m_posProcessingOrder.resize(numSEIMessages); + + for (uint32_t i = 0; i < numSEIMessages; i++) { + seiProcessingOrderInfo->m_posPayloadType[i] = m_pcCfg->getPoSEIPayloadType(i); + seiProcessingOrderInfo->m_posProcessingOrder[i] = m_pcCfg->getPoSEIProcessingOrder(i); + } +} +#endif + template <typename T> static void readTokenValue(T &returnedValue, /// value returned bool &failed, /// used and updated diff --git a/source/Lib/EncoderLib/SEIEncoder.h b/source/Lib/EncoderLib/SEIEncoder.h index 0a99a23a7f16209b821a1ee974cd69e502638842..897096595dfa87c22595219deafb754cdc56f0f6 100644 --- a/source/Lib/EncoderLib/SEIEncoder.h +++ b/source/Lib/EncoderLib/SEIEncoder.h @@ -96,6 +96,9 @@ public: void initSEIShutterIntervalInfo(SEIShutterIntervalInfo *sei); void initSEINeuralNetworkPostFilterCharacteristics(SEINeuralNetworkPostFilterCharacteristics *sei, int filterIdx); void initSEINeuralNetworkPostFilterActivation(SEINeuralNetworkPostFilterActivation *sei); +#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER + void initSEIProcessingOrderInfo(SEIProcessingOrderInfo *sei); +#endif private: EncCfg* m_pcCfg; EncLib* m_pcEncLib; diff --git a/source/Lib/EncoderLib/SEIwrite.cpp b/source/Lib/EncoderLib/SEIwrite.cpp index 02fb4d4cba509344b52e174fd766f0095131f9d3..ca2e6c07b7b120c2456cc47c6155a79769bad560 100644 --- a/source/Lib/EncoderLib/SEIwrite.cpp +++ b/source/Lib/EncoderLib/SEIwrite.cpp @@ -171,6 +171,11 @@ void SEIWriter::xWriteSEIpayloadData(OutputBitstream &bs, const SEI& sei, HRD &h case SEI::NEURAL_NETWORK_POST_FILTER_ACTIVATION: xWriteSEINeuralNetworkPostFilterActivation(*static_cast<const SEINeuralNetworkPostFilterActivation*>(&sei)); break; +#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER + case SEI::SEI_PROCESSING_ORDER: + xWriteSEIProcessingOrder(*static_cast<const SEIProcessingOrderInfo*>(&sei)); + break; +#endif default: THROW("Trying to write unhandled SEI message"); break; @@ -1403,6 +1408,17 @@ void SEIWriter::xWriteSEIShutterInterval(const SEIShutterIntervalInfo &sei) } } +#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER +void SEIWriter::xWriteSEIProcessingOrder(const SEIProcessingOrderInfo &sei) +{ + for (uint32_t i=0; i < sei.m_posNumofSeiMessages; i++) + { + WRITE_CODE(sei.m_posPayloadType[i], 16, "sei_payloadType[i]"); + WRITE_CODE(sei.m_posProcessingOrder[i], 8, "sei_processingOrder[i]"); + } +} +#endif + void SEIWriter::xWriteSEIConstrainedRaslIndication(const SEIConstrainedRaslIndication& /*sei*/) { // intentionally empty diff --git a/source/Lib/EncoderLib/SEIwrite.h b/source/Lib/EncoderLib/SEIwrite.h index eae18f461ee684d0a8f6fd6a1944ef38ed9c7d8b..31ba7e4e65819093ffb1a6bd60109f769f0d7e4e 100644 --- a/source/Lib/EncoderLib/SEIwrite.h +++ b/source/Lib/EncoderLib/SEIwrite.h @@ -100,6 +100,9 @@ protected: void xWriteSEINeuralNetworkPostFilterCharacteristics(const SEINeuralNetworkPostFilterCharacteristics& sei); void xWriteNNPFCComplexityElement(const SEINeuralNetworkPostFilterCharacteristics& sei); void xWriteSEINeuralNetworkPostFilterActivation(const SEINeuralNetworkPostFilterActivation &sei); +#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER + void xWriteSEIProcessingOrder(const SEIProcessingOrderInfo &sei); +#endif protected: HRD m_nestingHrd; };