474 lines
23 KiB
C++
474 lines
23 KiB
C++
/* 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__
|