From 280372ff58aa8feb6e8b4f74c6f152164575f4e1 Mon Sep 17 00:00:00 2001 From: Kui Fan <kui.fan@bytedance.com> Date: Tue, 28 Jan 2020 17:39:20 -0800 Subject: [PATCH] JVET-Q0114: AHG9: A few more general constraints flags --- source/App/EncoderApp/EncApp.cpp | 7 +++++++ source/App/EncoderApp/EncAppCfg.cpp | 7 +++++++ source/App/EncoderApp/EncAppCfg.h | 7 +++++++ source/Lib/CommonLib/Slice.h | 31 +++++++++++++++++++++++++++++ source/Lib/CommonLib/TypeDef.h | 2 ++ source/Lib/DecoderLib/VLCReader.cpp | 9 +++++++++ source/Lib/EncoderLib/EncCfg.h | 24 ++++++++++++++++++++++ source/Lib/EncoderLib/EncLib.cpp | 7 +++++++ source/Lib/EncoderLib/VLCWriter.cpp | 9 +++++++++ 9 files changed, 103 insertions(+) diff --git a/source/App/EncoderApp/EncApp.cpp b/source/App/EncoderApp/EncApp.cpp index 7306093e9..e34996858 100644 --- a/source/App/EncoderApp/EncApp.cpp +++ b/source/App/EncoderApp/EncApp.cpp @@ -182,6 +182,13 @@ void EncApp::xInitLibCfg() m_cEncLib.setProgressiveSourceFlag ( m_progressiveSourceFlag); m_cEncLib.setInterlacedSourceFlag ( m_interlacedSourceFlag); m_cEncLib.setNonPackedConstraintFlag ( m_nonPackedConstraintFlag); +#if JVET_Q0114_CONSTRAINT_FLAGS + m_cEncLib.setNonProjectedConstraintFlag ( m_nonProjectedConstraintFlag ); + m_cEncLib.setNoResChangeInClvsConstraintFlag ( m_noResChangeInClvsConstraintFlag ); + m_cEncLib.setOneTilePerPicConstraintFlag ( m_oneTilePerPicConstraintFlag ); + m_cEncLib.setOneSlicePerPicConstraintFlag ( m_oneSlicePerPicConstraintFlag ); + m_cEncLib.setOneSubpicPerPicConstraintFlag ( m_oneSubpicPerPicConstraintFlag ); +#endif m_cEncLib.setFrameOnlyConstraintFlag ( m_frameOnlyConstraintFlag); m_cEncLib.setIntraConstraintFlag ( m_intraConstraintFlag ); diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp index 6d2008e1c..4cbb9118c 100644 --- a/source/App/EncoderApp/EncAppCfg.cpp +++ b/source/App/EncoderApp/EncAppCfg.cpp @@ -868,6 +868,13 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) ("ProgressiveSource", m_progressiveSourceFlag, false, "Indicate that source is progressive") ("InterlacedSource", m_interlacedSourceFlag, false, "Indicate that source is interlaced") ("NonPackedSource", m_nonPackedConstraintFlag, false, "Indicate that source does not contain frame packing") +#if JVET_Q0114_CONSTRAINT_FLAGS + ("NonProjectedConstraintFlag", m_nonProjectedConstraintFlag, false, "Indicate that the bitstream contains projection SEI messages") + ("NoResChangeInClvsConstraintFlag", m_noResChangeInClvsConstraintFlag, false, "Indicate that the picture spatial resolution does not change within any CLVS referring to the SPS") + ("OneTilePerPicConstraintFlag", m_oneTilePerPicConstraintFlag, false, "Indicate that each picture shall contain only one tile") + ("OneSlicePerPicConstraintFlag", m_oneSlicePerPicConstraintFlag, false, "Indicate that each picture shall contain only one slice") + ("OneSubpicPerPicConstraintFlag", m_oneSubpicPerPicConstraintFlag, false, "Indicate that each picture shall contain only one subpicture") +#endif ("FrameOnly", m_frameOnlyConstraintFlag, false, "Indicate that the bitstream contains only frames") ("CTUSize", m_uiCTUSize, 128u, "CTUSize (specifies the CTU size if QTBT is on) [default: 128]") #if JVET_Q0119_CLEANUPS diff --git a/source/App/EncoderApp/EncAppCfg.h b/source/App/EncoderApp/EncAppCfg.h index 5f830bf65..7183421a8 100644 --- a/source/App/EncoderApp/EncAppCfg.h +++ b/source/App/EncoderApp/EncAppCfg.h @@ -191,6 +191,13 @@ protected: bool m_progressiveSourceFlag; bool m_interlacedSourceFlag; bool m_nonPackedConstraintFlag; +#if JVET_Q0114_CONSTRAINT_FLAGS + bool m_nonProjectedConstraintFlag; + bool m_noResChangeInClvsConstraintFlag; + bool m_oneTilePerPicConstraintFlag; + bool m_oneSlicePerPicConstraintFlag; + bool m_oneSubpicPerPicConstraintFlag; +#endif bool m_frameOnlyConstraintFlag; // coding structure diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index f148d808e..d48991af9 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -235,6 +235,13 @@ class ConstraintInfo bool m_intraOnlyConstraintFlag; uint32_t m_maxBitDepthConstraintIdc; ChromaFormat m_maxChromaFormatConstraintIdc; +#if JVET_Q0114_CONSTRAINT_FLAGS + bool m_nonProjectedConstraintFlag; + bool m_noResChangeInClvsConstraintFlag; + bool m_oneTilePerPicConstraintFlag; + bool m_oneSlicePerPicConstraintFlag; + bool m_oneSubpicPerPicConstraintFlag; +#endif bool m_onePictureOnlyConstraintFlag; bool m_lowerBitRateConstraintFlag; @@ -285,6 +292,13 @@ public: : m_progressiveSourceFlag (false) , m_interlacedSourceFlag (false) , m_nonPackedConstraintFlag (false) +#if JVET_Q0114_CONSTRAINT_FLAGS + , m_nonProjectedConstraintFlag(false) + , m_noResChangeInClvsConstraintFlag(false) + , m_oneTilePerPicConstraintFlag(false) + , m_oneSlicePerPicConstraintFlag(false) + , m_oneSubpicPerPicConstraintFlag(false) +#endif , m_frameOnlyConstraintFlag (false) , m_intraOnlyConstraintFlag (false) , m_maxBitDepthConstraintIdc ( 0) @@ -350,6 +364,23 @@ public: ChromaFormat getMaxChromaFormatConstraintIdc() const { return m_maxChromaFormatConstraintIdc; } void setMaxChromaFormatConstraintIdc(ChromaFormat fmt) { m_maxChromaFormatConstraintIdc = fmt; } +#if JVET_Q0114_CONSTRAINT_FLAGS + bool getNonProjectedConstraintFlag() const { return m_nonProjectedConstraintFlag; } + void setNonProjectedConstraintFlag(bool b) { m_nonProjectedConstraintFlag = b; } + + bool getNoResChangeInClvsConstraintFlag() const { return m_noResChangeInClvsConstraintFlag; } + void setNoResChangeInClvsConstraintFlag(bool b) { m_noResChangeInClvsConstraintFlag = b; } + + bool getOneTilePerPicConstraintFlag() const { return m_oneTilePerPicConstraintFlag; } + void setOneTilePerPicConstraintFlag(bool b) { m_oneTilePerPicConstraintFlag = b; } + + bool getOneSlicePerPicConstraintFlag() const { return m_oneSlicePerPicConstraintFlag; } + void setOneSlicePerPicConstraintFlag(bool b) { m_oneSlicePerPicConstraintFlag = b; } + + bool getOneSubpicPerPicConstraintFlag() const { return m_oneSubpicPerPicConstraintFlag; } + void setOneSubpicPerPicConstraintFlag(bool b) { m_oneSubpicPerPicConstraintFlag = b; } +#endif + bool getIntraOnlyConstraintFlag() const { return m_intraOnlyConstraintFlag; } void setIntraOnlyConstraintFlag(bool b) { m_intraOnlyConstraintFlag = b; } diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index da26827bc..39939c075 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -104,6 +104,8 @@ #define JVET_Q0119_CLEANUPS 1 // JVET-Q0119: AHG12: Cleanups on signalling of subpictures, tiles, and rectangular slices +#define JVET_Q0114_CONSTRAINT_FLAGS 1 // JVET-Q0114: AHG9: A few more general constraints flags + #define JVET_Q0820_ACT 1 // JVET-Q0820: ACT bug fixes and reversible ACT transform #define JVET_Q0353_ACT_SW_FIX 1 // JVET-Q0353: Bug fix of ACT diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index 022de8765..8af57d285 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -3977,10 +3977,19 @@ void HLSyntaxReader::parseConstraintInfo(ConstraintInfo *cinfo) READ_FLAG(symbol, "general_interlaced_source_flag" ); cinfo->setInterlacedSourceFlag(symbol ? true : false); READ_FLAG(symbol, "general_non_packed_constraint_flag" ); cinfo->setNonPackedConstraintFlag(symbol ? true : false); READ_FLAG(symbol, "general_frame_only_constraint_flag" ); cinfo->setFrameOnlyConstraintFlag(symbol ? true : false); +#if JVET_Q0114_CONSTRAINT_FLAGS + READ_FLAG(symbol, "general_non_projected_constraint_flag" ); cinfo->setNonProjectedConstraintFlag(symbol ? true : false); +#endif READ_FLAG(symbol, "intra_only_constraint_flag" ); cinfo->setIntraOnlyConstraintFlag(symbol ? true : false); READ_CODE(4, symbol, "max_bitdepth_constraint_idc" ); cinfo->setMaxBitDepthConstraintIdc(symbol); READ_CODE(2, symbol, "max_chroma_format_constraint_idc" ); cinfo->setMaxChromaFormatConstraintIdc((ChromaFormat)symbol); +#if JVET_Q0114_CONSTRAINT_FLAGS + READ_FLAG(symbol, "no_res_change_in_clvs_constraint_flag" ); cinfo->setNoResChangeInClvsConstraintFlag(symbol ? true : false); + READ_FLAG(symbol, "one_tile_per_pic_constraint_flag" ); cinfo->setOneTilePerPicConstraintFlag(symbol ? true : false); + READ_FLAG(symbol, "one_slice_per_pic_constraint_flag" ); cinfo->setOneSlicePerPicConstraintFlag(symbol ? true : false); + READ_FLAG(symbol, "one_subpic_per_pic_constraint_flag" ); cinfo->setOneSubpicPerPicConstraintFlag(symbol ? true : false); +#endif READ_FLAG(symbol, "no_qtbtt_dual_tree_intra_constraint_flag" ); cinfo->setNoQtbttDualTreeIntraConstraintFlag(symbol > 0 ? true : false); READ_FLAG(symbol, "no_partition_constraints_override_constraint_flag"); cinfo->setNoPartitionConstraintsOverrideConstraintFlag(symbol > 0 ? true : false); diff --git a/source/Lib/EncoderLib/EncCfg.h b/source/Lib/EncoderLib/EncCfg.h index f3eda13cd..1c175d24c 100644 --- a/source/Lib/EncoderLib/EncCfg.h +++ b/source/Lib/EncoderLib/EncCfg.h @@ -230,6 +230,13 @@ protected: bool m_progressiveSourceFlag; bool m_interlacedSourceFlag; bool m_nonPackedConstraintFlag; +#if JVET_Q0114_CONSTRAINT_FLAGS + bool m_nonProjectedConstraintFlag; + bool m_noResChangeInClvsConstraintFlag; + bool m_oneTilePerPicConstraintFlag; + bool m_oneSlicePerPicConstraintFlag; + bool m_oneSubpicPerPicConstraintFlag; +#endif bool m_frameOnlyConstraintFlag; bool m_intraConstraintFlag; @@ -1862,6 +1869,23 @@ public: bool getNonPackedConstraintFlag() const { return m_nonPackedConstraintFlag; } void setNonPackedConstraintFlag(bool b) { m_nonPackedConstraintFlag = b; } +#if JVET_Q0114_CONSTRAINT_FLAGS + bool getNonProjectedConstraintFlag() const { return m_nonProjectedConstraintFlag; } + void setNonProjectedConstraintFlag(bool b) { m_nonProjectedConstraintFlag = b; } + + bool getNoResChangeInClvsConstraintFlag() const { return m_noResChangeInClvsConstraintFlag; } + void setNoResChangeInClvsConstraintFlag(bool b) { m_noResChangeInClvsConstraintFlag = b; } + + bool getOneTilePerPicConstraintFlag() const { return m_oneTilePerPicConstraintFlag; } + void setOneTilePerPicConstraintFlag(bool b) { m_oneTilePerPicConstraintFlag = b; } + + bool getOneSlicePerPicConstraintFlag() const { return m_oneSlicePerPicConstraintFlag; } + void setOneSlicePerPicConstraintFlag(bool b) { m_oneSlicePerPicConstraintFlag = b; } + + bool getOneSubpicPerPicConstraintFlag() const { return m_oneSubpicPerPicConstraintFlag; } + void setOneSubpicPerPicConstraintFlag(bool b) { m_oneSubpicPerPicConstraintFlag = b; } +#endif + bool getFrameOnlyConstraintFlag() const { return m_frameOnlyConstraintFlag; } void setFrameOnlyConstraintFlag(bool b) { m_frameOnlyConstraintFlag = b; } diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp index 85f8d600a..ae2f59fdc 100644 --- a/source/Lib/EncoderLib/EncLib.cpp +++ b/source/Lib/EncoderLib/EncLib.cpp @@ -1022,6 +1022,13 @@ void EncLib::xInitSPS( SPS& sps, VPS& vps ) cinfo->setProgressiveSourceFlag (m_progressiveSourceFlag); cinfo->setInterlacedSourceFlag (m_interlacedSourceFlag); cinfo->setNonPackedConstraintFlag (m_nonPackedConstraintFlag); +#if JVET_Q0114_CONSTRAINT_FLAGS + cinfo->setNonProjectedConstraintFlag(m_nonProjectedConstraintFlag); + cinfo->setNoResChangeInClvsConstraintFlag(m_noResChangeInClvsConstraintFlag); + cinfo->setOneTilePerPicConstraintFlag(m_oneTilePerPicConstraintFlag); + cinfo->setOneSlicePerPicConstraintFlag(m_oneSlicePerPicConstraintFlag); + cinfo->setOneSubpicPerPicConstraintFlag(m_oneSubpicPerPicConstraintFlag); +#endif cinfo->setFrameOnlyConstraintFlag (m_frameOnlyConstraintFlag); cinfo->setIntraOnlyConstraintFlag (m_intraConstraintFlag); cinfo->setMaxBitDepthConstraintIdc (m_maxBitDepthConstraintIdc); diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index 8f286d50c..b32b3edab 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -2704,10 +2704,19 @@ void HLSWriter::codeConstraintInfo ( const ConstraintInfo* cinfo ) WRITE_FLAG(cinfo->getInterlacedSourceFlag(), "general_interlaced_source_flag" ); WRITE_FLAG(cinfo->getNonPackedConstraintFlag(), "general_non_packed_constraint_flag" ); WRITE_FLAG(cinfo->getFrameOnlyConstraintFlag(), "general_frame_only_constraint_flag" ); +#if JVET_Q0114_CONSTRAINT_FLAGS + WRITE_FLAG(cinfo->getNonProjectedConstraintFlag(), "general_non_projected_constraint_flag"); +#endif WRITE_FLAG(cinfo->getIntraOnlyConstraintFlag(), "intra_only_constraint_flag" ); WRITE_CODE(cinfo->getMaxBitDepthConstraintIdc(), 4, "max_bitdepth_constraint_idc" ); WRITE_CODE(cinfo->getMaxChromaFormatConstraintIdc(), 2, "max_chroma_format_constraint_idc" ); +#if JVET_Q0114_CONSTRAINT_FLAGS + WRITE_FLAG(cinfo->getNoResChangeInClvsConstraintFlag(), "no_res_change_in_clvs_constraint_flag"); + WRITE_FLAG(cinfo->getOneTilePerPicConstraintFlag(), "one_tile_per_pic_constraint_flag"); + WRITE_FLAG(cinfo->getOneSlicePerPicConstraintFlag(), "one_slice_per_pic_constraint_flag"); + WRITE_FLAG(cinfo->getOneSubpicPerPicConstraintFlag(), "one_subpic_per_pic_constraint_flag"); +#endif WRITE_FLAG(cinfo->getNoQtbttDualTreeIntraConstraintFlag() ? 1 : 0, "no_qtbtt_dual_tree_intra_constraint_flag"); WRITE_FLAG(cinfo->getNoPartitionConstraintsOverrideConstraintFlag() ? 1 : 0, "no_partition_constraints_override_constraint_flag"); -- GitLab