Coverage Report

Created: 2026-09-01 06:57

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