diff --git a/source/App/DecoderApp/DecApp.cpp b/source/App/DecoderApp/DecApp.cpp index 3e15f4a720ad6c9650d9fea4d22620d19b8cac6f..ea6b2fc8a3c99a432ba72558824a1410a9fd2782 100644 --- a/source/App/DecoderApp/DecApp.cpp +++ b/source/App/DecoderApp/DecApp.cpp @@ -400,7 +400,9 @@ void DecApp::xWriteOutput( PicList* pcListPic, uint32_t tId ) if ( !m_reconFileName.empty() ) { const Window &conf = pcPicTop->cs->sps->getConformanceWindow(); +#if !JVET_N0063_VUI const Window defDisp = (m_respectDefDispWindow && pcPicTop->cs->sps->getVuiParametersPresentFlag()) ? pcPicTop->cs->sps->getVuiParameters()->getDefaultDisplayWindow() : Window(); +#endif const bool isTff = pcPicTop->topField; bool display = true; @@ -419,10 +421,17 @@ void DecApp::xWriteOutput( PicList* pcListPic, uint32_t tId ) m_cVideoIOYuvReconFile.write( pcPicTop->getRecoBuf(), pcPicBottom->getRecoBuf(), m_outputColourSpaceConvert, false, // TODO: m_packedYUVMode, +#if JVET_N0063_VUI + conf.getWindowLeftOffset(), + conf.getWindowRightOffset(), + conf.getWindowTopOffset(), + conf.getWindowBottomOffset(), +#else conf.getWindowLeftOffset() + defDisp.getWindowLeftOffset(), conf.getWindowRightOffset() + defDisp.getWindowRightOffset(), conf.getWindowTopOffset() + defDisp.getWindowTopOffset(), conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset(), +#endif NUM_CHROMA_FORMAT, isTff ); } } @@ -466,15 +475,24 @@ void DecApp::xWriteOutput( PicList* pcListPic, uint32_t tId ) if (!m_reconFileName.empty()) { const Window &conf = pcPic->cs->sps->getConformanceWindow(); +#if !JVET_N0063_VUI const Window defDisp = (m_respectDefDispWindow && pcPic->cs->sps->getVuiParametersPresentFlag()) ? pcPic->cs->sps->getVuiParameters()->getDefaultDisplayWindow() : Window(); +#endif m_cVideoIOYuvReconFile.write( pcPic->getRecoBuf(), m_outputColourSpaceConvert, m_packedYUVMode, +#if JVET_N0063_VUI + conf.getWindowLeftOffset(), + conf.getWindowRightOffset(), + conf.getWindowTopOffset(), + conf.getWindowBottomOffset(), +#else conf.getWindowLeftOffset() + defDisp.getWindowLeftOffset(), conf.getWindowRightOffset() + defDisp.getWindowRightOffset(), conf.getWindowTopOffset() + defDisp.getWindowTopOffset(), conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset(), +#endif NUM_CHROMA_FORMAT, m_bClipOutputVideoToRec709Range ); } @@ -529,16 +547,25 @@ void DecApp::xFlushOutput( PicList* pcListPic ) if ( !m_reconFileName.empty() ) { const Window &conf = pcPicTop->cs->sps->getConformanceWindow(); +#if !JVET_N0063_VUI const Window defDisp = (m_respectDefDispWindow && pcPicTop->cs->sps->getVuiParametersPresentFlag()) ? pcPicTop->cs->sps->getVuiParameters()->getDefaultDisplayWindow() : Window(); +#endif const bool isTff = pcPicTop->topField; m_cVideoIOYuvReconFile.write( pcPicTop->getRecoBuf(), pcPicBottom->getRecoBuf(), m_outputColourSpaceConvert, false, // TODO: m_packedYUVMode, +#if JVET_N0063_VUI + conf.getWindowLeftOffset(), + conf.getWindowRightOffset(), + conf.getWindowTopOffset(), + conf.getWindowBottomOffset(), +#else conf.getWindowLeftOffset() + defDisp.getWindowLeftOffset(), conf.getWindowRightOffset() + defDisp.getWindowRightOffset(), conf.getWindowTopOffset() + defDisp.getWindowTopOffset(), conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset(), +#endif NUM_CHROMA_FORMAT, isTff ); } @@ -585,15 +612,24 @@ void DecApp::xFlushOutput( PicList* pcListPic ) if (!m_reconFileName.empty()) { const Window &conf = pcPic->cs->sps->getConformanceWindow(); +#if !JVET_N0063_VUI const Window defDisp = (m_respectDefDispWindow && pcPic->cs->sps->getVuiParametersPresentFlag()) ? pcPic->cs->sps->getVuiParameters()->getDefaultDisplayWindow() : Window(); +#endif m_cVideoIOYuvReconFile.write( pcPic->getRecoBuf(), m_outputColourSpaceConvert, m_packedYUVMode, +#if JVET_N0063_VUI + conf.getWindowLeftOffset(), + conf.getWindowRightOffset(), + conf.getWindowTopOffset(), + conf.getWindowBottomOffset(), +#else conf.getWindowLeftOffset() + defDisp.getWindowLeftOffset(), conf.getWindowRightOffset() + defDisp.getWindowRightOffset(), conf.getWindowTopOffset() + defDisp.getWindowTopOffset(), conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset(), +#endif NUM_CHROMA_FORMAT, m_bClipOutputVideoToRec709Range ); } diff --git a/source/App/EncoderApp/EncApp.cpp b/source/App/EncoderApp/EncApp.cpp index 08921fe9f946063b5087e0e977e9bdf9ed7054c7..de13dc4e1d373be25c5cf26d9525c99304b45fa8 100644 --- a/source/App/EncoderApp/EncApp.cpp +++ b/source/App/EncoderApp/EncApp.cpp @@ -564,6 +564,25 @@ void EncApp::xInitLibCfg() m_cEncLib.setDecodingParameterSetEnabled ( m_decodingParameterSetEnabled ); #endif m_cEncLib.setActiveParameterSetsSEIEnabled ( m_activeParameterSetsSEIEnabled ); +#if JVET_N0063_VUI + m_cEncLib.setVuiParametersPresentFlag ( m_vuiParametersPresentFlag ); + m_cEncLib.setAspectRatioInfoPresentFlag ( m_aspectRatioInfoPresentFlag); + m_cEncLib.setAspectRatioIdc ( m_aspectRatioIdc ); + m_cEncLib.setSarWidth ( m_sarWidth ); + m_cEncLib.setSarHeight ( m_sarHeight ); + m_cEncLib.setColourDescriptionPresentFlag ( m_colourDescriptionPresentFlag ); + m_cEncLib.setColourPrimaries ( m_colourPrimaries ); + m_cEncLib.setTransferCharacteristics ( m_transferCharacteristics ); + m_cEncLib.setMatrixCoefficients ( m_matrixCoefficients ); + m_cEncLib.setChromaLocInfoPresentFlag ( m_chromaLocInfoPresentFlag ); + m_cEncLib.setChromaSampleLocTypeTopField ( m_chromaSampleLocTypeTopField ); + m_cEncLib.setChromaSampleLocTypeBottomField ( m_chromaSampleLocTypeBottomField ); + m_cEncLib.setChromaSampleLocType ( m_chromaSampleLocType ); + m_cEncLib.setOverscanInfoPresentFlag ( m_overscanInfoPresentFlag ); + m_cEncLib.setOverscanAppropriateFlag ( m_overscanAppropriateFlag ); + m_cEncLib.setVideoSignalTypePresentFlag ( m_videoSignalTypePresentFlag ); + m_cEncLib.setVideoFullRangeFlag ( m_videoFullRangeFlag ); +#else m_cEncLib.setVuiParametersPresentFlag ( m_vuiParametersPresentFlag ); m_cEncLib.setAspectRatioInfoPresentFlag ( m_aspectRatioInfoPresentFlag); m_cEncLib.setAspectRatioIdc ( m_aspectRatioIdc ); @@ -594,6 +613,7 @@ void EncApp::xInitLibCfg() m_cEncLib.setMaxBitsPerMinCuDenom ( m_maxBitsPerMinCuDenom ); m_cEncLib.setLog2MaxMvLengthHorizontal ( m_log2MaxMvLengthHorizontal ); m_cEncLib.setLog2MaxMvLengthVertical ( m_log2MaxMvLengthVertical ); +#endif m_cEncLib.setEfficientFieldIRAPEnabled ( m_bEfficientFieldIRAPEnabled ); m_cEncLib.setHarmonizeGopFirstFieldCoupleEnabled ( m_bHarmonizeGopFirstFieldCoupleEnabled ); m_cEncLib.setSummaryOutFilename ( m_summaryOutFilename ); diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp index 0a9d2a5a53b700ec5bcf5309ec664309e62149dc..4e2bd418ca0010ad45e172b2c69884fef27146e1 100644 --- a/source/App/EncoderApp/EncAppCfg.cpp +++ b/source/App/EncoderApp/EncAppCfg.cpp @@ -1197,6 +1197,25 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) #endif ("SEIActiveParameterSets", m_activeParameterSetsSEIEnabled, 0, "Enable generation of active parameter sets SEI messages"); opts.addOptions() +#if JVET_N0063_VUI + ("VuiParametersPresent,-vui", m_vuiParametersPresentFlag, false, "Enable generation of vui_parameters()") + ("AspectRatioInfoPresent", m_aspectRatioInfoPresentFlag, false, "Signals whether aspect_ratio_idc is present") + ("AspectRatioIdc", m_aspectRatioIdc, 0, "aspect_ratio_idc") + ("SarWidth", m_sarWidth, 0, "horizontal size of the sample aspect ratio") + ("SarHeight", m_sarHeight, 0, "vertical size of the sample aspect ratio") + ("ColourDescriptionPresent", m_colourDescriptionPresentFlag, false, "Signals whether colour_primaries, transfer_characteristics and matrix_coefficients are present") + ("ColourPrimaries", m_colourPrimaries, 2, "Indicates chromaticity coordinates of the source primaries") + ("TransferCharacteristics", m_transferCharacteristics, 2, "Indicates the opto-electronic transfer characteristics of the source") + ("MatrixCoefficients", m_matrixCoefficients, 2, "Describes the matrix coefficients used in deriving luma and chroma from RGB primaries") + ("ChromaLocInfoPresent", m_chromaLocInfoPresentFlag, false, "Signals whether chroma_sample_loc_type_top_field and chroma_sample_loc_type_bottom_field are present") + ("ChromaSampleLocTypeTopField", m_chromaSampleLocTypeTopField, 0, "Specifies the location of chroma samples for top field") + ("ChromaSampleLocTypeBottomField", m_chromaSampleLocTypeBottomField, 0, "Specifies the location of chroma samples for bottom field") + ("ChromaSampleLocType", m_chromaSampleLocType, 0, "Specifies the location of chroma samples for progressive content") + ("OverscanInfoPresent", m_overscanInfoPresentFlag, false, "Indicates whether conformant decoded pictures are suitable for display using overscan\n") + ("OverscanAppropriate", m_overscanAppropriateFlag, false, "Indicates whether conformant decoded pictures are suitable for display using overscan\n") + ("VideoSignalTypePresent", m_videoSignalTypePresentFlag, false, "Signals whether video_format, video_full_range_flag, and colour_description_present_flag are present") + ("VideoFullRange", m_videoFullRangeFlag, false, "Indicates the black level and range of luma and chroma signals"); +#else ("VuiParametersPresent,-vui", m_vuiParametersPresentFlag, false, "Enable generation of vui_parameters()") ("AspectRatioInfoPresent", m_aspectRatioInfoPresentFlag, false, "Signals whether aspect_ratio_idc is present") ("AspectRatioIdc", m_aspectRatioIdc, 0, "aspect_ratio_idc") @@ -1230,6 +1249,7 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) ("MaxBitsPerMinCuDenom", m_maxBitsPerMinCuDenom, 1, "Indicates an upper bound for the number of bits of coding_unit() data") ("Log2MaxMvLengthHorizontal", m_log2MaxMvLengthHorizontal, 15, "Indicate the maximum absolute value of a decoded horizontal MV component in quarter-pel luma units") ("Log2MaxMvLengthVertical", m_log2MaxMvLengthVertical, 15, "Indicate the maximum absolute value of a decoded vertical MV component in quarter-pel luma units"); +#endif opts.addOptions() ("SEIColourRemappingInfoFileRoot,-cri", m_colourRemapSEIFileRoot, string(""), "Colour Remapping Information SEI parameters root file name (wo num ext)") ("SEIRecoveryPoint", m_recoveryPointSEIEnabled, false, "Control generation of recovery point SEI messages") @@ -2522,6 +2542,7 @@ bool EncAppCfg::xCheckParameter() xConfirmPara( m_confWinTop % SPS::getWinUnitY(m_chromaFormatIDC) != 0, "Top conformance window offset must be an integer multiple of the specified chroma subsampling"); xConfirmPara( m_confWinBottom % SPS::getWinUnitY(m_chromaFormatIDC) != 0, "Bottom conformance window offset must be an integer multiple of the specified chroma subsampling"); +#if !JVET_N0063_VUI xConfirmPara( m_defaultDisplayWindowFlag && !m_vuiParametersPresentFlag, "VUI needs to be enabled for default display window"); if (m_defaultDisplayWindowFlag) @@ -2531,6 +2552,7 @@ bool EncAppCfg::xCheckParameter() xConfirmPara( m_defDispWinTopOffset % SPS::getWinUnitY(m_chromaFormatIDC) != 0, "Top default display window offset must be an integer multiple of the specified chroma subsampling"); xConfirmPara( m_defDispWinBottomOffset % SPS::getWinUnitY(m_chromaFormatIDC) != 0, "Bottom default display window offset must be an integer multiple of the specified chroma subsampling"); } +#endif // max CU width and height should be power of 2 uint32_t ui = m_uiMaxCUWidth; @@ -2880,6 +2902,7 @@ bool EncAppCfg::xCheckParameter() m_maxDecPicBuffering[MAX_TLAYER-1] = m_numReorderPics[MAX_TLAYER-1] + 1; } +#if !JVET_N0063_VUI if(m_vuiParametersPresentFlag && m_bitstreamRestrictionFlag) { int PicSizeInSamplesY = m_iSourceWidth * m_iSourceHeight; @@ -2953,6 +2976,7 @@ bool EncAppCfg::xCheckParameter() m_minSpatialSegmentationIdc = 0; } } +#endif #if JVET_N0857_TILES_BRICKS for (int i=0; i<MAX_TILES; i++) @@ -3045,6 +3069,7 @@ bool EncAppCfg::xCheckParameter() { xConfirmPara( m_RCCpbSaturationEnabled != 0, "Target bits saturation cannot be processed without Rate control" ); } +#if !JVET_N0063_VUI if (m_vuiParametersPresentFlag) { xConfirmPara(m_RCTargetBitrate == 0, "A target bit rate is required to be set for VUI/HRD parameters."); @@ -3054,6 +3079,7 @@ bool EncAppCfg::xCheckParameter() m_RCCpbSize = m_RCTargetBitrate; } } +#endif #endif xConfirmPara(!m_TransquantBypassEnabledFlag && m_CUTransquantBypassFlagForce, "CUTransquantBypassFlagForce cannot be 1 when TransquantBypassEnableFlag is 0"); diff --git a/source/App/EncoderApp/EncAppCfg.h b/source/App/EncoderApp/EncAppCfg.h index e99aaa00438591e98fca4973165ac91074479298..b54ca90eb199af94b3c2347d7372d1b475c0478d 100644 --- a/source/App/EncoderApp/EncAppCfg.h +++ b/source/App/EncoderApp/EncAppCfg.h @@ -554,6 +554,25 @@ protected: bool m_decodingParameterSetEnabled; ///< enable decoding parameter set #endif +#if JVET_N0063_VUI + bool m_vuiParametersPresentFlag; ///< enable generation of VUI parameters + bool m_aspectRatioInfoPresentFlag; ///< Signals whether aspect_ratio_idc is present + int m_aspectRatioIdc; ///< aspect_ratio_idc + int m_sarWidth; ///< horizontal size of the sample aspect ratio + int m_sarHeight; ///< vertical size of the sample aspect ratio + bool m_colourDescriptionPresentFlag; ///< Signals whether colour_primaries, transfer_characteristics and matrix_coefficients are present + int m_colourPrimaries; ///< Indicates chromaticity coordinates of the source primaries + int m_transferCharacteristics; ///< Indicates the opto-electronic transfer characteristics of the source + int m_matrixCoefficients; ///< Describes the matrix coefficients used in deriving luma and chroma from RGB primaries + bool m_chromaLocInfoPresentFlag; ///< Signals whether chroma_sample_loc_type_top_field and chroma_sample_loc_type_bottom_field are present + int m_chromaSampleLocTypeTopField; ///< Specifies the location of chroma samples for top field + int m_chromaSampleLocTypeBottomField; ///< Specifies the location of chroma samples for bottom field + int m_chromaSampleLocType; ///< Specifies the location of chroma samples for progressive content + bool m_overscanInfoPresentFlag; ///< Signals whether overscan_appropriate_flag is present + bool m_overscanAppropriateFlag; ///< Indicates whether conformant decoded pictures are suitable for display using overscan + bool m_videoSignalTypePresentFlag; ///< Signals whether video_format, video_full_range_flag, and colour_description_present_flag are present + bool m_videoFullRangeFlag; ///< Indicates the black level and range of luma and chroma signals +#else bool m_vuiParametersPresentFlag; ///< enable generation of VUI parameters bool m_aspectRatioInfoPresentFlag; ///< Signals whether aspect_ratio_idc is present int m_aspectRatioIdc; ///< aspect_ratio_idc @@ -588,6 +607,7 @@ protected: int m_maxBitsPerMinCuDenom; ///< Indicates an upper bound for the number of bits of coding_unit() data int m_log2MaxMvLengthHorizontal; ///< Indicate the maximum absolute value of a decoded horizontal MV component in quarter-pel luma units int m_log2MaxMvLengthVertical; ///< Indicate the maximum absolute value of a decoded vertical MV component in quarter-pel luma units +#endif int m_ImvMode; ///< imv mode int m_Imv4PelFast; ///< imv 4-Pel fast mode std::string m_colourRemapSEIFileRoot; diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index d403d4a251085aa95e7ad79e675381b527d8d17e..5bee9e4db844b7efbad90ec88720096b28a680c2 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -636,6 +636,25 @@ public: class VUI { private: +#if JVET_N0063_VUI + bool m_aspectRatioInfoPresentFlag; + int m_aspectRatioIdc; + int m_sarWidth; + int m_sarHeight; + bool m_colourDescriptionPresentFlag; + int m_colourPrimaries; + int m_transferCharacteristics; + int m_matrixCoefficients; + bool m_fieldSeqFlag; + bool m_chromaLocInfoPresentFlag; + int m_chromaSampleLocTypeTopField; + int m_chromaSampleLocTypeBottomField; + int m_chromaSampleLocType; + bool m_overscanInfoPresentFlag; + bool m_overscanAppropriateFlag; + bool m_videoSignalTypePresentFlag; + bool m_videoFullRangeFlag; +#else bool m_aspectRatioInfoPresentFlag; int m_aspectRatioIdc; int m_sarWidth; @@ -668,8 +687,30 @@ private: int m_log2MaxMvLengthVertical; HRDParameters m_hrdParameters; TimingInfo m_timingInfo; +#endif public: +#if JVET_N0063_VUI + VUI() + : m_aspectRatioInfoPresentFlag (false) //TODO: This initialiser list contains magic numbers + , m_aspectRatioIdc (0) + , m_sarWidth (0) + , m_sarHeight (0) + , m_colourDescriptionPresentFlag (false) + , m_colourPrimaries (2) + , m_transferCharacteristics (2) + , m_matrixCoefficients (2) + , m_fieldSeqFlag (false) + , m_chromaLocInfoPresentFlag (false) + , m_chromaSampleLocTypeTopField (0) + , m_chromaSampleLocTypeBottomField (0) + , m_chromaSampleLocType (0) + , m_overscanInfoPresentFlag (false) + , m_overscanAppropriateFlag (false) + , m_videoSignalTypePresentFlag (false) + , m_videoFullRangeFlag (false) + {} +#else VUI() : m_aspectRatioInfoPresentFlag (false) //TODO: This initialiser list contains magic numbers , m_aspectRatioIdc (0) @@ -701,9 +742,63 @@ public: , m_log2MaxMvLengthHorizontal (15) , m_log2MaxMvLengthVertical (15) {} +#endif virtual ~VUI() {} +#if JVET_N0063_VUI + bool getAspectRatioInfoPresentFlag() const { return m_aspectRatioInfoPresentFlag; } + void setAspectRatioInfoPresentFlag(bool i) { m_aspectRatioInfoPresentFlag = i; } + + int getAspectRatioIdc() const { return m_aspectRatioIdc; } + void setAspectRatioIdc(int i) { m_aspectRatioIdc = i; } + + int getSarWidth() const { return m_sarWidth; } + void setSarWidth(int i) { m_sarWidth = i; } + + int getSarHeight() const { return m_sarHeight; } + void setSarHeight(int i) { m_sarHeight = i; } + + bool getColourDescriptionPresentFlag() const { return m_colourDescriptionPresentFlag; } + void setColourDescriptionPresentFlag(bool i) { m_colourDescriptionPresentFlag = i; } + + int getColourPrimaries() const { return m_colourPrimaries; } + void setColourPrimaries(int i) { m_colourPrimaries = i; } + + int getTransferCharacteristics() const { return m_transferCharacteristics; } + void setTransferCharacteristics(int i) { m_transferCharacteristics = i; } + + int getMatrixCoefficients() const { return m_matrixCoefficients; } + void setMatrixCoefficients(int i) { m_matrixCoefficients = i; } + + bool getFieldSeqFlag() const { return m_fieldSeqFlag; } + void setFieldSeqFlag(bool i) { m_fieldSeqFlag = i; } + + bool getChromaLocInfoPresentFlag() const { return m_chromaLocInfoPresentFlag; } + void setChromaLocInfoPresentFlag(bool i) { m_chromaLocInfoPresentFlag = i; } + + int getChromaSampleLocTypeTopField() const { return m_chromaSampleLocTypeTopField; } + void setChromaSampleLocTypeTopField(int i) { m_chromaSampleLocTypeTopField = i; } + + int getChromaSampleLocTypeBottomField() const { return m_chromaSampleLocTypeBottomField; } + void setChromaSampleLocTypeBottomField(int i) { m_chromaSampleLocTypeBottomField = i; } + + int getChromaSampleLocType() const { return m_chromaSampleLocType; } + void setChromaSampleLocType(int i) { m_chromaSampleLocType = i; } + + bool getOverscanInfoPresentFlag() const { return m_overscanInfoPresentFlag; } + void setOverscanInfoPresentFlag(bool i) { m_overscanInfoPresentFlag = i; } + + bool getOverscanAppropriateFlag() const { return m_overscanAppropriateFlag; } + void setOverscanAppropriateFlag(bool i) { m_overscanAppropriateFlag = i; } + + bool getVideoSignalTypePresentFlag() const { return m_videoSignalTypePresentFlag; } + void setVideoSignalTypePresentFlag(bool i) { m_videoSignalTypePresentFlag = i; } + + bool getVideoFullRangeFlag() const { return m_videoFullRangeFlag; } + void setVideoFullRangeFlag(bool i) { m_videoFullRangeFlag = i; } + +#else bool getAspectRatioInfoPresentFlag() const { return m_aspectRatioInfoPresentFlag; } void setAspectRatioInfoPresentFlag(bool i) { m_aspectRatioInfoPresentFlag = i; } @@ -800,6 +895,7 @@ public: TimingInfo* getTimingInfo() { return &m_timingInfo; } const TimingInfo* getTimingInfo() const { return &m_timingInfo; } +#endif }; /// SPS RExt class @@ -972,6 +1068,12 @@ private: bool m_useStrongIntraSmoothing; #endif +#if JVET_N0063_VUI + TimingInfo m_timingInfo; + bool m_hrdParametersPresentFlag; + HRDParameters m_hrdParameters; +#endif + bool m_vuiParametersPresentFlag; VUI m_vuiParameters; @@ -1234,6 +1336,14 @@ public: #endif void setAffineAmvrEnabledFlag( bool val ) { m_affineAmvrEnabledFlag = val; } bool getAffineAmvrEnabledFlag() const { return m_affineAmvrEnabledFlag; } +#if JVET_N0063_VUI + TimingInfo* getTimingInfo() { return &m_timingInfo; } + const TimingInfo* getTimingInfo() const { return &m_timingInfo; } + bool getHrdParametersPresentFlag() const { return m_hrdParametersPresentFlag; } + void setHrdParametersPresentFlag(bool b) { m_hrdParametersPresentFlag = b; } + HRDParameters* getHrdParameters() { return &m_hrdParameters; } + const HRDParameters* getHrdParameters() const { return &m_hrdParameters; } +#endif bool getVuiParametersPresentFlag() const { return m_vuiParametersPresentFlag; } void setVuiParametersPresentFlag(bool b) { m_vuiParametersPresentFlag = b; } VUI* getVuiParameters() { return &m_vuiParameters; } diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 3b26cf7c4e6325f5f2b4ebc4ee117bdbb808170e..f53ea2aa1905893140ff24b70e8cab9b4717f01d 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -49,6 +49,8 @@ #include <cstring> #include <assert.h> #include <cassert> + +#define JVET_N0063_VUI 1 // JVET-N0063: Video Usability Information #define JVET_N0415_CTB_ALF 1 // JVET-N0415: CTB-based ALF switch diff --git a/source/Lib/DecoderLib/SEIread.cpp b/source/Lib/DecoderLib/SEIread.cpp index 5011f9d48b3ebb52b909c00b0ba0eba0e3a34d56..0f4864f1b864ed60593a64f387ea6a63e9c525d3 100644 --- a/source/Lib/DecoderLib/SEIread.cpp +++ b/source/Lib/DecoderLib/SEIread.cpp @@ -474,6 +474,23 @@ void SEIReader::xParseSEIDecodingUnitInfo(SEIDecodingUnitInfo& sei, uint32_t pay sei_read_uvlc( pDecodedMessageOutputStream, val, "decoding_unit_idx"); sei.m_decodingUnitIdx = val; +#if JVET_N0063_VUI + if(sps->getHrdParameters()->getSubPicCpbParamsInPicTimingSEIFlag()) + { + sei_read_code( pDecodedMessageOutputStream, ( sps->getHrdParameters()->getDuCpbRemovalDelayLengthMinus1() + 1 ), val, "du_spt_cpb_removal_delay_increment"); + sei.m_duSptCpbRemovalDelay = val; + } + else + { + sei.m_duSptCpbRemovalDelay = 0; + } + sei_read_flag( pDecodedMessageOutputStream, val, "dpb_output_du_delay_present_flag"); sei.m_dpbOutputDuDelayPresentFlag = (val != 0); + if(sei.m_dpbOutputDuDelayPresentFlag) + { + sei_read_code( pDecodedMessageOutputStream, sps->getHrdParameters()->getDpbOutputDelayDuLengthMinus1() + 1, val, "pic_spt_dpb_output_du_delay"); + sei.m_picSptDpbOutputDuDelay = val; + } +#else const VUI *vui = sps->getVuiParameters(); if(vui->getHrdParameters()->getSubPicCpbParamsInPicTimingSEIFlag()) { @@ -490,6 +507,7 @@ void SEIReader::xParseSEIDecodingUnitInfo(SEIDecodingUnitInfo& sei, uint32_t pay sei_read_code( pDecodedMessageOutputStream, vui->getHrdParameters()->getDpbOutputDelayDuLengthMinus1() + 1, val, "pic_spt_dpb_output_du_delay"); sei.m_picSptDpbOutputDuDelay = val; } +#endif } void SEIReader::xParseSEIBufferingPeriod(SEIBufferingPeriod& sei, uint32_t payloadSize, const SPS *sps, std::ostream *pDecodedMessageOutputStream) @@ -497,8 +515,12 @@ void SEIReader::xParseSEIBufferingPeriod(SEIBufferingPeriod& sei, uint32_t paylo int i, nalOrVcl; uint32_t code; +#if JVET_N0063_VUI + const HRDParameters *pHRD = sps->getHrdParameters(); +#else const VUI *pVUI = sps->getVuiParameters(); const HRDParameters *pHRD = pVUI->getHrdParameters(); +#endif output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize); @@ -547,11 +569,17 @@ void SEIReader::xParseSEIPictureTiming(SEIPictureTiming& sei, uint32_t payloadSi int i; uint32_t code; +#if JVET_N0063_VUI + const HRDParameters *hrd = sps->getHrdParameters(); +#else const VUI *vui = sps->getVuiParameters(); const HRDParameters *hrd = vui->getHrdParameters(); +#endif output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize); +#if !JVET_N0063_VUI if( vui->getFrameFieldInfoPresentFlag() ) +#endif { sei_read_code( pDecodedMessageOutputStream, 4, code, "pic_struct" ); sei.m_picStruct = code; sei_read_code( pDecodedMessageOutputStream, 2, code, "source_scan_type" ); sei.m_sourceScanType = code; diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index 49953a9df897467073fe0235c4d3c8a6f5cb3953..4e36b860dd43a7647f04f6122b1e479d8d645a2d 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -909,6 +909,60 @@ void HLSyntaxReader::parseVUI(VUI* pcVUI, SPS *pcSPS) #if ENABLE_TRACING DTRACE( g_trace_ctx, D_HEADER, "----------- vui_parameters -----------\n"); #endif + +#if JVET_N0063_VUI + + uint32_t symbol; + + READ_FLAG( symbol, "aspect_ratio_info_present_flag"); pcVUI->setAspectRatioInfoPresentFlag(symbol); + if (pcVUI->getAspectRatioInfoPresentFlag()) + { + READ_CODE(8, symbol, "aspect_ratio_idc"); pcVUI->setAspectRatioIdc(symbol); + if (pcVUI->getAspectRatioIdc() == 255) + { + READ_CODE(16, symbol, "sar_width"); pcVUI->setSarWidth(symbol); + READ_CODE(16, symbol, "sar_height"); pcVUI->setSarHeight(symbol); + } + } + + READ_FLAG( symbol, "colour_description_present_flag"); pcVUI->setColourDescriptionPresentFlag(symbol); + if (pcVUI->getColourDescriptionPresentFlag()) + { + READ_CODE(8, symbol, "colour_primaries"); pcVUI->setColourPrimaries(symbol); + READ_CODE(8, symbol, "transfer_characteristics"); pcVUI->setTransferCharacteristics(symbol); + READ_CODE(8, symbol, "matrix_coeffs"); pcVUI->setMatrixCoefficients(symbol); + } + + READ_FLAG( symbol, "field_seq_flag"); pcVUI->setFieldSeqFlag(symbol); + + READ_FLAG( symbol, "chroma_loc_info_present_flag"); pcVUI->setChromaLocInfoPresentFlag(symbol); + if (pcVUI->getChromaLocInfoPresentFlag()) + { + if(pcVUI->getFieldSeqFlag()) + { + READ_UVLC( symbol, "chroma_sample_loc_type_top_field" ); pcVUI->setChromaSampleLocTypeTopField(symbol); + READ_UVLC( symbol, "chroma_sample_loc_type_bottom_field" ); pcVUI->setChromaSampleLocTypeBottomField(symbol); + } + else + { + READ_UVLC( symbol, "chroma_sample_loc_type" ); pcVUI->setChromaSampleLocType(symbol); + } + } + + READ_FLAG( symbol, "overscan_info_present_flag"); pcVUI->setOverscanInfoPresentFlag(symbol); + if (pcVUI->getOverscanInfoPresentFlag()) + { + READ_FLAG( symbol, "overscan_appropriate_flag"); pcVUI->setOverscanAppropriateFlag(symbol); + } + + READ_FLAG( symbol, "video_signal_type_present_flag"); pcVUI->setVideoSignalTypePresentFlag(symbol); + if (pcVUI->getVideoSignalTypePresentFlag()) + { + READ_FLAG( symbol, "video_full_range_flag"); pcVUI->setVideoFullRangeFlag(symbol); + } + +#else + uint32_t uiCode; READ_FLAG( uiCode, "aspect_ratio_info_present_flag"); pcVUI->setAspectRatioInfoPresentFlag(uiCode); @@ -997,6 +1051,8 @@ void HLSyntaxReader::parseVUI(VUI* pcVUI, SPS *pcSPS) READ_UVLC( uiCode, "log2_max_mv_length_horizontal" ); pcVUI->setLog2MaxMvLengthHorizontal(uiCode); READ_UVLC( uiCode, "log2_max_mv_length_vertical" ); pcVUI->setLog2MaxMvLengthVertical(uiCode); } + +#endif } void HLSyntaxReader::parseHrdParameters(HRDParameters *hrd, bool commonInfPresentFlag, uint32_t maxNumSubLayersMinus1) @@ -1465,7 +1521,22 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) } #endif - // KJS: no VUI defined yet +#if JVET_N0063_VUI + TimingInfo *timingInfo = pcSPS->getTimingInfo(); + READ_FLAG( uiCode, "timing_info_present_flag"); timingInfo->setTimingInfoPresentFlag (uiCode ? true : false); + if(timingInfo->getTimingInfoPresentFlag()) + { + READ_CODE( 32, uiCode, "num_units_in_tick"); timingInfo->setNumUnitsInTick (uiCode); + READ_CODE( 32, uiCode, "time_scale"); timingInfo->setTimeScale (uiCode); + + READ_FLAG( uiCode, "hrd_parameters_present_flag"); pcSPS->setHrdParametersPresentFlag(uiCode); + if( pcSPS->getHrdParametersPresentFlag() ) + { + parseHrdParameters( pcSPS->getHrdParameters(), 1, pcSPS->getMaxTLayers() - 1 ); + } + } +#endif + READ_FLAG( uiCode, "vui_parameters_present_flag" ); pcSPS->setVuiParametersPresentFlag(uiCode); if (pcSPS->getVuiParametersPresentFlag()) diff --git a/source/Lib/EncoderLib/EncCfg.h b/source/Lib/EncoderLib/EncCfg.h index 815077c508e8547efcf4ae1acbbb7c8312fa4026..301dc5d5052cb74723d3c675b7d7c2a416ab0ae8 100644 --- a/source/Lib/EncoderLib/EncCfg.h +++ b/source/Lib/EncoderLib/EncCfg.h @@ -579,6 +579,28 @@ protected: #endif bool m_recalculateQPAccordingToLambda; ///< recalculate QP value according to the lambda value int m_activeParameterSetsSEIEnabled; ///< enable active parameter set SEI message +#if JVET_N0063_VUI + bool m_vuiParametersPresentFlag; ///< enable generation of VUI parameters + bool m_aspectRatioInfoPresentFlag; ///< Signals whether aspect_ratio_idc is present + bool m_chromaResamplingFilterHintEnabled; ///< Signals whether chroma sampling filter hint data is present + int m_chromaResamplingHorFilterIdc; ///< Specifies the Index of filter to use + int m_chromaResamplingVerFilterIdc; ///< Specifies the Index of filter to use + int m_aspectRatioIdc; ///< aspect_ratio_idc + int m_sarWidth; ///< horizontal size of the sample aspect ratio + int m_sarHeight; ///< vertical size of the sample aspect ratio + bool m_colourDescriptionPresentFlag; ///< Signals whether colour_primaries, transfer_characteristics and matrix_coefficients are present + int m_colourPrimaries; ///< Indicates chromaticity coordinates of the source primaries + int m_transferCharacteristics; ///< Indicates the opto-electronic transfer characteristics of the source + int m_matrixCoefficients; ///< Describes the matrix coefficients used in deriving luma and chroma from RGB primaries + bool m_chromaLocInfoPresentFlag; ///< Signals whether chroma_sample_loc_type_top_field and chroma_sample_loc_type_bottom_field are present + int m_chromaSampleLocTypeTopField; ///< Specifies the location of chroma samples for top field + int m_chromaSampleLocTypeBottomField; ///< Specifies the location of chroma samples for bottom field + int m_chromaSampleLocType; ///< Specifies the location of chroma samples for progressive content + bool m_overscanInfoPresentFlag; ///< Signals whether overscan_appropriate_flag is present + bool m_overscanAppropriateFlag; ///< Indicates whether conformant decoded pictures are suitable for display using overscan + bool m_videoSignalTypePresentFlag; ///< Signals whether video_format, video_full_range_flag, and colour_description_present_flag are present + bool m_videoFullRangeFlag; ///< Indicates the black level and range of luma and chroma signals +#else bool m_vuiParametersPresentFlag; ///< enable generation of VUI parameters bool m_aspectRatioInfoPresentFlag; ///< Signals whether aspect_ratio_idc is present bool m_chromaResamplingFilterHintEnabled; ///< Signals whether chroma sampling filter hint data is present @@ -612,6 +634,7 @@ protected: int m_maxBitsPerMinCuDenom; ///< Indicates an upper bound for the number of bits of coding_unit() data int m_log2MaxMvLengthHorizontal; ///< Indicate the maximum absolute value of a decoded horizontal MV component in quarter-pel luma units int m_log2MaxMvLengthVertical; ///< Indicate the maximum absolute value of a decoded vertical MV component in quarter-pel luma units +#endif #if HEVC_USE_INTRA_SMOOTHING_T32 || HEVC_USE_INTRA_SMOOTHING_T64 bool m_useStrongIntraSmoothing; ///< enable the use of strong intra smoothing (bi_linear interpolation) for 32x32 blocks when reference samples are flat. @@ -1467,6 +1490,47 @@ public: void setActiveParameterSetsSEIEnabled ( int b ) { m_activeParameterSetsSEIEnabled = b; } int getActiveParameterSetsSEIEnabled () { return m_activeParameterSetsSEIEnabled; } + +#if JVET_N0063_VUI +#if JVET_N0349_DPS + bool getDecodingParameterSetEnabled() { return m_decodingParameterSetEnabled; } + void setDecodingParameterSetEnabled(bool i) { m_decodingParameterSetEnabled = i; } +#endif + bool getVuiParametersPresentFlag() { return m_vuiParametersPresentFlag; } + void setVuiParametersPresentFlag(bool i) { m_vuiParametersPresentFlag = i; } + bool getAspectRatioInfoPresentFlag() { return m_aspectRatioInfoPresentFlag; } + void setAspectRatioInfoPresentFlag(bool i) { m_aspectRatioInfoPresentFlag = i; } + int getAspectRatioIdc() { return m_aspectRatioIdc; } + void setAspectRatioIdc(int i) { m_aspectRatioIdc = i; } + int getSarWidth() { return m_sarWidth; } + void setSarWidth(int i) { m_sarWidth = i; } + int getSarHeight() { return m_sarHeight; } + void setSarHeight(int i) { m_sarHeight = i; } + bool getColourDescriptionPresentFlag() { return m_colourDescriptionPresentFlag; } + void setColourDescriptionPresentFlag(bool i) { m_colourDescriptionPresentFlag = i; } + int getColourPrimaries() { return m_colourPrimaries; } + void setColourPrimaries(int i) { m_colourPrimaries = i; } + int getTransferCharacteristics() { return m_transferCharacteristics; } + void setTransferCharacteristics(int i) { m_transferCharacteristics = i; } + int getMatrixCoefficients() { return m_matrixCoefficients; } + void setMatrixCoefficients(int i) { m_matrixCoefficients = i; } + bool getChromaLocInfoPresentFlag() { return m_chromaLocInfoPresentFlag; } + void setChromaLocInfoPresentFlag(bool i) { m_chromaLocInfoPresentFlag = i; } + int getChromaSampleLocTypeTopField() { return m_chromaSampleLocTypeTopField; } + void setChromaSampleLocTypeTopField(int i) { m_chromaSampleLocTypeTopField = i; } + int getChromaSampleLocTypeBottomField() { return m_chromaSampleLocTypeBottomField; } + void setChromaSampleLocTypeBottomField(int i) { m_chromaSampleLocTypeBottomField = i; } + int getChromaSampleLocType() { return m_chromaSampleLocType; } + void setChromaSampleLocType(int i) { m_chromaSampleLocType = i; } + bool getOverscanInfoPresentFlag() { return m_overscanInfoPresentFlag; } + void setOverscanInfoPresentFlag(bool i) { m_overscanInfoPresentFlag = i; } + bool getOverscanAppropriateFlag() { return m_overscanAppropriateFlag; } + void setOverscanAppropriateFlag(bool i) { m_overscanAppropriateFlag = i; } + bool getVideoSignalTypePresentFlag() { return m_videoSignalTypePresentFlag; } + void setVideoSignalTypePresentFlag(bool i) { m_videoSignalTypePresentFlag = i; } + bool getVideoFullRangeFlag() { return m_videoFullRangeFlag; } + void setVideoFullRangeFlag(bool i) { m_videoFullRangeFlag = i; } +#else bool getVuiParametersPresentFlag() { return m_vuiParametersPresentFlag; } void setVuiParametersPresentFlag(bool i) { m_vuiParametersPresentFlag = i; } #if JVET_N0349_DPS @@ -1531,6 +1595,7 @@ public: void setLog2MaxMvLengthHorizontal(int i) { m_log2MaxMvLengthHorizontal = i; } int getLog2MaxMvLengthVertical() { return m_log2MaxMvLengthVertical; } void setLog2MaxMvLengthVertical(int i) { m_log2MaxMvLengthVertical = i; } +#endif bool getProgressiveSourceFlag() const { return m_progressiveSourceFlag; } void setProgressiveSourceFlag(bool b) { m_progressiveSourceFlag = b; } diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp index e3addcbbfd4b36064ad8910424550c9cad941fe4..e6d90fa960ca4119dca6a25ff817a732ff16cf3c 100644 --- a/source/Lib/EncoderLib/EncGOP.cpp +++ b/source/Lib/EncoderLib/EncGOP.cpp @@ -445,7 +445,11 @@ void EncGOP::xWriteTrailingSEIMessages (SEIMessages& seiMessages, AccessUnit &ac void EncGOP::xWriteDuSEIMessages (SEIMessages& duInfoSeiMessages, AccessUnit &accessUnit, int temporalId, const SPS *sps, std::deque<DUData> &duData) { +#if JVET_N0063_VUI + const HRDParameters *hrd = sps->getHrdParameters(); +#else const HRDParameters *hrd = sps->getVuiParameters()->getHrdParameters(); +#endif if( m_pcCfg->getDecodingUnitInfoSEIEnabled() && hrd->getSubPicCpbParamsPresentFlag() ) { @@ -576,10 +580,17 @@ void EncGOP::xCreateIRAPLeadingSEIMessages (SEIMessages& seiMessages, const SPS void EncGOP::xCreatePerPictureSEIMessages (int picInGOP, SEIMessages& seiMessages, SEIMessages& nestedSeiMessages, Slice *slice) { +#if JVET_N0063_VUI + if( ( m_pcCfg->getBufferingPeriodSEIEnabled() ) && ( slice->getSliceType() == I_SLICE ) && + ( slice->getSPS()->getVuiParametersPresentFlag() ) && + ( ( slice->getSPS()->getHrdParameters()->getNalHrdParametersPresentFlag() ) + || ( slice->getSPS()->getHrdParameters()->getVclHrdParametersPresentFlag() ) ) ) +#else if( ( m_pcCfg->getBufferingPeriodSEIEnabled() ) && ( slice->getSliceType() == I_SLICE ) && ( slice->getSPS()->getVuiParametersPresentFlag() ) && ( ( slice->getSPS()->getVuiParameters()->getHrdParameters()->getNalHrdParametersPresentFlag() ) || ( slice->getSPS()->getVuiParameters()->getHrdParameters()->getVclHrdParametersPresentFlag() ) ) ) +#endif { SEIBufferingPeriod *bufferingPeriodSEI = new SEIBufferingPeriod(); m_seiEncoder.initSEIBufferingPeriod(bufferingPeriodSEI, slice); @@ -663,8 +674,12 @@ void EncGOP::xCreateScalableNestingSEI (SEIMessages& seiMessages, SEIMessages& n void EncGOP::xCreatePictureTimingSEI (int IRAPGOPid, SEIMessages& seiMessages, SEIMessages& nestedSeiMessages, SEIMessages& duInfoSeiMessages, Slice *slice, bool isField, std::deque<DUData> &duData) { +#if JVET_N0063_VUI + const HRDParameters *hrd = slice->getSPS()->getHrdParameters(); +#else const VUI *vui = slice->getSPS()->getVuiParameters(); const HRDParameters *hrd = vui->getHrdParameters(); +#endif // update decoding unit parameters if( ( m_pcCfg->getPictureTimingSEIEnabled() || m_pcCfg->getDecodingUnitInfoSEIEnabled() ) && @@ -701,6 +716,7 @@ void EncGOP::xCreatePictureTimingSEI (int IRAPGOPid, SEIMessages& seiMessages, m_lastBPSEI = m_totalCoded; } +#if !JVET_N0063_VUI if( hrd->getSubPicCpbParamsPresentFlag() ) { int i; @@ -764,6 +780,7 @@ void EncGOP::xCreatePictureTimingSEI (int IRAPGOPid, SEIMessages& seiMessages, } } } +#endif if( m_pcCfg->getPictureTimingSEIEnabled() ) { @@ -842,8 +859,12 @@ void EncGOP::xUpdateTimingSEI(SEIPictureTiming *pictureTimingSEI, std::deque<DUD { return; } +#if JVET_N0063_VUI + const HRDParameters *hrd = sps->getHrdParameters(); +#else const VUI *vui = sps->getVuiParameters(); const HRDParameters *hrd = vui->getHrdParameters(); +#endif if( hrd->getSubPicCpbParamsPresentFlag() ) { int i; @@ -870,7 +891,11 @@ void EncGOP::xUpdateTimingSEI(SEIPictureTiming *pictureTimingSEI, std::deque<DUD for( i = ( numDU - 2 ); i >= 0; i -- ) { +#if JVET_N0063_VUI + ui64Tmp = ( ( ( duData[numDU - 1].accumBitsDU - duData[i].accumBitsDU ) * ( sps->getTimingInfo()->getTimeScale() / sps->getTimingInfo()->getNumUnitsInTick() ) * ( hrd->getTickDivisorMinus2() + 2 ) ) / ( m_pcCfg->getTargetBitrate() ) ); +#else ui64Tmp = ( ( ( duData[numDU - 1].accumBitsDU - duData[i].accumBitsDU ) * ( vui->getTimingInfo()->getTimeScale() / vui->getTimingInfo()->getNumUnitsInTick() ) * ( hrd->getTickDivisorMinus2() + 2 ) ) / ( m_pcCfg->getTargetBitrate() ) ); +#endif if( (uint32_t)ui64Tmp > maxDiff ) { tmp ++; @@ -882,7 +907,11 @@ void EncGOP::xUpdateTimingSEI(SEIPictureTiming *pictureTimingSEI, std::deque<DUD for( i = ( numDU - 2 ); i >= 0; i -- ) { flag = 0; +#if JVET_N0063_VUI + ui64Tmp = ( ( ( duData[numDU - 1].accumBitsDU - duData[i].accumBitsDU ) * ( sps->getTimingInfo()->getTimeScale() / sps->getTimingInfo()->getNumUnitsInTick() ) * ( hrd->getTickDivisorMinus2() + 2 ) ) / ( m_pcCfg->getTargetBitrate() ) ); +#else ui64Tmp = ( ( ( duData[numDU - 1].accumBitsDU - duData[i].accumBitsDU ) * ( vui->getTimingInfo()->getTimeScale() / vui->getTimingInfo()->getNumUnitsInTick() ) * ( hrd->getTickDivisorMinus2() + 2 ) ) / ( m_pcCfg->getTargetBitrate() ) ); +#endif if( (uint32_t)ui64Tmp > maxDiff ) { @@ -2663,11 +2692,19 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, accessUnit.push_back(new NALUnitEBSP(nalu)); } +#if JVET_N0063_VUI + if( ( m_pcCfg->getPictureTimingSEIEnabled() || m_pcCfg->getDecodingUnitInfoSEIEnabled() ) && + ( pcSlice->getSPS()->getVuiParametersPresentFlag() ) && + ( ( pcSlice->getSPS()->getHrdParameters()->getNalHrdParametersPresentFlag() ) + || ( pcSlice->getSPS()->getHrdParameters()->getVclHrdParametersPresentFlag() ) ) && + ( pcSlice->getSPS()->getHrdParameters()->getSubPicCpbParamsPresentFlag() ) ) +#else if( ( m_pcCfg->getPictureTimingSEIEnabled() || m_pcCfg->getDecodingUnitInfoSEIEnabled() ) && ( pcSlice->getSPS()->getVuiParametersPresentFlag() ) && ( ( pcSlice->getSPS()->getVuiParameters()->getHrdParameters()->getNalHrdParametersPresentFlag() ) || ( pcSlice->getSPS()->getVuiParameters()->getHrdParameters()->getVclHrdParametersPresentFlag() ) ) && ( pcSlice->getSPS()->getVuiParameters()->getHrdParameters()->getSubPicCpbParamsPresentFlag() ) ) +#endif { uint32_t numNalus = 0; uint32_t numRBSPBytes = 0; diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp index f814854412797005fdb39833ce8404ef1ddb8116..cd3ce92d609c5a56c76b79d30619f940710a4ed4 100644 --- a/source/Lib/EncoderLib/EncLib.cpp +++ b/source/Lib/EncoderLib/EncLib.cpp @@ -264,7 +264,11 @@ void EncLib::init( bool isFieldCoding, AUWriterIf* auWriterIf ) #if U0132_TARGET_BITS_SATURATION if (m_RCCpbSaturationEnabled) { +#if JVET_N0063_VUI + m_cRateCtrl.initHrdParam(sps0.getHrdParameters(), m_iFrameRate, m_RCInitialCpbFullness); +#else m_cRateCtrl.initHrdParam(sps0.getVuiParameters()->getHrdParameters(), m_iFrameRate, m_RCInitialCpbFullness); +#endif } #endif #if ENABLE_SPLIT_PARALLELISM || ENABLE_WPP_PARALLELISM @@ -1090,6 +1094,29 @@ void EncLib::xInitSPS(SPS &sps) sps.setALFEnabledFlag( m_alf ); sps.setVuiParametersPresentFlag(getVuiParametersPresentFlag()); +#if JVET_N0063_VUI + if (sps.getVuiParametersPresentFlag()) + { + VUI* pcVUI = sps.getVuiParameters(); + pcVUI->setAspectRatioInfoPresentFlag(getAspectRatioInfoPresentFlag()); + pcVUI->setAspectRatioIdc(getAspectRatioIdc()); + pcVUI->setSarWidth(getSarWidth()); + pcVUI->setSarHeight(getSarHeight()); + pcVUI->setColourDescriptionPresentFlag(getColourDescriptionPresentFlag()); + pcVUI->setColourPrimaries(getColourPrimaries()); + pcVUI->setTransferCharacteristics(getTransferCharacteristics()); + pcVUI->setMatrixCoefficients(getMatrixCoefficients()); + pcVUI->setFieldSeqFlag(false); + pcVUI->setChromaLocInfoPresentFlag(getChromaLocInfoPresentFlag()); + pcVUI->setChromaSampleLocTypeTopField(getChromaSampleLocTypeTopField()); + pcVUI->setChromaSampleLocTypeBottomField(getChromaSampleLocTypeBottomField()); + pcVUI->setChromaSampleLocType(getChromaSampleLocType()); + pcVUI->setOverscanInfoPresentFlag(getOverscanInfoPresentFlag()); + pcVUI->setOverscanAppropriateFlag(getOverscanAppropriateFlag()); + pcVUI->setVideoSignalTypePresentFlag(getVideoSignalTypePresentFlag()); + pcVUI->setVideoFullRangeFlag(getVideoFullRangeFlag()); + } +#else if (sps.getVuiParametersPresentFlag()) { VUI* pcVUI = sps.getVuiParameters(); @@ -1125,6 +1152,7 @@ void EncLib::xInitSPS(SPS &sps) pcVUI->setLog2MaxMvLengthHorizontal(getLog2MaxMvLengthHorizontal()); pcVUI->setLog2MaxMvLengthVertical(getLog2MaxMvLengthVertical()); } +#endif sps.setNumLongTermRefPicSPS(NUM_LONG_TERM_REF_PIC_SPS); CHECK(!(NUM_LONG_TERM_REF_PIC_SPS <= MAX_NUM_LONG_TERM_REF_PICS), "Unspecified error"); @@ -1144,7 +1172,11 @@ void EncLib::xInitSPS(SPS &sps) } if( getBufferingPeriodSEIEnabled() || getPictureTimingSEIEnabled() || getDecodingUnitInfoSEIEnabled() ) { +#if JVET_N0063_VUI + sps.setHrdParametersPresentFlag( true ); +#else sps.getVuiParameters()->setHrdParametersPresentFlag( true ); +#endif } // Set up SPS range extension settings @@ -1165,6 +1197,13 @@ void EncLib::xInitHrdParameters(SPS &sps) { m_encHRD.initHRDParameters((EncCfg*) this); +#if JVET_N0063_VUI + HRDParameters *hrdParams = sps.getHrdParameters(); + *hrdParams = m_encHRD.getHRDParameters(); + + TimingInfo *timingInfo = sps.getTimingInfo(); + *timingInfo = m_encHRD.getTimingInfo(); +#else VUI *vui = sps.getVuiParameters(); HRDParameters *hrdParams = vui->getHrdParameters(); @@ -1172,6 +1211,7 @@ void EncLib::xInitHrdParameters(SPS &sps) TimingInfo *timingInfo = vui->getTimingInfo(); *timingInfo = m_encHRD.getTimingInfo(); +#endif } void EncLib::xInitPPS(PPS &pps, const SPS &sps) diff --git a/source/Lib/EncoderLib/SEIEncoder.cpp b/source/Lib/EncoderLib/SEIEncoder.cpp index de5da47f4bb3f3122b9e91752b10c898ebb5257c..bdd87e44bb26a794871fd948a8cd19291d7d0ce0 100644 --- a/source/Lib/EncoderLib/SEIEncoder.cpp +++ b/source/Lib/EncoderLib/SEIEncoder.cpp @@ -246,11 +246,13 @@ void SEIEncoder::initSEIBufferingPeriod(SEIBufferingPeriod *bufferingPeriodSEI, bufferingPeriodSEI->m_initialCpbRemovalDelay [0][1] = uiInitialCpbRemovalDelay; bufferingPeriodSEI->m_initialCpbRemovalDelayOffset[0][1] = uiInitialCpbRemovalDelay; +#if !JVET_N0063_VUI double dTmp = (double)slice->getSPS()->getVuiParameters()->getTimingInfo()->getNumUnitsInTick() / (double)slice->getSPS()->getVuiParameters()->getTimingInfo()->getTimeScale(); uint32_t uiTmp = (uint32_t)( dTmp * 90000.0 ); uiInitialCpbRemovalDelay -= uiTmp; uiInitialCpbRemovalDelay -= uiTmp / ( slice->getSPS()->getVuiParameters()->getHrdParameters()->getTickDivisorMinus2() + 2 ); +#endif bufferingPeriodSEI->m_initialAltCpbRemovalDelay [0][0] = uiInitialCpbRemovalDelay; bufferingPeriodSEI->m_initialAltCpbRemovalDelayOffset[0][0] = uiInitialCpbRemovalDelay; bufferingPeriodSEI->m_initialAltCpbRemovalDelay [0][1] = uiInitialCpbRemovalDelay; diff --git a/source/Lib/EncoderLib/SEIwrite.cpp b/source/Lib/EncoderLib/SEIwrite.cpp index 4999e57544220f1c4fbf9e3479ccaf458c099439..9d48630aa13b1c5c3c81a4b8be4c97fc3dac23bb 100644 --- a/source/Lib/EncoderLib/SEIwrite.cpp +++ b/source/Lib/EncoderLib/SEIwrite.cpp @@ -246,6 +246,18 @@ void SEIWriter::xWriteSEIActiveParameterSets(const SEIActiveParameterSets& sei) void SEIWriter::xWriteSEIDecodingUnitInfo(const SEIDecodingUnitInfo& sei, const SPS *sps) { +#if JVET_N0063_VUI + WRITE_UVLC(sei.m_decodingUnitIdx, "decoding_unit_idx"); + if(sps->getHrdParameters()->getSubPicCpbParamsInPicTimingSEIFlag()) + { + WRITE_CODE( sei.m_duSptCpbRemovalDelay, (sps->getHrdParameters()->getDuCpbRemovalDelayLengthMinus1() + 1), "du_spt_cpb_removal_delay_increment"); + } + WRITE_FLAG( sei.m_dpbOutputDuDelayPresentFlag, "dpb_output_du_delay_present_flag"); + if(sei.m_dpbOutputDuDelayPresentFlag) + { + WRITE_CODE(sei.m_picSptDpbOutputDuDelay, sps->getHrdParameters()->getDpbOutputDelayDuLengthMinus1() + 1, "pic_spt_dpb_output_du_delay"); + } +#else const VUI *vui = sps->getVuiParameters(); WRITE_UVLC(sei.m_decodingUnitIdx, "decoding_unit_idx"); if(vui->getHrdParameters()->getSubPicCpbParamsInPicTimingSEIFlag()) @@ -257,13 +269,18 @@ void SEIWriter::xWriteSEIDecodingUnitInfo(const SEIDecodingUnitInfo& sei, const { WRITE_CODE(sei.m_picSptDpbOutputDuDelay, vui->getHrdParameters()->getDpbOutputDelayDuLengthMinus1() + 1, "pic_spt_dpb_output_du_delay"); } +#endif } void SEIWriter::xWriteSEIBufferingPeriod(const SEIBufferingPeriod& sei, const SPS *sps) { int i, nalOrVcl; +#if JVET_N0063_VUI + const HRDParameters *hrd = sps->getHrdParameters(); +#else const VUI *vui = sps->getVuiParameters(); const HRDParameters *hrd = vui->getHrdParameters(); +#endif WRITE_UVLC( sei.m_bpSeqParameterSetId, "bp_seq_parameter_set_id" ); if( !hrd->getSubPicCpbParamsPresentFlag() ) @@ -298,10 +315,16 @@ void SEIWriter::xWriteSEIBufferingPeriod(const SEIBufferingPeriod& sei, const SP void SEIWriter::xWriteSEIPictureTiming(const SEIPictureTiming& sei, const SPS *sps) { int i; +#if JVET_N0063_VUI + const HRDParameters *hrd = sps->getHrdParameters(); +#else const VUI *vui = sps->getVuiParameters(); const HRDParameters *hrd = vui->getHrdParameters(); +#endif +#if !JVET_N0063_VUI if( vui->getFrameFieldInfoPresentFlag() ) +#endif { WRITE_CODE( sei.m_picStruct, 4, "pic_struct" ); WRITE_CODE( sei.m_sourceScanType, 2, "source_scan_type" ); diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index c24d0d43ba816ba08faa799bc907605968de5366..cbd08cda096d3271b06592a4f6b44513690383c8 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -583,6 +583,53 @@ void HLSWriter::codeVUI( const VUI *pcVUI, const SPS* pcSPS ) #if ENABLE_TRACING DTRACE( g_trace_ctx, D_HEADER, "----------- vui_parameters -----------\n"); #endif + +#if JVET_N0063_VUI + + WRITE_FLAG(pcVUI->getAspectRatioInfoPresentFlag(), "aspect_ratio_info_present_flag"); + if (pcVUI->getAspectRatioInfoPresentFlag()) + { + WRITE_CODE(pcVUI->getAspectRatioIdc(), 8, "aspect_ratio_idc" ); + if (pcVUI->getAspectRatioIdc() == 255) + { + WRITE_CODE(pcVUI->getSarWidth(), 16, "sar_width"); + WRITE_CODE(pcVUI->getSarHeight(), 16, "sar_height"); + } + } + WRITE_FLAG(pcVUI->getColourDescriptionPresentFlag(), "colour_description_present_flag"); + if (pcVUI->getColourDescriptionPresentFlag()) + { + WRITE_CODE(pcVUI->getColourPrimaries(), 8, "colour_primaries"); + WRITE_CODE(pcVUI->getTransferCharacteristics(), 8, "transfer_characteristics"); + WRITE_CODE(pcVUI->getMatrixCoefficients(), 8, "matrix_coeffs"); + } + WRITE_FLAG(pcVUI->getFieldSeqFlag(), "field_seq_flag"); + WRITE_FLAG(pcVUI->getChromaLocInfoPresentFlag(), "chroma_loc_info_present_flag"); + if (pcVUI->getChromaLocInfoPresentFlag()) + { + if(pcVUI->getFieldSeqFlag()) + { + WRITE_UVLC(pcVUI->getChromaSampleLocTypeTopField(), "chroma_sample_loc_type_top_field"); + WRITE_UVLC(pcVUI->getChromaSampleLocTypeBottomField(), "chroma_sample_loc_type_bottom_field"); + } + else + { + WRITE_UVLC(pcVUI->getChromaSampleLocType(), "chroma_sample_loc_type"); + } + } + WRITE_FLAG(pcVUI->getOverscanInfoPresentFlag(), "overscan_info_present_flag"); + if (pcVUI->getOverscanInfoPresentFlag()) + { + WRITE_FLAG(pcVUI->getOverscanAppropriateFlag(), "overscan_appropriate_flag"); + } + WRITE_FLAG(pcVUI->getVideoSignalTypePresentFlag(), "video_signal_type_present_flag"); + if (pcVUI->getVideoSignalTypePresentFlag()) + { + WRITE_FLAG(pcVUI->getVideoFullRangeFlag(), "video_full_range_flag"); + } + +#else + WRITE_FLAG(pcVUI->getAspectRatioInfoPresentFlag(), "aspect_ratio_info_present_flag"); if (pcVUI->getAspectRatioInfoPresentFlag()) { @@ -662,6 +709,7 @@ void HLSWriter::codeVUI( const VUI *pcVUI, const SPS* pcSPS ) WRITE_UVLC(pcVUI->getLog2MaxMvLengthHorizontal(), "log2_max_mv_length_horizontal"); WRITE_UVLC(pcVUI->getLog2MaxMvLengthVertical(), "log2_max_mv_length_vertical"); } +#endif } void HLSWriter::codeHrdParameters( const HRDParameters *hrd, bool commonInfPresentFlag, uint32_t maxNumSubLayersMinus1 ) @@ -1043,7 +1091,21 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) } #endif - // KJS: no VUI defined yet +#if JVET_N0063_VUI + const TimingInfo *timingInfo = pcSPS->getTimingInfo(); + WRITE_FLAG(timingInfo->getTimingInfoPresentFlag(), "timing_info_present_flag"); + if(timingInfo->getTimingInfoPresentFlag()) + { + WRITE_CODE(timingInfo->getNumUnitsInTick(), 32, "num_units_in_tick"); + WRITE_CODE(timingInfo->getTimeScale(), 32, "time_scale"); + WRITE_FLAG(pcSPS->getHrdParametersPresentFlag(), "hrd_parameters_present_flag"); + if( pcSPS->getHrdParametersPresentFlag() ) + { + codeHrdParameters(pcSPS->getHrdParameters(), 1, pcSPS->getMaxTLayers() - 1 ); + } + } +#endif + WRITE_FLAG( pcSPS->getVuiParametersPresentFlag(), "vui_parameters_present_flag" ); if (pcSPS->getVuiParametersPresentFlag()) {