Coverage Report

Created: 2026-10-17 06:56

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
4.62k
  : m_afpDistortFunc{ { nullptr, }, { nullptr, } }
66
4.62k
{
67
4.62k
}
68
69
RdCost::~RdCost()
70
4.62k
{
71
4.62k
}
72
73
void RdCost::setLambda( double dLambda, const BitDepths &bitDepths )
74
9.75k
{
75
9.75k
  m_dLambda          = dLambda;
76
9.75k
  m_DistScale        = double(1<<SCALE_BITS) / m_dLambda;
77
9.75k
  m_dLambdaMotionSAD = sqrt(m_dLambda);
78
9.75k
}
79
80
81
// Initialize Function Pointer by [eDFunc]
82
void RdCost::create( bool enableOpt )
83
4.62k
{
84
4.62k
  m_chromaWeight               = 1.0;
85
4.62k
  m_afpDistortFunc[0][DF_SSE    ] = RdCost::xGetSSE;
86
4.62k
  m_afpDistortFunc[0][DF_SSE2   ] = RdCost::xGetSSE;
87
4.62k
  m_afpDistortFunc[0][DF_SSE4   ] = RdCost::xGetSSE4;
88
4.62k
  m_afpDistortFunc[0][DF_SSE8   ] = RdCost::xGetSSE8;
89
4.62k
  m_afpDistortFunc[0][DF_SSE16  ] = RdCost::xGetSSE16;
90
4.62k
  m_afpDistortFunc[0][DF_SSE32  ] = RdCost::xGetSSE32;
91
4.62k
  m_afpDistortFunc[0][DF_SSE64  ] = RdCost::xGetSSE64;
92
4.62k
  m_afpDistortFunc[0][DF_SSE128 ] = RdCost::xGetSSE128;
93
94
4.62k
  m_afpDistortFunc[0][DF_SAD    ] = RdCost::xGetSAD;
95
4.62k
  m_afpDistortFunc[0][DF_SAD2   ] = RdCost::xGetSAD;
96
4.62k
  m_afpDistortFunc[0][DF_SAD4   ] = RdCost::xGetSAD4;
97
4.62k
  m_afpDistortFunc[0][DF_SAD8   ] = RdCost::xGetSAD8;
98
4.62k
  m_afpDistortFunc[0][DF_SAD16  ] = RdCost::xGetSAD16;
99
4.62k
  m_afpDistortFunc[0][DF_SAD32  ] = RdCost::xGetSAD32;
100
4.62k
  m_afpDistortFunc[0][DF_SAD64  ] = RdCost::xGetSAD64;
101
4.62k
  m_afpDistortFunc[0][DF_SAD128 ] = RdCost::xGetSAD128;
102
103
4.62k
  m_afpDistortFunc[0][DF_HAD    ] = RdCost::xGetHADs<false>;
104
4.62k
  m_afpDistortFunc[0][DF_HAD2   ] = RdCost::xGetHADs<false>;
105
4.62k
  m_afpDistortFunc[0][DF_HAD4   ] = RdCost::xGetHADs<false>;
106
4.62k
  m_afpDistortFunc[0][DF_HAD8   ] = RdCost::xGetHADs<false>;
107
4.62k
  m_afpDistortFunc[0][DF_HAD16  ] = RdCost::xGetHADs<false>;
108
4.62k
  m_afpDistortFunc[0][DF_HAD32  ] = RdCost::xGetHADs<false>;
109
4.62k
  m_afpDistortFunc[0][DF_HAD64  ] = RdCost::xGetHADs<false>;
110
4.62k
  m_afpDistortFunc[0][DF_HAD128 ] = RdCost::xGetHADs<false>;
111
112
4.62k
  m_afpDistortFunc[0][DF_HAD_fast    ] = RdCost::xGetHADs<true>;
113
4.62k
  m_afpDistortFunc[0][DF_HAD2_fast   ] = RdCost::xGetHADs<true>;
114
4.62k
  m_afpDistortFunc[0][DF_HAD4_fast   ] = RdCost::xGetHADs<true>;
115
4.62k
  m_afpDistortFunc[0][DF_HAD8_fast   ] = RdCost::xGetHADs<true>;
116
4.62k
  m_afpDistortFunc[0][DF_HAD16_fast  ] = RdCost::xGetHADs<true>;
117
4.62k
  m_afpDistortFunc[0][DF_HAD32_fast  ] = RdCost::xGetHADs<true>;
118
4.62k
  m_afpDistortFunc[0][DF_HAD64_fast  ] = RdCost::xGetHADs<true>;
119
4.62k
  m_afpDistortFunc[0][DF_HAD128_fast ] = RdCost::xGetHADs<true>;
120
121
  //  m_afpDistortFunc[0][DF_SAD_INTERMEDIATE_BITDEPTH] = RdCost::xGetSAD;
122
4.62k
  m_afpDistortFunc[0][DF_HAD_2SAD ] = RdCost::xGetHAD2SADs;
123
124
4.62k
  m_afpDistortFunc[0][DF_SAD_WITH_MASK] = RdCost::xGetSADwMask;
125
  // m_afpDistortFunc[1] can be used in any case
126
4.62k
  memcpy( m_afpDistortFunc[1], m_afpDistortFunc[0], sizeof(m_afpDistortFunc)/2);
127
128
4.62k
  m_fxdWtdPredPtr = fixWeightedSSE_Core;
129
130
4.62k
  m_afpDistortFuncX5[0] = RdCost::xGetSAD8X5;
131
4.62k
  m_afpDistortFuncX5[1] = RdCost::xGetSAD16X5;
132
133
4.62k
#if ENABLE_SIMD_OPT_DIST
134
4.62k
  if( enableOpt )
135
4.62k
  {
136
#ifdef TARGET_SIMD_X86
137
    initRdCostX86();
138
#endif
139
#ifdef TARGET_SIMD_ARM
140
    initRdCostARM();
141
#endif
142
4.62k
  }
143
4.62k
#endif
144
145
4.62k
  m_costMode      = VVENC_COST_STANDARD_LOSSY;
146
4.62k
  m_motionLambda  = 0;
147
4.62k
  m_iCostScale    = 0;
148
4.62k
}
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
47.4k
{
160
47.4k
  rcDP.bitDepth   = bitDepth;
161
47.4k
  rcDP.compID     = compID;
162
163
  // set Original & Curr Pointer / Stride
164
47.4k
  rcDP.org        = org;
165
166
47.4k
  rcDP.cur.buf    = piRefY;
167
47.4k
  rcDP.cur.stride = iRefStride;
168
169
  // set Block Width / Height
170
47.4k
  rcDP.cur.width    = org.width;
171
47.4k
  rcDP.cur.height   = org.height;
172
47.4k
  rcDP.maximumDistortionForEarlyExit = MAX_DISTORTION;
173
174
47.4k
  const int base = (rcDP.bitDepth > 10 || rcDP.applyWeight) ? 1 : 0;
175
47.4k
  if( !useHadamard )
176
47.4k
  {
177
47.4k
    rcDP.distFunc = m_afpDistortFunc[base][ DF_SAD + Log2( org.width ) ];
178
47.4k
  }
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
47.4k
  rcDP.subShift  = 0;
186
187
47.4k
  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
47.4k
  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
47.4k
}
207
208
209
DistParam RdCost::setDistParam( const CPelBuf& org, const CPelBuf& cur, int bitDepth, DFunc dfunc )
210
263k
{
211
263k
  int index = dfunc;
212
263k
  if( dfunc != DF_HAD_2SAD )   // DF_HAD_2SAD has a single entry for all sizes
213
239k
  {
214
239k
    index += Log2(org.width);
215
239k
  }
216
217
263k
  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
263k
  return DistParam( org, cur, m_afpDistortFunc[base][index], bitDepth, 0, COMP_Y );
225
263k
#endif
226
263k
}
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.58M
{
269
2.58M
  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.58M
  Distortion dist;
274
2.58M
  if( ( org.width == 1 ) )
275
0
  {
276
0
    dist = xGetSSE( dp );
277
0
  }
278
2.58M
  else
279
2.58M
  {
280
2.58M
    const int base = (bitDepth > 10) ? 1 : 0;
281
2.58M
    dist = m_afpDistortFunc[base][eDFunc + Log2(org.width)](dp);
282
2.58M
  }
283
2.58M
  if (isChroma(compId))
284
2.17M
  {
285
2.17M
    return ((Distortion) (m_distortionWeight[ compId ] * dist));
286
2.17M
  }
287
414k
  else
288
414k
  {
289
414k
    return dist;
290
414k
  }
291
2.58M
}
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
128k
{
340
128k
  if ( rcDtParam.applyWeight )
341
0
  {
342
0
    THROW(" no support");
343
0
  }
344
345
128k
  const Pel* piOrg   = rcDtParam.org.buf;
346
128k
  const Pel* piCur   = rcDtParam.cur.buf;
347
128k
  int  iRows         = rcDtParam.org.height;
348
128k
  int  iSubShift     = rcDtParam.subShift;
349
128k
  int  iSubStep      = ( 1 << iSubShift );
350
128k
  int  iStrideCur    = rcDtParam.cur.stride * iSubStep;
351
128k
  int  iStrideOrg    = rcDtParam.org.stride * iSubStep;
352
353
128k
  Distortion uiSum = 0;
354
355
1.58M
  for( ; iRows != 0; iRows -= iSubStep )
356
1.45M
  {
357
1.45M
    uiSum += abs( piOrg[0] - piCur[0] );
358
1.45M
    uiSum += abs( piOrg[1] - piCur[1] );
359
1.45M
    uiSum += abs( piOrg[2] - piCur[2] );
360
1.45M
    uiSum += abs( piOrg[3] - piCur[3] );
361
362
1.45M
    piOrg += iStrideOrg;
363
1.45M
    piCur += iStrideCur;
364
1.45M
  }
365
366
128k
  uiSum <<= iSubShift;
367
128k
  return (uiSum >> DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth));
368
128k
}
369
370
Distortion RdCost::xGetSAD8( const DistParam& rcDtParam )
371
511k
{
372
511k
  if ( rcDtParam.applyWeight )
373
0
  {
374
0
    THROW(" no support");
375
0
  }
376
377
511k
  const Pel* piOrg      = rcDtParam.org.buf;
378
511k
  const Pel* piCur      = rcDtParam.cur.buf;
379
511k
  int  iRows            = rcDtParam.org.height;
380
511k
  int  iSubShift        = rcDtParam.subShift;
381
511k
  int  iSubStep         = ( 1 << iSubShift );
382
511k
  int  iStrideCur       = rcDtParam.cur.stride * iSubStep;
383
511k
  int  iStrideOrg       = rcDtParam.org.stride * iSubStep;
384
385
511k
  Distortion uiSum = 0;
386
387
10.7M
  for( ; iRows != 0; iRows-=iSubStep )
388
10.2M
  {
389
10.2M
    uiSum += abs( piOrg[0] - piCur[0] );
390
10.2M
    uiSum += abs( piOrg[1] - piCur[1] );
391
10.2M
    uiSum += abs( piOrg[2] - piCur[2] );
392
10.2M
    uiSum += abs( piOrg[3] - piCur[3] );
393
10.2M
    uiSum += abs( piOrg[4] - piCur[4] );
394
10.2M
    uiSum += abs( piOrg[5] - piCur[5] );
395
10.2M
    uiSum += abs( piOrg[6] - piCur[6] );
396
10.2M
    uiSum += abs( piOrg[7] - piCur[7] );
397
398
10.2M
    piOrg += iStrideOrg;
399
10.2M
    piCur += iStrideCur;
400
10.2M
  }
401
402
511k
  uiSum <<= iSubShift;
403
511k
  return (uiSum >> DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth));
