Coverage Report

Created: 2026-07-16 06:32

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
17.3k
{
78
17.3k
  m_dLambda          = dLambda;
79
17.3k
  m_DistScale        = double(1<<SCALE_BITS) / m_dLambda;
80
17.3k
  m_dLambdaMotionSAD = sqrt(m_dLambda);
81
17.3k
}
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.8k
{
167
50.8k
  rcDP.bitDepth   = bitDepth;
168
50.8k
  rcDP.compID     = compID;
169
170
  // set Original & Curr Pointer / Stride
171
50.8k
  rcDP.org        = org;
172
173
50.8k
  rcDP.cur.buf    = piRefY;
174
50.8k
  rcDP.cur.stride = iRefStride;
175
176
  // set Block Width / Height
177
50.8k
  rcDP.cur.width    = org.width;
178
50.8k
  rcDP.cur.height   = org.height;
179
50.8k
  rcDP.maximumDistortionForEarlyExit = MAX_DISTORTION;
180
181
50.8k
  const int base = (rcDP.bitDepth > 10 || rcDP.applyWeight) ? 1 : 0;
182
50.8k
  if( !useHadamard )
183
50.8k
  {
184
50.8k
    rcDP.distFunc = m_afpDistortFunc[base][ DF_SAD + Log2( org.width ) ];
185
50.8k
  }
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.8k
  rcDP.subShift  = 0;
193
194
50.8k
  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.8k
  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.8k
}
214
215
216
DistParam RdCost::setDistParam( const CPelBuf& org, const CPelBuf& cur, int bitDepth, DFunc dfunc )
217
282k
{
218
282k
  int index = dfunc;
219
282k
  if( dfunc != DF_HAD && dfunc != DF_HAD_fast && dfunc != DF_HAD_2SAD )
220
115k
  {
221
115k
    index += Log2(org.width);
222
115k
  }
223
224
282k
  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
282k
  return DistParam( org, cur, m_afpDistortFunc[base][index], bitDepth, 0, COMP_Y );
232
282k
#endif
233
282k
}
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.76M
{
276
2.76M
  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.76M
  Distortion dist;
281
2.76M
  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.76M
  else
288
2.76M
  {
289
2.76M
    if( ( org.width == 1 ) )
290
0
    {
291
0
      dist = xGetSSE( dp );
292
0
    }
293
2.76M
    else
294
2.76M
    {
295
2.76M
      const int base = (bitDepth > 10) ? 1 : 0;
296
2.76M
      dist = m_afpDistortFunc[base][eDFunc + Log2(org.width)](dp);
297
2.76M
    }
298
2.76M
  }
299
2.76M
  if (isChroma(compId))
300
2.32M
  {
301
2.32M
    return ((Distortion) (m_distortionWeight[ compId ] * dist));
302
2.32M
  }
303
443k
  else
304
443k
  {
305
443k
    return dist;
306
443k
  }
307
2.76M
}
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
135k
{
356
135k
  if ( rcDtParam.applyWeight )
357
0
  {
358
0
    THROW(" no support");
359
0
  }
360
361
135k
  const Pel* piOrg   = rcDtParam.org.buf;
362
135k
  const Pel* piCur   = rcDtParam.cur.buf;
363
135k
  int  iRows         = rcDtParam.org.height;
364
135k
  int  iSubShift     = rcDtParam.subShift;
365
135k
  int  iSubStep      = ( 1 << iSubShift );
366
135k
  int  iStrideCur    = rcDtParam.cur.stride * iSubStep;
367
135k
  int  iStrideOrg    = rcDtParam.org.stride * iSubStep;
368
369
135k
  Distortion uiSum = 0;
370
371
1.66M
  for( ; iRows != 0; iRows -= iSubStep )
372
1.52M
  {
373
1.52M
    uiSum += abs( piOrg[0] - piCur[0] );
374
1.52M
    uiSum += abs( piOrg[1] - piCur[1] );
375
1.52M
    uiSum += abs( piOrg[2] - piCur[2] );
376
1.52M
    uiSum += abs( piOrg[3] - piCur[3] );
377
378
1.52M
    piOrg += iStrideOrg;
379
1.52M
    piCur += iStrideCur;
380
1.52M
  }
381
382
135k
  uiSum <<= iSubShift;
383
135k
  return (uiSum >> DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth));
384
135k
}
385
386
Distortion RdCost::xGetSAD8( const DistParam& rcDtParam )
387
544k
{
388
544k
  if ( rcDtParam.applyWeight )
389
0
  {
390
0
    THROW(" no support");
391
0
  }
392
393
544k
  const Pel* piOrg      = rcDtParam.org.buf;
394
544k
  const Pel* piCur      = rcDtParam.cur.buf;
395
544k
  int  iRows            = rcDtParam.org.height;
396
544k
  int  iSubShift        = rcDtParam.subShift;
397
544k
  int  iSubStep         = ( 1 << iSubShift );
398
544k
  int  iStrideCur       = rcDtParam.cur.stride * iSubStep;
399
544k
  int  iStrideOrg       = rcDtParam.org.stride * iSubStep;
400
401
544k
  Distortion uiSum = 0;
402
403
11.4M
  for( ; iRows != 0; iRows-=iSubStep )
404
10.9M
  {
405
10.9M
    uiSum += abs( piOrg[0] - piCur[0] );
406
10.9M
    uiSum += abs( piOrg[1] - piCur[1] );
407
10.9M
    uiSum += abs( piOrg[2] - piCur[2] );
408
10.9M
    uiSum += abs( piOrg[3] - piCur[3] );
409
10.9M
    uiSum += abs( piOrg[4] - piCur[4] );
410
10.9M
    uiSum += abs( piOrg[5] - piCur[5] );
411
10.9M
    uiSum += abs( piOrg[6] - piCur[6] );
412
10.9M
    uiSum += abs( piOrg[7] - piCur[7] );
413
414
10.9M
    piOrg += iStrideOrg;
415
10.9M
    piCur += iStrideCur;
416
10.9M
  }
417
418
544k
  uiSum <<= iSubShift;
419
544k
  return (uiSum >> DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth));
420
544k
}
421
422
Distortion RdCost::xGetSAD16( const DistParam& rcDtParam )
423
468k
{
424
468k
  if ( rcDtParam.applyWeight )
425
0
  {
426
0
    THROW(" no support");
427
0
  }
428
429
468k
  const Pel* piOrg      = rcDtParam.org.buf;
430
468k
  const Pel* piCur      = rcDtParam.cur.buf;
431
468k
  int  iRows            = rcDtParam.org.height;
432
468k
  int  iSubShift        = rcDtParam.subShift;
433
468k
  int  iSubStep         = ( 1 << iSubShift );
434
468k
  int  iStrideCur       = rcDtParam.cur.stride * iSubStep;
435
468k
  int  iStrideOrg       = rcDtParam.org.stride * iSubStep;
436
437
468k
  Distortion uiSum = 0;
438
439
10.3M
  for( ; iRows != 0; iRows -= iSubStep )
440
9.91M
  {
441
9.91M
    uiSum += abs( piOrg[0] - piCur[0] );
442
9.91M
    uiSum += abs( piOrg[1] - piCur[1] );
443
9.91M
    uiSum += abs( piOrg[2] - piCur[2] );
444
9.91M
    uiSum += abs( piOrg[3] - piCur[3] );
445
9.91M
    uiSum += abs( piOrg[4] - piCur[4] );
446
9.91M
    uiSum += abs( piOrg[5] - piCur[5] );
447
9.91M
    uiSum += abs( piOrg[6] - piCur[6] );
448
9.91M
    uiSum += abs( piOrg[7] - piCur[7] );
449
9.91M
    uiSum += abs( piOrg[8] - piCur[8] );
450
9.91M
    uiSum += abs( piOrg[9] - piCur[9] );
451
9.91M
    uiSum += abs( piOrg[10] - piCur[10] );
452
9.91M
    uiSum += abs( piOrg[11] - piCur[11] );
453
9.91M
    uiSum += abs( piOrg[12] - piCur[12] );
454
9.91M
    uiSum += abs( piOrg[13] - piCur[13] );
455
9.91M
    uiSum += abs( piOrg[14] - piCur[14] );
456
9.91M
    uiSum += abs( piOrg[15] - piCur[15] );
457
458
9.91M
    piOrg += iStrideOrg;
459
9.91M
    piCur += iStrideCur;
460
9.91M
  }
461
462
468k
  uiSum <<= iSubShift;
463
468k
  return (uiSum >> DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth));
464
468k
}
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
680k
{
511
680k
  if ( rcDtParam.applyWeight )
512
0
  {
513
0
    THROW(" no support");
514
0
  }
515
516
680k
  const Pel* piOrg      = rcDtParam.org.buf;
517
680k
  const Pel* piCur      = rcDtParam.cur.buf;
518
680k
  int  iRows            = rcDtParam.org.height;
519
680k
  int  iSubShift        = rcDtParam.subShift;
520
680k
  int  iSubStep         = ( 1 << iSubShift );
521
680k
  int  iStrideCur       = rcDtParam.cur.stride * iSubStep;
522
680k
  int  iStrideOrg       = rcDtParam.org.stride * iSubStep;
523
524
680k
  Distortion uiSum = 0;
525
526
13.4M
  for( ; iRows != 0; iRows-=iSubStep )
527
12.7M
  {
528
12.7M
    uiSum += abs( piOrg[0] - piCur[0] );
529
12.7M
    uiSum += abs( piOrg[1] - piCur[1] );
530
12.7M
    uiSum += abs( piOrg[2] - piCur[2] );
531
12.7M
    uiSum += abs( piOrg[3] - piCur[3] );
532
12.7M
    uiSum += abs( piOrg[4] - piCur[4] );
533
12.7M
    uiSum += abs( piOrg[5] - piCur[5] );
534
12.7M
    uiSum += abs( piOrg[6] - piCur[6] );
535
12.7M
    uiSum += abs( piOrg[7] - piCur[7] );
536
12.7M
    uiSum += abs( piOrg[8] - piCur[8] );
537
12.7M
    uiSum += abs( piOrg[9] - piCur[9] );
538
12.7M
    uiSum += abs( piOrg[10] - piCur[10] );
539
12.7M
    uiSum += abs( piOrg[11] - piCur[11] );
540
12.7M
    uiSum += abs( piOrg[12] - piCur[12] );
541
12.7M
    uiSum += abs( piOrg[13] - piCur[13] );
542
12.7M
    uiSum += abs( piOrg[14] - piCur[14] );
543
12.7M
    uiSum += abs( piOrg[15] - piCur[15] );
544
12.7M
    uiSum += abs( piOrg[16] - piCur[16] );
545
12.7M
    uiSum += abs( piOrg[17] - piCur[17] );
546
12.7M
    uiSum += abs( piOrg[18] - piCur[18] );
547
12.7M
    uiSum += abs( piOrg[19] - piCur[19] );
548
12.7M
    uiSum += abs( piOrg[20] - piCur[20] );
549
12.7M
    uiSum += abs( piOrg[21] - piCur[21] );
550
12.7M
    uiSum += abs( piOrg[22] - piCur[22] );
551
12.7M
    uiSum += abs( piOrg[23] - piCur[23] );
552
12.7M
    uiSum += abs( piOrg[24] - piCur[24] );
553
12.7M
    uiSum += abs( piOrg[25] - piCur[25] );
554
12.7M
    uiSum += abs( piOrg[26] - piCur[26] );
555
12.7M
    uiSum += abs( piOrg[27] - piCur[27] );
556
12.7M
    uiSum += abs( piOrg[28] - piCur[28] );
557
12.7M
    uiSum += abs( piOrg[29] - piCur[29] );
558
12.7M
    uiSum += abs( piOrg[30] - piCur[30] );
559
12.7M
    uiSum += abs( piOrg[31] - piCur[31] );
560
561
12.7M
    piOrg += iStrideOrg;
562
12.7M
    piCur += iStrideCur;
563
12.7M
  }
564
565
680k
  uiSum <<= iSubShift;
566
680k
  return (uiSum >> DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth));
