Coverage Report

Created: 2026-10-28 06:18

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/vvenc/source/Lib/CommonLib/RdCost.cpp
Line
Count
Source
1
/* -----------------------------------------------------------------------------
2
The copyright in this software is being made available under the Clear BSD
3
License, included below. No patent rights, trademark rights and/or 
4
other Intellectual Property Rights other than the copyrights concerning 
5
the Software are granted under this license.
6
7
The Clear BSD License
8
9
Copyright (c) 2019-2026, Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. & The VVenC Authors.
10
All rights reserved.
11
12
Redistribution and use in source and binary forms, with or without modification,
13
are permitted (subject to the limitations in the disclaimer below) provided that
14
the following conditions are met:
15
16
     * Redistributions of source code must retain the above copyright notice,
17
     this list of conditions and the following disclaimer.
18
19
     * Redistributions in binary form must reproduce the above copyright
20
     notice, this list of conditions and the following disclaimer in the
21
     documentation and/or other materials provided with the distribution.
22
23
     * Neither the name of the copyright holder nor the names of its
24
     contributors may be used to endorse or promote products derived from this
25
     software without specific prior written permission.
26
27
NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
28
THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
29
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
31
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
32
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
33
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
34
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
35
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
36
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
37
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38
POSSIBILITY OF SUCH DAMAGE.
39
40
41
------------------------------------------------------------------------------------------- */
42
43
44
/** \file     RdCost.cpp
45
    \brief    RD cost computation class
46
*/
47
48
#define DONT_UNDEF_SIZE_AWARE_PER_EL_OP
49
50
#include "RdCost.h"
51
#include "Rom.h"
52
#include "UnitPartitioner.h"
53
#include "SearchSpaceCounter.h"
54
55
56
//! \ingroup CommonLib
57
//! \{
58
59
namespace vvenc {
60
61
62
static Distortion fixWeightedSSE_Core( const DistParam& rcDtParam, uint32_t fixedWeight );
63
64
static void bvBitsLineCore( const Mv* predictors, const int x0, const int xStep, const int count, const int y, const bool useIMV, unsigned* bits );
65
66
RdCost::RdCost()
67
5.97k
  : m_afpDistortFunc{ { nullptr, }, { nullptr, } }
68
5.97k
{
69
5.97k
}
70
71
RdCost::~RdCost()
72
5.97k
{
73
5.97k
}
74
75
void RdCost::setLambda( double dLambda, const BitDepths &bitDepths )
76
13.9k
{
77
13.9k
  m_dLambda          = dLambda;
78
13.9k
  m_DistScale        = double(1<<SCALE_BITS) / m_dLambda;
79
13.9k
  m_dLambdaMotionSAD = sqrt(m_dLambda);
80
13.9k
}
81
82
83
// Initialize Function Pointer by [eDFunc]
84
void RdCost::create( bool enableOpt )
85
5.97k
{
86
5.97k
  m_chromaWeight               = 1.0;
87
5.97k
  m_afpDistortFunc[0][DF_SSE    ] = RdCost::xGetSSE;
88
5.97k
  m_afpDistortFunc[0][DF_SSE2   ] = RdCost::xGetSSE;
89
5.97k
  m_afpDistortFunc[0][DF_SSE4   ] = RdCost::xGetSSE4;
90
5.97k
  m_afpDistortFunc[0][DF_SSE8   ] = RdCost::xGetSSE8;
91
5.97k
  m_afpDistortFunc[0][DF_SSE16  ] = RdCost::xGetSSE16;
92
5.97k
  m_afpDistortFunc[0][DF_SSE32  ] = RdCost::xGetSSE32;
93
5.97k
  m_afpDistortFunc[0][DF_SSE64  ] = RdCost::xGetSSE64;
94
5.97k
  m_afpDistortFunc[0][DF_SSE128 ] = RdCost::xGetSSE128;
95
96
5.97k
  m_afpDistortFunc[0][DF_SAD    ] = RdCost::xGetSAD;
97
5.97k
  m_afpDistortFunc[0][DF_SAD2   ] = RdCost::xGetSAD;
98
5.97k
  m_afpDistortFunc[0][DF_SAD4   ] = RdCost::xGetSAD4;
99
5.97k
  m_afpDistortFunc[0][DF_SAD8   ] = RdCost::xGetSAD8;
100
5.97k
  m_afpDistortFunc[0][DF_SAD16  ] = RdCost::xGetSAD16;
101
5.97k
  m_afpDistortFunc[0][DF_SAD32  ] = RdCost::xGetSAD32;
102
5.97k
  m_afpDistortFunc[0][DF_SAD64  ] = RdCost::xGetSAD64;
103
5.97k
  m_afpDistortFunc[0][DF_SAD128 ] = RdCost::xGetSAD128;
104
105
5.97k
  m_afpDistortFunc[0][DF_HAD    ] = RdCost::xGetHADs<false>;
106
5.97k
  m_afpDistortFunc[0][DF_HAD2   ] = RdCost::xGetHADs<false>;
107
5.97k
  m_afpDistortFunc[0][DF_HAD4   ] = RdCost::xGetHADs<false>;
108
5.97k
  m_afpDistortFunc[0][DF_HAD8   ] = RdCost::xGetHADs<false>;
109
5.97k
  m_afpDistortFunc[0][DF_HAD16  ] = RdCost::xGetHADs<false>;
110
5.97k
  m_afpDistortFunc[0][DF_HAD32  ] = RdCost::xGetHADs<false>;
111
5.97k
  m_afpDistortFunc[0][DF_HAD64  ] = RdCost::xGetHADs<false>;
112
5.97k
  m_afpDistortFunc[0][DF_HAD128 ] = RdCost::xGetHADs<false>;
113
114
5.97k
  m_afpDistortFunc[0][DF_HAD_fast    ] = RdCost::xGetHADs<true>;
115
5.97k
  m_afpDistortFunc[0][DF_HAD2_fast   ] = RdCost::xGetHADs<true>;
116
5.97k
  m_afpDistortFunc[0][DF_HAD4_fast   ] = RdCost::xGetHADs<true>;
117
5.97k
  m_afpDistortFunc[0][DF_HAD8_fast   ] = RdCost::xGetHADs<true>;
118
5.97k
  m_afpDistortFunc[0][DF_HAD16_fast  ] = RdCost::xGetHADs<true>;
119
5.97k
  m_afpDistortFunc[0][DF_HAD32_fast  ] = RdCost::xGetHADs<true>;
120
5.97k
  m_afpDistortFunc[0][DF_HAD64_fast  ] = RdCost::xGetHADs<true>;
121
5.97k
  m_afpDistortFunc[0][DF_HAD128_fast ] = RdCost::xGetHADs<true>;
122
123
  //  m_afpDistortFunc[0][DF_SAD_INTERMEDIATE_BITDEPTH] = RdCost::xGetSAD;
124
5.97k
  m_afpDistortFunc[0][DF_HAD_2SAD ] = RdCost::xGetHAD2SADs;
125
126
5.97k
  m_afpDistortFunc[0][DF_SAD_WITH_MASK] = RdCost::xGetSADwMask;
127
  // m_afpDistortFunc[1] can be used in any case
128
5.97k
  memcpy( m_afpDistortFunc[1], m_afpDistortFunc[0], sizeof(m_afpDistortFunc)/2);
129
130
5.97k
  m_fxdWtdPredPtr = fixWeightedSSE_Core;
131
5.97k
  m_bvBitsLineIBC = bvBitsLineCore;
132
133
5.97k
  m_afpDistortFuncX5[0] = RdCost::xGetSAD8X5;
134
5.97k
  m_afpDistortFuncX5[1] = RdCost::xGetSAD16X5;
135
136
5.97k
#if ENABLE_SIMD_OPT_DIST
137
5.97k
  if( enableOpt )
138
5.97k
  {
139
#ifdef TARGET_SIMD_X86
140
    initRdCostX86();
141
#endif
142
#ifdef TARGET_SIMD_ARM
143
    initRdCostARM();
144
#endif
145
5.97k
  }
146
5.97k
#endif
147
148
5.97k
  m_costMode      = VVENC_COST_STANDARD_LOSSY;
149
5.97k
  m_motionLambda  = 0;
150
5.97k
  m_iCostScale    = 0;
151
5.97k
}
152
153
#if ENABLE_MEASURE_SEARCH_SPACE
154
static Distortion xMeasurePredSearchSpaceInterceptor( const DistParam& dp )
155
{
156
  g_searchSpaceAcc.addPrediction( dp.cur.width, dp.cur.height, toChannelType( dp.compID ) );
157
  return dp.xDistFunc( dp );
158
}
159
160
#endif
161
void RdCost::setDistParam( DistParam &rcDP, const CPelBuf& org, const Pel* piRefY, int iRefStride, int bitDepth, ComponentID compID, int subShiftMode, int useHadamard )
162
64.8k
{
163
64.8k
  rcDP.bitDepth   = bitDepth;
164
64.8k
  rcDP.compID     = compID;
165
166
  // set Original & Curr Pointer / Stride
167
64.8k
  rcDP.org        = org;
168
169
64.8k
  rcDP.cur.buf    = piRefY;
170
64.8k
  rcDP.cur.stride = iRefStride;
171
172
  // set Block Width / Height
173
64.8k
  rcDP.cur.width    = org.width;
174
64.8k
  rcDP.cur.height   = org.height;
175
64.8k
  rcDP.maximumDistortionForEarlyExit = MAX_DISTORTION;
176
177
64.8k
  const int base = (rcDP.bitDepth > 10 || rcDP.applyWeight) ? 1 : 0;
178
64.8k
  if( !useHadamard )
179
64.8k
  {
180
64.8k
    rcDP.distFunc = m_afpDistortFunc[base][ DF_SAD + Log2( org.width ) ];
181
64.8k
  }
182
0
  else
183
0
  {
184
0
    rcDP.distFunc = m_afpDistortFunc[base][( useHadamard == 1 ? DF_HAD : DF_HAD_fast ) + Log2( org.width ) ];
185
0
  }
186
187
  // initialize
188
64.8k
  rcDP.subShift  = 0;
189
190
64.8k
  if( subShiftMode == 1 )
191
0
  {
192
0
    if( rcDP.org.height > 8 && rcDP.org.width <= 128 )
193
0
    {
194
0
      rcDP.subShift = 1;
195
0
    }
196
0
  }
197
64.8k
  else if( subShiftMode == 2 )
198
0
  {
199
0
    if (rcDP.org.height > 8)
200
0
    {
201
0
      rcDP.subShift = 1;
202
0
    }
203
0
  }
204
205
#if ENABLE_MEASURE_SEARCH_SPACE
206
  rcDP.xDistFunc = rcDP.distFunc;
207
  rcDP.distFunc  = xMeasurePredSearchSpaceInterceptor;
208
#endif
209
64.8k
}
210
211
212
DistParam RdCost::setDistParam( const CPelBuf& org, const CPelBuf& cur, int bitDepth, DFunc dfunc )
213
354k
{
214
354k
  int index = dfunc;
215
354k
  if( dfunc != DF_HAD_2SAD )   // DF_HAD_2SAD has a single entry for all sizes
216
322k
  {
217
322k
    index += Log2(org.width);
218
322k
  }
219
220
354k
  const int base = bitDepth > 10 ? 1:0; //TBD: check does SDA ever overflow
221
#if ENABLE_MEASURE_SEARCH_SPACE
222
  DistParam rcDP( org, cur, m_afpDistortFunc[base][index], bitDepth, 0, COMP_Y );
223
  rcDP.xDistFunc = rcDP.distFunc;
224
  rcDP.distFunc  = xMeasurePredSearchSpaceInterceptor;
225
  return rcDP;
226
#else
227
354k
  return DistParam( org, cur, m_afpDistortFunc[base][index], bitDepth, 0, COMP_Y );
228
354k
#endif
229
354k
}
230
231
DistParam RdCost::setDistParam( const Pel* pOrg, const Pel* piRefY, int iOrgStride, int iRefStride, int bitDepth, ComponentID compID, int width, int height, int subShift, bool isDMVR )
232
0
{
233
0
  DistParam rcDP;
234
0
  rcDP.bitDepth   = bitDepth;
235
0
  rcDP.compID     = compID;
236
237
0
  rcDP.org.buf    = pOrg;
238
0
  rcDP.org.stride = iOrgStride;
239
0
  rcDP.org.width  = width;
240
0
  rcDP.org.height = height;
241
242
0
  rcDP.cur.buf    = piRefY;
243
0
  rcDP.cur.stride = iRefStride;
244
0
  rcDP.cur.width  = width;
245
0
  rcDP.cur.height = height;
246
0
  rcDP.subShift   = subShift;
247
248
  //  CHECK( useHadamard || rcDP.useMR, "only used in xDMVRCost with these default parameters (so far...)" );
249
0
  const int base = (rcDP.bitDepth > 10) ? 1 : 0;
250
251
0
  rcDP.distFunc = m_afpDistortFunc[base][ DF_SAD + Log2( width ) ];
252
  
253
0
  if( isDMVR )
254
0
  {
255
0
    rcDP.dmvrSadX5 = m_afpDistortFuncX5[Log2( width ) - 3];
256
0
  }
257
258
#if ENABLE_MEASURE_SEARCH_SPACE
259
  if( !isDMVR )
260
  {
261
    // DMVT is part of the decoder complexity
262
    rcDP.xDistFunc = rcDP.distFunc;
263
    rcDP.distFunc = xMeasurePredSearchSpaceInterceptor;
264
  }
265
266
#endif
267
0
  return rcDP;
268
0
}
269
270
Distortion RdCost::getDistPart( const CPelBuf& org, const CPelBuf& cur, int bitDepth, const ComponentID compId, DFunc eDFunc )
271
3.47M
{
272
3.47M
  DistParam dp( org, cur, nullptr, bitDepth, 0, compId );
273
# if ENABLE_MEASURE_SEARCH_SPACE
274
  g_searchSpaceAcc.addPrediction( dp.cur.width, dp.cur.height, toChannelType( dp.compID ) );
275
#endif
276
3.47M
  Distortion dist;
277
3.47M
  if( ( org.width == 1 ) )
278
0
  {
279
0
    dist = xGetSSE( dp );
280
0
  }
281
3.47M
  else
282
3.47M
  {
283
3.47M
    const int base = (bitDepth > 10) ? 1 : 0;
284
3.47M
    dist = m_afpDistortFunc[base][eDFunc + Log2(org.width)](dp);
285
3.47M
  }
286
3.47M
  if (isChroma(compId))
287
2.90M
  {
288
2.90M
    return ((Distortion) (m_distortionWeight[ compId ] * dist));
289
2.90M
  }
290
566k
  else
291
566k
  {
292
566k
    return dist;
293
566k
  }
294
3.47M
}
295
296
// ====================================================================================================================
297
// Distortion functions
298
// ====================================================================================================================
299
300
// --------------------------------------------------------------------------------------------------------------------
301
// SAD
302
// --------------------------------------------------------------------------------------------------------------------
303
304
Distortion RdCost::xGetSAD( const DistParam& rcDtParam )
305
0
{
306
0
  if ( rcDtParam.applyWeight )
307
0
  {
308
0
    THROW(" no support");
309
0
  }
310
311
0
  const Pel* piOrg           = rcDtParam.org.buf;
312
0
  const Pel* piCur           = rcDtParam.cur.buf;
313
0
  const int  iCols           = rcDtParam.org.width;
314
0
        int  iRows           = rcDtParam.org.height;
315
0
  const int  iSubShift       = rcDtParam.subShift;
316
0
  const int  iSubStep        = ( 1 << iSubShift );
317
0
  const int  iStrideCur      = rcDtParam.cur.stride * iSubStep;
318
0
  const int  iStrideOrg      = rcDtParam.org.stride * iSubStep;
319
0
  const uint32_t distortionShift = DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth);
320
321
0
  Distortion uiSum = 0;
322
323
0
  for( ; iRows != 0; iRows -= iSubStep )
324
0
  {
325
0
    for (int n = 0; n < iCols; n++ )
326
0
    {
327
0
      uiSum += abs( piOrg[n] - piCur[n] );
328
0
    }
329
0
    if (rcDtParam.maximumDistortionForEarlyExit < ( uiSum >> distortionShift ))
330
0
    {
331
0
      return ( uiSum >> distortionShift );
332
0
    }
333
0
    piOrg += iStrideOrg;
334
0
    piCur += iStrideCur;
335
0
  }
336
337
0
  uiSum <<= iSubShift;
338
0
  return ( uiSum >> distortionShift );
339
0
}
340
341
Distortion RdCost::xGetSAD4( const DistParam& rcDtParam )
342
161k
{
343
161k
  if ( rcDtParam.applyWeight )
344
0
  {
345
0
    THROW(" no support");
346
0
  }
347
348
161k
  const Pel* piOrg   = rcDtParam.org.buf;
349
161k
  const Pel* piCur   = rcDtParam.cur.buf;
350
161k
  int  iRows         = rcDtParam.org.height;
351
161k
  int  iSubShift     = rcDtParam.subShift;
352
161k
  int  iSubStep      = ( 1 << iSubShift );
353
161k
  int  iStrideCur    = rcDtParam.cur.stride * iSubStep;
354
161k
  int  iStrideOrg    = rcDtParam.org.stride * iSubStep;
355
356
161k
  Distortion uiSum = 0;
357
358
2.01M
  for( ; iRows != 0; iRows -= iSubStep )
359
1.84M
  {
360
1.84M
    uiSum += abs( piOrg[0] - piCur[0] );
361
1.84M
    uiSum += abs( piOrg[1] - piCur[1] );
362
1.84M
    uiSum += abs( piOrg[2] - piCur[2] );
363
1.84M
    uiSum += abs( piOrg[3] - piCur[3] );
364
365
1.84M
    piOrg += iStrideOrg;
366
1.84M
    piCur += iStrideCur;
367
1.84M
  }
368
369
161k
  uiSum <<= iSubShift;
370
161k
  return (uiSum >> DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth));
