From d3bd7d39b86cb40fbf17f65b1623c0ab793aa424 Mon Sep 17 00:00:00 2001
From: aqaror <aqaror@dolby.com>
Date: Wed, 3 Aug 2022 03:58:58 -0700
Subject: [PATCH] added changes required for JVET_AA0100 NNPF SEI message
 additions

---
 ...al_network_post_filter_characteristics.cfg |  5 ++++
 doc/software-manual.tex                       | 25 +++++++++++++++++
 source/App/EncoderApp/EncApp.cpp              |  9 +++++++
 source/App/EncoderApp/EncAppCfg.cpp           | 27 ++++++++++++++++++-
 source/App/EncoderApp/EncAppCfg.h             |  7 +++++
 source/Lib/CommonLib/SEI.h                    | 14 ++++++++++
 source/Lib/CommonLib/TypeDef.h                |  1 +
 source/Lib/DecoderLib/SEIread.cpp             | 16 +++++++++++
 source/Lib/EncoderLib/EncCfg.h                | 20 +++++++++++++-
 source/Lib/EncoderLib/SEIEncoder.cpp          |  9 +++++++
 source/Lib/EncoderLib/SEIwrite.cpp            | 10 +++++++
 11 files changed, 141 insertions(+), 2 deletions(-)

diff --git a/cfg/sei_vui/neural_network_post_filter_characteristics.cfg b/cfg/sei_vui/neural_network_post_filter_characteristics.cfg
index f8ab758678..46216c9939 100644
--- a/cfg/sei_vui/neural_network_post_filter_characteristics.cfg
+++ b/cfg/sei_vui/neural_network_post_filter_characteristics.cfg
@@ -11,6 +11,11 @@ SEINNPostFilterCharacteristicsOutSubHeightCFlag0:              1
 SEINNPostFilterCharacteristicsComponentLastFlag0:              0
 SEINNPostFilterCharacteristicsInpSampleIdc0:                   1
 SEINNPostFilterCharacteristicsInpTensorBitDepthMinus80:        2
+SEINNPostFilterCharacteristicsAuxInpIdc0:                      1
+SEINNPostFilterCharacteristicsSepColDescriptionFlag0:          0
+SEINNPostFilterCharacteristicsColPrimaries0:                   9
+SEINNPostFilterCharacteristicsTransCharacteristics0:           16
+SEINNPostFilterCharacteristicsMatrixCoeffs0:                   14
 SEINNPostFilterCharacteristicsInpOrderIdc0:                    2
 SEINNPostFilterCharacteristicsOutSampleIdc0:                   1
 SEINNPostFilterCharacteristicsOutTensorBitDepthMinus80:        2
diff --git a/doc/software-manual.tex b/doc/software-manual.tex
index 78ff157e9d..c42940f775 100644
--- a/doc/software-manual.tex
+++ b/doc/software-manual.tex
@@ -5426,6 +5426,31 @@ Specifies sii_num_units_in_shutter_interval for single entry.If multiple entries
   \Default{0} &
   Specifies the bit depth of the input tensor - 8 for the \emph{i}-th neural network post-filter, when nnpfc_inp_sample_idc = 4.
   \\
