1 2 3 4 5 6 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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
|
/* 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.
*
* Copyright (c) 2010-2022, ITU/ISO/IEC
* 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 TEncTop.h
\brief encoder class (header)
*/
#ifndef __TENCTOP__
#define __TENCTOP__
// Include files
#include "TLibCommon/TComList.h"
#include "TLibCommon/TComPrediction.h"
#include "TLibCommon/TComTrQuant.h"
#include "TLibCommon/TComLoopFilter.h"
#include "TLibCommon/AccessUnit.h"
#include "Utilities/TVideoIOYuv.h"
#include "TEncCfg.h"
#include "TEncGOP.h"
#include "TEncSlice.h"
#include "TEncEntropy.h"
#include "TEncCavlc.h"
#include "TEncSbac.h"
#include "TEncSearch.h"
#include "TEncSampleAdaptiveOffset.h"
#include "TEncPreanalyzer.h"
#include "TEncRateCtrl.h"
//! \ingroup TLibEncoder
//! \{
// ====================================================================================================================
// Class definition
// ====================================================================================================================
/// encoder class
class TEncTop : public TEncCfg
{
private:
// picture
Int m_iPOCLast; ///< time index (POC)
Int m_iNumPicRcvd; ///< number of received pictures
UInt m_uiNumAllPicCoded; ///< number of coded pictures
TComList<TComPic*> m_cListPic; ///< dynamic list of pictures
// encoder search
TEncSearch m_cSearch; ///< encoder search class
//TEncEntropy* m_pcEntropyCoder; ///< entropy encoder
TEncCavlc* m_pcCavlcCoder; ///< CAVLC encoder
// coding tool
TComTrQuant m_cTrQuant; ///< transform & quantization class
TComLoopFilter m_cLoopFilter; ///< deblocking filter class
TEncSampleAdaptiveOffset m_cEncSAO; ///< sample adaptive offset class
TEncEntropy m_cEntropyCoder; ///< entropy encoder
TEncCavlc m_cCavlcCoder; ///< CAVLC encoder
TEncSbac m_cSbacCoder; ///< SBAC encoder
TEncBinCABAC m_cBinCoderCABAC; ///< bin coder CABAC
// processing unit
TEncGOP m_cGOPEncoder; ///< GOP encoder
TEncSlice m_cSliceEncoder; ///< slice encoder
TEncCu m_cCuEncoder; ///< CU encoder
// SPS
ParameterSetMap<TComSPS> m_spsMap; ///< SPS. This is the base value. This is copied to TComPicSym
ParameterSetMap<TComPPS> m_ppsMap; ///< PPS. This is the base value. This is copied to TComPicSym
// RD cost computation
TComRdCost m_cRdCost; ///< RD cost computation class
TEncSbac*** m_pppcRDSbacCoder; ///< temporal storage for RD computation
TEncSbac m_cRDGoOnSbacCoder; ///< going on SBAC model for RD stage
#if FAST_BIT_EST
TEncBinCABACCounter*** m_pppcBinCoderCABAC; ///< temporal CABAC state storage for RD computation
TEncBinCABACCounter m_cRDGoOnBinCoderCABAC; ///< going on bin coder CABAC for RD stage
#else
TEncBinCABAC*** m_pppcBinCoderCABAC; ///< temporal CABAC state storage for RD computation
TEncBinCABAC m_cRDGoOnBinCoderCABAC; ///< going on bin coder CABAC for RD stage
#endif
// quality control
TEncPreanalyzer m_cPreanalyzer; ///< image characteristics analyzer for TM5-step3-like adaptive QP
TEncRateCtrl m_cRateCtrl; ///< Rate control class
protected:
Void xGetNewPicBuffer ( TComPic*& rpcPic, Int ppsId ); ///< get picture buffer which will be processed. If ppsId<0, then the ppsMap will be queried for the first match.
Void xInitVPS (TComVPS &vps, const TComSPS &sps); ///< initialize VPS from encoder options
Void xInitSPS (TComSPS &sps); ///< initialize SPS from encoder options
Void xInitPPS (TComPPS &pps, const TComSPS &sps); ///< initialize PPS from encoder options
Void xInitScalingLists (TComSPS &sps, TComPPS &pps); ///< initialize scaling lists
Void xInitHrdParameters(TComSPS &sps); ///< initialize HRD parameters
Void xInitPPSforTiles (TComPPS &pps);
Void xInitRPS (TComSPS &sps, Bool isFieldCoding); ///< initialize PPS from encoder options
public:
TEncTop();
virtual ~TEncTop();
Void create ();
Void destroy ();
Void init (Bool isFieldCoding);
Void deletePicBuffer ();
// -------------------------------------------------------------------------------------------------------------------
// member access functions
// -------------------------------------------------------------------------------------------------------------------
TComList<TComPic*>* getListPic () { return &m_cListPic; }
TEncSearch* getPredSearch () { return &m_cSearch; }
TComTrQuant* getTrQuant () { return &m_cTrQuant; }
TComLoopFilter* getLoopFilter () { return &m_cLoopFilter; }
TEncSampleAdaptiveOffset* getSAO () { return &m_cEncSAO; }
TEncGOP* getGOPEncoder () { return &m_cGOPEncoder; }
TEncSlice* getSliceEncoder () { return &m_cSliceEncoder; }
TEncCu* getCuEncoder () { return &m_cCuEncoder; }
TEncEntropy* getEntropyCoder () { return &m_cEntropyCoder; }
TEncCavlc* getCavlcCoder () { return &m_cCavlcCoder; }
TEncSbac* getSbacCoder () { return &m_cSbacCoder; }
TEncBinCABAC* getBinCABAC () { return &m_cBinCoderCABAC; }
TComRdCost* getRdCost () { return &m_cRdCost; }
TEncSbac*** getRDSbacCoder () { return m_pppcRDSbacCoder; }
TEncSbac* getRDGoOnSbacCoder () { return &m_cRDGoOnSbacCoder; }
TEncRateCtrl* getRateCtrl () { return &m_cRateCtrl; }
Void selectReferencePictureSet(TComSlice* slice, Int POCCurr, Int GOPid );
Int getReferencePictureSetIdxForSOP(Int POCCurr, Int GOPid );
Void setParamSetChanged(Int spsId, Int ppsId);
Bool PPSNeedsWriting(Int ppsId);
Bool SPSNeedsWriting(Int spsId);
// -------------------------------------------------------------------------------------------------------------------
// encoder function
// -------------------------------------------------------------------------------------------------------------------
/// encode several number of pictures until end-of-sequence
#if JVET_X0048_X0103_FILM_GRAIN
Void encode(Bool bEos,
TComPicYuv* pcPicYuvOrg,
TComPicYuv* pcPicYuvTrueOrg,
TComPicYuv* pcfilteredOrgPicForFG,
const InputColourSpaceConversion ipCSC, const InputColourSpaceConversion snrCSC, // used for SNR calculations. Picture in original colour space.
TComList<TComPicYuv*>& rcListPicYuvRecOut,
std::list<AccessUnit>& accessUnitsOut, Int& iNumEncoded);
#else
Void encode( Bool bEos,
TComPicYuv* pcPicYuvOrg,
TComPicYuv* pcPicYuvTrueOrg,
const InputColourSpaceConversion ipCSC, const InputColourSpaceConversion snrCSC, // used for SNR calculations. Picture in original colour space.
TComList<TComPicYuv*>& rcListPicYuvRecOut,
std::list<AccessUnit>& accessUnitsOut, Int& iNumEncoded );
#endif
/// encode several number of pictures until end-of-sequence
Void encode( Bool bEos, TComPicYuv* pcPicYuvOrg,
TComPicYuv* pcPicYuvTrueOrg,
const InputColourSpaceConversion ipCSC, const InputColourSpaceConversion snrCSC, // used for SNR calculations. Picture in original colour space.
TComList<TComPicYuv*>& rcListPicYuvRecOut,
std::list<AccessUnit>& accessUnitsOut, Int& iNumEncoded, Bool isTff);
TEncAnalyze::OutputLogControl getOutputLogControl() const
{
TEncAnalyze::OutputLogControl outputLogCtrl;
outputLogCtrl.printFrameMSE=m_printFrameMSE;
outputLogCtrl.printMSEBasedSNR=m_printMSEBasedSequencePSNR;
outputLogCtrl.printMSSSIM=m_printMSSSIM;
outputLogCtrl.printSequenceMSE=m_printSequenceMSE;
outputLogCtrl.printXPSNR=m_bXPSNREnableFlag;
outputLogCtrl.printHexPerPOCPSNRs=m_printHexPsnr;
return outputLogCtrl;
}
Void printSummary(Bool isField)
{
m_cGOPEncoder.printOutSummary (m_uiNumAllPicCoded, isField, getOutputLogControl(), m_spsMap.getFirstPS()->getBitDepths());
}
};
//! \}
#endif // __TENCTOP__
|