371
161k
}
372
373
Distortion RdCost::xGetSAD8( const DistParam& rcDtParam )
374
703k
{
375
703k
  if ( rcDtParam.applyWeight )
376
0
  {
377
0
    THROW(" no support");
378
0
  }
379
380
703k
  const Pel* piOrg      = rcDtParam.org.buf;
381
703k
  const Pel* piCur      = rcDtParam.cur.buf;
382
703k
  int  iRows            = rcDtParam.org.height;
383
703k
  int  iSubShift        = rcDtParam.subShift;
384
703k
  int  iSubStep         = ( 1 << iSubShift );
385
703k
  int  iStrideCur       = rcDtParam.cur.stride * iSubStep;
386
703k
  int  iStrideOrg       = rcDtParam.org.stride * iSubStep;
387
388
703k
  Distortion uiSum = 0;
389
390
15.1M
  for( ; iRows != 0; iRows-=iSubStep )
391
14.4M
  {
392
14.4M
    uiSum += abs( piOrg[0] - piCur[0] );
393
14.4M
    uiSum += abs( piOrg[1] - piCur[1] );
394
14.4M
    uiSum += abs( piOrg[2] - piCur[2] );
395
14.4M
    uiSum += abs( piOrg[3] - piCur[3] );
396
14.4M
    uiSum += abs( piOrg[4] - piCur[4] );
397
14.4M
    uiSum += abs( piOrg[5] - piCur[5] );
398
14.4M
    uiSum += abs( piOrg[6] - piCur[6] );
399
14.4M
    uiSum += abs( piOrg[7] - piCur[7] );
400
401
14.4M
    piOrg += iStrideOrg;
402
14.4M
    piCur += iStrideCur;
403
14.4M
  }
404
405
703k
  uiSum <<= iSubShift;
406
703k
  return (uiSum >> DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth));
407
703k
}
408
409
Distortion RdCost::xGetSAD16( const DistParam& rcDtParam )
410
616k
{
411
616k
  if ( rcDtParam.applyWeight )
412
0
  {
413
0
    THROW(" no support");
414
0
  }
415
416
616k
  const Pel* piOrg      = rcDtParam.org.buf;
417
616k
  const Pel* piCur      = rcDtParam.cur.buf;
418
616k
  int  iRows            = rcDtParam.org.height;
419
616k
  int  iSubShift        = rcDtParam.subShift;
420
616k
  int  iSubStep         = ( 1 << iSubShift );
421
616k
  int  iStrideCur       = rcDtParam.cur.stride * iSubStep;
422
616k
  int  iStrideOrg       = rcDtParam.org.stride * iSubStep;
423
424
616k
  Distortion uiSum = 0;
425
426
14.0M
  for( ; iRows != 0; iRows -= iSubStep )
427
13.4M
  {
428
13.4M
    uiSum += abs( piOrg[0] - piCur[0] );
429
13.4M
    uiSum += abs( piOrg[1] - piCur[1] );
430
13.4M
    uiSum += abs( piOrg[2] - piCur[2] );
431
13.4M
    uiSum += abs( piOrg[3] - piCur[3] );
432
13.4M
    uiSum += abs( piOrg[4] - piCur[4] );
433
13.4M
    uiSum += abs( piOrg[5] - piCur[5] );
434
13.4M
    uiSum += abs( piOrg[6] - piCur[6] );
435
13.4M
    uiSum += abs( piOrg[7] - piCur[7] );
436
13.4M
    uiSum += abs( piOrg[8] - piCur[8] );
437
13.4M
    uiSum += abs( piOrg[9] - piCur[9] );
438
13.4M
    uiSum += abs( piOrg[10] - piCur[10] );
439
13.4M
    uiSum += abs( piOrg[11] - piCur[11] );
440
13.4M
    uiSum += abs( piOrg[12] - piCur[12] );
441
13.4M
    uiSum += abs( piOrg[13] - piCur[13] );
442
13.4M
    uiSum += abs( piOrg[14] - piCur[14] );
443
13.4M
    uiSum += abs( piOrg[15] - piCur[15] );
444
445
13.4M
    piOrg += iStrideOrg;
446
13.4M
    piCur += iStrideCur;
447
13.4M
  }
448
449
616k
  uiSum <<= iSubShift;
450
616k
  return (uiSum >> DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth));
451
616k
}
452
453
454
Distortion RdCost::xGetSAD128( const DistParam &rcDtParam )
455
0
{
456
0
  const Pel* piOrg  = rcDtParam.org.buf;
457
0
  const Pel* piCur  = rcDtParam.cur.buf;
458
0
  int  iRows        = rcDtParam.org.height;
459
0
  int  iCols        = rcDtParam.org.width;
460
0
  int  iSubShift    = rcDtParam.subShift;
461
0
  int  iSubStep     = ( 1 << iSubShift );
462
0
  int  iStrideCur   = rcDtParam.cur.stride * iSubStep;
463
0
  int  iStrideOrg   = rcDtParam.org.stride * iSubStep;
464
465
0
  Distortion uiSum = 0;
466
467
0
  for( ; iRows != 0; iRows-=iSubStep )
468
0
  {
469
0
    for (int n = 0; n < iCols; n+=16 )
470
0
    {
471
0
      uiSum += abs( piOrg[n+ 0] - piCur[n+ 0] );
472
0
      uiSum += abs( piOrg[n+ 1] - piCur[n+ 1] );
473
0
      uiSum += abs( piOrg[n+ 2] - piCur[n+ 2] );
474
0
      uiSum += abs( piOrg[n+ 3] - piCur[n+ 3] );
475
0
      uiSum += abs( piOrg[n+ 4] - piCur[n+ 4] );
476
0
      uiSum += abs( piOrg[n+ 5] - piCur[n+ 5] );
477
0
      uiSum += abs( piOrg[n+ 6] - piCur[n+ 6] );
478
0
      uiSum += abs( piOrg[n+ 7] - piCur[n+ 7] );
479
0
      uiSum += abs( piOrg[n+ 8] - piCur[n+ 8] );
480
0
      uiSum += abs( piOrg[n+ 9] - piCur[n+ 9] );
481
0
      uiSum += abs( piOrg[n+10] - piCur[n+10] );
482
0
      uiSum += abs( piOrg[n+11] - piCur[n+11] );
483
0
      uiSum += abs( piOrg[n+12] - piCur[n+12] );
484
0
      uiSum += abs( piOrg[n+13] - piCur[n+13] );
485
0
      uiSum += abs( piOrg[n+14] - piCur[n+14] );
486
0
      uiSum += abs( piOrg[n+15] - piCur[n+15] );
487
0
    }
488
0
    piOrg += iStrideOrg;
489
0
    piCur += iStrideCur;
490
0
  }
491
492
0
  uiSum <<= iSubShift;
493
0
  return (uiSum >> DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth));
494
0
}
495
496
Distortion RdCost::xGetSAD32( const DistParam &rcDtParam )
497
891k
{
498
891k
  if ( rcDtParam.applyWeight )
499
0
  {
500
0
    THROW(" no support");
501
0
  }
502
503
891k
  const Pel* piOrg      = rcDtParam.org.buf;
504
891k
  const Pel* piCur      = rcDtParam.cur.buf;
505
891k
  int  iRows            = rcDtParam.org.height;
506
891k
  int  iSubShift        = rcDtParam.subShift;
507
891k
  int  iSubStep         = ( 1 << iSubShift );
508
891k
  int  iStrideCur       = rcDtParam.cur.stride * iSubStep;
509
891k
  int  iStrideOrg       = rcDtParam.org.stride * iSubStep;
510
511
891k
  Distortion uiSum = 0;
512
513
17.7M
  for( ; iRows != 0; iRows-=iSubStep )
514
16.8M
  {
515
16.8M
    uiSum += abs( piOrg[0] - piCur[0] );
516
16.8M
    uiSum += abs( piOrg[1] - piCur[1] );
517
16.8M
    uiSum += abs( piOrg[2] - piCur[2] );
518
16.8M
    uiSum += abs( piOrg[3] - piCur[3] );
519
16.8M
    uiSum += abs( piOrg[4] - piCur[4] );
520
16.8M
    uiSum += abs( piOrg[5] - piCur[5] );
521
16.8M
    uiSum += abs( piOrg[6] - piCur[6] );
522
16.8M
    uiSum += abs( piOrg[7] - piCur[7] );
523
16.8M
    uiSum += abs( piOrg[8] - piCur[8] );
524
16.8M
    uiSum += abs( piOrg[9] - piCur[9] );
525
16.8M
    uiSum += abs( piOrg[10] - piCur[10] );
526
16.8M
    uiSum += abs( piOrg[11] - piCur[11] );
527
16.8M
    uiSum += abs( piOrg[12] - piCur[12] );
528
16.8M
    uiSum += abs( piOrg[13] - piCur[13] );
529
16.8M
    uiSum += abs( piOrg[14] - piCur[14] );
530
16.8M
    uiSum += abs( piOrg[15] - piCur[15] );
531
16.8M
    uiSum += abs( piOrg[16] - piCur[16] );
532
16.8M
    uiSum += abs( piOrg[17] - piCur[17] );
533
16.8M
    uiSum += abs( piOrg[18] - piCur[18] );
534
16.8M
    uiSum += abs( piOrg[19] - piCur[19] );
535
16.8M
    uiSum += abs( piOrg[20] - piCur[20] );
536
16.8M
    uiSum += abs( piOrg[21] - piCur[21] );
537
16.8M
    uiSum += abs( piOrg[22] - piCur[22] );
538
16.8M
    uiSum += abs( piOrg[23] - piCur[23] );
539
16.8M
    uiSum += abs( piOrg[24] - piCur[24] );
540
16.8M
    uiSum += abs( piOrg[25] - piCur[25] );
541
16.8M
    uiSum += abs( piOrg[26] - piCur[26] );
542
16.8M
    uiSum += abs( piOrg[27] - piCur[27] );
543
16.8M
    uiSum += abs( piOrg[28] - piCur[28] );
544
16.8M
    uiSum += abs( piOrg[29] - piCur[29] );
545
16.8M
    uiSum += abs( piOrg[30] - piCur[30] );
546
16.8M
    uiSum += abs( piOrg[31] - piCur[31] );
547
548
16.8M
    piOrg += iStrideOrg;
549
16.8M
    piCur += iStrideCur;
550
16.8M
  }
551
552
891k
  uiSum <<= iSubShift;
553
891k
  return (uiSum >> DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth));
554
891k
}
555
556
557
Distortion RdCost::xGetSAD64( const DistParam &rcDtParam )
558
12.0k
{
559
12.0k
  if ( rcDtParam.applyWeight )
560
0
  {
561
0
    THROW(" no support");
562
0
  }
563
564
12.0k
  const Pel* piOrg      = rcDtParam.org.buf;
565
12.0k
  const Pel* piCur      = rcDtParam.cur.buf;
566
12.0k
  int  iRows            = rcDtParam.org.height;
567
12.0k
  int  iSubShift        = rcDtParam.subShift;
568
12.0k
  int  iSubStep         = ( 1 << iSubShift );
569
12.0k
  int  iStrideCur       = rcDtParam.cur.stride * iSubStep;
570
12.0k
  int  iStrideOrg       = rcDtParam.org.stride * iSubStep;
571
572
12.0k
  Distortion uiSum = 0;
573
574
782k
  for( ; iRows != 0; iRows-=iSubStep )
575
770k
  {
576
770k
    uiSum += abs( piOrg[0] - piCur[0] );
577
770k
    uiSum += abs( piOrg[1] - piCur[1] );
578
770k
    uiSum += abs( piOrg[2] - piCur[2] );
579
770k
    uiSum += abs( piOrg[3] - piCur[3] );
580
770k
    uiSum += abs( piOrg[4] - piCur[4] );
581
770k
    uiSum += abs( piOrg[5] - piCur[5] );
582
770k
    uiSum += abs( piOrg[6] - piCur[6] );
583
770k
    uiSum += abs( piOrg[7] - piCur[7] );
584
770k
    uiSum += abs( piOrg[8] - piCur[8] );
585
770k
    uiSum += abs( piOrg[9] - piCur[9] );
586
770k
    uiSum += abs( piOrg[10] - piCur[10] );
587
770k
    uiSum += abs( piOrg[11] - piCur[11] );
588
770k
    uiSum += abs( piOrg[12] - piCur[12] );
589
770k
    uiSum += abs( piOrg[13] - piCur[13] );
590
770k
    uiSum += abs( piOrg[14] - piCur[14] );
591
770k
    uiSum += abs( piOrg[15] - piCur[15] );
592
770k
    uiSum += abs( piOrg[16] - piCur[16] );
593
770k
    uiSum += abs( piOrg[17] - piCur[17] );
594
770k
    uiSum += abs( piOrg[18] - piCur[18] );
595
770k
    uiSum += abs( piOrg[19] - piCur[19] );
596
770k
    uiSum += abs( piOrg[20] - piCur[20] );
597
770k
    uiSum += abs( piOrg[21] - piCur[21] );
598
770k
    uiSum += abs( piOrg[22] - piCur[22] );
599
770k
    uiSum += abs( piOrg[23] - piCur[23] );
600
770k
    uiSum += abs( piOrg[24] - piCur[24] );
601
770k
    uiSum += abs( piOrg[25] - piCur[25] );
602
770k
    uiSum += abs( piOrg[26] - piCur[26] );
603
770k
    uiSum += abs( piOrg[27] - piCur[27] );
604
770k
    uiSum += abs( piOrg[28] - piCur[28] );
605
770k
    uiSum += abs( piOrg[29] - piCur[29] );
606
770k
    uiSum += abs( piOrg[30] - piCur[30] );
607
770k
    uiSum += abs( piOrg[31] - piCur[31] );
608
770k
    uiSum += abs( piOrg[32] - piCur[32] );
609
770k
    uiSum += abs( piOrg[33] - piCur[33] );
610
770k
    uiSum += abs( piOrg[34] - piCur[34] );
611
770k
    uiSum += abs( piOrg[35] - piCur[35] );
612
770k
    uiSum += abs( piOrg[36] - piCur[36] );
613
770k
    uiSum += abs( piOrg[37] - piCur[37] );
614
770k
    uiSum += abs( piOrg[38] - piCur[38] );
615
770k
    uiSum += abs( piOrg[39] - piCur[39] );
616
770k
    uiSum += abs( piOrg[40] - piCur[40] );
617
770k
    uiSum += abs( piOrg[41] - piCur[41] );
618
770k
    uiSum += abs( piOrg[42] - piCur[42] );
619
770k
    uiSum += abs( piOrg[43] - piCur[43] );
620
770k
    uiSum += abs( piOrg[44] - piCur[44] );
621
770k
    uiSum += abs( piOrg[45] - piCur[45] );
622
770k
    uiSum += abs( piOrg[46] - piCur[46] );
623
770k
    uiSum += abs( piOrg[47] - piCur[47] );
624
770k
    uiSum += abs( piOrg[48] - piCur[48] );
625
770k
    uiSum += abs( piOrg[49] - piCur[49] );
626
770k
    uiSum += abs( piOrg[50] - piCur[50] );
627
770k
    uiSum += abs( piOrg[51] - piCur[51] );
628
770k
    uiSum += abs( piOrg[52] - piCur[52] );
629
770k
    uiSum += abs( piOrg[53] - piCur[53] );
630
770k
    uiSum += abs( piOrg[54] - piCur[54] );
631
770k
    uiSum += abs( piOrg[55] - piCur[55] );
632
770k
    uiSum += abs( piOrg[56] - piCur[56] );
633
770k
    uiSum += abs( piOrg[57] - piCur[57] );
634
770k
    uiSum += abs( piOrg[58] - piCur[58] );
635
770k
    uiSum += abs( piOrg[59] - piCur[59] );
636
770k
    uiSum += abs( piOrg[60] - piCur[60] );
637
770k
    uiSum += abs( piOrg[61] - piCur[61] );
638
770k
    uiSum += abs( piOrg[62] - piCur[62] );
639
770k
    uiSum += abs( piOrg[63] - piCur[63] );
640
641
770k
    piOrg += iStrideOrg;
642
770k
    piCur += iStrideCur;
643
770k
  }
644
645
12.0k
  uiSum <<= iSubShift;
646
12.0k
  return (uiSum >> DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth));
