From 089318e285ac3c1fe328137c11ef342a1fb1748d Mon Sep 17 00:00:00 2001
From: Tobias Hinz <tobias.hinz@hhi.fraunhofer.de>
Date: Mon, 4 Feb 2019 09:18:37 +0100
Subject: [PATCH] JVET_M0427_INLOOP_RESHAPER fix

---
 source/Lib/EncoderLib/EncGOP.cpp | 142 ++++++++++++++++---------------
 1 file changed, 72 insertions(+), 70 deletions(-)

diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp
index e7c8ece3ca..f3201039b3 100644
--- a/source/Lib/EncoderLib/EncGOP.cpp
+++ b/source/Lib/EncoderLib/EncGOP.cpp
@@ -2208,101 +2208,103 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic,
       pcSlice->setSliceChromaQpDelta(COMPONENT_Cr, m_pcCfg->getChromaCrQpOffsetDualTree());
       m_pcSliceEncoder->setUpLambda(pcSlice, pcSlice->getLambdas()[0], pcSlice->getSliceQp());
     }
-    if( encPic )
-    // now compress (trial encode) the various slice segments (slices, and dependent slices)
-    {
-      DTRACE_UPDATE( g_trace_ctx, ( std::make_pair( "poc", pocCurr ) ) );
 #if JVET_M0427_INLOOP_RESHAPER
-      if (pcSlice->getSPS()->getUseReshaper())
-      {
-        m_pcReshaper->getReshapeCW()->rspTid = pcSlice->getTLayer()+(pcSlice->isIntra()?0:1);
-        m_pcReshaper->getReshapeCW()->rspSliceQP = pcSlice->getSliceQp();
+    if (pcSlice->getSPS()->getUseReshaper())
+    {
+      m_pcReshaper->getReshapeCW()->rspTid = pcSlice->getTLayer() + (pcSlice->isIntra() ? 0 : 1);
+      m_pcReshaper->getReshapeCW()->rspSliceQP = pcSlice->getSliceQp();
+
+      m_pcReshaper->setSrcReshaped(false);
+      m_pcReshaper->setRecReshaped(true);
 
-        m_pcReshaper->setSrcReshaped(false);
-        m_pcReshaper->setRecReshaped(true);
+      if (m_pcCfg->getReshapeSignalType() == RESHAPE_SIGNAL_PQ)
+      {
+        m_pcReshaper->preAnalyzerHDR(pcPic, pcSlice->getSliceType(), m_pcCfg->getReshapeCW(), m_pcCfg->getDualITree(), m_pcCfg->getIBCMode());
+      }
+      else if (m_pcCfg->getReshapeSignalType() == RESHAPE_SIGNAL_SDR)
+      {
+        m_pcReshaper->preAnalyzerSDR(pcPic, pcSlice->getSliceType(), m_pcCfg->getReshapeCW(), m_pcCfg->getDualITree(), m_pcCfg->getIBCMode());
+      }
+      else
+      {
+        THROW("Reshaper for signal other than PQ and SDR currently not defined!");
+      }
 
+      if (pcSlice->getSliceType() == I_SLICE || (pcSlice->getSliceType() == P_SLICE && m_pcCfg->getIBCMode()))
+      {
         if (m_pcCfg->getReshapeSignalType() == RESHAPE_SIGNAL_PQ)
         {
-          m_pcReshaper->preAnalyzerHDR(pcPic, pcSlice->getSliceType(), m_pcCfg->getReshapeCW(), m_pcCfg->getDualITree(), m_pcCfg->getIBCMode());
+          m_pcReshaper->initLUTfromdQPModel();
+          m_pcEncLib->getRdCost()->updateReshapeLumaLevelToWeightTableChromaMD(m_pcReshaper->getInvLUT());
         }
         else if (m_pcCfg->getReshapeSignalType() == RESHAPE_SIGNAL_SDR)
         {
-          m_pcReshaper->preAnalyzerSDR(pcPic, pcSlice->getSliceType(), m_pcCfg->getReshapeCW(), m_pcCfg->getDualITree(), m_pcCfg->getIBCMode());
+          if (m_pcReshaper->getReshapeFlag())
+          {
+            m_pcReshaper->constructReshaperSDR();
+            m_pcEncLib->getRdCost()->updateReshapeLumaLevelToWeightTable(m_pcReshaper->getSliceReshaperInfo(), m_pcReshaper->getWeightTable(), m_pcReshaper->getCWeight());
+          }
         }
         else
         {
-          THROW("Reshaper for signal other than PQ and SDR currently not defined!");
+          THROW("Reshaper for other signal currently not defined!");
         }
 
-        if (pcSlice->getSliceType() == I_SLICE || (pcSlice->getSliceType()==P_SLICE && m_pcCfg->getIBCMode()))
-        {
-          if (m_pcCfg->getReshapeSignalType() == RESHAPE_SIGNAL_PQ)
-          {
-            m_pcReshaper->initLUTfromdQPModel();
-            m_pcEncLib->getRdCost()->updateReshapeLumaLevelToWeightTableChromaMD(m_pcReshaper->getInvLUT());
-          }
-          else if (m_pcCfg->getReshapeSignalType() == RESHAPE_SIGNAL_SDR)
-          {
-            if (m_pcReshaper->getReshapeFlag())
-            {
-              m_pcReshaper->constructReshaperSDR();
-              m_pcEncLib->getRdCost()->updateReshapeLumaLevelToWeightTable(m_pcReshaper->getSliceReshaperInfo(), m_pcReshaper->getWeightTable(), m_pcReshaper->getCWeight());
-            }
-          }
-          else
-          {
-           THROW("Reshaper for other signal currently not defined!");
-          }
+        m_pcReshaper->setCTUFlag(false);
 
+        //reshape original signal
+        if (m_pcReshaper->getSliceReshaperInfo().getUseSliceReshaper())
+        {
+          pcPic->getOrigBuf(COMPONENT_Y).rspSignal(m_pcReshaper->getFwdLUT());
+          m_pcReshaper->setSrcReshaped(true);
+          m_pcReshaper->setRecReshaped(true);
+        }
+      }
+      else
+      {
+        if (!m_pcReshaper->getReshapeFlag())
+        {
           m_pcReshaper->setCTUFlag(false);
-          
-          //reshape original signal
-          if (m_pcReshaper->getSliceReshaperInfo().getUseSliceReshaper())
-          {
-            pcPic->getOrigBuf(COMPONENT_Y).rspSignal(m_pcReshaper->getFwdLUT());
-            m_pcReshaper->setSrcReshaped(true);
-            m_pcReshaper->setRecReshaped(true);
-          }
         }
         else
-        {
-          if (!m_pcReshaper->getReshapeFlag())
-          {
-            m_pcReshaper->setCTUFlag(false);
-          }
-          else
-            m_pcReshaper->setCTUFlag(true);
+          m_pcReshaper->setCTUFlag(true);
 
-          m_pcReshaper->getSliceReshaperInfo().setSliceReshapeModelPresentFlag(false);
+        m_pcReshaper->getSliceReshaperInfo().setSliceReshapeModelPresentFlag(false);
 
-          if (m_pcCfg->getReshapeSignalType() == RESHAPE_SIGNAL_PQ )
-          {
-            m_pcEncLib->getRdCost()->restoreReshapeLumaLevelToWeightTable();
-          }
-          else if (m_pcCfg->getReshapeSignalType() == RESHAPE_SIGNAL_SDR)
-          {
-            int modIP = pcPic->getPOC() - pcPic->getPOC() / m_pcCfg->getReshapeCW().rspFpsToIp * m_pcCfg->getReshapeCW().rspFpsToIp;
-            if (m_pcReshaper->getReshapeFlag() && m_pcCfg->getReshapeCW().rspIntraPeriod == -1 && modIP == 0)           // for LDB, update reshaping curve every second
-            {
-              m_pcReshaper->getSliceReshaperInfo().setSliceReshapeModelPresentFlag(true);
-              m_pcReshaper->constructReshaperSDR();
-              m_pcEncLib->getRdCost()->updateReshapeLumaLevelToWeightTable(m_pcReshaper->getSliceReshaperInfo(), m_pcReshaper->getWeightTable(), m_pcReshaper->getCWeight());
-            }
-          }
-          else
+        if (m_pcCfg->getReshapeSignalType() == RESHAPE_SIGNAL_PQ)
+        {
+          m_pcEncLib->getRdCost()->restoreReshapeLumaLevelToWeightTable();
+        }
+        else if (m_pcCfg->getReshapeSignalType() == RESHAPE_SIGNAL_SDR)
+        {
+          int modIP = pcPic->getPOC() - pcPic->getPOC() / m_pcCfg->getReshapeCW().rspFpsToIp * m_pcCfg->getReshapeCW().rspFpsToIp;
+          if (m_pcReshaper->getReshapeFlag() && m_pcCfg->getReshapeCW().rspIntraPeriod == -1 && modIP == 0)           // for LDB, update reshaping curve every second
           {
-            THROW("Reshaper for other signal currently not defined!");
+            m_pcReshaper->getSliceReshaperInfo().setSliceReshapeModelPresentFlag(true);
+            m_pcReshaper->constructReshaperSDR();
+            m_pcEncLib->getRdCost()->updateReshapeLumaLevelToWeightTable(m_pcReshaper->getSliceReshaperInfo(), m_pcReshaper->getWeightTable(), m_pcReshaper->getCWeight());
           }
         }
-
-        m_pcReshaper->copySliceReshaperInfo(pcSlice->getReshapeInfo(), m_pcReshaper->getSliceReshaperInfo());
-      }
-      else
-      {
-        m_pcReshaper->setCTUFlag(false);
+        else
+        {
+          THROW("Reshaper for other signal currently not defined!");
+        }
       }
+
+      m_pcReshaper->copySliceReshaperInfo(pcSlice->getReshapeInfo(), m_pcReshaper->getSliceReshaperInfo());
+    }
+    else
+    {
+      m_pcReshaper->setCTUFlag(false);
+    }
 #endif
 
+
+    if( encPic )
+    // now compress (trial encode) the various slice segments (slices, and dependent slices)
+    {
+      DTRACE_UPDATE( g_trace_ctx, ( std::make_pair( "poc", pocCurr ) ) );
+
       pcSlice->setSliceCurStartCtuTsAddr( 0 );
 #if HEVC_DEPENDENT_SLICES
       pcSlice->setSliceSegmentCurStartCtuTsAddr( 0 );
-- 
GitLab