+  \Option{SEINNPostFilterCharacteristicsAuxInpIdc\emph{i}} &
+  \Default{0} &
+  Specifies that auxiliary input data may be present in the neural network input tensor for any allowed luma-only, chroma-only, and luma-chroma configuration.
+  \\
+  \Option{SEINNPostFilterCharacteristicsSepColDescriptionFlag\emph{i}} &
+  \Default{false} &
+  Specifies that the colour primaries, transfer characteristics, and matrix coefficients of the picture that results from the neural-network post filtering may be different than for the input to the filter.
+  \par
+  \begin{tabular}{p{0.49\columnwidth}}
+    When true (non-zero) the syntax elements nnpfc_colour_primaries, nnpfc_transfer_characteristic, and nnpfc_matrix_coeffs specify the colour primaries, transfer characteristics, and matrix coefficients of the picture that results from the neural-network post filtering. \\
+    When false the syntax elements nnpfc_colour_primaries, nnpfc_transfer_chracteristics, and nnpfc_matrix_coeffs are assumed to be the same as the input to the filter. \\
+  \end{tabular}
+  \\
+  \Option{SEINNPostFilterCharacteristicsColPrimaries\emph{i}} &
+  \Default{0} &
+  Specifies the colour primaries of the picture resulting from applying the neural-network post-filter specified in the SEI message, rather than the colour primaries used for the CLVS.
+  \\
+  \Option{SEINNPostFilterCharacteristicsTransCharacteristics\emph{i}} &
+  \Default{0} &
+  Specifies the transfer characteristics of the picture resulting from applying the neural-network post-filter specified in the SEI message, rather than the transfer characteristics used for the CLVS.
+  \\
+  \Option{SEINNPostFilterCharacteristicsMatrixCoeffs\emph{i}} &
+  \Default{0} &
+  Specifies the matrix coefficients of the picture resulting from applying the neural-network post-filter specified in the SEI message, rather than the matrix coefficients used for the CLVS
+  \\
   \Option{SEINNPostFilterCharacteristicsInpOrderIdc\emph{i}} &
   \Default{0} &
   Specifies the method of ordering the input sample arrays for the \emph{i}-th neural network post-filter.
diff --git a/source/App/EncoderApp/EncApp.cpp b/source/App/EncoderApp/EncApp.cpp
index 72d1cb4ac7..087df69ef4 100644
--- a/source/App/EncoderApp/EncApp.cpp
+++ b/source/App/EncoderApp/EncApp.cpp
@@ -1132,6 +1132,15 @@ void EncApp::xInitLibCfg()
     m_cEncLib.setNNPostFilterSEICharacteristicsPicHeightInLumaSamples  (m_nnPostFilterSEICharacteristicsPicHeightInLumaSamples[i], i);
     m_cEncLib.setNNPostFilterSEICharacteristicsInpTensorBitDepthMinus8 (m_nnPostFilterSEICharacteristicsInpTensorBitDepthMinus8[i], i);
     m_cEncLib.setNNPostFilterSEICharacteristicsOutTensorBitDepthMinus8 (m_nnPostFilterSEICharacteristicsOutTensorBitDepthMinus8[i], i);
+#if JVET_AA0100 
+    m_cEncLib.setNNPostFilterSEICharacteristicsAuxInpIdc               (m_nnPostFilterSEICharacteristicsAuxInpIdc[i], i);
+    m_cEncLib.setNNPostFilterSEICharacteristicsSepColDescriptionFlag   (m_nnPostFilterSEICharacteristicsSepColDescriptionFlag[i], i);
+    if (m_cEncLib.getNNPostFilterSEICharacteristicsSepColDescriptionFlag(i)){
+      m_cEncLib.setNNPostFilterSEICharacteristicsColPrimaries          (m_nnPostFilterSEICharacteristicsColPrimaries[i],i);
+      m_cEncLib.setNNPostFilterSEICharacteristicsTransCharacteristics  (m_nnPostFilterSEICharacteristicsTransCharacteristics[i],i);
+      m_cEncLib.setNNPostFilterSEICharacteristicsMatrixCoeffs          (m_nnPostFilterSEICharacteristicsMatrixCoeffs[i],i);
+    }
+#endif
     m_cEncLib.setNNPostFilterSEICharacteristicsComponentLastFlag       (m_nnPostFilterSEICharacteristicsComponentLastFlag[i], i);
     m_cEncLib.setNNPostFilterSEICharacteristicsInpSampleIdc            (m_nnPostFilterSEICharacteristicsInpSampleIdc[i], i);
     m_cEncLib.setNNPostFilterSEICharacteristicsInpOrderIdc             (m_nnPostFilterSEICharacteristicsInpOrderIdc[i], i);
diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp
index ec1ded0fca..e4ed638a48 100644
--- a/source/App/EncoderApp/EncAppCfg.cpp
+++ b/source/App/EncoderApp/EncAppCfg.cpp
@@ -1707,7 +1707,27 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] )
     std::ostringstream inpSampleIdc;
     inpSampleIdc << "SEINNPostFilterCharacteristicsInpSampleIdc" << i;
     opts.addOptions()(inpSampleIdc.str(), m_nnPostFilterSEICharacteristicsInpSampleIdc[i], 0u, "Specifies the method of converting an input sample in the the Neural Network Post Filter Characteristics SEI message");
-
+#if JVET_AA0100
+    std::ostringstream AuxInpIdc;
+    AuxInpIdc << "SEINNPostFilterCharacteristicsAuxInpIdc" << i;
+    opts.addOptions()(AuxInpIdc.str(), m_nnPostFilterSEICharacteristicsAuxInpIdc[i], 0u, "Specifies the auxillary input index in the Nueral Network Post Filter Characteristics SEI message");
+
+    std::ostringstream SepColDescriptionFlag;
+    SepColDescriptionFlag << "SEINNPostFilterCharacteristicsSepColDescriptionFlag" << i;
+    opts.addOptions()(SepColDescriptionFlag.str(), m_nnPostFilterSEICharacteristicsSepColDescriptionFlag[i], false, "Specifies the presence of seperate color descriptions in the Nueral Network Post Filter Characteristics SEI message");
+
+    std::ostringstream ColPrimaries;
+    ColPrimaries << "SEINNPostFilterCharacteristicsColPrimaries" << i;
+    opts.addOptions()(ColPrimaries.str(), m_nnPostFilterSEICharacteristicsColPrimaries[i], 0u, "Specifies color primaries in the Nueral Network Post Filter Characteristics SEI message");
+
+    std::ostringstream TransCharacteristics;
+    TransCharacteristics << "SEINNPostFilterCharacteristicsTransCharacteristics" << i;
+    opts.addOptions()(TransCharacteristics.str(), m_nnPostFilterSEICharacteristicsTransCharacteristics[i], 0u, "Specifies Transfer Characteristics in the Nueral Network Post Filter Characteristics SEI message");
+
+    std::ostringstream MatrixCoeffs;
+    MatrixCoeffs << "SEINNPostFilterCharacteristicsMatrixCoeffs" << i;
+    opts.addOptions()(MatrixCoeffs.str(), m_nnPostFilterSEICharacteristicsMatrixCoeffs[i], 0u, "Specifies color matrix coefficients in the Nueral Network Post Filter Characteristics SEI message");
+#endif
     std::ostringstream inpOrderIdc;
     inpOrderIdc << "SEINNPostFilterCharacteristicsInpOrderIdc" << i;
     opts.addOptions()(inpOrderIdc.str(), m_nnPostFilterSEICharacteristicsInpOrderIdc[i], 0u, "Specifies the method of ordering the input sample arrays in the Neural Network Post Filter Characteristics SEI message");
@@ -4612,6 +4632,11 @@ bool EncAppCfg::xCheckParameter()
       xConfirmPara(m_nnPostFilterSEICharacteristicsOutTensorBitDepthMinus8[i] > 24, "SEINNPostFilterCharacteristicsOutTensorBitDepthMinus8 must be in the range of 0 to 24");
       xConfirmPara(m_nnPostFilterSEICharacteristicsInpSampleIdc[i] > 255, "SEINNPostFilterCharacteristicsInpSampleIdc must be in the range of 0 to 255");
       xConfirmPara(m_nnPostFilterSEICharacteristicsInpOrderIdc[i] > 255, "SEINNPostFilterCharacteristicsInpOrderIdc must be in the range of  0 to 255");