647
12.0k
}
648
649
650
// --------------------------------------------------------------------------------------------------------------------
651
// SSE
652
// --------------------------------------------------------------------------------------------------------------------
653
654
Distortion RdCost::xGetSSE( const DistParam &rcDtParam )
655
0
{
656
0
  if ( rcDtParam.applyWeight )
657
0
  {
658
0
    THROW(" no support");
659
0
  }
660
661
0
  const Pel* piOrg      = rcDtParam.org.buf;
662
0
  const Pel* piCur      = rcDtParam.cur.buf;
663
0
  int  iRows            = rcDtParam.org.height;
664
0
  int  iCols            = rcDtParam.org.width;
665
0
  int  iStrideCur       = rcDtParam.cur.stride;
666
0
  int  iStrideOrg       = rcDtParam.org.stride;
667
668
0
  Distortion uiSum   = 0;
669
0
  uint32_t uiShift = DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth) << 1;
670
671
0
  Intermediate_Int iTemp;
672
673
0
  for( ; iRows != 0; iRows-- )
674
0
  {
675
0
    for (int n = 0; n < iCols; n++ )
676
0
    {
677
0
      iTemp = piOrg[n  ] - piCur[n  ];
678
0
      uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
679
0
    }
680
0
    piOrg += iStrideOrg;
681
0
    piCur += iStrideCur;
682
0
  }
683
684
0
  return ( uiSum );
685
0
}
686
687
Distortion RdCost::xGetSSE4( const DistParam &rcDtParam )
688
692k
{
689
692k
  if ( rcDtParam.applyWeight )
690
0
  {
691
0
    CHECK( rcDtParam.org.width != 4, "Invalid size" );
692
0
    THROW(" no support");
693
0
  }
694
695
692k
  const Pel* piOrg   = rcDtParam.org.buf;
696
692k
  const Pel* piCur   = rcDtParam.cur.buf;
697
692k
  int  iRows         = rcDtParam.org.height;
698
692k
  int  iStrideOrg    = rcDtParam.org.stride;
699
692k
  int  iStrideCur    = rcDtParam.cur.stride;
700
701
692k
  Distortion uiSum   = 0;
702
692k
  uint32_t uiShift = DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth) << 1;
703
704
692k
  Intermediate_Int  iTemp;
705
706
9.83M
  for( ; iRows != 0; iRows-- )
707
9.13M
  {
708
709
9.13M
    iTemp = piOrg[0] - piCur[0]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
710
9.13M
    iTemp = piOrg[1] - piCur[1]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
711
9.13M
    iTemp = piOrg[2] - piCur[2]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
712
9.13M
    iTemp = piOrg[3] - piCur[3]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
713
714
9.13M
    piOrg += iStrideOrg;
715
9.13M
    piCur += iStrideCur;
716
9.13M
  }
717
718
692k
  return ( uiSum );
719
692k
}
720
721
Distortion RdCost::xGetSSE8( const DistParam &rcDtParam )
722
1.06M
{
723
1.06M
  if ( rcDtParam.applyWeight )
724
0
  {
725
0
    CHECK( rcDtParam.org.width != 8, "Invalid size" );
726
0
    THROW(" no support");
727
0
  }
728
729
1.06M
  const Pel* piOrg   = rcDtParam.org.buf;
730
1.06M
  const Pel* piCur   = rcDtParam.cur.buf;
731
1.06M
  int  iRows         = rcDtParam.org.height;
732
1.06M
  int  iStrideOrg    = rcDtParam.org.stride;
733
1.06M
  int  iStrideCur    = rcDtParam.cur.stride;
734
735
1.06M
  Distortion uiSum   = 0;
736
1.06M
  uint32_t uiShift = DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth) << 1;
737
738
1.06M
  Intermediate_Int  iTemp;
739
740
16.9M
  for( ; iRows != 0; iRows-- )
741
15.8M
  {
742
15.8M
    iTemp = piOrg[0] - piCur[0]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
743
15.8M
    iTemp = piOrg[1] - piCur[1]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
744
15.8M
    iTemp = piOrg[2] - piCur[2]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
745
15.8M
    iTemp = piOrg[3] - piCur[3]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
746
15.8M
    iTemp = piOrg[4] - piCur[4]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
747
15.8M
    iTemp = piOrg[5] - piCur[5]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
748
15.8M
    iTemp = piOrg[6] - piCur[6]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
749
15.8M
    iTemp = piOrg[7] - piCur[7]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
750
751
15.8M
    piOrg += iStrideOrg;
752
15.8M
    piCur += iStrideCur;
753
15.8M
  }
754
755
1.06M
  return ( uiSum );
756
1.06M
}
757
758
Distortion RdCost::xGetSSE16( const DistParam &rcDtParam )
759
883k
{
760
883k
  if ( rcDtParam.applyWeight )
761
0
  {
762
0
    CHECK( rcDtParam.org.width != 16, "Invalid size" );
763
0
    THROW(" no support");
764
0
  }
765
766
883k
  const Pel* piOrg   = rcDtParam.org.buf;
767
883k
  const Pel* piCur   = rcDtParam.cur.buf;
768
883k
  int  iRows         = rcDtParam.org.height;
769
883k
  int  iStrideOrg    = rcDtParam.org.stride;
770
883k
  int  iStrideCur    = rcDtParam.cur.stride;
771
772
883k
  Distortion uiSum   = 0;
773
883k
  uint32_t uiShift = DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth) << 1;
774
775
883k
  Intermediate_Int  iTemp;
776
777
14.0M
  for( ; iRows != 0; iRows-- )
778
13.1M
  {
779
780
13.1M
    iTemp = piOrg[ 0] - piCur[ 0]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
781
13.1M
    iTemp = piOrg[ 1] - piCur[ 1]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
782
13.1M
    iTemp = piOrg[ 2] - piCur[ 2]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
783
13.1M
    iTemp = piOrg[ 3] - piCur[ 3]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
784
13.1M
    iTemp = piOrg[ 4] - piCur[ 4]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
785
13.1M
    iTemp = piOrg[ 5] - piCur[ 5]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
786
13.1M
    iTemp = piOrg[ 6] - piCur[ 6]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
787
13.1M
    iTemp = piOrg[ 7] - piCur[ 7]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
788
13.1M
    iTemp = piOrg[ 8] - piCur[ 8]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
789
13.1M
    iTemp = piOrg[ 9] - piCur[ 9]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
790
13.1M
    iTemp = piOrg[10] - piCur[10]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
791
13.1M
    iTemp = piOrg[11] - piCur[11]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
792
13.1M
    iTemp = piOrg[12] - piCur[12]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
793
13.1M
    iTemp = piOrg[13] - piCur[13]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
794
13.1M
    iTemp = piOrg[14] - piCur[14]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
795
13.1M
    iTemp = piOrg[15] - piCur[15]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
796
797
13.1M
    piOrg += iStrideOrg;
798
13.1M
    piCur += iStrideCur;
799
13.1M
  }
800
801
883k
  return ( uiSum );
802
883k
}
803
804
Distortion RdCost::xGetSSE128( const DistParam &rcDtParam )
805
0
{
806
0
  if ( rcDtParam.applyWeight )
807
0
  {
808
0
    THROW(" no support");
809
0
  }
810
0
  const Pel* piOrg   = rcDtParam.org.buf;
811
0
  const Pel* piCur   = rcDtParam.cur.buf;
812
0
  int  iRows         = rcDtParam.org.height;
813
0
  int  iCols         = rcDtParam.org.width;
814
0
  int  iStrideOrg    = rcDtParam.org.stride;
815
0
  int  iStrideCur    = rcDtParam.cur.stride;
816
817
0
  Distortion uiSum   = 0;
818
0
  uint32_t uiShift = DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth) << 1;
819
820
0
  Intermediate_Int  iTemp;
821
822
0
  for( ; iRows != 0; iRows-- )
823
0
  {
824
0
    for (int n = 0; n < iCols; n+=16 )
825
0
    {
826
827
0
      iTemp = piOrg[n+ 0] - piCur[n+ 0]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
828
0
      iTemp = piOrg[n+ 1] - piCur[n+ 1]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
829
0
      iTemp = piOrg[n+ 2] - piCur[n+ 2]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
830
0
      iTemp = piOrg[n+ 3] - piCur[n+ 3]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
831
0
      iTemp = piOrg[n+ 4] - piCur[n+ 4]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
832
0
      iTemp = piOrg[n+ 5] - piCur[n+ 5]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
833
0
      iTemp = piOrg[n+ 6] - piCur[n+ 6]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
834
0
      iTemp = piOrg[n+ 7] - piCur[n+ 7]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
835
0
      iTemp = piOrg[n+ 8] - piCur[n+ 8]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
836
0
      iTemp = piOrg[n+ 9] - piCur[n+ 9]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
837
0
      iTemp = piOrg[n+10] - piCur[n+10]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
838
0
      iTemp = piOrg[n+11] - piCur[n+11]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
839
0
      iTemp = piOrg[n+12] - piCur[n+12]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
840
0
      iTemp = piOrg[n+13] - piCur[n+13]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
841
0
      iTemp = piOrg[n+14] - piCur[n+14]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
842
0
      iTemp = piOrg[n+15] - piCur[n+15]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
843
844
0
    }
845
0
    piOrg += iStrideOrg;
846
0
    piCur += iStrideCur;
847
0
  }
848
849
0
  return ( uiSum );
850
0
}
851
852
Distortion RdCost::xGetSSE32( const DistParam &rcDtParam )
853
740k
{
854
740k
  if ( rcDtParam.applyWeight )
855
0
  {
856
0
    THROW(" no support");
857
0
  }
858
859
740k
  const Pel* piOrg   = rcDtParam.org.buf;
860
740k
  const Pel* piCur   = rcDtParam.cur.buf;
861
740k
  int  iRows         = rcDtParam.org.height;
862
740k
  int  iStrideOrg    = rcDtParam.org.stride;
863
740k
  int  iStrideCur    = rcDtParam.cur.stride;
864
865
740k
  Distortion uiSum   = 0;
866
740k
  uint32_t uiShift = DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth) << 1;
867
868
740k
  Intermediate_Int  iTemp;
869
870
13.2M
  for( ; iRows != 0; iRows-- )
871
12.5M
  {
872
873
12.5M
    iTemp = piOrg[ 0] - piCur[ 0]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
874
12.5M
    iTemp = piOrg[ 1] - piCur[ 1]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
875
12.5M
    iTemp = piOrg[ 2] - piCur[ 2]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
876
12.5M
    iTemp = piOrg[ 3] - piCur[ 3]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
877
12.5M
    iTemp = piOrg[ 4] - piCur[ 4]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
878
12.5M
    iTemp = piOrg[ 5] - piCur[ 5]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
879
12.5M
    iTemp = piOrg[ 6] - piCur[ 6]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
880
12.5M
    iTemp = piOrg[ 7] - piCur[ 7]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
881
12.5M
    iTemp = piOrg[ 8] - piCur[ 8]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
882
12.5M
    iTemp = piOrg[ 9] - piCur[ 9]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
883
12.5M
    iTemp = piOrg[10] - piCur[10]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
884
12.5M
    iTemp = piOrg[11] - piCur[11]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
885
12.5M
    iTemp = piOrg[12] - piCur[12]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
886
12.5M
    iTemp = piOrg[13] - piCur[13]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
887
12.5M
    iTemp = piOrg[14] - piCur[14]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
888
12.5M
    iTemp = piOrg[15] - piCur[15]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
889
12.5M
    iTemp = piOrg[16] - piCur[16]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
890
12.5M
    iTemp = piOrg[17] - piCur[17]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
891
12.5M
    iTemp = piOrg[18] - piCur[18]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
892
12.5M
    iTemp = piOrg[19] - piCur[19]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
893
12.5M
    iTemp = piOrg[20] - piCur[20]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
894
12.5M
    iTemp = piOrg[21] - piCur[21]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
895
12.5M
    iTemp = piOrg[22] - piCur[22]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
896
12.5M
    iTemp = piOrg[23] - piCur[23]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
897
12.5M
    iTemp = piOrg[24] - piCur[24]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
898
12.5M
    iTemp = piOrg[25] - piCur[25]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
899
12.5M
    iTemp = piOrg[26] - piCur[26]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
900
12.5M
    iTemp = piOrg[27] - piCur[27]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
901
12.5M
    iTemp = piOrg[28] - piCur[28]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
902
12.5M
    iTemp = piOrg[29] - piCur[29]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
903
12.5M
    iTemp = piOrg[30] - piCur[30]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
904
12.5M
    iTemp = piOrg[31] - piCur[31]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
905
906
12.5M
    piOrg += iStrideOrg;
907
12.5M
    piCur += iStrideCur;
908
12.5M
  }
909
910
740k
  return ( uiSum );
911
740k
}
912
913
Distortion RdCost::xGetSSE64( const DistParam &rcDtParam )
914
93.9k
{
915
93.9k
  if ( rcDtParam.applyWeight )
916
0
  {
917
0
    THROW(" no support");
918
0
  }
919
920
93.9k
  const Pel* piOrg   = rcDtParam.org.buf;
921
93.9k
  const Pel* piCur   = rcDtParam.cur.buf;
922
93.9k
  int  iRows         = rcDtParam.org.height;
923
93.9k
  int  iStrideOrg    = rcDtParam.org.stride;
924
93.9k
  int  iStrideCur    = rcDtParam.cur.stride;
925
926
93.9k
  Distortion uiSum   = 0;
927
93.9k
  uint32_t uiShift = DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth) << 1;
928
929
93.9k
  Intermediate_Int  iTemp;
930
931
4.98M
  for( ; iRows != 0; iRows-- )