404
511k
}
405
406
Distortion RdCost::xGetSAD16( const DistParam& rcDtParam )
407
441k
{
408
441k
  if ( rcDtParam.applyWeight )
409
0
  {
410
0
    THROW(" no support");
411
0
  }
412
413
441k
  const Pel* piOrg      = rcDtParam.org.buf;
414
441k
  const Pel* piCur      = rcDtParam.cur.buf;
415
441k
  int  iRows            = rcDtParam.org.height;
416
441k
  int  iSubShift        = rcDtParam.subShift;
417
441k
  int  iSubStep         = ( 1 << iSubShift );
418
441k
  int  iStrideCur       = rcDtParam.cur.stride * iSubStep;
419
441k
  int  iStrideOrg       = rcDtParam.org.stride * iSubStep;
420
421
441k
  Distortion uiSum = 0;
422
423
9.84M
  for( ; iRows != 0; iRows -= iSubStep )
424
9.40M
  {
425
9.40M
    uiSum += abs( piOrg[0] - piCur[0] );
426
9.40M
    uiSum += abs( piOrg[1] - piCur[1] );
427
9.40M
    uiSum += abs( piOrg[2] - piCur[2] );
428
9.40M
    uiSum += abs( piOrg[3] - piCur[3] );
429
9.40M
    uiSum += abs( piOrg[4] - piCur[4] );
430
9.40M
    uiSum += abs( piOrg[5] - piCur[5] );
431
9.40M
    uiSum += abs( piOrg[6] - piCur[6] );
432
9.40M
    uiSum += abs( piOrg[7] - piCur[7] );
433
9.40M
    uiSum += abs( piOrg[8] - piCur[8] );
434
9.40M
    uiSum += abs( piOrg[9] - piCur[9] );
435
9.40M
    uiSum += abs( piOrg[10] - piCur[10] );
436
9.40M
    uiSum += abs( piOrg[11] - piCur[11] );
437
9.40M
    uiSum += abs( piOrg[12] - piCur[12] );
438
9.40M
    uiSum += abs( piOrg[13] - piCur[13] );
439
9.40M
    uiSum += abs( piOrg[14] - piCur[14] );
440
9.40M
    uiSum += abs( piOrg[15] - piCur[15] );
441
442
9.40M
    piOrg += iStrideOrg;
443
9.40M
    piCur += iStrideCur;
444
9.40M
  }
445
446
441k
  uiSum <<= iSubShift;
447
441k
  return (uiSum >> DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth));
448
441k
}
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
622k
{
495
622k
  if ( rcDtParam.applyWeight )
496
0
  {
497
0
    THROW(" no support");
498
0
  }
499
500
622k
  const Pel* piOrg      = rcDtParam.org.buf;
501
622k
  const Pel* piCur      = rcDtParam.cur.buf;
502
622k
  int  iRows            = rcDtParam.org.height;
503
622k
  int  iSubShift        = rcDtParam.subShift;
504
622k
  int  iSubStep         = ( 1 << iSubShift );
505
622k
  int  iStrideCur       = rcDtParam.cur.stride * iSubStep;
506
622k
  int  iStrideOrg       = rcDtParam.org.stride * iSubStep;
507
508
622k
  Distortion uiSum = 0;
509
510
12.3M
  for( ; iRows != 0; iRows-=iSubStep )
511
11.7M
  {
512
11.7M
    uiSum += abs( piOrg[0] - piCur[0] );
513
11.7M
    uiSum += abs( piOrg[1] - piCur[1] );
514
11.7M
    uiSum += abs( piOrg[2] - piCur[2] );
515
11.7M
    uiSum += abs( piOrg[3] - piCur[3] );
516
11.7M
    uiSum += abs( piOrg[4] - piCur[4] );
517
11.7M
    uiSum += abs( piOrg[5] - piCur[5] );
518
11.7M
    uiSum += abs( piOrg[6] - piCur[6] );
519
11.7M
    uiSum += abs( piOrg[7] - piCur[7] );
520
11.7M
    uiSum += abs( piOrg[8] - piCur[8] );
521
11.7M
    uiSum += abs( piOrg[9] - piCur[9] );
522
11.7M
    uiSum += abs( piOrg[10] - piCur[10] );
523
11.7M
    uiSum += abs( piOrg[11] - piCur[11] );
524
11.7M
    uiSum += abs( piOrg[12] - piCur[12] );
525
11.7M
    uiSum += abs( piOrg[13] - piCur[13] );
526
11.7M
    uiSum += abs( piOrg[14] - piCur[14] );
527
11.7M
    uiSum += abs( piOrg[15] - piCur[15] );
528
11.7M
    uiSum += abs( piOrg[16] - piCur[16] );
529
11.7M
    uiSum += abs( piOrg[17] - piCur[17] );
530
11.7M
    uiSum += abs( piOrg[18] - piCur[18] );
531
11.7M
    uiSum += abs( piOrg[19] - piCur[19] );
532
11.7M
    uiSum += abs( piOrg[20] - piCur[20] );
533
11.7M
    uiSum += abs( piOrg[21] - piCur[21] );
534
11.7M
    uiSum += abs( piOrg[22] - piCur[22] );
535
11.7M
    uiSum += abs( piOrg[23] - piCur[23] );
536
11.7M
    uiSum += abs( piOrg[24] - piCur[24] );
537
11.7M
    uiSum += abs( piOrg[25] - piCur[25] );
538
11.7M
    uiSum += abs( piOrg[26] - piCur[26] );
539
11.7M
    uiSum += abs( piOrg[27] - piCur[27] );
540
11.7M
    uiSum += abs( piOrg[28] - piCur[28] );
541
11.7M
    uiSum += abs( piOrg[29] - piCur[29] );
542
11.7M
    uiSum += abs( piOrg[30] - piCur[30] );
543
11.7M
    uiSum += abs( piOrg[31] - piCur[31] );
544
545
11.7M
    piOrg += iStrideOrg;
546
11.7M
    piCur += iStrideCur;
547
11.7M
  }
548
549
622k
  uiSum <<= iSubShift;
550
622k
  return (uiSum >> DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth));
551
622k
}
552
553
554
Distortion RdCost::xGetSAD64( const DistParam &rcDtParam )
555
7.49k
{
556
7.49k
  if ( rcDtParam.applyWeight )
557
0
  {
558
0
    THROW(" no support");
559
0
  }
560
561
7.49k
  const Pel* piOrg      = rcDtParam.org.buf;
562
7.49k
  const Pel* piCur      = rcDtParam.cur.buf;
563
7.49k
  int  iRows            = rcDtParam.org.height;
564
7.49k
  int  iSubShift        = rcDtParam.subShift;
565
7.49k
  int  iSubStep         = ( 1 << iSubShift );
566
7.49k
  int  iStrideCur       = rcDtParam.cur.stride * iSubStep;
567
7.49k
  int  iStrideOrg       = rcDtParam.org.stride * iSubStep;
568
569
7.49k
  Distortion uiSum = 0;
570
571
486k
  for( ; iRows != 0; iRows-=iSubStep )
572
479k
  {
573
479k
    uiSum += abs( piOrg[0] - piCur[0] );
574
479k
    uiSum += abs( piOrg[1] - piCur[1] );
575
479k
    uiSum += abs( piOrg[2] - piCur[2] );
576
479k
    uiSum += abs( piOrg[3] - piCur[3] );
577
479k
    uiSum += abs( piOrg[4] - piCur[4] );
578
479k
    uiSum += abs( piOrg[5] - piCur[5] );
579
479k
    uiSum += abs( piOrg[6] - piCur[6] );
580
479k
    uiSum += abs( piOrg[7] - piCur[7] );
581
479k
    uiSum += abs( piOrg[8] - piCur[8] );
582
479k
    uiSum += abs( piOrg[9] - piCur[9] );
583
479k
    uiSum += abs( piOrg[10] - piCur[10] );
584
479k
    uiSum += abs( piOrg[11] - piCur[11] );
585
479k
    uiSum += abs( piOrg[12] - piCur[12] );
586
479k
    uiSum += abs( piOrg[13] - piCur[13] );
587
479k
    uiSum += abs( piOrg[14] - piCur[14] );
588
479k
    uiSum += abs( piOrg[15] - piCur[15] );
589
479k
    uiSum += abs( piOrg[16] - piCur[16] );
590
479k
    uiSum += abs( piOrg[17] - piCur[17] );
591
479k
    uiSum += abs( piOrg[18] - piCur[18] );
592
479k
    uiSum += abs( piOrg[19] - piCur[19] );
593
479k
    uiSum += abs( piOrg[20] - piCur[20] );
594
479k
    uiSum += abs( piOrg[21] - piCur[21] );
595
479k
    uiSum += abs( piOrg[22] - piCur[22] );
596
479k
    uiSum += abs( piOrg[23] - piCur[23] );
597
479k
    uiSum += abs( piOrg[24] - piCur[24] );
598
479k
    uiSum += abs( piOrg[25] - piCur[25] );
599
479k
    uiSum += abs( piOrg[26] - piCur[26] );
600
479k
    uiSum += abs( piOrg[27] - piCur[27] );
601
479k
    uiSum += abs( piOrg[28] - piCur[28] );
602
479k
    uiSum += abs( piOrg[29] - piCur[29] );
603
479k
    uiSum += abs( piOrg[30] - piCur[30] );
604
479k
    uiSum += abs( piOrg[31] - piCur[31] );
605
479k
    uiSum += abs( piOrg[32] - piCur[32] );
606
479k
    uiSum += abs( piOrg[33] - piCur[33] );
607
479k
    uiSum += abs( piOrg[34] - piCur[34] );
608
479k
    uiSum += abs( piOrg[35] - piCur[35] );
609
479k
    uiSum += abs( piOrg[36] - piCur[36] );
610
479k
    uiSum += abs( piOrg[37] - piCur[37] );
611
479k
    uiSum += abs( piOrg[38] - piCur[38] );
612
479k
    uiSum += abs( piOrg[39] - piCur[39] );
613
479k
    uiSum += abs( piOrg[40] - piCur[40] );
614
479k
    uiSum += abs( piOrg[41] - piCur[41] );
615
479k
    uiSum += abs( piOrg[42] - piCur[42] );
616
479k
    uiSum += abs( piOrg[43] - piCur[43] );
617
479k
    uiSum += abs( piOrg[44] - piCur[44] );
618
479k
    uiSum += abs( piOrg[45] - piCur[45] );
619
479k
    uiSum += abs( piOrg[46] - piCur[46] );
620
479k
    uiSum += abs( piOrg[47] - piCur[47] );
621
479k
    uiSum += abs( piOrg[48] - piCur[48] );
622
479k
    uiSum += abs( piOrg[49] - piCur[49] );
623
479k
    uiSum += abs( piOrg[50] - piCur[50] );
624
479k
    uiSum += abs( piOrg[51] - piCur[51] );
625
479k
    uiSum += abs( piOrg[52] - piCur[52] );
626
479k
    uiSum += abs( piOrg[53] - piCur[53] );
627
479k
    uiSum += abs( piOrg[54] - piCur[54] );
628
479k
    uiSum += abs( piOrg[55] - piCur[55] );
629
479k
    uiSum += abs( piOrg[56] - piCur[56] );
630
479k
    uiSum += abs( piOrg[57] - piCur[57] );
631
479k
    uiSum += abs( piOrg[58] - piCur[58] );
632
479k
    uiSum += abs( piOrg[59] - piCur[59] );
633
479k
    uiSum += abs( piOrg[60] - piCur[60] );
634
479k
    uiSum += abs( piOrg[61] - piCur[61] );
635
479k
    uiSum += abs( piOrg[62] - piCur[62] );
636
479k
    uiSum += abs( piOrg[63] - piCur[63] );
637
638
479k
    piOrg += iStrideOrg;
639
479k
    piCur += iStrideCur;
640
479k
  }
641
642
7.49k
  uiSum <<= iSubShift;
643
7.49k
  return (uiSum >> DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth));
644
7.49k
}
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
543k
{
686
543k
  if ( rcDtParam.applyWeight )
687
0
  {
688
0
    CHECK( rcDtParam.org.width != 4, "Invalid size" );
689
0
    THROW(" no support");
690
0
  }
691
692
543k
  const Pel* piOrg   = rcDtParam.org.buf;
693
543k
  const Pel* piCur   = rcDtParam.cur.buf;
694
543k
  int  iRows         = rcDtParam.org.height;
695
543k
  int  iStrideOrg    = rcDtParam.org.stride;
696
543k
  int  iStrideCur    = rcDtParam.cur.stride;
697
698
543k
  Distortion uiSum   = 0;
699
543k
  uint32_t uiShift = DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth) << 1;
