diff --git a/cfg/multi-layer/two_layers_ELonlyILP.cfg b/cfg/multi-layer/two_layers_ELonlyILP.cfg index 3bca520408a3c6e28347100c6e9e4d1b6c4924b7..f4310ca78506ecc8767c4259a0b40f275b62a2a8 100644 --- a/cfg/multi-layer/two_layers_ELonlyILP.cfg +++ b/cfg/multi-layer/two_layers_ELonlyILP.cfg @@ -3,10 +3,10 @@ MaxLayers : 2 MaxSublayers : 1 AllLayersSameNumSublayersFlag : 0 AllIndependentLayersFlag : 0 -AllowablePredDirection : 1 1 1 1 1 # equal to 0 specifies the picture in the i-th temporal layer is allowed to use both inter-layer and intra-layer preditions - # equal to 1 specifies the picture in the i-th temporal layer is allowed to use inter-layer predition only - # equal to 2 specifies the picture in the i-th temporal layer is allowed to use intra-layer predition only - +AllowablePredDirection : 1 1 1 1 1 # equal to 0 specifies the picture in the i-th temporal layer is allowed to use both inter-layer and intra-layer preditions + # equal to 1 specifies the picture in the i-th temporal layer is allowed to use inter-layer predition only + # equal to 2 specifies the picture in the i-th temporal layer is allowed to use intra-layer predition only + #======== OLSs =============== EachLayerIsAnOlsFlag : 0 OlsModeIdc : 2 diff --git a/cfg/sei_vui/subpicture_level.cfg b/cfg/sei_vui/subpicture_level.cfg index 4f38f5110e692b9de2d4f46d11c5eba2eb1e7ce8..39eec9236c89c89646c22c6a0061251139050f53 100644 --- a/cfg/sei_vui/subpicture_level.cfg +++ b/cfg/sei_vui/subpicture_level.cfg @@ -1,9 +1,17 @@ -SEISubpicLevelInfoEnabled: 1 -SEISubpicLevelInfoRefLevels: 4.1 # list of levels to be included -SEISubpicLevelInfoExplicitFraction: 1 # enable sending of explicit fractions -SEISubpicLevelInfoNumSubpics: 2 # number of subpictures - needs to be aligned with NumSubpics -SEISubpicLevelInfoMaxSublayers: 1 # number of sublayers -SEISubpicLevelInfoSublayerInfoPresentFlag: 0 # 1: the level information for subpicture sequences is present for sublayer representation(s) in the range of 0 to sli_max_sublayers_minus1, inclusive - 0: the level information for subpicture sequences is present for the sli_max_sublayers_minus1-th sublayer representation -SEISubpicLevelInfoRefLevelFractions: 40 30 # list of fractions: iterates over subpictures and levels and sublayers (subpictures first) +SEISubpicLevelInfoEnabled: 1 +SEISubpicLevelInfoExplicitFraction: 1 # enable sending of explicit fractions +SEISubpicLevelInfoNumSubpics: 2 # number of subpictures - needs to be equal to NumSubpics +SEISubpicLevelInfoMaxSublayers: 7 # number of sublayers - needs to be equal to vps_max_sublayers_minus1 + 1 +SEISubpicLevelInfoSublayerInfoPresentFlag: 0 # 0: all sublayers use the same level information, 1: each sublayer shall specify its own level information + +SEISubpicLevelInfoRefLevels: 4.1 # list of reference level indices + # when sli_sublayer_info_present_flag = 0, the number of input elements shall be equal to numReflevels (iterate over levels) + # when sli_sublayer_info_present_flag = 1, the number of input elements shall be equal to numReflevels * maxSublayers (iterates over levels and sublayers (levels first)). For example, let Amn denotes the reference level indices for the m-th sublayer and and n-th reference level, then the first N elements (A00...A0n-1) denotes the refLevelIdcs for N levels in the 0-th sublayer, and the following N elements (A10...A1n-1) denotes the refLevelIdcs for N levels in the 1st sublayer, and so on, untill all MxN elements specified + +SEISubpicLevelInfoRefLevelFractions: 40 30 # list of reference level fractions + # when sli_sublayer_info_present_flag = 0, the number of input elements shall be equal to numSubpics * numReflevels (iterate over subpictures and levels (subpictures first)) + # when sli_sublayer_info_present_flag = 1, the number of elements shall be equal to numSubpics * numReflevels * maxSublayers (iterates over subpictures and levels and sublayers (subpictures first, followed by levels)). For example, let Bmnk denotes the reference level fractions for the m-th sublayer and n-th reference level and k-th subpicture, then the first K elements (B000...B00k-1) denotes the refLevelFractions for K subpictures in the 0-th levels and 0-th sublayer, and followed by K elements (B010...B0n-1k-1) denotes the refLevelFractions for K subpictures in the 1st level and 0-th sublayer, and so on, untill all M*N*K elements specified + + + diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp index 0dc3dbd666ac21cae3ee019e2f6b4f90fb8c88f7..325faee9a4542763912352b2a6e3992d0d88e9f4 100644 --- a/source/App/EncoderApp/EncAppCfg.cpp +++ b/source/App/EncoderApp/EncAppCfg.cpp @@ -661,7 +661,11 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) SMultiValueInput<uint32_t> cfg_subPicId(0, std::numeric_limits<uint16_t>::max(), 0, MAX_NUM_SUB_PICS); SMultiValueInput<int> cfg_sliFractions(0, 100, 0, std::numeric_limits<int>::max()); +#if JVET_S0176_SLI_SEI + SMultiValueInput<Level::Name> cfg_sliRefLevels(Level::NONE, Level::LEVEL15_5, 0, 8 * MAX_VPS_SUBLAYERS); +#else SMultiValueInput<Level::Name> cfg_sliRefLevels(Level::NONE, Level::LEVEL15_5, 0, 8); +#endif int warnUnknowParameter = 0; @@ -1689,19 +1693,33 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) { CHECK (m_numSubPics != m_cfgSubpictureLevelInfoSEI.m_numSubpictures, "NumSubPics must be equal to SEISubpicLevelInfoNumSubpics" ); #if JVET_S0176_SLI_SEI - CHECK (m_cfgSubpictureLevelInfoSEI.m_sliMaxSublayers > m_maxSublayers, "SEISubpicLevelInfoMaxSublayers must be no greater than vps_max_sublayers"); -#endif + CHECK (m_cfgSubpictureLevelInfoSEI.m_sliMaxSublayers != m_maxSublayers, "SEISubpicLevelInfoMaxSublayers must be equal to vps_max_sublayers"); + if (m_cfgSubpictureLevelInfoSEI.m_sliSublayerInfoPresentFlag) + { + CHECK(cfg_sliRefLevels.values.size() < m_maxSublayers, "when sliSublayerInfoPresentFlag = 1, the number of reference levels must be greater than or equal to sublayers"); + } if (m_cfgSubpictureLevelInfoSEI.m_explicitFraction) { m_cfgSubpictureLevelInfoSEI.m_fractions = cfg_sliFractions.values; m_cfgSubpictureLevelInfoSEI.m_refLevels = cfg_sliRefLevels.values; -#if JVET_S0176_SLI_SEI - CHECK (cfg_sliRefLevels.values.size() * m_cfgSubpictureLevelInfoSEI.m_numSubpictures * m_cfgSubpictureLevelInfoSEI.m_sliMaxSublayers != cfg_sliFractions.values.size(), - "Number of subpicture level fractions must be equal to the numer of subpictures times the number of reference levels times the number of sublayers"); + if (m_cfgSubpictureLevelInfoSEI.m_sliSublayerInfoPresentFlag) + { + CHECK((int)cfg_sliRefLevels.values.size() / m_maxSublayers * m_cfgSubpictureLevelInfoSEI.m_numSubpictures * m_cfgSubpictureLevelInfoSEI.m_sliMaxSublayers != cfg_sliFractions.values.size(), + "when sliSublayerInfoPresentFlag = 1, the number of subpicture level fractions must be equal to the numer of subpictures times the number of reference levels times the number of sublayers"); + } + else + { + CHECK((int)cfg_sliRefLevels.values.size() * m_cfgSubpictureLevelInfoSEI.m_numSubpictures != cfg_sliFractions.values.size(), "when sliSublayerInfoPresentFlag = 0, the number of subpicture level fractions must be equal to the numer of subpictures times the number of reference levels"); + } + } #else - CHECK (cfg_sliRefLevels.values.size() * m_cfgSubpictureLevelInfoSEI.m_numSubpictures != cfg_sliFractions.values.size(), "Number of subpicture level fractions must be equal to the numer of subpictures times the number of reference levels."); -#endif + if (m_cfgSubpictureLevelInfoSEI.m_explicitFraction) + { + m_cfgSubpictureLevelInfoSEI.m_fractions = cfg_sliFractions.values; + m_cfgSubpictureLevelInfoSEI.m_refLevels = cfg_sliRefLevels.values; + CHECK (cfg_sliRefLevels.values.size() * m_cfgSubpictureLevelInfoSEI.m_numSubpictures != cfg_sliFractions.values.size(), "when sliSublayerInfoPresentFlag = 0, the number of subpicture level fractions must be equal to the numer of subpictures times the number of reference levels."); } +#endif } if (m_costMode != COST_LOSSLESS_CODING && m_mixedLossyLossless) diff --git a/source/Lib/DecoderLib/SEIread.cpp b/source/Lib/DecoderLib/SEIread.cpp index 432e939597ed9f89a9a87fee332afe1170371395..cc693ed88d98e6cb5d72ea548a828003dee1ee78 100644 --- a/source/Lib/DecoderLib/SEIread.cpp +++ b/source/Lib/DecoderLib/SEIread.cpp @@ -1507,9 +1507,14 @@ void SEIReader::xParseSEISubpictureLevelInfo(SEISubpicureLevelInfo& sei, uint32_ sei.m_refLevelIdc.resize(sei.m_numRefLevels); #if JVET_S0176_SLI_SEI + // sei parameters initialization for (int i = 0; i < sei.m_numRefLevels; i++) { - sei.m_refLevelIdc[i].resize(sei.m_sliSublayerInfoPresentFlag ? sei.m_sliMaxSublayers : 1); + sei.m_refLevelIdc[i].resize(sei.m_sliMaxSublayers); + for (int k = 0; k < sei.m_sliMaxSublayers; k++) + { + sei.m_refLevelIdc[i][k] = Level::LEVEL15_5; + } } if (sei.m_explicitFractionPresentFlag) { @@ -1519,11 +1524,16 @@ void SEIReader::xParseSEISubpictureLevelInfo(SEISubpicureLevelInfo& sei, uint32_ sei.m_refLevelFraction[i].resize(sei.m_numSubpics); for (int j = 0; j < sei.m_numSubpics; j++) { - sei.m_refLevelFraction[i][j].resize(sei.m_sliSublayerInfoPresentFlag ? sei.m_sliMaxSublayers : 1); + sei.m_refLevelFraction[i][j].resize(sei.m_sliMaxSublayers); + for (int k = 0; k < sei.m_sliMaxSublayers; k++) + { + sei.m_refLevelFraction[i][j][k] = 0; + } } } } + // parsing for (int k = sei.m_sliSublayerInfoPresentFlag ? 0 : sei.m_sliMaxSublayers - 1; k < sei.m_sliMaxSublayers; k++) { for (int i = 0; i < sei.m_numRefLevels; i++) @@ -1539,6 +1549,25 @@ void SEIReader::xParseSEISubpictureLevelInfo(SEISubpicureLevelInfo& sei, uint32_ } } } + + // update the inference of m_refLevelIdc[][] and m_refLevelFraction[][][] + if (!sei.m_sliSublayerInfoPresentFlag) + { + for (int k = sei.m_sliMaxSublayers - 2; k >= 0; k--) + { + for (int i = 0; i < sei.m_numRefLevels; i++) + { + sei.m_refLevelIdc[i][k] = sei.m_refLevelIdc[i][sei.m_sliMaxSublayers - 1]; + if (sei.m_explicitFractionPresentFlag) + { + for (int j = 0; j < sei.m_numSubpics; j++) + { + sei.m_refLevelFraction[i][j][k] = sei.m_refLevelFraction[i][j][sei.m_sliMaxSublayers - 1]; + } + } + } + } + } #else if (sei.m_explicitFractionPresentFlag) { diff --git a/source/Lib/EncoderLib/SEIEncoder.cpp b/source/Lib/EncoderLib/SEIEncoder.cpp index 02601a18f2f379727506dd917429578dc218fbd4..c147b69311bee5df4794cb5f547770a40356414a 100644 --- a/source/Lib/EncoderLib/SEIEncoder.cpp +++ b/source/Lib/EncoderLib/SEIEncoder.cpp @@ -647,53 +647,83 @@ void SEIEncoder::initSEISubpictureLevelInfo(SEISubpicureLevelInfo *sei, const SP { const EncCfgParam::CfgSEISubpictureLevel &cfgSubPicLevel = m_pcCfg->getSubpicureLevelInfoSEICfg(); - sei->m_numRefLevels = (int) cfgSubPicLevel.m_refLevels.size(); #if JVET_S0176_SLI_SEI sei->m_sliSublayerInfoPresentFlag = cfgSubPicLevel.m_sliSublayerInfoPresentFlag; sei->m_sliMaxSublayers = cfgSubPicLevel.m_sliMaxSublayers; + sei->m_numRefLevels = cfgSubPicLevel.m_sliSublayerInfoPresentFlag ? (int)cfgSubPicLevel.m_refLevels.size() / cfgSubPicLevel.m_sliMaxSublayers : (int)cfgSubPicLevel.m_refLevels.size(); + sei->m_numSubpics = cfgSubPicLevel.m_numSubpictures; + sei->m_explicitFractionPresentFlag = cfgSubPicLevel.m_explicitFraction; + + // sei parameters initialization sei->m_refLevelIdc.resize(sei->m_numRefLevels); for (int level = 0; level < sei->m_numRefLevels; level++) { - sei->m_refLevelIdc[level].resize(sei->m_sliSublayerInfoPresentFlag ? sei->m_sliMaxSublayers : 1); - } - - for (int k = sei->m_sliSublayerInfoPresentFlag ? 0 : sei->m_sliMaxSublayers - 1, cnt = 0; k < sei->m_sliMaxSublayers; k++) - { - for (int level = 0; level < sei->m_numRefLevels; level++) + sei->m_refLevelIdc[level].resize(sei->m_sliMaxSublayers); + for (int sublayer = 0; sublayer < sei->m_sliMaxSublayers; sublayer++) { - sei->m_refLevelIdc[level][k] = cfgSubPicLevel.m_refLevels[cnt++]; + sei->m_refLevelIdc[level][sublayer] = Level::LEVEL15_5; } } -#else - sei->m_refLevelIdc = cfgSubPicLevel.m_refLevels; -#endif - sei->m_explicitFractionPresentFlag = cfgSubPicLevel.m_explicitFraction; - if (cfgSubPicLevel.m_explicitFraction) + if (sei->m_explicitFractionPresentFlag) { - CHECK (sps->getNumSubPics() != cfgSubPicLevel.m_numSubpictures, "Number of subpictures must be equal in SPS and subpicture level information SEI" ); - sei->m_numSubpics = cfgSubPicLevel.m_numSubpictures; sei->m_refLevelFraction.resize(sei->m_numRefLevels); -#if JVET_S0176_SLI_SEI for (int level = 0; level < sei->m_numRefLevels; level++) { sei->m_refLevelFraction[level].resize(sei->m_numSubpics); for (int subpic = 0; subpic < sei->m_numSubpics; subpic++) { - sei->m_refLevelFraction[level][subpic].resize(sei->m_sliSublayerInfoPresentFlag ? sei->m_sliMaxSublayers : 1); + sei->m_refLevelFraction[level][subpic].resize(sei->m_sliMaxSublayers); + for (int sublayer = 0; sublayer < sei->m_sliMaxSublayers; sublayer++) + { + sei->m_refLevelFraction[level][subpic][sublayer] = 0; + } + } + } + } + + // set sei parameters according to the configured values + for (int sublayer = sei->m_sliSublayerInfoPresentFlag ? 0 : sei->m_sliMaxSublayers - 1, cnta = 0, cntb = 0; sublayer < sei->m_sliMaxSublayers; sublayer++) + { + for (int level = 0; level < sei->m_numRefLevels; level++) + { + sei->m_refLevelIdc[level][sublayer] = cfgSubPicLevel.m_refLevels[cnta++]; + if (sei->m_explicitFractionPresentFlag) + { + for (int subpic = 0; subpic < sei->m_numSubpics; subpic++) + { + sei->m_refLevelFraction[level][subpic][sublayer] = cfgSubPicLevel.m_fractions[cntb++]; + } } } + } - for (int k = sei->m_sliSublayerInfoPresentFlag ? 0 : sei->m_sliMaxSublayers - 1, cnt = 0; k < sei->m_sliMaxSublayers; k++) + // update the inference of m_refLevelIdc[][] and m_refLevelFraction[][][] + if (!sei->m_sliSublayerInfoPresentFlag) + { + for (int sublayer = sei->m_sliMaxSublayers - 2; sublayer >= 0; sublayer--) { for (int level = 0; level < sei->m_numRefLevels; level++) { - for (int subpic = 0; subpic < sei->m_numSubpics; subpic++) + sei->m_refLevelIdc[level][sublayer] = sei->m_refLevelIdc[level][sei->m_sliMaxSublayers - 1]; + if (sei->m_explicitFractionPresentFlag) { - sei->m_refLevelFraction[level][subpic][k] = cfgSubPicLevel.m_fractions[cnt++]; + for (int subpic = 0; subpic < sei->m_numSubpics; subpic++) + { + sei->m_refLevelFraction[level][subpic][sublayer] = sei->m_refLevelFraction[level][subpic][sei->m_sliMaxSublayers - 1]; + } } } } + } #else + sei->m_numRefLevels = (int)cfgSubPicLevel.m_refLevels.size(); + sei->m_refLevelIdc = cfgSubPicLevel.m_refLevels; + sei->m_explicitFractionPresentFlag = cfgSubPicLevel.m_explicitFraction; + if (cfgSubPicLevel.m_explicitFraction) + { + CHECK(sps->getNumSubPics() != cfgSubPicLevel.m_numSubpictures, "Number of subpictures must be equal in SPS and subpicture level information SEI"); + sei->m_numSubpics = cfgSubPicLevel.m_numSubpictures; + sei->m_refLevelFraction.resize(sei->m_numRefLevels); for (int level=0, cnt=0; level < sei->m_numRefLevels; level++) { sei->m_refLevelFraction[level].resize(sei->m_numSubpics); @@ -702,8 +732,8 @@ void SEIEncoder::initSEISubpictureLevelInfo(SEISubpicureLevelInfo *sei, const SP sei->m_refLevelFraction[level][subpic] = cfgSubPicLevel.m_fractions[cnt++]; } } -#endif } +#endif }