+#if JVET_AA0100
+      xConfirmPara(m_nnPostFilterSEICharacteristicsColPrimaries[i] > 255, "m_nnPostFilterSEICharacteristicsColPrimaries must in the range 0 to 255");
+      xConfirmPara(m_nnPostFilterSEICharacteristicsTransCharacteristics[i] > 255, "m_nnPostFilterSEICharacteristicsTransCharacteristics must in the range 0 to 255");
+      xConfirmPara(m_nnPostFilterSEICharacteristicsMatrixCoeffs[i] > 255, "m_nnPostFilterSEICharacteristicsMatrixCoeffs must in the range 0 to 255");
+#endif
       xConfirmPara(m_nnPostFilterSEICharacteristicsOutSampleIdc[i] > 255, "SEINNPostFilterCharacteristicsOutSampleIdc must be in the range of 0 to 255");
       xConfirmPara(m_nnPostFilterSEICharacteristicsOutOrderIdc[i] > 255, "SEINNPostFilterCharacteristicsOutOrderIdc must be in the range of 0 to 255");
       xConfirmPara(m_nnPostFilterSEICharacteristicsPatchWidthMinus1[i] > 32766, "SEINNPostFilterCharacteristicsPatchWidthMinus1 must be in the range of 0 to 32766");
diff --git a/source/App/EncoderApp/EncAppCfg.h b/source/App/EncoderApp/EncAppCfg.h
index 1d73ff7ab1..bb425f3071 100644
--- a/source/App/EncoderApp/EncAppCfg.h
+++ b/source/App/EncoderApp/EncAppCfg.h
@@ -743,6 +743,13 @@ protected:
   uint32_t              m_nnPostFilterSEICharacteristicsOutTensorBitDepthMinus8[MAX_NUM_NN_POST_FILTERS];
   bool                  m_nnPostFilterSEICharacteristicsComponentLastFlag[MAX_NUM_NN_POST_FILTERS];
   uint32_t              m_nnPostFilterSEICharacteristicsInpSampleIdc[MAX_NUM_NN_POST_FILTERS];
+#if JVET_AA0100
+  uint32_t              m_nnPostFilterSEICharacteristicsAuxInpIdc[MAX_NUM_NN_POST_FILTERS];
+  bool                  m_nnPostFilterSEICharacteristicsSepColDescriptionFlag[MAX_NUM_NN_POST_FILTERS];
+  uint32_t              m_nnPostFilterSEICharacteristicsColPrimaries[MAX_NUM_NN_POST_FILTERS];
+  uint32_t              m_nnPostFilterSEICharacteristicsTransCharacteristics[MAX_NUM_NN_POST_FILTERS];
+  uint32_t              m_nnPostFilterSEICharacteristicsMatrixCoeffs[MAX_NUM_NN_POST_FILTERS];
+#endif  
   uint32_t              m_nnPostFilterSEICharacteristicsInpOrderIdc[MAX_NUM_NN_POST_FILTERS];
   uint32_t              m_nnPostFilterSEICharacteristicsOutSampleIdc[MAX_NUM_NN_POST_FILTERS];
   uint32_t              m_nnPostFilterSEICharacteristicsOutOrderIdc[MAX_NUM_NN_POST_FILTERS];
diff --git a/source/Lib/CommonLib/SEI.h b/source/Lib/CommonLib/SEI.h
index 2bb366284c..32e0fbafc3 100644
--- a/source/Lib/CommonLib/SEI.h
+++ b/source/Lib/CommonLib/SEI.h
@@ -1077,6 +1077,13 @@ public:
   , m_outTensorBitDepthMinus8(0)
   , m_componentLastFlag(false)
   , m_inpSampleIdc(0)
+#if JVET_AA0100
+  , m_AuxInpIdc(0)
+  , m_SepColDescriptionFlag(false)
+  , m_ColPrimaries(0)
+  , m_TransCharacteristics(0)
+  , m_MatrixCoeffs(0)
+#endif
   , m_inpOrderIdc(0)
   , m_outSampleIdc(0)
   , m_outOrderIdc(0)