700
701
543k
  Intermediate_Int  iTemp;
702
703
7.64M
  for( ; iRows != 0; iRows-- )
704
7.09M
  {
705
706
7.09M
    iTemp = piOrg[0] - piCur[0]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
707
7.09M
    iTemp = piOrg[1] - piCur[1]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
708
7.09M
    iTemp = piOrg[2] - piCur[2]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
709
7.09M
    iTemp = piOrg[3] - piCur[3]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
710
711
7.09M
    piOrg += iStrideOrg;
712
7.09M
    piCur += iStrideCur;
713
7.09M
  }
714
715
543k
  return ( uiSum );
716
543k
}
717
718
Distortion RdCost::xGetSSE8( const DistParam &rcDtParam )
719
813k
{
720
813k
  if ( rcDtParam.applyWeight )
721
0
  {
722
0
    CHECK( rcDtParam.org.width != 8, "Invalid size" );
723
0
    THROW(" no support");
724
0
  }
725
726
813k
  const Pel* piOrg   = rcDtParam.org.buf;
727
813k
  const Pel* piCur   = rcDtParam.cur.buf;
728
813k
  int  iRows         = rcDtParam.org.height;
729
813k
  int  iStrideOrg    = rcDtParam.org.stride;
730
813k
  int  iStrideCur    = rcDtParam.cur.stride;
731
732
813k
  Distortion uiSum   = 0;
733
813k
  uint32_t uiShift = DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth) << 1;
734
735
813k
  Intermediate_Int  iTemp;
736
737
12.5M
  for( ; iRows != 0; iRows-- )
738
11.7M
  {
739
11.7M
    iTemp = piOrg[0] - piCur[0]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
740
11.7M
    iTemp = piOrg[1] - piCur[1]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
741
11.7M
    iTemp = piOrg[2] - piCur[2]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
742
11.7M
    iTemp = piOrg[3] - piCur[3]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
743
11.7M
    iTemp = piOrg[4] - piCur[4]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
744
11.7M
    iTemp = piOrg[5] - piCur[5]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
745
11.7M
    iTemp = piOrg[6] - piCur[6]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
746
11.7M
    iTemp = piOrg[7] - piCur[7]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
747
748
11.7M
    piOrg += iStrideOrg;
749
11.7M
    piCur += iStrideCur;
750
11.7M
  }
751
752
813k
  return ( uiSum );
753
813k
}
754
755
Distortion RdCost::xGetSSE16( const DistParam &rcDtParam )
756
655k
{
757
655k
  if ( rcDtParam.applyWeight )
758
0
  {
759
0
    CHECK( rcDtParam.org.width != 16, "Invalid size" );
760
0
    THROW(" no support");
761
0
  }
762
763
655k
  const Pel* piOrg   = rcDtParam.org.buf;
764
655k
  const Pel* piCur   = rcDtParam.cur.buf;
765
655k
  int  iRows         = rcDtParam.org.height;
766
655k
  int  iStrideOrg    = rcDtParam.org.stride;
767
655k
  int  iStrideCur    = rcDtParam.cur.stride;
768
769
655k
  Distortion uiSum   = 0;
770
655k
  uint32_t uiShift = DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth) << 1;
771
772
655k
  Intermediate_Int  iTemp;
773
774
10.2M
  for( ; iRows != 0; iRows-- )
775
9.54M
  {
776
777
9.54M
    iTemp = piOrg[ 0] - piCur[ 0]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
778
9.54M
    iTemp = piOrg[ 1] - piCur[ 1]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
779
9.54M
    iTemp = piOrg[ 2] - piCur[ 2]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
780
9.54M
    iTemp = piOrg[ 3] - piCur[ 3]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
781
9.54M
    iTemp = piOrg[ 4] - piCur[ 4]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
782
9.54M
    iTemp = piOrg[ 5] - piCur[ 5]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
783
9.54M
    iTemp = piOrg[ 6] - piCur[ 6]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
784
9.54M
    iTemp = piOrg[ 7] - piCur[ 7]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
785
9.54M
    iTemp = piOrg[ 8] - piCur[ 8]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
786
9.54M
    iTemp = piOrg[ 9] - piCur[ 9]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
787
9.54M
    iTemp = piOrg[10] - piCur[10]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
788
9.54M
    iTemp = piOrg[11] - piCur[11]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
789
9.54M
    iTemp = piOrg[12] - piCur[12]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
790
9.54M
    iTemp = piOrg[13] - piCur[13]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
791
9.54M
    iTemp = piOrg[14] - piCur[14]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
792
9.54M
    iTemp = piOrg[15] - piCur[15]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
793
794
9.54M
    piOrg += iStrideOrg;
795
9.54M
    piCur += iStrideCur;
796
9.54M
  }
797
798
655k
  return ( uiSum );
799
655k
}
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
514k
{
851
514k
  if ( rcDtParam.applyWeight )
852
0
  {
853
0
    THROW(" no support");
854
0
  }
855
856
514k
  const Pel* piOrg   = rcDtParam.org.buf;
857
514k
  const Pel* piCur   = rcDtParam.cur.buf;
858
514k
  int  iRows         = rcDtParam.org.height;
859
514k
  int  iStrideOrg    = rcDtParam.org.stride;
860
514k
  int  iStrideCur    = rcDtParam.cur.stride;
861
862
514k
  Distortion uiSum   = 0;
863
514k
  uint32_t uiShift = DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth) << 1;
864
865
514k
  Intermediate_Int  iTemp;
866
867
9.04M
  for( ; iRows != 0; iRows-- )
868
8.53M
  {
869
870
8.53M
    iTemp = piOrg[ 0] - piCur[ 0]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
871
8.53M
    iTemp = piOrg[ 1] - piCur[ 1]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
872
8.53M
    iTemp = piOrg[ 2] - piCur[ 2]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
873
8.53M
    iTemp = piOrg[ 3] - piCur[ 3]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
874
8.53M
    iTemp = piOrg[ 4] - piCur[ 4]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
875
8.53M
    iTemp = piOrg[ 5] - piCur[ 5]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
876
8.53M
    iTemp = piOrg[ 6] - piCur[ 6]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
877
8.53M
    iTemp = piOrg[ 7] - piCur[ 7]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
878
8.53M
    iTemp = piOrg[ 8] - piCur[ 8]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
879
8.53M
    iTemp = piOrg[ 9] - piCur[ 9]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
880
8.53M
    iTemp = piOrg[10] - piCur[10]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
881
8.53M
    iTemp = piOrg[11] - piCur[11]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
882
8.53M
    iTemp = piOrg[12] - piCur[12]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
883
8.53M
    iTemp = piOrg[13] - piCur[13]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
884
8.53M
    iTemp = piOrg[14] - piCur[14]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
885
8.53M
    iTemp = piOrg[15] - piCur[15]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
886
8.53M
    iTemp = piOrg[16] - piCur[16]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
887
8.53M
    iTemp = piOrg[17] - piCur[17]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
888
8.53M
    iTemp = piOrg[18] - piCur[18]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
889
8.53M
    iTemp = piOrg[19] - piCur[19]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
890
8.53M
    iTemp = piOrg[20] - piCur[20]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
891
8.53M
    iTemp = piOrg[21] - piCur[21]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
892
8.53M
    iTemp = piOrg[22] - piCur[22]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
893
8.53M
    iTemp = piOrg[23] - piCur[23]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
894
8.53M
    iTemp = piOrg[24] - piCur[24]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
895
8.53M
    iTemp = piOrg[25] - piCur[25]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
896
8.53M
    iTemp = piOrg[26] - piCur[26]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
897
8.53M
    iTemp = piOrg[27] - piCur[27]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
898
8.53M
    iTemp = piOrg[28] - piCur[28]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
899
8.53M
    iTemp = piOrg[29] - piCur[29]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
900
8.53M
    iTemp = piOrg[30] - piCur[30]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
901
8.53M
    iTemp = piOrg[31] - piCur[31]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
902
903
8.53M
    piOrg += iStrideOrg;
904
8.53M
    piCur += iStrideCur;
905
8.53M
  }
906
907
514k
  return ( uiSum );
908
514k
}
909
910
Distortion RdCost::xGetSSE64( const DistParam &rcDtParam )
911
59.9k
{
912
59.9k
  if ( rcDtParam.applyWeight )
913
0
  {
914
0
    THROW(" no support");
915
0
  }
916
917
59.9k
  const Pel* piOrg   = rcDtParam.org.buf;
918
59.9k
  const Pel* piCur   = rcDtParam.cur.buf;
919
59.9k
  int  iRows         = rcDtParam.org.height;
920
59.9k
  int  iStrideOrg    = rcDtParam.org.stride;
921
59.9k
  int  iStrideCur    = rcDtParam.cur.stride;
922
923
59.9k
  Distortion uiSum   = 0;
924
59.9k
  uint32_t uiShift = DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth) << 1;
925
926
59.9k
  Intermediate_Int  iTemp;
927
928
3.18M
  for( ; iRows != 0; iRows-- )
929
3.12M
  {
930
3.12M
    iTemp = piOrg[ 0] - piCur[ 0]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
931
3.12M
    iTemp = piOrg[ 1] - piCur[ 1]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
932
3.12M
    iTemp = piOrg[ 2] - piCur[ 2]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
933
3.12M
    iTemp = piOrg[ 3] - piCur[ 3]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
934
3.12M
    iTemp = piOrg[ 4] - piCur[ 4]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
935
3.12M
    iTemp = piOrg[ 5] - piCur[ 5]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
936
3.12M
    iTemp = piOrg[ 6] - piCur[ 6]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
937
3.12M
    iTemp = piOrg[ 7] - piCur[ 7]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
938
3.12M
    iTemp = piOrg[ 8] - piCur[ 8]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
939
3.12M
    iTemp = piOrg[ 9] - piCur[ 9]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
940
3.12M
    iTemp = piOrg[10] - piCur[10]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
941
3.12M
    iTemp = piOrg[11] - piCur[11]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
942
3.12M
    iTemp = piOrg[12] - piCur[12]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
943
3.12M
    iTemp = piOrg[13] - piCur[13]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
944
3.12M
    iTemp = piOrg[14] - piCur[14]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
945
3.12M
    iTemp = piOrg[15] - piCur[15]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
946
3.12M
    iTemp = piOrg[16] - piCur[16]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
947
3.12M
    iTemp = piOrg[17] - piCur[17]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
948
3.12M
    iTemp = piOrg[18] - piCur[18]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
949
3.12M
    iTemp = piOrg[19] - piCur[19]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
950
3.12M
    iTemp = piOrg[20] - piCur[20]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
951
3.12M
    iTemp = piOrg[21] - piCur[21]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
952
3.12M
    iTemp = piOrg[22] - piCur[22]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
953
3.12M
    iTemp = piOrg[23] - piCur[23]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
954
3.12M
    iTemp = piOrg[24] - piCur[24]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
955
3.12M
    iTemp = piOrg[25] - piCur[25]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
956
3.12M
    iTemp = piOrg[26] - piCur[26]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
957
3.12M
    iTemp = piOrg[27] - piCur[27]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
958
3.12M
    iTemp = piOrg[28] - piCur[28]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
959
3.12M
    iTemp = piOrg[29] - piCur[29]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
960
3.12M
    iTemp = piOrg[30] - piCur[30]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
961
3.12M
    iTemp = piOrg[31] - piCur[31]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
962
3.12M
    iTemp = piOrg[32] - piCur[32]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
963
3.12M
    iTemp = piOrg[33] - piCur[33]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
964
3.12M
    iTemp = piOrg[34] - piCur[34]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
965
3.12M
    iTemp = piOrg[35] - piCur[35]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
966
3.12M
    iTemp = piOrg[36] - piCur[36]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
967
3.12M
    iTemp = piOrg[37] - piCur[37]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
968
3.12M
    iTemp = piOrg[38] - piCur[38]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
969
3.12M
    iTemp = piOrg[39] - piCur[39]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
970
3.12M
    iTemp = piOrg[40] - piCur[40]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
971
3.12M
    iTemp = piOrg[41] - piCur[41]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
972
3.12M
    iTemp = piOrg[42] - piCur[42]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
973
3.12M
    iTemp = piOrg[43] - piCur[43]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
974
3.12M
    iTemp = piOrg[44] - piCur[44]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
975
3.12M
    iTemp = piOrg[45] - piCur[45]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
976
3.12M
    iTemp = piOrg[46] - piCur[46]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
977
3.12M
    iTemp = piOrg[47] - piCur[47]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
978
3.12M
    iTemp = piOrg[48] - piCur[48]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
979
3.12M
    iTemp = piOrg[49] - piCur[49]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
980
3.12M
    iTemp = piOrg[50] - piCur[50]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
981
3.12M
    iTemp = piOrg[51] - piCur[51]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
982
3.12M
    iTemp = piOrg[52] - piCur[52]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
983
3.12M
    iTemp = piOrg[53] - piCur[53]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
984
3.12M
    iTemp = piOrg[54] - piCur[54]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
985
3.12M
    iTemp = piOrg[55] - piCur[55]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
986
3.12M
    iTemp = piOrg[56] - piCur[56]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
987
3.12M
    iTemp = piOrg[57] - piCur[57]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
988
3.12M
    iTemp = piOrg[58] - piCur[58]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
989
3.12M
    iTemp = piOrg[59] - piCur[59]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
990
3.12M
    iTemp = piOrg[60] - piCur[60]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
991
3.12M
    iTemp = piOrg[61] - piCur[61]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
992
3.12M
    iTemp = piOrg[62] - piCur[62]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
993
3.12M
    iTemp = piOrg[63] - piCur[63]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
994
995
3.12M
    piOrg += iStrideOrg;
996
3.12M
    piCur += iStrideCur;
997
3.12M
  }
