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

Last change on this file since 1417 was 1191, checked in by tech, 10 years ago

Removed 3D-HEVC.

  • Property svn:eol-style set to native
File size: 52.5 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 "TComRom.h"
41#include "TComRdCost.h"
42
43//! \ingroup TLibCommon
44//! \{
45
46TComRdCost::TComRdCost()
47{
48  init();
49}
50
51TComRdCost::~TComRdCost()
52{
53#if !FIX203
54  xUninit();
55#endif
56}
57
58// Calculate RD functions
59Double TComRdCost::calcRdCost( UInt uiBits, UInt uiDistortion, Bool bFlag, DFunc eDFunc )
60{
61  Double dRdCost = 0.0;
62  Double dLambda = 0.0;
63 
64  switch ( eDFunc )
65  {
66    case DF_SSE:
67      assert(0);
68      break;
69    case DF_SAD:
70      dLambda = (Double)m_uiLambdaMotionSAD;
71      break;
72    case DF_DEFAULT:
73      dLambda =         m_dLambda;
74      break;
75    case DF_SSE_FRAME:
76      dLambda =         m_dFrameLambda;
77      break;
78    default:
79      assert (0);
80      break;
81  }
82 
83  if (bFlag)
84  {
85    // Intra8x8, Intra4x4 Block only...
86#if SEQUENCE_LEVEL_LOSSLESS
87    dRdCost = (Double)(uiBits);
88#else
89    dRdCost = (((Double)uiDistortion) + ((Double)uiBits * dLambda));
90#endif
91  }
92  else
93  {
94    if (eDFunc == DF_SAD)
95    {
96      dRdCost = ((Double)uiDistortion + (Double)((Int)(uiBits * dLambda+.5)>>16));
97      dRdCost = (Double)(UInt)floor(dRdCost);
98    }
99    else
100    {
101#if SEQUENCE_LEVEL_LOSSLESS
102      dRdCost = (Double)(uiBits);
103#else
104      dRdCost = ((Double)uiDistortion + (Double)((Int)(uiBits * dLambda+.5)));
105      dRdCost = (Double)(UInt)floor(dRdCost);
106#endif
107    }
108  }
109 
110  return dRdCost;
111}
112
113Double TComRdCost::calcRdCost64( UInt64 uiBits, UInt64 uiDistortion, Bool bFlag, DFunc eDFunc )
114{
115  Double dRdCost = 0.0;
116  Double dLambda = 0.0;
117 
118  switch ( eDFunc )
119  {
120    case DF_SSE:
121      assert(0);
122      break;
123    case DF_SAD:
124      dLambda = (Double)m_uiLambdaMotionSAD;
125      break;
126    case DF_DEFAULT:
127      dLambda =         m_dLambda;
128      break;
129    case DF_SSE_FRAME:
130      dLambda =         m_dFrameLambda;
131      break;
132    default:
133      assert (0);
134      break;
135  }
136 
137  if (bFlag)
138  {
139    // Intra8x8, Intra4x4 Block only...
140#if SEQUENCE_LEVEL_LOSSLESS
141    dRdCost = (Double)(uiBits);
142#else
143    dRdCost = (((Double)(Int64)uiDistortion) + ((Double)(Int64)uiBits * dLambda));
144#endif
145  }
146  else
147  {
148    if (eDFunc == DF_SAD)
149    {
150      dRdCost = ((Double)(Int64)uiDistortion + (Double)((Int)((Int64)uiBits * dLambda+.5)>>16));
151      dRdCost = (Double)(UInt)floor(dRdCost);
152    }
153    else
154    {
155#if SEQUENCE_LEVEL_LOSSLESS
156      dRdCost = (Double)(uiBits);
157#else
158      dRdCost = ((Double)(Int64)uiDistortion + (Double)((Int)((Int64)uiBits * dLambda+.5)));
159      dRdCost = (Double)(UInt)floor(dRdCost);
160#endif
161    }
162  }
163 
164  return dRdCost;
165}
166
167Void TComRdCost::setLambda( Double dLambda )
168{
169  m_dLambda           = dLambda;
170  m_sqrtLambda        = sqrt(m_dLambda);
171  m_uiLambdaMotionSAD = (UInt)floor(65536.0 * m_sqrtLambda);
172  m_uiLambdaMotionSSE = (UInt)floor(65536.0 * m_dLambda   );
173}
174
175
176// Initalize Function Pointer by [eDFunc]
177Void TComRdCost::init()
178{
179  m_afpDistortFunc[0]  = NULL;                  // for DF_DEFAULT
180 
181  m_afpDistortFunc[1]  = TComRdCost::xGetSSE;
182  m_afpDistortFunc[2]  = TComRdCost::xGetSSE4;
183  m_afpDistortFunc[3]  = TComRdCost::xGetSSE8;
184  m_afpDistortFunc[4]  = TComRdCost::xGetSSE16;
185  m_afpDistortFunc[5]  = TComRdCost::xGetSSE32;
186  m_afpDistortFunc[6]  = TComRdCost::xGetSSE64;
187  m_afpDistortFunc[7]  = TComRdCost::xGetSSE16N;
188 
189  m_afpDistortFunc[8]  = TComRdCost::xGetSAD;
190  m_afpDistortFunc[9]  = TComRdCost::xGetSAD4;
191  m_afpDistortFunc[10] = TComRdCost::xGetSAD8;
192  m_afpDistortFunc[11] = TComRdCost::xGetSAD16;
193  m_afpDistortFunc[12] = TComRdCost::xGetSAD32;
194  m_afpDistortFunc[13] = TComRdCost::xGetSAD64;
195  m_afpDistortFunc[14] = TComRdCost::xGetSAD16N;
196 
197  m_afpDistortFunc[15] = TComRdCost::xGetSAD;
198  m_afpDistortFunc[16] = TComRdCost::xGetSAD4;
199  m_afpDistortFunc[17] = TComRdCost::xGetSAD8;
200  m_afpDistortFunc[18] = TComRdCost::xGetSAD16;
201  m_afpDistortFunc[19] = TComRdCost::xGetSAD32;
202  m_afpDistortFunc[20] = TComRdCost::xGetSAD64;
203  m_afpDistortFunc[21] = TComRdCost::xGetSAD16N;
204 
205#if AMP_SAD
206  m_afpDistortFunc[43] = TComRdCost::xGetSAD12;
207  m_afpDistortFunc[44] = TComRdCost::xGetSAD24;
208  m_afpDistortFunc[45] = TComRdCost::xGetSAD48;
209
210  m_afpDistortFunc[46] = TComRdCost::xGetSAD12;
211  m_afpDistortFunc[47] = TComRdCost::xGetSAD24;
212  m_afpDistortFunc[48] = TComRdCost::xGetSAD48;
213#endif
214  m_afpDistortFunc[22] = TComRdCost::xGetHADs;
215  m_afpDistortFunc[23] = TComRdCost::xGetHADs;
216  m_afpDistortFunc[24] = TComRdCost::xGetHADs;
217  m_afpDistortFunc[25] = TComRdCost::xGetHADs;
218  m_afpDistortFunc[26] = TComRdCost::xGetHADs;
219  m_afpDistortFunc[27] = TComRdCost::xGetHADs;
220  m_afpDistortFunc[28] = TComRdCost::xGetHADs;
221
222#if !FIX203
223  m_puiComponentCostOriginP = NULL;
224  m_puiComponentCost        = NULL;
225  m_puiVerCost              = NULL;
226  m_puiHorCost              = NULL;
227#endif
228  m_uiCost                  = 0;
229  m_iCostScale              = 0;
230#if !FIX203
231  m_iSearchLimit            = 0xdeaddead;
232#endif
233}
234
235#if !FIX203
236Void TComRdCost::initRateDistortionModel( Int iSubPelSearchLimit )
237{
238  // make it larger
239  iSubPelSearchLimit += 4;
240  iSubPelSearchLimit *= 8;
241 
242  if( m_iSearchLimit != iSubPelSearchLimit )
243  {
244    xUninit();
245   
246    m_iSearchLimit = iSubPelSearchLimit;
247   
248    m_puiComponentCostOriginP = new UInt[ 4 * iSubPelSearchLimit ];
249    iSubPelSearchLimit *= 2;
250   
251    m_puiComponentCost = m_puiComponentCostOriginP + iSubPelSearchLimit;
252   
253    for( Int n = -iSubPelSearchLimit; n < iSubPelSearchLimit; n++)
254    {
255      m_puiComponentCost[n] = xGetComponentBits( n );
256    }
257  }
258}
259
260Void TComRdCost::xUninit()
261{
262  if( NULL != m_puiComponentCostOriginP )
263  {
264    delete [] m_puiComponentCostOriginP;
265    m_puiComponentCostOriginP = NULL;
266  }
267}
268#endif
269
270UInt TComRdCost::xGetComponentBits( Int iVal )
271{
272  UInt uiLength = 1;
273  UInt uiTemp   = ( iVal <= 0) ? (-iVal<<1)+1: (iVal<<1);
274 
275  assert ( uiTemp );
276 
277  while ( 1 != uiTemp )
278  {
279    uiTemp >>= 1;
280    uiLength += 2;
281  }
282 
283  return uiLength;
284}
285
286Void TComRdCost::setDistParam( UInt uiBlkWidth, UInt uiBlkHeight, DFunc eDFunc, DistParam& rcDistParam )
287{
288  // set Block Width / Height
289  rcDistParam.iCols    = uiBlkWidth;
290  rcDistParam.iRows    = uiBlkHeight;
291  rcDistParam.DistFunc = m_afpDistortFunc[eDFunc + g_aucConvertToBit[ rcDistParam.iCols ] + 1 ];
292 
293  // initialize
294  rcDistParam.iSubShift  = 0;
295}
296
297// Setting the Distortion Parameter for Inter (ME)
298Void TComRdCost::setDistParam( TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride, DistParam& rcDistParam )
299{
300  // set Original & Curr Pointer / Stride
301  rcDistParam.pOrg = pcPatternKey->getROIY();
302  rcDistParam.pCur = piRefY;
303 
304  rcDistParam.iStrideOrg = pcPatternKey->getPatternLStride();
305  rcDistParam.iStrideCur = iRefStride;
306 
307  // set Block Width / Height
308  rcDistParam.iCols    = pcPatternKey->getROIYWidth();
309  rcDistParam.iRows    = pcPatternKey->getROIYHeight();
310  rcDistParam.DistFunc = m_afpDistortFunc[DF_SAD + g_aucConvertToBit[ rcDistParam.iCols ] + 1 ];
311 
312#if AMP_SAD
313  if (rcDistParam.iCols == 12)
314  {
315    rcDistParam.DistFunc = m_afpDistortFunc[43 ];
316  }
317  else if (rcDistParam.iCols == 24)
318  {
319    rcDistParam.DistFunc = m_afpDistortFunc[44 ];
320  }
321  else if (rcDistParam.iCols == 48)
322  {
323    rcDistParam.DistFunc = m_afpDistortFunc[45 ];
324  }
325#endif
326 
327  // initialize
328  rcDistParam.iSubShift  = 0;
329}
330
331// Setting the Distortion Parameter for Inter (subpel ME with step)
332Void TComRdCost::setDistParam( TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride, Int iStep, DistParam& rcDistParam, Bool bHADME )
333{
334  // set Original & Curr Pointer / Stride
335  rcDistParam.pOrg = pcPatternKey->getROIY();
336  rcDistParam.pCur = piRefY;
337 
338  rcDistParam.iStrideOrg = pcPatternKey->getPatternLStride();
339  rcDistParam.iStrideCur = iRefStride * iStep;
340 
341  // set Step for interpolated buffer
342  rcDistParam.iStep = iStep;
343 
344  // set Block Width / Height
345  rcDistParam.iCols    = pcPatternKey->getROIYWidth();
346  rcDistParam.iRows    = pcPatternKey->getROIYHeight();
347 
348  // set distortion function
349  if ( !bHADME )
350  {
351    rcDistParam.DistFunc = m_afpDistortFunc[DF_SADS + g_aucConvertToBit[ rcDistParam.iCols ] + 1 ];
352#if AMP_SAD
353    if (rcDistParam.iCols == 12)
354    {
355      rcDistParam.DistFunc = m_afpDistortFunc[46 ];
356    }
357    else if (rcDistParam.iCols == 24)
358    {
359      rcDistParam.DistFunc = m_afpDistortFunc[47 ];
360    }
361    else if (rcDistParam.iCols == 48)
362    {
363      rcDistParam.DistFunc = m_afpDistortFunc[48 ];
364    }
365#endif
366  }
367  else
368  {
369    rcDistParam.DistFunc = m_afpDistortFunc[DF_HADS + g_aucConvertToBit[ rcDistParam.iCols ] + 1 ];
370  }
371 
372  // initialize
373  rcDistParam.iSubShift  = 0;
374}
375
376Void
377TComRdCost::setDistParam( DistParam& rcDP, Int bitDepth, Pel* p1, Int iStride1, Pel* p2, Int iStride2, Int iWidth, Int iHeight, Bool bHadamard )
378{
379  rcDP.pOrg       = p1;
380  rcDP.pCur       = p2;
381  rcDP.iStrideOrg = iStride1;
382  rcDP.iStrideCur = iStride2;
383  rcDP.iCols      = iWidth;
384  rcDP.iRows      = iHeight;
385  rcDP.iStep      = 1;
386  rcDP.iSubShift  = 0;
387  rcDP.bitDepth   = bitDepth;
388  rcDP.DistFunc   = m_afpDistortFunc[ ( bHadamard ? DF_HADS : DF_SADS ) + g_aucConvertToBit[ iWidth ] + 1 ];
389}
390
391UInt TComRdCost::calcHAD(Int bitDepth, Pel* pi0, Int iStride0, Pel* pi1, Int iStride1, Int iWidth, Int iHeight )
392{
393  UInt uiSum = 0;
394  Int x, y;
395 
396  if ( ( (iWidth % 8) == 0 ) && ( (iHeight % 8) == 0 ) )
397  {
398    for ( y=0; y<iHeight; y+= 8 )
399    {
400      for ( x=0; x<iWidth; x+= 8 )
401      {
402        uiSum += xCalcHADs8x8( &pi0[x], &pi1[x], iStride0, iStride1, 1 );
403      }
404      pi0 += iStride0*8;
405      pi1 += iStride1*8;
406    }
407  }
408  else
409  {
410    assert(iWidth % 4 == 0 && iHeight % 4 == 0);
411   
412    for ( y=0; y<iHeight; y+= 4 )
413    {
414      for ( x=0; x<iWidth; x+= 4 )
415      {
416        uiSum += xCalcHADs4x4( &pi0[x], &pi1[x], iStride0, iStride1, 1 );
417      }
418      pi0 += iStride0*4;
419      pi1 += iStride1*4;
420    }
421  }
422 
423  return uiSum >> DISTORTION_PRECISION_ADJUSTMENT(bitDepth-8);
424
425}
426
427
428
429UInt TComRdCost::getDistPart(Int bitDepth, Pel* piCur, Int iCurStride,  Pel* piOrg, Int iOrgStride, UInt uiBlkWidth, UInt uiBlkHeight, TextType eText, DFunc eDFunc)
430{
431  DistParam cDtParam;
432  setDistParam( uiBlkWidth, uiBlkHeight, eDFunc, cDtParam );
433  cDtParam.pOrg       = piOrg;
434  cDtParam.pCur       = piCur;
435  cDtParam.iStrideOrg = iOrgStride;
436  cDtParam.iStrideCur = iCurStride;
437  cDtParam.iStep      = 1;
438
439  cDtParam.bApplyWeight = false;
440  cDtParam.uiComp       = 255;    // just for assert: to be sure it was set before use, since only values 0,1 or 2 are allowed.
441  cDtParam.bitDepth = bitDepth;
442
443  if (eText == TEXT_CHROMA_U)
444  {
445   return ((Int) (m_cbDistortionWeight * cDtParam.DistFunc( &cDtParam )));
446  }
447  else if (eText == TEXT_CHROMA_V)
448  {
449   return ((Int) (m_crDistortionWeight * cDtParam.DistFunc( &cDtParam )));
450  }
451  else
452  {
453    return cDtParam.DistFunc( &cDtParam );
454  }
455}
456
457#if KWU_RC_MADPRED_E0227
458UInt TComRdCost::getSADPart ( Int bitDepth, Pel* pelCur, Int curStride,  Pel* pelOrg, Int orgStride, UInt width, UInt height )
459{
460  UInt SAD = 0;
461  Int shift = DISTORTION_PRECISION_ADJUSTMENT(bitDepth-8);
462  for ( Int i=0; i<height; i++ )
463  {
464    for( Int j=0; j<width; j++ )
465    {
466      SAD += abs((pelCur[j] - pelOrg[j])) >> shift;
467    }
468    pelCur = pelCur + curStride;
469    pelOrg = pelOrg + orgStride;
470  }
471  return SAD;
472}
473#endif
474
475// ====================================================================================================================
476// Distortion functions
477// ====================================================================================================================
478
479// --------------------------------------------------------------------------------------------------------------------
480// SAD
481// --------------------------------------------------------------------------------------------------------------------
482
483UInt TComRdCost::xGetSAD( DistParam* pcDtParam )
484{
485  if ( pcDtParam->bApplyWeight )
486  {
487    return xGetSADw( pcDtParam );
488  }
489  Pel* piOrg   = pcDtParam->pOrg;
490  Pel* piCur   = pcDtParam->pCur;
491  Int  iRows   = pcDtParam->iRows;
492  Int  iCols   = pcDtParam->iCols;
493  Int  iStrideCur = pcDtParam->iStrideCur;
494  Int  iStrideOrg = pcDtParam->iStrideOrg;
495 
496  UInt uiSum = 0;
497 
498  for( ; iRows != 0; iRows-- )
499  {
500    for (Int n = 0; n < iCols; n++ )
501    {
502      uiSum += abs( piOrg[n] - piCur[n] );
503    }
504    piOrg += iStrideOrg;
505    piCur += iStrideCur;
506  }
507 
508  return uiSum >> DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8);
509}
510
511UInt TComRdCost::xGetSAD4( DistParam* pcDtParam )
512{
513  if ( pcDtParam->bApplyWeight ) 
514  {
515    return xGetSADw( pcDtParam );
516  }
517  Pel* piOrg   = pcDtParam->pOrg;
518  Pel* piCur   = pcDtParam->pCur;
519  Int  iRows   = pcDtParam->iRows;
520  Int  iSubShift  = pcDtParam->iSubShift;
521  Int  iSubStep   = ( 1 << iSubShift );
522  Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
523  Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
524 
525  UInt uiSum = 0;
526 
527  for( ; iRows != 0; iRows-=iSubStep )
528  {
529    uiSum += abs( piOrg[0] - piCur[0] );
530    uiSum += abs( piOrg[1] - piCur[1] );
531    uiSum += abs( piOrg[2] - piCur[2] );
532    uiSum += abs( piOrg[3] - piCur[3] );
533   
534    piOrg += iStrideOrg;
535    piCur += iStrideCur;
536  }
537 
538  uiSum <<= iSubShift;
539  return uiSum >> DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8);
540}
541
542UInt TComRdCost::xGetSAD8( DistParam* pcDtParam )
543{
544  if ( pcDtParam->bApplyWeight )
545  {
546    return xGetSADw( pcDtParam );
547  }
548  Pel* piOrg      = pcDtParam->pOrg;
549  Pel* piCur      = pcDtParam->pCur;
550  Int  iRows      = pcDtParam->iRows;
551  Int  iSubShift  = pcDtParam->iSubShift;
552  Int  iSubStep   = ( 1 << iSubShift );
553  Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
554  Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
555 
556  UInt uiSum = 0;
557 
558  for( ; iRows != 0; iRows-=iSubStep )
559  {
560    uiSum += abs( piOrg[0] - piCur[0] );
561    uiSum += abs( piOrg[1] - piCur[1] );
562    uiSum += abs( piOrg[2] - piCur[2] );
563    uiSum += abs( piOrg[3] - piCur[3] );
564    uiSum += abs( piOrg[4] - piCur[4] );
565    uiSum += abs( piOrg[5] - piCur[5] );
566    uiSum += abs( piOrg[6] - piCur[6] );
567    uiSum += abs( piOrg[7] - piCur[7] );
568   
569    piOrg += iStrideOrg;
570    piCur += iStrideCur;
571  }
572 
573  uiSum <<= iSubShift;
574  return uiSum >> DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8);
575}
576
577UInt TComRdCost::xGetSAD16( DistParam* pcDtParam )
578{
579  if ( pcDtParam->bApplyWeight )
580  {
581    return xGetSADw( pcDtParam );
582  }
583  Pel* piOrg   = pcDtParam->pOrg;
584  Pel* piCur   = pcDtParam->pCur;
585  Int  iRows   = pcDtParam->iRows;
586  Int  iSubShift  = pcDtParam->iSubShift;
587  Int  iSubStep   = ( 1 << iSubShift );
588  Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
589  Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
590 
591  UInt uiSum = 0;
592 
593  for( ; iRows != 0; iRows-=iSubStep )
594  {
595    uiSum += abs( piOrg[0] - piCur[0] );
596    uiSum += abs( piOrg[1] - piCur[1] );
597    uiSum += abs( piOrg[2] - piCur[2] );
598    uiSum += abs( piOrg[3] - piCur[3] );
599    uiSum += abs( piOrg[4] - piCur[4] );
600    uiSum += abs( piOrg[5] - piCur[5] );
601    uiSum += abs( piOrg[6] - piCur[6] );
602    uiSum += abs( piOrg[7] - piCur[7] );
603    uiSum += abs( piOrg[8] - piCur[8] );
604    uiSum += abs( piOrg[9] - piCur[9] );
605    uiSum += abs( piOrg[10] - piCur[10] );
606    uiSum += abs( piOrg[11] - piCur[11] );
607    uiSum += abs( piOrg[12] - piCur[12] );
608    uiSum += abs( piOrg[13] - piCur[13] );
609    uiSum += abs( piOrg[14] - piCur[14] );
610    uiSum += abs( piOrg[15] - piCur[15] );
611   
612    piOrg += iStrideOrg;
613    piCur += iStrideCur;
614  }
615 
616  uiSum <<= iSubShift;
617  return uiSum >> DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8);
618}
619
620#if AMP_SAD
621UInt TComRdCost::xGetSAD12( DistParam* pcDtParam )
622{
623  if ( pcDtParam->bApplyWeight )
624  {
625    return xGetSADw( pcDtParam );
626  }
627  Pel* piOrg   = pcDtParam->pOrg;
628  Pel* piCur   = pcDtParam->pCur;
629  Int  iRows   = pcDtParam->iRows;
630  Int  iSubShift  = pcDtParam->iSubShift;
631  Int  iSubStep   = ( 1 << iSubShift );
632  Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
633  Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
634 
635  UInt uiSum = 0;
636 
637  for( ; iRows != 0; iRows-=iSubStep )
638  {
639    uiSum += abs( piOrg[0] - piCur[0] );
640    uiSum += abs( piOrg[1] - piCur[1] );
641    uiSum += abs( piOrg[2] - piCur[2] );
642    uiSum += abs( piOrg[3] - piCur[3] );
643    uiSum += abs( piOrg[4] - piCur[4] );
644    uiSum += abs( piOrg[5] - piCur[5] );
645    uiSum += abs( piOrg[6] - piCur[6] );
646    uiSum += abs( piOrg[7] - piCur[7] );
647    uiSum += abs( piOrg[8] - piCur[8] );
648    uiSum += abs( piOrg[9] - piCur[9] );
649    uiSum += abs( piOrg[10] - piCur[10] );
650    uiSum += abs( piOrg[11] - piCur[11] );
651   
652    piOrg += iStrideOrg;
653    piCur += iStrideCur;
654  }
655 
656  uiSum <<= iSubShift;
657  return uiSum >> DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8);
658}
659#endif
660
661UInt TComRdCost::xGetSAD16N( DistParam* pcDtParam )
662{
663  Pel* piOrg   = pcDtParam->pOrg;
664  Pel* piCur   = pcDtParam->pCur;
665  Int  iRows   = pcDtParam->iRows;
666  Int  iCols   = pcDtParam->iCols;
667  Int  iSubShift  = pcDtParam->iSubShift;
668  Int  iSubStep   = ( 1 << iSubShift );
669  Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
670  Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
671 
672  UInt uiSum = 0;
673 
674  for( ; iRows != 0; iRows-=iSubStep )
675  {
676    for (Int n = 0; n < iCols; n+=16 )
677    {
678      uiSum += abs( piOrg[n+ 0] - piCur[n+ 0] );
679      uiSum += abs( piOrg[n+ 1] - piCur[n+ 1] );
680      uiSum += abs( piOrg[n+ 2] - piCur[n+ 2] );
681      uiSum += abs( piOrg[n+ 3] - piCur[n+ 3] );
682      uiSum += abs( piOrg[n+ 4] - piCur[n+ 4] );
683      uiSum += abs( piOrg[n+ 5] - piCur[n+ 5] );
684      uiSum += abs( piOrg[n+ 6] - piCur[n+ 6] );
685      uiSum += abs( piOrg[n+ 7] - piCur[n+ 7] );
686      uiSum += abs( piOrg[n+ 8] - piCur[n+ 8] );
687      uiSum += abs( piOrg[n+ 9] - piCur[n+ 9] );
688      uiSum += abs( piOrg[n+10] - piCur[n+10] );
689      uiSum += abs( piOrg[n+11] - piCur[n+11] );
690      uiSum += abs( piOrg[n+12] - piCur[n+12] );
691      uiSum += abs( piOrg[n+13] - piCur[n+13] );
692      uiSum += abs( piOrg[n+14] - piCur[n+14] );
693      uiSum += abs( piOrg[n+15] - piCur[n+15] );
694    }
695    piOrg += iStrideOrg;
696    piCur += iStrideCur;
697  }
698 
699  uiSum <<= iSubShift;
700  return uiSum >> DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8);
701}
702
703UInt TComRdCost::xGetSAD32( DistParam* pcDtParam )
704{
705  if ( pcDtParam->bApplyWeight )
706  {
707    return xGetSADw( pcDtParam );
708  }
709  Pel* piOrg   = pcDtParam->pOrg;
710  Pel* piCur   = pcDtParam->pCur;
711  Int  iRows   = pcDtParam->iRows;
712  Int  iSubShift  = pcDtParam->iSubShift;
713  Int  iSubStep   = ( 1 << iSubShift );
714  Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
715  Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
716 
717  UInt uiSum = 0;
718 
719  for( ; iRows != 0; iRows-=iSubStep )
720  {
721    uiSum += abs( piOrg[0] - piCur[0] );
722    uiSum += abs( piOrg[1] - piCur[1] );
723    uiSum += abs( piOrg[2] - piCur[2] );
724    uiSum += abs( piOrg[3] - piCur[3] );
725    uiSum += abs( piOrg[4] - piCur[4] );
726    uiSum += abs( piOrg[5] - piCur[5] );
727    uiSum += abs( piOrg[6] - piCur[6] );
728    uiSum += abs( piOrg[7] - piCur[7] );
729    uiSum += abs( piOrg[8] - piCur[8] );
730    uiSum += abs( piOrg[9] - piCur[9] );
731    uiSum += abs( piOrg[10] - piCur[10] );
732    uiSum += abs( piOrg[11] - piCur[11] );
733    uiSum += abs( piOrg[12] - piCur[12] );
734    uiSum += abs( piOrg[13] - piCur[13] );
735    uiSum += abs( piOrg[14] - piCur[14] );
736    uiSum += abs( piOrg[15] - piCur[15] );
737    uiSum += abs( piOrg[16] - piCur[16] );
738    uiSum += abs( piOrg[17] - piCur[17] );
739    uiSum += abs( piOrg[18] - piCur[18] );
740    uiSum += abs( piOrg[19] - piCur[19] );
741    uiSum += abs( piOrg[20] - piCur[20] );
742    uiSum += abs( piOrg[21] - piCur[21] );
743    uiSum += abs( piOrg[22] - piCur[22] );
744    uiSum += abs( piOrg[23] - piCur[23] );
745    uiSum += abs( piOrg[24] - piCur[24] );
746    uiSum += abs( piOrg[25] - piCur[25] );
747    uiSum += abs( piOrg[26] - piCur[26] );
748    uiSum += abs( piOrg[27] - piCur[27] );
749    uiSum += abs( piOrg[28] - piCur[28] );
750    uiSum += abs( piOrg[29] - piCur[29] );
751    uiSum += abs( piOrg[30] - piCur[30] );
752    uiSum += abs( piOrg[31] - piCur[31] );
753   
754    piOrg += iStrideOrg;
755    piCur += iStrideCur;
756  }
757 
758  uiSum <<= iSubShift;
759  return uiSum >> DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8);
760}
761
762#if AMP_SAD
763UInt TComRdCost::xGetSAD24( DistParam* pcDtParam )
764{
765  if ( pcDtParam->bApplyWeight )
766  {
767    return xGetSADw( pcDtParam );
768  }
769  Pel* piOrg   = pcDtParam->pOrg;
770  Pel* piCur   = pcDtParam->pCur;
771  Int  iRows   = pcDtParam->iRows;
772  Int  iSubShift  = pcDtParam->iSubShift;
773  Int  iSubStep   = ( 1 << iSubShift );
774  Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
775  Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
776 
777  UInt uiSum = 0;
778 
779  for( ; iRows != 0; iRows-=iSubStep )
780  {
781    uiSum += abs( piOrg[0] - piCur[0] );
782    uiSum += abs( piOrg[1] - piCur[1] );
783    uiSum += abs( piOrg[2] - piCur[2] );
784    uiSum += abs( piOrg[3] - piCur[3] );
785    uiSum += abs( piOrg[4] - piCur[4] );
786    uiSum += abs( piOrg[5] - piCur[5] );
787    uiSum += abs( piOrg[6] - piCur[6] );
788    uiSum += abs( piOrg[7] - piCur[7] );
789    uiSum += abs( piOrg[8] - piCur[8] );
790    uiSum += abs( piOrg[9] - piCur[9] );
791    uiSum += abs( piOrg[10] - piCur[10] );
792    uiSum += abs( piOrg[11] - piCur[11] );
793    uiSum += abs( piOrg[12] - piCur[12] );
794    uiSum += abs( piOrg[13] - piCur[13] );
795    uiSum += abs( piOrg[14] - piCur[14] );
796    uiSum += abs( piOrg[15] - piCur[15] );
797    uiSum += abs( piOrg[16] - piCur[16] );
798    uiSum += abs( piOrg[17] - piCur[17] );
799    uiSum += abs( piOrg[18] - piCur[18] );
800    uiSum += abs( piOrg[19] - piCur[19] );
801    uiSum += abs( piOrg[20] - piCur[20] );
802    uiSum += abs( piOrg[21] - piCur[21] );
803    uiSum += abs( piOrg[22] - piCur[22] );
804    uiSum += abs( piOrg[23] - piCur[23] );
805   
806    piOrg += iStrideOrg;
807    piCur += iStrideCur;
808  }
809 
810  uiSum <<= iSubShift;
811  return uiSum >> DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8);
812}
813
814#endif
815
816UInt TComRdCost::xGetSAD64( DistParam* pcDtParam )
817{
818  if ( pcDtParam->bApplyWeight )
819  {
820    return xGetSADw( pcDtParam );
821  }
822  Pel* piOrg   = pcDtParam->pOrg;
823  Pel* piCur   = pcDtParam->pCur;
824  Int  iRows   = pcDtParam->iRows;
825  Int  iSubShift  = pcDtParam->iSubShift;
826  Int  iSubStep   = ( 1 << iSubShift );
827  Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
828  Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
829 
830  UInt uiSum = 0;
831 
832  for( ; iRows != 0; iRows-=iSubStep )
833  {
834    uiSum += abs( piOrg[0] - piCur[0] );
835    uiSum += abs( piOrg[1] - piCur[1] );
836    uiSum += abs( piOrg[2] - piCur[2] );
837    uiSum += abs( piOrg[3] - piCur[3] );
838    uiSum += abs( piOrg[4] - piCur[4] );
839    uiSum += abs( piOrg[5] - piCur[5] );
840    uiSum += abs( piOrg[6] - piCur[6] );
841    uiSum += abs( piOrg[7] - piCur[7] );
842    uiSum += abs( piOrg[8] - piCur[8] );
843    uiSum += abs( piOrg[9] - piCur[9] );
844    uiSum += abs( piOrg[10] - piCur[10] );
845    uiSum += abs( piOrg[11] - piCur[11] );
846    uiSum += abs( piOrg[12] - piCur[12] );
847    uiSum += abs( piOrg[13] - piCur[13] );
848    uiSum += abs( piOrg[14] - piCur[14] );
849    uiSum += abs( piOrg[15] - piCur[15] );
850    uiSum += abs( piOrg[16] - piCur[16] );
851    uiSum += abs( piOrg[17] - piCur[17] );
852    uiSum += abs( piOrg[18] - piCur[18] );
853    uiSum += abs( piOrg[19] - piCur[19] );
854    uiSum += abs( piOrg[20] - piCur[20] );
855    uiSum += abs( piOrg[21] - piCur[21] );
856    uiSum += abs( piOrg[22] - piCur[22] );
857    uiSum += abs( piOrg[23] - piCur[23] );
858    uiSum += abs( piOrg[24] - piCur[24] );
859    uiSum += abs( piOrg[25] - piCur[25] );
860    uiSum += abs( piOrg[26] - piCur[26] );
861    uiSum += abs( piOrg[27] - piCur[27] );
862    uiSum += abs( piOrg[28] - piCur[28] );
863    uiSum += abs( piOrg[29] - piCur[29] );
864    uiSum += abs( piOrg[30] - piCur[30] );
865    uiSum += abs( piOrg[31] - piCur[31] );
866    uiSum += abs( piOrg[32] - piCur[32] );
867    uiSum += abs( piOrg[33] - piCur[33] );
868    uiSum += abs( piOrg[34] - piCur[34] );
869    uiSum += abs( piOrg[35] - piCur[35] );
870    uiSum += abs( piOrg[36] - piCur[36] );
871    uiSum += abs( piOrg[37] - piCur[37] );
872    uiSum += abs( piOrg[38] - piCur[38] );
873    uiSum += abs( piOrg[39] - piCur[39] );
874    uiSum += abs( piOrg[40] - piCur[40] );
875    uiSum += abs( piOrg[41] - piCur[41] );
876    uiSum += abs( piOrg[42] - piCur[42] );
877    uiSum += abs( piOrg[43] - piCur[43] );
878    uiSum += abs( piOrg[44] - piCur[44] );
879    uiSum += abs( piOrg[45] - piCur[45] );
880    uiSum += abs( piOrg[46] - piCur[46] );
881    uiSum += abs( piOrg[47] - piCur[47] );
882    uiSum += abs( piOrg[48] - piCur[48] );
883    uiSum += abs( piOrg[49] - piCur[49] );
884    uiSum += abs( piOrg[50] - piCur[50] );
885    uiSum += abs( piOrg[51] - piCur[51] );
886    uiSum += abs( piOrg[52] - piCur[52] );
887    uiSum += abs( piOrg[53] - piCur[53] );
888    uiSum += abs( piOrg[54] - piCur[54] );
889    uiSum += abs( piOrg[55] - piCur[55] );
890    uiSum += abs( piOrg[56] - piCur[56] );
891    uiSum += abs( piOrg[57] - piCur[57] );
892    uiSum += abs( piOrg[58] - piCur[58] );
893    uiSum += abs( piOrg[59] - piCur[59] );
894    uiSum += abs( piOrg[60] - piCur[60] );
895    uiSum += abs( piOrg[61] - piCur[61] );
896    uiSum += abs( piOrg[62] - piCur[62] );
897    uiSum += abs( piOrg[63] - piCur[63] );
898   
899    piOrg += iStrideOrg;
900    piCur += iStrideCur;
901  }
902 
903  uiSum <<= iSubShift;
904  return uiSum >> DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8);
905}
906
907#if AMP_SAD
908UInt TComRdCost::xGetSAD48( DistParam* pcDtParam )
909{
910  if ( pcDtParam->bApplyWeight )
911  {
912    return xGetSADw( pcDtParam );
913  }
914  Pel* piOrg   = pcDtParam->pOrg;
915  Pel* piCur   = pcDtParam->pCur;
916  Int  iRows   = pcDtParam->iRows;
917  Int  iSubShift  = pcDtParam->iSubShift;
918  Int  iSubStep   = ( 1 << iSubShift );
919  Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
920  Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
921 
922  UInt uiSum = 0;
923 
924  for( ; iRows != 0; iRows-=iSubStep )
925  {
926    uiSum += abs( piOrg[0] - piCur[0] );
927    uiSum += abs( piOrg[1] - piCur[1] );
928    uiSum += abs( piOrg[2] - piCur[2] );
929    uiSum += abs( piOrg[3] - piCur[3] );
930    uiSum += abs( piOrg[4] - piCur[4] );
931    uiSum += abs( piOrg[5] - piCur[5] );
932    uiSum += abs( piOrg[6] - piCur[6] );
933    uiSum += abs( piOrg[7] - piCur[7] );
934    uiSum += abs( piOrg[8] - piCur[8] );
935    uiSum += abs( piOrg[9] - piCur[9] );
936    uiSum += abs( piOrg[10] - piCur[10] );
937    uiSum += abs( piOrg[11] - piCur[11] );
938    uiSum += abs( piOrg[12] - piCur[12] );
939    uiSum += abs( piOrg[13] - piCur[13] );
940    uiSum += abs( piOrg[14] - piCur[14] );
941    uiSum += abs( piOrg[15] - piCur[15] );
942    uiSum += abs( piOrg[16] - piCur[16] );
943    uiSum += abs( piOrg[17] - piCur[17] );
944    uiSum += abs( piOrg[18] - piCur[18] );
945    uiSum += abs( piOrg[19] - piCur[19] );
946    uiSum += abs( piOrg[20] - piCur[20] );
947    uiSum += abs( piOrg[21] - piCur[21] );
948    uiSum += abs( piOrg[22] - piCur[22] );
949    uiSum += abs( piOrg[23] - piCur[23] );
950    uiSum += abs( piOrg[24] - piCur[24] );
951    uiSum += abs( piOrg[25] - piCur[25] );
952    uiSum += abs( piOrg[26] - piCur[26] );
953    uiSum += abs( piOrg[27] - piCur[27] );
954    uiSum += abs( piOrg[28] - piCur[28] );
955    uiSum += abs( piOrg[29] - piCur[29] );
956    uiSum += abs( piOrg[30] - piCur[30] );
957    uiSum += abs( piOrg[31] - piCur[31] );
958    uiSum += abs( piOrg[32] - piCur[32] );
959    uiSum += abs( piOrg[33] - piCur[33] );
960    uiSum += abs( piOrg[34] - piCur[34] );
961    uiSum += abs( piOrg[35] - piCur[35] );
962    uiSum += abs( piOrg[36] - piCur[36] );
963    uiSum += abs( piOrg[37] - piCur[37] );
964    uiSum += abs( piOrg[38] - piCur[38] );
965    uiSum += abs( piOrg[39] - piCur[39] );
966    uiSum += abs( piOrg[40] - piCur[40] );
967    uiSum += abs( piOrg[41] - piCur[41] );
968    uiSum += abs( piOrg[42] - piCur[42] );
969    uiSum += abs( piOrg[43] - piCur[43] );
970    uiSum += abs( piOrg[44] - piCur[44] );
971    uiSum += abs( piOrg[45] - piCur[45] );
972    uiSum += abs( piOrg[46] - piCur[46] );
973    uiSum += abs( piOrg[47] - piCur[47] );
974   
975    piOrg += iStrideOrg;
976    piCur += iStrideCur;
977  }
978 
979  uiSum <<= iSubShift;
980  return uiSum >> DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8);
981}
982#endif
983
984// --------------------------------------------------------------------------------------------------------------------
985// SSE
986// --------------------------------------------------------------------------------------------------------------------
987
988UInt TComRdCost::xGetSSE( DistParam* pcDtParam )
989{
990  if ( pcDtParam->bApplyWeight )
991  {
992    return xGetSSEw( pcDtParam );
993  }
994  Pel* piOrg   = pcDtParam->pOrg;
995  Pel* piCur   = pcDtParam->pCur;
996  Int  iRows   = pcDtParam->iRows;
997  Int  iCols   = pcDtParam->iCols;
998  Int  iStrideOrg = pcDtParam->iStrideOrg;
999  Int  iStrideCur = pcDtParam->iStrideCur;
1000 
1001  UInt uiSum = 0;
1002  UInt uiShift = DISTORTION_PRECISION_ADJUSTMENT((pcDtParam->bitDepth-8) << 1);
1003 
1004  Int iTemp;
1005 
1006  for( ; iRows != 0; iRows-- )
1007  {
1008    for (Int n = 0; n < iCols; n++ )
1009    {
1010      iTemp = piOrg[] - piCur[];
1011      uiSum += ( iTemp * iTemp ) >> uiShift;
1012    }
1013    piOrg += iStrideOrg;
1014    piCur += iStrideCur;
1015  }
1016 
1017  return ( uiSum );
1018}
1019
1020UInt TComRdCost::xGetSSE4( DistParam* pcDtParam )
1021{
1022  if ( pcDtParam->bApplyWeight )
1023  {
1024    assert( pcDtParam->iCols == 4 );
1025    return xGetSSEw( pcDtParam );
1026  }
1027  Pel* piOrg   = pcDtParam->pOrg;
1028  Pel* piCur   = pcDtParam->pCur;
1029  Int  iRows   = pcDtParam->iRows;
1030  Int  iStrideOrg = pcDtParam->iStrideOrg;
1031  Int  iStrideCur = pcDtParam->iStrideCur;
1032 
1033  UInt uiSum = 0;
1034  UInt uiShift = DISTORTION_PRECISION_ADJUSTMENT((pcDtParam->bitDepth-8) << 1);
1035 
1036  Int  iTemp;
1037 
1038  for( ; iRows != 0; iRows-- )
1039  {
1040   
1041    iTemp = piOrg[0] - piCur[0]; uiSum += ( iTemp * iTemp ) >> uiShift;
1042    iTemp = piOrg[1] - piCur[1]; uiSum += ( iTemp * iTemp ) >> uiShift;
1043    iTemp = piOrg[2] - piCur[2]; uiSum += ( iTemp * iTemp ) >> uiShift;
1044    iTemp = piOrg[3] - piCur[3]; uiSum += ( iTemp * iTemp ) >> uiShift;
1045   
1046    piOrg += iStrideOrg;
1047    piCur += iStrideCur;
1048  }
1049 
1050  return ( uiSum );
1051}
1052
1053UInt TComRdCost::xGetSSE8( DistParam* pcDtParam )
1054{
1055  if ( pcDtParam->bApplyWeight )
1056  {
1057    assert( pcDtParam->iCols == 8 );
1058    return xGetSSEw( pcDtParam );
1059  }
1060  Pel* piOrg   = pcDtParam->pOrg;
1061  Pel* piCur   = pcDtParam->pCur;
1062  Int  iRows   = pcDtParam->iRows;
1063  Int  iStrideOrg = pcDtParam->iStrideOrg;
1064  Int  iStrideCur = pcDtParam->iStrideCur;
1065 
1066  UInt uiSum = 0;
1067  UInt uiShift = DISTORTION_PRECISION_ADJUSTMENT((pcDtParam->bitDepth-8) << 1);
1068 
1069  Int  iTemp;
1070 
1071  for( ; iRows != 0; iRows-- )
1072  {
1073    iTemp = piOrg[0] - piCur[0]; uiSum += ( iTemp * iTemp ) >> uiShift;
1074    iTemp = piOrg[1] - piCur[1]; uiSum += ( iTemp * iTemp ) >> uiShift;
1075    iTemp = piOrg[2] - piCur[2]; uiSum += ( iTemp * iTemp ) >> uiShift;
1076    iTemp = piOrg[3] - piCur[3]; uiSum += ( iTemp * iTemp ) >> uiShift;
1077    iTemp = piOrg[4] - piCur[4]; uiSum += ( iTemp * iTemp ) >> uiShift;
1078    iTemp = piOrg[5] - piCur[5]; uiSum += ( iTemp * iTemp ) >> uiShift;
1079    iTemp = piOrg[6] - piCur[6]; uiSum += ( iTemp * iTemp ) >> uiShift;
1080    iTemp = piOrg[7] - piCur[7]; uiSum += ( iTemp * iTemp ) >> uiShift;
1081   
1082    piOrg += iStrideOrg;
1083    piCur += iStrideCur;
1084  }
1085 
1086  return ( uiSum );
1087}
1088
1089UInt TComRdCost::xGetSSE16( DistParam* pcDtParam )
1090{
1091  if ( pcDtParam->bApplyWeight )
1092  {
1093    assert( pcDtParam->iCols == 16 );
1094    return xGetSSEw( pcDtParam );
1095  }
1096  Pel* piOrg   = pcDtParam->pOrg;
1097  Pel* piCur   = pcDtParam->pCur;
1098  Int  iRows   = pcDtParam->iRows;
1099  Int  iStrideOrg = pcDtParam->iStrideOrg;
1100  Int  iStrideCur = pcDtParam->iStrideCur;
1101 
1102  UInt uiSum = 0;
1103  UInt uiShift = DISTORTION_PRECISION_ADJUSTMENT((pcDtParam->bitDepth-8) << 1);
1104 
1105  Int  iTemp;
1106 
1107  for( ; iRows != 0; iRows-- )
1108  {
1109   
1110    iTemp = piOrg[ 0] - piCur[ 0]; uiSum += ( iTemp * iTemp ) >> uiShift;
1111    iTemp = piOrg[ 1] - piCur[ 1]; uiSum += ( iTemp * iTemp ) >> uiShift;
1112    iTemp = piOrg[ 2] - piCur[ 2]; uiSum += ( iTemp * iTemp ) >> uiShift;
1113    iTemp = piOrg[ 3] - piCur[ 3]; uiSum += ( iTemp * iTemp ) >> uiShift;
1114    iTemp = piOrg[ 4] - piCur[ 4]; uiSum += ( iTemp * iTemp ) >> uiShift;
1115    iTemp = piOrg[ 5] - piCur[ 5]; uiSum += ( iTemp * iTemp ) >> uiShift;
1116    iTemp = piOrg[ 6] - piCur[ 6]; uiSum += ( iTemp * iTemp ) >> uiShift;
1117    iTemp = piOrg[ 7] - piCur[ 7]; uiSum += ( iTemp * iTemp ) >> uiShift;
1118    iTemp = piOrg[ 8] - piCur[ 8]; uiSum += ( iTemp * iTemp ) >> uiShift;
1119    iTemp = piOrg[ 9] - piCur[ 9]; uiSum += ( iTemp * iTemp ) >> uiShift;
1120    iTemp = piOrg[10] - piCur[10]; uiSum += ( iTemp * iTemp ) >> uiShift;
1121    iTemp = piOrg[11] - piCur[11]; uiSum += ( iTemp * iTemp ) >> uiShift;
1122    iTemp = piOrg[12] - piCur[12]; uiSum += ( iTemp * iTemp ) >> uiShift;
1123    iTemp = piOrg[13] - piCur[13]; uiSum += ( iTemp * iTemp ) >> uiShift;
1124    iTemp = piOrg[14] - piCur[14]; uiSum += ( iTemp * iTemp ) >> uiShift;
1125    iTemp = piOrg[15] - piCur[15]; uiSum += ( iTemp * iTemp ) >> uiShift;
1126   
1127    piOrg += iStrideOrg;
1128    piCur += iStrideCur;
1129  }
1130 
1131  return ( uiSum );
1132}
1133
1134UInt TComRdCost::xGetSSE16N( DistParam* pcDtParam )
1135{
1136  if ( pcDtParam->bApplyWeight )
1137  {
1138    return xGetSSEw( pcDtParam );
1139  }
1140  Pel* piOrg   = pcDtParam->pOrg;
1141  Pel* piCur   = pcDtParam->pCur;
1142  Int  iRows   = pcDtParam->iRows;
1143  Int  iCols   = pcDtParam->iCols;
1144  Int  iStrideOrg = pcDtParam->iStrideOrg;
1145  Int  iStrideCur = pcDtParam->iStrideCur;
1146 
1147  UInt uiSum = 0;
1148  UInt uiShift = DISTORTION_PRECISION_ADJUSTMENT((pcDtParam->bitDepth-8) << 1);
1149  Int  iTemp;
1150 
1151  for( ; iRows != 0; iRows-- )
1152  {
1153    for (Int n = 0; n < iCols; n+=16 )
1154    {
1155     
1156      iTemp = piOrg[n+ 0] - piCur[n+ 0]; uiSum += ( iTemp * iTemp ) >> uiShift;
1157      iTemp = piOrg[n+ 1] - piCur[n+ 1]; uiSum += ( iTemp * iTemp ) >> uiShift;
1158      iTemp = piOrg[n+ 2] - piCur[n+ 2]; uiSum += ( iTemp * iTemp ) >> uiShift;
1159      iTemp = piOrg[n+ 3] - piCur[n+ 3]; uiSum += ( iTemp * iTemp ) >> uiShift;
1160      iTemp = piOrg[n+ 4] - piCur[n+ 4]; uiSum += ( iTemp * iTemp ) >> uiShift;
1161      iTemp = piOrg[n+ 5] - piCur[n+ 5]; uiSum += ( iTemp * iTemp ) >> uiShift;
1162      iTemp = piOrg[n+ 6] - piCur[n+ 6]; uiSum += ( iTemp * iTemp ) >> uiShift;
1163      iTemp = piOrg[n+ 7] - piCur[n+ 7]; uiSum += ( iTemp * iTemp ) >> uiShift;
1164      iTemp = piOrg[n+ 8] - piCur[n+ 8]; uiSum += ( iTemp * iTemp ) >> uiShift;
1165      iTemp = piOrg[n+ 9] - piCur[n+ 9]; uiSum += ( iTemp * iTemp ) >> uiShift;
1166      iTemp = piOrg[n+10] - piCur[n+10]; uiSum += ( iTemp * iTemp ) >> uiShift;
1167      iTemp = piOrg[n+11] - piCur[n+11]; uiSum += ( iTemp * iTemp ) >> uiShift;
1168      iTemp = piOrg[n+12] - piCur[n+12]; uiSum += ( iTemp * iTemp ) >> uiShift;
1169      iTemp = piOrg[n+13] - piCur[n+13]; uiSum += ( iTemp * iTemp ) >> uiShift;
1170      iTemp = piOrg[n+14] - piCur[n+14]; uiSum += ( iTemp * iTemp ) >> uiShift;
1171      iTemp = piOrg[n+15] - piCur[n+15]; uiSum += ( iTemp * iTemp ) >> uiShift;
1172     
1173    }
1174    piOrg += iStrideOrg;
1175    piCur += iStrideCur;
1176  }
1177 
1178  return ( uiSum );
1179}
1180
1181UInt TComRdCost::xGetSSE32( DistParam* pcDtParam )
1182{
1183  if ( pcDtParam->bApplyWeight )
1184  {
1185    assert( pcDtParam->iCols == 32 );
1186    return xGetSSEw( pcDtParam );
1187  }
1188  Pel* piOrg   = pcDtParam->pOrg;
1189  Pel* piCur   = pcDtParam->pCur;
1190  Int  iRows   = pcDtParam->iRows;
1191  Int  iStrideOrg = pcDtParam->iStrideOrg;
1192  Int  iStrideCur = pcDtParam->iStrideCur;
1193 
1194  UInt uiSum = 0;
1195  UInt uiShift = DISTORTION_PRECISION_ADJUSTMENT((pcDtParam->bitDepth-8) << 1);
1196  Int  iTemp;
1197 
1198  for( ; iRows != 0; iRows-- )
1199  {
1200   
1201    iTemp = piOrg[ 0] - piCur[ 0]; uiSum += ( iTemp * iTemp ) >> uiShift;
1202    iTemp = piOrg[ 1] - piCur[ 1]; uiSum += ( iTemp * iTemp ) >> uiShift;
1203    iTemp = piOrg[ 2] - piCur[ 2]; uiSum += ( iTemp * iTemp ) >> uiShift;
1204    iTemp = piOrg[ 3] - piCur[ 3]; uiSum += ( iTemp * iTemp ) >> uiShift;
1205    iTemp = piOrg[ 4] - piCur[ 4]; uiSum += ( iTemp * iTemp ) >> uiShift;
1206    iTemp = piOrg[ 5] - piCur[ 5]; uiSum += ( iTemp * iTemp ) >> uiShift;
1207    iTemp = piOrg[ 6] - piCur[ 6]; uiSum += ( iTemp * iTemp ) >> uiShift;
1208    iTemp = piOrg[ 7] - piCur[ 7]; uiSum += ( iTemp * iTemp ) >> uiShift;
1209    iTemp = piOrg[ 8] - piCur[ 8]; uiSum += ( iTemp * iTemp ) >> uiShift;
1210    iTemp = piOrg[ 9] - piCur[ 9]; uiSum += ( iTemp * iTemp ) >> uiShift;
1211    iTemp = piOrg[10] - piCur[10]; uiSum += ( iTemp * iTemp ) >> uiShift;
1212    iTemp = piOrg[11] - piCur[11]; uiSum += ( iTemp * iTemp ) >> uiShift;
1213    iTemp = piOrg[12] - piCur[12]; uiSum += ( iTemp * iTemp ) >> uiShift;
1214    iTemp = piOrg[13] - piCur[13]; uiSum += ( iTemp * iTemp ) >> uiShift;
1215    iTemp = piOrg[14] - piCur[14]; uiSum += ( iTemp * iTemp ) >> uiShift;
1216    iTemp = piOrg[15] - piCur[15]; uiSum += ( iTemp * iTemp ) >> uiShift;
1217    iTemp = piOrg[16] - piCur[16]; uiSum += ( iTemp * iTemp ) >> uiShift;
1218    iTemp = piOrg[17] - piCur[17]; uiSum += ( iTemp * iTemp ) >> uiShift;
1219    iTemp = piOrg[18] - piCur[18]; uiSum += ( iTemp * iTemp ) >> uiShift;
1220    iTemp = piOrg[19] - piCur[19]; uiSum += ( iTemp * iTemp ) >> uiShift;
1221    iTemp = piOrg[20] - piCur[20]; uiSum += ( iTemp * iTemp ) >> uiShift;
1222    iTemp = piOrg[21] - piCur[21]; uiSum += ( iTemp * iTemp ) >> uiShift;
1223    iTemp = piOrg[22] - piCur[22]; uiSum += ( iTemp * iTemp ) >> uiShift;
1224    iTemp = piOrg[23] - piCur[23]; uiSum += ( iTemp * iTemp ) >> uiShift;
1225    iTemp = piOrg[24] - piCur[24]; uiSum += ( iTemp * iTemp ) >> uiShift;
1226    iTemp = piOrg[25] - piCur[25]; uiSum += ( iTemp * iTemp ) >> uiShift;
1227    iTemp = piOrg[26] - piCur[26]; uiSum += ( iTemp * iTemp ) >> uiShift;
1228    iTemp = piOrg[27] - piCur[27]; uiSum += ( iTemp * iTemp ) >> uiShift;
1229    iTemp = piOrg[28] - piCur[28]; uiSum += ( iTemp * iTemp ) >> uiShift;
1230    iTemp = piOrg[29] - piCur[29]; uiSum += ( iTemp * iTemp ) >> uiShift;
1231    iTemp = piOrg[30] - piCur[30]; uiSum += ( iTemp * iTemp ) >> uiShift;
1232    iTemp = piOrg[31] - piCur[31]; uiSum += ( iTemp * iTemp ) >> uiShift;
1233   
1234    piOrg += iStrideOrg;
1235    piCur += iStrideCur;
1236  }
1237 
1238  return ( uiSum );
1239}
1240
1241UInt TComRdCost::xGetSSE64( DistParam* pcDtParam )
1242{
1243  if ( pcDtParam->bApplyWeight )
1244  {
1245    assert( pcDtParam->iCols == 64 );
1246    return xGetSSEw( pcDtParam );
1247  }
1248  Pel* piOrg   = pcDtParam->pOrg;
1249  Pel* piCur   = pcDtParam->pCur;
1250  Int  iRows   = pcDtParam->iRows;
1251  Int  iStrideOrg = pcDtParam->iStrideOrg;
1252  Int  iStrideCur = pcDtParam->iStrideCur;
1253 
1254  UInt uiSum = 0;
1255  UInt uiShift = DISTORTION_PRECISION_ADJUSTMENT((pcDtParam->bitDepth-8) << 1);
1256  Int  iTemp;
1257 
1258  for( ; iRows != 0; iRows-- )
1259  {
1260    iTemp = piOrg[ 0] - piCur[ 0]; uiSum += ( iTemp * iTemp ) >> uiShift;
1261    iTemp = piOrg[ 1] - piCur[ 1]; uiSum += ( iTemp * iTemp ) >> uiShift;
1262    iTemp = piOrg[ 2] - piCur[ 2]; uiSum += ( iTemp * iTemp ) >> uiShift;
1263    iTemp = piOrg[ 3] - piCur[ 3]; uiSum += ( iTemp * iTemp ) >> uiShift;
1264    iTemp = piOrg[ 4] - piCur[ 4]; uiSum += ( iTemp * iTemp ) >> uiShift;
1265    iTemp = piOrg[ 5] - piCur[ 5]; uiSum += ( iTemp * iTemp ) >> uiShift;
1266    iTemp = piOrg[ 6] - piCur[ 6]; uiSum += ( iTemp * iTemp ) >> uiShift;
1267    iTemp = piOrg[ 7] - piCur[ 7]; uiSum += ( iTemp * iTemp ) >> uiShift;
1268    iTemp = piOrg[ 8] - piCur[ 8]; uiSum += ( iTemp * iTemp ) >> uiShift;
1269    iTemp = piOrg[ 9] - piCur[ 9]; uiSum += ( iTemp * iTemp ) >> uiShift;
1270    iTemp = piOrg[10] - piCur[10]; uiSum += ( iTemp * iTemp ) >> uiShift;
1271    iTemp = piOrg[11] - piCur[11]; uiSum += ( iTemp * iTemp ) >> uiShift;
1272    iTemp = piOrg[12] - piCur[12]; uiSum += ( iTemp * iTemp ) >> uiShift;
1273    iTemp = piOrg[13] - piCur[13]; uiSum += ( iTemp * iTemp ) >> uiShift;
1274    iTemp = piOrg[14] - piCur[14]; uiSum += ( iTemp * iTemp ) >> uiShift;
1275    iTemp = piOrg[15] - piCur[15]; uiSum += ( iTemp * iTemp ) >> uiShift;
1276    iTemp = piOrg[16] - piCur[16]; uiSum += ( iTemp * iTemp ) >> uiShift;
1277    iTemp = piOrg[17] - piCur[17]; uiSum += ( iTemp * iTemp ) >> uiShift;
1278    iTemp = piOrg[18] - piCur[18]; uiSum += ( iTemp * iTemp ) >> uiShift;
1279    iTemp = piOrg[19] - piCur[19]; uiSum += ( iTemp * iTemp ) >> uiShift;
1280    iTemp = piOrg[20] - piCur[20]; uiSum += ( iTemp * iTemp ) >> uiShift;
1281    iTemp = piOrg[21] - piCur[21]; uiSum += ( iTemp * iTemp ) >> uiShift;
1282    iTemp = piOrg[22] - piCur[22]; uiSum += ( iTemp * iTemp ) >> uiShift;
1283    iTemp = piOrg[23] - piCur[23]; uiSum += ( iTemp * iTemp ) >> uiShift;
1284    iTemp = piOrg[24] - piCur[24]; uiSum += ( iTemp * iTemp ) >> uiShift;
1285    iTemp = piOrg[25] - piCur[25]; uiSum += ( iTemp * iTemp ) >> uiShift;
1286    iTemp = piOrg[26] - piCur[26]; uiSum += ( iTemp * iTemp ) >> uiShift;
1287    iTemp = piOrg[27] - piCur[27]; uiSum += ( iTemp * iTemp ) >> uiShift;
1288    iTemp = piOrg[28] - piCur[28]; uiSum += ( iTemp * iTemp ) >> uiShift;
1289    iTemp = piOrg[29] - piCur[29]; uiSum += ( iTemp * iTemp ) >> uiShift;
1290    iTemp = piOrg[30] - piCur[30]; uiSum += ( iTemp * iTemp ) >> uiShift;
1291    iTemp = piOrg[31] - piCur[31]; uiSum += ( iTemp * iTemp ) >> uiShift;
1292    iTemp = piOrg[32] - piCur[32]; uiSum += ( iTemp * iTemp ) >> uiShift;
1293    iTemp = piOrg[33] - piCur[33]; uiSum += ( iTemp * iTemp ) >> uiShift;
1294    iTemp = piOrg[34] - piCur[34]; uiSum += ( iTemp * iTemp ) >> uiShift;
1295    iTemp = piOrg[35] - piCur[35]; uiSum += ( iTemp * iTemp ) >> uiShift;
1296    iTemp = piOrg[36] - piCur[36]; uiSum += ( iTemp * iTemp ) >> uiShift;
1297    iTemp = piOrg[37] - piCur[37]; uiSum += ( iTemp * iTemp ) >> uiShift;
1298    iTemp = piOrg[38] - piCur[38]; uiSum += ( iTemp * iTemp ) >> uiShift;
1299    iTemp = piOrg[39] - piCur[39]; uiSum += ( iTemp * iTemp ) >> uiShift;
1300    iTemp = piOrg[40] - piCur[40]; uiSum += ( iTemp * iTemp ) >> uiShift;
1301    iTemp = piOrg[41] - piCur[41]; uiSum += ( iTemp * iTemp ) >> uiShift;
1302    iTemp = piOrg[42] - piCur[42]; uiSum += ( iTemp * iTemp ) >> uiShift;
1303    iTemp = piOrg[43] - piCur[43]; uiSum += ( iTemp * iTemp ) >> uiShift;
1304    iTemp = piOrg[44] - piCur[44]; uiSum += ( iTemp * iTemp ) >> uiShift;
1305    iTemp = piOrg[45] - piCur[45]; uiSum += ( iTemp * iTemp ) >> uiShift;
1306    iTemp = piOrg[46] - piCur[46]; uiSum += ( iTemp * iTemp ) >> uiShift;
1307    iTemp = piOrg[47] - piCur[47]; uiSum += ( iTemp * iTemp ) >> uiShift;
1308    iTemp = piOrg[48] - piCur[48]; uiSum += ( iTemp * iTemp ) >> uiShift;
1309    iTemp = piOrg[49] - piCur[49]; uiSum += ( iTemp * iTemp ) >> uiShift;
1310    iTemp = piOrg[50] - piCur[50]; uiSum += ( iTemp * iTemp ) >> uiShift;
1311    iTemp = piOrg[51] - piCur[51]; uiSum += ( iTemp * iTemp ) >> uiShift;
1312    iTemp = piOrg[52] - piCur[52]; uiSum += ( iTemp * iTemp ) >> uiShift;
1313    iTemp = piOrg[53] - piCur[53]; uiSum += ( iTemp * iTemp ) >> uiShift;
1314    iTemp = piOrg[54] - piCur[54]; uiSum += ( iTemp * iTemp ) >> uiShift;
1315    iTemp = piOrg[55] - piCur[55]; uiSum += ( iTemp * iTemp ) >> uiShift;
1316    iTemp = piOrg[56] - piCur[56]; uiSum += ( iTemp * iTemp ) >> uiShift;
1317    iTemp = piOrg[57] - piCur[57]; uiSum += ( iTemp * iTemp ) >> uiShift;
1318    iTemp = piOrg[58] - piCur[58]; uiSum += ( iTemp * iTemp ) >> uiShift;
1319    iTemp = piOrg[59] - piCur[59]; uiSum += ( iTemp * iTemp ) >> uiShift;
1320    iTemp = piOrg[60] - piCur[60]; uiSum += ( iTemp * iTemp ) >> uiShift;
1321    iTemp = piOrg[61] - piCur[61]; uiSum += ( iTemp * iTemp ) >> uiShift;
1322    iTemp = piOrg[62] - piCur[62]; uiSum += ( iTemp * iTemp ) >> uiShift;
1323    iTemp = piOrg[63] - piCur[63]; uiSum += ( iTemp * iTemp ) >> uiShift;
1324   
1325    piOrg += iStrideOrg;
1326    piCur += iStrideCur;
1327  }
1328 
1329  return ( uiSum );
1330}
1331
1332// --------------------------------------------------------------------------------------------------------------------
1333// HADAMARD with step (used in fractional search)
1334// --------------------------------------------------------------------------------------------------------------------
1335
1336UInt TComRdCost::xCalcHADs2x2( Pel *piOrg, Pel *piCur, Int iStrideOrg, Int iStrideCur, Int iStep )
1337{
1338  Int satd = 0, diff[4], m[4];
1339  assert( iStep == 1 );
1340  diff[0] = piOrg[0             ] - piCur[0];
1341  diff[1] = piOrg[1             ] - piCur[1];
1342  diff[2] = piOrg[iStrideOrg    ] - piCur[0 + iStrideCur];
1343  diff[3] = piOrg[iStrideOrg + 1] - piCur[1 + iStrideCur];
1344  m[0] = diff[0] + diff[2];
1345  m[1] = diff[1] + diff[3];
1346  m[2] = diff[0] - diff[2];
1347  m[3] = diff[1] - diff[3];
1348 
1349  satd += abs(m[0] + m[1]);
1350  satd += abs(m[0] - m[1]);
1351  satd += abs(m[2] + m[3]);
1352  satd += abs(m[2] - m[3]);
1353 
1354  return satd;
1355}
1356
1357UInt TComRdCost::xCalcHADs4x4( Pel *piOrg, Pel *piCur, Int iStrideOrg, Int iStrideCur, Int iStep )
1358{
1359  Int k, satd = 0, diff[16], m[16], d[16];
1360 
1361  assert( iStep == 1 );
1362  for( k = 0; k < 16; k+=4 )
1363  {
1364    diff[k+0] = piOrg[0] - piCur[0];
1365    diff[k+1] = piOrg[1] - piCur[1];
1366    diff[k+2] = piOrg[2] - piCur[2];
1367    diff[k+3] = piOrg[3] - piCur[3];
1368   
1369    piCur += iStrideCur;
1370    piOrg += iStrideOrg;
1371  }
1372 
1373  /*===== hadamard transform =====*/
1374  m[ 0] = diff[ 0] + diff[12];
1375  m[ 1] = diff[ 1] + diff[13];
1376  m[ 2] = diff[ 2] + diff[14];
1377  m[ 3] = diff[ 3] + diff[15];
1378  m[ 4] = diff[ 4] + diff[ 8];
1379  m[ 5] = diff[ 5] + diff[ 9];
1380  m[ 6] = diff[ 6] + diff[10];
1381  m[ 7] = diff[ 7] + diff[11];
1382  m[ 8] = diff[ 4] - diff[ 8];
1383  m[ 9] = diff[ 5] - diff[ 9];
1384  m[10] = diff[ 6] - diff[10];
1385  m[11] = diff[ 7] - diff[11];
1386  m[12] = diff[ 0] - diff[12];
1387  m[13] = diff[ 1] - diff[13];
1388  m[14] = diff[ 2] - diff[14];
1389  m[15] = diff[ 3] - diff[15];
1390 
1391  d[ 0] = m[ 0] + m[ 4];
1392  d[ 1] = m[ 1] + m[ 5];
1393  d[ 2] = m[ 2] + m[ 6];
1394  d[ 3] = m[ 3] + m[ 7];
1395  d[ 4] = m[ 8] + m[12];
1396  d[ 5] = m[ 9] + m[13];
1397  d[ 6] = m[10] + m[14];
1398  d[ 7] = m[11] + m[15];
1399  d[ 8] = m[ 0] - m[ 4];
1400  d[ 9] = m[ 1] - m[ 5];
1401  d[10] = m[ 2] - m[ 6];
1402  d[11] = m[ 3] - m[ 7];
1403  d[12] = m[12] - m[ 8];
1404  d[13] = m[13] - m[ 9];
1405  d[14] = m[14] - m[10];
1406  d[15] = m[15] - m[11];
1407 
1408  m[ 0] = d[ 0] + d[ 3];
1409  m[ 1] = d[ 1] + d[ 2];
1410  m[ 2] = d[ 1] - d[ 2];
1411  m[ 3] = d[ 0] - d[ 3];
1412  m[ 4] = d[ 4] + d[ 7];
1413  m[ 5] = d[ 5] + d[ 6];
1414  m[ 6] = d[ 5] - d[ 6];
1415  m[ 7] = d[ 4] - d[ 7];
1416  m[ 8] = d[ 8] + d[11];
1417  m[ 9] = d[ 9] + d[10];
1418  m[10] = d[ 9] - d[10];
1419  m[11] = d[ 8] - d[11];
1420  m[12] = d[12] + d[15];
1421  m[13] = d[13] + d[14];
1422  m[14] = d[13] - d[14];
1423  m[15] = d[12] - d[15];
1424 
1425  d[ 0] = m[ 0] + m[ 1];
1426  d[ 1] = m[ 0] - m[ 1];
1427  d[ 2] = m[ 2] + m[ 3];
1428  d[ 3] = m[ 3] - m[ 2];
1429  d[ 4] = m[ 4] + m[ 5];
1430  d[ 5] = m[ 4] - m[ 5];
1431  d[ 6] = m[ 6] + m[ 7];
1432  d[ 7] = m[ 7] - m[ 6];
1433  d[ 8] = m[ 8] + m[ 9];
1434  d[ 9] = m[ 8] - m[ 9];
1435  d[10] = m[10] + m[11];
1436  d[11] = m[11] - m[10];
1437  d[12] = m[12] + m[13];
1438  d[13] = m[12] - m[13];
1439  d[14] = m[14] + m[15];
1440  d[15] = m[15] - m[14];
1441 
1442  for (k=0; k<16; ++k)
1443  {
1444    satd += abs(d[k]);
1445  }
1446  satd = ((satd+1)>>1);
1447 
1448  return satd;
1449}
1450
1451UInt TComRdCost::xCalcHADs8x8( Pel *piOrg, Pel *piCur, Int iStrideOrg, Int iStrideCur, Int iStep )
1452{
1453  Int k, i, j, jj, sad=0;
1454  Int diff[64], m1[8][8], m2[8][8], m3[8][8];
1455  assert( iStep == 1 );
1456  for( k = 0; k < 64; k += 8 )
1457  {
1458    diff[k+0] = piOrg[0] - piCur[0];
1459    diff[k+1] = piOrg[1] - piCur[1];
1460    diff[k+2] = piOrg[2] - piCur[2];
1461    diff[k+3] = piOrg[3] - piCur[3];
1462    diff[k+4] = piOrg[4] - piCur[4];
1463    diff[k+5] = piOrg[5] - piCur[5];
1464    diff[k+6] = piOrg[6] - piCur[6];
1465    diff[k+7] = piOrg[7] - piCur[7];
1466   
1467    piCur += iStrideCur;
1468    piOrg += iStrideOrg;
1469  }
1470 
1471  //horizontal
1472  for (j=0; j < 8; j++)
1473  {
1474    jj = j << 3;
1475    m2[j][0] = diff[jj  ] + diff[jj+4];
1476    m2[j][1] = diff[jj+1] + diff[jj+5];
1477    m2[j][2] = diff[jj+2] + diff[jj+6];
1478    m2[j][3] = diff[jj+3] + diff[jj+7];
1479    m2[j][4] = diff[jj  ] - diff[jj+4];
1480    m2[j][5] = diff[jj+1] - diff[jj+5];
1481    m2[j][6] = diff[jj+2] - diff[jj+6];
1482    m2[j][7] = diff[jj+3] - diff[jj+7];
1483   
1484    m1[j][0] = m2[j][0] + m2[j][2];
1485    m1[j][1] = m2[j][1] + m2[j][3];
1486    m1[j][2] = m2[j][0] - m2[j][2];
1487    m1[j][3] = m2[j][1] - m2[j][3];
1488    m1[j][4] = m2[j][4] + m2[j][6];
1489    m1[j][5] = m2[j][5] + m2[j][7];
1490    m1[j][6] = m2[j][4] - m2[j][6];
1491    m1[j][7] = m2[j][5] - m2[j][7];
1492   
1493    m2[j][0] = m1[j][0] + m1[j][1];
1494    m2[j][1] = m1[j][0] - m1[j][1];
1495    m2[j][2] = m1[j][2] + m1[j][3];
1496    m2[j][3] = m1[j][2] - m1[j][3];
1497    m2[j][4] = m1[j][4] + m1[j][5];
1498    m2[j][5] = m1[j][4] - m1[j][5];
1499    m2[j][6] = m1[j][6] + m1[j][7];
1500    m2[j][7] = m1[j][6] - m1[j][7];
1501  }
1502 
1503  //vertical
1504  for (i=0; i < 8; i++)
1505  {
1506    m3[0][i] = m2[0][i] + m2[4][i];
1507    m3[1][i] = m2[1][i] + m2[5][i];
1508    m3[2][i] = m2[2][i] + m2[6][i];
1509    m3[3][i] = m2[3][i] + m2[7][i];
1510    m3[4][i] = m2[0][i] - m2[4][i];
1511    m3[5][i] = m2[1][i] - m2[5][i];
1512    m3[6][i] = m2[2][i] - m2[6][i];
1513    m3[7][i] = m2[3][i] - m2[7][i];
1514   
1515    m1[0][i] = m3[0][i] + m3[2][i];
1516    m1[1][i] = m3[1][i] + m3[3][i];
1517    m1[2][i] = m3[0][i] - m3[2][i];
1518    m1[3][i] = m3[1][i] - m3[3][i];
1519    m1[4][i] = m3[4][i] + m3[6][i];
1520    m1[5][i] = m3[5][i] + m3[7][i];
1521    m1[6][i] = m3[4][i] - m3[6][i];
1522    m1[7][i] = m3[5][i] - m3[7][i];
1523   
1524    m2[0][i] = m1[0][i] + m1[1][i];
1525    m2[1][i] = m1[0][i] - m1[1][i];
1526    m2[2][i] = m1[2][i] + m1[3][i];
1527    m2[3][i] = m1[2][i] - m1[3][i];
1528    m2[4][i] = m1[4][i] + m1[5][i];
1529    m2[5][i] = m1[4][i] - m1[5][i];
1530    m2[6][i] = m1[6][i] + m1[7][i];
1531    m2[7][i] = m1[6][i] - m1[7][i];
1532  }
1533 
1534  for (i = 0; i < 8; i++)
1535  {
1536    for (j = 0; j < 8; j++)
1537    {
1538      sad += abs(m2[i][j]);
1539    }
1540  }
1541 
1542  sad=((sad+2)>>2);
1543 
1544  return sad;
1545}
1546
1547UInt TComRdCost::xGetHADs4( DistParam* pcDtParam )
1548{
1549  if ( pcDtParam->bApplyWeight )
1550  {
1551    return xGetHADs4w( pcDtParam );
1552  }
1553  Pel* piOrg   = pcDtParam->pOrg;
1554  Pel* piCur   = pcDtParam->pCur;
1555  Int  iRows   = pcDtParam->iRows;
1556  Int  iStrideCur = pcDtParam->iStrideCur;
1557  Int  iStrideOrg = pcDtParam->iStrideOrg;
1558  Int  iStep  = pcDtParam->iStep;
1559  Int  y;
1560  Int  iOffsetOrg = iStrideOrg<<2;
1561  Int  iOffsetCur = iStrideCur<<2;
1562 
1563  UInt uiSum = 0;
1564 
1565  for ( y=0; y<iRows; y+= 4 )
1566  {
1567    uiSum += xCalcHADs4x4( piOrg, piCur, iStrideOrg, iStrideCur, iStep );
1568    piOrg += iOffsetOrg;
1569    piCur += iOffsetCur;
1570  }
1571 
1572  return uiSum >> DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8);
1573}
1574
1575UInt TComRdCost::xGetHADs8( DistParam* pcDtParam )
1576{
1577  if ( pcDtParam->bApplyWeight )
1578  {
1579    return xGetHADs8w( pcDtParam );
1580  }
1581  Pel* piOrg   = pcDtParam->pOrg;
1582  Pel* piCur   = pcDtParam->pCur;
1583  Int  iRows   = pcDtParam->iRows;
1584  Int  iStrideCur = pcDtParam->iStrideCur;
1585  Int  iStrideOrg = pcDtParam->iStrideOrg;
1586  Int  iStep  = pcDtParam->iStep;
1587  Int  y;
1588 
1589  UInt uiSum = 0;
1590 
1591  if ( iRows == 4 )
1592  {
1593    uiSum += xCalcHADs4x4( piOrg+0, piCur        , iStrideOrg, iStrideCur, iStep );
1594    uiSum += xCalcHADs4x4( piOrg+4, piCur+4*iStep, iStrideOrg, iStrideCur, iStep );
1595  }
1596  else
1597  {
1598    Int  iOffsetOrg = iStrideOrg<<3;
1599    Int  iOffsetCur = iStrideCur<<3;
1600    for ( y=0; y<iRows; y+= 8 )
1601    {
1602      uiSum += xCalcHADs8x8( piOrg, piCur, iStrideOrg, iStrideCur, iStep );
1603      piOrg += iOffsetOrg;
1604      piCur += iOffsetCur;
1605    }
1606  }
1607 
1608  return uiSum >> DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8);
1609}
1610
1611UInt TComRdCost::xGetHADs( DistParam* pcDtParam )
1612{
1613  if ( pcDtParam->bApplyWeight )
1614  {
1615    return xGetHADsw( pcDtParam );
1616  }
1617  Pel* piOrg   = pcDtParam->pOrg;
1618  Pel* piCur   = pcDtParam->pCur;
1619  Int  iRows   = pcDtParam->iRows;
1620  Int  iCols   = pcDtParam->iCols;
1621  Int  iStrideCur = pcDtParam->iStrideCur;
1622  Int  iStrideOrg = pcDtParam->iStrideOrg;
1623  Int  iStep  = pcDtParam->iStep;
1624 
1625  Int  x, y;
1626 
1627  UInt uiSum = 0;
1628 
1629  if( ( iRows % 8 == 0) && (iCols % 8 == 0) )
1630  {
1631    Int  iOffsetOrg = iStrideOrg<<3;
1632    Int  iOffsetCur = iStrideCur<<3;
1633    for ( y=0; y<iRows; y+= 8 )
1634    {
1635      for ( x=0; x<iCols; x+= 8 )
1636      {
1637        uiSum += xCalcHADs8x8( &piOrg[x], &piCur[x*iStep], iStrideOrg, iStrideCur, iStep );
1638      }
1639      piOrg += iOffsetOrg;
1640      piCur += iOffsetCur;
1641    }
1642  }
1643  else if( ( iRows % 4 == 0) && (iCols % 4 == 0) )
1644  {
1645    Int  iOffsetOrg = iStrideOrg<<2;
1646    Int  iOffsetCur = iStrideCur<<2;
1647   
1648    for ( y=0; y<iRows; y+= 4 )
1649    {
1650      for ( x=0; x<iCols; x+= 4 )
1651      {
1652        uiSum += xCalcHADs4x4( &piOrg[x], &piCur[x*iStep], iStrideOrg, iStrideCur, iStep );
1653      }
1654      piOrg += iOffsetOrg;
1655      piCur += iOffsetCur;
1656    }
1657  }
1658  else if( ( iRows % 2 == 0) && (iCols % 2 == 0) )
1659  {
1660    Int  iOffsetOrg = iStrideOrg<<1;
1661    Int  iOffsetCur = iStrideCur<<1;
1662    for ( y=0; y<iRows; y+=2 )
1663    {
1664      for ( x=0; x<iCols; x+=2 )
1665      {
1666        uiSum += xCalcHADs2x2( &piOrg[x], &piCur[x*iStep], iStrideOrg, iStrideCur, iStep );
1667      }
1668      piOrg += iOffsetOrg;
1669      piCur += iOffsetCur;
1670    }
1671  }
1672  else
1673  {
1674    assert(false);
1675  }
1676 
1677  return uiSum >> DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8);
1678}
1679
1680
1681
1682//! \}
Note: See TracBrowser for help on using the repository browser.