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