567
680k
}
568
569
570
Distortion RdCost::xGetSAD64( const DistParam &rcDtParam )
571
8.70k
{
572
8.70k
  if ( rcDtParam.applyWeight )
573
0
  {
574
0
    THROW(" no support");
575
0
  }
576
577
8.70k
  const Pel* piOrg      = rcDtParam.org.buf;
578
8.70k
  const Pel* piCur      = rcDtParam.cur.buf;
579
8.70k
  int  iRows            = rcDtParam.org.height;
580
8.70k
  int  iSubShift        = rcDtParam.subShift;
581
8.70k
  int  iSubStep         = ( 1 << iSubShift );
582
8.70k
  int  iStrideCur       = rcDtParam.cur.stride * iSubStep;
583
8.70k
  int  iStrideOrg       = rcDtParam.org.stride * iSubStep;
584
585
8.70k
  Distortion uiSum = 0;
586
587
565k
  for( ; iRows != 0; iRows-=iSubStep )
588
557k
  {
589
557k
    uiSum += abs( piOrg[0] - piCur[0] );
590
557k
    uiSum += abs( piOrg[1] - piCur[1] );
591
557k
    uiSum += abs( piOrg[2] - piCur[2] );
592
557k
    uiSum += abs( piOrg[3] - piCur[3] );
593
557k
    uiSum += abs( piOrg[4] - piCur[4] );
594
557k
    uiSum += abs( piOrg[5] - piCur[5] );
595
557k
    uiSum += abs( piOrg[6] - piCur[6] );
596
557k
    uiSum += abs( piOrg[7] - piCur[7] );
597
557k
    uiSum += abs( piOrg[8] - piCur[8] );
598
557k
    uiSum += abs( piOrg[9] - piCur[9] );
599
557k
    uiSum += abs( piOrg[10] - piCur[10] );
600
557k
    uiSum += abs( piOrg[11] - piCur[11] );
601
557k
    uiSum += abs( piOrg[12] - piCur[12] );
602
557k
    uiSum += abs( piOrg[13] - piCur[13] );
603
557k
    uiSum += abs( piOrg[14] - piCur[14] );
604
557k
    uiSum += abs( piOrg[15] - piCur[15] );
605
557k
    uiSum += abs( piOrg[16] - piCur[16] );
606
557k
    uiSum += abs( piOrg[17] - piCur[17] );
607
557k
    uiSum += abs( piOrg[18] - piCur[18] );
608
557k
    uiSum += abs( piOrg[19] - piCur[19] );
609
557k
    uiSum += abs( piOrg[20] - piCur[20] );
610
557k
    uiSum += abs( piOrg[21] - piCur[21] );
611
557k
    uiSum += abs( piOrg[22] - piCur[22] );
612
557k
    uiSum += abs( piOrg[23] - piCur[23] );
613
557k
    uiSum += abs( piOrg[24] - piCur[24] );
614
557k
    uiSum += abs( piOrg[25] - piCur[25] );
615
557k
    uiSum += abs( piOrg[26] - piCur[26] );
616
557k
    uiSum += abs( piOrg[27] - piCur[27] );
617
557k
    uiSum += abs( piOrg[28] - piCur[28] );
618
557k
    uiSum += abs( piOrg[29] - piCur[29] );
619
557k
    uiSum += abs( piOrg[30] - piCur[30] );
620
557k
    uiSum += abs( piOrg[31] - piCur[31] );
621
557k
    uiSum += abs( piOrg[32] - piCur[32] );
622
557k
    uiSum += abs( piOrg[33] - piCur[33] );
623
557k
    uiSum += abs( piOrg[34] - piCur[34] );
624
557k
    uiSum += abs( piOrg[35] - piCur[35] );
625
557k
    uiSum += abs( piOrg[36] - piCur[36] );
626
557k
    uiSum += abs( piOrg[37] - piCur[37] );
627
557k
    uiSum += abs( piOrg[38] - piCur[38] );
628
557k
    uiSum += abs( piOrg[39] - piCur[39] );
629
557k
    uiSum += abs( piOrg[40] - piCur[40] );
630
557k
    uiSum += abs( piOrg[41] - piCur[41] );
631
557k
    uiSum += abs( piOrg[42] - piCur[42] );
632
557k
    uiSum += abs( piOrg[43] - piCur[43] );
633
557k
    uiSum += abs( piOrg[44] - piCur[44] );
634
557k
    uiSum += abs( piOrg[45] - piCur[45] );
635
557k
    uiSum += abs( piOrg[46] - piCur[46] );
636
557k
    uiSum += abs( piOrg[47] - piCur[47] );
637
557k
    uiSum += abs( piOrg[48] - piCur[48] );
638
557k
    uiSum += abs( piOrg[49] - piCur[49] );
639
557k
    uiSum += abs( piOrg[50] - piCur[50] );
640
557k
    uiSum += abs( piOrg[51] - piCur[51] );
641
557k
    uiSum += abs( piOrg[52] - piCur[52] );
642
557k
    uiSum += abs( piOrg[53] - piCur[53] );
643
557k
    uiSum += abs( piOrg[54] - piCur[54] );
644
557k
    uiSum += abs( piOrg[55] - piCur[55] );
645
557k
    uiSum += abs( piOrg[56] - piCur[56] );
646
557k
    uiSum += abs( piOrg[57] - piCur[57] );
647
557k
    uiSum += abs( piOrg[58] - piCur[58] );
648
557k
    uiSum += abs( piOrg[59] - piCur[59] );
649
557k
    uiSum += abs( piOrg[60] - piCur[60] );
650
557k
    uiSum += abs( piOrg[61] - piCur[61] );
651
557k
    uiSum += abs( piOrg[62] - piCur[62] );
652
557k
    uiSum += abs( piOrg[63] - piCur[63] );
653
654
557k
    piOrg += iStrideOrg;
655
557k
    piCur += iStrideCur;
656
557k
  }
657
658
8.70k
  uiSum <<= iSubShift;
659
8.70k
  return (uiSum >> DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth));
660
8.70k
}
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
575k
{
702
575k
  if ( rcDtParam.applyWeight )
703
0
  {
704
0
    CHECK( rcDtParam.org.width != 4, "Invalid size" );
705
0
    THROW(" no support");
706
0
  }
707
708
575k
  const Pel* piOrg   = rcDtParam.org.buf;
709
575k
  const Pel* piCur   = rcDtParam.cur.buf;
710
575k
  int  iRows         = rcDtParam.org.height;
711
575k
  int  iStrideOrg    = rcDtParam.org.stride;
712
575k
  int  iStrideCur    = rcDtParam.cur.stride;
713
714
575k
  Distortion uiSum   = 0;
715
575k
  uint32_t uiShift = DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth) << 1;
716
717
575k
  Intermediate_Int  iTemp;
718
719
8.01M
  for( ; iRows != 0; iRows-- )
720
7.44M
  {
721
722
7.44M
    iTemp = piOrg[0] - piCur[0]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
723
7.44M
    iTemp = piOrg[1] - piCur[1]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
724
7.44M
    iTemp = piOrg[2] - piCur[2]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
725
7.44M
    iTemp = piOrg[3] - piCur[3]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
726
727
7.44M
    piOrg += iStrideOrg;
728
7.44M
    piCur += iStrideCur;
729
7.44M
  }
730
731
575k
  return ( uiSum );
732
575k
}
733
734
Distortion RdCost::xGetSSE8( const DistParam &rcDtParam )
735
862k
{
736
862k
  if ( rcDtParam.applyWeight )
737
0
  {
738
0
    CHECK( rcDtParam.org.width != 8, "Invalid size" );
739
0
    THROW(" no support");
740
0
  }
741
742
862k
  const Pel* piOrg   = rcDtParam.org.buf;
743
862k
  const Pel* piCur   = rcDtParam.cur.buf;
744
862k
  int  iRows         = rcDtParam.org.height;
745
862k
  int  iStrideOrg    = rcDtParam.org.stride;
746
862k
  int  iStrideCur    = rcDtParam.cur.stride;
747
748
862k
  Distortion uiSum   = 0;
749
862k
  uint32_t uiShift = DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth) << 1;
750
751
862k
  Intermediate_Int  iTemp;
752
753
13.2M
  for( ; iRows != 0; iRows-- )
754
12.4M
  {
755
12.4M
    iTemp = piOrg[0] - piCur[0]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
756
12.4M
    iTemp = piOrg[1] - piCur[1]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
757
12.4M
    iTemp = piOrg[2] - piCur[2]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
758
12.4M
    iTemp = piOrg[3] - piCur[3]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
759
12.4M
    iTemp = piOrg[4] - piCur[4]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
760
12.4M
    iTemp = piOrg[5] - piCur[5]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
761
12.4M
    iTemp = piOrg[6] - piCur[6]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
762
12.4M
    iTemp = piOrg[7] - piCur[7]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
763
764
12.4M
    piOrg += iStrideOrg;
765
12.4M
    piCur += iStrideCur;
766
12.4M
  }
767
768
862k
  return ( uiSum );