932
4.89M
  {
933
4.89M
    iTemp = piOrg[ 0] - piCur[ 0]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
934
4.89M
    iTemp = piOrg[ 1] - piCur[ 1]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
935
4.89M
    iTemp = piOrg[ 2] - piCur[ 2]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
936
4.89M
    iTemp = piOrg[ 3] - piCur[ 3]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
937
4.89M
    iTemp = piOrg[ 4] - piCur[ 4]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
938
4.89M
    iTemp = piOrg[ 5] - piCur[ 5]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
939
4.89M
    iTemp = piOrg[ 6] - piCur[ 6]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
940
4.89M
    iTemp = piOrg[ 7] - piCur[ 7]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
941
4.89M
    iTemp = piOrg[ 8] - piCur[ 8]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
942
4.89M
    iTemp = piOrg[ 9] - piCur[ 9]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
943
4.89M
    iTemp = piOrg[10] - piCur[10]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
944
4.89M
    iTemp = piOrg[11] - piCur[11]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
945
4.89M
    iTemp = piOrg[12] - piCur[12]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
946
4.89M
    iTemp = piOrg[13] - piCur[13]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
947
4.89M
    iTemp = piOrg[14] - piCur[14]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
948
4.89M
    iTemp = piOrg[15] - piCur[15]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
949
4.89M
    iTemp = piOrg[16] - piCur[16]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
950
4.89M
    iTemp = piOrg[17] - piCur[17]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
951
4.89M
    iTemp = piOrg[18] - piCur[18]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
952
4.89M
    iTemp = piOrg[19] - piCur[19]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
953
4.89M
    iTemp = piOrg[20] - piCur[20]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
954
4.89M
    iTemp = piOrg[21] - piCur[21]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
955
4.89M
    iTemp = piOrg[22] - piCur[22]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
956
4.89M
    iTemp = piOrg[23] - piCur[23]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
957
4.89M
    iTemp = piOrg[24] - piCur[24]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
958
4.89M
    iTemp = piOrg[25] - piCur[25]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
959
4.89M
    iTemp = piOrg[26] - piCur[26]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
960
4.89M
    iTemp = piOrg[27] - piCur[27]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
961
4.89M
    iTemp = piOrg[28] - piCur[28]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
962
4.89M
    iTemp = piOrg[29] - piCur[29]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
963
4.89M
    iTemp = piOrg[30] - piCur[30]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
964
4.89M
    iTemp = piOrg[31] - piCur[31]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
965
4.89M
    iTemp = piOrg[32] - piCur[32]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
966
4.89M
    iTemp = piOrg[33] - piCur[33]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
967
4.89M
    iTemp = piOrg[34] - piCur[34]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
968
4.89M
    iTemp = piOrg[35] - piCur[35]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
969
4.89M
    iTemp = piOrg[36] - piCur[36]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
970
4.89M
    iTemp = piOrg[37] - piCur[37]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
971
4.89M
    iTemp = piOrg[38] - piCur[38]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
972
4.89M
    iTemp = piOrg[39] - piCur[39]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
973
4.89M
    iTemp = piOrg[40] - piCur[40]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
974
4.89M
    iTemp = piOrg[41] - piCur[41]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
975
4.89M
    iTemp = piOrg[42] - piCur[42]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
976
4.89M
    iTemp = piOrg[43] - piCur[43]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
977
4.89M
    iTemp = piOrg[44] - piCur[44]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
978
4.89M
    iTemp = piOrg[45] - piCur[45]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
979
4.89M
    iTemp = piOrg[46] - piCur[46]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
980
4.89M
    iTemp = piOrg[47] - piCur[47]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
981
4.89M
    iTemp = piOrg[48] - piCur[48]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
982
4.89M
    iTemp = piOrg[49] - piCur[49]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
983
4.89M
    iTemp = piOrg[50] - piCur[50]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
984
4.89M
    iTemp = piOrg[51] - piCur[51]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
985
4.89M
    iTemp = piOrg[52] - piCur[52]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
986
4.89M
    iTemp = piOrg[53] - piCur[53]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
987
4.89M
    iTemp = piOrg[54] - piCur[54]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
988
4.89M
    iTemp = piOrg[55] - piCur[55]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
989
4.89M
    iTemp = piOrg[56] - piCur[56]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
990
4.89M
    iTemp = piOrg[57] - piCur[57]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
991
4.89M
    iTemp = piOrg[58] - piCur[58]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
992
4.89M
    iTemp = piOrg[59] - piCur[59]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
993
4.89M
    iTemp = piOrg[60] - piCur[60]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
994
4.89M
    iTemp = piOrg[61] - piCur[61]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
995
4.89M
    iTemp = piOrg[62] - piCur[62]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
996
4.89M
    iTemp = piOrg[63] - piCur[63]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
997
998
4.89M
    piOrg += iStrideOrg;
999
4.89M
    piCur += iStrideCur;
1000
4.89M
  }
1001
1002
93.9k
  return ( uiSum );