998
999
59.9k
  return ( uiSum );
1000
59.9k
}
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
157k
{
1008
157k
  Distortion satd = 0;
1009
157k
  TCoeff diff[4], m[4];
1010
1011
157k
  diff[0] = piOrg[0             ] - piCur[0];
1012
157k
  diff[1] = piOrg[1             ] - piCur[1];
1013
157k
  diff[2] = piOrg[iStrideOrg    ] - piCur[0 + iStrideCur];
1014
157k
  diff[3] = piOrg[iStrideOrg + 1] - piCur[1 + iStrideCur];
1015
157k
  m[0] = diff[0] + diff[2];
1016
157k
  m[1] = diff[1] + diff[3];
1017
157k
  m[2] = diff[0] - diff[2];
1018
157k
  m[3] = diff[1] - diff[3];
1019
  
1020
157k
  satd += abs(m[0] + m[1]) >> 2;
1021
157k
  satd += abs(m[0] - m[1]);
1022
157k
  satd += abs(m[2] + m[3]);
1023
157k
  satd += abs(m[2] - m[3]);
1024
1025
157k
  return satd;
1026
157k
}
1027
1028
static Distortion xCalcHADs4x4( const Pel* piOrg, const Pel* piCur, int iStrideOrg, int iStrideCur )
1029
43.4k
{
1030
43.4k
  int k;
1031
43.4k
  Distortion satd = 0;
1032
43.4k
  TCoeff diff[16], m[16], d[16];
1033
1034
217k
  for( k = 0; k < 16; k+=4 )
1035
173k
  {
1036
173k
    diff[k+0] = piOrg[0] - piCur[0];
1037
173k
    diff[k+1] = piOrg[1] - piCur[1];
1038
173k
    diff[k+2] = piOrg[2] - piCur[2];
1039
173k
    diff[k+3] = piOrg[3] - piCur[3];
1040
1041
173k
    piCur += iStrideCur;
1042
173k
    piOrg += iStrideOrg;
1043
173k
  }
1044
1045
  /*===== hadamard transform =====*/
1046
43.4k
  m[ 0] = diff[ 0] + diff[12];
1047
43.4k
  m[ 1] = diff[ 1] + diff[13];
1048
43.4k
  m[ 2] = diff[ 2] + diff[14];
1049
43.4k
  m[ 3] = diff[ 3] + diff[15];
1050
43.4k
  m[ 4] = diff[ 4] + diff[ 8];
1051
43.4k
  m[ 5] = diff[ 5] + diff[ 9];
1052
43.4k
  m[ 6] = diff[ 6] + diff[10];
1053
43.4k
  m[ 7] = diff[ 7] + diff[11];
1054
43.4k
  m[ 8] = diff[ 4] - diff[ 8];
1055
43.4k
  m[ 9] = diff[ 5] - diff[ 9];
1056
43.4k
  m[10] = diff[ 6] - diff[10];
1057
43.4k
  m[11] = diff[ 7] - diff[11];
1058
43.4k
  m[12] = diff[ 0] - diff[12];
1059
43.4k
  m[13] = diff[ 1] - diff[13];
1060
43.4k
  m[14] = diff[ 2] - diff[14];
1061
43.4k
  m[15] = diff[ 3] - diff[15];
1062
1063
43.4k
  d[ 0] = m[ 0] + m[ 4];
1064
43.4k
  d[ 1] = m[ 1] + m[ 5];
1065
43.4k
  d[ 2] = m[ 2] + m[ 6];
1066
43.4k
  d[ 3] = m[ 3] + m[ 7];
1067
43.4k
  d[ 4] = m[ 8] + m[12];
1068
43.4k
  d[ 5] = m[ 9] + m[13];
1069
43.4k
  d[ 6] = m[10] + m[14];
1070
43.4k
  d[ 7] = m[11] + m[15];
1071
43.4k
  d[ 8] = m[ 0] - m[ 4];
1072
43.4k
  d[ 9] = m[ 1] - m[ 5];
1073
43.4k
  d[10] = m[ 2] - m[ 6];
1074
43.4k
  d[11] = m[ 3] - m[ 7];
1075
43.4k
  d[12] = m[12] - m[ 8];
1076
43.4k
  d[13] = m[13] - m[ 9];
1077
43.4k
  d[14] = m[14] - m[10];
1078
43.4k
  d[15] = m[15] - m[11];
1079
1080
43.4k
  m[ 0] = d[ 0] + d[ 3];
1081
43.4k
  m[ 1] = d[ 1] + d[ 2];
1082
43.4k
  m[ 2] = d[ 1] - d[ 2];
1083
43.4k
  m[ 3] = d[ 0] - d[ 3];
1084
43.4k
  m[ 4] = d[ 4] + d[ 7];
1085
43.4k
  m[ 5] = d[ 5] + d[ 6];
1086
43.4k
  m[ 6] = d[ 5] - d[ 6];
1087
43.4k
  m[ 7] = d[ 4] - d[ 7];
1088
43.4k
  m[ 8] = d[ 8] + d[11];
1089
43.4k
  m[ 9] = d[ 9] + d[10];
1090
43.4k
  m[10] = d[ 9] - d[10];
1091
43.4k
  m[11] = d[ 8] - d[11];
1092
43.4k
  m[12] = d[12] + d[15];
1093
43.4k
  m[13] = d[13] + d[14];
1094
43.4k
  m[14] = d[13] - d[14];
1095
43.4k
  m[15] = d[12] - d[15];
1096
1097
43.4k
  d[ 0] = m[ 0] + m[ 1];
1098
43.4k
  d[ 1] = m[ 0] - m[ 1];
1099
43.4k
  d[ 2] = m[ 2] + m[ 3];
1100
43.4k
  d[ 3] = m[ 3] - m[ 2];
1101
43.4k
  d[ 4] = m[ 4] + m[ 5];
1102
43.4k
  d[ 5] = m[ 4] - m[ 5];
1103
43.4k
  d[ 6] = m[ 6] + m[ 7];
1104
43.4k
  d[ 7] = m[ 7] - m[ 6];
1105
43.4k
  d[ 8] = m[ 8] + m[ 9];
1106
43.4k
  d[ 9] = m[ 8] - m[ 9];
1107
43.4k
  d[10] = m[10] + m[11];
1108
43.4k
  d[11] = m[11] - m[10];
1109
43.4k
  d[12] = m[12] + m[13];
1110
43.4k
  d[13] = m[12] - m[13];
1111
43.4k
  d[14] = m[14] + m[15];
1112
43.4k
  d[15] = m[15] - m[14];
1113
1114
738k
  for (k=0; k<16; ++k)
1115
695k
  {
1116
695k
    satd += abs(d[k]);
1117
695k
  }
1118
1119
43.4k
  satd -= abs( d[0] );
1120
43.4k
  satd += abs( d[0] ) >> 2;
1121
43.4k
  satd = ((satd+1)>>1);
1122
1123
43.4k
  return satd;
1124
43.4k
}
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
14.4M
{
1227
14.4M
  int k, i, j, jj;
1228
14.4M
  Distortion sad = 0;
1229
14.4M
  TCoeff diff[64], m1[8][8], m2[8][8], m3[8][8];
1230
1231
129M
  for( k = 0; k < 64; k += 8 )
1232
115M
  {
1233
115M
    diff[k+0] = piOrg[0] - piCur[0];
1234
115M
    diff[k+1] = piOrg[1] - piCur[1];
1235
115M
    diff[k+2] = piOrg[2] - piCur[2];
1236
115M
    diff[k+3] = piOrg[3] - piCur[3];
1237
115M
    diff[k+4] = piOrg[4] - piCur[4];
1238
115M
    diff[k+5] = piOrg[5] - piCur[5];
1239
115M
    diff[k+6] = piOrg[6] - piCur[6];
1240
115M
    diff[k+7] = piOrg[7] - piCur[7];
1241
1242
115M
    piCur += iStrideCur;
1243
115M
    piOrg += iStrideOrg;
1244
115M
  }
1245
1246
  //horizontal
1247
129M
  for (j=0; j < 8; j++)
1248
115M
  {
1249
115M
    jj = j << 3;
1250
115M
    m2[j][0] = diff[jj  ] + diff[jj+4];
1251
115M
    m2[j][1] = diff[jj+1] + diff[jj+5];
1252
115M
    m2[j][2] = diff[jj+2] + diff[jj+6];
1253
115M
    m2[j][3] = diff[jj+3] + diff[jj+7];
1254
115M
    m2[j][4] = diff[jj  ] - diff[jj+4];
1255
115M
    m2[j][5] = diff[jj+1] - diff[jj+5];
1256
115M
    m2[j][6] = diff[jj+2] - diff[jj+6];
1257
115M
    m2[j][7] = diff[jj+3] - diff[jj+7];
1258
1259
115M
    m1[j][0] = m2[j][0] + m2[j][2];
1260
115M
    m1[j][1] = m2[j][1] + m2[j][3];
1261
115M
    m1[j][2] = m2[j][0] - m2[j][2];
1262
115M
    m1[j][3] = m2[j][1] - m2[j][3];
1263
115M
    m1[j][4] = m2[j][4] + m2[j][6];
1264
115M
    m1[j][5] = m2[j][5] + m2[j][7];
1265
115M
    m1[j][6] = m2[j][4] - m2[j][6];
1266
115M
    m1[j][7] = m2[j][5] - m2[j][7];
1267
1268
115M
    m2[j][0] = m1[j][0] + m1[j][1];
1269
115M
    m2[j][1] = m1[j][0] - m1[j][1];
1270
115M
    m2[j][2] = m1[j][2] + m1[j][3];
1271
115M
    m2[j][3] = m1[j][2] - m1[j][3];
1272
115M
    m2[j][4] = m1[j][4] + m1[j][5];
1273
115M
    m2[j][5] = m1[j][4] - m1[j][5];
1274
115M
    m2[j][6] = m1[j][6] + m1[j][7];
1275
115M
    m2[j][7] = m1[j][6] - m1[j][7];
1276
115M
  }
1277
1278
  //vertical
1279
129M
  for (i=0; i < 8; i++)
1280
115M
  {
1281
115M
    m3[0][i] = m2[0][i] + m2[4][i];
1282
115M
    m3[1][i] = m2[1][i] + m2[5][i];
1283
115M
    m3[2][i] = m2[2][i] + m2[6][i];
1284
115M
    m3[3][i] = m2[3][i] + m2[7][i];
1285
115M
    m3[4][i] = m2[0][i] - m2[4][i];
1286
115M
    m3[5][i] = m2[1][i] - m2[5][i];
1287
115M
    m3[6][i] = m2[2][i] - m2[6][i];
1288
115M
    m3[7][i] = m2[3][i] - m2[7][i];
1289
1290
115M
    m1[0][i] = m3[0][i] + m3[2][i];
1291
115M
    m1[1][i] = m3[1][i] + m3[3][i];
1292
115M
    m1[2][i] = m3[0][i] - m3[2][i];
1293
115M
    m1[3][i] = m3[1][i] - m3[3][i];
1294
115M
    m1[4][i] = m3[4][i] + m3[6][i];
1295
115M
    m1[5][i] = m3[5][i] + m3[7][i];
1296
115M
    m1[6][i] = m3[4][i] - m3[6][i];
1297
115M
    m1[7][i] = m3[5][i] - m3[7][i];
1298
1299
115M
    m2[0][i] = m1[0][i] + m1[1][i];
1300
115M
    m2[1][i] = m1[0][i] - m1[1][i];
1301
115M
    m2[2][i] = m1[2][i] + m1[3][i];
1302
115M
    m2[3][i] = m1[2][i] - m1[3][i];
1303
115M
    m2[4][i] = m1[4][i] + m1[5][i];
1304
115M
    m2[5][i] = m1[4][i] - m1[5][i];
1305
115M
    m2[6][i] = m1[6][i] + m1[7][i];
1306
115M
    m2[7][i] = m1[6][i] - m1[7][i];
1307
115M
  }
1308
1309
129M
  for (i = 0; i < 8; i++)
1310
115M
  {
1311
1.03G
    for (j = 0; j < 8; j++)
1312
923M
    {
1313
923M
      sad += abs(m2[i][j]);
1314
923M
    }
1315
115M
  }
1316
  
1317
14.4M
  sad -= abs( m2[0][0] );
1318
14.4M
  sad += abs( m2[0][0] ) >> 2;
1319
14.4M
  sad=((sad+2)>>2);
1320
1321
14.4M
  return sad;
1322
14.4M
}
1323
1324
static Distortion xCalcHADs16x8( const Pel* piOrg, const Pel* piCur, int iStrideOrg, int iStrideCur )
1325
834k
{   //need to add SIMD implementation ,JCA
1326
834k
  int k, i, j, jj, sad = 0;
1327
834k
  int diff[128], m1[8][16], m2[8][16];
1328
7.50M
  for( k = 0; k < 128; k += 16 )
1329
6.67M
  {
1330
6.67M
    diff[k + 0] = piOrg[0] - piCur[0];
1331
6.67M
    diff[k + 1] = piOrg[1] - piCur[1];
1332
6.67M
    diff[k + 2] = piOrg[2] - piCur[2];
1333
6.67M
    diff[k + 3] = piOrg[3] - piCur[3];
1334
6.67M
    diff[k + 4] = piOrg[4] - piCur[4];
1335
6.67M
    diff[k + 5] = piOrg[5] - piCur[5];
1336
6.67M
    diff[k + 6] = piOrg[6] - piCur[6];
1337
6.67M
    diff[k + 7] = piOrg[7] - piCur[7];
1338
1339
6.67M
    diff[k + 8] = piOrg[8] - piCur[8];
1340
6.67M
    diff[k + 9] = piOrg[9] - piCur[9];
1341
6.67M
    diff[k + 10] = piOrg[10] - piCur[10];
1342
6.67M
    diff[k + 11] = piOrg[11] - piCur[11];
1343
6.67M
    diff[k + 12] = piOrg[12] - piCur[12];
1344
6.67M
    diff[k + 13] = piOrg[13] - piCur[13];
1345
6.67M
    diff[k + 14] = piOrg[14] - piCur[14];
1346
6.67M
    diff[k + 15] = piOrg[15] - piCur[15];
1347
1348
6.67M
    piCur += iStrideCur;
1349
6.67M
    piOrg += iStrideOrg;
1350
6.67M
  }
1351
1352
  //horizontal
1353
7.50M
  for( j = 0; j < 8; j++ )
1354
6.67M
  {
1355
6.67M
    jj = j << 4;
1356
1357
6.67M
    m2[j][0] = diff[jj    ] + diff[jj + 8];
1358
6.67M
    m2[j][1] = diff[jj + 1] + diff[jj + 9];
1359
6.67M
    m2[j][2] = diff[jj + 2] + diff[jj + 10];
1360
6.67M
    m2[j][3] = diff[jj + 3] + diff[jj + 11];
1361
6.67M
    m2[j][4] = diff[jj + 4] + diff[jj + 12];
1362
6.67M
    m2[j][5] = diff[jj + 5] + diff[jj + 13];
1363
6.67M
    m2[j][6] = diff[jj + 6] + diff[jj + 14];
1364
6.67M
    m2[j][7] = diff[jj + 7] + diff[jj + 15];
1365
6.67M
    m2[j][8] = diff[jj    ] - diff[jj + 8];
1366
6.67M
    m2[j][9] = diff[jj + 1] - diff[jj + 9];
1367
6.67M
    m2[j][10] = diff[jj + 2] - diff[jj + 10];
1368
6.67M
    m2[j][11] = diff[jj + 3] - diff[jj + 11];
1369
6.67M
    m2[j][12] = diff[jj + 4] - diff[jj + 12];
1370
6.67M
    m2[j][13] = diff[jj + 5] - diff[jj + 13];
1371
6.67M
    m2[j][14] = diff[jj + 6] - diff[jj + 14];
1372
6.67M
    m2[j][15] = diff[jj + 7] - diff[jj + 15];
1373
1374
6.67M
    m1[j][0] = m2[j][0] + m2[j][4];
1375
6.67M
    m1[j][1] = m2[j][1] + m2[j][5];
1376
6.67M
    m1[j][2] = m2[j][2] + m2[j][6];
1377
6.67M
    m1[j][3] = m2[j][3] + m2[j][7];
1378
6.67M
    m1[j][4] = m2[j][0] - m2[j][4];
1379
6.67M
    m1[j][5] = m2[j][1] - m2[j][5];
1380
6.67M
    m1[j][6] = m2[j][2] - m2[j][6];
1381
6.67M
    m1[j][7] = m2[j][3] - m2[j][7];
1382
6.67M
    m1[j][8] = m2[j][8] + m2[j][12];
1383
6.67M
    m1[j][9] = m2[j][9] + m2[j][13];
1384
6.67M
    m1[j][10] = m2[j][10] + m2[j][14];
1385
6.67M
    m1[j][11] = m2[j][11] + m2[j][15];
1386
6.67M
    m1[j][12] = m2[j][8] - m2[j][12];
1387
6.67M
    m1[j][13] = m2[j][9] - m2[j][13];
1388
6.67M
    m1[j][14] = m2[j][10] - m2[j][14];
1389
6.67M
    m1[j][15] = m2[j][11] - m2[j][15];
1390
1391
6.67M
    m2[j][0] = m1[j][0] + m1[j][2];
1392
6.67M
    m2[j][1] = m1[j][1] + m1[j][3];
1393
6.67M
    m2[j][2] = m1[j][0] - m1[j][2];
1394
6.67M
    m2[j][3] = m1[j][1] - m1[j][3];
1395
6.67M
    m2[j][4] = m1[j][4] + m1[j][6];
1396
6.67M
    m2[j][5] = m1[j][5] + m1[j][7];
1397
6.67M
    m2[j][6] = m1[j][4] - m1[j][6];
1398
6.67M
    m2[j][7] = m1[j][5] - m1[j][7];
1399
6.67M
    m2[j][8] = m1[j][8] + m1[j][10];
1400
6.67M
    m2[j][9] = m1[j][9] + m1[j][11];
1401
6.67M
    m2[j][10] = m1[j][8] - m1[j][10];
1402
6.67M
    m2[j][11] = m1[j][9] - m1[j][11];
1403
6.67M
    m2[j][12] = m1[j][12] + m1[j][14];
1404
6.67M
    m2[j][13] = m1[j][13] + m1[j][15];
1405
6.67M
    m2[j][14] = m1[j][12] - m1[j][14];
1406
6.67M
    m2[j][15] = m1[j][13] - m1[j][15];
1407
1408
6.67M
    m1[j][0] = m2[j][0] + m2[j][1];
1409
6.67M
    m1[j][1] = m2[j][0] - m2[j][1];
1410
6.67M
    m1[j][2] = m2[j][2] + m2[j][3];
1411
6.67M
    m1[j][3] = m2[j][2] - m2[j][3];
1412
6.67M
    m1[j][4] = m2[j][4] + m2[j][5];
1413
6.67M
    m1[j][5] = m2[j][4] - m2[j][5];
1414
6.67M
    m1[j][6] = m2[j][6] + m2[j][7];
1415
6.67M
    m1[j][7] = m2[j][6] - m2[j][7];
1416
6.67M
    m1[j][8] = m2[j][8] + m2[j][9];
1417
6.67M
    m1[j][9] = m2[j][8] - m2[j][9];
1418
6.67M
    m1[j][10] = m2[j][10] + m2[j][11];
1419
6.67M
    m1[j][11] = m2[j][10] - m2[j][11];
1420
6.67M
    m1[j][12] = m2[j][12] + m2[j][13];
1421
6.67M
    m1[j][13] = m2[j][12] - m2[j][13];
1422
6.67M
    m1[j][14] = m2[j][14] + m2[j][15];
1423
6.67M
    m1[j][15] = m2[j][14] - m2[j][15];
1424
6.67M
  }
1425
1426
  //vertical
1427
14.1M
  for( i = 0; i < 16; i++ )
1428
13.3M
  {
1429
13.3M
    m2[0][i] = m1[0][i] + m1[4][i];
1430
13.3M
    m2[1][i] = m1[1][i] + m1[5][i];
1431
13.3M
    m2[2][i] = m1[2][i] + m1[6][i];
1432
13.3M
    m2[3][i] = m1[3][i] + m1[7][i];
1433
13.3M
    m2[4][i] = m1[0][i] - m1[4][i];
1434
13.3M
    m2[5][i] = m1[1][i] - m1[5][i];
1435
13.3M
    m2[6][i] = m1[2][i] - m1[6][i];
1436
13.3M
    m2[7][i] = m1[3][i] - m1[7][i];
1437
1438
13.3M
    m1[0][i] = m2[0][i] + m2[2][i];
1439
13.3M
    m1[1][i] = m2[1][i] + m2[3][i];
1440
13.3M
    m1[2][i] = m2[0][i] - m2[2][i];
1441
13.3M
    m1[3][i] = m2[1][i] - m2[3][i];
1442
13.3M
    m1[4][i] = m2[4][i] + m2[6][i];
1443
13.3M
    m1[5][i] = m2[5][i] + m2[7][i];
1444
13.3M
    m1[6][i] = m2[4][i] - m2[6][i];
1445
13.3M
    m1[7][i] = m2[5][i] - m2[7][i];
1446
1447
13.3M
    m2[0][i] = m1[0][i] + m1[1][i];
1448
13.3M
    m2[1][i] = m1[0][i] - m1[1][i];
1449
13.3M
    m2[2][i] = m1[2][i] + m1[3][i];
1450
13.3M
    m2[3][i] = m1[2][i] - m1[3][i];
1451
13.3M
    m2[4][i] = m1[4][i] + m1[5][i];
1452
13.3M
    m2[5][i] = m1[4][i] - m1[5][i];
1453
13.3M
    m2[6][i] = m1[6][i] + m1[7][i];
1454
13.3M
    m2[7][i] = m1[6][i] - m1[7][i];
1455
13.3M
  }
1456
1457
7.50M
  for( i = 0; i < 8; i++ )
1458
6.67M
  {
1459
113M
    for( j = 0; j < 16; j++ )
1460
106M
    {
1461
106M
      sad += abs( m2[i][j] );
1462
106M
    }
1463
6.67M
  }
1464
  
1465
834k
  sad -= abs( m2[0][0] );
1466
834k
  sad += abs( m2[0][0] ) >> 2;
1467
834k
  sad = ( int ) ( sad / sqrt( 16.0 * 8 ) * 2 );
1468
1469
834k
  return sad;
1470
834k
}
1471
1472
static Distortion xCalcHADs8x16( const Pel* piOrg, const Pel* piCur, int iStrideOrg, int iStrideCur )
1473
894k
{
1474
894k
  int k, i, j, jj, sad = 0;
1475
894k
  int diff[128], m1[16][8], m2[16][8];
1476
15.2M
  for( k = 0; k < 128; k += 8 )
1477
14.3M
  {
1478
14.3M
    diff[k + 0] = piOrg[0] - piCur[0];
1479
14.3M
    diff[k + 1] = piOrg[1] - piCur[1];
1480
14.3M
    diff[k + 2] = piOrg[2] - piCur[2];
1481
14.3M
    diff[k + 3] = piOrg[3] - piCur[3];
1482
14.3M
    diff[k + 4] = piOrg[4] - piCur[4];
1483
14.3M
    diff[k + 5] = piOrg[5] - piCur[5];
1484
14.3M
    diff[k + 6] = piOrg[6] - piCur[6];
1485
14.3M
    diff[k + 7] = piOrg[7] - piCur[7];
1486
1487
14.3M
    piCur += iStrideCur;
1488
14.3M
    piOrg += iStrideOrg;
1489
14.3M
  }
1490
1491
  //horizontal
1492
15.2M
  for( j = 0; j < 16; j++ )
1493
14.3M
  {
1494
14.3M
    jj = j << 3;
1495
1496
14.3M
    m2[j][0] = diff[jj] + diff[jj + 4];
1497
14.3M
    m2[j][1] = diff[jj + 1] + diff[jj + 5];
1498
14.3M
    m2[j][2] = diff[jj + 2] + diff[jj + 6];
1499
14.3M
    m2[j][3] = diff[jj + 3] + diff[jj + 7];
1500
14.3M
    m2[j][4] = diff[jj] - diff[jj + 4];
1501
14.3M
    m2[j][5] = diff[jj + 1] - diff[jj + 5];
1502
14.3M
    m2[j][6] = diff[jj + 2] - diff[jj + 6];
1503
14.3M
    m2[j][7] = diff[jj + 3] - diff[jj + 7];
1504
1505
14.3M
    m1[j][0] = m2[j][0] + m2[j][2];
1506
14.3M
    m1[j][1] = m2[j][1] + m2[j][3];
1507
14.3M
    m1[j][2] = m2[j][0] - m2[j][2];
1508
14.3M
    m1[j][3] = m2[j][1] - m2[j][3];
1509
14.3M
    m1[j][4] = m2[j][4] + m2[j][6];
1510
14.3M
    m1[j][5] = m2[j][5] + m2[j][7];
1511
14.3M
    m1[j][6] = m2[j][4] - m2[j][6];
1512
14.3M
    m1[j][7] = m2[j][5] - m2[j][7];
1513
1514
14.3M
    m2[j][0] = m1[j][0] + m1[j][1];
1515
14.3M
    m2[j][1] = m1[j][0] - m1[j][1];
1516
14.3M
    m2[j][2] = m1[j][2] + m1[j][3];
1517
14.3M
    m2[j][3] = m1[j][2] - m1[j][3];
1518
14.3M
    m2[j][4] = m1[j][4] + m1[j][5];
1519
14.3M
    m2[j][5] = m1[j][4] - m1[j][5];
1520
14.3M
    m2[j][6] = m1[j][6] + m1[j][7];
1521
14.3M
    m2[j][7] = m1[j][6] - m1[j][7];
1522
14.3M
  }
1523
1524
  //vertical
1525
8.05M
  for( i = 0; i < 8; i++ )
1526
7.15M
  {
1527
7.15M
    m1[0][i] = m2[0][i] + m2[8][i];
1528
7.15M
    m1[1][i] = m2[1][i] + m2[9][i];
1529
7.15M
    m1[2][i] = m2[2][i] + m2[10][i];
1530
7.15M
    m1[3][i] = m2[3][i] + m2[11][i];
1531
7.15M
    m1[4][i] = m2[4][i] + m2[12][i];
1532
7.15M
    m1[5][i] = m2[5][i] + m2[13][i];
1533
7.15M
    m1[6][i] = m2[6][i] + m2[14][i];
1534
7.15M
    m1[7][i] = m2[7][i] + m2[15][i];
1535
7.15M
    m1[8][i] = m2[0][i] - m2[8][i];
1536
7.15M
    m1[9][i] = m2[1][i] - m2[9][i];
1537
7.15M
    m1[10][i] = m2[2][i] - m2[10][i];
1538
7.15M
    m1[11][i] = m2[3][i] - m2[11][i];
1539
7.15M
    m1[12][i] = m2[4][i] - m2[12][i];
1540
7.15M
    m1[13][i] = m2[5][i] - m2[13][i];
1541
7.15M
    m1[14][i] = m2[6][i] - m2[14][i];
1542
7.15M
    m1[15][i] = m2[7][i] - m2[15][i];
1543
1544
7.15M
    m2[0][i] = m1[0][i] + m1[4][i];
1545
7.15M
    m2[1][i] = m1[1][i] + m1[5][i];
1546
7.15M
    m2[2][i] = m1[2][i] + m1[6][i];
1547
7.15M
    m2[3][i] = m1[3][i] + m1[7][i];
1548
7.15M
    m2[4][i] = m1[0][i] - m1[4][i];
1549
7.15M
    m2[5][i] = m1[1][i] - m1[5][i];
1550
7.15M
    m2[6][i] = m1[2][i] - m1[6][i];
1551
7.15M
    m2[7][i] = m1[3][i] - m1[7][i];
1552
7.15M
    m2[8][i] = m1[8][i] + m1[12][i];
1553
7.15M
    m2[9][i] = m1[9][i] + m1[13][i];
1554
7.15M
    m2[10][i] = m1[10][i] + m1[14][i];
1555
7.15M
    m2[11][i] = m1[11][i] + m1[15][i];
1556
7.15M
    m2[12][i] = m1[8][i] - m1[12][i];
1557
7.15M
    m2[13][i] = m1[9][i] - m1[13][i];
1558
7.15M
    m2[14][i] = m1[10][i] - m1[14][i];
1559
7.15M
    m2[15][i] = m1[11][i] - m1[15][i];
1560
1561
7.15M
    m1[0][i] = m2[0][i] + m2[2][i];
1562
7.15M
    m1[1][i] = m2[1][i] + m2[3][i];
1563
7.15M
    m1[2][i] = m2[0][i] - m2[2][i];
1564
7.15M
    m1[3][i] = m2[1][i] - m2[3][i];
1565
7.15M
    m1[4][i] = m2[4][i] + m2[6][i];
1566
7.15M
    m1[5][i] = m2[5][i] + m2[7][i];
1567
7.15M
    m1[6][i] = m2[4][i] - m2[6][i];
1568
7.15M
    m1[7][i] = m2[5][i] - m2[7][i];
1569
7.15M
    m1[8][i] = m2[8][i] + m2[10][i];
1570
7.15M
    m1[9][i] = m2[9][i] + m2[11][i];
1571
7.15M
    m1[10][i] = m2[8][i] - m2[10][i];
1572
7.15M
    m1[11][i] = m2[9][i] - m2[11][i];
1573
7.15M
    m1[12][i] = m2[12][i] + m2[14][i];
1574
7.15M
    m1[13][i] = m2[13][i] + m2[15][i];
1575
7.15M
    m1[14][i] = m2[12][i] - m2[14][i];
1576
7.15M
    m1[15][i] = m2[13][i] - m2[15][i];
1577
1578
7.15M
    m2[0][i] = m1[0][i] + m1[1][i];
1579
7.15M
    m2[1][i] = m1[0][i] - m1[1][i];
1580
7.15M
    m2[2][i] = m1[2][i] + m1[3][i];
1581
7.15M
    m2[3][i] = m1[2][i] - m1[3][i];
1582
7.15M
    m2[4][i] = m1[4][i] + m1[5][i];
1583
7.15M
    m2[5][i] = m1[4][i] - m1[5][i];
1584
7.15M
    m2[6][i] = m1[6][i] + m1[7][i];
1585
7.15M
    m2[7][i] = m1[6][i] - m1[7][i];
1586
7.15M
    m2[8][i] = m1[8][i] + m1[9][i];
1587
7.15M
    m2[9][i] = m1[8][i] - m1[9][i];
1588
7.15M
    m2[10][i] = m1[10][i] + m1[11][i];
1589
7.15M
    m2[11][i] = m1[10][i] - m1[11][i];
1590
7.15M
    m2[12][i] = m1[12][i] + m1[13][i];
1591
7.15M
    m2[13][i] = m1[12][i] - m1[13][i];
1592
7.15M
    m2[14][i] = m1[14][i] + m1[15][i];
1593
7.15M
    m2[15][i] = m1[14][i] - m1[15][i];
1594
7.15M
  }
1595
1596
15.2M
  for( i = 0; i < 16; i++ )
1597
14.3M
  {
1598
128M
    for( j = 0; j < 8; j++ )
1599
114M
    {
1600
114M
      sad += abs( m2[i][j] );
1601
114M
    }
1602
14.3M
  }
1603
  
1604
894k
  sad -= abs( m2[0][0] );
1605
894k
  sad += abs( m2[0][0] ) >> 2;
1606
894k
  sad = ( int ) ( sad / sqrt( 16.0 * 8 ) * 2 );
1607
1608
894k
  return sad;
1609
894k
}
1610
1611
static Distortion xCalcHADs4x8( const Pel* piOrg, const Pel* piCur, int iStrideOrg, int iStrideCur )
1612
160k
{
1613
160k
  int k, i, j, jj, sad = 0;
1614
160k
  int diff[32], m1[8][4], m2[8][4];
1615
1.44M
  for( k = 0; k < 32; k += 4 )
1616
1.28M
  {
1617
1.28M
    diff[k + 0] = piOrg[0] - piCur[0];
1618
1.28M
    diff[k + 1] = piOrg[1] - piCur[1];
1619
1.28M
    diff[k + 2] = piOrg[2] - piCur[2];
1620
1.28M
    diff[k + 3] = piOrg[3] - piCur[3];
1621
1622
1.28M
    piCur += iStrideCur;
1623
1.28M
    piOrg += iStrideOrg;
1624
1.28M
  }
1625
1626
  //horizontal
1627
1.44M
  for( j = 0; j < 8; j++ )
1628
1.28M
  {
1629
1.28M
    jj = j << 2;
1630
1.28M
    m2[j][0] = diff[jj] + diff[jj + 2];
1631
1.28M
    m2[j][1] = diff[jj + 1] + diff[jj + 3];
1632
1.28M
    m2[j][2] = diff[jj] - diff[jj + 2];
1633
1.28M
    m2[j][3] = diff[jj + 1] - diff[jj + 3];
1634
1635
1.28M
    m1[j][0] = m2[j][0] + m2[j][1];
1636
1.28M
    m1[j][1] = m2[j][0] - m2[j][1];
1637
1.28M
    m1[j][2] = m2[j][2] + m2[j][3];
1638
1.28M
    m1[j][3] = m2[j][2] - m2[j][3];
1639
1.28M
  }
1640
1641
  //vertical
1642
802k
  for( i = 0; i < 4; i++ )
1643
642k
  {
1644
642k
    m2[0][i] = m1[0][i] + m1[4][i];
1645
642k
    m2[1][i] = m1[1][i] + m1[5][i];
1646
642k
    m2[2][i] = m1[2][i] + m1[6][i];
1647
642k
    m2[3][i] = m1[3][i] + m1[7][i];
1648
642k
    m2[4][i] = m1[0][i] - m1[4][i];
1649
642k
    m2[5][i] = m1[1][i] - m1[5][i];
1650
642k
    m2[6][i] = m1[2][i] - m1[6][i];
1651
642k
    m2[7][i] = m1[3][i] - m1[7][i];
1652
1653
642k
    m1[0][i] = m2[0][i] + m2[2][i];
1654
642k
    m1[1][i] = m2[1][i] + m2[3][i];
1655
642k
    m1[2][i] = m2[0][i] - m2[2][i];
1656
642k
    m1[3][i] = m2[1][i] - m2[3][i];
1657
642k
    m1[4][i] = m2[4][i] + m2[6][i];
1658
642k
    m1[5][i] = m2[5][i] + m2[7][i];
1659
642k
    m1[6][i] = m2[4][i] - m2[6][i];
1660
642k
    m1[7][i] = m2[5][i] - m2[7][i];
1661
1662
642k
    m2[0][i] = m1[0][i] + m1[1][i];
1663
642k
    m2[1][i] = m1[0][i] - m1[1][i];
1664
642k
    m2[2][i] = m1[2][i] + m1[3][i];
1665
642k
    m2[3][i] = m1[2][i] - m1[3][i];
1666
642k
    m2[4][i] = m1[4][i] + m1[5][i];
1667
642k
    m2[5][i] = m1[4][i] - m1[5][i];
1668
642k
    m2[6][i] = m1[6][i] + m1[7][i];
1669
642k
    m2[7][i] = m1[6][i] - m1[7][i];
1670
642k
  }
1671
1672
1.44M
  for( i = 0; i < 8; i++ )
1673
1.28M
  {
1674
6.42M
    for( j = 0; j < 4; j++ )
1675
5.13M
    {
1676
5.13M
      sad += abs( m2[i][j] );
1677
5.13M
    }
1678
1.28M
  }
1679
  
1680
160k
  sad -= abs( m2[0][0] );
1681
160k
  sad += abs( m2[0][0] ) >> 2;
1682
160k
  sad = ( int ) ( sad / sqrt( 4.0 * 8 ) * 2 );
1683
1684
160k
  return sad;
1685
160k
}
1686
1687
static Distortion xCalcHADs8x4( const Pel* piOrg, const Pel* piCur, int iStrideOrg, int iStrideCur )
1688
165k
{
1689
165k
  int k, i, j, jj, sad = 0;
1690
165k
  int diff[32], m1[4][8], m2[4][8];
1691
828k
  for( k = 0; k < 32; k += 8 )
1692
662k
  {
1693
662k
    diff[k + 0] = piOrg[0] - piCur[0];
1694
662k
    diff[k + 1] = piOrg[1] - piCur[1];
1695
662k
    diff[k + 2] = piOrg[2] - piCur[2];
1696
662k
    diff[k + 3] = piOrg[3] - piCur[3];
1697
662k
    diff[k + 4] = piOrg[4] - piCur[4];
1698
662k
    diff[k + 5] = piOrg[5] - piCur[5];
1699
662k
    diff[k + 6] = piOrg[6] - piCur[6];
1700
662k
    diff[k + 7] = piOrg[7] - piCur[7];
1701
1702
662k
    piCur += iStrideCur;
1703
662k
    piOrg += iStrideOrg;
1704
662k
  }
1705
1706
  //horizontal
1707
828k
  for( j = 0; j < 4; j++ )
1708
662k
  {
1709
662k
    jj = j << 3;
1710
1711
662k
    m2[j][0] = diff[jj] + diff[jj + 4];
1712
662k
    m2[j][1] = diff[jj + 1] + diff[jj + 5];
1713
662k
    m2[j][2] = diff[jj + 2] + diff[jj + 6];
1714
662k
    m2[j][3] = diff[jj + 3] + diff[jj + 7];
1715
662k
    m2[j][4] = diff[jj] - diff[jj + 4];
1716
662k
    m2[j][5] = diff[jj + 1] - diff[jj + 5];
1717
662k
    m2[j][6] = diff[jj + 2] - diff[jj + 6];
1718
662k
    m2[j][7] = diff[jj + 3] - diff[jj + 7];
1719
1720
662k
    m1[j][0] = m2[j][0] + m2[j][2];
1721
662k
    m1[j][1] = m2[j][1] + m2[j][3];
1722
662k
    m1[j][2] = m2[j][0] - m2[j][2];
1723
662k
    m1[j][3] = m2[j][1] - m2[j][3];
1724
662k
    m1[j][4] = m2[j][4] + m2[j][6];
1725
662k
    m1[j][5] = m2[j][5] + m2[j][7];
1726
662k
    m1[j][6] = m2[j][4] - m2[j][6];
1727
662k
    m1[j][7] = m2[j][5] - m2[j][7];
1728
1729
662k
    m2[j][0] = m1[j][0] + m1[j][1];
1730
662k
    m2[j][1] = m1[j][0] - m1[j][1];
1731
662k
    m2[j][2] = m1[j][2] + m1[j][3];
1732
662k
    m2[j][3] = m1[j][2] - m1[j][3];
1733
662k
    m2[j][4] = m1[j][4] + m1[j][5];
1734
662k
    m2[j][5] = m1[j][4] - m1[j][5];
1735
662k
    m2[j][6] = m1[j][6] + m1[j][7];
1736
662k
    m2[j][7] = m1[j][6] - m1[j][7];
1737
662k
  }
1738
1739
  //vertical
1740
1.49M
  for( i = 0; i < 8; i++ )
1741
1.32M
  {
1742
1.32M
    m1[0][i] = m2[0][i] + m2[2][i];
1743
1.32M
    m1[1][i] = m2[1][i] + m2[3][i];
1744
1.32M
    m1[2][i] = m2[0][i] - m2[2][i];
1745
1.32M
    m1[3][i] = m2[1][i] - m2[3][i];
1746
1747
1.32M
    m2[0][i] = m1[0][i] + m1[1][i];
1748
1.32M
    m2[1][i] = m1[0][i] - m1[1][i];
1749
1.32M
    m2[2][i] = m1[2][i] + m1[3][i];
1750
1.32M
    m2[3][i] = m1[2][i] - m1[3][i];
1751
1.32M
  }
1752
1753
828k
  for( i = 0; i < 4; i++ )
1754
662k
  {
1755
5.96M
    for( j = 0; j < 8; j++ )
1756
5.30M
    {
1757
5.30M
      sad += abs( m2[i][j] );
1758
5.30M
    }
1759
662k
  }
1760
  
1761
165k
  sad -= abs( m2[0][0] );
1762
165k
  sad += abs( m2[0][0] ) >> 2;
1763
165k
  sad = ( int ) ( sad / sqrt( 4.0 * 8 ) * 2 );
1764
1765
165k
  return sad;
1766
165k
}
1767
1768
Distortion RdCost::xGetHAD2SADs( const DistParam &rcDtParam )
1769
888k
{
1770
888k
  if( rcDtParam.applyWeight )
1771
0
  {
1772
0
    THROW(" no support");
1773
0
  }
1774
1775
888k
  Distortion distHad = xGetHADs<false>( rcDtParam );
1776
888k
  Distortion distSad = 0;
1777
888k
  {
1778
888k
    CHECKD( (rcDtParam.org.width != rcDtParam.org.stride) || (rcDtParam.cur.stride != rcDtParam.org.stride) , "this functions assumes compact, aligned buffering");
1779
1780
888k
    const Pel* piOrg  = rcDtParam.org.buf;
1781
888k
    const Pel* piCur  = rcDtParam.cur.buf;
1782
888k
    int  iRows        = rcDtParam.org.height>>2;
1783
888k
    int  iCols        = rcDtParam.org.width<<2;
1784
1785
888k
    Distortion uiSum = 0;
1786
1787
7.63M
    for( int y = 0; y < iRows;  y++ )
1788
6.75M
    {
1789
71.2M
      for (int n = 0; n < iCols; n+=16 )
1790
64.4M
      {
1791
64.4M
        uiSum += abs( piOrg[n+ 0] - piCur[n+ 0] );
1792
64.4M
        uiSum += abs( piOrg[n+ 1] - piCur[n+ 1] );
1793
64.4M
        uiSum += abs( piOrg[n+ 2] - piCur[n+ 2] );
1794
64.4M
        uiSum += abs( piOrg[n+ 3] - piCur[n+ 3] );
1795
64.4M
        uiSum += abs( piOrg[n+ 4] - piCur[n+ 4] );
1796
64.4M
        uiSum += abs( piOrg[n+ 5] - piCur[n+ 5] );
1797
64.4M
        uiSum += abs( piOrg[n+ 6] - piCur[n+ 6] );
1798
64.4M
        uiSum += abs( piOrg[n+ 7] - piCur[n+ 7] );
1799
64.4M
        uiSum += abs( piOrg[n+ 8] - piCur[n+ 8] );
1800
64.4M
        uiSum += abs( piOrg[n+ 9] - piCur[n+ 9] );
1801
64.4M
        uiSum += abs( piOrg[n+10] - piCur[n+10] );
1802
64.4M
        uiSum += abs( piOrg[n+11] - piCur[n+11] );
1803
64.4M
        uiSum += abs( piOrg[n+12] - piCur[n+12] );
1804
64.4M
        uiSum += abs( piOrg[n+13] - piCur[n+13] );
1805
64.4M
        uiSum += abs( piOrg[n+14] - piCur[n+14] );
1806
64.4M
        uiSum += abs( piOrg[n+15] - piCur[n+15] );
1807
64.4M
      }
1808
6.75M
      piOrg += iCols;
1809
6.75M
      piCur += iCols;
1810
6.75M
    }
1811
1812
888k
    distSad = (uiSum >> DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth));
1813
888k
  }
