diff --git a/cfg/sei_vui/neural_network_post_filter_characteristics.cfg b/cfg/sei_vui/neural_network_post_filter_characteristics.cfg index 73899f5b8da8bed109ad2a0e5a552db819b23223..2d724232c28ae69d5495e4de91e37b6fe1755f51 100644 --- a/cfg/sei_vui/neural_network_post_filter_characteristics.cfg +++ b/cfg/sei_vui/neural_network_post_filter_characteristics.cfg @@ -15,6 +15,7 @@ SEINNPFCInpTensorBitDepthLumaMinusEight0: 2 SEINNPFCInpTensorBitDepthChromaMinusEight0: 2 SEINNPFCAuxInpIdc0: 1 SEINNPFCSepColDescriptionFlag0: 0 +SEINNPFCFullRangeFlag0: 0 SEINNPFCColPrimaries0: 9 SEINNPFCTransCharacteristics0: 16 SEINNPFCMatrixCoeffs0: 14 diff --git a/doc/software-manual.tex b/doc/software-manual.tex index 0393dc40609aba215eb2544f83c9106c0dce8e8f..66245553ee15d952de606c44f04be39c4c7c1e7d 100644 --- a/doc/software-manual.tex +++ b/doc/software-manual.tex @@ -5831,6 +5831,12 @@ Specifies sii_num_units_in_shutter_interval for single entry.If multiple entries \par 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. \\ + \Option{SEINNPFCFullRangeFlag\emph{i}} & + \Default{false} & + Specifies scaling and offset values applied in association with the matrix coefficients as specified by nnpfc_matrix_coeff. + \par + Semantics of nnpfc_full_range_flag are as specified for the VideoFullRangeFlag parameter in Rec. ITU-T H.273 | ISO/IEC 23091-2 + \\ \Option{SEINNPFCColPrimaries\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. diff --git a/source/App/EncoderApp/EncApp.cpp b/source/App/EncoderApp/EncApp.cpp index eba3348e83fc90a1d87641631e14d7ff0606ce1b..c224be31c397a697a81ee089be3a583bf34c467c 100644 --- a/source/App/EncoderApp/EncApp.cpp +++ b/source/App/EncoderApp/EncApp.cpp @@ -1306,6 +1306,12 @@ void EncApp::xInitLibCfg( int layerIdx ) m_cEncLib.setNNPostFilterSEICharacteristicsTransCharacteristics (m_nnPostFilterSEICharacteristicsTransCharacteristics[i],i); m_cEncLib.setNNPostFilterSEICharacteristicsMatrixCoeffs (m_nnPostFilterSEICharacteristicsMatrixCoeffs[i],i); } +#if JVET_AD0067_INCLUDE_SYNTAX + if (m_cEncLib.getNNPostFilterSEICharacteristicsSepColDescriptionFlag(i) && (m_cEncLib.getNNPostFilterSEICharacteristicsOutFormatIdc(i)==1)) + { + m_cEncLib.setNNPostFilterSEICharacteristicsFullRangeFlag (m_nnPostFilterSEICharacteristicsFullRangeFlag[i],i); + } +#endif } m_cEncLib.setNnPostFilterSEIActivationEnabled (m_nnPostFilterSEIActivationEnabled); m_cEncLib.setNnPostFilterSEIActivationTargetId(m_nnPostFilterSEIActivationTargetId); diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp index 5588fe327c897f7850e7ebec702755a8a8e9d393..ce3a81427613317fe6fd9e3f660246d2f5fb4a13 100644 --- a/source/App/EncoderApp/EncAppCfg.cpp +++ b/source/App/EncoderApp/EncAppCfg.cpp @@ -1845,6 +1845,12 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) sepColDescriptionFlag << "SEINNPFCSepColDescriptionFlag" << 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"); +#if JVET_AD0067_INCLUDE_SYNTAX + std::ostringstream fullRangeFlag; + fullRangeFlag << "SEINNPFCFullRangeFlag" << i; + opts.addOptions()(fullRangeFlag.str(), m_nnPostFilterSEICharacteristicsFullRangeFlag[i], false, "Specifies scaling and offset values applied in association with the matrix coefficients as specified by nnpfc_matrix_coeff."); +#endif + std::ostringstream colPrimaries; colPrimaries << "SEINNPFCColPrimaries" << i; opts.addOptions()(colPrimaries.str(), m_nnPostFilterSEICharacteristicsColPrimaries[i], 0u, "Specifies color primaries in the Nueral Network Post Filter Characteristics SEI message"); diff --git a/source/App/EncoderApp/EncAppCfg.h b/source/App/EncoderApp/EncAppCfg.h index 7978a59b2082b6e4cf43f57d6718bbae4b96d0b4..f9d5c700b63d4623e678cf7c0afd957f70d69750 100644 --- a/source/App/EncoderApp/EncAppCfg.h +++ b/source/App/EncoderApp/EncAppCfg.h @@ -754,6 +754,9 @@ protected: uint32_t m_nnPostFilterSEICharacteristicsInpFormatIdc[MAX_NUM_NN_POST_FILTERS]; uint32_t m_nnPostFilterSEICharacteristicsAuxInpIdc[MAX_NUM_NN_POST_FILTERS]; bool m_nnPostFilterSEICharacteristicsSepColDescriptionFlag[MAX_NUM_NN_POST_FILTERS]; +#if JVET_AD0067_INCLUDE_SYNTAX + bool m_nnPostFilterSEICharacteristicsFullRangeFlag[MAX_NUM_NN_POST_FILTERS]; +#endif 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]; diff --git a/source/Lib/CommonLib/SEI.cpp b/source/Lib/CommonLib/SEI.cpp index 8bcc8c709ac9e99feadc9c9dbbd365791e02f2e6..8ffabba64e2f84112de78fa9344ec4b6ef13398a 100644 --- a/source/Lib/CommonLib/SEI.cpp +++ b/source/Lib/CommonLib/SEI.cpp @@ -1089,6 +1089,9 @@ SEINeuralNetworkPostFilterCharacteristics::SEINeuralNetworkPostFilterCharacteris m_inpFormatIdc = sei.m_inpFormatIdc; m_auxInpIdc = sei.m_auxInpIdc; m_sepColDescriptionFlag = sei.m_sepColDescriptionFlag; +#if JVET_AD0067_INCLUDE_SYNTAX + m_fullRangeFlag = sei.m_fullRangeFlag; +#endif m_colPrimaries = sei.m_colPrimaries; m_transCharacteristics = sei.m_transCharacteristics; m_matrixCoeffs = sei.m_matrixCoeffs; diff --git a/source/Lib/CommonLib/SEI.h b/source/Lib/CommonLib/SEI.h index f79e51cc56ebb4c37e5bf470ddb71bf5827f6bdd..f269f2ade58fa7570cc868c2e7068898551d82c4 100644 --- a/source/Lib/CommonLib/SEI.h +++ b/source/Lib/CommonLib/SEI.h @@ -1231,6 +1231,9 @@ public: , m_inpFormatIdc(0) , m_auxInpIdc(0) , m_sepColDescriptionFlag(false) +#if JVET_AD0067_INCLUDE_SYNTAX + , m_fullRangeFlag(false) +#endif , m_colPrimaries(0) , m_transCharacteristics(0) , m_matrixCoeffs(0) @@ -1293,6 +1296,9 @@ public: uint32_t m_inpFormatIdc; uint32_t m_auxInpIdc; bool m_sepColDescriptionFlag; +#if JVET_AD0067_INCLUDE_SYNTAX + bool m_fullRangeFlag; +#endif uint8_t m_colPrimaries; uint8_t m_transCharacteristics; uint8_t m_matrixCoeffs; diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 733ce5e8b81b0e7d50f7efba9b8a9500b80e4744..4af8cbcab2f6e1bb96d85019b025395b2c16f737 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -88,6 +88,8 @@ #define APPLY_SBT_SL_ON_MTS 1 // apply save & load fast algorithm on inter MTS when SBT is on +#define JVET_AD0067_INCLUDE_SYNTAX 1 // include nnpfc_full_range_flag syntax element in the nnpfc sei message when nnpfc_separate_colour_description_present_flag is equal to 1 and when nnpfc_out_format_idc is equal to 1. + #define REUSE_CU_RESULTS 1 #if REUSE_CU_RESULTS #define REUSE_CU_RESULTS_WITH_MULTIPLE_TUS 1 diff --git a/source/Lib/DecoderLib/SEIread.cpp b/source/Lib/DecoderLib/SEIread.cpp index 6aef1c7dbab60edd896161c3d58161c73f7c0374..a832e3c6d1d695066360ff1661ce38413c913337 100644 --- a/source/Lib/DecoderLib/SEIread.cpp +++ b/source/Lib/DecoderLib/SEIread.cpp @@ -2999,7 +2999,14 @@ void SEIReader::xParseSEINNPostFilterCharacteristics(SEINeuralNetworkPostFilterC sei_read_uvlc(pDecodedMessageOutputStream, val, "nnpfc_out_tensor_bitdepth_chroma_minus8"); sei.m_outTensorBitDepthChromaMinus8 = val; } - + +#if JVET_AD0067_INCLUDE_SYNTAX + if (sei.m_sepColDescriptionFlag & (sei.m_outFormatIdc == 1)) + { + sei_read_flag(pDecodedMessageOutputStream, val, "nnpfc_full_range_flag"); + sei.m_fullRangeFlag = val; + } +#endif sei_read_uvlc(pDecodedMessageOutputStream, val, "nnpfc_out_order_idc"); sei.m_outOrderIdc = val; CHECK(((sei.m_purpose & NNPC_PurposeType::CHROMA_UPSAMPLING) != 0) && (sei.m_outOrderIdc == 3), "When nnpfc_purpose & 0x02 is not equal to 0, nnpfc_out_order_idc shall not be equal to 3.") diff --git a/source/Lib/EncoderLib/EncCfg.h b/source/Lib/EncoderLib/EncCfg.h index 43219de878aed0fe087680dd79bdce5d3a315abe..39a524f539542e98d9bb0e851070135a01af1263 100644 --- a/source/Lib/EncoderLib/EncCfg.h +++ b/source/Lib/EncoderLib/EncCfg.h @@ -719,6 +719,9 @@ protected: uint32_t m_nnPostFilterSEICharacteristicsInpFormatIdc[MAX_NUM_NN_POST_FILTERS]; uint32_t m_nnPostFilterSEICharacteristicsAuxInpIdc[MAX_NUM_NN_POST_FILTERS]; bool m_nnPostFilterSEICharacteristicsSepColDescriptionFlag[MAX_NUM_NN_POST_FILTERS]; +#if JVET_AD0067_INCLUDE_SYNTAX + bool m_nnPostFilterSEICharacteristicsFullRangeFlag[MAX_NUM_NN_POST_FILTERS]; +#endif 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]; @@ -1979,6 +1982,16 @@ public: { return m_nnPostFilterSEICharacteristicsSepColDescriptionFlag[filterIdx]; } +#if JVET_AD0067_INCLUDE_SYNTAX + void setNNPostFilterSEICharacteristicsFullRangeFlag(bool fullRangeFlag, int filterIdx) + { + m_nnPostFilterSEICharacteristicsFullRangeFlag[filterIdx] = fullRangeFlag; + } + bool getNNPostFilterSEICharacteristicsFullRangeFlag(int filterIdx) const + { + return m_nnPostFilterSEICharacteristicsFullRangeFlag[filterIdx]; + } +#endif 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; } diff --git a/source/Lib/EncoderLib/SEIEncoder.cpp b/source/Lib/EncoderLib/SEIEncoder.cpp index 0adddea18f2e3792b3399ddad614d0c20e7357f8..5e86e449c4386d19c6b3cbb8e8bfb98390c717e9 100644 --- a/source/Lib/EncoderLib/SEIEncoder.cpp +++ b/source/Lib/EncoderLib/SEIEncoder.cpp @@ -1420,6 +1420,12 @@ void SEIEncoder::initSEINeuralNetworkPostFilterCharacteristics(SEINeuralNetworkP sei->m_outTensorBitDepthLumaMinus8 = m_pcCfg->getNNPostFilterSEICharacteristicsOutTensorBitDepthLumaMinus8(filterIdx); sei->m_outTensorBitDepthChromaMinus8 = m_pcCfg->getNNPostFilterSEICharacteristicsOutTensorBitDepthChromaMinus8(filterIdx); } +#if JVET_AD0067_INCLUDE_SYNTAX + if (sei->m_sepColDescriptionFlag && (sei->m_outFormatIdc == 1)) + { + sei->m_fullRangeFlag = m_pcCfg->getNNPostFilterSEICharacteristicsFullRangeFlag(filterIdx); + } +#endif sei->m_outOrderIdc = m_pcCfg->getNNPostFilterSEICharacteristicsOutOrderIdc(filterIdx); sei->m_constantPatchSizeFlag = m_pcCfg->getNNPostFilterSEICharacteristicsConstantPatchSizeFlag(filterIdx); sei->m_patchWidthMinus1 = m_pcCfg->getNNPostFilterSEICharacteristicsPatchWidthMinus1(filterIdx); diff --git a/source/Lib/EncoderLib/SEIwrite.cpp b/source/Lib/EncoderLib/SEIwrite.cpp index d99a802eac7f6aed66d7da64a2b807474d67b818..3328556e237fdb932a7be216a0caf0705c7c4375 100644 --- a/source/Lib/EncoderLib/SEIwrite.cpp +++ b/source/Lib/EncoderLib/SEIwrite.cpp @@ -1775,6 +1775,12 @@ void SEIWriter::xWriteSEINeuralNetworkPostFilterCharacteristics(const SEINeuralN xWriteUvlc(sei.m_outTensorBitDepthLumaMinus8, "nnpfc_out_tensor_bitdepth_luma_minus8"); xWriteUvlc(sei.m_outTensorBitDepthChromaMinus8, "nnpfc_out_tensor_bitdepth_chroma_minus8"); } +#if JVET_AD0067_INCLUDE_SYNTAX + if (sei.m_sepColDescriptionFlag && (sei.m_outFormatIdc == 1)) + { + xWriteFlag(sei.m_fullRangeFlag, "nnpfc_full_range_flag"); + } +#endif xWriteUvlc(sei.m_outOrderIdc, "nnpfc_out_order_idc"); xWriteUvlc(sei.m_overlap, "nnpfc_overlap");