Coverage Report

Created: 2026-08-13 07:23

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