From 57b36a0e65fa38ae5660a429b6e1d380e71191a1 Mon Sep 17 00:00:00 2001 From: tbiatek <thibaud.biatek@nokia.com> Date: Thu, 25 Jul 2024 16:07:33 +0200 Subject: [PATCH] JVET-AI0180: Adding original source picture dimensions to EOI SEI --- cfg/sei_vui/encoder_optimization_info.cfg | 3 +++ doc/software-manual.tex | 12 ++++++++++++ source/App/EncoderApp/EncApp.cpp | 5 +++++ source/App/EncoderApp/EncAppCfg.cpp | 5 +++++ source/App/EncoderApp/EncAppCfg.h | 5 +++++ source/Lib/CommonLib/SEI.cpp | 5 +++++ source/Lib/CommonLib/SEI.h | 10 ++++++++++ source/Lib/CommonLib/TypeDef.h | 1 + source/Lib/DecoderLib/SEIread.cpp | 17 +++++++++++++++++ source/Lib/EncoderLib/EncCfg.h | 13 +++++++++++++ source/Lib/EncoderLib/SEIEncoder.cpp | 13 +++++++++++++ source/Lib/EncoderLib/SEIwrite.cpp | 13 +++++++++++++ 12 files changed, 102 insertions(+) diff --git a/cfg/sei_vui/encoder_optimization_info.cfg b/cfg/sei_vui/encoder_optimization_info.cfg index f2d7c3ded..7db20f90c 100644 --- a/cfg/sei_vui/encoder_optimization_info.cfg +++ b/cfg/sei_vui/encoder_optimization_info.cfg @@ -9,6 +9,9 @@ SEIEOIType: 39 #Bitmask for type of optmiization applie SEIEOIObjectBasedIdc: 0 #Bitmask for object based optimization type SEIEOITemporalResamplingTypeFlag: 1 #Type of temporal resampling (0: subsampling, 1: upsampling) SEIEOINumIntPics: 2 #Num of added picture between two pics when temporal resampling type optimization is enabled +SEIEOIOrigPicDimensionsFlag: 1 # Whether original source picture dimensions are present +SEIEOIOrigPicWidth: 1280 # Original source picture width +SEIEOIOrigPicHeight: 720 # Original source picture height SEIEOISpatialResamplingTypeFlag: 0 #Type of spatial resampling (0: subsampling, 1: upsampling) SEIEOIPrivacyProtectionTypeIdc: 0 #Type of privacy protection method that is applied (0: Undefined, 1: Blurring, 2: Replacing, 3: Masking) SEIEOIPrivacyProtectedInfoType: 128 #Type of privacy information that is protected diff --git a/doc/software-manual.tex b/doc/software-manual.tex index 9991d426e..345845e25 100644 --- a/doc/software-manual.tex +++ b/doc/software-manual.tex @@ -6072,6 +6072,18 @@ Specifies whether temporal resampling type optimization is enabled. \Default{2} & Specifies the number of added picture between two pics when temporal resampling type optimization is enabled. \\ +\Option{SEIEOIOrigPicDimensionsFlag} & +\Default{0} & +Specifies if original source picture dimensions are present. +\\ +\Option{SEIEOIOrigPicWidth} & +\Default{0} & +Specifies the width of the original source picture. +\\ +\Option{SEIEOIOrigPicHeight} & +\Default{0} & +Specifies the height of the original source picture. +\\ \Option{SEIEOISpatialResamplingTypeFlag} & \Default{0} & Specifies whether spatial resampling type optimization is enabled. diff --git a/source/App/EncoderApp/EncApp.cpp b/source/App/EncoderApp/EncApp.cpp index 8473d3676..e6a37beaf 100644 --- a/source/App/EncoderApp/EncApp.cpp +++ b/source/App/EncoderApp/EncApp.cpp @@ -1122,6 +1122,11 @@ void EncApp::xInitLibCfg( int layerIdx ) m_cEncLib.setEOISEIObjectBasedIdc(m_eoiSEIObjectBasedIdc); m_cEncLib.setEOISEITemporalResamplingTypeFlag(m_eoiSEITemporalResamplingTypeFlag); m_cEncLib.setEOISEINumIntPics(m_eoiSEINumIntPics); +#if JVET_AI0180 + m_cEncLib.setEOISEIOrigPicDimensionsFlag(m_eoiSEIOrigPicDimensionsFlag); + m_cEncLib.setEOISEIOrigPicWidth(m_eoiSEIOrigPicWidth); + m_cEncLib.setEOISEIOrigPicHeight(m_eoiSEIOrigPicHeight); +#endif m_cEncLib.setEOISEISpatialResamplingTypeFlag(m_eoiSEISpatialResamplingTypeFlag); m_cEncLib.setEOISEIPrivacyProtectionTypeIdc(m_eoiSEIPrivacyProtectionTypeIdc); m_cEncLib.setEOISEIPrivacyProtectedInfoType(m_eoiSEIPrivacyProtectedInfoType); diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp index 418a915e6..bec861e79 100644 --- a/source/App/EncoderApp/EncAppCfg.cpp +++ b/source/App/EncoderApp/EncAppCfg.cpp @@ -1488,6 +1488,11 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) ("SEIEOIObjectBasedIdc", m_eoiSEIObjectBasedIdc, 0u, "Indicates the type of object-based optimization") ("SEIEOITemporalResamplingTypeFlag", m_eoiSEITemporalResamplingTypeFlag, false, "specifies the type of the temporal resampling optimization.") ("SEIEOINumIntPics", m_eoiSEINumIntPics, 0u, "indicates that the count of pictures that the encoding system excluded or added between each pair of coded pictures in output order within the persistence of this SEI message is constant") +#if JVET_AI0180 +("SEIEOIOrigPicDimensionsFlag",m_eoiSEIOrigPicDimensionsFlag, false, "specifies if original source picture dimensions are present.") +("SEIEOIOrigPicWidth", m_eoiSEIOrigPicWidth, 0u, "indicates the width of the original source picture.") +("SEIEOIOrigPicHeight", m_eoiSEIOrigPicHeight, 0u, "indicates the height of the original source picture.") +#endif ("SEIEOISpatialResamplingTypeFlag", m_eoiSEISpatialResamplingTypeFlag, false, "specifies the type of the spatial resampling optimization.") ("SEIEOIPrivacyProtectionTypeIdc", m_eoiSEIPrivacyProtectionTypeIdc, 0u, "indicates the type of privacy protection optimization") ("SEIEOIPrivacyProtectedInfoType", m_eoiSEIPrivacyProtectedInfoType, 0u, "indicates the types of protected information") diff --git a/source/App/EncoderApp/EncAppCfg.h b/source/App/EncoderApp/EncAppCfg.h index cba5782fc..e3d3579ab 100644 --- a/source/App/EncoderApp/EncAppCfg.h +++ b/source/App/EncoderApp/EncAppCfg.h @@ -550,6 +550,11 @@ protected: uint32_t m_eoiSEIObjectBasedIdc; bool m_eoiSEITemporalResamplingTypeFlag; uint32_t m_eoiSEINumIntPics; +#if JVET_AI0180 + bool m_eoiSEIOrigPicDimensionsFlag; + uint32_t m_eoiSEIOrigPicWidth; + uint32_t m_eoiSEIOrigPicHeight; +#endif bool m_eoiSEISpatialResamplingTypeFlag; uint32_t m_eoiSEIPrivacyProtectionTypeIdc; uint32_t m_eoiSEIPrivacyProtectedInfoType; diff --git a/source/Lib/CommonLib/SEI.cpp b/source/Lib/CommonLib/SEI.cpp index 75cc4c300..c055d125e 100644 --- a/source/Lib/CommonLib/SEI.cpp +++ b/source/Lib/CommonLib/SEI.cpp @@ -1149,6 +1149,11 @@ SEIEncoderOptimizationInfo::SEIEncoderOptimizationInfo( m_objectBasedIdc = sei.m_objectBasedIdc; m_temporalResamplingTypeFlag = sei.m_temporalResamplingTypeFlag; m_numIntPics = sei.m_numIntPics; +#if JVET_AI0180 + m_origPicDimensionsFlag = sei.m_origPicDimensionsFlag; + m_origPicWidth = sei.m_origPicWidth; + m_origPicHeight = sei.m_origPicHeight; +#endif m_spatialResamplingTypeFlag = sei.m_spatialResamplingTypeFlag; m_privacyProtectionTypeIdc = sei.m_privacyProtectionTypeIdc; m_privacyProtectedInfoType = sei.m_privacyProtectedInfoType; diff --git a/source/Lib/CommonLib/SEI.h b/source/Lib/CommonLib/SEI.h index 27cac5298..412d666cb 100644 --- a/source/Lib/CommonLib/SEI.h +++ b/source/Lib/CommonLib/SEI.h @@ -1505,6 +1505,11 @@ public: , m_objectBasedIdc(0) , m_temporalResamplingTypeFlag(false) , m_numIntPics(0) + #if JVET_AI0180 + , m_origPicDimensionsFlag(false) + , m_origPicWidth(0) + , m_origPicHeight(0) + #endif , m_spatialResamplingTypeFlag(false) , m_privacyProtectionTypeIdc(0) , m_privacyProtectedInfoType(0) @@ -1521,6 +1526,11 @@ public: uint32_t m_objectBasedIdc; bool m_temporalResamplingTypeFlag; uint32_t m_numIntPics; +#if JVET_AI0180 + bool m_origPicDimensionsFlag; + uint32_t m_origPicWidth; + uint32_t m_origPicHeight; +#endif bool m_spatialResamplingTypeFlag; uint32_t m_privacyProtectionTypeIdc; uint32_t m_privacyProtectedInfoType; diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 1685cdd50..b8f82c914 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -54,6 +54,7 @@ // clang-format off +#define JVET_AI0180 1 // JVET AI0180: "AHG9: Adding original source picture dimensions to EOI SEI" //########### place macros to be removed in next cycle below this line ############### diff --git a/source/Lib/DecoderLib/SEIread.cpp b/source/Lib/DecoderLib/SEIread.cpp index 4cb9daca8..4792791c3 100644 --- a/source/Lib/DecoderLib/SEIread.cpp +++ b/source/Lib/DecoderLib/SEIread.cpp @@ -1882,8 +1882,25 @@ void SEIReader::xParseSEIEncoderOptimizationInfo(SEIEncoderOptimizationInfo& sei if ((sei.m_type & EOI_OptimizationType::SPATIAL_RESAMPLING) != 0) { +#if JVET_AI0180 + sei_read_flag(pDecodedMessageOutputStream, val, "eoi_orig_pic_dimensions_flag"); + sei.m_origPicDimensionsFlag = val; + if (sei.m_origPicDimensionsFlag) + { + sei_read_code(pDecodedMessageOutputStream, 16, val, "eoi_orig_pic_width"); + sei.m_origPicWidth = val; + sei_read_code(pDecodedMessageOutputStream, 16, val, "eoi_orig_pic_height"); + sei.m_origPicHeight = val; + } + else + { + sei_read_flag(pDecodedMessageOutputStream, val, "eoi_spatial_resampling_type_flag"); + sei.m_spatialResamplingTypeFlag = val; + } +#else sei_read_flag(pDecodedMessageOutputStream, val, "eoi_spatial_resampling_type_flag"); sei.m_spatialResamplingTypeFlag = val; +#endif } if ((sei.m_type & EOI_OptimizationType::PRIVACY_PROTECTION_OPTIMIZATION) != 0) diff --git a/source/Lib/EncoderLib/EncCfg.h b/source/Lib/EncoderLib/EncCfg.h index ff898d578..cc4a56a07 100644 --- a/source/Lib/EncoderLib/EncCfg.h +++ b/source/Lib/EncoderLib/EncCfg.h @@ -787,6 +787,11 @@ protected: uint32_t m_eoiSEIObjectBasedIdc; bool m_eoiSEITemporalResamplingTypeFlag; uint32_t m_eoiSEINumIntPics; +#if JVET_AI0180 + bool m_eoiSEIOrigPicDimensionsFlag; + uint32_t m_eoiSEIOrigPicWidth; + uint32_t m_eoiSEIOrigPicHeight; +#endif bool m_eoiSEISpatialResamplingTypeFlag; uint32_t m_eoiSEIPrivacyProtectionTypeIdc; uint32_t m_eoiSEIPrivacyProtectedInfoType; @@ -2406,6 +2411,14 @@ public: bool getEOISEITemporalResamplingTypeFlag() const { return m_eoiSEITemporalResamplingTypeFlag; } void setEOISEINumIntPics(uint32_t numIntPics) { m_eoiSEINumIntPics = numIntPics; } uint32_t getEOISEINumIntPics() const { return m_eoiSEINumIntPics; } +#if JVET_AI0180 + void setEOISEIOrigPicDimensionsFlag(bool origPicDimensionsFlag) { m_eoiSEIOrigPicDimensionsFlag = origPicDimensionsFlag; } + bool getEOISEIOrigPicDimensionsFlag() { return m_eoiSEIOrigPicDimensionsFlag; } + void setEOISEIOrigPicWidth(uint32_t origPicWidth) { m_eoiSEIOrigPicWidth = origPicWidth; } + uint32_t getEOISEIOrigPicWidth() { return m_eoiSEIOrigPicWidth; } + void setEOISEIOrigPicHeight(uint32_t origPicHeight) { m_eoiSEIOrigPicHeight = origPicHeight; } + uint32_t getEOISEIOrigPicHeight() { return m_eoiSEIOrigPicHeight; } +#endif void setEOISEISpatialResamplingTypeFlag(bool spatialResamplingTypeFlag) { m_eoiSEISpatialResamplingTypeFlag = spatialResamplingTypeFlag; } bool getEOISEISpatialResamplingTypeFlag() const { return m_eoiSEISpatialResamplingTypeFlag; } void setEOISEIPrivacyProtectionTypeIdc(uint32_t privacyProtectionTypeIdc) { m_eoiSEIPrivacyProtectionTypeIdc = privacyProtectionTypeIdc; } diff --git a/source/Lib/EncoderLib/SEIEncoder.cpp b/source/Lib/EncoderLib/SEIEncoder.cpp index 71ab049bf..7f2b11fc4 100644 --- a/source/Lib/EncoderLib/SEIEncoder.cpp +++ b/source/Lib/EncoderLib/SEIEncoder.cpp @@ -1595,7 +1595,20 @@ void SEIEncoder::initSEIEncoderOptimizationInfo(SEIEncoderOptimizationInfo *sei) } if ((sei->m_type & EOI_OptimizationType::SPATIAL_RESAMPLING) != 0) { +#if JVET_AI0180 + sei->m_origPicDimensionsFlag = m_pcCfg->getEOISEIOrigPicDimensionsFlag(); + if (sei->m_origPicDimensionsFlag) + { + sei->m_origPicWidth = m_pcCfg->getEOISEIOrigPicWidth(); + sei->m_origPicHeight = m_pcCfg->getEOISEIOrigPicHeight(); + } + else + { + sei->m_spatialResamplingTypeFlag = m_pcCfg->getEOISEISpatialResamplingTypeFlag(); + } +#else sei->m_spatialResamplingTypeFlag = m_pcCfg->getEOISEISpatialResamplingTypeFlag(); +#endif } if ((sei->m_type & EOI_OptimizationType::PRIVACY_PROTECTION_OPTIMIZATION) != 0) { diff --git a/source/Lib/EncoderLib/SEIwrite.cpp b/source/Lib/EncoderLib/SEIwrite.cpp index c3417c5a3..97bf8b0cb 100644 --- a/source/Lib/EncoderLib/SEIwrite.cpp +++ b/source/Lib/EncoderLib/SEIwrite.cpp @@ -2006,7 +2006,20 @@ void SEIWriter::xWriteSEIEncoderOptimizationInfo(const SEIEncoderOptimizationInf } if ((sei.m_type & EOI_OptimizationType::SPATIAL_RESAMPLING) != 0) { +#if JVET_AI0180 + xWriteFlag(sei.m_origPicDimensionsFlag, "eoi_orig_pic_dimensions_flag"); + if (sei.m_origPicDimensionsFlag) + { + xWriteCode(sei.m_origPicWidth, 16, "eoi_orig_pic_width"); + xWriteCode(sei.m_origPicHeight, 16, "eoi_orig_pic_height"); + } + else + { + xWriteFlag(sei.m_spatialResamplingTypeFlag, "eoi_spatial_resampling_type_flag"); + } +#else xWriteFlag(sei.m_spatialResamplingTypeFlag, "eoi_spatial_resampling_type_flag"); +#endif } if ((sei.m_type & EOI_OptimizationType::PRIVACY_PROTECTION_OPTIMIZATION) != 0) { -- GitLab