1003
93.9k
}
1004
1005
// --------------------------------------------------------------------------------------------------------------------
1006
// HADAMARD with step (used in fractional search)
1007
// --------------------------------------------------------------------------------------------------------------------
1008
1009
Distortion RdCost::xCalcHADs2x2( const Pel* piOrg, const Pel* piCur, int iStrideOrg, int iStrideCur )
1010
192k
{
1011
192k
  Distortion satd = 0;
1012
192k
  TCoeff diff[4], m[4];
1013
1014
192k
  diff[0] = piOrg[0             ] - piCur[0];
1015
192k
  diff[1] = piOrg[1             ] - piCur[1];
1016
192k
  diff[2] = piOrg[iStrideOrg    ] - piCur[0 + iStrideCur];
1017
192k
  diff[3] = piOrg[iStrideOrg + 1] - piCur[1 + iStrideCur];
1018
192k
  m[0] = diff[0] + diff[2];
1019
192k
  m[1] = diff[1] + diff[3];
1020
192k
  m[2] = diff[0] - diff[2];
1021
192k
  m[3] = diff[1] - diff[3];
1022
  
1023
192k
  satd += abs(m[0] + m[1]) >> 2;
1024
192k
  satd += abs(m[0] - m[1]);
1025
192k
  satd += abs(m[2] + m[3]);
1026
192k
  satd += abs(m[2] - m[3]);
1027
1028
192k
  return satd;
1029
192k
}
1030
1031
static Distortion xCalcHADs4x4( const Pel* piOrg, const Pel* piCur, int iStrideOrg, int iStrideCur )
1032
55.8k
{
1033
55.8k
  int k;
1034
55.8k
  Distortion satd = 0;
1035
55.8k
  TCoeff diff[16], m[16], d[16];
1036
1037
279k
  for( k = 0; k < 16; k+=4 )
1038
223k
  {
1039
223k
    diff[k+0] = piOrg[0] - piCur[0];
1040
223k
    diff[k+1] = piOrg[1] - piCur[1];
1041
223k
    diff[k+2] = piOrg[2] - piCur[2];
1042
223k
    diff[k+3] = piOrg[3] - piCur[3];
1043
1044
223k
    piCur += iStrideCur;
1045
223k
    piOrg += iStrideOrg;
1046
223k
  }
1047
1048
  /*===== hadamard transform =====*/
1049
55.8k
  m[ 0] = diff[ 0] + diff[12];
1050
55.8k
  m[ 1] = diff[ 1] + diff[13];
1051
55.8k
  m[ 2] = diff[ 2] + diff[14];
1052
55.8k
  m[ 3] = diff[ 3] + diff[15];
1053
55.8k
  m[ 4] = diff[ 4] + diff[ 8];
1054
55.8k
  m[ 5] = diff[ 5] + diff[ 9];
1055
55.8k
  m[ 6] = diff[ 6] + diff[10];
1056
55.8k
  m[ 7] = diff[ 7] + diff[11];
1057
55.8k
  m[ 8] = diff[ 4] - diff[ 8];
1058
55.8k
  m[ 9] = diff[ 5] - diff[ 9];
1059
55.8k
  m[10] = diff[ 6] - diff[10];
1060
55.8k
  m[11] = diff[ 7] - diff[11];
1061
55.8k
  m[12] = diff[ 0] - diff[12];
1062
55.8k
  m[13] = diff[ 1] - diff[13];
1063
55.8k
  m[14] = diff[ 2] - diff[14];
1064
55.8k
  m[15] = diff[ 3] - diff[15];
1065
1066
55.8k
  d[ 0] = m[ 0] + m[ 4];
1067
55.8k
  d[ 1] = m[ 1] + m[ 5];
1068
55.8k
  d[ 2] = m[ 2] + m[ 6];
1069
55.8k
  d[ 3] = m[ 3] + m[ 7];
1070
55.8k
  d[ 4] = m[ 8] + m[12];
1071
55.8k
  d[ 5] = m[ 9] + m[13];
1072
55.8k
  d[ 6] = m[10] + m[14];
1073
55.8k
  d[ 7] = m[11] + m[15];
1074
55.8k
  d[ 8] = m[ 0] - m[ 4];
1075
55.8k
  d[ 9] = m[ 1] - m[ 5];
1076
55.8k
  d[10] = m[ 2] - m[ 6];
1077
55.8k
  d[11] = m[ 3] - m[ 7];
1078
55.8k
  d[12] = m[12] - m[ 8];
1079
55.8k
  d[13] = m[13] - m[ 9];
1080
55.8k
  d[14] = m[14] - m[10];
1081
55.8k
  d[15] = m[15] - m[11];
1082
1083
55.8k
  m[ 0] = d[ 0] + d[ 3];
1084
55.8k
  m[ 1] = d[ 1] + d[ 2];
1085
55.8k
  m[ 2] = d[ 1] - d[ 2];
1086
55.8k
  m[ 3] = d[ 0] - d[ 3];
1087
55.8k
  m[ 4] = d[ 4] + d[ 7];
1088
55.8k
  m[ 5] = d[ 5] + d[ 6];
1089
55.8k
  m[ 6] = d[ 5] - d[ 6];
1090
55.8k
  m[ 7] = d[ 4] - d[ 7];
1091
55.8k
  m[ 8] = d[ 8] + d[11];
1092
55.8k
  m[ 9] = d[ 9] + d[10];
1093
55.8k
  m[10] = d[ 9] - d[10];
1094
55.8k
  m[11] = d[ 8] - d[11];
1095
55.8k
  m[12] = d[12] + d[15];
1096
55.8k
  m[13] = d[13] + d[14];
1097
55.8k
  m[14] = d[13] - d[14];
1098
55.8k
  m[15] = d[12] - d[15];
1099
1100
55.8k
  d[ 0] = m[ 0] + m[ 1];
1101
55.8k
  d[ 1] = m[ 0] - m[ 1];
1102
55.8k
  d[ 2] = m[ 2] + m[ 3];
1103
55.8k
  d[ 3] = m[ 3] - m[ 2];
1104
55.8k
  d[ 4] = m[ 4] + m[ 5];
1105
55.8k
  d[ 5] = m[ 4] - m[ 5];
1106
55.8k
  d[ 6] = m[ 6] + m[ 7];
1107
55.8k
  d[ 7] = m[ 7] - m[ 6];
1108
55.8k
  d[ 8] = m[ 8] + m[ 9];
1109
55.8k
  d[ 9] = m[ 8] - m[ 9];
1110
55.8k
  d[10] = m[10] + m[11];
1111
55.8k
  d[11] = m[11] - m[10];
1112
55.8k
  d[12] = m[12] + m[13];
1113
55.8k
  d[13] = m[12] - m[13];
1114
55.8k
  d[14] = m[14] + m[15];
1115
55.8k
  d[15] = m[15] - m[14];
1116
1117
950k
  for (k=0; k<16; ++k)
1118
894k
  {
1119
894k
    satd += abs(d[k]);
1120
894k
  }
1121
1122
55.8k
  satd -= abs( d[0] );
1123
55.8k
  satd += abs( d[0] ) >> 2;
1124
55.8k
  satd = ((satd+1)>>1);
1125
1126
55.8k
  return satd;
1127
55.8k
}
1128
1129
static Distortion xCalcHADs16x16_fast( const Pel* piOrg, const Pel* piCur, int iStrideOrg, int iStrideCur )
1130
0
{
1131
0
  int k, i, j, jj;
1132
0
  Distortion sad = 0;
1133
0
  TCoeff diff[64], m1[8][8], m2[8][8], m3[8][8];
1134
1135
0
  for( k = 0; k < 64; k += 8 )
1136
0
  {
1137
0
    diff[k+0] = ( ( piOrg[ 0] + piOrg[ 0+1] + piOrg[ 0+iStrideOrg] + piOrg[ 0+1+iStrideOrg] + 2 ) >> 2 ) - ( ( piCur[ 0] + piCur[ 0+1] + piCur[ 0+iStrideCur] + piCur[ 0+1+iStrideCur] + 2 ) >> 2 );
1138
0
    diff[k+1] = ( ( piOrg[ 2] + piOrg[ 2+1] + piOrg[ 2+iStrideOrg] + piOrg[ 2+1+iStrideOrg] + 2 ) >> 2 ) - ( ( piCur[ 2] + piCur[ 2+1] + piCur[ 2+iStrideCur] + piCur[ 2+1+iStrideCur] + 2 ) >> 2 );
1139
0
    diff[k+2] = ( ( piOrg[ 4] + piOrg[ 4+1] + piOrg[ 4+iStrideOrg] + piOrg[ 4+1+iStrideOrg] + 2 ) >> 2 ) - ( ( piCur[ 4] + piCur[ 4+1] + piCur[ 4+iStrideCur] + piCur[ 4+1+iStrideCur] + 2 ) >> 2 );
1140
0
    diff[k+3] = ( ( piOrg[ 6] + piOrg[ 6+1] + piOrg[ 6+iStrideOrg] + piOrg[ 6+1+iStrideOrg] + 2 ) >> 2 ) - ( ( piCur[ 6] + piCur[ 6+1] + piCur[ 6+iStrideCur] + piCur[ 6+1+iStrideCur] + 2 ) >> 2 );
1141
0
    diff[k+4] = ( ( piOrg[ 8] + piOrg[ 8+1] + piOrg[ 8+iStrideOrg] + piOrg[ 8+1+iStrideOrg] + 2 ) >> 2 ) - ( ( piCur[ 8] + piCur[ 8+1] + piCur[ 8+iStrideCur] + piCur[ 8+1+iStrideCur] + 2 ) >> 2 );
1142
0
    diff[k+5] = ( ( piOrg[10] + piOrg[10+1] + piOrg[10+iStrideOrg] + piOrg[10+1+iStrideOrg] + 2 ) >> 2 ) - ( ( piCur[10] + piCur[10+1] + piCur[10+iStrideCur] + piCur[10+1+iStrideCur] + 2 ) >> 2 );
1143
0
    diff[k+6] = ( ( piOrg[12] + piOrg[12+1] + piOrg[12+iStrideOrg] + piOrg[12+1+iStrideOrg] + 2 ) >> 2 ) - ( ( piCur[12] + piCur[12+1] + piCur[12+iStrideCur] + piCur[12+1+iStrideCur] + 2 ) >> 2 );
1144
0
    diff[k+7] = ( ( piOrg[14] + piOrg[14+1] + piOrg[14+iStrideOrg] + piOrg[14+1+iStrideOrg] + 2 ) >> 2 ) - ( ( piCur[14] + piCur[14+1] + piCur[14+iStrideCur] + piCur[14+1+iStrideCur] + 2 ) >> 2 );
1145
1146
0
    piCur += 2 * iStrideCur;
1147
0
    piOrg += 2 * iStrideOrg;
1148
0
  }
1149
1150
  //horizontal
1151
0
  for (j=0; j < 8; j++)
1152
0
  {
1153
0
    jj = j << 3;
1154
0
    m2[j][0] = diff[jj  ] + diff[jj+4];
1155
0
    m2[j][1] = diff[jj+1] + diff[jj+5];
1156
0
    m2[j][2] = diff[jj+2] + diff[jj+6];
1157
0
    m2[j][3] = diff[jj+3] + diff[jj+7];
1158
0
    m2[j][4] = diff[jj  ] - diff[jj+4];
1159
0
    m2[j][5] = diff[jj+1] - diff[jj+5];
1160
0
    m2[j][6] = diff[jj+2] - diff[jj+6];
1161
0
    m2[j][7] = diff[jj+3] - diff[jj+7];
1162
1163
0
    m1[j][0] = m2[j][0] + m2[j][2];
1164
0
    m1[j][1] = m2[j][1] + m2[j][3];
1165
0
    m1[j][2] = m2[j][0] - m2[j][2];
1166
0
    m1[j][3] = m2[j][1] - m2[j][3];
1167
0
    m1[j][4] = m2[j][4] + m2[j][6];
1168
0
    m1[j][5] = m2[j][5] + m2[j][7];
1169
0
    m1[j][6] = m2[j][4] - m2[j][6];
1170
0
    m1[j][7] = m2[j][5] - m2[j][7];
1171
1172
0
    m2[j][0] = m1[j][0] + m1[j][1];
1173
0
    m2[j][1] = m1[j][0] - m1[j][1];
1174
0
    m2[j][2] = m1[j][2] + m1[j][3];
1175
0
    m2[j][3] = m1[j][2] - m1[j][3];
1176
0
    m2[j][4] = m1[j][4] + m1[j][5];
1177
0
    m2[j][5] = m1[j][4] - m1[j][5];
1178
0
    m2[j][6] = m1[j][6] + m1[j][7];
1179
0
    m2[j][7] = m1[j][6] - m1[j][7];
1180
0
  }
1181
1182
  //vertical
1183
0
  for (i=0; i < 8; i++)
1184
0
  {
1185
0
    m3[0][i] = m2[0][i] + m2[4][i];
1186
0
    m3[1][i] = m2[1][i] + m2[5][i];
1187
0
    m3[2][i] = m2[2][i] + m2[6][i];
1188
0
    m3[3][i] = m2[3][i] + m2[7][i];
1189
0
    m3[4][i] = m2[0][i] - m2[4][i];
1190
0
    m3[5][i] = m2[1][i] - m2[5][i];
1191
0
    m3[6][i] = m2[2][i] - m2[6][i];
1192
0
    m3[7][i] = m2[3][i] - m2[7][i];
1193
1194
0
    m1[0][i] = m3[0][i] + m3[2][i];
1195
0
    m1[1][i] = m3[1][i] + m3[3][i];
1196
0
    m1[2][i] = m3[0][i] - m3[2][i];
1197
0
    m1[3][i] = m3[1][i] - m3[3][i];
1198
0
    m1[4][i] = m3[4][i] + m3[6][i];
1199
0
    m1[5][i] = m3[5][i] + m3[7][i];
1200
0
    m1[6][i] = m3[4][i] - m3[6][i];
1201
0
    m1[7][i] = m3[5][i] - m3[7][i];
1202
1203
0
    m2[0][i] = m1[0][i] + m1[1][i];
1204
0
    m2[1][i] = m1[0][i] - m1[1][i];
1205
0
    m2[2][i] = m1[2][i] + m1[3][i];
1206
0
    m2[3][i] = m1[2][i] - m1[3][i];
1207
0
    m2[4][i] = m1[4][i] + m1[5][i];
1208
0
    m2[5][i] = m1[4][i] - m1[5][i];
1209
0
    m2[6][i] = m1[6][i] + m1[7][i];
1210
0
    m2[7][i] = m1[6][i] - m1[7][i];
1211
0
  }
1212
1213
0
  for (i = 0; i < 8; i++)
1214
0
  {
1215
0
    for (j = 0; j < 8; j++)
1216
0
    {
1217
0
      sad += abs(m2[i][j]);
1218
0
    }
1219
0
  }
1220
  
1221
0
  sad -= abs( m2[0][0] );
1222
0
  sad += abs( m2[0][0] ) >> 2;
1223
0
  sad=((sad+2)>>2);
1224
1225
0
  return (sad << 2);
1226
0
}
1227
1228
static Distortion xCalcHADs8x8( const Pel* piOrg, const Pel* piCur, int iStrideOrg, int iStrideCur )
1229
21.8M
{
1230
21.8M
  int k, i, j, jj;
1231
21.8M
  Distortion sad = 0;
1232
21.8M
  TCoeff diff[64], m1[8][8], m2[8][8], m3[8][8];
1233
1234
196M
  for( k = 0; k < 64; k += 8 )
1235
174M
  {
1236
174M
    diff[k+0] = piOrg[0] - piCur[0];
1237
174M
    diff[k+1] = piOrg[1] - piCur[1];
1238
174M
    diff[k+2] = piOrg[2] - piCur[2];
1239
174M
    diff[k+3] = piOrg[3] - piCur[3];
1240
174M
    diff[k+4] = piOrg[4] - piCur[4];
1241
174M
    diff[k+5] = piOrg[5] - piCur[5];
1242
174M
    diff[k+6] = piOrg[6] - piCur[6];
1243
174M
    diff[k+7] = piOrg[7] - piCur[7];
1244
1245
174M
    piCur += iStrideCur;
1246
174M
    piOrg += iStrideOrg;
1247
174M
  }
1248
1249
  //horizontal
1250
196M
  for (j=0; j < 8; j++)
1251
174M
  {
1252
174M
    jj = j << 3;
1253
174M
    m2[j][0] = diff[jj  ] + diff[jj+4];
1254
174M
    m2[j][1] = diff[jj+1] + diff[jj+5];
1255
174M
    m2[j][2] = diff[jj+2] + diff[jj+6];
1256
174M
    m2[j][3] = diff[jj+3] + diff[jj+7];
1257
174M
    m2[j][4] = diff[jj  ] - diff[jj+4];
1258
174M
    m2[j][5] = diff[jj+1] - diff[jj+5];
1259
174M
    m2[j][6] = diff[jj+2] - diff[jj+6];
1260
174M
    m2[j][7] = diff[jj+3] - diff[jj+7];
1261
1262
174M
    m1[j][0] = m2[j][0] + m2[j][2];
1263
174M
    m1[j][1] = m2[j][1] + m2[j][3];
1264
174M
    m1[j][2] = m2[j][0] - m2[j][2];
1265
174M
    m1[j][3] = m2[j][1] - m2[j][3];
1266
174M
    m1[j][4] = m2[j][4] + m2[j][6];
1267
174M
    m1[j][5] = m2[j][5] + m2[j][7];
1268
174M
    m1[j][6] = m2[j][4] - m2[j][6];
1269
174M
    m1[j][7] = m2[j][5] - m2[j][7];
1270
1271
174M
    m2[j][0] = m1[j][0] + m1[j][1];
1272
174M
    m2[j][1] = m1[j][0] - m1[j][1];
1273
174M
    m2[j][2] = m1[j][2] + m1[j][3];
1274
174M
    m2[j][3] = m1[j][2] - m1[j][3];
1275
174M
    m2[j][4] = m1[j][4] + m1[j][5];
1276
174M
    m2[j][5] = m1[j][4] - m1[j][5];
1277
174M
    m2[j][6] = m1[j][6] + m1[j][7];
1278
174M
    m2[j][7] = m1[j][6] - m1[j][7];
1279
174M
  }
1280
1281
  //vertical
1282
196M
  for (i=0; i < 8; i++)
1283
174M
  {
1284
174M
    m3[0][i] = m2[0][i] + m2[4][i];
1285
174M
    m3[1][i] = m2[1][i] + m2[5][i];
1286
174M
    m3[2][i] = m2[2][i] + m2[6][i];
1287
174M
    m3[3][i] = m2[3][i] + m2[7][i];
1288
174M
    m3[4][i] = m2[0][i] - m2[4][i];
1289
174M
    m3[5][i] = m2[1][i] - m2[5][i];
1290
174M
    m3[6][i] = m2[2][i] - m2[6][i];
1291
174M
    m3[7][i] = m2[3][i] - m2[7][i];
1292
1293
174M
    m1[0][i] = m3[0][i] + m3[2][i];
1294
174M
    m1[1][i] = m3[1][i] + m3[3][i];
1295
174M
    m1[2][i] = m3[0][i] - m3[2][i];
1296
174M
    m1[3][i] = m3[1][i] - m3[3][i];
1297
174M
    m1[4][i] = m3[4][i] + m3[6][i];
1298
174M
    m1[5][i] = m3[5][i] + m3[7][i];
1299
174M
    m1[6][i] = m3[4][i] - m3[6][i];
1300
174M
    m1[7][i] = m3[5][i] - m3[7][i];
1301
1302
174M
    m2[0][i] = m1[0][i] + m1[1][i];
1303
174M
    m2[1][i] = m1[0][i] - m1[1][i];
1304
174M
    m2[2][i] = m1[2][i] + m1[3][i];
1305
174M
    m2[3][i] = m1[2][i] - m1[3][i];
1306
174M
    m2[4][i] = m1[4][i] + m1[5][i];
1307
174M
    m2[5][i] = m1[4][i] - m1[5][i];
1308
174M
    m2[6][i] = m1[6][i] + m1[7][i];
1309
174M
    m2[7][i] = m1[6][i] - m1[7][i];
1310
174M
  }
1311
1312
196M
  for (i = 0; i < 8; i++)
1313
174M
  {
1314
1.57G
    for (j = 0; j < 8; j++)
1315
1.39G
    {
1316
1.39G
      sad += abs(m2[i][j]);
1317
1.39G
    }
1318
174M
  }
1319
  
1320
21.8M
  sad -= abs( m2[0][0] );
1321
21.8M
  sad += abs( m2[0][0] ) >> 2;
1322
21.8M
  sad=((sad+2)>>2);
1323
1324
21.8M
  return sad;
1325
21.8M
}
1326
1327
static Distortion xCalcHADs16x8( const Pel* piOrg, const Pel* piCur, int iStrideOrg, int iStrideCur )
1328
1.16M
{   //need to add SIMD implementation ,JCA
1329
1.16M
  int k, i, j, jj, sad = 0;
1330
1.16M
  int diff[128], m1[8][16], m2[8][16];
1331
10.4M
  for( k = 0; k < 128; k += 16 )
1332
9.31M
  {
1333
9.31M
    diff[k + 0] = piOrg[0] - piCur[0];
1334
9.31M
    diff[k + 1] = piOrg[1] - piCur[1];
1335
9.31M
    diff[k + 2] = piOrg[2] - piCur[2];
1336
9.31M
    diff[k + 3] = piOrg[3] - piCur[3];
1337
9.31M
    diff[k + 4] = piOrg[4] - piCur[4];
1338
9.31M
    diff[k + 5] = piOrg[5] - piCur[5];
1339
9.31M
    diff[k + 6] = piOrg[6] - piCur[6];
1340
9.31M
    diff[k + 7] = piOrg[7] - piCur[7];
1341
1342
9.31M
    diff[k + 8] = piOrg[8] - piCur[8];
1343
9.31M
    diff[k + 9] = piOrg[9] - piCur[9];
1344
9.31M
    diff[k + 10] = piOrg[10] - piCur[10];
1345
9.31M
    diff[k + 11] = piOrg[11] - piCur[11];
1346
9.31M
    diff[k + 12] = piOrg[12] - piCur[12];
1347
9.31M
    diff[k + 13] = piOrg[13] - piCur[13];
1348
9.31M
    diff[k + 14] = piOrg[14] - piCur[14];
1349
9.31M
    diff[k + 15] = piOrg[15] - piCur[15];
1350
1351
9.31M
    piCur += iStrideCur;
1352
9.31M
    piOrg += iStrideOrg;
1353
9.31M
  }
1354
1355
  //horizontal
1356
10.4M
  for( j = 0; j < 8; j++ )
1357
9.31M
  {
1358
9.31M
    jj = j << 4;
1359
1360
9.31M
    m2[j][0] = diff[jj    ] + diff[jj + 8];
1361
9.31M
    m2[j][1] = diff[jj + 1] + diff[jj + 9];
1362
9.31M
    m2[j][2] = diff[jj + 2] + diff[jj + 10];
1363
9.31M
    m2[j][3] = diff[jj + 3] + diff[jj + 11];
1364
9.31M
    m2[j][4] = diff[jj + 4] + diff[jj + 12];
1365
9.31M
    m2[j][5] = diff[jj + 5] + diff[jj + 13];
1366
9.31M
    m2[j][6] = diff[jj + 6] + diff[jj + 14];
1367
9.31M
    m2[j][7] = diff[jj + 7] + diff[jj + 15];
1368
9.31M
    m2[j][8] = diff[jj    ] - diff[jj + 8];
1369
9.31M
    m2[j][9] = diff[jj + 1] - diff[jj + 9];
1370
9.31M
    m2[j][10] = diff[jj + 2] - diff[jj + 10];
1371
9.31M
    m2[j][11] = diff[jj + 3] - diff[jj + 11];
1372
9.31M
    m2[j][12] = diff[jj + 4] - diff[jj + 12];
1373
9.31M
    m2[j][13] = diff[jj + 5] - diff[jj + 13];
1374
9.31M
    m2[j][14] = diff[jj + 6] - diff[jj + 14];
1375
9.31M
    m2[j][15] = diff[jj + 7] - diff[jj + 15];
1376
1377
9.31M
    m1[j][0] = m2[j][0] + m2[j][4];
1378
9.31M
    m1[j][1] = m2[j][1] + m2[j][5];
1379
9.31M
    m1[j][2] = m2[j][2] + m2[j][6];
1380
9.31M
    m1[j][3] = m2[j][3] + m2[j][7];
1381
9.31M
    m1[j][4] = m2[j][0] - m2[j][4];
1382
9.31M
    m1[j][5] = m2[j][1] - m2[j][5];
1383
9.31M
    m1[j][6] = m2[j][2] - m2[j][6];
1384
9.31M
    m1[j][7] = m2[j][3] - m2[j][7];
1385
9.31M
    m1[j][8] = m2[j][8] + m2[j][12];
1386
9.31M
    m1[j][9] = m2[j][9] + m2[j][13];
1387
9.31M
    m1[j][10] = m2[j][10] + m2[j][14];
1388
9.31M
    m1[j][11] = m2[j][11] + m2[j][15];
1389
9.31M
    m1[j][12] = m2[j][8] - m2[j][12];
1390
9.31M
    m1[j][13] = m2[j][9] - m2[j][13];
1391
9.31M
    m1[j][14] = m2[j][10] - m2[j][14];
1392
9.31M
    m1[j][15] = m2[j][11] - m2[j][15];
1393
1394
9.31M
    m2[j][0] = m1[j][0] + m1[j][2];
1395
9.31M
    m2[j][1] = m1[j][1] + m1[j][3];
1396
9.31M
    m2[j][2] = m1[j][0] - m1[j][2];
1397
9.31M
    m2[j][3] = m1[j][1] - m1[j][3];
1398
9.31M
    m2[j][4] = m1[j][4] + m1[j][6];
1399
9.31M
    m2[j][5] = m1[j][5] + m1[j][7];
1400
9.31M
    m2[j][6] = m1[j][4] - m1[j][6];
1401
9.31M
    m2[j][7] = m1[j][5] - m1[j][7];
1402
9.31M
    m2[j][8] = m1[j][8] + m1[j][10];
1403
9.31M
    m2[j][9] = m1[j][9] + m1[j][11];
1404
9.31M
    m2[j][10] = m1[j][8] - m1[j][10];
1405
9.31M
    m2[j][11] = m1[j][9] - m1[j][11];
1406
9.31M
    m2[j][12] = m1[j][12] + m1[j][14];
1407
9.31M
    m2[j][13] = m1[j][13] + m1[j][15];
1408
9.31M
    m2[j][14] = m1[j][12] - m1[j][14];
1409
9.31M
    m2[j][15] = m1[j][13] - m1[j][15];
1410
1411
9.31M
    m1[j][0] = m2[j][0] + m2[j][1];
1412
9.31M
    m1[j][1] = m2[j][0] - m2[j][1];
1413
9.31M
    m1[j][2] = m2[j][2] + m2[j][3];
1414
9.31M
    m1[j][3] = m2[j][2] - m2[j][3];
1415
9.31M
    m1[j][4] = m2[j][4] + m2[j][5];
1416
9.31M
    m1[j][5] = m2[j][4] - m2[j][5];
1417
9.31M
    m1[j][6] = m2[j][6] + m2[j][7];
1418
9.31M
    m1[j][7] = m2[j][6] - m2[j][7];
1419
9.31M
    m1[j][8] = m2[j][8] + m2[j][9];
1420
9.31M
    m1[j][9] = m2[j][8] - m2[j][9];
1421
9.31M
    m1[j][10] = m2[j][10] + m2[j][11];
1422
9.31M
    m1[j][11] = m2[j][10] - m2[j][11];
1423
9.31M
    m1[j][12] = m2[j][12] + m2[j][13];
1424
9.31M
    m1[j][13] = m2[j][12] - m2[j][13];
1425
9.31M
    m1[j][14] = m2[j][14] + m2[j][15];
1426
9.31M
    m1[j][15] = m2[j][14] - m2[j][15];
1427
9.31M
  }
1428
1429
  //vertical
1430
19.7M
  for( i = 0; i < 16; i++ )
1431
18.6M
  {
1432
18.6M
    m2[0][i] = m1[0][i] + m1[4][i];
1433
18.6M
    m2[1][i] = m1[1][i] + m1[5][i];
1434
18.6M
    m2[2][i] = m1[2][i] + m1[6][i];
1435
18.6M
    m2[3][i] = m1[3][i] + m1[7][i];
1436
18.6M
    m2[4][i] = m1[0][i] - m1[4][i];
1437
18.6M
    m2[5][i] = m1[1][i] - m1[5][i];
1438
18.6M
    m2[6][i] = m1[2][i] - m1[6][i];
1439
18.6M
    m2[7][i] = m1[3][i] - m1[7][i];
1440
1441
18.6M
    m1[0][i] = m2[0][i] + m2[2][i];
1442
18.6M
    m1[1][i] = m2[1][i] + m2[3][i];
1443
18.6M
    m1[2][i] = m2[0][i] - m2[2][i];
1444
18.6M
    m1[3][i] = m2[1][i] - m2[3][i];
1445
18.6M
    m1[4][i] = m2[4][i] + m2[6][i];
1446
18.6M
    m1[5][i] = m2[5][i] + m2[7][i];
1447
18.6M
    m1[6][i] = m2[4][i] - m2[6][i];
1448
18.6M
    m1[7][i] = m2[5][i] - m2[7][i];
1449
1450
18.6M
    m2[0][i] = m1[0][i] + m1[1][i];
1451
18.6M
    m2[1][i] = m1[0][i] - m1[1][i];
1452
18.6M
    m2[2][i] = m1[2][i] + m1[3][i];
1453
18.6M
    m2[3][i] = m1[2][i] - m1[3][i];
1454
18.6M
    m2[4][i] = m1[4][i] + m1[5][i];
1455
18.6M
    m2[5][i] = m1[4][i] - m1[5][i];
1456
18.6M
    m2[6][i] = m1[6][i] + m1[7][i];
1457
18.6M
    m2[7][i] = m1[6][i] - m1[7][i];
1458
18.6M
  }
1459
1460
10.4M
  for( i = 0; i < 8; i++ )
1461
9.31M
  {
1462
158M
    for( j = 0; j < 16; j++ )
1463
149M
    {
1464
149M
      sad += abs( m2[i][j] );
1465
149M
    }
1466
9.31M
  }
1467
  
1468
1.16M
  sad -= abs( m2[0][0] );
1469
1.16M
  sad += abs( m2[0][0] ) >> 2;
1470
1.16M
  sad = ( int ) ( sad / sqrt( 16.0 * 8 ) * 2 );
1471
1472
1.16M
  return sad;
1473
1.16M
}
1474
1475
static Distortion xCalcHADs8x16( const Pel* piOrg, const Pel* piCur, int iStrideOrg, int iStrideCur )
1476
1.20M
{
1477
1.20M
  int k, i, j, jj, sad = 0;
1478
1.20M
  int diff[128], m1[16][8], m2[16][8];
1479
20.4M
  for( k = 0; k < 128; k += 8 )
1480
19.2M
  {
1481
19.2M
    diff[k + 0] = piOrg[0] - piCur[0];
1482
19.2M
    diff[k + 1] = piOrg[1] - piCur[1];
1483
19.2M
    diff[k + 2] = piOrg[2] - piCur[2];
1484
19.2M
    diff[k + 3] = piOrg[3] - piCur[3];
1485
19.2M
    diff[k + 4] = piOrg[4] - piCur[4];
1486
19.2M
    diff[k + 5] = piOrg[5] - piCur[5];
1487
19.2M
    diff[k + 6] = piOrg[6] - piCur[6];
1488
19.2M
    diff[k + 7] = piOrg[7] - piCur[7];
1489
1490
19.2M
    piCur += iStrideCur;
1491
19.2M
    piOrg += iStrideOrg;
1492
19.2M
  }
1493
1494
  //horizontal
1495
20.4M
  for( j = 0; j < 16; j++ )
1496
19.2M
  {
1497
19.2M
    jj = j << 3;
1498
1499
19.2M
    m2[j][0] = diff[jj] + diff[jj + 4];
1500
19.2M
    m2[j][1] = diff[jj + 1] + diff[jj + 5];
1501
19.2M
    m2[j][2] = diff[jj + 2] + diff[jj + 6];
1502
19.2M
    m2[j][3] = diff[jj + 3] + diff[jj + 7];
1503
19.2M
    m2[j][4] = diff[jj] - diff[jj + 4];
1504
19.2M
    m2[j][5] = diff[jj + 1] - diff[jj + 5];
1505
19.2M
    m2[j][6] = diff[jj + 2] - diff[jj + 6];
1506
19.2M
    m2[j][7] = diff[jj + 3] - diff[jj + 7];
1507
1508
19.2M
    m1[j][0] = m2[j][0] + m2[j][2];
1509
19.2M
    m1[j][1] = m2[j][1] + m2[j][3];
1510
19.2M
    m1[j][2] = m2[j][0] - m2[j][2];
1511
19.2M
    m1[j][3] = m2[j][1] - m2[j][3];
1512
19.2M
    m1[j][4] = m2[j][4] + m2[j][6];
1513
19.2M
    m1[j][5] = m2[j][5] + m2[j][7];
1514
19.2M
    m1[j][6] = m2[j][4] - m2[j][6];
1515
19.2M
    m1[j][7] = m2[j][5] - m2[j][7];
1516
1517
19.2M
    m2[j][0] = m1[j][0] + m1[j][1];
1518
19.2M
    m2[j][1] = m1[j][0] - m1[j][1];
1519
19.2M
    m2[j][2] = m1[j][2] + m1[j][3];
1520
19.2M
    m2[j][3] = m1[j][2] - m1[j][3];
1521
19.2M
    m2[j][4] = m1[j][4] + m1[j][5];
1522
19.2M
    m2[j][5] = m1[j][4] - m1[j][5];
1523
19.2M
    m2[j][6] = m1[j][6] + m1[j][7];
1524
19.2M
    m2[j][7] = m1[j][6] - m1[j][7];
1525
19.2M
  }
1526
1527
  //vertical
1528
10.8M
  for( i = 0; i < 8; i++ )
1529
9.60M
  {
1530
9.60M
    m1[0][i] = m2[0][i] + m2[8][i];
1531
9.60M
    m1[1][i] = m2[1][i] + m2[9][i];
1532
9.60M
    m1[2][i] = m2[2][i] + m2[10][i];
1533
9.60M
    m1[3][i] = m2[3][i] + m2[11][i];
1534
9.60M
    m1[4][i] = m2[4][i] + m2[12][i];
1535
9.60M
    m1[5][i] = m2[5][i] + m2[13][i];
1536
9.60M
    m1[6][i] = m2[6][i] + m2[14][i];
1537
9.60M
    m1[7][i] = m2[7][i] + m2[15][i];
1538
9.60M
    m1[8][i] = m2[0][i] - m2[8][i];
1539
9.60M
    m1[9][i] = m2[1][i] - m2[9][i];
1540
9.60M
    m1[10][i] = m2[2][i] - m2[10][i];
1541
9.60M
    m1[11][i] = m2[3][i] - m2[11][i];
1542
9.60M
    m1[12][i] = m2[4][i] - m2[12][i];
1543
9.60M
    m1[13][i] = m2[5][i] - m2[13][i];
1544
9.60M
    m1[14][i] = m2[6][i] - m2[14][i];
1545
9.60M
    m1[15][i] = m2[7][i] - m2[15][i];
1546
1547
9.60M
    m2[0][i] = m1[0][i] + m1[4][i];
1548
9.60M
    m2[1][i] = m1[1][i] + m1[5][i];
1549
9.60M
    m2[2][i] = m1[2][i] + m1[6][i];
1550
9.60M
    m2[3][i] = m1[3][i] + m1[7][i];
1551
9.60M
    m2[4][i] = m1[0][i] - m1[4][i];
1552
9.60M
    m2[5][i] = m1[1][i] - m1[5][i];
1553
9.60M
    m2[6][i] = m1[2][i] - m1[6][i];
1554
9.60M
    m2[7][i] = m1[3][i] - m1[7][i];
1555
9.60M
    m2[8][i] = m1[8][i] + m1[12][i];
1556
9.60M
    m2[9][i] = m1[9][i] + m1[13][i];
1557
9.60M
    m2[10][i] = m1[10][i] + m1[14][i];
1558
9.60M
    m2[11][i] = m1[11][i] + m1[15][i];
1559
9.60M
    m2[12][i] = m1[8][i] - m1[12][i];
1560
9.60M
    m2[13][i] = m1[9][i] - m1[13][i];
1561
9.60M
    m2[14][i] = m1[10][i] - m1[14][i];
1562
9.60M
    m2[15][i] = m1[11][i] - m1[15][i];
1563
1564
9.60M
    m1[0][i] = m2[0][i] + m2[2][i];
1565
9.60M
    m1[1][i] = m2[1][i] + m2[3][i];
1566
9.60M
    m1[2][i] = m2[0][i] - m2[2][i];
1567
9.60M
    m1[3][i] = m2[1][i] - m2[3][i];
1568
9.60M
    m1[4][i] = m2[4][i] + m2[6][i];
1569
9.60M
    m1[5][i] = m2[5][i] + m2[7][i];
1570
9.60M
    m1[6][i] = m2[4][i] - m2[6][i];
1571
9.60M
    m1[7][i] = m2[5][i] - m2[7][i];
1572
9.60M
    m1[8][i] = m2[8][i] + m2[10][i];
1573
9.60M
    m1[9][i] = m2[9][i] + m2[11][i];
1574
9.60M
    m1[10][i] = m2[8][i] - m2[10][i];
1575
9.60M
    m1[11][i] = m2[9][i] - m2[11][i];
1576
9.60M
    m1[12][i] = m2[12][i] + m2[14][i];
1577
9.60M
    m1[13][i] = m2[13][i] + m2[15][i];
1578
9.60M
    m1[14][i] = m2[12][i] - m2[14][i];
1579
9.60M
    m1[15][i] = m2[13][i] - m2[15][i];
1580
1581
9.60M
    m2[0][i] = m1[0][i] + m1[1][i];
1582
9.60M
    m2[1][i] = m1[0][i] - m1[1][i];
1583
9.60M
    m2[2][i] = m1[2][i] + m1[3][i];
1584
9.60M
    m2[3][i] = m1[2][i] - m1[3][i];
1585
9.60M
    m2[4][i] = m1[4][i] + m1[5][i];
1586
9.60M
    m2[5][i] = m1[4][i] - m1[5][i];
1587
9.60M
    m2[6][i] = m1[6][i] + m1[7][i];
1588
9.60M
    m2[7][i] = m1[6][i] - m1[7][i];
1589
9.60M
    m2[8][i] = m1[8][i] + m1[9][i];
1590
9.60M
    m2[9][i] = m1[8][i] - m1[9][i];
1591
9.60M
    m2[10][i] = m1[10][i] + m1[11][i];
1592
9.60M
    m2[11][i] = m1[10][i] - m1[11][i];
1593
9.60M
    m2[12][i] = m1[12][i] + m1[13][i];
1594
9.60M
    m2[13][i] = m1[12][i] - m1[13][i];
1595
9.60M
    m2[14][i] = m1[14][i] + m1[15][i];
1596
9.60M
    m2[15][i] = m1[14][i] - m1[15][i];
1597
9.60M
  }
1598
1599
20.4M
  for( i = 0; i < 16; i++ )
1600
19.2M
  {
1601
172M
    for( j = 0; j < 8; j++ )
1602
153M
    {
1603
153M
      sad += abs( m2[i][j] );
1604
153M
    }
1605
19.2M
  }
1606
  
1607
1.20M
  sad -= abs( m2[0][0] );
1608
1.20M
  sad += abs( m2[0][0] ) >> 2;
1609
1.20M
  sad = ( int ) ( sad / sqrt( 16.0 * 8 ) * 2 );
1610
1611
1.20M
  return sad;
1612
1.20M
}
1613
1614
static Distortion xCalcHADs4x8( const Pel* piOrg, const Pel* piCur, int iStrideOrg, int iStrideCur )
1615
203k
{
1616
203k
  int k, i, j, jj, sad = 0;
1617
203k
  int diff[32], m1[8][4], m2[8][4];
1618
1.82M
  for( k = 0; k < 32; k += 4 )
1619
1.62M
  {
1620
1.62M
    diff[k + 0] = piOrg[0] - piCur[0];
1621
1.62M
    diff[k + 1] = piOrg[1] - piCur[1];
1622
1.62M
    diff[k + 2] = piOrg[2] - piCur[2];
1623
1.62M
    diff[k + 3] = piOrg[3] - piCur[3];
1624
1625
1.62M
    piCur += iStrideCur;
1626
1.62M
    piOrg += iStrideOrg;
1627
1.62M
  }
1628
1629
  //horizontal
1630
1.82M
  for( j = 0; j < 8; j++ )
1631
1.62M
  {
1632
1.62M
    jj = j << 2;
1633
1.62M
    m2[j][0] = diff[jj] + diff[jj + 2];
1634
1.62M
    m2[j][1] = diff[jj + 1] + diff[jj + 3];
1635
1.62M
    m2[j][2] = diff[jj] - diff[jj + 2];
1636
1.62M
    m2[j][3] = diff[jj + 1] - diff[jj + 3];
1637
1638
1.62M
    m1[j][0] = m2[j][0] + m2[j][1];
1639
1.62M
    m1[j][1] = m2[j][0] - m2[j][1];
1640
1.62M
    m1[j][2] = m2[j][2] + m2[j][3];
1641
1.62M
    m1[j][3] = m2[j][2] - m2[j][3];
1642
1.62M
  }
1643
1644
  //vertical
1645
1.01M
  for( i = 0; i < 4; i++ )
1646
812k
  {
1647
812k
    m2[0][i] = m1[0][i] + m1[4][i];
1648
812k
    m2[1][i] = m1[1][i] + m1[5][i];
1649
812k
    m2[2][i] = m1[2][i] + m1[6][i];
1650
812k
    m2[3][i] = m1[3][i] + m1[7][i];
1651
812k
    m2[4][i] = m1[0][i] - m1[4][i];
1652
812k
    m2[5][i] = m1[1][i] - m1[5][i];
1653
812k
    m2[6][i] = m1[2][i] - m1[6][i];
1654
812k
    m2[7][i] = m1[3][i] - m1[7][i];
1655
1656
812k
    m1[0][i] = m2[0][i] + m2[2][i];
1657
812k
    m1[1][i] = m2[1][i] + m2[3][i];
1658
812k
    m1[2][i] = m2[0][i] - m2[2][i];
1659
812k
    m1[3][i] = m2[1][i] - m2[3][i];
1660
812k
    m1[4][i] = m2[4][i] + m2[6][i];
1661
812k
    m1[5][i] = m2[5][i] + m2[7][i];
1662
812k
    m1[6][i] = m2[4][i] - m2[6][i];
1663
812k
    m1[7][i] = m2[5][i] - m2[7][i];
1664
1665
812k
    m2[0][i] = m1[0][i] + m1[1][i];
1666
812k
    m2[1][i] = m1[0][i] - m1[1][i];
1667
812k
    m2[2][i] = m1[2][i] + m1[3][i];
1668
812k
    m2[3][i] = m1[2][i] - m1[3][i];
1669
812k
    m2[4][i] = m1[4][i] + m1[5][i];
1670
812k
    m2[5][i] = m1[4][i] - m1[5][i];
1671
812k
    m2[6][i] = m1[6][i] + m1[7][i];
1672
812k
    m2[7][i] = m1[6][i] - m1[7][i];
1673
812k
  }
1674
1675
1.82M
  for( i = 0; i < 8; i++ )
1676
1.62M
  {
1677
8.12M
    for( j = 0; j < 4; j++ )
1678
6.50M
    {
1679
6.50M
      sad += abs( m2[i][j] );
1680
6.50M
    }
1681
1.62M
  }
1682
  
1683
203k
  sad -= abs( m2[0][0] );
1684
203k
  sad += abs( m2[0][0] ) >> 2;
1685
203k
  sad = ( int ) ( sad / sqrt( 4.0 * 8 ) * 2 );
1686
1687
203k
  return sad;
1688
203k
}
1689
1690
static Distortion xCalcHADs8x4( const Pel* piOrg, const Pel* piCur, int iStrideOrg, int iStrideCur )
1691
211k
{
1692
211k
  int k, i, j, jj, sad = 0;
1693
211k
  int diff[32], m1[4][8], m2[4][8];
1694
1.05M
  for( k = 0; k < 32; k += 8 )
1695
847k
  {
1696
847k
    diff[k + 0] = piOrg[0] - piCur[0];
1697
847k
    diff[k + 1] = piOrg[1] - piCur[1];
1698
847k
    diff[k + 2] = piOrg[2] - piCur[2];
1699
847k
    diff[k + 3] = piOrg[3] - piCur[3];
1700
847k
    diff[k + 4] = piOrg[4] - piCur[4];
1701
847k
    diff[k + 5] = piOrg[5] - piCur[5];
1702
847k
    diff[k + 6] = piOrg[6] - piCur[6];
1703
847k
    diff[k + 7] = piOrg[7] - piCur[7];
1704
1705
847k
    piCur += iStrideCur;
1706
847k
    piOrg += iStrideOrg;
1707
847k
  }
1708
1709
  //horizontal
1710
1.05M
  for( j = 0; j < 4; j++ )
1711
847k
  {
1712
847k
    jj = j << 3;
1713
1714
847k
    m2[j][0] = diff[jj] + diff[jj + 4];
1715
847k
    m2[j][1] = diff[jj + 1] + diff[jj + 5];
1716
847k
    m2[j][2] = diff[jj + 2] + diff[jj + 6];
1717
847k
    m2[j][3] = diff[jj + 3] + diff[jj + 7];
1718
847k
    m2[j][4] = diff[jj] - diff[jj + 4];
1719
847k
    m2[j][5] = diff[jj + 1] - diff[jj + 5];
1720
847k
    m2[j][6] = diff[jj + 2] - diff[jj + 6];
1721
847k
    m2[j][7] = diff[jj + 3] - diff[jj + 7];
1722
1723
847k
    m1[j][0] = m2[j][0] + m2[j][2];
1724
847k
    m1[j][1] = m2[j][1] + m2[j][3];
1725
847k
    m1[j][2] = m2[j][0] - m2[j][2];
1726
847k
    m1[j][3] = m2[j][1] - m2[j][3];
1727
847k
    m1[j][4] = m2[j][4] + m2[j][6];
1728
847k
    m1[j][5] = m2[j][5] + m2[j][7];
1729
847k
    m1[j][6] = m2[j][4] - m2[j][6];
1730
847k
    m1[j][7] = m2[j][5] - m2[j][7];
1731
1732
847k
    m2[j][0] = m1[j][0] + m1[j][1];
1733
847k
    m2[j][1] = m1[j][0] - m1[j][1];
1734
847k
    m2[j][2] = m1[j][2] + m1[j][3];
1735
847k
    m2[j][3] = m1[j][2] - m1[j][3];
1736
847k
    m2[j][4] = m1[j][4] + m1[j][5];
1737
847k
    m2[j][5] = m1[j][4] - m1[j][5];
1738
847k
    m2[j][6] = m1[j][6] + m1[j][7];
1739
847k
    m2[j][7] = m1[j][6] - m1[j][7];
1740
847k
  }
1741
1742
  //vertical
1743
1.90M
  for( i = 0; i < 8; i++ )
1744
1.69M
  {
1745
1.69M
    m1[0][i] = m2[0][i] + m2[2][i];
1746
1.69M
    m1[1][i] = m2[1][i] + m2[3][i];
1747
1.69M
    m1[2][i] = m2[0][i] - m2[2][i];
1748
1.69M
    m1[3][i] = m2[1][i] - m2[3][i];
1749
1750
1.69M
    m2[0][i] = m1[0][i] + m1[1][i];
1751
1.69M
    m2[1][i] = m1[0][i] - m1[1][i];
1752
1.69M
    m2[2][i] = m1[2][i] + m1[3][i];
1753
1.69M
    m2[3][i] = m1[2][i] - m1[3][i];
1754
1.69M
  }
1755
1756
1.05M
  for( i = 0; i < 4; i++ )
1757
847k
  {
1758
7.62M
    for( j = 0; j < 8; j++ )
1759
6.78M
    {
1760
6.78M
      sad += abs( m2[i][j] );
1761
6.78M
    }
1762
847k
  }
1763
  
1764
211k
  sad -= abs( m2[0][0] );
1765
211k
  sad += abs( m2[0][0] ) >> 2;
1766
211k
  sad = ( int ) ( sad / sqrt( 4.0 * 8 ) * 2 );
1767
1768
211k
  return sad;
1769
211k
}
1770
1771
Distortion RdCost::xGetHAD2SADs( const DistParam &rcDtParam )
1772
1.21M
{
1773
1.21M
  if( rcDtParam.applyWeight )
1774
0
  {
1775
0
    THROW(" no support");
1776
0
  }
1777
1778
1.21M
  Distortion distHad = xGetHADs<false>( rcDtParam );
1779
1.21M
  Distortion distSad = 0;
1780
1.21M
  {
1781
1.21M
    CHECKD( (rcDtParam.org.width != rcDtParam.org.stride) || (rcDtParam.cur.stride != rcDtParam.org.stride) , "this functions assumes compact, aligned buffering");
1782
1783
1.21M
    const Pel* piOrg  = rcDtParam.org.buf;
1784
1.21M
    const Pel* piCur  = rcDtParam.cur.buf;
1785
1.21M
    int  iRows        = rcDtParam.org.height>>2;
1786
1.21M
    int  iCols        = rcDtParam.org.width<<2;
1787
1788
1.21M
    Distortion uiSum = 0;
1789
1790
10.7M
    for( int y = 0; y < iRows;  y++ )
1791
9.57M
    {
1792
105M
      for (int n = 0; n < iCols; n+=16 )
1793
95.6M
      {
1794
95.6M
        uiSum += abs( piOrg[n+ 0] - piCur[n+ 0] );
1795
95.6M
        uiSum += abs( piOrg[n+ 1] - piCur[n+ 1] );
1796
95.6M
        uiSum += abs( piOrg[n+ 2] - piCur[n+ 2] );
1797
95.6M
        uiSum += abs( piOrg[n+ 3] - piCur[n+ 3] );
1798
95.6M
        uiSum += abs( piOrg[n+ 4] - piCur[n+ 4] );
1799
95.6M
        uiSum += abs( piOrg[n+ 5] - piCur[n+ 5] );
1800
95.6M
        uiSum += abs( piOrg[n+ 6] - piCur[n+ 6] );
1801
95.6M
        uiSum += abs( piOrg[n+ 7] - piCur[n+ 7] );
1802
95.6M
        uiSum += abs( piOrg[n+ 8] - piCur[n+ 8] );
1803
95.6M
        uiSum += abs( piOrg[n+ 9] - piCur[n+ 9] );
1804
95.6M
        uiSum += abs( piOrg[n+10] - piCur[n+10] );
1805
95.6M
        uiSum += abs( piOrg[n+11] - piCur[n+11] );
1806
95.6M
        uiSum += abs( piOrg[n+12] - piCur[n+12] );
1807
95.6M
        uiSum += abs( piOrg[n+13] - piCur[n+13] );
1808
95.6M
        uiSum += abs( piOrg[n+14] - piCur[n+14] );
1809
95.6M
        uiSum += abs( piOrg[n+15] - piCur[n+15] );
1810
95.6M
      }
1811
9.57M
      piOrg += iCols;
1812
9.57M
      piCur += iCols;
1813
9.57M
    }
1814
1815
1.21M
    distSad = (uiSum >> DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth));
1816
1.21M
  }
