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