769
862k
}
770
771
Distortion RdCost::xGetSSE16( const DistParam &rcDtParam )
772
698k
{
773
698k
  if ( rcDtParam.applyWeight )
774
0
  {
775
0
    CHECK( rcDtParam.org.width != 16, "Invalid size" );
776
0
    THROW(" no support");
777
0
  }
778
779
698k
  const Pel* piOrg   = rcDtParam.org.buf;
780
698k
  const Pel* piCur   = rcDtParam.cur.buf;
781
698k
  int  iRows         = rcDtParam.org.height;
782
698k
  int  iStrideOrg    = rcDtParam.org.stride;
783
698k
  int  iStrideCur    = rcDtParam.cur.stride;
784
785
698k
  Distortion uiSum   = 0;
786
698k
  uint32_t uiShift = DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth) << 1;
787
788
698k
  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
698k
  return ( uiSum );
815
698k
}
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
564k
{
867
564k
  if ( rcDtParam.applyWeight )
868
0
  {
869
0
    THROW(" no support");
870
0
  }
871
872
564k
  const Pel* piOrg   = rcDtParam.org.buf;
873
564k
  const Pel* piCur   = rcDtParam.cur.buf;
874
564k
  int  iRows         = rcDtParam.org.height;
875
564k
  int  iStrideOrg    = rcDtParam.org.stride;
876
564k
  int  iStrideCur    = rcDtParam.cur.stride;
877
878
564k
  Distortion uiSum   = 0;
879
564k
  uint32_t uiShift = DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth) << 1;
880
881
564k
  Intermediate_Int  iTemp;
882
883
9.91M
  for( ; iRows != 0; iRows-- )
884
9.35M
  {
885
886
9.35M
    iTemp = piOrg[ 0] - piCur[ 0]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
887
9.35M
    iTemp = piOrg[ 1] - piCur[ 1]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
888
9.35M
    iTemp = piOrg[ 2] - piCur[ 2]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
889
9.35M
    iTemp = piOrg[ 3] - piCur[ 3]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
890
9.35M
    iTemp = piOrg[ 4] - piCur[ 4]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
891
9.35M
    iTemp = piOrg[ 5] - piCur[ 5]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
892
9.35M
    iTemp = piOrg[ 6] - piCur[ 6]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
893
9.35M
    iTemp = piOrg[ 7] - piCur[ 7]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
894
9.35M
    iTemp = piOrg[ 8] - piCur[ 8]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
895
9.35M
    iTemp = piOrg[ 9] - piCur[ 9]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
896
9.35M
    iTemp = piOrg[10] - piCur[10]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
897
9.35M
    iTemp = piOrg[11] - piCur[11]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
898
9.35M
    iTemp = piOrg[12] - piCur[12]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
899
9.35M
    iTemp = piOrg[13] - piCur[13]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
900
9.35M
    iTemp = piOrg[14] - piCur[14]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
901
9.35M
    iTemp = piOrg[15] - piCur[15]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
902
9.35M
    iTemp = piOrg[16] - piCur[16]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
903
9.35M
    iTemp = piOrg[17] - piCur[17]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
904
9.35M
    iTemp = piOrg[18] - piCur[18]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
905
9.35M
    iTemp = piOrg[19] - piCur[19]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
906
9.35M
    iTemp = piOrg[20] - piCur[20]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
907
9.35M
    iTemp = piOrg[21] - piCur[21]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
908
9.35M
    iTemp = piOrg[22] - piCur[22]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
909
9.35M
    iTemp = piOrg[23] - piCur[23]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
910
9.35M
    iTemp = piOrg[24] - piCur[24]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
911
9.35M
    iTemp = piOrg[25] - piCur[25]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
912
9.35M
    iTemp = piOrg[26] - piCur[26]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
913
9.35M
    iTemp = piOrg[27] - piCur[27]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
914
9.35M
    iTemp = piOrg[28] - piCur[28]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
915
9.35M
    iTemp = piOrg[29] - piCur[29]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
916
9.35M
    iTemp = piOrg[30] - piCur[30]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
917
9.35M
    iTemp = piOrg[31] - piCur[31]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
918
919
9.35M
    piOrg += iStrideOrg;
920
9.35M
    piCur += iStrideCur;
921
9.35M
  }
922
923
564k
  return ( uiSum );
924
564k
}
925
926
Distortion RdCost::xGetSSE64( const DistParam &rcDtParam )
927
67.7k
{
928
67.7k
  if ( rcDtParam.applyWeight )
929
0
  {
930
0
    THROW(" no support");
931
0
  }
932
933
67.7k
  const Pel* piOrg   = rcDtParam.org.buf;
934
67.7k
  const Pel* piCur   = rcDtParam.cur.buf;
935
67.7k
  int  iRows         = rcDtParam.org.height;
936
67.7k
  int  iStrideOrg    = rcDtParam.org.stride;
937
67.7k
  int  iStrideCur    = rcDtParam.cur.stride;
938
939
67.7k
  Distortion uiSum   = 0;
940
67.7k
  uint32_t uiShift = DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth) << 1;
941
942
67.7k
  Intermediate_Int  iTemp;
943
944
3.60M
  for( ; iRows != 0; iRows-- )
945
3.53M
  {
946
3.53M
    iTemp = piOrg[ 0] - piCur[ 0]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
947
3.53M
    iTemp = piOrg[ 1] - piCur[ 1]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
948
3.53M
    iTemp = piOrg[ 2] - piCur[ 2]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
949
3.53M
    iTemp = piOrg[ 3] - piCur[ 3]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
950
3.53M
    iTemp = piOrg[ 4] - piCur[ 4]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
951
3.53M
    iTemp = piOrg[ 5] - piCur[ 5]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
952
3.53M
    iTemp = piOrg[ 6] - piCur[ 6]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
953
3.53M
    iTemp = piOrg[ 7] - piCur[ 7]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
954
3.53M
    iTemp = piOrg[ 8] - piCur[ 8]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
955
3.53M
    iTemp = piOrg[ 9] - piCur[ 9]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
956
3.53M
    iTemp = piOrg[10] - piCur[10]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
957
3.53M
    iTemp = piOrg[11] - piCur[11]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
958
3.53M
    iTemp = piOrg[12] - piCur[12]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
959
3.53M
    iTemp = piOrg[13] - piCur[13]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
960
3.53M
    iTemp = piOrg[14] - piCur[14]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
961
3.53M
    iTemp = piOrg[15] - piCur[15]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
962
3.53M
    iTemp = piOrg[16] - piCur[16]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
963
3.53M
    iTemp = piOrg[17] - piCur[17]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
964
3.53M
    iTemp = piOrg[18] - piCur[18]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
965
3.53M
    iTemp = piOrg[19] - piCur[19]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
966
3.53M
    iTemp = piOrg[20] - piCur[20]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
967
3.53M
    iTemp = piOrg[21] - piCur[21]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
968
3.53M
    iTemp = piOrg[22] - piCur[22]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
969
3.53M
    iTemp = piOrg[23] - piCur[23]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
970
3.53M
    iTemp = piOrg[24] - piCur[24]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
971
3.53M
    iTemp = piOrg[25] - piCur[25]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
972
3.53M
    iTemp = piOrg[26] - piCur[26]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
973
3.53M
    iTemp = piOrg[27] - piCur[27]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
974
3.53M
    iTemp = piOrg[28] - piCur[28]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
975
3.53M
    iTemp = piOrg[29] - piCur[29]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
976
3.53M
    iTemp = piOrg[30] - piCur[30]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
977
3.53M
    iTemp = piOrg[31] - piCur[31]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
978
3.53M
    iTemp = piOrg[32] - piCur[32]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
979
3.53M
    iTemp = piOrg[33] - piCur[33]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
980
3.53M
    iTemp = piOrg[34] - piCur[34]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
981
3.53M
    iTemp = piOrg[35] - piCur[35]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
982
3.53M
    iTemp = piOrg[36] - piCur[36]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
983
3.53M
    iTemp = piOrg[37] - piCur[37]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
984
3.53M
    iTemp = piOrg[38] - piCur[38]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
985
3.53M
    iTemp = piOrg[39] - piCur[39]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
986
3.53M
    iTemp = piOrg[40] - piCur[40]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
987
3.53M
    iTemp = piOrg[41] - piCur[41]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
988
3.53M
    iTemp = piOrg[42] - piCur[42]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
989
3.53M
    iTemp = piOrg[43] - piCur[43]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
990
3.53M
    iTemp = piOrg[44] - piCur[44]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
991
3.53M
    iTemp = piOrg[45] - piCur[45]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
992
3.53M
    iTemp = piOrg[46] - piCur[46]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
993
3.53M
    iTemp = piOrg[47] - piCur[47]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
994
3.53M
    iTemp = piOrg[48] - piCur[48]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
995
3.53M
    iTemp = piOrg[49] - piCur[49]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
996
3.53M
    iTemp = piOrg[50] - piCur[50]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
997
3.53M
    iTemp = piOrg[51] - piCur[51]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
998
3.53M
    iTemp = piOrg[52] - piCur[52]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
999
3.53M
    iTemp = piOrg[53] - piCur[53]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1000
3.53M
    iTemp = piOrg[54] - piCur[54]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1001
3.53M
    iTemp = piOrg[55] - piCur[55]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1002
3.53M
    iTemp = piOrg[56] - piCur[56]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1003
3.53M
    iTemp = piOrg[57] - piCur[57]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1004
3.53M
    iTemp = piOrg[58] - piCur[58]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1005
3.53M
    iTemp = piOrg[59] - piCur[59]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1006
3.53M
    iTemp = piOrg[60] - piCur[60]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1007
3.53M
    iTemp = piOrg[61] - piCur[61]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1008
3.53M
    iTemp = piOrg[62] - piCur[62]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1009
3.53M
    iTemp = piOrg[63] - piCur[63]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1010
1011
3.53M
    piOrg += iStrideOrg;
1012
3.53M
    piCur += iStrideCur;
1013
3.53M
  }
1014
1015
67.7k
  return ( uiSum );
