HEVC Test Model (HM)  HM-16.3
TComRdCost.h
Go to the documentation of this file.
1 /* The copyright in this software is being made available under the BSD
2  * License, included below. This software may be subject to other third party
3  * and contributor rights, including patent rights, and no such rights are
4  * granted under this license.
5  *
6  * Copyright (c) 2010-2015, ITU/ISO/IEC
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions are met:
11  *
12  * * Redistributions of source code must retain the above copyright notice,
13  * this list of conditions and the following disclaimer.
14  * * Redistributions in binary form must reproduce the above copyright notice,
15  * this list of conditions and the following disclaimer in the documentation
16  * and/or other materials provided with the distribution.
17  * * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
18  * be used to endorse or promote products derived from this software without
19  * specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
25  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
31  * THE POSSIBILITY OF SUCH DAMAGE.
32  */
33 
38 #ifndef __TCOMRDCOST__
39 #define __TCOMRDCOST__
40 
41 
42 #include "CommonDef.h"
43 #include "TComPattern.h"
44 #include "TComMv.h"
45 
46 #include "TComSlice.h"
48 
51 
52 class DistParam;
53 class TComPattern;
54 
55 // ====================================================================================================================
56 // Type definition
57 // ====================================================================================================================
58 
59 // for function pointer
60 typedef Distortion (*FpDistFunc) (DistParam*); // TODO: can this pointer be replaced with a reference? - there are no NULL checks on pointer.
61 
62 // ====================================================================================================================
63 // Class definition
64 // ====================================================================================================================
65 
67 class DistParam
68 {
69 public:
79 
80  Bool bApplyWeight; // whether weighted prediction is used or not
81  WPScalingParam *wpCur; // weighted prediction scaling parameters for current ref
83 
84  // (vertical) subsampling shift (for reducing complexity)
85  // - 0 = no subsampling, 1 = even rows, 2 = every 4th, etc.
87 
89  {
90  pOrg = NULL;
91  pCur = NULL;
92  iStrideOrg = 0;
93  iStrideCur = 0;
94  iRows = 0;
95  iCols = 0;
96  iStep = 1;
97  DistFunc = NULL;
98  iSubShift = 0;
99  bitDepth = 0;
100  }
101 };
102 
105 {
106 private:
107  // for distortion
108 
111  Double m_distortionWeight[MAX_NUM_COMPONENT]; // only chroma values are used.
114 #if RExt__HIGH_BIT_DEPTH_SUPPORT
115  Double m_dLambdaMotionSAD[2 /* 0=standard, 1=for transquant bypass when mixed-lossless cost evaluation enabled*/];
116  Double m_dLambdaMotionSSE[2 /* 0=standard, 1=for transquant bypass when mixed-lossless cost evaluation enabled*/];
117 #else
118  UInt m_uiLambdaMotionSAD[2 /* 0=standard, 1=for transquant bypass when mixed-lossless cost evaluation enabled*/];
119  UInt m_uiLambdaMotionSSE[2 /* 0=standard, 1=for transquant bypass when mixed-lossless cost evaluation enabled*/];
120 #endif
122 
123  // for motion cost
125 #if RExt__HIGH_BIT_DEPTH_SUPPORT
126  Double m_dCost;
127 #else
129 #endif
131 
132 public:
133  TComRdCost();
134  virtual ~TComRdCost();
135 
136  Double calcRdCost ( UInt uiBits, Distortion uiDistortion, Bool bFlag = false, DFunc eDFunc = DF_DEFAULT );
137  Double calcRdCost64( UInt64 uiBits, UInt64 uiDistortion, Bool bFlag = false, DFunc eDFunc = DF_DEFAULT );
138 
139  Void setDistortionWeight ( const ComponentID compID, const Double distortionWeight ) { m_distortionWeight[compID] = distortionWeight; }
140  Void setLambda ( Double dLambda );
141  Void setFrameLambda ( Double dLambda ) { m_dFrameLambda = dLambda; }
142 
144 
145  Double getLambda() { return m_dLambda; }
146  Double getChromaWeight () { return ((m_distortionWeight[COMPONENT_Cb] + m_distortionWeight[COMPONENT_Cr]) / 2.0); }
147 
148  Void setCostMode(CostMode m ) { m_costMode = m; }
149 
150  // Distortion Functions
151  Void init();
152 
153  Void setDistParam( UInt uiBlkWidth, UInt uiBlkHeight, DFunc eDFunc, DistParam& rcDistParam );
154  Void setDistParam( TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride, DistParam& rcDistParam );
155  Void setDistParam( TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride, Int iStep, DistParam& rcDistParam, Bool bHADME=false );
156  Void setDistParam( DistParam& rcDP, Int bitDepth, Pel* p1, Int iStride1, Pel* p2, Int iStride2, Int iWidth, Int iHeight, Bool bHadamard = false );
157 
158  Distortion calcHAD(Int bitDepth, Pel* pi0, Int iStride0, Pel* pi1, Int iStride1, Int iWidth, Int iHeight );
159 
160  // for motion cost
161  UInt xGetComponentBits( Int iVal );
162 #if RExt__HIGH_BIT_DEPTH_SUPPORT
163  Void getMotionCost( Bool bSad, Int iAdd, Bool bIsTransquantBypass ) { m_dCost = (bSad ? m_dLambdaMotionSAD[(bIsTransquantBypass && m_costMode==COST_MIXED_LOSSLESS_LOSSY_CODING) ?1:0] + iAdd : m_dLambdaMotionSSE[(bIsTransquantBypass && m_costMode==COST_MIXED_LOSSLESS_LOSSY_CODING)?1:0] + iAdd); }
164 #else
165  Void getMotionCost( Bool bSad, Int iAdd, Bool bIsTransquantBypass ) { m_uiCost = (bSad ? m_uiLambdaMotionSAD[(bIsTransquantBypass && m_costMode==COST_MIXED_LOSSLESS_LOSSY_CODING) ?1:0] + iAdd : m_uiLambdaMotionSSE[(bIsTransquantBypass && m_costMode==COST_MIXED_LOSSLESS_LOSSY_CODING)?1:0] + iAdd); }
166 #endif
168  {
169  m_mvPredictor = rcMv;
170  }
171  Void setCostScale( Int iCostScale ) { m_iCostScale = iCostScale; }
172  __inline Distortion getCost( Int x, Int y )
173  {
174 #if RExt__HIGH_BIT_DEPTH_SUPPORT
175  return Distortion((m_dCost * getBits(x, y)) / 65536.0);
176 #else
177  return m_uiCost * getBits(x, y) >> 16;
178 #endif
179  }
180 #if RExt__HIGH_BIT_DEPTH_SUPPORT
181  Distortion getCost( UInt b ) { return Distortion(( m_dCost * b ) / 65536.0); }
182 #else
183  Distortion getCost( UInt b ) { return ( m_uiCost * b ) >> 16; }
184 #endif
185  UInt getBits( Int x, Int y )
186  {
187  return xGetComponentBits((x << m_iCostScale) - m_mvPredictor.getHor())
188  + xGetComponentBits((y << m_iCostScale) - m_mvPredictor.getVer());
189  }
190 
191 private:
192 
193  static Distortion xGetSSE ( DistParam* pcDtParam );
194  static Distortion xGetSSE4 ( DistParam* pcDtParam );
195  static Distortion xGetSSE8 ( DistParam* pcDtParam );
196  static Distortion xGetSSE16 ( DistParam* pcDtParam );
197  static Distortion xGetSSE32 ( DistParam* pcDtParam );
198  static Distortion xGetSSE64 ( DistParam* pcDtParam );
199  static Distortion xGetSSE16N ( DistParam* pcDtParam );
200 
201  static Distortion xGetSAD ( DistParam* pcDtParam );
202  static Distortion xGetSAD4 ( DistParam* pcDtParam );
203  static Distortion xGetSAD8 ( DistParam* pcDtParam );
204  static Distortion xGetSAD16 ( DistParam* pcDtParam );
205  static Distortion xGetSAD32 ( DistParam* pcDtParam );
206  static Distortion xGetSAD64 ( DistParam* pcDtParam );
207  static Distortion xGetSAD16N ( DistParam* pcDtParam );
208 
209 #if AMP_SAD
210  static Distortion xGetSAD12 ( DistParam* pcDtParam );
211  static Distortion xGetSAD24 ( DistParam* pcDtParam );
212  static Distortion xGetSAD48 ( DistParam* pcDtParam );
213 
214 #endif
215 
216  static Distortion xGetHADs ( DistParam* pcDtParam );
217  static Distortion xCalcHADs2x2 ( Pel *piOrg, Pel *piCurr, Int iStrideOrg, Int iStrideCur, Int iStep );
218  static Distortion xCalcHADs4x4 ( Pel *piOrg, Pel *piCurr, Int iStrideOrg, Int iStrideCur, Int iStep );
219  static Distortion xCalcHADs8x8 ( Pel *piOrg, Pel *piCurr, Int iStrideOrg, Int iStrideCur, Int iStep );
220 
221 
222 public:
223 
224  Distortion getDistPart(Int bitDepth, Pel* piCur, Int iCurStride, Pel* piOrg, Int iOrgStride, UInt uiBlkWidth, UInt uiBlkHeight, const ComponentID compID, DFunc eDFunc = DF_SSE );
225 
226 };// END CLASS DEFINITION TComRdCost
227 
229 
230 #endif // __TCOMRDCOST__
Distortion getCost(UInt b)
Definition: TComRdCost.h:183
Void setDistortionWeight(const ComponentID compID, const Double distortionWeight)
Definition: TComRdCost.h:139
Double getLambda()
Definition: TComRdCost.h:145
Double getSqrtLambda()
Definition: TComRdCost.h:143
Double getChromaWeight()
Definition: TComRdCost.h:146
Int iCols
Definition: TComRdCost.h:75
static Distortion xCalcHADs2x2(Pel *piOrg, Pel *piCurr, Int iStrideOrg, Int iStrideCur, Int iStep)
UInt getBits(Int x, Int y)
Definition: TComRdCost.h:185
Int getHor() const
Definition: TComMv.h:88
Int iRows
Definition: TComRdCost.h:74
Defines constants, macros and tool parameters.
UInt Distortion
distortion measurement
Definition: TypeDef.h:703
void Void
Definition: TypeDef.h:285
static Distortion xGetSAD48(DistParam *pcDtParam)
Definition: TComRdCost.cpp:890
Double m_dLambda
Definition: TComRdCost.h:112
Pel * pOrg
Definition: TComRdCost.h:70
virtual ~TComRdCost()
Definition: TComRdCost.cpp:51
static Distortion xGetHADs(DistParam *pcDtParam)
static Distortion xGetSSE4(DistParam *pcDtParam)
#define NULL
Definition: CommonDef.h:100
static Distortion xGetSAD64(DistParam *pcDtParam)
Definition: TComRdCost.cpp:798
neighbouring pixel access class for all components
Definition: TComPattern.h:80
slice header and SPS class (header)
unsigned int UInt
Definition: TypeDef.h:297
Short Pel
pixel type
Definition: TypeDef.h:692
static Distortion xGetSSE(DistParam *pcDtParam)
Definition: TComRdCost.cpp:970
UInt m_uiLambdaMotionSSE[2]
Definition: TComRdCost.h:119
static Distortion xGetSAD32(DistParam *pcDtParam)
Definition: TComRdCost.cpp:685
UInt m_uiLambdaMotionSAD[2]
Definition: TComRdCost.h:118
Double calcRdCost64(UInt64 uiBits, UInt64 uiDistortion, Bool bFlag=false, DFunc eDFunc=DF_DEFAULT)
Definition: TComRdCost.cpp:125
general size SSE
Definition: TypeDef.h:427
Void getMotionCost(Bool bSad, Int iAdd, Bool bIsTransquantBypass)
Definition: TComRdCost.h:165
static Distortion xGetSAD24(DistParam *pcDtParam)
Definition: TComRdCost.cpp:745
Pel * pCur
Definition: TComRdCost.h:71
Void setCostMode(CostMode m)
Definition: TComRdCost.h:148
Int m_iCostScale
Definition: TComRdCost.h:130
Double calcRdCost(UInt uiBits, Distortion uiDistortion, Bool bFlag=false, DFunc eDFunc=DF_DEFAULT)
Definition: TComRdCost.cpp:56
Distortion calcHAD(Int bitDepth, Pel *pi0, Int iStride0, Pel *pi1, Int iStride1, Int iWidth, Int iHeight)
Definition: TComRdCost.cpp:398
Void init()
Definition: TComRdCost.cpp:223
Int iSubShift
Definition: TComRdCost.h:86
Distortion(* FpDistFunc)(DistParam *)
Definition: TComRdCost.h:60
Int iStep
Definition: TComRdCost.h:76
bool Bool
Definition: TypeDef.h:286
WPScalingParam * wpCur
Definition: TComRdCost.h:81
static Distortion xGetSAD16(DistParam *pcDtParam)
Definition: TComRdCost.cpp:559
static Distortion xGetSSE8(DistParam *pcDtParam)
distortion parameter class
Definition: TComRdCost.h:67
Int iStrideOrg
Definition: TComRdCost.h:72
TComMv m_mvPredictor
Definition: TComRdCost.h:124
static Distortion xGetSSE16(DistParam *pcDtParam)
RD cost computation class.
Definition: TComRdCost.h:104
static Distortion xGetSSE16N(DistParam *pcDtParam)
Double m_sqrtLambda
Definition: TComRdCost.h:113
UInt xGetComponentBits(Int iVal)
Definition: TComRdCost.cpp:278
static Distortion xCalcHADs8x8(Pel *piOrg, Pel *piCurr, Int iStrideOrg, Int iStrideCur, Int iStep)
static Distortion xGetSSE64(DistParam *pcDtParam)
static Distortion xGetSAD(DistParam *pcDtParam)
Definition: TComRdCost.cpp:465
ComponentID compIdx
Definition: TComRdCost.h:82
motion vector class (header)
Bool bApplyWeight
Definition: TComRdCost.h:80
Distortion getDistPart(Int bitDepth, Pel *piCur, Int iCurStride, Pel *piOrg, Int iOrgStride, UInt uiBlkWidth, UInt uiBlkHeight, const ComponentID compID, DFunc eDFunc=DF_SSE)
Definition: TComRdCost.cpp:433
Int iStrideCur
Definition: TComRdCost.h:73
Double m_distortionWeight[MAX_NUM_COMPONENT]
Definition: TComRdCost.h:111
CostMode
Definition: TypeDef.h:656
Int getVer() const
Definition: TComMv.h:89
Void setDistParam(UInt uiBlkWidth, UInt uiBlkHeight, DFunc eDFunc, DistParam &rcDistParam)
Definition: TComRdCost.cpp:294
Void setLambda(Double dLambda)
Definition: TComRdCost.cpp:194
Void setPredictor(TComMv &rcMv)
Definition: TComRdCost.h:167
RD cost computation namespace (header)
unsigned long long UInt64
Definition: TypeDef.h:318
static Distortion xGetSAD4(DistParam *pcDtParam)
Definition: TComRdCost.cpp:493
Double m_dFrameLambda
Definition: TComRdCost.h:121
static Distortion xGetSSE32(DistParam *pcDtParam)
static Distortion xGetSAD16N(DistParam *pcDtParam)
Definition: TComRdCost.cpp:643
Int bitDepth
Definition: TComRdCost.h:78
neighbouring pixel access classes (header)
Void setFrameLambda(Double dLambda)
Definition: TComRdCost.h:141
static Distortion xCalcHADs4x4(Pel *piOrg, Pel *piCurr, Int iStrideOrg, Int iStrideCur, Int iStep)
CostMode m_costMode
Definition: TComRdCost.h:110
Void setCostScale(Int iCostScale)
Definition: TComRdCost.h:171
FpDistFunc DistFunc
Definition: TComRdCost.h:77
__inline Distortion getCost(Int x, Int y)
Definition: TComRdCost.h:172
int Int
Definition: TypeDef.h:296
basic motion vector class
Definition: TComMv.h:51
ComponentID
Definition: TypeDef.h:368
FpDistFunc m_afpDistortFunc[DF_TOTAL_FUNCTIONS]
Definition: TComRdCost.h:109
static Distortion xGetSAD12(DistParam *pcDtParam)
Definition: TComRdCost.cpp:603
double Double
Definition: TypeDef.h:298
static Distortion xGetSAD8(DistParam *pcDtParam)
Definition: TComRdCost.cpp:524
UInt m_uiCost
Definition: TComRdCost.h:128
DFunc
distortion function index
Definition: TypeDef.h:424