1814
1815
0
  return std::min( distHad, 2*distSad);
1816
888k
}
1817
1818
template<bool fastHad>
1819
Distortion RdCost::xGetHADs( const DistParam &rcDtParam )
1820
1.47M
{
1821
1.47M
  if( rcDtParam.applyWeight )
1822
0
  {
1823
0
    THROW(" no support");
1824
0
  }
1825
1.47M
  const Pel* piOrg = rcDtParam.org.buf;
1826
1.47M
  const Pel* piCur = rcDtParam.cur.buf;
1827
1.47M
  const int  iRows = rcDtParam.org.height;
1828
1.47M
  const int  iCols = rcDtParam.org.width;
1829
1.47M
  const int  iStrideCur = rcDtParam.cur.stride;
1830
1.47M
  const int  iStrideOrg = rcDtParam.org.stride;
1831
1832
1.47M
  int  x = 0, y = 0;
1833
1834
1.47M
  Distortion uiSum = 0;
1835
1836
1.47M
  if( iCols > iRows && ( iRows & 7 ) == 0 && ( iCols & 15 ) == 0 )
1837
310k
  {
1838
763k
    for( y = 0; y < iRows; y += 8 )
1839
452k
    {
1840
1.28M
      for( x = 0; x < iCols; x += 16 )
1841
834k
      {
1842
834k
        uiSum += xCalcHADs16x8( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1843
834k
      }
1844
452k
      piOrg += iStrideOrg * 8;
1845
452k
      piCur += iStrideCur * 8;
1846
452k
    }
1847
310k
  }
1848
1.15M
  else if( iCols < iRows && ( iCols & 7 ) == 0 && ( iRows & 15 ) == 0 )
1849
324k
  {
1850
908k
    for( y = 0; y < iRows; y += 16 )
1851
583k
    {
1852
1.47M
      for( x = 0; x < iCols; x += 8 )
1853
894k
      {
1854
894k
        uiSum += xCalcHADs8x16( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1855
894k
      }
1856
583k
      piOrg += iStrideOrg * 16;
1857
583k
      piCur += iStrideCur * 16;
1858
583k
    }
1859
324k
  }
1860
835k
  else if( iCols > iRows && ( iRows & 3 ) == 0 && ( iCols & 7 ) == 0 )
1861
89.8k
  {
1862
179k
    for( y = 0; y < iRows; y += 4 )
1863
89.8k
    {
1864
255k
      for( x = 0; x < iCols; x += 8 )
1865
165k
      {
1866
165k
        uiSum += xCalcHADs8x4( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1867
165k
      }
1868
89.8k
      piOrg += iStrideOrg * 4;
1869
89.8k
      piCur += iStrideCur * 4;
1870
89.8k
    }
1871
89.8k
  }
1872
745k
  else if( iCols < iRows && ( iCols & 3 ) == 0 && ( iRows & 7 ) == 0 )
1873
84.6k
  {
1874
245k
    for( y = 0; y < iRows; y += 8 )
1875
160k
    {
1876
321k
      for( x = 0; x < iCols; x += 4 )
1877
160k
      {
1878
160k
        uiSum += xCalcHADs4x8( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1879
160k
      }
1880
160k
      piOrg += iStrideOrg * 8;
1881
160k
      piCur += iStrideCur * 8;
1882
160k
    }
1883
84.6k
  }
1884
661k
  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
661k
  else if( ( iRows % 8 == 0 ) && ( iCols % 8 == 0 ) )
1897
588k
  {
1898
3.07M
    for( y = 0; y < iRows; y += 8 )
1899
2.48M
    {
1900
16.9M
      for( x = 0; x < iCols; x += 8 )
1901
14.4M
      {
1902
14.4M
        uiSum += xCalcHADs8x8( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1903
14.4M
      }
1904
2.48M
      piOrg += 8*iStrideOrg;
1905
2.48M
      piCur += 8*iStrideCur;
1906
2.48M
    }
1907
588k
  }
1908
72.0k
  else if( ( iRows % 4 == 0 ) && ( iCols % 4 == 0 ) )
1909
43.4k
  {
1910
86.9k
    for( y = 0; y < iRows; y += 4 )
1911
43.4k
    {
1912
86.9k
      for( x = 0; x < iCols; x += 4 )
1913
43.4k
      {
1914
43.4k
        uiSum += xCalcHADs4x4( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1915
43.4k
      }
1916
43.4k
      piOrg += 4*iStrideOrg;
1917
43.4k
      piCur += 4*iStrideCur;
1918
43.4k
    }
1919
43.4k
  }
1920
28.6k
  else if( ( iRows % 2 == 0 ) && ( iCols % 2 == 0 ) )
1921
28.6k
  {
1922
57.2k
    for( y = 0; y < iRows; y += 2 )
1923
28.6k
    {
1924
186k
      for( x = 0; x < iCols; x += 2 )
1925
157k
      {
1926
157k
        uiSum += xCalcHADs2x2( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1927
157k
      }
1928
28.6k
      piOrg += 2*iStrideOrg;
1929
28.6k
      piCur += 2*iStrideCur;
1930
28.6k
    }
1931
28.6k
  }
1932
18.4E
  else
1933
18.4E
  {
1934
18.4E
    THROW( "Invalid size" );
1935
18.4E
  }
1936
1937
1.47M
  return (uiSum >> DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth));
1938
1.47M
}
unsigned long vvenc::RdCost::xGetHADs<false>(vvenc::DistParam const&)
Line
Count
Source
1820
1.47M
{
1821
1.47M
  if( rcDtParam.applyWeight )
1822
0
  {
1823
0
    THROW(" no support");
1824
0
  }
1825
1.47M
  const Pel* piOrg = rcDtParam.org.buf;
1826
1.47M
  const Pel* piCur = rcDtParam.cur.buf;
1827
1.47M
  const int  iRows = rcDtParam.org.height;
1828
1.47M
  const int  iCols = rcDtParam.org.width;
1829
1.47M
  const int  iStrideCur = rcDtParam.cur.stride;
1830
1.47M
  const int  iStrideOrg = rcDtParam.org.stride;
1831
1832
1.47M
  int  x = 0, y = 0;
1833
1834
1.47M
  Distortion uiSum = 0;
1835
1836
1.47M
  if( iCols > iRows && ( iRows & 7 ) == 0 && ( iCols & 15 ) == 0 )
1837
310k
  {
1838
763k
    for( y = 0; y < iRows; y += 8 )
1839
452k
    {
1840
1.28M
      for( x = 0; x < iCols; x += 16 )
1841
834k
      {
1842
834k
        uiSum += xCalcHADs16x8( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1843
834k
      }
1844
452k
      piOrg += iStrideOrg * 8;
1845
452k
      piCur += iStrideCur * 8;
1846
452k
    }
1847
310k
  }
1848
1.15M
  else if( iCols < iRows && ( iCols & 7 ) == 0 && ( iRows & 15 ) == 0 )
1849
324k
  {
1850
908k
    for( y = 0; y < iRows; y += 16 )
1851
583k
    {
1852
1.47M
      for( x = 0; x < iCols; x += 8 )
1853
894k
      {
1854
894k
        uiSum += xCalcHADs8x16( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1855
894k
      }
1856
583k
      piOrg += iStrideOrg * 16;
1857
583k
      piCur += iStrideCur * 16;
1858
583k
    }
1859
324k
  }
1860
835k
  else if( iCols > iRows && ( iRows & 3 ) == 0 && ( iCols & 7 ) == 0 )
1861
89.8k
  {
1862
179k
    for( y = 0; y < iRows; y += 4 )
1863
89.8k
    {
1864
255k
      for( x = 0; x < iCols; x += 8 )
1865
165k
      {
1866
165k
        uiSum += xCalcHADs8x4( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1867
165k
      }
1868
89.8k
      piOrg += iStrideOrg * 4;
1869
89.8k
      piCur += iStrideCur * 4;
1870
89.8k
    }
1871
89.8k
  }
1872
745k
  else if( iCols < iRows && ( iCols & 3 ) == 0 && ( iRows & 7 ) == 0 )
1873
84.6k
  {
1874
245k
    for( y = 0; y < iRows; y += 8 )
1875
160k
    {
1876
321k
      for( x = 0; x < iCols; x += 4 )
1877
160k
      {
1878
160k
        uiSum += xCalcHADs4x8( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1879
160k
      }
1880
160k
      piOrg += iStrideOrg * 8;
1881
160k
      piCur += iStrideCur * 8;
1882
160k
    }
1883
84.6k
  }
1884
661k
  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
661k
  else if( ( iRows % 8 == 0 ) && ( iCols % 8 == 0 ) )
1897
588k
  {
1898
3.07M
    for( y = 0; y < iRows; y += 8 )
1899
2.48M
    {
1900
16.9M
      for( x = 0; x < iCols; x += 8 )
1901
14.4M
      {
1902
14.4M
        uiSum += xCalcHADs8x8( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1903
14.4M
      }
1904
2.48M
      piOrg += 8*iStrideOrg;
1905
2.48M
      piCur += 8*iStrideCur;
1906
2.48M
    }
1907
588k
  }
1908
72.0k
  else if( ( iRows % 4 == 0 ) && ( iCols % 4 == 0 ) )
1909
43.4k
  {
1910
86.9k
    for( y = 0; y < iRows; y += 4 )
1911
43.4k
    {
1912
86.9k
      for( x = 0; x < iCols; x += 4 )
1913
43.4k
      {
1914
43.4k
        uiSum += xCalcHADs4x4( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1915
43.4k
      }
1916
43.4k
      piOrg += 4*iStrideOrg;
1917
43.4k
      piCur += 4*iStrideCur;
1918
43.4k
    }
1919
43.4k
  }
1920
28.6k
  else if( ( iRows % 2 == 0 ) && ( iCols % 2 == 0 ) )
1921
28.6k
  {
1922
57.2k
    for( y = 0; y < iRows; y += 2 )
1923
28.6k
    {
1924
186k
      for( x = 0; x < iCols; x += 2 )
1925
157k
      {
1926
157k
        uiSum += xCalcHADs2x2( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1927
157k
      }
1928
28.6k
      piOrg += 2*iStrideOrg;
1929
28.6k
      piCur += 2*iStrideCur;
1930
28.6k
    }
1931
28.6k
  }
1932
18.4E
  else
1933
18.4E
  {
1934
18.4E
    THROW( "Invalid size" );
1935
18.4E
  }
1936
1937
1.47M
  return (uiSum >> DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth));
1938
1.47M
}
Unexecuted instantiation: unsigned long vvenc::RdCost::xGetHADs<true>(vvenc::DistParam const&)
1939
1940
1941
void RdCost::saveUnadjustedLambda()
1942
8.21k
{
1943
8.21k
  m_dLambda_unadjusted = m_dLambda;
1944
8.21k
  m_DistScaleUnadjusted = m_DistScale;
1945
8.21k
}
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.14M
{
2097
1.14M
  return Distortion(m_dCostIBC * getBitsMultiplePredsIBC(x, y, useIMV));
2098
1.14M
}
2099
2100
static inline unsigned getIComponentBitsIBC( int val )
2101
3.13M
{
2102
3.13M
  if( !val ) return 1;
2103
2104
18.4E
  const unsigned int l2 = floorLog2( (val <= 0) ? (-val << 1) + 1 : (val << 1) );
2105
2106
1.58M
  return (l2 << 1) + 1;
2107
3.13M
}
2108
2109
unsigned int RdCost::getBitsMultiplePredsIBC(int x, int y, bool useIMV)
2110
1.14M
{
2111
1.14M
  int rmvH[2];
2112
1.14M
  int rmvV[2];
2113
1.14M
  rmvH[0] = x - m_bvPredictors[0].hor;
2114
1.14M
  rmvH[1] = x - m_bvPredictors[1].hor;
2115
2116
1.14M
  rmvV[0] = y - m_bvPredictors[0].ver;
2117
1.14M
  rmvV[1] = y - m_bvPredictors[1].ver;
2118
1.14M
  int absCand[2];
2119
1.14M
  absCand[0] = abs(rmvH[0]) + abs(rmvV[0]);
2120
1.14M
  absCand[1] = abs(rmvH[1]) + abs(rmvV[1]);
2121
2122
1.14M
  if (useIMV && x % 4 == 0 && y % 4 == 0)
2123
419k
  {
2124
419k
    int rmvHQP[2];
2125
419k
    int rmvVQP[2];
2126
2127
419k
    int imvShift = 2;
2128
419k
    int offset = 1 << (imvShift - 1);
2129
2130
419k
    rmvHQP[0] = (x >> 2) - ((m_bvPredictors[0].hor + offset) >> 2);
2131
419k
    rmvHQP[1] = (x >> 2) - ((m_bvPredictors[1].hor + offset) >> 2);
2132
419k
    rmvVQP[0] = (y >> 2) - ((m_bvPredictors[0].ver + offset) >> 2);
2133
419k
    rmvVQP[1] = (y >> 2) - ((m_bvPredictors[1].ver + offset) >> 2);
2134
2135
419k
    int absCandQP[2];
2136
419k
    absCandQP[0] = abs(rmvHQP[0]) + abs(rmvVQP[0]);
2137
419k
    absCandQP[1] = abs(rmvHQP[1]) + abs(rmvVQP[1]);
2138
419k
    unsigned int candBits0QP, candBits1QP;
2139
419k
    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
419k
    else
2154
419k
    {
2155
419k
      unsigned int candBits1 = getIComponentBitsIBC(rmvH[1]) + getIComponentBitsIBC(rmvV[1]);
2156
419k
      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
419k
      else
2162
419k
      {
2163
419k
        candBits1QP = getIComponentBitsIBC(rmvHQP[1]) + getIComponentBitsIBC(rmvVQP[1]);
2164
18.4E
        return candBits1QP < candBits1 ? candBits1QP : candBits1;
2165
419k
      }
2166
419k
    }
2167
419k
  }
2168
727k
  else
2169
727k
  {
2170
727k
    if (absCand[0] < absCand[1])
2171
0
    {
2172
0
      return getIComponentBitsIBC(rmvH[0]) + getIComponentBitsIBC(rmvV[0]);
2173
0
    }
2174
727k
    else
2175
727k
    {
2176
727k
      return getIComponentBitsIBC(rmvH[1]) + getIComponentBitsIBC(rmvV[1]);
2177
727k
    }
2178
727k
  }
2179
1.14M
}
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