From 01ce544c58db97886d8c89045b23fd605d5a8c8c Mon Sep 17 00:00:00 2001 From: Nan Hu <nanh@qti.qualcomm.com> Date: Fri, 2 Aug 2019 13:02:57 -0700 Subject: [PATCH] Reducing number of ALF APSs from 32 to 8 --- source/Lib/CommonLib/AdaptiveLoopFilter.h | 5 ++ source/Lib/CommonLib/CodingStructure.h | 4 ++ source/Lib/CommonLib/CommonDef.h | 4 ++ source/Lib/CommonLib/Picture.cpp | 4 ++ source/Lib/CommonLib/Slice.h | 8 +++ source/Lib/CommonLib/TypeDef.h | 1 + source/Lib/DecoderLib/DecLib.cpp | 8 +++ source/Lib/DecoderLib/VLCReader.cpp | 20 ++++++ .../Lib/EncoderLib/EncAdaptiveLoopFilter.cpp | 72 ++++++++++++++++++- source/Lib/EncoderLib/EncGOP.cpp | 4 ++ source/Lib/EncoderLib/EncLib.h | 4 ++ source/Lib/EncoderLib/VLCWriter.cpp | 20 ++++++ 12 files changed, 153 insertions(+), 1 deletion(-) diff --git a/source/Lib/CommonLib/AdaptiveLoopFilter.h b/source/Lib/CommonLib/AdaptiveLoopFilter.h index 42be89b58..87e74a220 100644 --- a/source/Lib/CommonLib/AdaptiveLoopFilter.h +++ b/source/Lib/CommonLib/AdaptiveLoopFilter.h @@ -118,9 +118,14 @@ protected: #if JVET_O0090_ALF_CHROMA_FILTER_ALTERNATIVES_CTB short m_coeffApsLuma[ALF_CTB_MAX_NUM_APS][MAX_NUM_ALF_LUMA_COEFF * MAX_NUM_ALF_CLASSES]; short m_clippApsLuma[ALF_CTB_MAX_NUM_APS][MAX_NUM_ALF_LUMA_COEFF * MAX_NUM_ALF_CLASSES]; +#else +#if JVET_O_MAX_NUM_ALF_APS_8 + short m_coeffApsLuma[ALF_CTB_MAX_NUM_APS][MAX_NUM_ALF_LUMA_COEFF * MAX_NUM_ALF_CLASSES]; + short m_clippApsLuma[ALF_CTB_MAX_NUM_APS][MAX_NUM_ALF_LUMA_COEFF * MAX_NUM_ALF_CLASSES]; #else short m_coeffApsLuma[6][MAX_NUM_ALF_LUMA_COEFF * MAX_NUM_ALF_CLASSES]; short m_clippApsLuma[6][MAX_NUM_ALF_LUMA_COEFF * MAX_NUM_ALF_CLASSES]; +#endif #endif short m_clipDefault[MAX_NUM_ALF_CLASSES * MAX_NUM_ALF_LUMA_COEFF]; bool m_created = false; diff --git a/source/Lib/CommonLib/CodingStructure.h b/source/Lib/CommonLib/CodingStructure.h index 5fb7b23a5..8589a75a7 100644 --- a/source/Lib/CommonLib/CodingStructure.h +++ b/source/Lib/CommonLib/CodingStructure.h @@ -97,7 +97,11 @@ public: bool isLossless; const SPS *sps; const PPS *pps; +#if JVET_O_MAX_NUM_ALF_APS_8 + APS* alfApss[ALF_CTB_MAX_NUM_APS]; +#else APS* alfApss[MAX_NUM_APS]; +#endif APS * lmcsAps; const VPS *vps; const PreCalcValues* pcv; diff --git a/source/Lib/CommonLib/CommonDef.h b/source/Lib/CommonLib/CommonDef.h index 70c3a835d..14a8106b0 100644 --- a/source/Lib/CommonLib/CommonDef.h +++ b/source/Lib/CommonLib/CommonDef.h @@ -187,7 +187,11 @@ static const int MAX_NUM_ALF_COEFF = MAX_ALF_FILTE static const int MAX_ALF_PADDING_SIZE = 4; static const int ALF_FIXED_FILTER_NUM = 64; +#if JVET_O_MAX_NUM_ALF_APS_8 +static const int ALF_CTB_MAX_NUM_APS = 8; +#else static const int ALF_CTB_MAX_NUM_APS = 6; +#endif static const int NUM_FIXED_FILTER_SETS = 16; static const int NUM_TOTAL_FILTER_SETS = NUM_FIXED_FILTER_SETS + ALF_CTB_MAX_NUM_APS; diff --git a/source/Lib/CommonLib/Picture.cpp b/source/Lib/CommonLib/Picture.cpp index b3e3d9f9b..a32727d25 100644 --- a/source/Lib/CommonLib/Picture.cpp +++ b/source/Lib/CommonLib/Picture.cpp @@ -961,7 +961,11 @@ Slice *Picture::swapSliceObject(Slice * p, uint32_t i) slices[i] = p; pTmp->setSPS(0); pTmp->setPPS(0); +#if JVET_O_MAX_NUM_ALF_APS_8 + memset(pTmp->getAlfAPSs(), 0, sizeof(*pTmp->getAlfAPSs())*ALF_CTB_MAX_NUM_APS); +#else memset(pTmp->getAlfAPSs(), 0, sizeof(*pTmp->getAlfAPSs())*MAX_NUM_APS); +#endif pTmp->setLmcsAPS(0); return pTmp; diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index 33163d9d6..96deeb4fd 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -1570,7 +1570,11 @@ private: uint32_t m_uiMaxTTSizeIChroma; uint32_t m_uiMaxBTSize; +#if JVET_O_MAX_NUM_ALF_APS_8 + APS* m_alfApss[ALF_CTB_MAX_NUM_APS]; +#else APS* m_alfApss[MAX_NUM_APS]; +#endif bool m_tileGroupAlfEnabledFlag[MAX_NUM_COMPONENT]; int m_tileGroupNumAps; std::vector<int> m_tileGroupLumaApsId; @@ -2074,7 +2078,11 @@ protected: ParameterSetMap<APS> m_apsMap; ParameterSetMap<DPS> m_dpsMap; +#if JVET_O_MAX_NUM_ALF_APS_8 + APS* m_apss[ALF_CTB_MAX_NUM_APS]; +#else APS* m_apss[MAX_NUM_APS]; +#endif int m_activeDPSId; // -1 for nothing active int m_activeSPSId; // -1 for nothing active diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 2e3d38e17..be724927b 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -50,6 +50,7 @@ #include <assert.h> #include <cassert> +#define JVET_O_MAX_NUM_ALF_APS_8 1 // JVET-O: number of ALF APSs is reduced to 8 #define JVET_O0070_PROF 1 // JVET-O0070 method 4-2.1a: Prediction refinement with optical flow for affine mode diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp index 58538bd8b..a8b680961 100644 --- a/source/Lib/DecoderLib/DecLib.cpp +++ b/source/Lib/DecoderLib/DecLib.cpp @@ -740,7 +740,11 @@ void DecLib::xActivateParameterSets() if (m_bFirstSliceInPicture) { APS** apss = m_parameterSetManager.getAPSs(); +#if JVET_O_MAX_NUM_ALF_APS_8 + memset(apss, 0, sizeof(*apss) * ALF_CTB_MAX_NUM_APS); +#else memset(apss, 0, sizeof(*apss) * MAX_NUM_APS); +#endif const PPS *pps = m_parameterSetManager.getPPS(m_apcSlicePilot->getPPSId()); // this is a temporary PPS object. Do not store this value CHECK(pps == 0, "No PPS present"); @@ -935,7 +939,11 @@ void DecLib::xActivateParameterSets() { EXIT("Error - a new PPS has been decoded while processing a picture"); } +#if JVET_O_MAX_NUM_ALF_APS_8 + for (int i = 0; i < ALF_CTB_MAX_NUM_APS; i++) +#else for (int i = 0; i < MAX_NUM_APS; i++) +#endif { APS* aps = m_parameterSetManager.getAPS(i, ALF_APS); if (aps && m_parameterSetManager.getAPSChangedFlag(i, ALF_APS)) diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index 2753ca37d..1c94829b5 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -1812,7 +1812,11 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, ParameterSetManager *para if (uiCode) { #if JVET_O0288_UNIFY_ALF_SLICE_TYPE_REMOVAL +#if JVET_O_MAX_NUM_ALF_APS_8 + READ_CODE(3, uiCode, "tile_group_num_APS"); +#else xReadTruncBinCode(uiCode, ALF_CTB_MAX_NUM_APS + 1); +#endif #else if (pcSlice->isIntra()) { @@ -1820,7 +1824,11 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, ParameterSetManager *para } else { +#if JVET_O_MAX_NUM_ALF_APS_8 + READ_CODE(3, uiCode, "tile_group_num_APS"); +#else xReadTruncBinCode(uiCode, ALF_CTB_MAX_NUM_APS + 1); +#endif } #endif int numAps = uiCode; @@ -1828,7 +1836,11 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, ParameterSetManager *para std::vector<int> apsId(numAps, -1); for (int i = 0; i < numAps; i++) { +#if JVET_O_MAX_NUM_ALF_APS_8 + READ_CODE(3, uiCode, "tile_group_aps_id"); +#else READ_CODE(5, uiCode, "tile_group_aps_id"); +#endif apsId[i] = uiCode; } @@ -1849,7 +1861,11 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, ParameterSetManager *para if (alfChromaIdc) { #if JVET_O0288_UNIFY_ALF_SLICE_TYPE_REMOVAL +#if JVET_O_MAX_NUM_ALF_APS_8 + READ_CODE(3, uiCode, "tile_group_aps_id_chroma"); +#else READ_CODE(5, uiCode, "tile_group_aps_id_chroma"); +#endif #else if (pcSlice->isIntra() && pcSlice->getTileGroupNumAps() == 1) { @@ -1857,7 +1873,11 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, ParameterSetManager *para } else { +#if JVET_O_MAX_NUM_ALF_APS_8 + READ_CODE(3, uiCode, "tile_group_aps_id_chroma"); +#else READ_CODE(5, uiCode, "tile_group_aps_id_chroma"); +#endif } #endif pcSlice->setTileGroupApsIdChroma(uiCode); diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp index 488b2d768..a3c85e561 100644 --- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp +++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp @@ -501,7 +501,11 @@ void EncAdaptiveLoopFilter::create( const EncCfg* encCfg, const int picWidth, co m_diffFilterCoeff[i] = new int[MAX_NUM_ALF_LUMA_COEFF]; } +#if JVET_O_MAX_NUM_ALF_APS_8 + m_apsIdStart = ALF_CTB_MAX_NUM_APS; +#else m_apsIdStart = (int)MAX_NUM_APS; +#endif m_ctbDistortionFixedFilter = new double[m_numCTUsInPic]; for (int comp = 0; comp < MAX_NUM_COMPONENT; comp++) { @@ -654,10 +658,19 @@ void EncAdaptiveLoopFilter::ALFProcess(CodingStructure& cs, const double *lambda { if (cs.slice->getPendingRasInit() || cs.slice->isIDRorBLA()) { +#if JVET_O_MAX_NUM_ALF_APS_8 + memset(cs.slice->getAlfAPSs(), 0, sizeof(*cs.slice->getAlfAPSs())*ALF_CTB_MAX_NUM_APS); + m_apsIdStart = ALF_CTB_MAX_NUM_APS; +#else memset(cs.slice->getAlfAPSs(), 0, sizeof(*cs.slice->getAlfAPSs())*MAX_NUM_APS); m_apsIdStart = (int)MAX_NUM_APS; +#endif m_apsMap->clear(); +#if JVET_O_MAX_NUM_ALF_APS_8 + for (int i = 0; i < ALF_CTB_MAX_NUM_APS; i++) +#else for (int i = 0; i < MAX_NUM_APS; i++) +#endif { APS* alfAPS = m_apsMap->getPS((i << NUM_APS_TYPE_LEN) + ALF_APS); m_apsMap->clearChangedFlag((i << NUM_APS_TYPE_LEN) + ALF_APS); @@ -2966,16 +2979,28 @@ void EncAdaptiveLoopFilter::setCtuEnableFlag( uint8_t** ctuFlags, ChannelType ch std::vector<int> EncAdaptiveLoopFilter::getAvaiApsIdsLuma(CodingStructure& cs, int &newApsId) { APS** apss = cs.slice->getAlfAPSs(); +#if JVET_O_MAX_NUM_ALF_APS_8 + for (int i = 0; i < ALF_CTB_MAX_NUM_APS; i++) +#else for (int i = 0; i < MAX_NUM_APS; i++) +#endif { apss[i] = m_apsMap->getPS((i << NUM_APS_TYPE_LEN) + ALF_APS); } std::vector<int> result; int apsIdChecked = 0, curApsId = m_apsIdStart; +#if JVET_O_MAX_NUM_ALF_APS_8 + if (curApsId < ALF_CTB_MAX_NUM_APS) +#else if (curApsId < int(MAX_NUM_APS)) +#endif { +#if JVET_O_MAX_NUM_ALF_APS_8 + while (apsIdChecked < ALF_CTB_MAX_NUM_APS && !cs.slice->isIntra() && result.size() < ALF_CTB_MAX_NUM_APS && !cs.slice->getPendingRasInit() && !cs.slice->isIDRorBLA()) +#else while (apsIdChecked < MAX_NUM_APS && !cs.slice->isIntra() && result.size() < (ALF_CTB_MAX_NUM_APS - 1) && !cs.slice->getPendingRasInit() && !cs.slice->isIDRorBLA()) +#endif { APS* curAPS = cs.slice->getAlfAPSs()[curApsId]; if (curAPS && curAPS->getTemporalId() <= cs.slice->getTLayer() && curAPS->getAlfAPSParam().newFilterFlag[CHANNEL_TYPE_LUMA]) @@ -2983,7 +3008,11 @@ std::vector<int> EncAdaptiveLoopFilter::getAvaiApsIdsLuma(CodingStructure& cs, i result.push_back(curApsId); } apsIdChecked++; +#if JVET_O_MAX_NUM_ALF_APS_8 + curApsId = (curApsId + 1) % ALF_CTB_MAX_NUM_APS; +#else curApsId = (curApsId + 1) % MAX_NUM_APS; +#endif } } cs.slice->setTileGroupNumAps((int)result.size()); @@ -2991,10 +3020,17 @@ std::vector<int> EncAdaptiveLoopFilter::getAvaiApsIdsLuma(CodingStructure& cs, i newApsId = m_apsIdStart - 1; if (newApsId < 0) { +#if JVET_O_MAX_NUM_ALF_APS_8 + newApsId = ALF_CTB_MAX_NUM_APS - 1; +#else newApsId = (int)MAX_NUM_APS - 1; +#endif } - +#if JVET_O_MAX_NUM_ALF_APS_8 + CHECK(newApsId >= ALF_CTB_MAX_NUM_APS, "Wrong APS index assignment in getAvaiApsIdsLuma"); +#else CHECK(newApsId >= (int)MAX_NUM_APS, "Wrong APS index assignment in getAvaiApsIdsLuma"); +#endif return result; } void EncAdaptiveLoopFilter::initDistortion() @@ -3062,6 +3098,12 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfParam& alfPar int numIter = useNewFilter ? 2 : 1; for (int numTemporalAps = 0; numTemporalAps <= apsIds.size(); numTemporalAps++) { +#if JVET_O_MAX_NUM_ALF_APS_8 + if (numTemporalAps + useNewFilter >= ALF_CTB_MAX_NUM_APS) + { + continue; + } +#endif cs.slice->setTileGroupNumAps(numTemporalAps + useNewFilter); int numFilterSet = NUM_FIXED_FILTER_SETS + numTemporalAps + useNewFilter; if (numTemporalAps == apsIds.size() && numTemporalAps > 0 && useNewFilter && newApsId == apsIds.back()) //last temporalAPS is occupied by new filter set and this temporal APS becomes unavailable @@ -3072,7 +3114,11 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfParam& alfPar { m_alfParamTemp = alfParamNewFilters; m_alfParamTemp.enabledFlag[CHANNEL_TYPE_LUMA] = true; +#if JVET_O_MAX_NUM_ALF_APS_8 + double curCost = 3 * m_lambda[CHANNEL_TYPE_LUMA]; +#else double curCost = getTBlength(numTemporalAps + useNewFilter, ALF_CTB_MAX_NUM_APS + 1) * m_lambda[CHANNEL_TYPE_LUMA]; +#endif if (iter > 0) //re-derive new filter-set { double dDistOrgNewFilter = 0; @@ -3232,9 +3278,17 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfParam& alfPar } } //for(ctbIdx) #if JVET_O0288_UNIFY_ALF_SLICE_TYPE_REMOVAL +#if JVET_O_MAX_NUM_ALF_APS_8 + int tmpBits = bitsNewFilter + 3 * (numFilterSet - NUM_FIXED_FILTER_SETS); +#else int tmpBits = bitsNewFilter + 5 * (numFilterSet - NUM_FIXED_FILTER_SETS) + getTBlength(numFilterSet - NUM_FIXED_FILTER_SETS, ALF_CTB_MAX_NUM_APS + 1); +#endif +#else +#if JVET_O_MAX_NUM_ALF_APS_8 + int tmpBits = bitsNewFilter + 3 * (numFilterSet - NUM_FIXED_FILTER_SETS) + (cs.slice->isIntra() ? 1 : 3); #else int tmpBits = bitsNewFilter + 5 * (numFilterSet - NUM_FIXED_FILTER_SETS) + (cs.slice->isIntra() ? 1 : getTBlength(numFilterSet - NUM_FIXED_FILTER_SETS, ALF_CTB_MAX_NUM_APS + 1)); +#endif #endif curCost += tmpBits * m_lambda[COMPONENT_Y]; if (curCost < costMin) @@ -3334,7 +3388,11 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfParam& alfPar curId--; if (curId < 0) { +#if JVET_O_MAX_NUM_ALF_APS_8 + curId = ALF_CTB_MAX_NUM_APS - 1; +#else curId = (int)MAX_NUM_APS - 1; +#endif } if (std::find(bestApsIds.begin(), bestApsIds.end(), curId) == bestApsIds.end()) { @@ -3342,7 +3400,11 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfParam& alfPar } } } +#if JVET_O_MAX_NUM_ALF_APS_8 + for (int curApsId = 0; curApsId < ALF_CTB_MAX_NUM_APS; curApsId++) +#else for (int curApsId = 0; curApsId < MAX_NUM_APS; curApsId++) +#endif { if ((cs.slice->getPendingRasInit() || cs.slice->isIDRorBLA() || cs.slice->isIntra()) && curApsId != newApsIdChroma) { @@ -3350,9 +3412,17 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfParam& alfPar } APS* curAPS = m_apsMap->getPS((curApsId << NUM_APS_TYPE_LEN) + ALF_APS); #if JVET_O0288_UNIFY_ALF_SLICE_TYPE_REMOVAL +#if JVET_O_MAX_NUM_ALF_APS_8 + double curCost = m_lambda[CHANNEL_TYPE_CHROMA] * 3; +#else double curCost = m_lambda[CHANNEL_TYPE_CHROMA] * 5; +#endif +#else +#if JVET_O_MAX_NUM_ALF_APS_8 + double curCost = (cs.slice->isIntra() && cs.slice->getTileGroupNumAps() == 1) ? 0 : (m_lambda[CHANNEL_TYPE_CHROMA] * 3); #else double curCost = (cs.slice->isIntra() && cs.slice->getTileGroupNumAps() == 1) ? 0 : (m_lambda[CHANNEL_TYPE_CHROMA] * 5); +#endif #endif if (curApsId == newApsIdChroma) { diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp index c348ae0e2..c6dcaa5c6 100644 --- a/source/Lib/EncoderLib/EncGOP.cpp +++ b/source/Lib/EncoderLib/EncGOP.cpp @@ -2494,7 +2494,11 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, if (pcSlice->getSPS()->getALFEnabledFlag() && pcSlice->getTileGroupAlfEnabledFlag(COMPONENT_Y)) { +#if JVET_O_MAX_NUM_ALF_APS_8 + for (int apsId = 0; apsId < ALF_CTB_MAX_NUM_APS; apsId++) +#else for (int apsId = 0; apsId < MAX_NUM_APS; apsId++) //HD: shouldn't this be looping over slice_alf_aps_id_luma[ i ]? By looping over MAX_NUM_APS, it is possible unused ALF APS is written. Please check! +#endif { ParameterSetMap<APS> *apsMap = m_pcEncLib->getApsMap(); diff --git a/source/Lib/EncoderLib/EncLib.h b/source/Lib/EncoderLib/EncLib.h index d1ea9637d..71bcf0d1b 100644 --- a/source/Lib/EncoderLib/EncLib.h +++ b/source/Lib/EncoderLib/EncLib.h @@ -138,7 +138,11 @@ private: CacheModel m_cacheModel; #endif +#if JVET_O_MAX_NUM_ALF_APS_8 + APS* m_apss[ALF_CTB_MAX_NUM_APS]; +#else APS* m_apss[MAX_NUM_APS]; +#endif APS* m_lmcsAPS; diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index d44afe57b..25c6ac426 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -1278,7 +1278,11 @@ void HLSWriter::codeSliceHeader ( Slice* pcSlice ) if (alfEnabled) { #if JVET_O0288_UNIFY_ALF_SLICE_TYPE_REMOVAL +#if JVET_O_MAX_NUM_ALF_APS_8 + WRITE_CODE(pcSlice->getTileGroupNumAps(), 3, "tile_group_num_aps"); +#else xWriteTruncBinCode(pcSlice->getTileGroupNumAps(), ALF_CTB_MAX_NUM_APS + 1); +#endif #else if (pcSlice->isIntra()) { @@ -1286,13 +1290,21 @@ void HLSWriter::codeSliceHeader ( Slice* pcSlice ) } else { +#if JVET_O_MAX_NUM_ALF_APS_8 + WRITE_CODE(pcSlice->getTileGroupNumAps(), 3, "tile_group_num_aps"); +#else xWriteTruncBinCode(pcSlice->getTileGroupNumAps(), ALF_CTB_MAX_NUM_APS + 1); +#endif } #endif const std::vector<int>& apsId = pcSlice->getTileGroupApsIdLuma(); for (int i = 0; i < pcSlice->getTileGroupNumAps(); i++) { +#if JVET_O_MAX_NUM_ALF_APS_8 + WRITE_CODE(apsId[i], 3, "tile_group_aps_id"); +#else WRITE_CODE(apsId[i], 5, "tile_group_aps_id"); +#endif } const int alfChromaIdc = pcSlice->getTileGroupAlfEnabledFlag(COMPONENT_Cb) + pcSlice->getTileGroupAlfEnabledFlag(COMPONENT_Cr) * 2 ; @@ -1307,7 +1319,11 @@ void HLSWriter::codeSliceHeader ( Slice* pcSlice ) if (alfChromaIdc) { #if JVET_O0288_UNIFY_ALF_SLICE_TYPE_REMOVAL +#if JVET_O_MAX_NUM_ALF_APS_8 + WRITE_CODE(pcSlice->getTileGroupApsIdChroma(), 3, "tile_group_aps_id_chroma"); +#else WRITE_CODE(pcSlice->getTileGroupApsIdChroma(), 5, "tile_group_aps_id_chroma"); +#endif #else if (pcSlice->isIntra()&& pcSlice->getTileGroupNumAps() == 1) { @@ -1315,7 +1331,11 @@ void HLSWriter::codeSliceHeader ( Slice* pcSlice ) } else { +#if JVET_O_MAX_NUM_ALF_APS_8 + WRITE_CODE(pcSlice->getTileGroupApsIdChroma(), 3, "tile_group_aps_id_chroma"); +#else WRITE_CODE(pcSlice->getTileGroupApsIdChroma(), 5, "tile_group_aps_id_chroma"); +#endif } #endif } -- GitLab