1817
1818
0
  return std::min( distHad, 2*distSad);
1819
1.21M
}
1820
1821
template<bool fastHad>
1822
Distortion RdCost::xGetHADs( const DistParam &rcDtParam )
1823
1.99M
{
1824
1.99M
  if( rcDtParam.applyWeight )
1825
0
  {
1826
0
    THROW(" no support");
1827
0
  }
1828
1.99M
  const Pel* piOrg = rcDtParam.org.buf;
1829
1.99M
  const Pel* piCur = rcDtParam.cur.buf;
1830
1.99M
  const int  iRows = rcDtParam.org.height;
1831
1.99M
  const int  iCols = rcDtParam.org.width;
1832
1.99M
  const int  iStrideCur = rcDtParam.cur.stride;
1833
1.99M
  const int  iStrideOrg = rcDtParam.org.stride;
1834
1835
1.99M
  int  x = 0, y = 0;
1836
1837
1.99M
  Distortion uiSum = 0;
1838
1839
1.99M
  if( iCols > iRows && ( iRows & 7 ) == 0 && ( iCols & 15 ) == 0 )
1840
424k
  {
1841
1.05M
    for( y = 0; y < iRows; y += 8 )
1842
625k
    {
1843
1.78M
      for( x = 0; x < iCols; x += 16 )
1844
1.16M
      {
1845
1.16M
        uiSum += xCalcHADs16x8( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1846
1.16M
      }
1847
625k
      piOrg += iStrideOrg * 8;
1848
625k
      piCur += iStrideCur * 8;
1849
625k
    }
1850
424k
  }
1851
1.57M
  else if( iCols < iRows && ( iCols & 7 ) == 0 && ( iRows & 15 ) == 0 )
1852
431k
  {
1853
1.21M
    for( y = 0; y < iRows; y += 16 )
1854
782k
    {
1855
1.98M
      for( x = 0; x < iCols; x += 8 )
1856
1.20M
      {
1857
1.20M
        uiSum += xCalcHADs8x16( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1858
1.20M
      }
1859
782k
      piOrg += iStrideOrg * 16;
1860
782k
      piCur += iStrideCur * 16;
1861
782k
    }
1862
431k
  }
1863
1.13M
  else if( iCols > iRows && ( iRows & 3 ) == 0 && ( iCols & 7 ) == 0 )
1864
113k
  {
1865
226k
    for( y = 0; y < iRows; y += 4 )
1866
113k
    {
1867
325k
      for( x = 0; x < iCols; x += 8 )
1868
211k
      {
1869
211k
        uiSum += xCalcHADs8x4( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1870
211k
      }
1871
113k
      piOrg += iStrideOrg * 4;
1872
113k
      piCur += iStrideCur * 4;
1873
113k
    }
1874
113k
  }
1875
1.02M
  else if( iCols < iRows && ( iCols & 3 ) == 0 && ( iRows & 7 ) == 0 )
1876
106k
  {
1877
309k
    for( y = 0; y < iRows; y += 8 )
1878
203k
    {
1879
406k
      for( x = 0; x < iCols; x += 4 )
1880
203k
      {
1881
203k
        uiSum += xCalcHADs4x8( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1882
203k
      }
1883
203k
      piOrg += iStrideOrg * 8;
1884
203k
      piCur += iStrideCur * 8;
1885
203k
    }
1886
106k
  }
1887
919k
  else if( fastHad && ( ( iRows % 32 == 0 ) && ( iCols % 32 == 0 ) ) && iRows == iCols )
1888
0
  {
1889
0
    for( y = 0; y < iRows; y += 16 )
1890
0
    {
1891
0
      for( x = 0; x < iCols; x += 16 )
1892
0
      {
1893
0
        uiSum += xCalcHADs16x16_fast( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1894
0
      }
1895
0
      piOrg += 16 * iStrideOrg;
1896
0
      piCur += 16 * iStrideCur;
1897
0
    }
1898
0
  }
1899
919k
  else if( ( iRows % 8 == 0 ) && ( iCols % 8 == 0 ) )
1900
828k
  {
1901
4.47M
    for( y = 0; y < iRows; y += 8 )
1902
3.64M
    {
1903
25.4M
      for( x = 0; x < iCols; x += 8 )
1904
21.8M
      {
1905
21.8M
        uiSum += xCalcHADs8x8( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1906
21.8M
      }
1907
3.64M
      piOrg += 8*iStrideOrg;
1908
3.64M
      piCur += 8*iStrideCur;
1909
3.64M
    }
1910
828k
  }
1911
91.2k
  else if( ( iRows % 4 == 0 ) && ( iCols % 4 == 0 ) )
1912
55.8k
  {
1913
111k
    for( y = 0; y < iRows; y += 4 )
1914
55.8k
    {
1915
111k
      for( x = 0; x < iCols; x += 4 )
1916
55.8k
      {
1917
55.8k
        uiSum += xCalcHADs4x4( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1918
55.8k
      }
1919
55.8k
      piOrg += 4*iStrideOrg;
1920
55.8k
      piCur += 4*iStrideCur;
1921
55.8k
    }
1922
55.8k
  }
1923
35.3k
  else if( ( iRows % 2 == 0 ) && ( iCols % 2 == 0 ) )
1924
35.3k
  {
1925
70.6k
    for( y = 0; y < iRows; y += 2 )
1926
35.3k
    {
1927
227k
      for( x = 0; x < iCols; x += 2 )
1928
192k
      {
1929
192k
        uiSum += xCalcHADs2x2( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1930
192k
      }
1931
35.3k
      piOrg += 2*iStrideOrg;
1932
35.3k
      piCur += 2*iStrideCur;
1933
35.3k
    }
1934
35.3k
  }
1935
18.4E
  else
1936
18.4E
  {
1937
18.4E
    THROW( "Invalid size" );
1938
18.4E
  }
1939
1940
1.99M
  return (uiSum >> DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth));
1941
1.99M
}
unsigned long vvenc::RdCost::xGetHADs<false>(vvenc::DistParam const&)
Line
Count
Source
1823
1.99M
{
1824
1.99M
  if( rcDtParam.applyWeight )
1825
0
  {
1826
0
    THROW(" no support");
1827
0
  }
1828
1.99M
  const Pel* piOrg = rcDtParam.org.buf;
1829
1.99M
  const Pel* piCur = rcDtParam.cur.buf;
1830
1.99M
  const int  iRows = rcDtParam.org.height;
1831
1.99M
  const int  iCols = rcDtParam.org.width;
1832
1.99M
  const int  iStrideCur = rcDtParam.cur.stride;
1833
1.99M
  const int  iStrideOrg = rcDtParam.org.stride;
1834
1835
1.99M
  int  x = 0, y = 0;
1836
1837
1.99M
  Distortion uiSum = 0;
1838
1839
1.99M
  if( iCols > iRows && ( iRows & 7 ) == 0 && ( iCols & 15 ) == 0 )
1840
424k
  {
1841
1.05M
    for( y = 0; y < iRows; y += 8 )
1842
625k
    {
1843
1.78M
      for( x = 0; x < iCols; x += 16 )
1844
1.16M
      {
1845
1.16M
        uiSum += xCalcHADs16x8( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1846
1.16M
      }
1847
625k
      piOrg += iStrideOrg * 8;
1848
625k
      piCur += iStrideCur * 8;
1849
625k
    }
1850
424k
  }
1851
1.57M
  else if( iCols < iRows && ( iCols & 7 ) == 0 && ( iRows & 15 ) == 0 )
1852
431k
  {
1853
1.21M
    for( y = 0; y < iRows; y += 16 )
1854
782k
    {
1855
1.98M
      for( x = 0; x < iCols; x += 8 )
1856
1.20M
      {
1857
1.20M
        uiSum += xCalcHADs8x16( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1858
1.20M
      }
1859
782k
      piOrg += iStrideOrg * 16;
1860
782k
      piCur += iStrideCur * 16;
1861
782k
    }
1862
431k
  }
1863
1.13M
  else if( iCols > iRows && ( iRows & 3 ) == 0 && ( iCols & 7 ) == 0 )
1864
113k
  {
1865
226k
    for( y = 0; y < iRows; y += 4 )
1866
113k
    {
1867
325k
      for( x = 0; x < iCols; x += 8 )
1868
211k
      {
1869
211k
        uiSum += xCalcHADs8x4( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1870
211k
      }
1871
113k
      piOrg += iStrideOrg * 4;
1872
113k
      piCur += iStrideCur * 4;
1873
113k
    }
1874
113k
  }
1875
1.02M
  else if( iCols < iRows && ( iCols & 3 ) == 0 && ( iRows & 7 ) == 0 )
1876
106k
  {
1877
309k
    for( y = 0; y < iRows; y += 8 )
1878
203k
    {
1879
406k
      for( x = 0; x < iCols; x += 4 )
1880
203k
      {
1881
203k
        uiSum += xCalcHADs4x8( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1882
203k
      }
1883
203k
      piOrg += iStrideOrg * 8;
1884
203k
      piCur += iStrideCur * 8;
1885
203k
    }
1886
106k
  }
1887
919k
  else if( fastHad && ( ( iRows % 32 == 0 ) && ( iCols % 32 == 0 ) ) && iRows == iCols )
1888
0
  {
1889
0
    for( y = 0; y < iRows; y += 16 )
1890
0
    {
1891
0
      for( x = 0; x < iCols; x += 16 )
1892
0
      {
1893
0
        uiSum += xCalcHADs16x16_fast( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1894
0
      }
1895
0
      piOrg += 16 * iStrideOrg;
1896
0
      piCur += 16 * iStrideCur;
1897
0
    }
1898
0
  }
1899
919k
  else if( ( iRows % 8 == 0 ) && ( iCols % 8 == 0 ) )
1900
828k
  {
1901
4.47M
    for( y = 0; y < iRows; y += 8 )
1902
3.64M
    {
1903
25.4M
      for( x = 0; x < iCols; x += 8 )
1904
21.8M
      {
1905
21.8M
        uiSum += xCalcHADs8x8( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1906
21.8M
      }
1907
3.64M
      piOrg += 8*iStrideOrg;
1908
3.64M
      piCur += 8*iStrideCur;
1909
3.64M
    }
1910
828k
  }
1911
91.2k
  else if( ( iRows % 4 == 0 ) && ( iCols % 4 == 0 ) )
1912
55.8k
  {
1913
111k
    for( y = 0; y < iRows; y += 4 )
1914
55.8k
    {
1915
111k
      for( x = 0; x < iCols; x += 4 )
1916
55.8k
      {
1917
55.8k
        uiSum += xCalcHADs4x4( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1918
55.8k
      }
1919
55.8k
      piOrg += 4*iStrideOrg;
1920
55.8k
      piCur += 4*iStrideCur;
1921
55.8k
    }
1922
55.8k
  }
1923
35.3k
  else if( ( iRows % 2 == 0 ) && ( iCols % 2 == 0 ) )
1924
35.3k
  {
1925
70.6k
    for( y = 0; y < iRows; y += 2 )
1926
35.3k
    {
1927
227k
      for( x = 0; x < iCols; x += 2 )
1928
192k
      {
1929
192k
        uiSum += xCalcHADs2x2( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1930
192k
      }
1931
35.3k
      piOrg += 2*iStrideOrg;
1932
35.3k
      piCur += 2*iStrideCur;
1933
35.3k
    }
1934
35.3k
  }
1935
18.4E
  else
1936
18.4E
  {
1937
18.4E
    THROW( "Invalid size" );
1938
18.4E
  }
1939
1940
1.99M
  return (uiSum >> DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth));
1941
1.99M
}
Unexecuted instantiation: unsigned long vvenc::RdCost::xGetHADs<true>(vvenc::DistParam const&)
1942
1943
1944
void RdCost::saveUnadjustedLambda()
1945
11.7k
{
1946
11.7k
  m_dLambda_unadjusted = m_dLambda;
1947
11.7k
  m_DistScaleUnadjusted = m_DistScale;
1948
11.7k
}
1949
1950
1951
inline Distortion getWeightedMSE(const Pel org, const Pel cur, const int64_t fixedPTweight, unsigned uiShift)
1952
0
{
1953
0
  const Intermediate_Int iTemp = org - cur;
1954
0
  return Intermediate_Int((fixedPTweight*(iTemp*iTemp) + (1 << 15)) >> uiShift);
1955
0
}
1956
1957
static Distortion fixWeightedSSE_Core( const DistParam& rcDtParam, uint32_t fixedPTweight )
1958
0
{
1959
0
        int  iRows = rcDtParam.org.height;
1960
0
  const Pel* piOrg = rcDtParam.org.buf;
1961
0
  const Pel* piCur = rcDtParam.cur.buf;
1962
0
  const int  iCols = rcDtParam.org.width;
1963
0
  const int  iStrideCur = rcDtParam.cur.stride;
1964
0
  const int  iStrideOrg = rcDtParam.org.stride;
1965
1966
0
  Distortion uiSum   = 0;
1967
0
  uint32_t uiShift = 16 + (DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth) << 1);
1968
1969
  // cf, column factor, offset of the second column, to be set to '0' for width of '1'
1970
0
  const int cf =  1 - ( iCols & 1 );
1971
0
  CHECK( ( iCols & 1 ) && iCols != 1, "Width can only be even or equal to '1'!" );
1972
  
1973
0
  for( ; iRows != 0; iRows-- )
1974
0
  {
1975
0
    for (int n = 0; n < iCols; n+=2 )
1976
0
    {
1977
0
      uiSum += getWeightedMSE( piOrg[n   ], piCur[n   ], fixedPTweight, uiShift );
1978
0
      uiSum += getWeightedMSE( piOrg[n+cf], piCur[n+cf], fixedPTweight, uiShift );
1979
0
    }
1980
0
    piOrg += iStrideOrg;
1981
0
    piCur += iStrideCur;
1982
0
  }
1983
1984
0
  return ( uiSum >> ( 1 - cf ) );
1985
0
}
1986
1987
0
void RdCost::xGetSAD8X5(const DistParam& rcDtParam, Distortion* cost, bool isCalCentrePos) {
1988
0
  DistParam rcDtParamTmp0 = rcDtParam;
1989
1990
0
  DistParam rcDtParamTmp1 = rcDtParam;
1991
0
  rcDtParamTmp1.org.buf += 1;
1992
0
  rcDtParamTmp1.cur.buf -= 1;
1993
1994
0
  DistParam rcDtParamTmp2 = rcDtParam;
1995
0
  rcDtParamTmp2.org.buf += 2;
1996
0
  rcDtParamTmp2.cur.buf -= 2;
1997
1998
0
  DistParam rcDtParamTmp3 = rcDtParam;
1999
0
  rcDtParamTmp3.org.buf += 3;
2000
0
  rcDtParamTmp3.cur.buf -= 3;
2001
2002
0
  DistParam rcDtParamTmp4 = rcDtParam;
2003
0
  rcDtParamTmp4.org.buf += 4;
2004
0
  rcDtParamTmp4.cur.buf -= 4;
2005
  
2006
0
  cost[0] = (RdCost::xGetSAD8(rcDtParamTmp0)) >> 1;
2007
0
  cost[1] = (RdCost::xGetSAD8(rcDtParamTmp1)) >> 1;
2008
0
  if (isCalCentrePos) cost[2] = (RdCost::xGetSAD8(rcDtParamTmp2)) >> 1;
2009
0
  cost[3] = (RdCost::xGetSAD8(rcDtParamTmp3)) >> 1;
2010
0
  cost[4] = (RdCost::xGetSAD8(rcDtParamTmp4)) >> 1;
2011
0
}
2012
2013
0
void RdCost::xGetSAD16X5(const DistParam& rcDtParam, Distortion* cost, bool isCalCentrePos) {
2014
0
  DistParam rcDtParamTmp0 = rcDtParam;
2015
2016
0
  DistParam rcDtParamTmp1 = rcDtParam;
2017
0
  rcDtParamTmp1.org.buf += 1;
2018
0
  rcDtParamTmp1.cur.buf -= 1;
2019
2020
0
  DistParam rcDtParamTmp2 = rcDtParam;
2021
0
  rcDtParamTmp2.org.buf += 2;
2022
0
  rcDtParamTmp2.cur.buf -= 2;
2023
2024
0
  DistParam rcDtParamTmp3 = rcDtParam;
2025
0
  rcDtParamTmp3.org.buf += 3;
2026
0
  rcDtParamTmp3.cur.buf -= 3;
2027
2028
0
  DistParam rcDtParamTmp4 = rcDtParam;
2029
0
  rcDtParamTmp4.org.buf += 4;
2030
0
  rcDtParamTmp4.cur.buf -= 4;
2031
  
2032
0
  cost[0] = (RdCost::xGetSAD16(rcDtParamTmp0)) >> 1;
2033
0
  cost[1] = (RdCost::xGetSAD16(rcDtParamTmp1)) >> 1;
2034
0
  if (isCalCentrePos) cost[2] = (RdCost::xGetSAD16(rcDtParamTmp2)) >> 1;
2035
0
  cost[3] = (RdCost::xGetSAD16(rcDtParamTmp3)) >> 1;
2036
0
  cost[4] = (RdCost::xGetSAD16(rcDtParamTmp4)) >> 1;
2037
0
}
2038
2039
void RdCost::setDistParamGeo(DistParam &rcDP, const CPelBuf &org, const Pel *piRefY, int iRefStride, const Pel *mask,
2040
                          int iMaskStride, int stepX, int iMaskStride2, int bitDepth, ComponentID compID)
2041
0
{
2042
0
  rcDP.bitDepth = bitDepth;
2043
0
  rcDP.compID   = compID;
2044
2045
  // set Original & Curr Pointer / Stride
2046
0
  rcDP.org        = org;
2047
0
  rcDP.cur.buf    = piRefY;
2048
0
  rcDP.cur.stride = iRefStride;
2049
2050
  // set Mask
2051
0
  rcDP.mask        = mask;
2052
0
  rcDP.maskStride  = iMaskStride;
2053
0
  rcDP.stepX       = stepX;
2054
0
  rcDP.maskStride2 = iMaskStride2;
2055
2056
  // set Block Width / Height
2057
0
  rcDP.cur.width                     = org.width;
2058
0
  rcDP.cur.height                    = org.height;
2059
0
  rcDP.maximumDistortionForEarlyExit = MAX_DISTORTION;
2060
2061
  // set Cost function for motion estimation with Mask
2062
0
  rcDP.distFunc = m_afpDistortFunc[0][DF_SAD_WITH_MASK];
2063
0
}
2064
2065
Distortion RdCost::xGetSADwMask(const DistParam &rcDtParam)
2066
0
{
2067
0
  const Pel *    org             = rcDtParam.org.buf;
2068
0
  const Pel *    cur             = rcDtParam.cur.buf;
2069
0
  const Pel *    mask            = rcDtParam.mask;
2070
0
  const int      cols            = rcDtParam.org.width;
2071
0
  int            rows            = rcDtParam.org.height;
2072
0
  const int      subShift        = rcDtParam.subShift;
2073
0
  const int      subStep         = (1 << subShift);
2074
0
  const int      strideCur       = rcDtParam.cur.stride * subStep;
2075
0
  const int      strideOrg       = rcDtParam.org.stride * subStep;
2076
0
  const int      strideMask      = rcDtParam.maskStride * subStep;
2077
0
  const int      stepX           = rcDtParam.stepX;
2078
0
  const int      strideMask2     = rcDtParam.maskStride2;
2079
0
  const uint32_t distortionShift = DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth);
2080
2081
0
  Distortion sum = 0;
2082
0
  for (; rows != 0; rows -= subStep)
2083
0
  {
2084
0
    for (int n = 0; n < cols; n++)
2085
0
    {
2086
0
      sum += abs(org[n] - cur[n]) * *mask;
2087
0
      mask += stepX;
2088
0
    }
2089
0
    org += strideOrg;
2090
0
    cur += strideCur;
2091
0
    mask += strideMask;
2092
0
    mask += strideMask2;
2093
0
  }
2094
0
  sum <<= subShift;
2095
0
  return (sum >> distortionShift);
2096
0
}
2097
2098
Distortion RdCost::getBvCostMultiplePredsIBC(int x, int y, bool useIMV)
2099
232k
{
2100
232k
  return getBvCostIBC( getBitsMultiplePredsIBC( x, y, useIMV ) );
2101
232k
}
2102
2103
static inline unsigned getIComponentBitsIBC( int val )
2104
7.66M
{
2105
7.66M
  if( !val ) return 1;
2106
2107
3.88M
  const unsigned int l2 = floorLog2( (val <= 0) ? (-val << 1) + 1 : (val << 1) );
2108
2109
3.88M
  return (l2 << 1) + 1;
2110
7.66M
}
2111
2112
// the bits of the block vector ( x, y ) with the cheaper of the two predictors, as estimated by the IBC search
2113
static unsigned bvBitsMultiplePreds( const Mv* predictors, const int x, const int y, const bool useIMV )
2114
2.91M
{
2115
2.91M
  int rmvH[2];
2116
2.91M
  int rmvV[2];
2117
2.91M
  rmvH[0] = x - predictors[0].hor;
2118
2.91M
  rmvH[1] = x - predictors[1].hor;
2119
2120
2.91M
  rmvV[0] = y - predictors[0].ver;
2121
2.91M
  rmvV[1] = y - predictors[1].ver;
2122
2.91M
  int absCand[2];
2123
2.91M
  absCand[0] = abs(rmvH[0]) + abs(rmvV[0]);
2124
2.91M
  absCand[1] = abs(rmvH[1]) + abs(rmvV[1]);
2125
2126
2.91M
  if (useIMV && x % 4 == 0 && y % 4 == 0)
2127
916k
  {
2128
916k
    int rmvHQP[2];
2129
916k
    int rmvVQP[2];
2130
2131
916k
    int imvShift = 2;
2132
916k
    int offset = 1 << (imvShift - 1);
2133
2134
916k
    rmvHQP[0] = (x >> 2) - ((predictors[0].hor + offset) >> 2);
2135
916k
    rmvHQP[1] = (x >> 2) - ((predictors[1].hor + offset) >> 2);
2136
916k
    rmvVQP[0] = (y >> 2) - ((predictors[0].ver + offset) >> 2);
2137
916k
    rmvVQP[1] = (y >> 2) - ((predictors[1].ver + offset) >> 2);
2138
2139
916k
    int absCandQP[2];
2140
916k
    absCandQP[0] = abs(rmvHQP[0]) + abs(rmvVQP[0]);
2141
916k
    absCandQP[1] = abs(rmvHQP[1]) + abs(rmvVQP[1]);
2142
916k
    unsigned int candBits0QP, candBits1QP;
2143
916k
    if (absCand[0] < absCand[1])
2144
0
    {
2145
0
      unsigned int candBits0 = getIComponentBitsIBC(rmvH[0]) + getIComponentBitsIBC(rmvV[0]);
2146
0
      if (absCandQP[0] < absCandQP[1])
2147
0
      {
2148
0
        candBits0QP = getIComponentBitsIBC(rmvHQP[0]) + getIComponentBitsIBC(rmvVQP[0]);
2149
0
        return candBits0QP < candBits0 ? candBits0QP : candBits0;
2150
0
      }
2151
0
      else
2152
0
      {
2153
0
        candBits1QP = getIComponentBitsIBC(rmvHQP[1]) + getIComponentBitsIBC(rmvVQP[1]);
2154
0
        return candBits1QP < candBits0 ? candBits1QP : candBits0;
2155
0
      }
2156
0
    }
2157
916k
    else
2158
916k
    {
2159
916k
      unsigned int candBits1 = getIComponentBitsIBC(rmvH[1]) + getIComponentBitsIBC(rmvV[1]);
2160
916k
      if (absCandQP[0] < absCandQP[1])
2161
0
      {
2162
0
        candBits0QP = getIComponentBitsIBC(rmvHQP[0]) + getIComponentBitsIBC(rmvVQP[0]);
2163
0
        return candBits0QP < candBits1 ? candBits0QP : candBits1;
2164
0
      }
2165
916k
      else
2166
916k
      {
2167
916k
        candBits1QP = getIComponentBitsIBC(rmvHQP[1]) + getIComponentBitsIBC(rmvVQP[1]);
2168
18.4E
        return candBits1QP < candBits1 ? candBits1QP : candBits1;
2169
916k
      }
2170
916k
    }
2171
916k
  }
2172
1.99M
  else
2173
1.99M
  {
2174
1.99M
    if (absCand[0] < absCand[1])
2175
0
    {
2176
0
      return getIComponentBitsIBC(rmvH[0]) + getIComponentBitsIBC(rmvV[0]);
2177
0
    }
2178
1.99M
    else
2179
1.99M
    {
2180
1.99M
      return getIComponentBitsIBC(rmvH[1]) + getIComponentBitsIBC(rmvV[1]);
2181
1.99M
    }
2182
1.99M
  }
2183
2.91M
}
2184
2185
unsigned int RdCost::getBitsMultiplePredsIBC(int x, int y, bool useIMV)
2186
232k
{
2187
232k
  return bvBitsMultiplePreds( m_bvPredictors, x, y, useIMV );
2188
232k
}
2189
2190
static void bvBitsLineCore( const Mv* predictors, const int x0, const int xStep, const int count, const int y, const bool useIMV, unsigned* bits )
2191
42.5k
{
2192
2.72M
  for( int i = 0; i < count; i++ )
2193
2.68M
  {
2194
2.68M
    bits[i] = bvBitsMultiplePreds( predictors, x0 + i * xStep, y, useIMV );
2195
2.68M
  }
2196
42.5k
}
2197
2198
void RdCost::initLumaLevelToWeightTable( int lumaBD )
2199
0
{
2200
0
  const int lutSize = 1 << lumaBD;
2201
0
  if (m_lumaLevelToWeightPLUT.empty())
2202
0
    m_lumaLevelToWeightPLUT.resize(lutSize, 1.0);
2203
2204
0
  for (int i = 0; i < lutSize; i++)
2205
0
  {
2206
0
    double x = lumaBD < 10 ? i << (10 - lumaBD) : lumaBD > 10 ? i >> (lumaBD - 10) : i;
2207
0
    double y;
2208
0
    y = 0.015*x - 1.5 - 6;
2209
0
    y = y < -3 ? -3 : (y > 6 ? 6 : y);
2210
0
    m_lumaLevelToWeightPLUT[i] = (uint32_t)(pow(2.0, y / 3.0) * (double)(1 << 16));
2211
0
  }
2212
0
}
2213
2214
} // namespace vvenc
2215
2216
//! \}
2217