source: 3DVCSoftware/branches/HTM-16.0-MV-draft-5/source/Lib/TLibCommon/TComRdCost.cpp @ 1417

Last change on this file since 1417 was 1390, checked in by tech, 9 years ago

Removed 3D.

  • Property svn:eol-style set to native
File size: 52.4 KB
Line 
1/* The copyright in this software is being made available under the BSD
2 * License, included below. This software may be subject to other third party
3 * and contributor rights, including patent rights, and no such rights are
4 * granted under this license.
5 *
6 * Copyright (c) 2010-2015, ITU/ISO/IEC
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions are met:
11 *
12 *  * Redistributions of source code must retain the above copyright notice,
13 *    this list of conditions and the following disclaimer.
14 *  * Redistributions in binary form must reproduce the above copyright notice,
15 *    this list of conditions and the following disclaimer in the documentation
16 *    and/or other materials provided with the distribution.
17 *  * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
18 *    be used to endorse or promote products derived from this software without
19 *    specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
31 * THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34/** \file     TComRdCost.cpp
35    \brief    RD cost computation class
36*/
37
38#include <math.h>
39#include <assert.h>
40#include <limits>
41#include "TComRom.h"
42#include "TComRdCost.h"
43
44//! \ingroup TLibCommon
45//! \{
46
47TComRdCost::TComRdCost()
48{
49  init();
50}
51
52TComRdCost::~TComRdCost()
53{
54}
55
56// Calculate RD functions
57Double TComRdCost::calcRdCost( Double numBits, Double distortion, DFunc eDFunc )
58{
59 
60  Double lambda = 1.0;
61
62  switch ( eDFunc )
63  {
64    case DF_SSE:
65      assert(0);
66      break;
67    case DF_SAD:
68      lambda = m_dLambdaMotionSAD[0]; // 0 is valid, because for lossless blocks, the cost equation is modified to compensate.
69      break;
70    case DF_DEFAULT:
71      lambda = m_dLambda;
72      break;
73    case DF_SSE_FRAME:
74      lambda = m_dFrameLambda;
75      break;
76    default:
77      assert (0);
78      break;
79  }
80
81#if NH_MV
82  // D_PRINT_INDENT( g_traceRDCost,  "Dist: " + n2s(distortion) + " Bits: " + n2s(numBits) + " RD Cost: " + n2s(dRdCost));
83   D_PRINT_INDENT( g_traceRDCost,  "Dist: " + n2s(distortion) + " Bits: " + n2s(numBits) ); 
84#endif
85
86  if (eDFunc == DF_SAD)
87  {
88    if (m_costMode != COST_STANDARD_LOSSY)
89    {
90      return ((distortion * 65536.0) / lambda) + numBits; // all lossless costs would have uiDistortion=0, and therefore this cost function can be used.
91    }
92    else
93    {
94      return distortion + (((numBits * lambda) ) / 65536.0);
95    }
96  }
97  else
98  {
99    if (m_costMode != COST_STANDARD_LOSSY)
100    {
101      return (distortion / lambda) + numBits; // all lossless costs would have uiDistortion=0, and therefore this cost function can be used.
102    }
103    else
104    {
105      return distortion + (numBits * lambda);
106    }
107  }
108}
109
110Void TComRdCost::setLambda( Double dLambda, const BitDepths &bitDepths )
111{
112  m_dLambda           = dLambda;
113  m_sqrtLambda        = sqrt(m_dLambda);
114  m_dLambdaMotionSAD[0] = 65536.0 * m_sqrtLambda;
115  m_dLambdaMotionSSE[0] = 65536.0 * m_dLambda;
116#if FULL_NBIT
117  dLambda = 0.57 * pow(2.0, ((LOSSLESS_AND_MIXED_LOSSLESS_RD_COST_TEST_QP_PRIME - 12) / 3.0));
118#else
119  dLambda = 0.57 * pow(2.0, ((LOSSLESS_AND_MIXED_LOSSLESS_RD_COST_TEST_QP_PRIME - 12 - 6 * (bitDepths.recon[CHANNEL_TYPE_LUMA] - 8)) / 3.0));
120#endif
121  m_dLambdaMotionSAD[1] = 65536.0 * sqrt(dLambda);
122  m_dLambdaMotionSSE[1] = 65536.0 * dLambda;
123}
124
125
126// Initalize Function Pointer by [eDFunc]
127Void TComRdCost::init()
128{
129  m_afpDistortFunc[DF_DEFAULT] = NULL;                  // for DF_DEFAULT
130
131  m_afpDistortFunc[DF_SSE    ] = TComRdCost::xGetSSE;
132  m_afpDistortFunc[DF_SSE4   ] = TComRdCost::xGetSSE4;
133  m_afpDistortFunc[DF_SSE8   ] = TComRdCost::xGetSSE8;
134  m_afpDistortFunc[DF_SSE16  ] = TComRdCost::xGetSSE16;
135  m_afpDistortFunc[DF_SSE32  ] = TComRdCost::xGetSSE32;
136  m_afpDistortFunc[DF_SSE64  ] = TComRdCost::xGetSSE64;
137  m_afpDistortFunc[DF_SSE16N ] = TComRdCost::xGetSSE16N;
138
139  m_afpDistortFunc[DF_SAD    ] = TComRdCost::xGetSAD;
140  m_afpDistortFunc[DF_SAD4   ] = TComRdCost::xGetSAD4;
141  m_afpDistortFunc[DF_SAD8   ] = TComRdCost::xGetSAD8;
142  m_afpDistortFunc[DF_SAD16  ] = TComRdCost::xGetSAD16;
143  m_afpDistortFunc[DF_SAD32  ] = TComRdCost::xGetSAD32;
144  m_afpDistortFunc[DF_SAD64  ] = TComRdCost::xGetSAD64;
145  m_afpDistortFunc[DF_SAD16N ] = TComRdCost::xGetSAD16N;
146
147  m_afpDistortFunc[DF_SADS   ] = TComRdCost::xGetSAD;
148  m_afpDistortFunc[DF_SADS4  ] = TComRdCost::xGetSAD4;
149  m_afpDistortFunc[DF_SADS8  ] = TComRdCost::xGetSAD8;
150  m_afpDistortFunc[DF_SADS16 ] = TComRdCost::xGetSAD16;
151  m_afpDistortFunc[DF_SADS32 ] = TComRdCost::xGetSAD32;
152  m_afpDistortFunc[DF_SADS64 ] = TComRdCost::xGetSAD64;
153  m_afpDistortFunc[DF_SADS16N] = TComRdCost::xGetSAD16N;
154
155  m_afpDistortFunc[DF_SAD12  ] = TComRdCost::xGetSAD12;
156  m_afpDistortFunc[DF_SAD24  ] = TComRdCost::xGetSAD24;
157  m_afpDistortFunc[DF_SAD48  ] = TComRdCost::xGetSAD48;
158
159  m_afpDistortFunc[DF_SADS12 ] = TComRdCost::xGetSAD12;
160  m_afpDistortFunc[DF_SADS24 ] = TComRdCost::xGetSAD24;
161  m_afpDistortFunc[DF_SADS48 ] = TComRdCost::xGetSAD48;
162
163  m_afpDistortFunc[DF_HADS   ] = TComRdCost::xGetHADs;
164  m_afpDistortFunc[DF_HADS4  ] = TComRdCost::xGetHADs;
165  m_afpDistortFunc[DF_HADS8  ] = TComRdCost::xGetHADs;
166  m_afpDistortFunc[DF_HADS16 ] = TComRdCost::xGetHADs;
167  m_afpDistortFunc[DF_HADS32 ] = TComRdCost::xGetHADs;
168  m_afpDistortFunc[DF_HADS64 ] = TComRdCost::xGetHADs;
169  m_afpDistortFunc[DF_HADS16N] = TComRdCost::xGetHADs;
170
171
172  m_costMode                   = COST_STANDARD_LOSSY;
173
174  m_motionLambda               = 0;
175  m_iCostScale                 = 0;
176
177
178}
179
180// Static member function
181UInt TComRdCost::xGetExpGolombNumberOfBits( Int iVal )
182{
183  assert(iVal != std::numeric_limits<Int>::min());
184  UInt uiLength = 1;
185  UInt uiTemp   = ( iVal <= 0) ? (UInt(-iVal)<<1)+1: UInt(iVal<<1);
186
187  while ( 1 != uiTemp )
188  {
189    uiTemp >>= 1;
190    uiLength += 2;
191  }
192
193  return uiLength;
194}
195
196Void TComRdCost::setDistParam( UInt uiBlkWidth, UInt uiBlkHeight, DFunc eDFunc, DistParam& rcDistParam )
197{
198  // set Block Width / Height
199  rcDistParam.iCols    = uiBlkWidth;
200  rcDistParam.iRows    = uiBlkHeight;
201  rcDistParam.DistFunc = m_afpDistortFunc[eDFunc + g_aucConvertToBit[ rcDistParam.iCols ] + 1 ];
202
203  // initialize
204  rcDistParam.iSubShift  = 0;
205  rcDistParam.m_maximumDistortionForEarlyExit = std::numeric_limits<Distortion>::max();
206}
207
208// Setting the Distortion Parameter for Inter (ME)
209Void TComRdCost::setDistParam( const TComPattern* const pcPatternKey, const Pel* piRefY, Int iRefStride, DistParam& rcDistParam )
210{
211  // set Original & Curr Pointer / Stride
212  rcDistParam.pOrg = pcPatternKey->getROIY();
213  rcDistParam.pCur = piRefY;
214
215  rcDistParam.iStrideOrg = pcPatternKey->getPatternLStride();
216  rcDistParam.iStrideCur = iRefStride;
217
218  // set Block Width / Height
219  rcDistParam.iCols    = pcPatternKey->getROIYWidth();
220  rcDistParam.iRows    = pcPatternKey->getROIYHeight();
221  rcDistParam.DistFunc = m_afpDistortFunc[DF_SAD + g_aucConvertToBit[ rcDistParam.iCols ] + 1 ];
222  rcDistParam.m_maximumDistortionForEarlyExit = std::numeric_limits<Distortion>::max();
223
224  if (rcDistParam.iCols == 12)
225  {
226    rcDistParam.DistFunc = m_afpDistortFunc[DF_SAD12];
227  }
228  else if (rcDistParam.iCols == 24)
229  {
230    rcDistParam.DistFunc = m_afpDistortFunc[DF_SAD24];
231  }
232  else if (rcDistParam.iCols == 48)
233  {
234    rcDistParam.DistFunc = m_afpDistortFunc[DF_SAD48];
235  }
236
237  // initialize
238  rcDistParam.iSubShift  = 0;
239}
240
241// Setting the Distortion Parameter for Inter (subpel ME with step)
242Void TComRdCost::setDistParam( const TComPattern* const pcPatternKey, const Pel* piRefY, Int iRefStride, Int iStep, DistParam& rcDistParam, Bool bHADME )
243{
244  // set Original & Curr Pointer / Stride
245  rcDistParam.pOrg = pcPatternKey->getROIY();
246  rcDistParam.pCur = piRefY;
247
248  rcDistParam.iStrideOrg = pcPatternKey->getPatternLStride();
249  rcDistParam.iStrideCur = iRefStride * iStep;
250
251  // set Step for interpolated buffer
252  rcDistParam.iStep = iStep;
253
254  // set Block Width / Height
255  rcDistParam.iCols    = pcPatternKey->getROIYWidth();
256  rcDistParam.iRows    = pcPatternKey->getROIYHeight();
257
258  rcDistParam.m_maximumDistortionForEarlyExit = std::numeric_limits<Distortion>::max();
259
260  // set distortion function
261  if ( !bHADME )
262  {
263    rcDistParam.DistFunc = m_afpDistortFunc[DF_SADS + g_aucConvertToBit[ rcDistParam.iCols ] + 1 ];
264    if (rcDistParam.iCols == 12)
265    {
266      rcDistParam.DistFunc = m_afpDistortFunc[DF_SADS12];
267    }
268    else if (rcDistParam.iCols == 24)
269    {
270      rcDistParam.DistFunc = m_afpDistortFunc[DF_SADS24];
271    }
272    else if (rcDistParam.iCols == 48)
273    {
274      rcDistParam.DistFunc = m_afpDistortFunc[DF_SADS48];
275    }
276  }
277  else
278  {
279    rcDistParam.DistFunc = m_afpDistortFunc[DF_HADS + g_aucConvertToBit[ rcDistParam.iCols ] + 1 ];
280  }
281
282  // initialize
283  rcDistParam.iSubShift  = 0;
284}
285
286Void TComRdCost::setDistParam( DistParam& rcDP, Int bitDepth, const Pel* p1, Int iStride1, const Pel* p2, Int iStride2, Int iWidth, Int iHeight, Bool bHadamard )
287{
288  rcDP.pOrg       = p1;
289  rcDP.pCur       = p2;
290  rcDP.iStrideOrg = iStride1;
291  rcDP.iStrideCur = iStride2;
292  rcDP.iCols      = iWidth;
293  rcDP.iRows      = iHeight;
294  rcDP.iStep      = 1;
295  rcDP.iSubShift  = 0;
296  rcDP.bitDepth   = bitDepth;
297  rcDP.DistFunc   = m_afpDistortFunc[ ( bHadamard ? DF_HADS : DF_SADS ) + g_aucConvertToBit[ iWidth ] + 1 ];
298  rcDP.m_maximumDistortionForEarlyExit = std::numeric_limits<Distortion>::max();
299}
300
301Distortion TComRdCost::calcHAD( Int bitDepth, const Pel* pi0, Int iStride0, const Pel* pi1, Int iStride1, Int iWidth, Int iHeight )
302{
303  Distortion uiSum = 0;
304  Int x, y;
305
306  if ( ( (iWidth % 8) == 0 ) && ( (iHeight % 8) == 0 ) )
307  {
308    for ( y=0; y<iHeight; y+= 8 )
309    {
310      for ( x=0; x<iWidth; x+= 8 )
311      {
312        uiSum += xCalcHADs8x8( &pi0[x], &pi1[x], iStride0, iStride1, 1 );
313      }
314      pi0 += iStride0*8;
315      pi1 += iStride1*8;
316    }
317  }
318  else
319  {
320    assert ( ( (iWidth % 4) == 0 ) && ( (iHeight % 4) == 0 ) );
321
322    for ( y=0; y<iHeight; y+= 4 )
323    {
324      for ( x=0; x<iWidth; x+= 4 )
325      {
326        uiSum += xCalcHADs4x4( &pi0[x], &pi1[x], iStride0, iStride1, 1 );
327      }
328      pi0 += iStride0*4;
329      pi1 += iStride1*4;
330    }
331  }
332
333  return ( uiSum >> DISTORTION_PRECISION_ADJUSTMENT(bitDepth-8) );
334}
335
336
337
338Distortion TComRdCost::getDistPart( Int bitDepth, const Pel* piCur, Int iCurStride,  const Pel* piOrg, Int iOrgStride, UInt uiBlkWidth, UInt uiBlkHeight, const ComponentID compID, DFunc eDFunc )
339{
340  DistParam cDtParam;
341  setDistParam( uiBlkWidth, uiBlkHeight, eDFunc, cDtParam );
342  cDtParam.pOrg       = piOrg;
343  cDtParam.pCur       = piCur;
344  cDtParam.iStrideOrg = iOrgStride;
345  cDtParam.iStrideCur = iCurStride;
346  cDtParam.iStep      = 1;
347
348  cDtParam.bApplyWeight = false;
349  cDtParam.compIdx      = MAX_NUM_COMPONENT; // just for assert: to be sure it was set before use
350  cDtParam.bitDepth     = bitDepth;
351
352
353  if (isChroma(compID))
354  {
355    return ((Distortion) (m_distortionWeight[compID] * cDtParam.DistFunc( &cDtParam )));
356  }
357  else
358  {
359    return cDtParam.DistFunc( &cDtParam );
360  }
361}
362
363
364// ====================================================================================================================
365// Distortion functions
366// ====================================================================================================================
367
368// --------------------------------------------------------------------------------------------------------------------
369// SAD
370// --------------------------------------------------------------------------------------------------------------------
371
372Distortion TComRdCost::xGetSAD( DistParam* pcDtParam )
373{
374  if ( pcDtParam->bApplyWeight )
375  {
376    return TComRdCostWeightPrediction::xGetSADw( pcDtParam );
377  }
378
379  const Pel* piOrg   = pcDtParam->pOrg;
380  const Pel* piCur   = pcDtParam->pCur;
381  const Int  iCols           = pcDtParam->iCols;
382  const Int  iStrideCur      = pcDtParam->iStrideCur;
383  const Int  iStrideOrg      = pcDtParam->iStrideOrg;
384  const UInt distortionShift = DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth - 8);
385
386  Distortion uiSum = 0;
387
388  for(Int iRows = pcDtParam->iRows ; iRows != 0; iRows-- )
389  {
390    for (Int n = 0; n < iCols; n++ )
391    {
392      uiSum += abs( piOrg[n] - piCur[n] );
393    }
394    if (pcDtParam->m_maximumDistortionForEarlyExit < ( uiSum >> distortionShift ))
395    {
396      return ( uiSum >> distortionShift );
397    }
398    piOrg += iStrideOrg;
399    piCur += iStrideCur;
400  }
401
402  return ( uiSum >> distortionShift );
403}
404
405Distortion TComRdCost::xGetSAD4( DistParam* pcDtParam )
406{
407  if ( pcDtParam->bApplyWeight )
408  {
409    return TComRdCostWeightPrediction::xGetSADw( pcDtParam );
410  }
411
412
413  const Pel* piOrg   = pcDtParam->pOrg;
414  const Pel* piCur   = pcDtParam->pCur;
415  Int  iRows   = pcDtParam->iRows;
416  Int  iSubShift  = pcDtParam->iSubShift;
417  Int  iSubStep   = ( 1 << iSubShift );
418  Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
419  Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
420
421  Distortion uiSum = 0;
422
423  for( ; iRows != 0; iRows-=iSubStep )
424  {
425    uiSum += abs( piOrg[0] - piCur[0] );
426    uiSum += abs( piOrg[1] - piCur[1] );
427    uiSum += abs( piOrg[2] - piCur[2] );
428    uiSum += abs( piOrg[3] - piCur[3] );
429
430    piOrg += iStrideOrg;
431    piCur += iStrideCur;
432  }
433
434  uiSum <<= iSubShift;
435  return ( uiSum >> DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8) );
436}
437
438Distortion TComRdCost::xGetSAD8( DistParam* pcDtParam )
439{
440  if ( pcDtParam->bApplyWeight )
441  {
442    return TComRdCostWeightPrediction::xGetSADw( pcDtParam );
443  }
444
445
446  const Pel* piOrg      = pcDtParam->pOrg;
447  const Pel* piCur      = pcDtParam->pCur;
448  Int  iRows      = pcDtParam->iRows;
449  Int  iSubShift  = pcDtParam->iSubShift;
450  Int  iSubStep   = ( 1 << iSubShift );
451  Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
452  Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
453
454  Distortion uiSum = 0;
455
456  for( ; iRows != 0; iRows-=iSubStep )
457  {
458    uiSum += abs( piOrg[0] - piCur[0] );
459    uiSum += abs( piOrg[1] - piCur[1] );
460    uiSum += abs( piOrg[2] - piCur[2] );
461    uiSum += abs( piOrg[3] - piCur[3] );
462    uiSum += abs( piOrg[4] - piCur[4] );
463    uiSum += abs( piOrg[5] - piCur[5] );
464    uiSum += abs( piOrg[6] - piCur[6] );
465    uiSum += abs( piOrg[7] - piCur[7] );
466
467    piOrg += iStrideOrg;
468    piCur += iStrideCur;
469  }
470
471  uiSum <<= iSubShift;
472  return ( uiSum >> DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8) );
473}
474
475Distortion TComRdCost::xGetSAD16( DistParam* pcDtParam )
476{
477  if ( pcDtParam->bApplyWeight )
478  {
479    return TComRdCostWeightPrediction::xGetSADw( pcDtParam );
480  }
481
482
483  const Pel* piOrg   = pcDtParam->pOrg;
484  const Pel* piCur   = pcDtParam->pCur;
485  Int  iRows   = pcDtParam->iRows;
486  Int  iSubShift  = pcDtParam->iSubShift;
487  Int  iSubStep   = ( 1 << iSubShift );
488  Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
489  Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
490
491  Distortion uiSum = 0;
492
493  for( ; iRows != 0; iRows-=iSubStep )
494  {
495    uiSum += abs( piOrg[0] - piCur[0] );
496    uiSum += abs( piOrg[1] - piCur[1] );
497    uiSum += abs( piOrg[2] - piCur[2] );
498    uiSum += abs( piOrg[3] - piCur[3] );
499    uiSum += abs( piOrg[4] - piCur[4] );
500    uiSum += abs( piOrg[5] - piCur[5] );
501    uiSum += abs( piOrg[6] - piCur[6] );
502    uiSum += abs( piOrg[7] - piCur[7] );
503    uiSum += abs( piOrg[8] - piCur[8] );
504    uiSum += abs( piOrg[9] - piCur[9] );
505    uiSum += abs( piOrg[10] - piCur[10] );
506    uiSum += abs( piOrg[11] - piCur[11] );
507    uiSum += abs( piOrg[12] - piCur[12] );
508    uiSum += abs( piOrg[13] - piCur[13] );
509    uiSum += abs( piOrg[14] - piCur[14] );
510    uiSum += abs( piOrg[15] - piCur[15] );
511
512    piOrg += iStrideOrg;
513    piCur += iStrideCur;
514  }
515
516  uiSum <<= iSubShift;
517  return ( uiSum >> DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8) );
518}
519
520Distortion TComRdCost::xGetSAD12( DistParam* pcDtParam )
521{
522  if ( pcDtParam->bApplyWeight )
523  {
524    return TComRdCostWeightPrediction::xGetSADw( pcDtParam );
525  }
526
527  const Pel* piOrg   = pcDtParam->pOrg;
528  const Pel* piCur   = pcDtParam->pCur;
529  Int  iRows   = pcDtParam->iRows;
530  Int  iSubShift  = pcDtParam->iSubShift;
531  Int  iSubStep   = ( 1 << iSubShift );
532  Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
533  Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
534
535  Distortion uiSum = 0;
536
537  for( ; iRows != 0; iRows-=iSubStep )
538  {
539    uiSum += abs( piOrg[0] - piCur[0] );
540    uiSum += abs( piOrg[1] - piCur[1] );
541    uiSum += abs( piOrg[2] - piCur[2] );
542    uiSum += abs( piOrg[3] - piCur[3] );
543    uiSum += abs( piOrg[4] - piCur[4] );
544    uiSum += abs( piOrg[5] - piCur[5] );
545    uiSum += abs( piOrg[6] - piCur[6] );
546    uiSum += abs( piOrg[7] - piCur[7] );
547    uiSum += abs( piOrg[8] - piCur[8] );
548    uiSum += abs( piOrg[9] - piCur[9] );
549    uiSum += abs( piOrg[10] - piCur[10] );
550    uiSum += abs( piOrg[11] - piCur[11] );
551
552    piOrg += iStrideOrg;
553    piCur += iStrideCur;
554  }
555
556  uiSum <<= iSubShift;
557  return ( uiSum >> DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8) );
558}
559
560Distortion TComRdCost::xGetSAD16N( DistParam* pcDtParam )
561{
562
563  const Pel* piOrg   = pcDtParam->pOrg;
564  const Pel* piCur   = pcDtParam->pCur;
565  Int  iRows   = pcDtParam->iRows;
566  Int  iCols   = pcDtParam->iCols;
567  Int  iSubShift  = pcDtParam->iSubShift;
568  Int  iSubStep   = ( 1 << iSubShift );
569  Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
570  Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
571
572  Distortion uiSum = 0;
573
574  for( ; iRows != 0; iRows-=iSubStep )
575  {
576    for (Int n = 0; n < iCols; n+=16 )
577    {
578      uiSum += abs( piOrg[n+ 0] - piCur[n+ 0] );
579      uiSum += abs( piOrg[n+ 1] - piCur[n+ 1] );
580      uiSum += abs( piOrg[n+ 2] - piCur[n+ 2] );
581      uiSum += abs( piOrg[n+ 3] - piCur[n+ 3] );
582      uiSum += abs( piOrg[n+ 4] - piCur[n+ 4] );
583      uiSum += abs( piOrg[n+ 5] - piCur[n+ 5] );
584      uiSum += abs( piOrg[n+ 6] - piCur[n+ 6] );
585      uiSum += abs( piOrg[n+ 7] - piCur[n+ 7] );
586      uiSum += abs( piOrg[n+ 8] - piCur[n+ 8] );
587      uiSum += abs( piOrg[n+ 9] - piCur[n+ 9] );
588      uiSum += abs( piOrg[n+10] - piCur[n+10] );
589      uiSum += abs( piOrg[n+11] - piCur[n+11] );
590      uiSum += abs( piOrg[n+12] - piCur[n+12] );
591      uiSum += abs( piOrg[n+13] - piCur[n+13] );
592      uiSum += abs( piOrg[n+14] - piCur[n+14] );
593      uiSum += abs( piOrg[n+15] - piCur[n+15] );
594    }
595    piOrg += iStrideOrg;
596    piCur += iStrideCur;
597  }
598
599  uiSum <<= iSubShift;
600  return ( uiSum >> DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8) );
601}
602
603Distortion TComRdCost::xGetSAD32( DistParam* pcDtParam )
604{
605  if ( pcDtParam->bApplyWeight )
606  {
607    return TComRdCostWeightPrediction::xGetSADw( pcDtParam );
608  }
609
610
611  const Pel* piOrg   = pcDtParam->pOrg;
612  const Pel* piCur   = pcDtParam->pCur;
613  Int  iRows   = pcDtParam->iRows;
614  Int  iSubShift  = pcDtParam->iSubShift;
615  Int  iSubStep   = ( 1 << iSubShift );
616  Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
617  Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
618
619  Distortion uiSum = 0;
620
621  for( ; iRows != 0; iRows-=iSubStep )
622  {
623    uiSum += abs( piOrg[0] - piCur[0] );
624    uiSum += abs( piOrg[1] - piCur[1] );
625    uiSum += abs( piOrg[2] - piCur[2] );
626    uiSum += abs( piOrg[3] - piCur[3] );
627    uiSum += abs( piOrg[4] - piCur[4] );
628    uiSum += abs( piOrg[5] - piCur[5] );
629    uiSum += abs( piOrg[6] - piCur[6] );
630    uiSum += abs( piOrg[7] - piCur[7] );
631    uiSum += abs( piOrg[8] - piCur[8] );
632    uiSum += abs( piOrg[9] - piCur[9] );
633    uiSum += abs( piOrg[10] - piCur[10] );
634    uiSum += abs( piOrg[11] - piCur[11] );
635    uiSum += abs( piOrg[12] - piCur[12] );
636    uiSum += abs( piOrg[13] - piCur[13] );
637    uiSum += abs( piOrg[14] - piCur[14] );
638    uiSum += abs( piOrg[15] - piCur[15] );
639    uiSum += abs( piOrg[16] - piCur[16] );
640    uiSum += abs( piOrg[17] - piCur[17] );
641    uiSum += abs( piOrg[18] - piCur[18] );
642    uiSum += abs( piOrg[19] - piCur[19] );
643    uiSum += abs( piOrg[20] - piCur[20] );
644    uiSum += abs( piOrg[21] - piCur[21] );
645    uiSum += abs( piOrg[22] - piCur[22] );
646    uiSum += abs( piOrg[23] - piCur[23] );
647    uiSum += abs( piOrg[24] - piCur[24] );
648    uiSum += abs( piOrg[25] - piCur[25] );
649    uiSum += abs( piOrg[26] - piCur[26] );
650    uiSum += abs( piOrg[27] - piCur[27] );
651    uiSum += abs( piOrg[28] - piCur[28] );
652    uiSum += abs( piOrg[29] - piCur[29] );
653    uiSum += abs( piOrg[30] - piCur[30] );
654    uiSum += abs( piOrg[31] - piCur[31] );
655
656    piOrg += iStrideOrg;
657    piCur += iStrideCur;
658  }
659
660  uiSum <<= iSubShift;
661  return ( uiSum >> DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8) );
662}
663
664Distortion TComRdCost::xGetSAD24( DistParam* pcDtParam )
665{
666  if ( pcDtParam->bApplyWeight )
667  {
668    return TComRdCostWeightPrediction::xGetSADw( pcDtParam );
669  }
670
671
672  const Pel* piOrg   = pcDtParam->pOrg;
673  const Pel* piCur   = pcDtParam->pCur;
674  Int  iRows   = pcDtParam->iRows;
675  Int  iSubShift  = pcDtParam->iSubShift;
676  Int  iSubStep   = ( 1 << iSubShift );
677  Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
678  Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
679
680  Distortion uiSum = 0;
681
682  for( ; iRows != 0; iRows-=iSubStep )
683  {
684    uiSum += abs( piOrg[0] - piCur[0] );
685    uiSum += abs( piOrg[1] - piCur[1] );
686    uiSum += abs( piOrg[2] - piCur[2] );
687    uiSum += abs( piOrg[3] - piCur[3] );
688    uiSum += abs( piOrg[4] - piCur[4] );
689    uiSum += abs( piOrg[5] - piCur[5] );
690    uiSum += abs( piOrg[6] - piCur[6] );
691    uiSum += abs( piOrg[7] - piCur[7] );
692    uiSum += abs( piOrg[8] - piCur[8] );
693    uiSum += abs( piOrg[9] - piCur[9] );
694    uiSum += abs( piOrg[10] - piCur[10] );
695    uiSum += abs( piOrg[11] - piCur[11] );
696    uiSum += abs( piOrg[12] - piCur[12] );
697    uiSum += abs( piOrg[13] - piCur[13] );
698    uiSum += abs( piOrg[14] - piCur[14] );
699    uiSum += abs( piOrg[15] - piCur[15] );
700    uiSum += abs( piOrg[16] - piCur[16] );
701    uiSum += abs( piOrg[17] - piCur[17] );
702    uiSum += abs( piOrg[18] - piCur[18] );
703    uiSum += abs( piOrg[19] - piCur[19] );
704    uiSum += abs( piOrg[20] - piCur[20] );
705    uiSum += abs( piOrg[21] - piCur[21] );
706    uiSum += abs( piOrg[22] - piCur[22] );
707    uiSum += abs( piOrg[23] - piCur[23] );
708
709    piOrg += iStrideOrg;
710    piCur += iStrideCur;
711  }
712
713  uiSum <<= iSubShift;
714  return ( uiSum >> DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8) );
715}
716
717Distortion TComRdCost::xGetSAD64( DistParam* pcDtParam )
718{
719  if ( pcDtParam->bApplyWeight )
720  {
721    return TComRdCostWeightPrediction::xGetSADw( pcDtParam );
722  }
723
724
725  const Pel* piOrg   = pcDtParam->pOrg;
726  const Pel* piCur   = pcDtParam->pCur;
727  Int  iRows   = pcDtParam->iRows;
728  Int  iSubShift  = pcDtParam->iSubShift;
729  Int  iSubStep   = ( 1 << iSubShift );
730  Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
731  Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
732
733  Distortion uiSum = 0;
734
735  for( ; iRows != 0; iRows-=iSubStep )
736  {
737    uiSum += abs( piOrg[0] - piCur[0] );
738    uiSum += abs( piOrg[1] - piCur[1] );
739    uiSum += abs( piOrg[2] - piCur[2] );
740    uiSum += abs( piOrg[3] - piCur[3] );
741    uiSum += abs( piOrg[4] - piCur[4] );
742    uiSum += abs( piOrg[5] - piCur[5] );
743    uiSum += abs( piOrg[6] - piCur[6] );
744    uiSum += abs( piOrg[7] - piCur[7] );
745    uiSum += abs( piOrg[8] - piCur[8] );
746    uiSum += abs( piOrg[9] - piCur[9] );
747    uiSum += abs( piOrg[10] - piCur[10] );
748    uiSum += abs( piOrg[11] - piCur[11] );
749    uiSum += abs( piOrg[12] - piCur[12] );
750    uiSum += abs( piOrg[13] - piCur[13] );
751    uiSum += abs( piOrg[14] - piCur[14] );
752    uiSum += abs( piOrg[15] - piCur[15] );
753    uiSum += abs( piOrg[16] - piCur[16] );
754    uiSum += abs( piOrg[17] - piCur[17] );
755    uiSum += abs( piOrg[18] - piCur[18] );
756    uiSum += abs( piOrg[19] - piCur[19] );
757    uiSum += abs( piOrg[20] - piCur[20] );
758    uiSum += abs( piOrg[21] - piCur[21] );
759    uiSum += abs( piOrg[22] - piCur[22] );
760    uiSum += abs( piOrg[23] - piCur[23] );
761    uiSum += abs( piOrg[24] - piCur[24] );
762    uiSum += abs( piOrg[25] - piCur[25] );
763    uiSum += abs( piOrg[26] - piCur[26] );
764    uiSum += abs( piOrg[27] - piCur[27] );
765    uiSum += abs( piOrg[28] - piCur[28] );
766    uiSum += abs( piOrg[29] - piCur[29] );
767    uiSum += abs( piOrg[30] - piCur[30] );
768    uiSum += abs( piOrg[31] - piCur[31] );
769    uiSum += abs( piOrg[32] - piCur[32] );
770    uiSum += abs( piOrg[33] - piCur[33] );
771    uiSum += abs( piOrg[34] - piCur[34] );
772    uiSum += abs( piOrg[35] - piCur[35] );
773    uiSum += abs( piOrg[36] - piCur[36] );
774    uiSum += abs( piOrg[37] - piCur[37] );
775    uiSum += abs( piOrg[38] - piCur[38] );
776    uiSum += abs( piOrg[39] - piCur[39] );
777    uiSum += abs( piOrg[40] - piCur[40] );
778    uiSum += abs( piOrg[41] - piCur[41] );
779    uiSum += abs( piOrg[42] - piCur[42] );
780    uiSum += abs( piOrg[43] - piCur[43] );
781    uiSum += abs( piOrg[44] - piCur[44] );
782    uiSum += abs( piOrg[45] - piCur[45] );
783    uiSum += abs( piOrg[46] - piCur[46] );
784    uiSum += abs( piOrg[47] - piCur[47] );
785    uiSum += abs( piOrg[48] - piCur[48] );
786    uiSum += abs( piOrg[49] - piCur[49] );
787    uiSum += abs( piOrg[50] - piCur[50] );
788    uiSum += abs( piOrg[51] - piCur[51] );
789    uiSum += abs( piOrg[52] - piCur[52] );
790    uiSum += abs( piOrg[53] - piCur[53] );
791    uiSum += abs( piOrg[54] - piCur[54] );
792    uiSum += abs( piOrg[55] - piCur[55] );
793    uiSum += abs( piOrg[56] - piCur[56] );
794    uiSum += abs( piOrg[57] - piCur[57] );
795    uiSum += abs( piOrg[58] - piCur[58] );
796    uiSum += abs( piOrg[59] - piCur[59] );
797    uiSum += abs( piOrg[60] - piCur[60] );
798    uiSum += abs( piOrg[61] - piCur[61] );
799    uiSum += abs( piOrg[62] - piCur[62] );
800    uiSum += abs( piOrg[63] - piCur[63] );
801
802    piOrg += iStrideOrg;
803    piCur += iStrideCur;
804  }
805
806  uiSum <<= iSubShift;
807  return ( uiSum >> DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8) );
808}
809
810Distortion TComRdCost::xGetSAD48( DistParam* pcDtParam )
811{
812  if ( pcDtParam->bApplyWeight )
813  {
814    return TComRdCostWeightPrediction::xGetSADw( pcDtParam );
815  }
816
817  const Pel* piOrg   = pcDtParam->pOrg;
818  const Pel* piCur   = pcDtParam->pCur;
819  Int  iRows   = pcDtParam->iRows;
820  Int  iSubShift  = pcDtParam->iSubShift;
821  Int  iSubStep   = ( 1 << iSubShift );
822  Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
823  Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
824
825  Distortion uiSum = 0;
826
827  for( ; iRows != 0; iRows-=iSubStep )
828  {
829    uiSum += abs( piOrg[0] - piCur[0] );
830    uiSum += abs( piOrg[1] - piCur[1] );
831    uiSum += abs( piOrg[2] - piCur[2] );
832    uiSum += abs( piOrg[3] - piCur[3] );
833    uiSum += abs( piOrg[4] - piCur[4] );
834    uiSum += abs( piOrg[5] - piCur[5] );
835    uiSum += abs( piOrg[6] - piCur[6] );
836    uiSum += abs( piOrg[7] - piCur[7] );
837    uiSum += abs( piOrg[8] - piCur[8] );
838    uiSum += abs( piOrg[9] - piCur[9] );
839    uiSum += abs( piOrg[10] - piCur[10] );
840    uiSum += abs( piOrg[11] - piCur[11] );
841    uiSum += abs( piOrg[12] - piCur[12] );
842    uiSum += abs( piOrg[13] - piCur[13] );
843    uiSum += abs( piOrg[14] - piCur[14] );
844    uiSum += abs( piOrg[15] - piCur[15] );
845    uiSum += abs( piOrg[16] - piCur[16] );
846    uiSum += abs( piOrg[17] - piCur[17] );
847    uiSum += abs( piOrg[18] - piCur[18] );
848    uiSum += abs( piOrg[19] - piCur[19] );
849    uiSum += abs( piOrg[20] - piCur[20] );
850    uiSum += abs( piOrg[21] - piCur[21] );
851    uiSum += abs( piOrg[22] - piCur[22] );
852    uiSum += abs( piOrg[23] - piCur[23] );
853    uiSum += abs( piOrg[24] - piCur[24] );
854    uiSum += abs( piOrg[25] - piCur[25] );
855    uiSum += abs( piOrg[26] - piCur[26] );
856    uiSum += abs( piOrg[27] - piCur[27] );
857    uiSum += abs( piOrg[28] - piCur[28] );
858    uiSum += abs( piOrg[29] - piCur[29] );
859    uiSum += abs( piOrg[30] - piCur[30] );
860    uiSum += abs( piOrg[31] - piCur[31] );
861    uiSum += abs( piOrg[32] - piCur[32] );
862    uiSum += abs( piOrg[33] - piCur[33] );
863    uiSum += abs( piOrg[34] - piCur[34] );
864    uiSum += abs( piOrg[35] - piCur[35] );
865    uiSum += abs( piOrg[36] - piCur[36] );
866    uiSum += abs( piOrg[37] - piCur[37] );
867    uiSum += abs( piOrg[38] - piCur[38] );
868    uiSum += abs( piOrg[39] - piCur[39] );
869    uiSum += abs( piOrg[40] - piCur[40] );
870    uiSum += abs( piOrg[41] - piCur[41] );
871    uiSum += abs( piOrg[42] - piCur[42] );
872    uiSum += abs( piOrg[43] - piCur[43] );
873    uiSum += abs( piOrg[44] - piCur[44] );
874    uiSum += abs( piOrg[45] - piCur[45] );
875    uiSum += abs( piOrg[46] - piCur[46] );
876    uiSum += abs( piOrg[47] - piCur[47] );
877
878    piOrg += iStrideOrg;
879    piCur += iStrideCur;
880  }
881
882  uiSum <<= iSubShift;
883  return ( uiSum >> DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8) );
884}
885
886
887// --------------------------------------------------------------------------------------------------------------------
888// SSE
889// --------------------------------------------------------------------------------------------------------------------
890
891Distortion TComRdCost::xGetSSE( DistParam* pcDtParam )
892{
893  if ( pcDtParam->bApplyWeight )
894  {
895    return TComRdCostWeightPrediction::xGetSSEw( pcDtParam );
896  }
897  const Pel* piOrg   = pcDtParam->pOrg;
898  const Pel* piCur   = pcDtParam->pCur;
899  Int  iRows   = pcDtParam->iRows;
900  Int  iCols   = pcDtParam->iCols;
901  Int  iStrideOrg = pcDtParam->iStrideOrg;
902  Int  iStrideCur = pcDtParam->iStrideCur;
903
904  Distortion uiSum   = 0;
905  UInt       uiShift = DISTORTION_PRECISION_ADJUSTMENT((pcDtParam->bitDepth-8) << 1);
906
907  Intermediate_Int iTemp;
908
909  for( ; iRows != 0; iRows-- )
910  {
911    for (Int n = 0; n < iCols; n++ )
912    {
913      iTemp = piOrg[] - piCur[];
914      uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
915    }
916    piOrg += iStrideOrg;
917    piCur += iStrideCur;
918  }
919
920  return ( uiSum );
921}
922
923Distortion TComRdCost::xGetSSE4( DistParam* pcDtParam )
924{
925  if ( pcDtParam->bApplyWeight )
926  {
927    assert( pcDtParam->iCols == 4 );
928    return TComRdCostWeightPrediction::xGetSSEw( pcDtParam );
929  }
930  const Pel* piOrg   = pcDtParam->pOrg;
931  const Pel* piCur   = pcDtParam->pCur;
932  Int  iRows   = pcDtParam->iRows;
933  Int  iStrideOrg = pcDtParam->iStrideOrg;
934  Int  iStrideCur = pcDtParam->iStrideCur;
935
936  Distortion uiSum   = 0;
937  UInt       uiShift = DISTORTION_PRECISION_ADJUSTMENT((pcDtParam->bitDepth-8) << 1);
938
939  Intermediate_Int  iTemp;
940
941  for( ; iRows != 0; iRows-- )
942  {
943
944    iTemp = piOrg[0] - piCur[0]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
945    iTemp = piOrg[1] - piCur[1]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
946    iTemp = piOrg[2] - piCur[2]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
947    iTemp = piOrg[3] - piCur[3]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
948
949    piOrg += iStrideOrg;
950    piCur += iStrideCur;
951  }
952
953  return ( uiSum );
954}
955
956Distortion TComRdCost::xGetSSE8( DistParam* pcDtParam )
957{
958  if ( pcDtParam->bApplyWeight )
959  {
960    assert( pcDtParam->iCols == 8 );
961    return TComRdCostWeightPrediction::xGetSSEw( pcDtParam );
962  }
963  const Pel* piOrg   = pcDtParam->pOrg;
964  const Pel* piCur   = pcDtParam->pCur;
965  Int  iRows   = pcDtParam->iRows;
966  Int  iStrideOrg = pcDtParam->iStrideOrg;
967  Int  iStrideCur = pcDtParam->iStrideCur;
968
969  Distortion uiSum   = 0;
970  UInt       uiShift = DISTORTION_PRECISION_ADJUSTMENT((pcDtParam->bitDepth-8) << 1);
971
972  Intermediate_Int  iTemp;
973
974  for( ; iRows != 0; iRows-- )
975  {
976    iTemp = piOrg[0] - piCur[0]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
977    iTemp = piOrg[1] - piCur[1]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
978    iTemp = piOrg[2] - piCur[2]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
979    iTemp = piOrg[3] - piCur[3]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
980    iTemp = piOrg[4] - piCur[4]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
981    iTemp = piOrg[5] - piCur[5]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
982    iTemp = piOrg[6] - piCur[6]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
983    iTemp = piOrg[7] - piCur[7]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
984
985    piOrg += iStrideOrg;
986    piCur += iStrideCur;
987  }
988
989  return ( uiSum );
990}
991
992Distortion TComRdCost::xGetSSE16( DistParam* pcDtParam )
993{
994  if ( pcDtParam->bApplyWeight )
995  {
996    assert( pcDtParam->iCols == 16 );
997    return TComRdCostWeightPrediction::xGetSSEw( pcDtParam );
998  }
999  const Pel* piOrg   = pcDtParam->pOrg;
1000  const Pel* piCur   = pcDtParam->pCur;
1001  Int  iRows   = pcDtParam->iRows;
1002  Int  iStrideOrg = pcDtParam->iStrideOrg;
1003  Int  iStrideCur = pcDtParam->iStrideCur;
1004
1005  Distortion uiSum   = 0;
1006  UInt       uiShift = DISTORTION_PRECISION_ADJUSTMENT((pcDtParam->bitDepth-8) << 1);
1007
1008  Intermediate_Int  iTemp;
1009
1010  for( ; iRows != 0; iRows-- )
1011  {
1012
1013    iTemp = piOrg[ 0] - piCur[ 0]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1014    iTemp = piOrg[ 1] - piCur[ 1]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1015    iTemp = piOrg[ 2] - piCur[ 2]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1016    iTemp = piOrg[ 3] - piCur[ 3]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1017    iTemp = piOrg[ 4] - piCur[ 4]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1018    iTemp = piOrg[ 5] - piCur[ 5]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1019    iTemp = piOrg[ 6] - piCur[ 6]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1020    iTemp = piOrg[ 7] - piCur[ 7]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1021    iTemp = piOrg[ 8] - piCur[ 8]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1022    iTemp = piOrg[ 9] - piCur[ 9]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1023    iTemp = piOrg[10] - piCur[10]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1024    iTemp = piOrg[11] - piCur[11]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1025    iTemp = piOrg[12] - piCur[12]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1026    iTemp = piOrg[13] - piCur[13]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1027    iTemp = piOrg[14] - piCur[14]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1028    iTemp = piOrg[15] - piCur[15]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1029
1030    piOrg += iStrideOrg;
1031    piCur += iStrideCur;
1032  }
1033
1034  return ( uiSum );
1035}
1036
1037Distortion TComRdCost::xGetSSE16N( DistParam* pcDtParam )
1038{
1039  if ( pcDtParam->bApplyWeight )
1040  {
1041    return TComRdCostWeightPrediction::xGetSSEw( pcDtParam );
1042  }
1043  const Pel* piOrg   = pcDtParam->pOrg;
1044  const Pel* piCur   = pcDtParam->pCur;
1045  Int  iRows   = pcDtParam->iRows;
1046  Int  iCols   = pcDtParam->iCols;
1047  Int  iStrideOrg = pcDtParam->iStrideOrg;
1048  Int  iStrideCur = pcDtParam->iStrideCur;
1049
1050  Distortion uiSum   = 0;
1051  UInt       uiShift = DISTORTION_PRECISION_ADJUSTMENT((pcDtParam->bitDepth-8) << 1);
1052
1053  Intermediate_Int  iTemp;
1054
1055  for( ; iRows != 0; iRows-- )
1056  {
1057    for (Int n = 0; n < iCols; n+=16 )
1058    {
1059
1060      iTemp = piOrg[n+ 0] - piCur[n+ 0]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1061      iTemp = piOrg[n+ 1] - piCur[n+ 1]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1062      iTemp = piOrg[n+ 2] - piCur[n+ 2]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1063      iTemp = piOrg[n+ 3] - piCur[n+ 3]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1064      iTemp = piOrg[n+ 4] - piCur[n+ 4]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1065      iTemp = piOrg[n+ 5] - piCur[n+ 5]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1066      iTemp = piOrg[n+ 6] - piCur[n+ 6]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1067      iTemp = piOrg[n+ 7] - piCur[n+ 7]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1068      iTemp = piOrg[n+ 8] - piCur[n+ 8]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1069      iTemp = piOrg[n+ 9] - piCur[n+ 9]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1070      iTemp = piOrg[n+10] - piCur[n+10]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1071      iTemp = piOrg[n+11] - piCur[n+11]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1072      iTemp = piOrg[n+12] - piCur[n+12]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1073      iTemp = piOrg[n+13] - piCur[n+13]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1074      iTemp = piOrg[n+14] - piCur[n+14]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1075      iTemp = piOrg[n+15] - piCur[n+15]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1076
1077    }
1078    piOrg += iStrideOrg;
1079    piCur += iStrideCur;
1080  }
1081
1082  return ( uiSum );
1083}
1084
1085Distortion TComRdCost::xGetSSE32( DistParam* pcDtParam )
1086{
1087  if ( pcDtParam->bApplyWeight )
1088  {
1089    assert( pcDtParam->iCols == 32 );
1090    return TComRdCostWeightPrediction::xGetSSEw( pcDtParam );
1091  }
1092  const Pel* piOrg   = pcDtParam->pOrg;
1093  const Pel* piCur   = pcDtParam->pCur;
1094  Int  iRows   = pcDtParam->iRows;
1095  Int  iStrideOrg = pcDtParam->iStrideOrg;
1096  Int  iStrideCur = pcDtParam->iStrideCur;
1097
1098  Distortion uiSum   = 0;
1099  UInt       uiShift = DISTORTION_PRECISION_ADJUSTMENT((pcDtParam->bitDepth-8) << 1);
1100
1101  Intermediate_Int  iTemp;
1102
1103  for( ; iRows != 0; iRows-- )
1104  {
1105
1106    iTemp = piOrg[ 0] - piCur[ 0]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1107    iTemp = piOrg[ 1] - piCur[ 1]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1108    iTemp = piOrg[ 2] - piCur[ 2]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1109    iTemp = piOrg[ 3] - piCur[ 3]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1110    iTemp = piOrg[ 4] - piCur[ 4]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1111    iTemp = piOrg[ 5] - piCur[ 5]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1112    iTemp = piOrg[ 6] - piCur[ 6]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1113    iTemp = piOrg[ 7] - piCur[ 7]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1114    iTemp = piOrg[ 8] - piCur[ 8]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1115    iTemp = piOrg[ 9] - piCur[ 9]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1116    iTemp = piOrg[10] - piCur[10]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1117    iTemp = piOrg[11] - piCur[11]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1118    iTemp = piOrg[12] - piCur[12]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1119    iTemp = piOrg[13] - piCur[13]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1120    iTemp = piOrg[14] - piCur[14]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1121    iTemp = piOrg[15] - piCur[15]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1122    iTemp = piOrg[16] - piCur[16]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1123    iTemp = piOrg[17] - piCur[17]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1124    iTemp = piOrg[18] - piCur[18]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1125    iTemp = piOrg[19] - piCur[19]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1126    iTemp = piOrg[20] - piCur[20]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1127    iTemp = piOrg[21] - piCur[21]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1128    iTemp = piOrg[22] - piCur[22]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1129    iTemp = piOrg[23] - piCur[23]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1130    iTemp = piOrg[24] - piCur[24]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1131    iTemp = piOrg[25] - piCur[25]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1132    iTemp = piOrg[26] - piCur[26]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1133    iTemp = piOrg[27] - piCur[27]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1134    iTemp = piOrg[28] - piCur[28]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1135    iTemp = piOrg[29] - piCur[29]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1136    iTemp = piOrg[30] - piCur[30]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1137    iTemp = piOrg[31] - piCur[31]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1138
1139    piOrg += iStrideOrg;
1140    piCur += iStrideCur;
1141  }
1142
1143  return ( uiSum );
1144}
1145
1146Distortion TComRdCost::xGetSSE64( DistParam* pcDtParam )
1147{
1148  if ( pcDtParam->bApplyWeight )
1149  {
1150    assert( pcDtParam->iCols == 64 );
1151    return TComRdCostWeightPrediction::xGetSSEw( pcDtParam );
1152  }
1153  const Pel* piOrg   = pcDtParam->pOrg;
1154  const Pel* piCur   = pcDtParam->pCur;
1155  Int  iRows   = pcDtParam->iRows;
1156  Int  iStrideOrg = pcDtParam->iStrideOrg;
1157  Int  iStrideCur = pcDtParam->iStrideCur;
1158
1159  Distortion uiSum   = 0;
1160  UInt       uiShift = DISTORTION_PRECISION_ADJUSTMENT((pcDtParam->bitDepth-8) << 1);
1161
1162  Intermediate_Int  iTemp;
1163
1164  for( ; iRows != 0; iRows-- )
1165  {
1166    iTemp = piOrg[ 0] - piCur[ 0]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1167    iTemp = piOrg[ 1] - piCur[ 1]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1168    iTemp = piOrg[ 2] - piCur[ 2]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1169    iTemp = piOrg[ 3] - piCur[ 3]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1170    iTemp = piOrg[ 4] - piCur[ 4]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1171    iTemp = piOrg[ 5] - piCur[ 5]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1172    iTemp = piOrg[ 6] - piCur[ 6]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1173    iTemp = piOrg[ 7] - piCur[ 7]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1174    iTemp = piOrg[ 8] - piCur[ 8]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1175    iTemp = piOrg[ 9] - piCur[ 9]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1176    iTemp = piOrg[10] - piCur[10]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1177    iTemp = piOrg[11] - piCur[11]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1178    iTemp = piOrg[12] - piCur[12]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1179    iTemp = piOrg[13] - piCur[13]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1180    iTemp = piOrg[14] - piCur[14]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1181    iTemp = piOrg[15] - piCur[15]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1182    iTemp = piOrg[16] - piCur[16]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1183    iTemp = piOrg[17] - piCur[17]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1184    iTemp = piOrg[18] - piCur[18]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1185    iTemp = piOrg[19] - piCur[19]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1186    iTemp = piOrg[20] - piCur[20]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1187    iTemp = piOrg[21] - piCur[21]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1188    iTemp = piOrg[22] - piCur[22]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1189    iTemp = piOrg[23] - piCur[23]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1190    iTemp = piOrg[24] - piCur[24]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1191    iTemp = piOrg[25] - piCur[25]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1192    iTemp = piOrg[26] - piCur[26]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1193    iTemp = piOrg[27] - piCur[27]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1194    iTemp = piOrg[28] - piCur[28]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1195    iTemp = piOrg[29] - piCur[29]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1196    iTemp = piOrg[30] - piCur[30]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1197    iTemp = piOrg[31] - piCur[31]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1198    iTemp = piOrg[32] - piCur[32]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1199    iTemp = piOrg[33] - piCur[33]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1200    iTemp = piOrg[34] - piCur[34]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1201    iTemp = piOrg[35] - piCur[35]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1202    iTemp = piOrg[36] - piCur[36]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1203    iTemp = piOrg[37] - piCur[37]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1204    iTemp = piOrg[38] - piCur[38]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1205    iTemp = piOrg[39] - piCur[39]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1206    iTemp = piOrg[40] - piCur[40]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1207    iTemp = piOrg[41] - piCur[41]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1208    iTemp = piOrg[42] - piCur[42]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1209    iTemp = piOrg[43] - piCur[43]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1210    iTemp = piOrg[44] - piCur[44]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1211    iTemp = piOrg[45] - piCur[45]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1212    iTemp = piOrg[46] - piCur[46]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1213    iTemp = piOrg[47] - piCur[47]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1214    iTemp = piOrg[48] - piCur[48]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1215    iTemp = piOrg[49] - piCur[49]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1216    iTemp = piOrg[50] - piCur[50]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1217    iTemp = piOrg[51] - piCur[51]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1218    iTemp = piOrg[52] - piCur[52]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1219    iTemp = piOrg[53] - piCur[53]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1220    iTemp = piOrg[54] - piCur[54]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1221    iTemp = piOrg[55] - piCur[55]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1222    iTemp = piOrg[56] - piCur[56]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1223    iTemp = piOrg[57] - piCur[57]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1224    iTemp = piOrg[58] - piCur[58]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1225    iTemp = piOrg[59] - piCur[59]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1226    iTemp = piOrg[60] - piCur[60]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1227    iTemp = piOrg[61] - piCur[61]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1228    iTemp = piOrg[62] - piCur[62]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1229    iTemp = piOrg[63] - piCur[63]; uiSum += Distortion(( iTemp * iTemp ) >> uiShift);
1230
1231    piOrg += iStrideOrg;
1232    piCur += iStrideCur;
1233  }
1234
1235  return ( uiSum );
1236}
1237
1238
1239// --------------------------------------------------------------------------------------------------------------------
1240// HADAMARD with step (used in fractional search)
1241// --------------------------------------------------------------------------------------------------------------------
1242
1243Distortion TComRdCost::xCalcHADs2x2( const Pel *piOrg, const Pel *piCur, Int iStrideOrg, Int iStrideCur, Int iStep )
1244{
1245  Distortion satd = 0;
1246  TCoeff diff[4], m[4];
1247  assert( iStep == 1 );
1248  diff[0] = piOrg[0             ] - piCur[0];
1249  diff[1] = piOrg[1             ] - piCur[1];
1250  diff[2] = piOrg[iStrideOrg    ] - piCur[0 + iStrideCur];
1251  diff[3] = piOrg[iStrideOrg + 1] - piCur[1 + iStrideCur];
1252  m[0] = diff[0] + diff[2];
1253  m[1] = diff[1] + diff[3];
1254  m[2] = diff[0] - diff[2];
1255  m[3] = diff[1] - diff[3];
1256
1257  satd += abs(m[0] + m[1]);
1258  satd += abs(m[0] - m[1]);
1259  satd += abs(m[2] + m[3]);
1260  satd += abs(m[2] - m[3]);
1261
1262  return satd;
1263}
1264
1265Distortion TComRdCost::xCalcHADs4x4( const Pel *piOrg, const Pel *piCur, Int iStrideOrg, Int iStrideCur, Int iStep )
1266{
1267  Int k;
1268  Distortion satd = 0;
1269  TCoeff diff[16], m[16], d[16];
1270
1271  assert( iStep == 1 );
1272  for( k = 0; k < 16; k+=4 )
1273  {
1274    diff[k+0] = piOrg[0] - piCur[0];
1275    diff[k+1] = piOrg[1] - piCur[1];
1276    diff[k+2] = piOrg[2] - piCur[2];
1277    diff[k+3] = piOrg[3] - piCur[3];
1278
1279    piCur += iStrideCur;
1280    piOrg += iStrideOrg;
1281  }
1282
1283  /*===== hadamard transform =====*/
1284  m[ 0] = diff[ 0] + diff[12];
1285  m[ 1] = diff[ 1] + diff[13];
1286  m[ 2] = diff[ 2] + diff[14];
1287  m[ 3] = diff[ 3] + diff[15];
1288  m[ 4] = diff[ 4] + diff[ 8];
1289  m[ 5] = diff[ 5] + diff[ 9];
1290  m[ 6] = diff[ 6] + diff[10];
1291  m[ 7] = diff[ 7] + diff[11];
1292  m[ 8] = diff[ 4] - diff[ 8];
1293  m[ 9] = diff[ 5] - diff[ 9];
1294  m[10] = diff[ 6] - diff[10];
1295  m[11] = diff[ 7] - diff[11];
1296  m[12] = diff[ 0] - diff[12];
1297  m[13] = diff[ 1] - diff[13];
1298  m[14] = diff[ 2] - diff[14];
1299  m[15] = diff[ 3] - diff[15];
1300
1301  d[ 0] = m[ 0] + m[ 4];
1302  d[ 1] = m[ 1] + m[ 5];
1303  d[ 2] = m[ 2] + m[ 6];
1304  d[ 3] = m[ 3] + m[ 7];
1305  d[ 4] = m[ 8] + m[12];
1306  d[ 5] = m[ 9] + m[13];
1307  d[ 6] = m[10] + m[14];
1308  d[ 7] = m[11] + m[15];
1309  d[ 8] = m[ 0] - m[ 4];
1310  d[ 9] = m[ 1] - m[ 5];
1311  d[10] = m[ 2] - m[ 6];
1312  d[11] = m[ 3] - m[ 7];
1313  d[12] = m[12] - m[ 8];
1314  d[13] = m[13] - m[ 9];
1315  d[14] = m[14] - m[10];
1316  d[15] = m[15] - m[11];
1317
1318  m[ 0] = d[ 0] + d[ 3];
1319  m[ 1] = d[ 1] + d[ 2];
1320  m[ 2] = d[ 1] - d[ 2];
1321  m[ 3] = d[ 0] - d[ 3];
1322  m[ 4] = d[ 4] + d[ 7];
1323  m[ 5] = d[ 5] + d[ 6];
1324  m[ 6] = d[ 5] - d[ 6];
1325  m[ 7] = d[ 4] - d[ 7];
1326  m[ 8] = d[ 8] + d[11];
1327  m[ 9] = d[ 9] + d[10];
1328  m[10] = d[ 9] - d[10];
1329  m[11] = d[ 8] - d[11];
1330  m[12] = d[12] + d[15];
1331  m[13] = d[13] + d[14];
1332  m[14] = d[13] - d[14];
1333  m[15] = d[12] - d[15];
1334
1335  d[ 0] = m[ 0] + m[ 1];
1336  d[ 1] = m[ 0] - m[ 1];
1337  d[ 2] = m[ 2] + m[ 3];
1338  d[ 3] = m[ 3] - m[ 2];
1339  d[ 4] = m[ 4] + m[ 5];
1340  d[ 5] = m[ 4] - m[ 5];
1341  d[ 6] = m[ 6] + m[ 7];
1342  d[ 7] = m[ 7] - m[ 6];
1343  d[ 8] = m[ 8] + m[ 9];
1344  d[ 9] = m[ 8] - m[ 9];
1345  d[10] = m[10] + m[11];
1346  d[11] = m[11] - m[10];
1347  d[12] = m[12] + m[13];
1348  d[13] = m[12] - m[13];
1349  d[14] = m[14] + m[15];
1350  d[15] = m[15] - m[14];
1351
1352  for (k=0; k<16; ++k)
1353  {
1354    satd += abs(d[k]);
1355  }
1356  satd = ((satd+1)>>1);
1357
1358  return satd;
1359}
1360
1361Distortion TComRdCost::xCalcHADs8x8( const Pel *piOrg, const Pel *piCur, Int iStrideOrg, Int iStrideCur, Int iStep )
1362{
1363  Int k, i, j, jj;
1364  Distortion sad = 0;
1365  TCoeff diff[64], m1[8][8], m2[8][8], m3[8][8];
1366  assert( iStep == 1 );
1367  for( k = 0; k < 64; k += 8 )
1368  {
1369    diff[k+0] = piOrg[0] - piCur[0];
1370    diff[k+1] = piOrg[1] - piCur[1];
1371    diff[k+2] = piOrg[2] - piCur[2];
1372    diff[k+3] = piOrg[3] - piCur[3];
1373    diff[k+4] = piOrg[4] - piCur[4];
1374    diff[k+5] = piOrg[5] - piCur[5];
1375    diff[k+6] = piOrg[6] - piCur[6];
1376    diff[k+7] = piOrg[7] - piCur[7];
1377
1378    piCur += iStrideCur;
1379    piOrg += iStrideOrg;
1380  }
1381
1382  //horizontal
1383  for (j=0; j < 8; j++)
1384  {
1385    jj = j << 3;
1386    m2[j][0] = diff[jj  ] + diff[jj+4];
1387    m2[j][1] = diff[jj+1] + diff[jj+5];
1388    m2[j][2] = diff[jj+2] + diff[jj+6];
1389    m2[j][3] = diff[jj+3] + diff[jj+7];
1390    m2[j][4] = diff[jj  ] - diff[jj+4];
1391    m2[j][5] = diff[jj+1] - diff[jj+5];
1392    m2[j][6] = diff[jj+2] - diff[jj+6];
1393    m2[j][7] = diff[jj+3] - diff[jj+7];
1394
1395    m1[j][0] = m2[j][0] + m2[j][2];
1396    m1[j][1] = m2[j][1] + m2[j][3];
1397    m1[j][2] = m2[j][0] - m2[j][2];
1398    m1[j][3] = m2[j][1] - m2[j][3];
1399    m1[j][4] = m2[j][4] + m2[j][6];
1400    m1[j][5] = m2[j][5] + m2[j][7];
1401    m1[j][6] = m2[j][4] - m2[j][6];
1402    m1[j][7] = m2[j][5] - m2[j][7];
1403
1404    m2[j][0] = m1[j][0] + m1[j][1];
1405    m2[j][1] = m1[j][0] - m1[j][1];
1406    m2[j][2] = m1[j][2] + m1[j][3];
1407    m2[j][3] = m1[j][2] - m1[j][3];
1408    m2[j][4] = m1[j][4] + m1[j][5];
1409    m2[j][5] = m1[j][4] - m1[j][5];
1410    m2[j][6] = m1[j][6] + m1[j][7];
1411    m2[j][7] = m1[j][6] - m1[j][7];
1412  }
1413
1414  //vertical
1415  for (i=0; i < 8; i++)
1416  {
1417    m3[0][i] = m2[0][i] + m2[4][i];
1418    m3[1][i] = m2[1][i] + m2[5][i];
1419    m3[2][i] = m2[2][i] + m2[6][i];
1420    m3[3][i] = m2[3][i] + m2[7][i];
1421    m3[4][i] = m2[0][i] - m2[4][i];
1422    m3[5][i] = m2[1][i] - m2[5][i];
1423    m3[6][i] = m2[2][i] - m2[6][i];
1424    m3[7][i] = m2[3][i] - m2[7][i];
1425
1426    m1[0][i] = m3[0][i] + m3[2][i];
1427    m1[1][i] = m3[1][i] + m3[3][i];
1428    m1[2][i] = m3[0][i] - m3[2][i];
1429    m1[3][i] = m3[1][i] - m3[3][i];
1430    m1[4][i] = m3[4][i] + m3[6][i];
1431    m1[5][i] = m3[5][i] + m3[7][i];
1432    m1[6][i] = m3[4][i] - m3[6][i];
1433    m1[7][i] = m3[5][i] - m3[7][i];
1434
1435    m2[0][i] = m1[0][i] + m1[1][i];
1436    m2[1][i] = m1[0][i] - m1[1][i];
1437    m2[2][i] = m1[2][i] + m1[3][i];
1438    m2[3][i] = m1[2][i] - m1[3][i];
1439    m2[4][i] = m1[4][i] + m1[5][i];
1440    m2[5][i] = m1[4][i] - m1[5][i];
1441    m2[6][i] = m1[6][i] + m1[7][i];
1442    m2[7][i] = m1[6][i] - m1[7][i];
1443  }
1444
1445  for (i = 0; i < 8; i++)
1446  {
1447    for (j = 0; j < 8; j++)
1448    {
1449      sad += abs(m2[i][j]);
1450    }
1451  }
1452
1453  sad=((sad+2)>>2);
1454
1455  return sad;
1456}
1457
1458
1459Distortion TComRdCost::xGetHADs( DistParam* pcDtParam )
1460{
1461  if ( pcDtParam->bApplyWeight )
1462  {
1463    return TComRdCostWeightPrediction::xGetHADsw( pcDtParam );
1464  }
1465
1466  const Pel* piOrg      = pcDtParam->pOrg;
1467  const Pel* piCur      = pcDtParam->pCur;
1468  const Int  iRows      = pcDtParam->iRows;
1469  const Int  iCols      = pcDtParam->iCols;
1470  const Int  iStrideCur = pcDtParam->iStrideCur;
1471  const Int  iStrideOrg = pcDtParam->iStrideOrg;
1472  const Int  iStep      = pcDtParam->iStep;
1473
1474  Int  x, y;
1475
1476  Distortion uiSum = 0;
1477
1478  if( ( iRows % 8 == 0) && (iCols % 8 == 0) )
1479  {
1480    Int  iOffsetOrg = iStrideOrg<<3;
1481    Int  iOffsetCur = iStrideCur<<3;
1482    for ( y=0; y<iRows; y+= 8 )
1483    {
1484      for ( x=0; x<iCols; x+= 8 )
1485      {
1486        uiSum += xCalcHADs8x8( &piOrg[x], &piCur[x*iStep], iStrideOrg, iStrideCur, iStep );
1487      }
1488      piOrg += iOffsetOrg;
1489      piCur += iOffsetCur;
1490    }
1491  }
1492  else if( ( iRows % 4 == 0) && (iCols % 4 == 0) )
1493  {
1494    Int  iOffsetOrg = iStrideOrg<<2;
1495    Int  iOffsetCur = iStrideCur<<2;
1496
1497    for ( y=0; y<iRows; y+= 4 )
1498    {
1499      for ( x=0; x<iCols; x+= 4 )
1500      {
1501        uiSum += xCalcHADs4x4( &piOrg[x], &piCur[x*iStep], iStrideOrg, iStrideCur, iStep );
1502      }
1503      piOrg += iOffsetOrg;
1504      piCur += iOffsetCur;
1505    }
1506  }
1507  else if( ( iRows % 2 == 0) && (iCols % 2 == 0) )
1508  {
1509    Int  iOffsetOrg = iStrideOrg<<1;
1510    Int  iOffsetCur = iStrideCur<<1;
1511    for ( y=0; y<iRows; y+=2 )
1512    {
1513      for ( x=0; x<iCols; x+=2 )
1514      {
1515        uiSum += xCalcHADs2x2( &piOrg[x], &piCur[x*iStep], iStrideOrg, iStrideCur, iStep );
1516      }
1517      piOrg += iOffsetOrg;
1518      piCur += iOffsetCur;
1519    }
1520  }
1521  else
1522  {
1523    assert(false);
1524  }
1525
1526  return ( uiSum >> DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8) );
1527}
1528
1529
1530//! \}
Note: See TracBrowser for help on using the repository browser.