@@ -1113,6 +1120,13 @@ public:
   uint32_t       m_outTensorBitDepthMinus8;
   bool           m_componentLastFlag;
   uint32_t       m_inpSampleIdc;
+#if JVET_AA0100 
+  uint32_t       m_AuxInpIdc;
+  bool           m_SepColDescriptionFlag;
+  uint8_t        m_ColPrimaries;
+  uint8_t        m_TransCharacteristics;
+  uint8_t        m_MatrixCoeffs;
+#endif
   uint32_t       m_inpOrderIdc;
   uint32_t       m_outSampleIdc;
   uint32_t       m_outOrderIdc;
diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index 83a042d4eb..509d5154fd 100644
--- a/source/Lib/CommonLib/TypeDef.h
+++ b/source/Lib/CommonLib/TypeDef.h
@@ -54,6 +54,7 @@
 
 
 //########### place macros to be removed in next cycle below this line ###############
+#define JVET_AA0100                                       1 // JVET-AA0100 AHG9: On auxiliary input and separate colour description in the neural-network post-filter characteristics SEI message
 
 //########### 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 ada0cd0575..a2677d19b4 100644
--- a/source/Lib/DecoderLib/SEIread.cpp
+++ b/source/Lib/DecoderLib/SEIread.cpp
@@ -2509,6 +2509,22 @@ void SEIReader::xParseSEINNPostFilterCharacteristics(SEINeuralNetworkPostFilterC
       sei_read_uvlc(pDecodedMessageOutputStream, val, "nnpfc_inp_tensor_bitdepth_minus8");
       sei.m_inpTensorBitDepthMinus8 = val;
     }
+#if JVET_AA0100
+    sei_read_uvlc(pDecodedMessageOutputStream,val,"nnpfc_aux_inp_idc");
+    sei.m_AuxInpIdc = val;
+    sei_read_flag(pDecodedMessageOutputStream,val,"nnpfc_sep_col_desc_flag");
+    sei.m_SepColDescriptionFlag = val;
+
+    if(sei.m_SepColDescriptionFlag)
+  {
+      sei_read_code(pDecodedMessageOutputStream, 8, val,"nnpfc_col_primaries");
+      sei.m_ColPrimaries = val;
+      sei_read_code(pDecodedMessageOutputStream, 8, val,"nnpfc_trans_characteristics");
+      sei.m_TransCharacteristics = val;
+      sei_read_code(pDecodedMessageOutputStream, 8, val,"nnpfc_matrix_coeffs");
+      sei.m_MatrixCoeffs = val;
+    }
+#endif
 
     sei_read_uvlc(pDecodedMessageOutputStream, val, "nnpfc_inp_order_idc");
     sei.m_inpOrderIdc = val;
diff --git a/source/Lib/EncoderLib/EncCfg.h b/source/Lib/EncoderLib/EncCfg.h
index d8890a4659..5e0ee488f8 100644
--- a/source/Lib/EncoderLib/EncCfg.h
+++ b/source/Lib/EncoderLib/EncCfg.h
@@ -675,6 +675,13 @@ protected:
   uint32_t                m_nnPostFilterSEICharacteristicsOutTensorBitDepthMinus8[MAX_NUM_NN_POST_FILTERS];
   bool                    m_nnPostFilterSEICharacteristicsComponentLastFlag[MAX_NUM_NN_POST_FILTERS];
   uint32_t                m_nnPostFilterSEICharacteristicsInpSampleIdc[MAX_NUM_NN_POST_FILTERS];
