Mercurial > hg > forks > libbpg
view jctvc/TLibEncoder/TEncSearch.h @ 0:772086c29cc7
Initial import.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Wed, 16 Nov 2016 11:16:33 +0200 |
parents | |
children |
line wrap: on
line source
/* 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-2014, 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 TEncSearch.h \brief encoder search class (header) */ #ifndef __TENCSEARCH__ #define __TENCSEARCH__ // Include files #include "TLibCommon/TComYuv.h" #include "TLibCommon/TComMotionInfo.h" #include "TLibCommon/TComPattern.h" #include "TLibCommon/TComPrediction.h" #include "TLibCommon/TComTrQuant.h" #include "TLibCommon/TComPic.h" #include "TLibCommon/TComRectangle.h" #include "TEncEntropy.h" #include "TEncSbac.h" #include "TEncCfg.h" //! \ingroup TLibEncoder //! \{ class TEncCu; // ==================================================================================================================== // Class definition // ==================================================================================================================== static const UInt MAX_NUM_REF_LIST_ADAPT_SR=2; static const UInt MAX_IDX_ADAPT_SR=33; static const UInt NUM_MV_PREDICTORS=3; /// encoder search class class TEncSearch : public TComPrediction { private: TCoeff** m_ppcQTTempCoeff[MAX_NUM_COMPONENT /* 0->Y, 1->Cb, 2->Cr*/]; TCoeff* m_pcQTTempCoeff[MAX_NUM_COMPONENT]; #if ADAPTIVE_QP_SELECTION TCoeff** m_ppcQTTempArlCoeff[MAX_NUM_COMPONENT]; TCoeff* m_pcQTTempArlCoeff[MAX_NUM_COMPONENT]; #endif UChar* m_puhQTTempTrIdx; UChar* m_puhQTTempCbf[MAX_NUM_COMPONENT]; TComYuv* m_pcQTTempTComYuv; TComYuv m_tmpYuvPred; // To be used in xGetInterPredictionError() to avoid constant memory allocation/deallocation Char* m_phQTTempCrossComponentPredictionAlpha[MAX_NUM_COMPONENT]; Pel* m_pSharedPredTransformSkip[MAX_NUM_COMPONENT]; TCoeff* m_pcQTTempTUCoeff[MAX_NUM_COMPONENT]; UChar* m_puhQTTempTransformSkipFlag[MAX_NUM_COMPONENT]; TComYuv m_pcQTTempTransformSkipTComYuv; #if ADAPTIVE_QP_SELECTION TCoeff* m_ppcQTTempTUArlCoeff[MAX_NUM_COMPONENT]; #endif protected: // interface to option TEncCfg* m_pcEncCfg; // interface to classes TComTrQuant* m_pcTrQuant; TComRdCost* m_pcRdCost; TEncEntropy* m_pcEntropyCoder; // ME parameters Int m_iSearchRange; Int m_bipredSearchRange; // Search range for bi-prediction Int m_iFastSearch; Int m_aaiAdaptSR[MAX_NUM_REF_LIST_ADAPT_SR][MAX_IDX_ADAPT_SR]; TComMv m_cSrchRngLT; TComMv m_cSrchRngRB; TComMv m_acMvPredictors[NUM_MV_PREDICTORS]; // Left, Above, AboveRight. enum MVP_DIR first NUM_MV_PREDICTORS entries are suitable for accessing. // RD computation TEncSbac*** m_pppcRDSbacCoder; TEncSbac* m_pcRDGoOnSbacCoder; DistParam m_cDistParam; // Misc. Pel* m_pTempPel; const UInt* m_puiDFilter; Int m_iMaxDeltaQP; // AMVP cost computation // UInt m_auiMVPIdxCost[AMVP_MAX_NUM_CANDS+1][AMVP_MAX_NUM_CANDS]; UInt m_auiMVPIdxCost[AMVP_MAX_NUM_CANDS+1][AMVP_MAX_NUM_CANDS+1]; //th array bounds TComMv m_integerMv2Nx2N[NUM_REF_PIC_LIST_01][MAX_NUM_REF]; public: TEncSearch(); virtual ~TEncSearch(); Void init( TEncCfg* pcEncCfg, TComTrQuant* pcTrQuant, Int iSearchRange, Int bipredSearchRange, Int iFastSearch, Int iMaxDeltaQP, TEncEntropy* pcEntropyCoder, TComRdCost* pcRdCost, TEncSbac*** pppcRDSbacCoder, TEncSbac* pcRDGoOnSbacCoder ); protected: /// sub-function for motion vector refinement used in fractional-pel accuracy Distortion xPatternRefinement( TComPattern* pcPatternKey, TComMv baseRefMv, Int iFrac, TComMv& rcMvFrac, Bool bAllowUseOfHadamard ); typedef struct { Pel* piRefY; Int iYStride; Int iBestX; Int iBestY; UInt uiBestRound; UInt uiBestDistance; Distortion uiBestSad; UChar ucPointNr; } IntTZSearchStruct; // sub-functions for ME __inline Void xTZSearchHelp ( TComPattern* pcPatternKey, IntTZSearchStruct& rcStruct, const Int iSearchX, const Int iSearchY, const UChar ucPointNr, const UInt uiDistance ); __inline Void xTZ2PointSearch ( TComPattern* pcPatternKey, IntTZSearchStruct& rcStrukt, TComMv* pcMvSrchRngLT, TComMv* pcMvSrchRngRB ); __inline Void xTZ8PointSquareSearch ( TComPattern* pcPatternKey, IntTZSearchStruct& rcStrukt, TComMv* pcMvSrchRngLT, TComMv* pcMvSrchRngRB, const Int iStartX, const Int iStartY, const Int iDist ); __inline Void xTZ8PointDiamondSearch( TComPattern* pcPatternKey, IntTZSearchStruct& rcStrukt, TComMv* pcMvSrchRngLT, TComMv* pcMvSrchRngRB, const Int iStartX, const Int iStartY, const Int iDist ); Void xGetInterPredictionError( TComDataCU* pcCU, TComYuv* pcYuvOrg, Int iPartIdx, Distortion& ruiSAD, Bool Hadamard ); public: Void preestChromaPredMode ( TComDataCU* pcCU, TComYuv* pcOrgYuv, TComYuv* pcPredYuv ); Void estIntraPredQT ( TComDataCU* pcCU, TComYuv* pcOrgYuv, TComYuv* pcPredYuv, TComYuv* pcResiYuv, TComYuv* pcRecoYuv, Pel resiLuma[NUMBER_OF_STORED_RESIDUAL_TYPES][MAX_CU_SIZE * MAX_CU_SIZE], Distortion& ruiDistC, Bool bLumaOnly DEBUG_STRING_FN_DECLARE(sDebug)); Void estIntraPredChromaQT ( TComDataCU* pcCU, TComYuv* pcOrgYuv, TComYuv* pcPredYuv, TComYuv* pcResiYuv, TComYuv* pcRecoYuv, Pel resiLuma[NUMBER_OF_STORED_RESIDUAL_TYPES][MAX_CU_SIZE * MAX_CU_SIZE], Distortion uiPreCalcDistC DEBUG_STRING_FN_DECLARE(sDebug)); /// encoder estimation - inter prediction (non-skip) Void predInterSearch ( TComDataCU* pcCU, TComYuv* pcOrgYuv, TComYuv* pcPredYuv, TComYuv* pcResiYuv, TComYuv* pcRecoYuv DEBUG_STRING_FN_DECLARE(sDebug), Bool bUseRes = false #if AMP_MRG ,Bool bUseMRG = false #endif ); /// encode residual and compute rd-cost for inter mode Void encodeResAndCalcRdInterCU( TComDataCU* pcCU, TComYuv* pcYuvOrg, TComYuv* pcYuvPred, TComYuv* pcYuvResi, TComYuv* pcYuvResiBest, TComYuv* pcYuvRec, Bool bSkipRes DEBUG_STRING_FN_DECLARE(sDebug) ); /// set ME search range Void setAdaptiveSearchRange ( Int iDir, Int iRefIdx, Int iSearchRange) { assert(iDir < MAX_NUM_REF_LIST_ADAPT_SR && iRefIdx<Int(MAX_IDX_ADAPT_SR)); m_aaiAdaptSR[iDir][iRefIdx] = iSearchRange; } Void xEncPCM (TComDataCU* pcCU, UInt uiAbsPartIdx, Pel* piOrg, Pel* piPCM, Pel* piPred, Pel* piResi, Pel* piReco, UInt uiStride, UInt uiWidth, UInt uiHeight, const ComponentID compID ); Void IPCMSearch (TComDataCU* pcCU, TComYuv* pcOrgYuv, TComYuv* rpcPredYuv, TComYuv* rpcResiYuv, TComYuv* rpcRecoYuv ); protected: // ------------------------------------------------------------------------------------------------------------------- // Intra search // ------------------------------------------------------------------------------------------------------------------- Void xEncSubdivCbfQT ( TComTU &rTu, Bool bLuma, Bool bChroma ); Void xEncCoeffQT ( TComTU &rTu, ComponentID component, Bool bRealCoeff ); Void xEncIntraHeader ( TComDataCU* pcCU, UInt uiTrDepth, UInt uiAbsPartIdx, Bool bLuma, Bool bChroma ); UInt xGetIntraBitsQT ( TComTU &rTu, Bool bLuma, Bool bChroma, Bool bRealCoeff ); UInt xGetIntraBitsQTChroma ( TComTU &rTu, ComponentID compID, Bool bRealCoeff ); Void xIntraCodingTUBlock ( TComYuv* pcOrgYuv, TComYuv* pcPredYuv, TComYuv* pcResiYuv, Pel resiLuma[NUMBER_OF_STORED_RESIDUAL_TYPES][MAX_CU_SIZE * MAX_CU_SIZE], const Bool checkCrossCPrediction, Distortion& ruiDist, const ComponentID compID, TComTU &rTu DEBUG_STRING_FN_DECLARE(sTest) ,Int default0Save1Load2 = 0 ); Void xRecurIntraCodingQT ( Bool bLumaOnly, TComYuv* pcOrgYuv, TComYuv* pcPredYuv, TComYuv* pcResiYuv, Pel resiLuma[NUMBER_OF_STORED_RESIDUAL_TYPES][MAX_CU_SIZE * MAX_CU_SIZE], Distortion& ruiDistY, Distortion& ruiDistC, #if HHI_RQT_INTRA_SPEEDUP Bool bCheckFirst, #endif Double& dRDCost, TComTU &rTu DEBUG_STRING_FN_DECLARE(sDebug)); Void xSetIntraResultQT ( Bool bLumaOnly, TComYuv* pcRecoYuv, TComTU &rTu); Void xStoreCrossComponentPredictionResult ( Pel *pResiLuma, const Pel *pBestLuma, TComTU &rTu, const Int xOffset, const Int yOffset, const Int strideResi, const Int strideBest ); Char xCalcCrossComponentPredictionAlpha ( TComTU &rTu, const ComponentID compID, const Pel* piResiL, const Pel* piResiC, const Int width, const Int height, const Int strideL, const Int strideC ); Void xRecurIntraChromaCodingQT ( TComYuv* pcOrgYuv, TComYuv* pcPredYuv, TComYuv* pcResiYuv, Pel resiLuma[NUMBER_OF_STORED_RESIDUAL_TYPES][MAX_CU_SIZE * MAX_CU_SIZE], Distortion& ruiDist, TComTU &rTu DEBUG_STRING_FN_DECLARE(sDebug)); Void xSetIntraResultChromaQT ( TComYuv* pcRecoYuv, TComTU &rTu); Void xStoreIntraResultQT ( const ComponentID first, const ComponentID lastIncl, TComTU &rTu); Void xLoadIntraResultQT ( const ComponentID first, const ComponentID lastIncl, TComTU &rTu); // ------------------------------------------------------------------------------------------------------------------- // Inter search (AMP) // ------------------------------------------------------------------------------------------------------------------- Void xEstimateMvPredAMVP ( TComDataCU* pcCU, TComYuv* pcOrgYuv, UInt uiPartIdx, RefPicList eRefPicList, Int iRefIdx, TComMv& rcMvPred, Bool bFilled = false , Distortion* puiDistBiP = NULL ); Void xCheckBestMVP ( TComDataCU* pcCU, RefPicList eRefPicList, TComMv cMv, TComMv& rcMvPred, Int& riMVPIdx, UInt& ruiBits, Distortion& ruiCost ); Distortion xGetTemplateCost ( TComDataCU* pcCU, UInt uiPartIdx, UInt uiPartAddr, TComYuv* pcOrgYuv, TComYuv* pcTemplateCand, TComMv cMvCand, Int iMVPIdx, Int iMVPNum, RefPicList eRefPicList, Int iRefIdx, Int iSizeX, Int iSizeY ); Void xCopyAMVPInfo ( AMVPInfo* pSrc, AMVPInfo* pDst ); UInt xGetMvpIdxBits ( Int iIdx, Int iNum ); Void xGetBlkBits ( PartSize eCUMode, Bool bPSlice, Int iPartIdx, UInt uiLastMode, UInt uiBlkBit[3]); Void xMergeEstimation ( TComDataCU* pcCU, TComYuv* pcYuvOrg, Int iPartIdx, UInt& uiInterDir, TComMvField* pacMvField, UInt& uiMergeIndex, Distortion& ruiCost, TComMvField* cMvFieldNeighbours, UChar* uhInterDirNeighbours, Int& numValidMergeCand ); Void xRestrictBipredMergeCand ( TComDataCU* pcCU, UInt puIdx, TComMvField* mvFieldNeighbours, UChar* interDirNeighbours, Int numValidMergeCand ); // ------------------------------------------------------------------------------------------------------------------- // motion estimation // ------------------------------------------------------------------------------------------------------------------- Void xMotionEstimation ( TComDataCU* pcCU, TComYuv* pcYuvOrg, Int iPartIdx, RefPicList eRefPicList, TComMv* pcMvPred, Int iRefIdxPred, TComMv& rcMv, UInt& ruiBits, Distortion& ruiCost, Bool bBi = false ); Void xTZSearch ( TComDataCU* pcCU, TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride, TComMv* pcMvSrchRngLT, TComMv* pcMvSrchRngRB, TComMv& rcMv, Distortion& ruiSAD, const TComMv *pIntegerMv2Nx2NPred ); Void xTZSearchSelective ( TComDataCU* pcCU, TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride, TComMv* pcMvSrchRngLT, TComMv* pcMvSrchRngRB, TComMv& rcMv, Distortion& ruiSAD, const TComMv *pIntegerMv2Nx2NPred ); Void xSetSearchRange ( TComDataCU* pcCU, TComMv& cMvPred, Int iSrchRng, TComMv& rcMvSrchRngLT, TComMv& rcMvSrchRngRB ); Void xPatternSearchFast ( TComDataCU* pcCU, TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride, TComMv* pcMvSrchRngLT, TComMv* pcMvSrchRngRB, TComMv& rcMv, Distortion& ruiSAD, const TComMv* pIntegerMv2Nx2NPred ); Void xPatternSearch ( TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride, TComMv* pcMvSrchRngLT, TComMv* pcMvSrchRngRB, TComMv& rcMv, Distortion& ruiSAD ); Void xPatternSearchFracDIF ( Bool bIsLosslessCoded, TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride, TComMv* pcMvInt, TComMv& rcMvHalf, TComMv& rcMvQter, Distortion& ruiCost, Bool biPred ); Void xExtDIFUpSamplingH( TComPattern* pcPattern, Bool biPred ); Void xExtDIFUpSamplingQ( TComPattern* pcPatternKey, TComMv halfPelRef, Bool biPred ); // ------------------------------------------------------------------------------------------------------------------- // T & Q & Q-1 & T-1 // ------------------------------------------------------------------------------------------------------------------- Void xEncodeResidualQT( const ComponentID compID, TComTU &rTu ); Void xEstimateResidualQT( TComYuv* pcResi, Double &rdCost, UInt &ruiBits, Distortion &ruiDist, Distortion *puiZeroDist, TComTU &rTu DEBUG_STRING_FN_DECLARE(sDebug) ); Void xSetResidualQTData( TComYuv* pcResi, Bool bSpatial, TComTU &rTu ); UInt xModeBitsIntra ( TComDataCU* pcCU, UInt uiMode, UInt uiPartOffset, UInt uiDepth, UInt uiInitTrDepth, const ChannelType compID ); UInt xUpdateCandList( UInt uiMode, Double uiCost, UInt uiFastCandNum, UInt * CandModeList, Double * CandCostList ); // ------------------------------------------------------------------------------------------------------------------- // compute symbol bits // ------------------------------------------------------------------------------------------------------------------- Void xAddSymbolBitsInter ( TComDataCU* pcCU, UInt uiQp, UInt uiTrMode, UInt& ruiBits); Void setWpScalingDistParam( TComDataCU* pcCU, Int iRefIdx, RefPicList eRefPicListCur ); inline Void setDistParamComp( ComponentID compIdx ) { m_cDistParam.compIdx = compIdx; } };// END CLASS DEFINITION TEncSearch //! \} #endif // __TENCSEARCH__