Newer
Older

Karsten Suehring
committed
/* The copyright in this software is being made available under the BSD
* License, included below. This software may be subject to other third party
* and contributor rights, including patent rights, and no such rights are
* granted under this license.
*

Karsten Suehring
committed
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
/** \file EncLib.h
\brief encoder class (header)
*/
#ifndef __ENCTOP__
#define __ENCTOP__
// Include files
#include "CommonLib/TrQuant.h"
#include "CommonLib/LoopFilter.h"
#include "CommonLib/NAL.h"
#if JVET_V0094_BILATERAL_FILTER || JVET_X0071_CHROMA_BILATERAL_FILTER
Tangi Poirier
committed
#include "EncoderLib/EncTemporalFilter.h"

Karsten Suehring
committed
#include "Utilities/VideoIOYuv.h"
#include "EncCfg.h"
#include "EncGOP.h"
#include "EncSlice.h"
#include "EncHRD.h"

Karsten Suehring
committed
#include "VLCWriter.h"
#include "CABACWriter.h"
#include "InterSearch.h"
#include "IntraSearch.h"
#include "EncSampleAdaptiveOffset.h"

Karsten Suehring
committed
#include "EncAdaptiveLoopFilter.h"
#include "RateCtrl.h"

Karsten Suehring
committed
//! \ingroup EncoderLib
//! \{
// ====================================================================================================================
// Class definition
// ====================================================================================================================
/// encoder class
class EncLib : public EncCfg
{
private:
// picture
int m_iPOCLast; ///< time index (POC)
int m_iNumPicRcvd; ///< number of received pictures
uint32_t m_uiNumAllPicCoded; ///< number of coded pictures
PicList& m_cListPic; ///< dynamic list of pictures

Karsten Suehring
committed
// encoder search

Karsten Suehring
committed
InterSearch *m_cInterSearch; ///< encoder search class
IntraSearch *m_cIntraSearch; ///< encoder search class
#else
InterSearch m_cInterSearch; ///< encoder search class
IntraSearch m_cIntraSearch; ///< encoder search class
#endif
// coding tool
#if JVET_V0094_BILATERAL_FILTER || JVET_X0071_CHROMA_BILATERAL_FILTER

Karsten Suehring
committed
TrQuant *m_cTrQuant; ///< transform & quantization class
#else
#if JVET_V0094_BILATERAL_FILTER || JVET_X0071_CHROMA_BILATERAL_FILTER

Karsten Suehring
committed
TrQuant m_cTrQuant; ///< transform & quantization class
#endif
LoopFilter m_cLoopFilter; ///< deblocking filter class
EncSampleAdaptiveOffset m_cEncSAO; ///< sample adaptive offset class
EncAdaptiveLoopFilter m_cEncALF;
HLSWriter m_HLSWriter; ///< CAVLC encoder

Karsten Suehring
committed
CABACEncoder *m_CABACEncoder;
#else
CABACEncoder m_CABACEncoder;
#endif
EncReshape *m_cReshaper; ///< reshaper class
#else
EncReshape m_cReshaper; ///< reshaper class
#endif
#if JVET_AA0096_MC_BOUNDARY_PADDING
InterPrediction m_cFrameMcPadPredSearch;
#endif

Karsten Suehring
committed
// processing unit
EncGOP m_cGOPEncoder; ///< GOP encoder
EncSlice m_cSliceEncoder; ///< slice encoder

Karsten Suehring
committed
EncCu *m_cCuEncoder; ///< CU encoder
#else
EncCu m_cCuEncoder; ///< CU encoder
#endif
// SPS
ParameterSetMap<SPS>& m_spsMap; ///< SPS. This is the base value. This is copied to PicSym
ParameterSetMap<PPS>& m_ppsMap; ///< PPS. This is the base value. This is copied to PicSym
ParameterSetMap<APS>& m_apsMap; ///< APS. This is the base value. This is copied to PicSym

Karsten Suehring
committed
// RD cost computation

Karsten Suehring
committed
RdCost *m_cRdCost; ///< RD cost computation class
CtxCache *m_ctxCache; ///< buffer for temporarily stored context models

Karsten Suehring
committed
#else
RdCost m_cRdCost; ///< RD cost computation class
CtxCache m_ctxCache; ///< buffer for temporarily stored context models

Karsten Suehring
committed
#endif
// quality control
RateCtrl m_cRateCtrl; ///< Rate control class
AUWriterIf* m_AUWriterIf;

Karsten Suehring
committed
int m_numCuEncStacks;
#endif
#if JVET_J0090_MEMORY_BANDWITH_MEASURE
CacheModel m_cacheModel;
#endif
#if JVET_AK0065_TALF
APS* m_apss2[ALF_CTB_MAX_NUM_APS];
#endif
APS* m_scalinglistAPS;
EncHRD m_encHRD;
bool m_doPlt;
#if JVET_O0756_CALCULATE_HDRMETRICS
std::chrono::duration<long long, ratio<1, 1000000000>> m_metricTime;
#endif
int m_picIdInGOP;
Tangi Poirier
committed
EncTemporalFilter m_temporalFilter;

Karsten Suehring
committed
public:
SPS* getSPS( int spsId ) { return m_spsMap.getPS( spsId ); };
APS** getApss() { return m_apss; }
#if JVET_AK0065_TALF
APS** getApss2() { return m_apss2; }
#endif

Karsten Suehring
committed
Ctx m_entropyCodingSyncContextState; ///< leave in addition to vector for compatibility
Yung-Hsuan Chao (Jessie)
committed
PLTBuf m_palettePredictorSyncState;
#if JVET_AC0096 || JVET_AG0116
int m_gopRprPpsId;
#endif

Karsten Suehring
committed
protected:
void xGetNewPicBuffer ( std::list<PelUnitBuf*>& rcListPicYuvRecOut, Picture*& rpcPic, int ppsId ); ///< get picture buffer which will be processed. If ppsId<0, then the ppsMap will be queried for the first match.
void xInitDCI(DCI& dci, const SPS& sps); ///< initialize Decoding Capability Information (DCI) from encoder options
void xInitVPS( const SPS& sps ); ///< initialize VPS from encoder options
void xInitSPS( SPS& sps ); ///< initialize SPS from encoder options

Karsten Suehring
committed
void xInitPPS (PPS &pps, const SPS &sps); ///< initialize PPS from encoder options
void xInitPicHeader (PicHeader &picHeader, const SPS &sps, const PPS &pps); ///< initialize Picture Header from encoder options
void xInitAPS (APS &aps); ///< initialize APS from encoder options
void xInitScalingLists ( SPS &sps, APS &aps ); ///< initialize scaling lists
void xInitPPSforLT(PPS& pps);
void xInitHrdParameters(SPS &sps); ///< initialize HRDParameters parameters

Karsten Suehring
committed
void xInitRPL(SPS &sps, bool isFieldCoding); ///< initialize SPS from encoder options

Karsten Suehring
committed
public:
EncLib( EncLibCommon* encLibCommon );

Karsten Suehring
committed
virtual ~EncLib();

Karsten Suehring
committed
void destroy ();
void init ( bool isFieldCoding, AUWriterIf* auWriterIf );
void deletePicBuffer ();
// -------------------------------------------------------------------------------------------------------------------
// member access functions
// -------------------------------------------------------------------------------------------------------------------
AUWriterIf* getAUWriterIf () { return m_AUWriterIf; }
PicList* getListPic () { return &m_cListPic; }

Karsten Suehring
committed
InterSearch* getInterSearch ( int jId = 0 ) { return &m_cInterSearch[jId]; }
IntraSearch* getIntraSearch ( int jId = 0 ) { return &m_cIntraSearch[jId]; }
#if JVET_V0094_BILATERAL_FILTER || JVET_X0071_CHROMA_BILATERAL_FILTER
BilateralFilter* getBilateralFilter ( int jId = 0 ) { return &m_bilateralFilter[jId]; }
#endif

Karsten Suehring
committed
TrQuant* getTrQuant ( int jId = 0 ) { return &m_cTrQuant[jId]; }
#else
InterSearch* getInterSearch () { return &m_cInterSearch; }
IntraSearch* getIntraSearch () { return &m_cIntraSearch; }
#if JVET_V0094_BILATERAL_FILTER || JVET_X0071_CHROMA_BILATERAL_FILTER
BilateralFilter* getBilateralFilter () { return &m_bilateralFilter; }
#endif

Karsten Suehring
committed
TrQuant* getTrQuant () { return &m_cTrQuant; }
#endif
LoopFilter* getLoopFilter () { return &m_cLoopFilter; }
EncSampleAdaptiveOffset* getSAO () { return &m_cEncSAO; }
EncAdaptiveLoopFilter* getALF () { return &m_cEncALF; }
EncGOP* getGOPEncoder () { return &m_cGOPEncoder; }
EncSlice* getSliceEncoder () { return &m_cSliceEncoder; }

Karsten Suehring
committed
EncHRD* getHRD () { return &m_encHRD; }

Karsten Suehring
committed
EncCu* getCuEncoder ( int jId = 0 ) { return &m_cCuEncoder[jId]; }
#else
EncCu* getCuEncoder () { return &m_cCuEncoder; }
#endif
HLSWriter* getHLSWriter () { return &m_HLSWriter; }

Karsten Suehring
committed
CABACEncoder* getCABACEncoder ( int jId = 0 ) { return &m_CABACEncoder[jId]; }
RdCost* getRdCost ( int jId = 0 ) { return &m_cRdCost[jId]; }
CtxCache* getCtxCache ( int jId = 0 ) { return &m_ctxCache[jId]; }

Karsten Suehring
committed
#else
CABACEncoder* getCABACEncoder () { return &m_CABACEncoder; }
#if JVET_AA0096_MC_BOUNDARY_PADDING
InterPrediction * getFrameMcPadPredSearch() { return &m_cFrameMcPadPredSearch; }
#endif

Karsten Suehring
committed
RdCost* getRdCost () { return &m_cRdCost; }

Karsten Suehring
committed
#endif
RateCtrl* getRateCtrl () { return &m_cRateCtrl; }
void getActiveRefPicListNumForPOC(const SPS *sps, int POCCurr, int GOPid, uint32_t *activeL0, uint32_t *activeL1);
void selectReferencePictureList(Slice* slice, int POCCurr, int GOPid, int ltPoc);

Karsten Suehring
committed
void setParamSetChanged(int spsId, int ppsId);

Karsten Suehring
committed
bool PPSNeedsWriting(int ppsId);
bool SPSNeedsWriting(int spsId);
const PPS* getPPS( int Id ) { return m_ppsMap.getPS( Id); }

Karsten Suehring
committed

Karsten Suehring
committed
void setNumCuEncStacks( int n ) { m_numCuEncStacks = n; }
int getNumCuEncStacks() const { return m_numCuEncStacks; }
#endif
EncReshape* getReshaper( int jId = 0 ) { return &m_cReshaper[jId]; }
#else
EncReshape* getReshaper() { return &m_cReshaper; }
#endif
ParameterSetMap<APS>* getApsMap() { return &m_apsMap; }
Tangi Poirier
committed
EncTemporalFilter& getTemporalFilter() { return m_temporalFilter; }
bool getPltEnc() const { return m_doPlt; }
void checkPltStats( Picture* pic );
#if JVET_O0756_CALCULATE_HDRMETRICS
std::chrono::duration<long long, ratio<1, 1000000000>> getMetricTime() const { return m_metricTime; };
#endif

Karsten Suehring
committed
// -------------------------------------------------------------------------------------------------------------------
// encoder function
// -------------------------------------------------------------------------------------------------------------------
/// encode several number of pictures until end-of-sequence
bool encodePrep( bool bEos,
PelStorage* pcPicYuvOrg,
const InputColourSpaceConversion snrCSC, // used for SNR calculations. Picture in original colour space.
std::list<PelUnitBuf*>& rcListPicYuvRecOut,
int& iNumEncoded
#if JVET_AG0116
, PelStorage** ppcPicYuvRPR
#endif
);
bool encode( const InputColourSpaceConversion snrCSC, // used for SNR calculations. Picture in original colour space.
std::list<PelUnitBuf*>& rcListPicYuvRecOut,
int& iNumEncoded );
bool encodePrep( bool bEos,
PelStorage* pcPicYuvOrg,
const InputColourSpaceConversion snrCSC, // used for SNR calculations. Picture in original colour space.
std::list<PelUnitBuf*>& rcListPicYuvRecOut,
int& iNumEncoded, bool isTff );
bool encode( const InputColourSpaceConversion snrCSC, // used for SNR calculations. Picture in original colour space.
std::list<PelUnitBuf*>& rcListPicYuvRecOut,
int& iNumEncoded, bool isTff );

Karsten Suehring
committed
void printSummary(bool isField) {
m_cGOPEncoder.printOutSummary(m_uiNumAllPicCoded, isField, m_printMSEBasedSequencePSNR, m_printSequenceMSE,
#if MSSIM_UNIFORM_METRICS_LOG
m_printMSSSIM,
#endif
m_printHexPsnr, m_resChangeInClvsEnabled, m_spsMap.getFirstPS()->getBitDepths()
#if JVET_W0134_UNIFORM_METRICS_LOG
,
m_layerId
#endif
); }

Karsten Suehring
committed
VPS* getVPS() { return m_vps; }
#if DUMP_BEFORE_INLOOP
std::string m_reconFileName;
#endif
#if JVET_AA0093_DIVERSITY_CRITERION_FOR_ARMC
void setQPOffsetList(const int QPOffset[MAX_GOP]);
#endif

Karsten Suehring
committed
};
//! \}
#endif // __ENCTOP__