Skip to content
Snippets Groups Projects
EncCu.h 9.73 KiB
Newer Older
  • Learn to ignore specific revisions
  • /* 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-2019, 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     EncCu.h
        \brief    Coding Unit (CU) encoder class (header)
    */
    
    #ifndef __ENCCU__
    #define __ENCCU__
    
    // Include files
    #include "CommonLib/CommonDef.h"
    #include "CommonLib/IntraPrediction.h"
    #include "CommonLib/InterPrediction.h"
    #include "CommonLib/TrQuant.h"
    #include "CommonLib/Unit.h"
    #include "CommonLib/UnitPartitioner.h"
    
    Yu Han's avatar
    Yu Han committed
    #include "CommonLib/IbcHashMap.h"
    
    Nan Hu's avatar
    Nan Hu committed
    #include "CommonLib/LoopFilter.h"
    
    
    #include "DecoderLib/DecCu.h"
    
    #include "CABACWriter.h"
    #include "IntraSearch.h"
    #include "InterSearch.h"
    #include "RateCtrl.h"
    #include "EncModeCtrl.h"
    //! \ingroup EncoderLib
    //! \{
    
    class EncLib;
    class HLSWriter;
    class EncSlice;
    
    // ====================================================================================================================
    // Class definition
    // ====================================================================================================================
    
    /// CU encoder class
    
    struct TriangleMotionInfo
    {
      uint8_t   m_splitDir;
      uint8_t   m_candIdx0;
      uint8_t   m_candIdx1;
    
      TriangleMotionInfo ( uint8_t splitDir, uint8_t candIdx0, uint8_t candIdx1 ): m_splitDir(splitDir), m_candIdx0(candIdx0), m_candIdx1(candIdx1) { }
    };
    
    Nan Hu's avatar
    Nan Hu committed
      bool m_bestModeUpdated;
    
      struct CtxPair
      {
        Ctx start;
        Ctx best;
      };
    
      std::vector<CtxPair>  m_CtxBuffer;
      CtxPair*              m_CurrCtx;
      CtxCache*             m_CtxCache;
    
    #if ENABLE_SPLIT_PARALLELISM || ENABLE_WPP_PARALLELISM
      int                   m_dataId;
    #endif
    
      //  Data : encoder control
      int                   m_cuChromaQpOffsetIdxPlus1; // if 0, then cu_chroma_qp_offset_flag will be 0, otherwise cu_chroma_qp_offset_flag will be 1.
    
      XUCache               m_unitCache;
    
      CodingStructure    ***m_pTempCS;
      CodingStructure    ***m_pBestCS;
      //  Access channel
      EncCfg*               m_pcEncCfg;
      IntraSearch*          m_pcIntraSearch;
      InterSearch*          m_pcInterSearch;
      TrQuant*              m_pcTrQuant;
      RdCost*               m_pcRdCost;
      EncSlice*             m_pcSliceEncoder;
    
    Nan Hu's avatar
    Nan Hu committed
      LoopFilter*           m_pcLoopFilter;
    
    
      CABACWriter*          m_CABACEstimator;
      RateCtrl*             m_pcRateCtrl;
    
    Yu Han's avatar
    Yu Han committed
      IbcHashMap            m_ibcHashMap;
    
      int                  m_shareState;
      uint32_t             m_shareBndPosX;
      uint32_t             m_shareBndPosY;
      SizeType             m_shareBndSizeW;
      SizeType             m_shareBndSizeH;
    
    
      PelStorage            m_acMergeBuffer[MMVD_MRG_MAX_RD_BUF_NUM];
    
      PelStorage            m_acRealMergeBuffer[MRG_MAX_NUM_CANDS];
    
    rlliao's avatar
    rlliao committed
      PelStorage            m_acTriangleWeightedBuffer[TRIANGLE_MAX_NUM_CANDS]; // to store weighted prediction pixles
    
      double                m_mergeBestSATDCost;
    
      MotionInfo            m_SubPuMiBuf      [( MAX_CU_SIZE * MAX_CU_SIZE ) >> ( MIN_CU_LOG2 << 1 )];
    
    Yu Han's avatar
    Yu Han committed
      int                   m_ctuIbcSearchRangeX;
      int                   m_ctuIbcSearchRangeY;
    
    #if ENABLE_SPLIT_PARALLELISM || ENABLE_WPP_PARALLELISM
      EncLib*               m_pcEncLib;
    #endif
    
      int                   m_bestGbiIdx[2];
      double                m_bestGbiCost[2];
    
      static const TriangleMotionInfo  m_triangleModeTest[TRIANGLE_MAX_NUM_CANDS];
      uint8_t                          m_triangleIdxBins[2][TRIANGLE_MAX_NUM_UNI_CANDS][TRIANGLE_MAX_NUM_UNI_CANDS];
    
    #if SHARP_LUMA_DELTA_QP || ENABLE_QPA_SUB_CTU
      void    updateLambda      ( Slice* slice, const int dQP, const bool updateRdCostLambda );
    
      double                m_sbtCostSave[2];
    
    
    public:
      /// copy parameters from encoder class
      void  init                ( EncLib* pcEncLib, const SPS& sps PARL_PARAM( const int jId = 0 ) );
    
    Taoran Lu's avatar
    Taoran Lu committed
      void setDecCuReshaperInEncCU(EncReshape* pcReshape, ChromaFormat chromaFormatIDC) { initDecCuReshaper((Reshape*) pcReshape, chromaFormatIDC); }
    
      /// create internal buffers
      void  create              ( EncCfg* encCfg );
    
      /// destroy internal buffers
      void  destroy             ();
    
      /// CTU analysis function
      void  compressCtu         ( CodingStructure& cs, const UnitArea& area, const unsigned ctuRsAddr, const int prevQP[], const int currQP[] );
      /// CTU encoding function
      int   updateCtuDataISlice ( const CPelBuf buf );
    
      EncModeCtrl* getModeCtrl  () { return m_modeCtrl; }
    
    
    
      void   setMergeBestSATDCost(double cost) { m_mergeBestSATDCost = cost; }
      double getMergeBestSATDCost()            { return m_mergeBestSATDCost; }
    
      IbcHashMap& getIbcHashMap()              { return m_ibcHashMap;        }
    
      EncCfg*     getEncCfg()            const { return m_pcEncCfg;          }
    
    Nan Hu's avatar
    Nan Hu committed
      void xCalDebCost            ( CodingStructure &cs, Partitioner &partitioner, bool calDist = false );
      Distortion getDistortionDb  ( CodingStructure &cs, CPelBuf org, CPelBuf reco, ComponentID compID, const CompArea& compArea, bool afterDb );
    
    
      void xCompressCU            ( CodingStructure *&tempCS, CodingStructure *&bestCS, Partitioner &pm );
    
    #if ENABLE_SPLIT_PARALLELISM
      void xCompressCUParallel    ( CodingStructure *&tempCS, CodingStructure *&bestCS, Partitioner &pm );
      void copyState              ( EncCu* other, Partitioner& pm, const UnitArea& currArea, const bool isDist );
    #endif
    
    
      bool
        xCheckBestMode         ( CodingStructure *&tempCS, CodingStructure *&bestCS, Partitioner &pm, const EncTestMode& encTestmode );
    
      void xCheckModeSplit        ( CodingStructure *&tempCS, CodingStructure *&bestCS, Partitioner &pm, const EncTestMode& encTestMode );
    
    
      void xCheckRDCostIntra      ( CodingStructure *&tempCS, CodingStructure *&bestCS, Partitioner &pm, const EncTestMode& encTestMode );
      void xCheckIntraPCM         ( CodingStructure *&tempCS, CodingStructure *&bestCS, Partitioner &pm, const EncTestMode& encTestMode );
    
      void xCheckDQP              ( CodingStructure& cs, Partitioner& partitioner, bool bKeepCtx = false);
      void xFillPCMBuffer         ( CodingUnit &cu);
    
    
      void xCheckRDCostHashInter  ( CodingStructure *&tempCS, CodingStructure *&bestCS, Partitioner &pm, const EncTestMode& encTestMode );
    
      void xCheckRDCostAffineMerge2Nx2N
                                  ( CodingStructure *&tempCS, CodingStructure *&bestCS, Partitioner &partitioner, const EncTestMode& encTestMode );
      void xCheckRDCostInter      ( CodingStructure *&tempCS, CodingStructure *&bestCS, Partitioner &pm, const EncTestMode& encTestMode );
      bool xCheckRDCostInterIMV   ( CodingStructure *&tempCS, CodingStructure *&bestCS, Partitioner &pm, const EncTestMode& encTestMode );
      void xEncodeDontSplit       ( CodingStructure &cs, Partitioner &partitioner);
    
      void xCheckRDCostMerge2Nx2N ( CodingStructure *&tempCS, CodingStructure *&bestCS, Partitioner &pm, const EncTestMode& encTestMode );
    
    
      void xCheckRDCostMergeTriangle2Nx2N( CodingStructure *&tempCS, CodingStructure *&bestCS, Partitioner &pm, const EncTestMode& encTestMode );
    
    
    Tung Nguyen's avatar
    Tung Nguyen committed
      void xEncodeInterResidual(   CodingStructure *&tempCS
                                 , CodingStructure *&bestCS
                                 , Partitioner &partitioner
                                 , const EncTestMode& encTestMode
                                 , int residualPass       = 0
                                 , bool* bestHasNonResi   = NULL
                                 , double* equGBiCost     = NULL
                               );
    
    #if REUSE_CU_RESULTS
      void xReuseCachedResult     ( CodingStructure *&tempCS, CodingStructure *&bestCS, Partitioner &Partitioner );
    #endif
    
      bool xIsGBiSkip(const CodingUnit& cu)
      {
    
        if (cu.slice->getSliceType() != B_SLICE)
        {
          return true;
        }
    
        return((m_pcEncCfg->getBaseQP() > 32) && ((cu.slice->getTLayer() >= 4)
           || ((cu.refIdxBi[0] >= 0 && cu.refIdxBi[1] >= 0)
           && (abs(cu.slice->getPOC() - cu.slice->getRefPOC(REF_PIC_LIST_0, cu.refIdxBi[0])) == 1
           ||  abs(cu.slice->getPOC() - cu.slice->getRefPOC(REF_PIC_LIST_1, cu.refIdxBi[1])) == 1))));
      }
    
    Yu Han's avatar
    Yu Han committed
      void xCheckRDCostIBCMode    ( CodingStructure *&tempCS, CodingStructure *&bestCS, Partitioner &pm, const EncTestMode& encTestMode );
      void xCheckRDCostIBCModeMerge2Nx2N( CodingStructure *&tempCS, CodingStructure *&bestCS, Partitioner &partitioner, const EncTestMode& encTestMode );