From 8d681dd1eb389c4c761b7519331793781575c739 Mon Sep 17 00:00:00 2001 From: Jack Enhorn <jack.enhorn@ericsson.com> Date: Thu, 15 Oct 2020 12:55:27 +0200 Subject: [PATCH] Avoiding allocation of filtered org buffers if temporal filtering is disabled. Also adding missing memory release of m_filteredOrgPic in EncApp::destroyLib --- source/App/EncoderApp/EncApp.cpp | 12 ++++++-- source/Lib/CommonLib/Picture.cpp | 7 +++-- source/Lib/CommonLib/Picture.h | 2 +- source/Lib/EncoderLib/EncLib.cpp | 49 +++++++++++++++++++++----------- 4 files changed, 48 insertions(+), 22 deletions(-) diff --git a/source/App/EncoderApp/EncApp.cpp b/source/App/EncoderApp/EncApp.cpp index acab8802d7..36f9cedca3 100644 --- a/source/App/EncoderApp/EncApp.cpp +++ b/source/App/EncoderApp/EncApp.cpp @@ -1195,10 +1195,13 @@ void EncApp::createLib( const int layerIdx ) m_orgPic = new PelStorage; m_trueOrgPic = new PelStorage; - m_filteredOrgPic = new PelStorage; m_orgPic->create( unitArea ); m_trueOrgPic->create( unitArea ); - m_filteredOrgPic->create( unitArea ); + if(m_gopBasedTemporalFilterEnabled) + { + m_filteredOrgPic = new PelStorage; + m_filteredOrgPic->create( unitArea ); + } if( !m_bitstream.is_open() ) { @@ -1256,6 +1259,11 @@ void EncApp::destroyLib() m_trueOrgPic->destroy(); delete m_trueOrgPic; delete m_orgPic; + if(m_gopBasedTemporalFilterEnabled) + { + m_filteredOrgPic->destroy(); + delete m_filteredOrgPic; + } #if EXTENSION_360_VIDEO delete m_ext360; #endif diff --git a/source/Lib/CommonLib/Picture.cpp b/source/Lib/CommonLib/Picture.cpp index ae06642f63..634f6d993d 100644 --- a/source/Lib/CommonLib/Picture.cpp +++ b/source/Lib/CommonLib/Picture.cpp @@ -204,7 +204,7 @@ Picture::Picture() unscaledPic = nullptr; } -void Picture::create( const ChromaFormat &_chromaFormat, const Size &size, const unsigned _maxCUSize, const unsigned _margin, const bool _decoder, const int _layerId ) +void Picture::create( const ChromaFormat &_chromaFormat, const Size &size, const unsigned _maxCUSize, const unsigned _margin, const bool _decoder, const int _layerId, const bool gopBasedTemporalFilterEnabled ) { layerId = _layerId; UnitArea::operator=( UnitArea( _chromaFormat, Area( Position{ 0, 0 }, size ) ) ); @@ -217,7 +217,10 @@ void Picture::create( const ChromaFormat &_chromaFormat, const Size &size, const { M_BUFS( 0, PIC_ORIGINAL ). create( _chromaFormat, a ); M_BUFS( 0, PIC_TRUE_ORIGINAL ). create( _chromaFormat, a ); - M_BUFS( 0, PIC_FILTERED_ORIGINAL ). create( _chromaFormat, a ); + if(gopBasedTemporalFilterEnabled) + { + M_BUFS( 0, PIC_FILTERED_ORIGINAL ). create( _chromaFormat, a ); + } } #if !KEEP_PRED_AND_RESI_SIGNALS m_ctuArea = UnitArea( _chromaFormat, Area( Position{ 0, 0 }, Size( _maxCUSize, _maxCUSize ) ) ); diff --git a/source/Lib/CommonLib/Picture.h b/source/Lib/CommonLib/Picture.h index aa8f067b1c..5e8c849cd2 100644 --- a/source/Lib/CommonLib/Picture.h +++ b/source/Lib/CommonLib/Picture.h @@ -99,7 +99,7 @@ struct Picture : public UnitArea uint32_t margin; Picture(); - void create( const ChromaFormat &_chromaFormat, const Size &size, const unsigned _maxCUSize, const unsigned margin, const bool bDecoder, const int layerId ); + void create( const ChromaFormat &_chromaFormat, const Size &size, const unsigned _maxCUSize, const unsigned margin, const bool bDecoder, const int layerId, const bool gopBasedTemporalFilterEnabled = false ); void destroy(); void createTempBuffers( const unsigned _maxCUSize ); diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp index 2b634802c3..6cfdd0e71d 100644 --- a/source/Lib/EncoderLib/EncLib.cpp +++ b/source/Lib/EncoderLib/EncLib.cpp @@ -479,14 +479,14 @@ void EncLib::init( bool isFieldCoding, AUWriterIf* auWriterIf ) if (getUseCompositeRef()) { Picture *picBg = new Picture; - picBg->create( sps0.getChromaFormatIdc(), Size( pps0.getPicWidthInLumaSamples(), pps0.getPicHeightInLumaSamples() ), sps0.getMaxCUWidth(), sps0.getMaxCUWidth() + 16, false, m_layerId ); + picBg->create( sps0.getChromaFormatIdc(), Size( pps0.getPicWidthInLumaSamples(), pps0.getPicHeightInLumaSamples() ), sps0.getMaxCUWidth(), sps0.getMaxCUWidth() + 16, false, m_layerId, m_gopBasedTemporalFilterEnabled ); picBg->getRecoBuf().fill(0); picBg->finalInit( m_vps, sps0, pps0, &m_picHeader, m_apss, m_lmcsAPS, m_scalinglistAPS ); picBg->allocateNewSlice(); picBg->createSpliceIdx(pps0.pcv->sizeInCtus); m_cGOPEncoder.setPicBg(picBg); Picture *picOrig = new Picture; - picOrig->create( sps0.getChromaFormatIdc(), Size( pps0.getPicWidthInLumaSamples(), pps0.getPicHeightInLumaSamples() ), sps0.getMaxCUWidth(), sps0.getMaxCUWidth() + 16, false, m_layerId ); + picOrig->create( sps0.getChromaFormatIdc(), Size( pps0.getPicWidthInLumaSamples(), pps0.getPicHeightInLumaSamples() ), sps0.getMaxCUWidth(), sps0.getMaxCUWidth() + 16, false, m_layerId, m_gopBasedTemporalFilterEnabled ); picOrig->getOrigBuf().fill(0); m_cGOPEncoder.setPicOrig(picOrig); } @@ -689,9 +689,12 @@ bool EncLib::encodePrep( bool flush, PelStorage* pcPicYuvOrg, PelStorage* cPicYu pcPicCurr->M_BUFS( 0, PIC_TRUE_ORIGINAL_INPUT ).getBuf( COMPONENT_Cb ).copyFrom( cPicYuvTrueOrg->getBuf( COMPONENT_Cb ) ); pcPicCurr->M_BUFS( 0, PIC_TRUE_ORIGINAL_INPUT ).getBuf( COMPONENT_Cr ).copyFrom( cPicYuvTrueOrg->getBuf( COMPONENT_Cr ) ); - pcPicCurr->M_BUFS( 0, PIC_FILTERED_ORIGINAL_INPUT ).getBuf( COMPONENT_Y ).copyFrom( pcPicYuvFilteredOrg->getBuf( COMPONENT_Y ) ); - pcPicCurr->M_BUFS( 0, PIC_FILTERED_ORIGINAL_INPUT ).getBuf( COMPONENT_Cb ).copyFrom( pcPicYuvFilteredOrg->getBuf( COMPONENT_Cb ) ); - pcPicCurr->M_BUFS( 0, PIC_FILTERED_ORIGINAL_INPUT ).getBuf( COMPONENT_Cr ).copyFrom( pcPicYuvFilteredOrg->getBuf( COMPONENT_Cr ) ); + if(m_gopBasedTemporalFilterEnabled) + { + pcPicCurr->M_BUFS( 0, PIC_FILTERED_ORIGINAL_INPUT ).getBuf( COMPONENT_Y ).copyFrom( pcPicYuvFilteredOrg->getBuf( COMPONENT_Y ) ); + pcPicCurr->M_BUFS( 0, PIC_FILTERED_ORIGINAL_INPUT ).getBuf( COMPONENT_Cb ).copyFrom( pcPicYuvFilteredOrg->getBuf( COMPONENT_Cb ) ); + pcPicCurr->M_BUFS( 0, PIC_FILTERED_ORIGINAL_INPUT ).getBuf( COMPONENT_Cr ).copyFrom( pcPicYuvFilteredOrg->getBuf( COMPONENT_Cr ) ); + } const ChromaFormat chromaFormatIDC = pSPS->getChromaFormatIdc(); @@ -712,14 +715,20 @@ bool EncLib::encodePrep( bool flush, PelStorage* pcPicYuvOrg, PelStorage* cPicYu pSPS->getHorCollocatedChromaFlag(), pSPS->getVerCollocatedChromaFlag() ); Picture::rescalePicture( scalingRatio, *cPicYuvTrueOrg, refPPS->getScalingWindow(), pcPicCurr->getTrueOrigBuf(), pPPS->getScalingWindow(), chromaFormatIDC, pSPS->getBitDepths(), true, true, pSPS->getHorCollocatedChromaFlag(), pSPS->getVerCollocatedChromaFlag() ); - Picture::rescalePicture( scalingRatio, *pcPicYuvFilteredOrg, refPPS->getScalingWindow(), pcPicCurr->getFilteredOrigBuf(), pPPS->getScalingWindow(), chromaFormatIDC, pSPS->getBitDepths(), true, true, - pSPS->getHorCollocatedChromaFlag(), pSPS->getVerCollocatedChromaFlag() ); + if(m_gopBasedTemporalFilterEnabled) + { + Picture::rescalePicture( scalingRatio, *pcPicYuvFilteredOrg, refPPS->getScalingWindow(), pcPicCurr->getFilteredOrigBuf(), pPPS->getScalingWindow(), chromaFormatIDC, pSPS->getBitDepths(), true, true, + pSPS->getHorCollocatedChromaFlag(), pSPS->getVerCollocatedChromaFlag() ); + } } else { pcPicCurr->M_BUFS( 0, PIC_ORIGINAL ).swap( *pcPicYuvOrg ); pcPicCurr->M_BUFS( 0, PIC_TRUE_ORIGINAL ).swap( *cPicYuvTrueOrg ); - pcPicCurr->M_BUFS( 0, PIC_FILTERED_ORIGINAL ).swap( *pcPicYuvFilteredOrg ); + if(m_gopBasedTemporalFilterEnabled) + { + pcPicCurr->M_BUFS( 0, PIC_FILTERED_ORIGINAL ).swap( *pcPicYuvFilteredOrg ); + } } pcPicCurr->finalInit( m_vps, *pSPS, *pPPS, &m_picHeader, m_apss, m_lmcsAPS, m_scalinglistAPS ); @@ -850,13 +859,16 @@ bool EncLib::encodePrep( bool flush, PelStorage* pcPicYuvOrg, PelStorage* pcPicY compBuf.width, compBuf.height, isTopField); - compBuf = pcPicYuvFilteredOrg->get( compID ); - separateFields( compBuf.buf, - pcField->getTrueOrigBuf().get(compID).buf, - compBuf.stride, - compBuf.width, - compBuf.height, - isTopField); + if(m_gopBasedTemporalFilterEnabled) + { + compBuf = pcPicYuvFilteredOrg->get( compID ); + separateFields( compBuf.buf, + pcField->getTrueOrigBuf().get(compID).buf, + compBuf.stride, + compBuf.width, + compBuf.height, + isTopField); + } } } @@ -986,13 +998,16 @@ void EncLib::xGetNewPicBuffer ( std::list<PelUnitBuf*>& rcListPicYuvRecOut, Pict if (rpcPic==0) { rpcPic = new Picture; - rpcPic->create( sps.getChromaFormatIdc(), Size( pps.getPicWidthInLumaSamples(), pps.getPicHeightInLumaSamples() ), sps.getMaxCUWidth(), sps.getMaxCUWidth() + 16, false, m_layerId ); + rpcPic->create( sps.getChromaFormatIdc(), Size( pps.getPicWidthInLumaSamples(), pps.getPicHeightInLumaSamples() ), sps.getMaxCUWidth(), sps.getMaxCUWidth() + 16, false, m_layerId, m_gopBasedTemporalFilterEnabled ); if (m_resChangeInClvsEnabled) { const PPS &pps0 = *m_ppsMap.getPS(0); rpcPic->M_BUFS(0, PIC_ORIGINAL_INPUT).create(sps.getChromaFormatIdc(), Area(Position(), Size(pps0.getPicWidthInLumaSamples(), pps0.getPicHeightInLumaSamples()))); rpcPic->M_BUFS(0, PIC_TRUE_ORIGINAL_INPUT).create(sps.getChromaFormatIdc(), Area(Position(), Size(pps0.getPicWidthInLumaSamples(), pps0.getPicHeightInLumaSamples()))); - rpcPic->M_BUFS(0, PIC_FILTERED_ORIGINAL_INPUT).create(sps.getChromaFormatIdc(), Area(Position(), Size(pps0.getPicWidthInLumaSamples(), pps0.getPicHeightInLumaSamples()))); + if(m_gopBasedTemporalFilterEnabled) + { + rpcPic->M_BUFS(0, PIC_FILTERED_ORIGINAL_INPUT).create(sps.getChromaFormatIdc(), Area(Position(), Size(pps0.getPicWidthInLumaSamples(), pps0.getPicHeightInLumaSamples()))); + } } if ( getUseAdaptiveQP() ) { -- GitLab