diff --git a/cfg/sei_vui/neural_network_post_filter_characteristics.cfg b/cfg/sei_vui/neural_network_post_filter_characteristics.cfg index 352f8e252d871cd977d0bfd29a0cd475fe3d4c4c..86f252a92995fccd92c6563f6d2d7e72fc1f9818 100644 --- a/cfg/sei_vui/neural_network_post_filter_characteristics.cfg +++ b/cfg/sei_vui/neural_network_post_filter_characteristics.cfg @@ -25,12 +25,17 @@ SEINNPostFilterCharacteristicsConstantPatchSizeFlag0: 1 SEINNPostFilterCharacteristicsPatchWidthMinus10: 127 SEINNPostFilterCharacteristicsPatchHeightMinus10: 127 SEINNPostFilterCharacteristicsOverlap0: 4 -SEINNPostFilterCharacteristicsPaddingType0: 1 +SEINNPostFilterCharacteristicsPaddingType0: 1 SEINNPostFilterCharacteristicsComplexityIdc0: 1 -SEINNPostFilterCharacteristicsParameterTypeFlag0: 1 +SEINNPostFilterCharacteristicsParameterTypeIdc0: 1 SEINNPostFilterCharacteristicsLog2ParameterBitLengthMinus30: 3 SEINNPostFilterCharacteristicsNumParametersIdc0: 2 SEINNPostFilterCharacteristicsNumKmacOperationsIdc0: 512 SEINNPostFilterCharacteristicsPayloadFilename0: test.nnr + + +SEINNPostFilterCharacteristicsLumaPadding0: 12 +SEINNPostFilterCharacteristicsCbPadding0: 6 +SEINNPostFilterCharacteristicsCrPadding0: 6 \ No newline at end of file diff --git a/doc/software-manual.tex b/doc/software-manual.tex index 7390f04751d67ddc60ecd6fde54250cec15e1884..8096945d336d2fdbb92e04623d7cdbb8dcfb1f04 100644 --- a/doc/software-manual.tex +++ b/doc/software-manual.tex @@ -5526,19 +5526,34 @@ Specifies sii_num_units_in_shutter_interval for single entry.If multiple entries 0 & zero padding \\ 1 & replication padding \\ 2 & reflection padding \\ + 3 & wrap-around padding \\ + 4 & fixed padding \\ \end{tabular} \\ + \Option{SEINNPostFilterCharacteristicsLumaPadding\emph{i}} & + \Default{0} & + Specifies the luma padding when when nnpfc_padding_type is equal to 4 of the \emph{i}-th neural network post-filter. + \\ + \Option{SEINNPostFilterCharacteristicsCrPadding\emph{i}} & + \Default{0} & + Specifies the Cr padding when when nnpfc_padding_type is equal to 4 of the \emph{i}-th neural network post-filter. + \\ + \Option{SEINNPostFilterCharacteristicsCbPadding\emph{i}} & + \Default{0} & + Specifies the Cb padding when when nnpfc_padding_type is equal to 4 of the \emph{i}-th neural network post-filter. + \\ \Option{SEINNPostFilterCharacteristicsComplexityIdc\emph{i}} & \Default{0} & Specifies the nnpfc_complexity_idc of the \emph{i}-th neural network post-filter. \\ - \Option{SEINNPostFilterCharacteristicsParameterTypeFlag\emph{i}} & - \Default{false} & - Specifies the nnpfc_parameter_type_flag of the \emph{i}-th neural network post-filter. + \Option{SEINNPostFilterCharacteristicsParameterTypeIdc\emph{i}} & + \Default{0} & + Specifies the nnpfc_parameter_type_idc of the \emph{i}-th neural network post-filter. \par \begin{tabular}{cp{0.35\textwidth}} - false & Indicates that the \emph{i}-th neural network post-filter uses only integer parameters \\ - true & Indicates that the \emph{i}-th neural network post-filter may use floating point or integer parameters \\ + 0 & Indicates that the \emph{i}-th neural network post-filter uses only integer parameters \\ + 1 & Indicates that the \emph{i}-th neural network post-filter may use floating point or integer parameters \\ + 2 & Indicates that the \emph{i}-th neural network post-filter may use binary parameters \\ \end{tabular} \\ \Option{SEINNPostFilterCharacteristicsLog2ParameterBitLengthMinus3\emph{i}} & diff --git a/source/App/EncoderApp/EncApp.cpp b/source/App/EncoderApp/EncApp.cpp index b5e7fee33a0e0d2b80938878d95a38591b7a8063..c47847d564e6e70f2e2d05f2e12e1e5baf9911c3 100644 --- a/source/App/EncoderApp/EncApp.cpp +++ b/source/App/EncoderApp/EncApp.cpp @@ -1174,10 +1174,24 @@ void EncApp::xInitLibCfg() m_cEncLib.setNNPostFilterSEICharacteristicsPatchHeightMinus1 ( m_nnPostFilterSEICharacteristicsPatchHeightMinus1[i], i); m_cEncLib.setNNPostFilterSEICharacteristicsOverlap ( m_nnPostFilterSEICharacteristicsOverlap[i], i); m_cEncLib.setNNPostFilterSEICharacteristicsPaddingType ( m_nnPostFilterSEICharacteristicsPaddingType[i], i); +#if JVET_AA0055_SIGNAL_ADDITIONAL_PADDING + m_cEncLib.setNNPostFilterSEICharacteristicsLumaPadding (m_nnPostFilterSEICharacteristicsLumaPadding[i], i); + m_cEncLib.setNNPostFilterSEICharacteristicsCrPadding (m_nnPostFilterSEICharacteristicsCrPadding[i], i); + m_cEncLib.setNNPostFilterSEICharacteristicsCbPadding (m_nnPostFilterSEICharacteristicsCbPadding[i], i); +#endif m_cEncLib.setNNPostFilterSEICharacteristicsComplexityIdc ( m_nnPostFilterSEICharacteristicsComplexityIdc[i], i); if (m_cEncLib.getNNPostFilterSEICharacteristicsComplexityIdc(i) > 0) { +#if JVET_AA0055_SIGNAL_ADDITIONAL_PADDING + m_cEncLib.setNNPostFilterSEICharacteristicsLumaPadding (m_nnPostFilterSEICharacteristicsLumaPadding[i], i); + m_cEncLib.setNNPostFilterSEICharacteristicsCrPadding (m_nnPostFilterSEICharacteristicsCrPadding[i], i); + m_cEncLib.setNNPostFilterSEICharacteristicsCbPadding (m_nnPostFilterSEICharacteristicsCbPadding[i], i); +#endif +#if JVET_AA0055_SUPPORT_BINARY_NEURAL_NETWORK + m_cEncLib.setNNPostFilterSEICharacteristicsParameterTypeIdc (m_nnPostFilterSEICharacteristicsParameterTypeIdc[i], i); +#else m_cEncLib.setNNPostFilterSEICharacteristicsParameterTypeFlag ( m_nnPostFilterSEICharacteristicsParameterTypeFlag[i], i); +#endif m_cEncLib.setNNPostFilterSEICharacteristicsLog2ParameterBitLengthMinus3 ( m_nnPostFilterSEICharacteristicsLog2ParameterBitLengthMinus3[i], i); m_cEncLib.setNNPostFilterSEICharacteristicsNumParametersIdc ( m_nnPostFilterSEICharacteristicsNumParametersIdc[i], i); m_cEncLib.setNNPostFilterSEICharacteristicsNumKmacOperationsIdc ( m_nnPostFilterSEICharacteristicsNumKmacOperationsIdc[i], i); @@ -1217,7 +1231,11 @@ void EncApp::xInitLibCfg() m_cEncLib.setNNPostFilterSEICharacteristicsPaddingType ( m_nnPostFilterSEICharacteristicsPaddingType[i], i); m_cEncLib.setNNPostFilterSEICharacteristicsPayloadFilename ( m_nnPostFilterSEICharacteristicsPayloadFilename[i], i); m_cEncLib.setNNPostFilterSEICharacteristicsComplexityIdc ( m_nnPostFilterSEICharacteristicsComplexityIdc[i], i); +#if JVET_AA0055_SUPPORT_BINARY_NEURAL_NETWORK + m_cEncLib.setNNPostFilterSEICharacteristicsParameterTypeIdc (m_nnPostFilterSEICharacteristicsParameterTypeIdc[i], i); +#else m_cEncLib.setNNPostFilterSEICharacteristicsParameterTypeFlag ( m_nnPostFilterSEICharacteristicsParameterTypeFlag[i], i); +#endif m_cEncLib.setNNPostFilterSEICharacteristicsLog2ParameterBitLengthMinus3 ( m_nnPostFilterSEICharacteristicsLog2ParameterBitLengthMinus3[i], i); m_cEncLib.setNNPostFilterSEICharacteristicsNumParametersIdc ( m_nnPostFilterSEICharacteristicsNumParametersIdc[i], i); m_cEncLib.setNNPostFilterSEICharacteristicsNumKmacOperationsIdc ( m_nnPostFilterSEICharacteristicsNumKmacOperationsIdc[i], i); diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp index 60ee1bc90d77bac2bfa534f62c3e9077086f7999..de7146ac5088a455e55f2c38801c64dd2eacb472 100644 --- a/source/App/EncoderApp/EncAppCfg.cpp +++ b/source/App/EncoderApp/EncAppCfg.cpp @@ -1800,13 +1800,33 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) paddingType << "SEINNPostFilterCharacteristicsPaddingType" << i; opts.addOptions()(paddingType.str(), m_nnPostFilterSEICharacteristicsPaddingType[i], 0u, "Specifies the process of padding when referencing sample locations outside the boundaries of the cropped decoded output picture "); +#if JVET_AA0055_SIGNAL_ADDITIONAL_PADDING + std::ostringstream lumaPadding; + lumaPadding << "SEINNPostFilterCharacteristicsLumaPadding" << i; + opts.addOptions()(lumaPadding.str(), m_nnPostFilterSEICharacteristicsLumaPadding[i], 0u, "Specifies the luma padding when when the padding type is fixed padding "); + + std::ostringstream crPadding; + crPadding << "SEINNPostFilterCharacteristicsCrPadding" << i; + opts.addOptions()(crPadding.str(), m_nnPostFilterSEICharacteristicsCrPadding[i], 0u, "Specifies the Cr padding when when the padding type is fixed padding "); + + std::ostringstream cbPadding; + cbPadding << "SEINNPostFilterCharacteristicsCbPadding" << i; + opts.addOptions()(cbPadding.str(), m_nnPostFilterSEICharacteristicsCbPadding[i], 0u, "Specifies the Cb padding when when the padding type is fixed padding "); +#endif + std::ostringstream complexityIdc; complexityIdc << "SEINNPostFilterCharacteristicsComplexityIdc" << i; opts.addOptions()(complexityIdc.str(), m_nnPostFilterSEICharacteristicsComplexityIdc[i], 0u, "Specifies the value of nnpfc_complexity_idc in the Neural Network Post Filter Characteristics SEI message"); +#if JVET_AA0055_SUPPORT_BINARY_NEURAL_NETWORK + std::ostringstream parameterTypeIdc; + parameterTypeIdc << "SEINNPostFilterCharacteristicsParameterTypeIdc" << i; + opts.addOptions()(parameterTypeIdc.str(), m_nnPostFilterSEICharacteristicsParameterTypeIdc[i], 0u, "Specifies the data type of parameters in the Neural Network Post Filter Characteristics SEI message"); +#else std::ostringstream parameterTypeFlag; parameterTypeFlag << "SEINNPostFilterCharacteristicsParameterTypeFlag" << i; opts.addOptions()(parameterTypeFlag.str(), m_nnPostFilterSEICharacteristicsParameterTypeFlag[i], false, "Specifies the data type of parameters in the Neural Network Post Filter Characteristics SEI message"); +#endif std::ostringstream log2ParameterBitLengthMinus3; log2ParameterBitLengthMinus3 << "SEINNPostFilterCharacteristicsLog2ParameterBitLengthMinus3" << i; diff --git a/source/App/EncoderApp/EncAppCfg.h b/source/App/EncoderApp/EncAppCfg.h index 5069dab0552af65c432257606a29232d4a8752d0..5885cbe7d2f1bbc9fcfd06cd11c2eafc4195bffe 100644 --- a/source/App/EncoderApp/EncAppCfg.h +++ b/source/App/EncoderApp/EncAppCfg.h @@ -765,9 +765,18 @@ protected: uint32_t m_nnPostFilterSEICharacteristicsPatchHeightMinus1[MAX_NUM_NN_POST_FILTERS]; uint32_t m_nnPostFilterSEICharacteristicsOverlap[MAX_NUM_NN_POST_FILTERS]; uint32_t m_nnPostFilterSEICharacteristicsPaddingType[MAX_NUM_NN_POST_FILTERS]; +#if JVET_AA0055_SIGNAL_ADDITIONAL_PADDING + uint32_t m_nnPostFilterSEICharacteristicsLumaPadding[MAX_NUM_NN_POST_FILTERS]; + uint32_t m_nnPostFilterSEICharacteristicsCbPadding[MAX_NUM_NN_POST_FILTERS]; + uint32_t m_nnPostFilterSEICharacteristicsCrPadding[MAX_NUM_NN_POST_FILTERS]; +#endif std::string m_nnPostFilterSEICharacteristicsPayloadFilename[MAX_NUM_NN_POST_FILTERS]; uint32_t m_nnPostFilterSEICharacteristicsComplexityIdc[MAX_NUM_NN_POST_FILTERS]; +#if JVET_AA0055_SUPPORT_BINARY_NEURAL_NETWORK + uint32_t m_nnPostFilterSEICharacteristicsParameterTypeIdc[MAX_NUM_NN_POST_FILTERS]; +#else bool m_nnPostFilterSEICharacteristicsParameterTypeFlag[MAX_NUM_NN_POST_FILTERS]; +#endif uint32_t m_nnPostFilterSEICharacteristicsLog2ParameterBitLengthMinus3[MAX_NUM_NN_POST_FILTERS]; uint32_t m_nnPostFilterSEICharacteristicsNumParametersIdc[MAX_NUM_NN_POST_FILTERS]; uint32_t m_nnPostFilterSEICharacteristicsNumKmacOperationsIdc[MAX_NUM_NN_POST_FILTERS]; diff --git a/source/Lib/CommonLib/SEI.h b/source/Lib/CommonLib/SEI.h index b002e9087b8b89853628f03ada2ba6c247c00ee3..93cad1ad29e1d42f2f767268ea97a1eae22eee4c 100644 --- a/source/Lib/CommonLib/SEI.h +++ b/source/Lib/CommonLib/SEI.h @@ -1137,9 +1137,18 @@ public: , m_patchHeightMinus1(0) , m_overlap(0) , m_paddingType(0) +#if JVET_AA0055_SIGNAL_ADDITIONAL_PADDING + , m_lumaPadding(0) + , m_cbPadding(0) + , m_crPadding(0) +#endif , m_payloadByte(nullptr) , m_complexityIdc(0) +#if JVET_AA0055_SUPPORT_BINARY_NEURAL_NETWORK + , m_parameterTypeIdc(0) +#else , m_parameterTypeFlag(false) +#endif , m_log2ParameterBitLengthMinus3(0) , m_numParametersIdc(0) , m_numKmacOperationsIdc(0) @@ -1189,10 +1198,19 @@ public: uint32_t m_patchHeightMinus1; uint32_t m_overlap; uint32_t m_paddingType; +#if JVET_AA0055_SIGNAL_ADDITIONAL_PADDING + uint32_t m_lumaPadding; + uint32_t m_cbPadding; + uint32_t m_crPadding; +#endif uint64_t m_payloadLength; char* m_payloadByte; uint32_t m_complexityIdc; +#if JVET_AA0055_SUPPORT_BINARY_NEURAL_NETWORK + uint32_t m_parameterTypeIdc; +#else bool m_parameterTypeFlag; +#endif uint32_t m_log2ParameterBitLengthMinus3; uint32_t m_numParametersIdc; uint32_t m_numKmacOperationsIdc; diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index ca5bd314182422bd27037f0f054f152fa99b6652..1d6b05c0c305ea51f5713d69ddb24fe9803bcf8e 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -61,6 +61,8 @@ #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) +#define JVET_AA0055_SIGNAL_ADDITIONAL_PADDING 1 // JVET-AA0055 PROPOSAL A: Allow for signalling additional padding types for the neural network +#define JVET_AA0055_SUPPORT_BINARY_NEURAL_NETWORK 1 // JVET-AA0055 PROPOSAL B: Allow for signalling the use of binary neural network //########### 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. @@ -681,6 +683,17 @@ enum SAOEOClasses NUM_SAO_EO_CLASSES, }; +#if JVET_AA0055_SIGNAL_ADDITIONAL_PADDING +enum NNPC_PaddingType +{ + ZERO_PADDING = 0, + REPLICATION_PADDING = 1, + REFLECTION_PADDING = 2, + WRAP_AROUND_PADDING = 3, + FIXED_PADDING = 4 +}; +#endif + #define NUM_SAO_BO_CLASSES_LOG2 5 #define NUM_SAO_BO_CLASSES (1<<NUM_SAO_BO_CLASSES_LOG2) diff --git a/source/Lib/DecoderLib/SEIread.cpp b/source/Lib/DecoderLib/SEIread.cpp index 6afd8d990d07914c46b411d0e36df956adbe5448..6a38be7d2094d9b0d899a89156e5bbd7e475ca31 100644 --- a/source/Lib/DecoderLib/SEIread.cpp +++ b/source/Lib/DecoderLib/SEIread.cpp @@ -2652,6 +2652,20 @@ void SEIReader::xParseSEINNPostFilterCharacteristics(SEINeuralNetworkPostFilterC sei_read_uvlc(pDecodedMessageOutputStream, val, "nnpfc_padding_type"); sei.m_paddingType = val; +#if JVET_AA0055_SIGNAL_ADDITIONAL_PADDING + if (sei.m_paddingType == NNPC_PaddingType::FIXED_PADDING) + { + sei_read_uvlc(pDecodedMessageOutputStream, val, "nnpfc_luma_padding_val"); + sei.m_lumaPadding = val; + + sei_read_uvlc(pDecodedMessageOutputStream, val, "nnpfc_cb_padding_val"); + sei.m_cbPadding = val; + + sei_read_uvlc(pDecodedMessageOutputStream, val, "nnpfc_cr_padding_val"); + sei.m_crPadding = val; + } +#endif + sei_read_uvlc(pDecodedMessageOutputStream, val, "nnpfc_complexity_idc"); sei.m_complexityIdc = val; @@ -2659,11 +2673,21 @@ void SEIReader::xParseSEINNPostFilterCharacteristics(SEINeuralNetworkPostFilterC { if(sei.m_complexityIdc == 1) { +#if JVET_AA0055_SUPPORT_BINARY_NEURAL_NETWORK + sei_read_code(pDecodedMessageOutputStream, 2, val, "nnpfc_parameter_type_idc"); + sei.m_parameterTypeIdc = val; + if (sei.m_parameterTypeIdc != 2) + { + sei_read_code(pDecodedMessageOutputStream, 2, val, "nnpfc_log2_parameter_bit_length_minus3"); + sei.m_log2ParameterBitLengthMinus3 = val; + } +#else sei_read_flag(pDecodedMessageOutputStream, val, "nnpfc_parameter_type_flag"); sei.m_parameterTypeFlag = val; sei_read_code(pDecodedMessageOutputStream, 2, val, "nnpfc_log2_parameter_bit_length_minus3"); sei.m_log2ParameterBitLengthMinus3 = val; +#endif #if JVET_AA0067_NNPFC_SEI_FIX sei_read_code(pDecodedMessageOutputStream, 6, val, "nnpfc_num_parameters_idc"); diff --git a/source/Lib/EncoderLib/EncCfg.h b/source/Lib/EncoderLib/EncCfg.h index f07e33be1e9fc24e7b73cb07b2863cc0ed533911..f8465094ef1b1dfe330818c3c25abc97e8cb3d53 100644 --- a/source/Lib/EncoderLib/EncCfg.h +++ b/source/Lib/EncoderLib/EncCfg.h @@ -707,9 +707,18 @@ protected: uint32_t m_nnPostFilterSEICharacteristicsPatchHeightMinus1[MAX_NUM_NN_POST_FILTERS]; uint32_t m_nnPostFilterSEICharacteristicsOverlap[MAX_NUM_NN_POST_FILTERS]; uint32_t m_nnPostFilterSEICharacteristicsPaddingType[MAX_NUM_NN_POST_FILTERS]; +#if JVET_AA0055_SIGNAL_ADDITIONAL_PADDING + uint32_t m_nnPostFilterSEICharacteristicsLumaPadding[MAX_NUM_NN_POST_FILTERS]; + uint32_t m_nnPostFilterSEICharacteristicsCrPadding[MAX_NUM_NN_POST_FILTERS]; + uint32_t m_nnPostFilterSEICharacteristicsCbPadding[MAX_NUM_NN_POST_FILTERS]; +#endif std::string m_nnPostFilterSEICharacteristicsPayloadFilename[MAX_NUM_NN_POST_FILTERS]; uint32_t m_nnPostFilterSEICharacteristicsComplexityIdc[MAX_NUM_NN_POST_FILTERS]; +#if JVET_AA0055_SUPPORT_BINARY_NEURAL_NETWORK + uint32_t m_nnPostFilterSEICharacteristicsParameterTypeIdc[MAX_NUM_NN_POST_FILTERS]; +#else bool m_nnPostFilterSEICharacteristicsParameterTypeFlag [MAX_NUM_NN_POST_FILTERS]; +#endif uint32_t m_nnPostFilterSEICharacteristicsLog2ParameterBitLengthMinus3[MAX_NUM_NN_POST_FILTERS]; uint32_t m_nnPostFilterSEICharacteristicsNumParametersIdc[MAX_NUM_NN_POST_FILTERS]; uint32_t m_nnPostFilterSEICharacteristicsNumKmacOperationsIdc[MAX_NUM_NN_POST_FILTERS]; @@ -1864,10 +1873,24 @@ public: void setNNPostFilterSEICharacteristicsPaddingType(uint32_t paddingType, int filterIdx) { m_nnPostFilterSEICharacteristicsPaddingType[filterIdx] = paddingType; } uint32_t getNNPostFilterSEICharacteristicsPaddingType(int filterIdx) const { return m_nnPostFilterSEICharacteristicsPaddingType[filterIdx]; } +#if JVET_AA0055_SIGNAL_ADDITIONAL_PADDING + void setNNPostFilterSEICharacteristicsLumaPadding(uint32_t lumaPadding, int filterIdx) { m_nnPostFilterSEICharacteristicsLumaPadding[filterIdx] = lumaPadding; } + uint32_t getNNPostFilterSEICharacteristicsLumaPadding(int filterIdx) const { return m_nnPostFilterSEICharacteristicsLumaPadding[filterIdx]; } + void setNNPostFilterSEICharacteristicsCbPadding(uint32_t cbPadding, int filterIdx) { m_nnPostFilterSEICharacteristicsCbPadding[filterIdx] = cbPadding; } + uint32_t getNNPostFilterSEICharacteristicsCbPadding(int filterIdx) const { return m_nnPostFilterSEICharacteristicsCbPadding[filterIdx]; } + void setNNPostFilterSEICharacteristicsCrPadding(uint32_t crPadding, int filterIdx) { m_nnPostFilterSEICharacteristicsCrPadding[filterIdx] = crPadding; } + uint32_t getNNPostFilterSEICharacteristicsCrPadding(int filterIdx) const { return m_nnPostFilterSEICharacteristicsCrPadding[filterIdx]; } +#endif + void setNNPostFilterSEICharacteristicsComplexityIdc (uint32_t complexityIdc , int filterIdx) { m_nnPostFilterSEICharacteristicsComplexityIdc[filterIdx] = complexityIdc ; } uint32_t getNNPostFilterSEICharacteristicsComplexityIdc (int filterIdx) const { return m_nnPostFilterSEICharacteristicsComplexityIdc[filterIdx]; } +#if JVET_AA0055_SUPPORT_BINARY_NEURAL_NETWORK + void setNNPostFilterSEICharacteristicsParameterTypeIdc(uint32_t parameterTypeIdc, int filterIdx) { m_nnPostFilterSEICharacteristicsParameterTypeIdc[filterIdx] = parameterTypeIdc; } + uint32_t getNNPostFilterSEICharacteristicsParameterTypeIdc(int filterIdx) const { return m_nnPostFilterSEICharacteristicsParameterTypeIdc[filterIdx]; } +#else void setNNPostFilterSEICharacteristicsParameterTypeFlag(bool parameterTypeFlag, int filterIdx) { m_nnPostFilterSEICharacteristicsParameterTypeFlag[filterIdx] = parameterTypeFlag; } bool getNNPostFilterSEICharacteristicsParameterTypeFlag(int filterIdx) const { return m_nnPostFilterSEICharacteristicsParameterTypeFlag[filterIdx]; } +#endif void setNNPostFilterSEICharacteristicsLog2ParameterBitLengthMinus3 (uint32_t log2ParameterBitLengthMinus3 , int filterIdx) { m_nnPostFilterSEICharacteristicsLog2ParameterBitLengthMinus3[filterIdx] = log2ParameterBitLengthMinus3 ; } uint32_t getNNPostFilterSEICharacteristicsLog2ParameterBitLengthMinus3 (int filterIdx) const { return m_nnPostFilterSEICharacteristicsLog2ParameterBitLengthMinus3[filterIdx]; } void setNNPostFilterSEICharacteristicsNumParametersIdc (uint32_t numParametersIdc , int filterIdx) { m_nnPostFilterSEICharacteristicsNumParametersIdc[filterIdx] = numParametersIdc ; } diff --git a/source/Lib/EncoderLib/SEIEncoder.cpp b/source/Lib/EncoderLib/SEIEncoder.cpp index 2a706588f27d2371d222ca6f99e80692f8e0a05e..a22e52e4bfa7e6e596f71464d0a2646e893baeb2 100644 --- a/source/Lib/EncoderLib/SEIEncoder.cpp +++ b/source/Lib/EncoderLib/SEIEncoder.cpp @@ -1258,13 +1258,22 @@ void SEIEncoder::initSEINeuralNetworkPostFilterCharacteristics(SEINeuralNetworkP sei->m_patchHeightMinus1 = m_pcCfg->getNNPostFilterSEICharacteristicsPatchHeightMinus1(filterIdx); sei->m_overlap = m_pcCfg->getNNPostFilterSEICharacteristicsOverlap(filterIdx); sei->m_paddingType = m_pcCfg->getNNPostFilterSEICharacteristicsPaddingType(filterIdx); +#if JVET_AA0055_SIGNAL_ADDITIONAL_PADDING + sei->m_lumaPadding = m_pcCfg->getNNPostFilterSEICharacteristicsLumaPadding(filterIdx); + sei->m_cbPadding = m_pcCfg->getNNPostFilterSEICharacteristicsCbPadding(filterIdx); + sei->m_crPadding = m_pcCfg->getNNPostFilterSEICharacteristicsCrPadding(filterIdx); +#endif sei->m_complexityIdc = m_pcCfg->getNNPostFilterSEICharacteristicsComplexityIdc(filterIdx); if(sei->m_complexityIdc > 0) { if(sei->m_complexityIdc == 1) { +#if JVET_AA0055_SUPPORT_BINARY_NEURAL_NETWORK + sei->m_parameterTypeIdc = m_pcCfg->getNNPostFilterSEICharacteristicsParameterTypeIdc(filterIdx); +#else sei->m_parameterTypeFlag = m_pcCfg->getNNPostFilterSEICharacteristicsParameterTypeFlag(filterIdx); +#endif sei->m_log2ParameterBitLengthMinus3 = m_pcCfg->getNNPostFilterSEICharacteristicsLog2ParameterBitLengthMinus3(filterIdx); sei->m_numParametersIdc = m_pcCfg->getNNPostFilterSEICharacteristicsNumParametersIdc(filterIdx); sei->m_numKmacOperationsIdc = m_pcCfg->getNNPostFilterSEICharacteristicsNumKmacOperationsIdc(filterIdx); diff --git a/source/Lib/EncoderLib/SEIwrite.cpp b/source/Lib/EncoderLib/SEIwrite.cpp index ca2e6c07b7b120c2456cc47c6155a79769bad560..4ca4b4f2338c1928866948715a87c50dfc459851 100644 --- a/source/Lib/EncoderLib/SEIwrite.cpp +++ b/source/Lib/EncoderLib/SEIwrite.cpp @@ -1484,6 +1484,14 @@ void SEIWriter::xWriteSEINeuralNetworkPostFilterCharacteristics(const SEINeuralN WRITE_UVLC(sei.m_patchHeightMinus1, "nnpfc_patch_height_minus1"); WRITE_UVLC(sei.m_overlap, "nnpfc_overlap"); WRITE_UVLC(sei.m_paddingType, "nnpfc_padding_type"); +#if JVET_AA0055_SIGNAL_ADDITIONAL_PADDING + if (sei.m_paddingType == NNPC_PaddingType::FIXED_PADDING) + { + WRITE_UVLC(sei.m_lumaPadding, "nnpfc_luma_padding_val"); + WRITE_UVLC(sei.m_cbPadding, "nnpfc_cb_padding_val"); + WRITE_UVLC(sei.m_crPadding, "nnpfc_cr_padding_val"); + } +#endif WRITE_UVLC(sei.m_complexityIdc, "nnpfc_complexity_idc"); if(sei.m_complexityIdc > 0) @@ -1508,8 +1516,16 @@ void SEIWriter::xWriteNNPFCComplexityElement(const SEINeuralNetworkPostFilterCha { if(sei.m_complexityIdc == 1) { +#if JVET_AA0055_SUPPORT_BINARY_NEURAL_NETWORK + WRITE_CODE(sei.m_parameterTypeIdc, 2, "nnpfc_parameter_type_idc"); + if (sei.m_parameterTypeIdc != 2) + { + WRITE_CODE(sei.m_log2ParameterBitLengthMinus3, 2, "nnpfc_log2_parameter_bit_length_minus3"); + } +#else WRITE_FLAG(sei.m_parameterTypeFlag, "nnpfc_parameter_type_flag"); WRITE_CODE(sei.m_log2ParameterBitLengthMinus3, 2, "nnpfc_log2_parameter_bit_length_minus3"); +#endif #if JVET_AA0067_NNPFC_SEI_FIX WRITE_CODE(sei.m_numParametersIdc, 6, "nnpfc_num_parameters_idc"); #else