From a3cec3dfb98f9a13cd46e173b3cba11056ed18c4 Mon Sep 17 00:00:00 2001 From: Vadim Seregin <vseregin@qti.qualcomm.com> Date: Sun, 20 Oct 2019 12:22:49 -0700 Subject: [PATCH] VPS, APS, AUD --- source/App/EncoderApp/EncApp.cpp | 2 + .../Lib/EncoderLib/EncAdaptiveLoopFilter.cpp | 27 +++++++++++++ source/Lib/EncoderLib/EncAdaptiveLoopFilter.h | 4 ++ source/Lib/EncoderLib/EncGOP.cpp | 40 ++++++++++++++++--- source/Lib/EncoderLib/EncGOP.h | 4 -- 5 files changed, 67 insertions(+), 10 deletions(-) diff --git a/source/App/EncoderApp/EncApp.cpp b/source/App/EncoderApp/EncApp.cpp index 053b6590d..9bdcdff35 100644 --- a/source/App/EncoderApp/EncApp.cpp +++ b/source/App/EncoderApp/EncApp.cpp @@ -754,6 +754,8 @@ void EncApp::createLib( const int layerId ) void EncApp::destroyLib() { + printf( "\nLayerId %2d", m_cEncLib.getLayerId() ); + m_cEncLib.printSummary( m_isField ); // delete used buffers in encoder class diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp index 35aa25c76..19304df2b 100644 --- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp +++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp @@ -42,6 +42,10 @@ #define AlfCtx(c) SubCtx( Ctx::Alf, c) std::vector<double> EncAdaptiveLoopFilter::m_lumaLevelToWeightPLUT; +#if JVET_N0278_FIXES +int EncAdaptiveLoopFilter::m_apsIdStart = ALF_CTB_MAX_NUM_APS; +#endif + void AlfCovariance::getClipMax(const AlfFilterShape& alfShape, int *clip_max) const { for( int k = 0; k < numCoeff-1; ++k ) @@ -402,7 +406,9 @@ int AlfCovariance::gnsSolveByChol( TE LHS, double* rhs, double *x, int numEq ) c EncAdaptiveLoopFilter::EncAdaptiveLoopFilter() : m_CABACEstimator( nullptr ) +#if !JVET_N0278_FIXES , m_apsIdStart( ALF_CTB_MAX_NUM_APS ) +#endif { for( int i = 0; i < MAX_NUM_COMPONENT; i++ ) { @@ -640,10 +646,18 @@ void EncAdaptiveLoopFilter::ALFProcess(CodingStructure& cs, const double *lambda #endif ) { +#if JVET_N0278_FIXES + int layerIdx = cs.slice->getPic()->layerId; //VS: layerId should be converted to layerIdx + + // IRAP AU is assumed + if( !layerIdx && ( cs.slice->getPendingRasInit() || cs.slice->isIDRorBLA() ) ) +#else if (cs.slice->getPendingRasInit() || cs.slice->isIDRorBLA()) +#endif { memset(cs.slice->getAlfAPSs(), 0, sizeof(*cs.slice->getAlfAPSs())*ALF_CTB_MAX_NUM_APS); m_apsIdStart = ALF_CTB_MAX_NUM_APS; + m_apsMap->clear(); for (int i = 0; i < ALF_CTB_MAX_NUM_APS; i++) { @@ -2365,7 +2379,12 @@ std::vector<int> EncAdaptiveLoopFilter::getAvaiApsIdsLuma(CodingStructure& cs, i while (apsIdChecked < ALF_CTB_MAX_NUM_APS && !cs.slice->isIntra() && result.size() < ALF_CTB_MAX_NUM_APS && !cs.slice->getPendingRasInit() && !cs.slice->isIDRorBLA()) { APS* curAPS = cs.slice->getAlfAPSs()[curApsId]; + +#if JVET_N0278_FIXES + if( curAPS && curAPS->getLayerId() == cs.slice->getPic()->layerId && curAPS->getTemporalId() <= cs.slice->getTLayer() && curAPS->getAlfAPSParam().newFilterFlag[CHANNEL_TYPE_LUMA] ) +#else if (curAPS && curAPS->getTemporalId() <= cs.slice->getTLayer() && curAPS->getAlfAPSParam().newFilterFlag[CHANNEL_TYPE_LUMA]) +#endif { result.push_back(curApsId); } @@ -2720,6 +2739,14 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfParam& alfPar continue; } APS* curAPS = m_apsMap->getPS((curApsId << NUM_APS_TYPE_LEN) + ALF_APS); + +#if JVET_N0278_FIXES + if( curAPS && curAPS->getLayerId() != cs.slice->getPic()->layerId ) + { + continue; + } +#endif + double curCost = m_lambda[CHANNEL_TYPE_CHROMA] * 3; if (curApsId == newApsIdChroma) { diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h index 4573840ba..af0fb9edb 100644 --- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h +++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h @@ -246,7 +246,11 @@ private: int** m_diffFilterCoeff; short m_filterIndices[MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_CLASSES]; unsigned m_bitsNewFilter[MAX_NUM_CHANNEL_TYPE]; +#if JVET_N0278_FIXES + static int m_apsIdStart; +#else int m_apsIdStart; +#endif double *m_ctbDistortionFixedFilter; double *m_ctbDistortionUnfilter[MAX_NUM_COMPONENT]; std::vector<short> m_alfCtbFilterSetIndexTmp; diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp index a6c52be92..604274dfa 100644 --- a/source/Lib/EncoderLib/EncGOP.cpp +++ b/source/Lib/EncoderLib/EncGOP.cpp @@ -80,10 +80,6 @@ int getLSB(int poc, int maxLSB) } } -#if JVET_N0278_FIXES -bool EncGOP::m_bSeqFirst = true; -#endif - EncGOP::EncGOP() { m_iLastIDR = 0; @@ -98,9 +94,7 @@ EncGOP::EncGOP() m_pcSliceEncoder = NULL; m_pcListPic = NULL; m_HLSWriter = NULL; -#if !JVET_N0278_FIXES m_bSeqFirst = true; -#endif m_bRefreshPending = 0; m_pocCRA = 0; @@ -367,6 +361,9 @@ int EncGOP::xWriteAPS( AccessUnit &accessUnit, APS *aps, const int layerId ) m_HLSWriter->setBitstream(&nalu.m_Bitstream); nalu.m_nuhLayerId = layerId; nalu.m_temporalId = aps->getTemporalId(); +#if JVET_N0278_FIXES + aps->setLayerId( layerId ); +#endif CHECK( nalu.m_temporalId < accessUnit.temporalId, "TemporalId shall be greater than or equal to the TemporalId of the layer access unit containing the NAL unit" ); m_HLSWriter->codeAPS(aps); accessUnit.push_back(new NALUnitEBSP(nalu)); @@ -1849,7 +1846,11 @@ void EncGOP::xPicInitLMCS(Picture *pic, Slice *slice) slice->setLmcsChromaResidualScaleFlag(m_pcReshaper->getSliceReshaperInfo().getSliceReshapeChromaAdj() == 1); if (m_pcReshaper->getSliceReshaperInfo().getSliceReshapeModelPresentFlag()) { +#if JVET_N0278_FIXES + int apsId = std::min<int>( 3, m_pcEncLib->getLayerId() ); //VS: layerId should be converted to laeyrIdx +#else int apsId = 0; +#endif slice->setLmcsAPSId(apsId); APS* lmcsAPS = slice->getLmcsAPS(); if (lmcsAPS == nullptr) @@ -1877,7 +1878,11 @@ void EncGOP::xPicInitLMCS(Picture *pic, Slice *slice) if (slice->getLmcsEnabledFlag()) { +#if JVET_N0278_FIXES + int apsId = std::min<int>( 3, m_pcEncLib->getLayerId() ); //VS: layerId should be converted to laeyrIdx +#else int apsId = 0; +#endif slice->setLmcsAPSId(apsId); } } @@ -2625,7 +2630,12 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, if( pcSlice->getSPS()->getScalingListFlag() && m_pcCfg->getUseScalingListId() == SCALING_LIST_FILE_READ ) { pcSlice->setscalingListPresentFlag( true ); + +#if JVET_N0278_FIXES + int apsId = std::min<int>( 7, m_pcEncLib->getLayerId() ); //VS: layerId should be converted to laeyrIdx +#else int apsId = 0; +#endif pcSlice->setscalingListAPSId( apsId ); ParameterSetMap<APS> *apsMap = m_pcEncLib->getApsMap(); @@ -2692,7 +2702,13 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, if (pcSlice->getSPS()->getUseReshaper() && m_pcReshaper->getSliceReshaperInfo().getUseSliceReshaper()) { pcSlice->setLmcsEnabledFlag(true); + +#if JVET_N0278_FIXES + int apsId = std::min<int>( 3, m_pcEncLib->getLayerId() ); //VS: layerId should be converted to laeyrIdx +#else int apsId = 0; +#endif + pcSlice->setLmcsAPSId(apsId); for (int s = 0; s < uiNumSliceSegments; s++) { @@ -2876,7 +2892,14 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, /////////////////////////////////////////////////////////////////////////////////////////////////// File writing // write various parameter sets +#if JVET_N0278_FIXES + int layerIdx = m_pcEncLib->getLayerId(); //VS: convert layerId to layerIdx after VPS is implemented + + // it is assumed that layerIdx equal to 0 is always present + bool writePS = !layerIdx && ( m_bSeqFirst || ( m_pcCfg->getReWriteParamSets() && ( pcSlice->isIRAP() ) ) ); +#else bool writePS = m_bSeqFirst || (m_pcCfg->getReWriteParamSets() && (pcSlice->isIRAP())); +#endif if (writePS) { m_pcEncLib->setParamSetChanged(pcSlice->getSPS()->getSPSId(), pcSlice->getPPS()->getPPSId()); @@ -2892,7 +2915,12 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, m_bSeqFirst = false; } +#if JVET_N0278_FIXES + // it is assumed that layerIdx equal to 0 is always present + if( m_pcCfg->getAccessUnitDelimiter() && !layerIdx ) +#else if (m_pcCfg->getAccessUnitDelimiter()) +#endif { xWriteAccessUnitDelimiter(accessUnit, pcSlice); } diff --git a/source/Lib/EncoderLib/EncGOP.h b/source/Lib/EncoderLib/EncGOP.h index e2ef2b536..d234c7ae1 100644 --- a/source/Lib/EncoderLib/EncGOP.h +++ b/source/Lib/EncoderLib/EncGOP.h @@ -154,11 +154,7 @@ private: EncReshape* m_pcReshaper; RateCtrl* m_pcRateCtrl; // indicate sequence first -#if JVET_N0278_FIXES - static bool m_bSeqFirst; -#else bool m_bSeqFirst; -#endif EncHRD* m_HRD; -- GitLab