+#if JVET_AA0100
+  uint32_t                m_nnPostFilterSEICharacteristicsAuxInpIdc[MAX_NUM_NN_POST_FILTERS];
+  bool                    m_nnPostFilterSEICharacteristicsSepColDescriptionFlag[MAX_NUM_NN_POST_FILTERS];
+  uint32_t                m_nnPostFilterSEICharacteristicsColPrimaries[MAX_NUM_NN_POST_FILTERS];
+  uint32_t                m_nnPostFilterSEICharacteristicsTransCharacteristics[MAX_NUM_NN_POST_FILTERS];
+  uint32_t                m_nnPostFilterSEICharacteristicsMatrixCoeffs[MAX_NUM_NN_POST_FILTERS];
+#endif  
   uint32_t                m_nnPostFilterSEICharacteristicsInpOrderIdc[MAX_NUM_NN_POST_FILTERS];
   uint32_t                m_nnPostFilterSEICharacteristicsOutSampleIdc[MAX_NUM_NN_POST_FILTERS];
   uint32_t                m_nnPostFilterSEICharacteristicsOutOrderIdc[MAX_NUM_NN_POST_FILTERS];
@@ -1789,7 +1796,18 @@ public:
   uint32_t    getNNPostFilterSEICharacteristicsInpTensorBitDepthMinus8(int filterIdx) const                             { return m_nnPostFilterSEICharacteristicsInpTensorBitDepthMinus8[filterIdx]; }
   void        setNNPostFilterSEICharacteristicsOutTensorBitDepthMinus8(uint32_t outTensorBitDepthMinus8, int filterIdx) { m_nnPostFilterSEICharacteristicsOutTensorBitDepthMinus8[filterIdx] = outTensorBitDepthMinus8; }
   uint32_t    getNNPostFilterSEICharacteristicsOutTensorBitDepthMinus8(int filterIdx) const                             { return m_nnPostFilterSEICharacteristicsOutTensorBitDepthMinus8[filterIdx]; }
-
+#if JVET_AA0100
+  void        setNNPostFilterSEICharacteristicsAuxInpIdc(uint32_t AuxInpIdc, int filterIdx)                             { m_nnPostFilterSEICharacteristicsAuxInpIdc[filterIdx] = AuxInpIdc; }  
+  uint32_t    getNNPostFilterSEICharacteristicsAuxInpIdc(int filterIdx) const                                           { return m_nnPostFilterSEICharacteristicsAuxInpIdc[filterIdx]; } 
+  void        setNNPostFilterSEICharacteristicsSepColDescriptionFlag(bool SepColDescriptionFlag, int filterIdx)         { m_nnPostFilterSEICharacteristicsSepColDescriptionFlag[filterIdx] = SepColDescriptionFlag; }  
+  bool        getNNPostFilterSEICharacteristicsSepColDescriptionFlag(int filterIdx) const                               { return m_nnPostFilterSEICharacteristicsSepColDescriptionFlag[filterIdx]; } 
+  void        setNNPostFilterSEICharacteristicsColPrimaries(uint32_t ColPrimaries, int filterIdx)                       { m_nnPostFilterSEICharacteristicsColPrimaries[filterIdx] = ColPrimaries; }
+  uint32_t    getNNPostFilterSEICharacteristicsColPrimaries(int filterIdx) const                                        { return m_nnPostFilterSEICharacteristicsColPrimaries[filterIdx]; }
+  void        setNNPostFilterSEICharacteristicsTransCharacteristics(uint32_t TransCharacteristics, int filterIdx)       { m_nnPostFilterSEICharacteristicsTransCharacteristics[filterIdx] = TransCharacteristics; }
+  uint32_t    getNNPostFilterSEICharacteristicsTransCharacteristics(int filterIdx) const                                { return m_nnPostFilterSEICharacteristicsTransCharacteristics[filterIdx]; }
+  void        setNNPostFilterSEICharacteristicsMatrixCoeffs(uint32_t MatrixCoeffs, int filterIdx)                       { m_nnPostFilterSEICharacteristicsMatrixCoeffs[filterIdx] = MatrixCoeffs; }
+  uint32_t    getNNPostFilterSEICharacteristicsMatrixCoeffs(int filterIdx) const                                        { return m_nnPostFilterSEICharacteristicsMatrixCoeffs[filterIdx]; }
+#endif 
   void        setNNPostFilterSEICharacteristicsComponentLastFlag(bool componentLastFlag, int filterIdx)                 { m_nnPostFilterSEICharacteristicsComponentLastFlag[filterIdx] = componentLastFlag; }
   bool        getNNPostFilterSEICharacteristicsComponentLastFlag(int filterIdx) const                                   { return m_nnPostFilterSEICharacteristicsComponentLastFlag[filterIdx]; }
   void        setNNPostFilterSEICharacteristicsInpSampleIdc(uint32_t inpSampleIdc, int filterIdx)                       { m_nnPostFilterSEICharacteristicsInpSampleIdc[filterIdx] = inpSampleIdc; }