1016
67.7k
}
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
172k
{
1024
172k
  Distortion satd = 0;
1025
172k
  TCoeff diff[4], m[4];
1026
1027
172k
  diff[0] = piOrg[0             ] - piCur[0];
1028
172k
  diff[1] = piOrg[1             ] - piCur[1];
1029
172k
  diff[2] = piOrg[iStrideOrg    ] - piCur[0 + iStrideCur];
1030
172k
  diff[3] = piOrg[iStrideOrg + 1] - piCur[1 + iStrideCur];
1031
172k
  m[0] = diff[0] + diff[2];
1032
172k
  m[1] = diff[1] + diff[3];
1033
172k
  m[2] = diff[0] - diff[2];
1034
172k
  m[3] = diff[1] - diff[3];
1035
  
1036
172k
  satd += abs(m[0] + m[1]) >> 2;
1037
172k
  satd += abs(m[0] - m[1]);
1038
172k
  satd += abs(m[2] + m[3]);
1039
172k
  satd += abs(m[2] - m[3]);
1040
1041
172k
  return satd;
1042
172k
}
1043
1044
static Distortion xCalcHADs4x4( const Pel* piOrg, const Pel* piCur, int iStrideOrg, int iStrideCur )
1045
46.5k
{
1046
46.5k
  int k;
1047
46.5k
  Distortion satd = 0;
1048
46.5k
  TCoeff diff[16], m[16], d[16];
1049
1050
232k
  for( k = 0; k < 16; k+=4 )
1051
186k
  {
1052
186k
    diff[k+0] = piOrg[0] - piCur[0];
1053
186k
    diff[k+1] = piOrg[1] - piCur[1];
1054
186k
    diff[k+2] = piOrg[2] - piCur[2];
1055
186k
    diff[k+3] = piOrg[3] - piCur[3];
1056
1057
186k
    piCur += iStrideCur;
1058
186k
    piOrg += iStrideOrg;
1059
186k
  }
1060
1061
  /*===== hadamard transform =====*/
1062
46.5k
  m[ 0] = diff[ 0] + diff[12];
1063
46.5k
  m[ 1] = diff[ 1] + diff[13];
1064
46.5k
  m[ 2] = diff[ 2] + diff[14];
1065
46.5k
  m[ 3] = diff[ 3] + diff[15];
1066
46.5k
  m[ 4] = diff[ 4] + diff[ 8];
1067
46.5k
  m[ 5] = diff[ 5] + diff[ 9];
1068
46.5k
  m[ 6] = diff[ 6] + diff[10];
1069
46.5k
  m[ 7] = diff[ 7] + diff[11];
1070
46.5k
  m[ 8] = diff[ 4] - diff[ 8];
1071
46.5k
  m[ 9] = diff[ 5] - diff[ 9];
1072
46.5k
  m[10] = diff[ 6] - diff[10];
1073
46.5k
  m[11] = diff[ 7] - diff[11];
1074
46.5k
  m[12] = diff[ 0] - diff[12];
1075
46.5k
  m[13] = diff[ 1] - diff[13];
1076
46.5k
  m[14] = diff[ 2] - diff[14];
1077
46.5k
  m[15] = diff[ 3] - diff[15];
1078
1079
46.5k
  d[ 0] = m[ 0] + m[ 4];
1080
46.5k
  d[ 1] = m[ 1] + m[ 5];
1081
46.5k
  d[ 2] = m[ 2] + m[ 6];
1082
46.5k
  d[ 3] = m[ 3] + m[ 7];
1083
46.5k
  d[ 4] = m[ 8] + m[12];
1084
46.5k
  d[ 5] = m[ 9] + m[13];
1085
46.5k
  d[ 6] = m[10] + m[14];
1086
46.5k
  d[ 7] = m[11] + m[15];
1087
46.5k
  d[ 8] = m[ 0] - m[ 4];
1088
46.5k
  d[ 9] = m[ 1] - m[ 5];
1089
46.5k
  d[10] = m[ 2] - m[ 6];
1090
46.5k
  d[11] = m[ 3] - m[ 7];
1091
46.5k
  d[12] = m[12] - m[ 8];
1092
46.5k
  d[13] = m[13] - m[ 9];
1093
46.5k
  d[14] = m[14] - m[10];
1094
46.5k
  d[15] = m[15] - m[11];
1095
1096
46.5k
  m[ 0] = d[ 0] + d[ 3];
1097
46.5k
  m[ 1] = d[ 1] + d[ 2];
1098
46.5k
  m[ 2] = d[ 1] - d[ 2];
1099
46.5k
  m[ 3] = d[ 0] - d[ 3];
1100
46.5k
  m[ 4] = d[ 4] + d[ 7];
1101
46.5k
  m[ 5] = d[ 5] + d[ 6];
1102
46.5k
  m[ 6] = d[ 5] - d[ 6];
1103
46.5k
  m[ 7] = d[ 4] - d[ 7];
1104
46.5k
  m[ 8] = d[ 8] + d[11];
1105
46.5k
  m[ 9] = d[ 9] + d[10];
1106
46.5k
  m[10] = d[ 9] - d[10];
1107
46.5k
  m[11] = d[ 8] - d[11];
1108
46.5k
  m[12] = d[12] + d[15];
1109
46.5k
  m[13] = d[13] + d[14];
1110
46.5k
  m[14] = d[13] - d[14];
1111
46.5k
  m[15] = d[12] - d[15];
1112
1113
46.5k
  d[ 0] = m[ 0] + m[ 1];
1114
46.5k
  d[ 1] = m[ 0] - m[ 1];
1115
46.5k
  d[ 2] = m[ 2] + m[ 3];
1116
46.5k
  d[ 3] = m[ 3] - m[ 2];
1117
46.5k
  d[ 4] = m[ 4] + m[ 5];
1118
46.5k
  d[ 5] = m[ 4] - m[ 5];
1119
46.5k
  d[ 6] = m[ 6] + m[ 7];
1120
46.5k
  d[ 7] = m[ 7] - m[ 6];
1121
46.5k
  d[ 8] = m[ 8] + m[ 9];
1122
46.5k
  d[ 9] = m[ 8] - m[ 9];
1123
46.5k
  d[10] = m[10] + m[11];
1124
46.5k
  d[11] = m[11] - m[10];
1125
46.5k
  d[12] = m[12] + m[13];
1126
46.5k
  d[13] = m[12] - m[13];
1127
46.5k
  d[14] = m[14] + m[15];
1128
46.5k
  d[15] = m[15] - m[14];
1129
1130
792k
  for (k=0; k<16; ++k)
1131
745k
  {
1132
745k
    satd += abs(d[k]);
1133
745k
  }
1134
1135
46.5k
  satd -= abs( d[0] );
1136
46.5k
  satd += abs( d[0] ) >> 2;
1137
46.5k
  satd = ((satd+1)>>1);
1138
1139
46.5k
  return satd;
1140
46.5k
}
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
15.9M
{
1243
15.9M
  int k, i, j, jj;
1244
15.9M
  Distortion sad = 0;
1245
15.9M
  TCoeff diff[64], m1[8][8], m2[8][8], m3[8][8];
1246
1247
143M
  for( k = 0; k < 64; k += 8 )
1248
127M
  {
1249
127M
    diff[k+0] = piOrg[0] - piCur[0];
1250
127M
    diff[k+1] = piOrg[1] - piCur[1];
1251
127M
    diff[k+2] = piOrg[2] - piCur[2];
1252
127M
    diff[k+3] = piOrg[3] - piCur[3];
1253
127M
    diff[k+4] = piOrg[4] - piCur[4];
1254
127M
    diff[k+5] = piOrg[5] - piCur[5];
1255
127M
    diff[k+6] = piOrg[6] - piCur[6];
1256
127M
    diff[k+7] = piOrg[7] - piCur[7];
1257
1258
127M
    piCur += iStrideCur;
1259
127M
    piOrg += iStrideOrg;
1260
127M
  }
1261
1262
  //horizontal
1263
143M
  for (j=0; j < 8; j++)
1264
127M
  {
1265
127M
    jj = j << 3;
1266
127M
    m2[j][0] = diff[jj  ] + diff[jj+4];
1267
127M
    m2[j][1] = diff[jj+1] + diff[jj+5];
1268
127M
    m2[j][2] = diff[jj+2] + diff[jj+6];
1269
127M
    m2[j][3] = diff[jj+3] + diff[jj+7];
1270
127M
    m2[j][4] = diff[jj  ] - diff[jj+4];
1271
127M
    m2[j][5] = diff[jj+1] - diff[jj+5];
1272
127M
    m2[j][6] = diff[jj+2] - diff[jj+6];
1273
127M
    m2[j][7] = diff[jj+3] - diff[jj+7];
1274
1275
127M
    m1[j][0] = m2[j][0] + m2[j][2];
1276
127M
    m1[j][1] = m2[j][1] + m2[j][3];
1277
127M
    m1[j][2] = m2[j][0] - m2[j][2];
1278
127M
    m1[j][3] = m2[j][1] - m2[j][3];
1279
127M
    m1[j][4] = m2[j][4] + m2[j][6];
1280
127M
    m1[j][5] = m2[j][5] + m2[j][7];
1281
127M
    m1[j][6] = m2[j][4] - m2[j][6];
1282
127M
    m1[j][7] = m2[j][5] - m2[j][7];
1283
1284
127M
    m2[j][0] = m1[j][0] + m1[j][1];
1285
127M
    m2[j][1] = m1[j][0] - m1[j][1];
1286
127M
    m2[j][2] = m1[j][2] + m1[j][3];
1287
127M
    m2[j][3] = m1[j][2] - m1[j][3];
1288
127M
    m2[j][4] = m1[j][4] + m1[j][5];
1289
127M
    m2[j][5] = m1[j][4] - m1[j][5];
1290
127M
    m2[j][6] = m1[j][6] + m1[j][7];
1291
127M
    m2[j][7] = m1[j][6] - m1[j][7];
1292
127M
  }
1293
1294
  //vertical
1295
143M
  for (i=0; i < 8; i++)
1296
127M
  {
1297
127M
    m3[0][i] = m2[0][i] + m2[4][i];
1298
127M
    m3[1][i] = m2[1][i] + m2[5][i];
1299
127M
    m3[2][i] = m2[2][i] + m2[6][i];
1300
127M
    m3[3][i] = m2[3][i] + m2[7][i];
1301
127M
    m3[4][i] = m2[0][i] - m2[4][i];
1302
127M
    m3[5][i] = m2[1][i] - m2[5][i];
1303
127M
    m3[6][i] = m2[2][i] - m2[6][i];
1304
127M
    m3[7][i] = m2[3][i] - m2[7][i];
1305
1306
127M
    m1[0][i] = m3[0][i] + m3[2][i];
1307
127M
    m1[1][i] = m3[1][i] + m3[3][i];
1308
127M
    m1[2][i] = m3[0][i] - m3[2][i];
1309
127M
    m1[3][i] = m3[1][i] - m3[3][i];
1310
127M
    m1[4][i] = m3[4][i] + m3[6][i];
1311
127M
    m1[5][i] = m3[5][i] + m3[7][i];
1312
127M
    m1[6][i] = m3[4][i] - m3[6][i];
1313
127M
    m1[7][i] = m3[5][i] - m3[7][i];
1314
1315
127M
    m2[0][i] = m1[0][i] + m1[1][i];
1316
127M
    m2[1][i] = m1[0][i] - m1[1][i];
1317
127M
    m2[2][i] = m1[2][i] + m1[3][i];
1318
127M
    m2[3][i] = m1[2][i] - m1[3][i];
1319
127M
    m2[4][i] = m1[4][i] + m1[5][i];
1320
127M
    m2[5][i] = m1[4][i] - m1[5][i];
1321
127M
    m2[6][i] = m1[6][i] + m1[7][i];
1322
127M
    m2[7][i] = m1[6][i] - m1[7][i];
1323
127M
  }
1324
1325
143M
  for (i = 0; i < 8; i++)
1326
127M
  {
1327
1.15G
    for (j = 0; j < 8; j++)
1328
1.02G
    {
1329
1.02G
      sad += abs(m2[i][j]);
1330
1.02G
    }
1331
127M
  }
1332
  
1333
15.9M
  sad -= abs( m2[0][0] );
1334
15.9M
  sad += abs( m2[0][0] ) >> 2;
1335
15.9M
  sad=((sad+2)>>2);
1336
1337
15.9M
  return sad;
1338
15.9M
}
1339
1340
static Distortion xCalcHADs16x8( const Pel* piOrg, const Pel* piCur, int iStrideOrg, int iStrideCur )
1341
924k
{   //need to add SIMD implementation ,JCA
1342
924k
  int k, i, j, jj, sad = 0;
1343
924k
  int diff[128], m1[8][16], m2[8][16];
1344
8.31M
  for( k = 0; k < 128; k += 16 )
1345
7.39M
  {
1346
7.39M
    diff[k + 0] = piOrg[0] - piCur[0];
1347
7.39M
    diff[k + 1] = piOrg[1] - piCur[1];
1348
7.39M
    diff[k + 2] = piOrg[2] - piCur[2];
1349
7.39M
    diff[k + 3] = piOrg[3] - piCur[3];
1350
7.39M
    diff[k + 4] = piOrg[4] - piCur[4];
1351
7.39M
    diff[k + 5] = piOrg[5] - piCur[5];
1352
7.39M
    diff[k + 6] = piOrg[6] - piCur[6];
1353
7.39M
    diff[k + 7] = piOrg[7] - piCur[7];
1354
1355
7.39M
    diff[k + 8] = piOrg[8] - piCur[8];
1356
7.39M
    diff[k + 9] = piOrg[9] - piCur[9];
1357
7.39M
    diff[k + 10] = piOrg[10] - piCur[10];
1358
7.39M
    diff[k + 11] = piOrg[11] - piCur[11];
1359
7.39M
    diff[k + 12] = piOrg[12] - piCur[12];
1360
7.39M
    diff[k + 13] = piOrg[13] - piCur[13];
1361
7.39M
    diff[k + 14] = piOrg[14] - piCur[14];
1362
7.39M
    diff[k + 15] = piOrg[15] - piCur[15];
1363
1364
7.39M
    piCur += iStrideCur;
1365
7.39M
    piOrg += iStrideOrg;
1366
7.39M
  }
1367
1368
  //horizontal
1369
8.31M
  for( j = 0; j < 8; j++ )
1370
7.39M
  {
1371
7.39M
    jj = j << 4;
1372
1373
7.39M
    m2[j][0] = diff[jj    ] + diff[jj + 8];
1374
7.39M
    m2[j][1] = diff[jj + 1] + diff[jj + 9];
1375
7.39M
    m2[j][2] = diff[jj + 2] + diff[jj + 10];
1376
7.39M
    m2[j][3] = diff[jj + 3] + diff[jj + 11];
1377
7.39M
    m2[j][4] = diff[jj + 4] + diff[jj + 12];
1378
7.39M
    m2[j][5] = diff[jj + 5] + diff[jj + 13];
1379
7.39M
    m2[j][6] = diff[jj + 6] + diff[jj + 14];
1380
7.39M
    m2[j][7] = diff[jj + 7] + diff[jj + 15];
1381
7.39M
    m2[j][8] = diff[jj    ] - diff[jj + 8];
1382
7.39M
    m2[j][9] = diff[jj + 1] - diff[jj + 9];
1383
7.39M
    m2[j][10] = diff[jj + 2] - diff[jj + 10];
1384
7.39M
    m2[j][11] = diff[jj + 3] - diff[jj + 11];
1385
7.39M
    m2[j][12] = diff[jj + 4] - diff[jj + 12];
1386
7.39M
    m2[j][13] = diff[jj + 5] - diff[jj + 13];
1387
7.39M
    m2[j][14] = diff[jj + 6] - diff[jj + 14];
1388
7.39M
    m2[j][15] = diff[jj + 7] - diff[jj + 15];
1389
1390
7.39M
    m1[j][0] = m2[j][0] + m2[j][4];
1391
7.39M
    m1[j][1] = m2[j][1] + m2[j][5];
1392
7.39M
    m1[j][2] = m2[j][2] + m2[j][6];
1393
7.39M
    m1[j][3] = m2[j][3] + m2[j][7];
1394
7.39M
    m1[j][4] = m2[j][0] - m2[j][4];
1395
7.39M
    m1[j][5] = m2[j][1] - m2[j][5];
1396
7.39M
    m1[j][6] = m2[j][2] - m2[j][6];
1397
7.39M
    m1[j][7] = m2[j][3] - m2[j][7];
1398
7.39M
    m1[j][8] = m2[j][8] + m2[j][12];
1399
7.39M
    m1[j][9] = m2[j][9] + m2[j][13];
1400
7.39M
    m1[j][10] = m2[j][10] + m2[j][14];
1401
7.39M
    m1[j][11] = m2[j][11] + m2[j][15];
1402
7.39M
    m1[j][12] = m2[j][8] - m2[j][12];
1403
7.39M
    m1[j][13] = m2[j][9] - m2[j][13];
1404
7.39M
    m1[j][14] = m2[j][10] - m2[j][14];
1405
7.39M
    m1[j][15] = m2[j][11] - m2[j][15];
1406
1407
7.39M
    m2[j][0] = m1[j][0] + m1[j][2];
1408
7.39M
    m2[j][1] = m1[j][1] + m1[j][3];
1409
7.39M
    m2[j][2] = m1[j][0] - m1[j][2];
1410
7.39M
    m2[j][3] = m1[j][1] - m1[j][3];
1411
7.39M
    m2[j][4] = m1[j][4] + m1[j][6];
1412
7.39M
    m2[j][5] = m1[j][5] + m1[j][7];
1413
7.39M
    m2[j][6] = m1[j][4] - m1[j][6];
1414
7.39M
    m2[j][7] = m1[j][5] - m1[j][7];
1415
7.39M
    m2[j][8] = m1[j][8] + m1[j][10];
1416
7.39M
    m2[j][9] = m1[j][9] + m1[j][11];
1417
7.39M
    m2[j][10] = m1[j][8] - m1[j][10];
1418
7.39M
    m2[j][11] = m1[j][9] - m1[j][11];
1419
7.39M
    m2[j][12] = m1[j][12] + m1[j][14];
1420
7.39M
    m2[j][13] = m1[j][13] + m1[j][15];
1421
7.39M
    m2[j][14] = m1[j][12] - m1[j][14];
1422
7.39M
    m2[j][15] = m1[j][13] - m1[j][15];
1423
1424
7.39M
    m1[j][0] = m2[j][0] + m2[j][1];
1425
7.39M
    m1[j][1] = m2[j][0] - m2[j][1];
1426
7.39M
    m1[j][2] = m2[j][2] + m2[j][3];
1427
7.39M
    m1[j][3] = m2[j][2] - m2[j][3];
1428
7.39M
    m1[j][4] = m2[j][4] + m2[j][5];
1429
7.39M
    m1[j][5] = m2[j][4] - m2[j][5];
1430
7.39M
    m1[j][6] = m2[j][6] + m2[j][7];
1431
7.39M
    m1[j][7] = m2[j][6] - m2[j][7];
1432
7.39M
    m1[j][8] = m2[j][8] + m2[j][9];
1433
7.39M
    m1[j][9] = m2[j][8] - m2[j][9];
1434
7.39M
    m1[j][10] = m2[j][10] + m2[j][11];
1435
7.39M
    m1[j][11] = m2[j][10] - m2[j][11];
1436
7.39M
    m1[j][12] = m2[j][12] + m2[j][13];
1437
7.39M
    m1[j][13] = m2[j][12] - m2[j][13];
1438
7.39M
    m1[j][14] = m2[j][14] + m2[j][15];
1439
7.39M
    m1[j][15] = m2[j][14] - m2[j][15];
1440
7.39M
  }
1441
1442
  //vertical
1443
15.7M
  for( i = 0; i < 16; i++ )
1444
14.7M
  {
1445
14.7M
    m2[0][i] = m1[0][i] + m1[4][i];
1446
14.7M
    m2[1][i] = m1[1][i] + m1[5][i];
1447
14.7M
    m2[2][i] = m1[2][i] + m1[6][i];
1448
14.7M
    m2[3][i] = m1[3][i] + m1[7][i];
1449
14.7M
    m2[4][i] = m1[0][i] - m1[4][i];
1450
14.7M
    m2[5][i] = m1[1][i] - m1[5][i];
1451
14.7M
    m2[6][i] = m1[2][i] - m1[6][i];
1452
14.7M
    m2[7][i] = m1[3][i] - m1[7][i];
1453
1454
14.7M
    m1[0][i] = m2[0][i] + m2[2][i];
1455
14.7M
    m1[1][i] = m2[1][i] + m2[3][i];
1456
14.7M
    m1[2][i] = m2[0][i] - m2[2][i];
1457
14.7M
    m1[3][i] = m2[1][i] - m2[3][i];
1458
14.7M
    m1[4][i] = m2[4][i] + m2[6][i];
1459
14.7M
    m1[5][i] = m2[5][i] + m2[7][i];
1460
14.7M
    m1[6][i] = m2[4][i] - m2[6][i];
1461
14.7M
    m1[7][i] = m2[5][i] - m2[7][i];
1462
1463
14.7M
    m2[0][i] = m1[0][i] + m1[1][i];
1464
14.7M
    m2[1][i] = m1[0][i] - m1[1][i];
1465
14.7M
    m2[2][i] = m1[2][i] + m1[3][i];
1466
14.7M
    m2[3][i] = m1[2][i] - m1[3][i];
1467
14.7M
    m2[4][i] = m1[4][i] + m1[5][i];
1468
14.7M
    m2[5][i] = m1[4][i] - m1[5][i];
1469
14.7M
    m2[6][i] = m1[6][i] + m1[7][i];
1470
14.7M
    m2[7][i] = m1[6][i] - m1[7][i];
1471
14.7M
  }
1472
1473
8.31M
  for( i = 0; i < 8; i++ )
1474
7.39M
  {
1475
125M
    for( j = 0; j < 16; j++ )
1476
118M
    {
1477
118M
      sad += abs( m2[i][j] );
1478
118M
    }
1479
7.39M
  }
1480
  
1481
924k
  sad -= abs( m2[0][0] );
1482
924k
  sad += abs( m2[0][0] ) >> 2;
1483
924k
  sad = ( int ) ( sad / sqrt( 16.0 * 8 ) * 2 );
1484
1485
924k
  return sad;
1486
924k
}
1487
1488
static Distortion xCalcHADs8x16( const Pel* piOrg, const Pel* piCur, int iStrideOrg, int iStrideCur )
1489
926k
{
1490
926k
  int k, i, j, jj, sad = 0;
1491
926k
  int diff[128], m1[16][8], m2[16][8];
1492
15.7M
  for( k = 0; k < 128; k += 8 )
1493
14.8M
  {
1494
14.8M
    diff[k + 0] = piOrg[0] - piCur[0];
1495
14.8M
    diff[k + 1] = piOrg[1] - piCur[1];
1496
14.8M
    diff[k + 2] = piOrg[2] - piCur[2];
1497
14.8M
    diff[k + 3] = piOrg[3] - piCur[3];
1498
14.8M
    diff[k + 4] = piOrg[4] - piCur[4];
1499
14.8M
    diff[k + 5] = piOrg[5] - piCur[5];
1500
14.8M
    diff[k + 6] = piOrg[6] - piCur[6];
1501
14.8M
    diff[k + 7] = piOrg[7] - piCur[7];
1502
1503
14.8M
    piCur += iStrideCur;
1504
14.8M
    piOrg += iStrideOrg;
1505
14.8M
  }
1506
1507
  //horizontal
1508
15.7M
  for( j = 0; j < 16; j++ )
1509
14.8M
  {
1510
14.8M
    jj = j << 3;
1511
1512
14.8M
    m2[j][0] = diff[jj] + diff[jj + 4];
1513
14.8M
    m2[j][1] = diff[jj + 1] + diff[jj + 5];
1514
14.8M
    m2[j][2] = diff[jj + 2] + diff[jj + 6];
1515
14.8M
    m2[j][3] = diff[jj + 3] + diff[jj + 7];
1516
14.8M
    m2[j][4] = diff[jj] - diff[jj + 4];
1517
14.8M
    m2[j][5] = diff[jj + 1] - diff[jj + 5];
1518
14.8M
    m2[j][6] = diff[jj + 2] - diff[jj + 6];
1519
14.8M
    m2[j][7] = diff[jj + 3] - diff[jj + 7];
1520
1521
14.8M
    m1[j][0] = m2[j][0] + m2[j][2];
1522
14.8M
    m1[j][1] = m2[j][1] + m2[j][3];
1523
14.8M
    m1[j][2] = m2[j][0] - m2[j][2];
1524
14.8M
    m1[j][3] = m2[j][1] - m2[j][3];
1525
14.8M
    m1[j][4] = m2[j][4] + m2[j][6];
1526
14.8M
    m1[j][5] = m2[j][5] + m2[j][7];
1527
14.8M
    m1[j][6] = m2[j][4] - m2[j][6];
1528
14.8M
    m1[j][7] = m2[j][5] - m2[j][7];
1529
1530
14.8M
    m2[j][0] = m1[j][0] + m1[j][1];
1531
14.8M
    m2[j][1] = m1[j][0] - m1[j][1];
1532
14.8M
    m2[j][2] = m1[j][2] + m1[j][3];
1533
14.8M
    m2[j][3] = m1[j][2] - m1[j][3];
1534
14.8M
    m2[j][4] = m1[j][4] + m1[j][5];
1535
14.8M
    m2[j][5] = m1[j][4] - m1[j][5];
1536
14.8M
    m2[j][6] = m1[j][6] + m1[j][7];
1537
14.8M
    m2[j][7] = m1[j][6] - m1[j][7];
1538
14.8M
  }
1539
1540
  //vertical
1541
8.34M
  for( i = 0; i < 8; i++ )
1542
7.41M
  {
1543
7.41M
    m1[0][i] = m2[0][i] + m2[8][i];
1544
7.41M
    m1[1][i] = m2[1][i] + m2[9][i];
1545
7.41M
    m1[2][i] = m2[2][i] + m2[10][i];
1546
7.41M
    m1[3][i] = m2[3][i] + m2[11][i];
1547
7.41M
    m1[4][i] = m2[4][i] + m2[12][i];
1548
7.41M
    m1[5][i] = m2[5][i] + m2[13][i];
1549
7.41M
    m1[6][i] = m2[6][i] + m2[14][i];
1550
7.41M
    m1[7][i] = m2[7][i] + m2[15][i];
1551
7.41M
    m1[8][i] = m2[0][i] - m2[8][i];
1552
7.41M
    m1[9][i] = m2[1][i] - m2[9][i];
1553
7.41M
    m1[10][i] = m2[2][i] - m2[10][i];
1554
7.41M
    m1[11][i] = m2[3][i] - m2[11][i];
1555
7.41M
    m1[12][i] = m2[4][i] - m2[12][i];
1556
7.41M
    m1[13][i] = m2[5][i] - m2[13][i];
1557
7.41M
    m1[14][i] = m2[6][i] - m2[14][i];
1558
7.41M
    m1[15][i] = m2[7][i] - m2[15][i];
1559
1560
7.41M
    m2[0][i] = m1[0][i] + m1[4][i];
1561
7.41M
    m2[1][i] = m1[1][i] + m1[5][i];
1562
7.41M
    m2[2][i] = m1[2][i] + m1[6][i];
1563
7.41M
    m2[3][i] = m1[3][i] + m1[7][i];
1564
7.41M
    m2[4][i] = m1[0][i] - m1[4][i];
1565
7.41M
    m2[5][i] = m1[1][i] - m1[5][i];
1566
7.41M
    m2[6][i] = m1[2][i] - m1[6][i];
1567
7.41M
    m2[7][i] = m1[3][i] - m1[7][i];
1568
7.41M
    m2[8][i] = m1[8][i] + m1[12][i];
1569
7.41M
    m2[9][i] = m1[9][i] + m1[13][i];
1570
7.41M
    m2[10][i] = m1[10][i] + m1[14][i];
1571
7.41M
    m2[11][i] = m1[11][i] + m1[15][i];
1572
7.41M
    m2[12][i] = m1[8][i] - m1[12][i];
1573
7.41M
    m2[13][i] = m1[9][i] - m1[13][i];
1574
7.41M
    m2[14][i] = m1[10][i] - m1[14][i];
1575
7.41M
    m2[15][i] = m1[11][i] - m1[15][i];
1576
1577
7.41M
    m1[0][i] = m2[0][i] + m2[2][i];
1578
7.41M
    m1[1][i] = m2[1][i] + m2[3][i];
1579
7.41M
    m1[2][i] = m2[0][i] - m2[2][i];
1580
7.41M
    m1[3][i] = m2[1][i] - m2[3][i];
1581
7.41M
    m1[4][i] = m2[4][i] + m2[6][i];
1582
7.41M
    m1[5][i] = m2[5][i] + m2[7][i];
1583
7.41M
    m1[6][i] = m2[4][i] - m2[6][i];
1584
7.41M
    m1[7][i] = m2[5][i] - m2[7][i];
1585
7.41M
    m1[8][i] = m2[8][i] + m2[10][i];
1586
7.41M
    m1[9][i] = m2[9][i] + m2[11][i];
1587
7.41M
    m1[10][i] = m2[8][i] - m2[10][i];
1588
7.41M
    m1[11][i] = m2[9][i] - m2[11][i];
1589
7.41M
    m1[12][i] = m2[12][i] + m2[14][i];
1590
7.41M
    m1[13][i] = m2[13][i] + m2[15][i];
1591
7.41M
    m1[14][i] = m2[12][i] - m2[14][i];
1592
7.41M
    m1[15][i] = m2[13][i] - m2[15][i];
1593
1594
7.41M
    m2[0][i] = m1[0][i] + m1[1][i];
1595
7.41M
    m2[1][i] = m1[0][i] - m1[1][i];
1596
7.41M
    m2[2][i] = m1[2][i] + m1[3][i];
1597
7.41M
    m2[3][i] = m1[2][i] - m1[3][i];
1598
7.41M
    m2[4][i] = m1[4][i] + m1[5][i];
1599
7.41M
    m2[5][i] = m1[4][i] - m1[5][i];
1600
7.41M
    m2[6][i] = m1[6][i] + m1[7][i];
1601
7.41M
    m2[7][i] = m1[6][i] - m1[7][i];
1602
7.41M
    m2[8][i] = m1[8][i] + m1[9][i];
1603
7.41M
    m2[9][i] = m1[8][i] - m1[9][i];
1604
7.41M
    m2[10][i] = m1[10][i] + m1[11][i];
1605
7.41M
    m2[11][i] = m1[10][i] - m1[11][i];
1606
7.41M
    m2[12][i] = m1[12][i] + m1[13][i];
1607
7.41M
    m2[13][i] = m1[12][i] - m1[13][i];
1608
7.41M
    m2[14][i] = m1[14][i] + m1[15][i];
1609
7.41M
    m2[15][i] = m1[14][i] - m1[15][i];
1610
7.41M
  }
1611
1612
15.7M
  for( i = 0; i < 16; i++ )
1613
14.8M
  {
1614
133M
    for( j = 0; j < 8; j++ )
1615
118M
    {
1616
118M
      sad += abs( m2[i][j] );
1617
118M
    }
1618
14.8M
  }
1619
  
1620
926k
  sad -= abs( m2[0][0] );
1621
926k
  sad += abs( m2[0][0] ) >> 2;
1622
926k
  sad = ( int ) ( sad / sqrt( 16.0 * 8 ) * 2 );
1623
1624
926k
  return sad;
1625
926k
}
1626
1627
static Distortion xCalcHADs4x8( const Pel* piOrg, const Pel* piCur, int iStrideOrg, int iStrideCur )
1628
167k
{
1629
167k
  int k, i, j, jj, sad = 0;
1630
167k
  int diff[32], m1[8][4], m2[8][4];
1631
1.50M
  for( k = 0; k < 32; k += 4 )
1632
1.33M
  {
1633
1.33M
    diff[k + 0] = piOrg[0] - piCur[0];
1634
1.33M
    diff[k + 1] = piOrg[1] - piCur[1];
1635
1.33M
    diff[k + 2] = piOrg[2] - piCur[2];
1636
1.33M
    diff[k + 3] = piOrg[3] - piCur[3];
1637
1638
1.33M
    piCur += iStrideCur;
1639
1.33M
    piOrg += iStrideOrg;
1640
1.33M
  }
1641
1642
  //horizontal
1643
1.50M
  for( j = 0; j < 8; j++ )
1644
1.33M
  {
1645
1.33M
    jj = j << 2;
1646
1.33M
    m2[j][0] = diff[jj] + diff[jj + 2];
1647
1.33M
    m2[j][1] = diff[jj + 1] + diff[jj + 3];
1648
1.33M
    m2[j][2] = diff[jj] - diff[jj + 2];
1649
1.33M
    m2[j][3] = diff[jj + 1] - diff[jj + 3];
1650
1651
1.33M
    m1[j][0] = m2[j][0] + m2[j][1];
1652
1.33M
    m1[j][1] = m2[j][0] - m2[j][1];
1653
1.33M
    m1[j][2] = m2[j][2] + m2[j][3];
1654
1.33M
    m1[j][3] = m2[j][2] - m2[j][3];
1655
1.33M
  }
1656
1657
  //vertical
1658
836k
  for( i = 0; i < 4; i++ )
1659
669k
  {
1660
669k
    m2[0][i] = m1[0][i] + m1[4][i];
1661
669k
    m2[1][i] = m1[1][i] + m1[5][i];
1662
669k
    m2[2][i] = m1[2][i] + m1[6][i];
1663
669k
    m2[3][i] = m1[3][i] + m1[7][i];
1664
669k
    m2[4][i] = m1[0][i] - m1[4][i];
1665
669k
    m2[5][i] = m1[1][i] - m1[5][i];
1666
669k
    m2[6][i] = m1[2][i] - m1[6][i];
1667
669k
    m2[7][i] = m1[3][i] - m1[7][i];
1668
1669
669k
    m1[0][i] = m2[0][i] + m2[2][i];
1670
669k
    m1[1][i] = m2[1][i] + m2[3][i];
1671
669k
    m1[2][i] = m2[0][i] - m2[2][i];
1672
669k
    m1[3][i] = m2[1][i] - m2[3][i];
1673
669k
    m1[4][i] = m2[4][i] + m2[6][i];
1674
669k
    m1[5][i] = m2[5][i] + m2[7][i];
1675
669k
    m1[6][i] = m2[4][i] - m2[6][i];
1676
669k
    m1[7][i] = m2[5][i] - m2[7][i];
1677
1678
669k
    m2[0][i] = m1[0][i] + m1[1][i];
1679
669k
    m2[1][i] = m1[0][i] - m1[1][i];
1680
669k
    m2[2][i] = m1[2][i] + m1[3][i];
1681
669k
    m2[3][i] = m1[2][i] - m1[3][i];
1682
669k
    m2[4][i] = m1[4][i] + m1[5][i];
1683
669k
    m2[5][i] = m1[4][i] - m1[5][i];
1684
669k
    m2[6][i] = m1[6][i] + m1[7][i];
1685
669k
    m2[7][i] = m1[6][i] - m1[7][i];
1686
669k
  }
1687
1688
1.50M
  for( i = 0; i < 8; i++ )
1689
1.33M
  {
1690
6.69M
    for( j = 0; j < 4; j++ )
1691
5.35M
    {
1692
5.35M
      sad += abs( m2[i][j] );
1693
5.35M
    }
1694
1.33M
  }
1695
  
1696
167k
  sad -= abs( m2[0][0] );
1697
167k
  sad += abs( m2[0][0] ) >> 2;
1698
167k
  sad = ( int ) ( sad / sqrt( 4.0 * 8 ) * 2 );
1699
1700
167k
  return sad;
1701
167k
}
1702
1703
static Distortion xCalcHADs8x4( const Pel* piOrg, const Pel* piCur, int iStrideOrg, int iStrideCur )
1704
179k
{
1705
179k
  int k, i, j, jj, sad = 0;
1706
179k
  int diff[32], m1[4][8], m2[4][8];
1707
897k
  for( k = 0; k < 32; k += 8 )
1708
718k
  {
1709
718k
    diff[k + 0] = piOrg[0] - piCur[0];
1710
718k
    diff[k + 1] = piOrg[1] - piCur[1];
1711
718k
    diff[k + 2] = piOrg[2] - piCur[2];
1712
718k
    diff[k + 3] = piOrg[3] - piCur[3];
1713
718k
    diff[k + 4] = piOrg[4] - piCur[4];
1714
718k
    diff[k + 5] = piOrg[5] - piCur[5];
1715
718k
    diff[k + 6] = piOrg[6] - piCur[6];
1716
718k
    diff[k + 7] = piOrg[7] - piCur[7];
1717
1718
718k
    piCur += iStrideCur;
1719
718k
    piOrg += iStrideOrg;
1720
718k
  }
1721
1722
  //horizontal
1723
897k
  for( j = 0; j < 4; j++ )
1724
718k
  {
1725
718k
    jj = j << 3;
1726
1727
718k
    m2[j][0] = diff[jj] + diff[jj + 4];
1728
718k
    m2[j][1] = diff[jj + 1] + diff[jj + 5];
1729
718k
    m2[j][2] = diff[jj + 2] + diff[jj + 6];
1730
718k
    m2[j][3] = diff[jj + 3] + diff[jj + 7];
1731
718k
    m2[j][4] = diff[jj] - diff[jj + 4];
1732
718k
    m2[j][5] = diff[jj + 1] - diff[jj + 5];
1733
718k
    m2[j][6] = diff[jj + 2] - diff[jj + 6];
1734
718k
    m2[j][7] = diff[jj + 3] - diff[jj + 7];
1735
1736
718k
    m1[j][0] = m2[j][0] + m2[j][2];
1737
718k
    m1[j][1] = m2[j][1] + m2[j][3];
1738
718k
    m1[j][2] = m2[j][0] - m2[j][2];
1739
718k
    m1[j][3] = m2[j][1] - m2[j][3];
1740
718k
    m1[j][4] = m2[j][4] + m2[j][6];
1741
718k
    m1[j][5] = m2[j][5] + m2[j][7];
1742
718k
    m1[j][6] = m2[j][4] - m2[j][6];
1743
718k
    m1[j][7] = m2[j][5] - m2[j][7];
1744
1745
718k
    m2[j][0] = m1[j][0] + m1[j][1];
1746
718k
    m2[j][1] = m1[j][0] - m1[j][1];
1747
718k
    m2[j][2] = m1[j][2] + m1[j][3];
1748
718k
    m2[j][3] = m1[j][2] - m1[j][3];
1749
718k
    m2[j][4] = m1[j][4] + m1[j][5];
1750
718k
    m2[j][5] = m1[j][4] - m1[j][5];
1751
718k
    m2[j][6] = m1[j][6] + m1[j][7];
1752
718k
    m2[j][7] = m1[j][6] - m1[j][7];
1753
718k
  }
1754
1755
  //vertical
1756
1.61M
  for( i = 0; i < 8; i++ )
1757
1.43M
  {
1758
1.43M
    m1[0][i] = m2[0][i] + m2[2][i];
1759
1.43M
    m1[1][i] = m2[1][i] + m2[3][i];
1760
1.43M
    m1[2][i] = m2[0][i] - m2[2][i];
1761
1.43M
    m1[3][i] = m2[1][i] - m2[3][i];
1762
1763
1.43M
    m2[0][i] = m1[0][i] + m1[1][i];
1764
1.43M
    m2[1][i] = m1[0][i] - m1[1][i];
1765
1.43M
    m2[2][i] = m1[2][i] + m1[3][i];
1766
1.43M
    m2[3][i] = m1[2][i] - m1[3][i];
1767
1.43M
  }
1768
1769
897k
  for( i = 0; i < 4; i++ )
1770
718k
  {
1771
6.46M
    for( j = 0; j < 8; j++ )
1772
5.74M
    {
1773
5.74M
      sad += abs( m2[i][j] );
1774
5.74M
    }
1775
718k
  }
1776
  
1777
179k
  sad -= abs( m2[0][0] );
1778
179k
  sad += abs( m2[0][0] ) >> 2;
1779
179k
  sad = ( int ) ( sad / sqrt( 4.0 * 8 ) * 2 );
1780
1781
179k
  return sad;
1782
179k
}
1783
1784
Distortion RdCost::xGetHAD2SADs( const DistParam &rcDtParam )
1785
950k
{
1786
950k
  if( rcDtParam.applyWeight )
1787
0
  {
1788
0
    THROW(" no support");
1789
0
  }
1790
1791
950k
  Distortion distHad = xGetHADs<false>( rcDtParam );
1792
950k
  Distortion distSad = 0;
1793
950k
  {
1794
950k
    CHECKD( (rcDtParam.org.width != rcDtParam.org.stride) || (rcDtParam.cur.stride != rcDtParam.org.stride) , "this functions assumes compact, aligned buffering");
1795
1796
950k
    const Pel* piOrg  = rcDtParam.org.buf;
1797
950k
    const Pel* piCur  = rcDtParam.cur.buf;
1798
950k
    int  iRows        = rcDtParam.org.height>>2;
1799
950k
    int  iCols        = rcDtParam.org.width<<2;
1800
1801
950k
    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
950k
    distSad = (uiSum >> DISTORTION_PRECISION_ADJUSTMENT(rcDtParam.bitDepth));
1829
950k
  }
1830
1831
0
  return std::min( distHad, 2*distSad);
1832
950k
}
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
341k
  {
1854
840k
    for( y = 0; y < iRows; y += 8 )
1855
499k
    {
1856
1.42M
      for( x = 0; x < iCols; x += 16 )
1857
924k
      {
1858
924k
        uiSum += xCalcHADs16x8( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1859
924k
      }
1860
499k
      piOrg += iStrideOrg * 8;
1861
499k
      piCur += iStrideCur * 8;
1862
499k
    }
1863
341k
  }
1864
1.23M
  else if( iCols < iRows && ( iCols & 7 ) == 0 && ( iRows & 15 ) == 0 )
1865
336k
  {
1866
942k
    for( y = 0; y < iRows; y += 16 )
1867
605k
    {
1868
1.53M
      for( x = 0; x < iCols; x += 8 )
1869
926k
      {
1870
926k
        uiSum += xCalcHADs8x16( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1871
926k
      }
1872
605k
      piOrg += iStrideOrg * 16;
1873
605k
      piCur += iStrideCur * 16;
1874
605k
    }
1875
336k
  }
1876
897k
  else if( iCols > iRows && ( iRows & 3 ) == 0 && ( iCols & 7 ) == 0 )
1877
96.9k
  {
1878
193k
    for( y = 0; y < iRows; y += 4 )
1879
96.9k
    {
1880
276k
      for( x = 0; x < iCols; x += 8 )
1881
179k
      {
1882
179k
        uiSum += xCalcHADs8x4( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1883
179k
      }
1884
96.9k
      piOrg += iStrideOrg * 4;
1885
96.9k
      piCur += iStrideCur * 4;
1886
96.9k
    }
1887
96.9k
  }
1888
800k
  else if( iCols < iRows && ( iCols & 3 ) == 0 && ( iRows & 7 ) == 0 )
1889
88.9k
  {
1890
256k
    for( y = 0; y < iRows; y += 8 )
1891
167k
    {
1892
334k
      for( x = 0; x < iCols; x += 4 )
1893
167k
      {
1894
167k
        uiSum += xCalcHADs4x8( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1895
167k
      }
1896
167k
      piOrg += iStrideOrg * 8;
1897
167k
      piCur += iStrideCur * 8;
1898
167k
    }
1899
88.9k
  }
1900
711k
  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
711k
  else if( ( iRows % 8 == 0 ) && ( iCols % 8 == 0 ) )
1913
634k
  {
1914
3.35M
    for( y = 0; y < iRows; y += 8 )
1915
2.71M
    {
1916
18.7M
      for( x = 0; x < iCols; x += 8 )
1917
15.9M
      {
1918
15.9M
        uiSum += xCalcHADs8x8( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1919
15.9M
      }
1920
2.71M
      piOrg += 8*iStrideOrg;
1921
2.71M
      piCur += 8*iStrideCur;
1922
2.71M
    }
1923
634k
  }
1924
77.4k
  else if( ( iRows % 4 == 0 ) && ( iCols % 4 == 0 ) )
1925
46.5k
  {
1926
93.1k
    for( y = 0; y < iRows; y += 4 )
1927
46.5k
    {
1928
93.1k
      for( x = 0; x < iCols; x += 4 )
1929
46.5k
      {
1930
46.5k
        uiSum += xCalcHADs4x4( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1931
46.5k
      }
1932
46.5k
      piOrg += 4*iStrideOrg;
1933
46.5k
      piCur += 4*iStrideCur;
1934
46.5k
    }
1935
46.5k
  }
1936
30.8k
  else if( ( iRows % 2 == 0 ) && ( iCols % 2 == 0 ) )
1937
30.8k
  {
1938
61.6k
    for( y = 0; y < iRows; y += 2 )
1939
30.8k
    {
1940
203k
      for( x = 0; x < iCols; x += 2 )
1941
172k
      {
1942
172k
        uiSum += xCalcHADs2x2( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1943
172k
      }
1944
30.8k
      piOrg += 2*iStrideOrg;
1945
30.8k
      piCur += 2*iStrideCur;
1946
30.8k
    }
1947
30.8k
  }
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
341k
  {
1854
840k
    for( y = 0; y < iRows; y += 8 )
1855
499k
    {
1856
1.42M
      for( x = 0; x < iCols; x += 16 )
1857
924k
      {
1858
924k
        uiSum += xCalcHADs16x8( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1859
924k
      }
1860
499k
      piOrg += iStrideOrg * 8;
1861
499k
      piCur += iStrideCur * 8;
1862
499k
    }
1863
341k
  }
1864
1.23M
  else if( iCols < iRows && ( iCols & 7 ) == 0 && ( iRows & 15 ) == 0 )
1865
336k
  {
1866
942k
    for( y = 0; y < iRows; y += 16 )
1867
605k
    {
1868
1.53M
      for( x = 0; x < iCols; x += 8 )
1869
926k
      {
1870
926k
        uiSum += xCalcHADs8x16( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1871
926k
      }
1872
605k
      piOrg += iStrideOrg * 16;
1873
605k
      piCur += iStrideCur * 16;
1874
605k
    }
1875
336k
  }
1876
897k
  else if( iCols > iRows && ( iRows & 3 ) == 0 && ( iCols & 7 ) == 0 )
1877
96.9k
  {
1878
193k
    for( y = 0; y < iRows; y += 4 )
1879
96.9k
    {
1880
276k
      for( x = 0; x < iCols; x += 8 )
1881
179k
      {
1882
179k
        uiSum += xCalcHADs8x4( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1883
179k
      }
1884
96.9k
      piOrg += iStrideOrg * 4;
1885
96.9k
      piCur += iStrideCur * 4;
1886
96.9k
    }
1887
96.9k
  }
1888
800k
  else if( iCols < iRows && ( iCols & 3 ) == 0 && ( iRows & 7 ) == 0 )
1889
88.9k
  {
1890
256k
    for( y = 0; y < iRows; y += 8 )
1891
167k
    {
1892
334k
      for( x = 0; x < iCols; x += 4 )
1893
167k
      {
1894
167k
        uiSum += xCalcHADs4x8( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1895
167k
      }
1896
167k
      piOrg += iStrideOrg * 8;
1897
167k
      piCur += iStrideCur * 8;
1898
167k
    }
1899
88.9k
  }
1900
711k
  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
711k
  else if( ( iRows % 8 == 0 ) && ( iCols % 8 == 0 ) )
1913
634k
  {
1914
3.35M
    for( y = 0; y < iRows; y += 8 )
1915
2.71M
    {
1916
18.7M
      for( x = 0; x < iCols; x += 8 )
1917
15.9M
      {
1918
15.9M
        uiSum += xCalcHADs8x8( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1919
15.9M
      }
1920
2.71M
      piOrg += 8*iStrideOrg;
1921
2.71M
      piCur += 8*iStrideCur;
1922
2.71M
    }
1923
634k
  }
1924
77.4k
  else if( ( iRows % 4 == 0 ) && ( iCols % 4 == 0 ) )
1925
46.5k
  {
1926
93.1k
    for( y = 0; y < iRows; y += 4 )
1927
46.5k
    {
1928
93.1k
      for( x = 0; x < iCols; x += 4 )
1929
46.5k
      {
1930
46.5k
        uiSum += xCalcHADs4x4( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1931
46.5k
      }
1932
46.5k
      piOrg += 4*iStrideOrg;
1933
46.5k
      piCur += 4*iStrideCur;
1934
46.5k
    }
1935
46.5k
  }
1936
30.8k
  else if( ( iRows % 2 == 0 ) && ( iCols % 2 == 0 ) )
1937
30.8k
  {
1938
61.6k
    for( y = 0; y < iRows; y += 2 )
1939
30.8k
    {
1940
203k
      for( x = 0; x < iCols; x += 2 )
1941
172k
      {
1942
172k
        uiSum += xCalcHADs2x2( &piOrg[x], &piCur[x], iStrideOrg, iStrideCur );
1943
172k
      }
1944
30.8k
      piOrg += 2*iStrideOrg;
1945
30.8k
      piCur += 2*iStrideCur;
1946
30.8k
    }
1947
30.8k
  }
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.5k
{
1959
12.5k
  m_dLambda_unadjusted = m_dLambda;
1960
12.5k
  m_DistScaleUnadjusted = m_DistScale;
1961
12.5k
}
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.23M
{
2171
1.23M
  return Distortion(m_dCostIBC * getBitsMultiplePredsIBC(x, y, useIMV));
2172
1.23M
}
2173
2174
static inline unsigned getIComponentBitsIBC( int val )
2175
3.36M
{
2176
3.36M
  if( !val ) return 1;
2177
2178
18.4E
  const unsigned int l2 = floorLog2( (val <= 0) ? (-val << 1) + 1 : (val << 1) );
2179
2180
1.69M
  return (l2 << 1) + 1;
2181
3.36M
}
2182
2183
unsigned int RdCost::getBitsMultiplePredsIBC(int x, int y, bool useIMV)
2184
1.23M
{
2185
1.23M
  int rmvH[2];
2186
1.23M
  int rmvV[2];
2187
1.23M
  rmvH[0] = x - m_bvPredictors[0].hor;
2188
1.23M
  rmvH[1] = x - m_bvPredictors[1].hor;
2189
2190
1.23M
  rmvV[0] = y - m_bvPredictors[0].ver;
2191
1.23M
  rmvV[1] = y - m_bvPredictors[1].ver;
2192
1.23M
  int absCand[2];
2193
1.23M
  absCand[0] = abs(rmvH[0]) + abs(rmvV[0]);
2194
1.23M
  absCand[1] = abs(rmvH[1]) + abs(rmvV[1]);
2195
2196
1.23M
  if (useIMV && x % 4 == 0 && y % 4 == 0)
2197
450k
  {
2198
450k
    int rmvHQP[2];
2199
450k
    int rmvVQP[2];
2200
2201
450k
    int imvShift = 2;
2202
450k
    int offset = 1 << (imvShift - 1);
2203
2204
450k
    rmvHQP[0] = (x >> 2) - ((m_bvPredictors[0].hor + offset) >> 2);
2205
450k
    rmvHQP[1] = (x >> 2) - ((m_bvPredictors[1].hor + offset) >> 2);
2206
450k
    rmvVQP[0] = (y >> 2) - ((m_bvPredictors[0].ver + offset) >> 2);
2207
450k
    rmvVQP[1] = (y >> 2) - ((m_bvPredictors[1].ver + offset) >> 2);
2208
2209
450k
    int absCandQP[2];
2210
450k
    absCandQP[0] = abs(rmvHQP[0]) + abs(rmvVQP[0]);
2211
450k
    absCandQP[1] = abs(rmvHQP[1]) + abs(rmvVQP[1]);
2212
450k
    unsigned int candBits0QP, candBits1QP;
2213
450k
    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
450k
    else
2228
450k
    {
2229
450k
      unsigned int candBits1 = getIComponentBitsIBC(rmvH[1]) + getIComponentBitsIBC(rmvV[1]);
2230
450k
      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
450k
      else
2236
450k
      {
2237
450k
        candBits1QP = getIComponentBitsIBC(rmvHQP[1]) + getIComponentBitsIBC(rmvVQP[1]);
2238
18.4E
        return candBits1QP < candBits1 ? candBits1QP : candBits1;
2239
450k
      }
2240
450k
    }
2241
450k
  }
2242
780k
  else
2243
780k
  {
2244
780k
    if (absCand[0] < absCand[1])
2245
0
    {
2246
0
      return getIComponentBitsIBC(rmvH[0]) + getIComponentBitsIBC(rmvV[0]);
2247
0
    }
2248
780k
    else
2249
780k
    {
2250
780k
      return getIComponentBitsIBC(rmvH[1]) + getIComponentBitsIBC(rmvV[1]);
2251
780k
    }
2252
780k
  }
2253
1.23M
}
2254
2255
} // namespace vvenc
2256
2257
//! \}
2258