Coverage Report

Created: 2026-07-30 06:27

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