diff --git a/source/Lib/EncoderLib/SEIEncoder.cpp b/source/Lib/EncoderLib/SEIEncoder.cpp
index cbfa018d74..5a449ec440 100644
--- a/source/Lib/EncoderLib/SEIEncoder.cpp
+++ b/source/Lib/EncoderLib/SEIEncoder.cpp
@@ -1188,6 +1188,15 @@ void SEIEncoder::initSEINeuralNetworkPostFilterCharacteristics(SEINeuralNetworkP
     {
       sei->m_outTensorBitDepthMinus8 = m_pcCfg->getNNPostFilterSEICharacteristicsOutTensorBitDepthMinus8(filterIdx);
     }
+#if JVET_AA0100
+    sei->m_AuxInpIdc = m_pcCfg->getNNPostFilterSEICharacteristicsAuxInpIdc(filterIdx);
+    sei->m_SepColDescriptionFlag = m_pcCfg->getNNPostFilterSEICharacteristicsSepColDescriptionFlag(filterIdx);
+    if(sei->m_SepColDescriptionFlag){
+      sei->m_ColPrimaries = m_pcCfg->getNNPostFilterSEICharacteristicsColPrimaries(filterIdx);
+      sei->m_TransCharacteristics = m_pcCfg->getNNPostFilterSEICharacteristicsTransCharacteristics(filterIdx);
+      sei->m_MatrixCoeffs = m_pcCfg->getNNPostFilterSEICharacteristicsMatrixCoeffs(filterIdx);
+    }
+#endif
 
     sei->m_outOrderIdc = m_pcCfg->getNNPostFilterSEICharacteristicsOutOrderIdc(filterIdx);
     sei->m_constantPatchSizeFlag = m_pcCfg->getNNPostFilterSEICharacteristicsConstantPatchSizeFlag(filterIdx);
diff --git a/source/Lib/EncoderLib/SEIwrite.cpp b/source/Lib/EncoderLib/SEIwrite.cpp
index 0d3e33c501..8e1ff9162f 100644
--- a/source/Lib/EncoderLib/SEIwrite.cpp
+++ b/source/Lib/EncoderLib/SEIwrite.cpp
@@ -1419,6 +1419,16 @@ void SEIWriter::xWriteSEINeuralNetworkPostFilterCharacteristics(const SEINeuralN
     {
       WRITE_UVLC(sei.m_inpTensorBitDepthMinus8, "nnpfc_inp_tensor_bitdepth_minus8");
     }
+#if JVET_AA0100
+    WRITE_UVLC(sei.m_AuxInpIdc,"nnpfc_aux_inp_idc");
+    WRITE_FLAG(sei.m_SepColDescriptionFlag,"nnpfc_sep_col_desc_flag");
+
+    if(sei.m_SepColDescriptionFlag){
+      WRITE_CODE(sei.m_ColPrimaries,8,"nnpfc_col_primaries");
+      WRITE_CODE(sei.m_TransCharacteristics,8,"nnpfc_trans_characteristics");
+      WRITE_CODE(sei.m_MatrixCoeffs,8,"nnpfc_matrix_coeffs");
+    }
+#endif
 
     WRITE_UVLC(sei.m_inpOrderIdc, "nnpfc_inp_order_idc");
     WRITE_UVLC(sei.m_outSampleIdc, "nnpfc_out_sample_idc");
-- 
GitLab