Changeset 56 in 3DVCSoftware for trunk/source/Lib/TLibCommon/TComWedgelet.cpp


Ignore:
Timestamp:
11 May 2012, 21:20:17 (12 years ago)
Author:
hschwarz
Message:

updated trunk (move to HM6.1)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/Lib/TLibCommon/TComWedgelet.cpp

    r5 r56  
    4343#include <memory.h>
    4444
     45using namespace std;
     46
    4547
    4648TComWedgelet::TComWedgelet( UInt uiWidth, UInt uiHeight ) : m_uhXs     ( 0 ),
     
    116118}
    117119
    118 Bool TComWedgelet::checkNotIdentical( Bool* pbRefPattern )
     120Bool TComWedgelet::checkIdentical( Bool* pbRefPattern )
    119121{
    120122  for( UInt k = 0; k < (m_uiWidth * m_uiHeight); k++ )
     
    122124    if( m_pbPattern[k] != pbRefPattern[k] )
    123125    {
    124       return true;
    125     }
    126   }
    127   return false;
    128 }
    129 
    130 Bool TComWedgelet::checkNotInvIdentical( Bool* pbRefPattern )
     126      return false;
     127    }
     128  }
     129  return true;
     130}
     131
     132Bool TComWedgelet::checkInvIdentical( Bool* pbRefPattern )
    131133{
    132134  for( UInt k = 0; k < (m_uiWidth * m_uiHeight); k++ )
     
    134136    if( m_pbPattern[k] == pbRefPattern[k] )
    135137    {
    136       return true;
    137     }
    138   }
    139   return false;
     138      return false;
     139    }
     140  }
     141  return true;
    140142}
    141143
     
    241243  ruhXe = 0;
    242244  ruhYe = 0;
    243   UInt uiContDOri;
    244245
    245246  // get start/end of reference (=this) wedgelet
     
    258259  case(   HALF_PEL ): { uiContDStartEndMax = (uiPredDirBlockSize<<1); uiContDStartEndOffset = (uiPredDirBlockOffset<<1); break; }
    259260  }
     261  Int iContDMaxPos = (Int)uiContDStartEndMax - 1;
    260262
    261263  // swap if start/end if line orientation is not from top to bottom
     
    288290    if( iXe < 0 )
    289291    {
    290       uiContDOri = 0;
    291292      ruhXe = 0;
    292       ruhYe = (UChar)Min( Max( ((uiContDStartEndMax-1) + iXe), 0 ), (uiContDStartEndMax-1) );
    293 
    294       return;
    295     }
    296     else if( iXe > (uiContDStartEndMax-1) )
    297     {
    298       uiContDOri = 1;
    299       ruhXe = (UChar)(uiContDStartEndMax-1);
    300       ruhYe = (UChar)Min( Max( ((uiContDStartEndMax-1) - (iXe - (uiContDStartEndMax-1))), 0 ), (uiContDStartEndMax-1) );
     293      ruhYe = (UChar)min( max( (iContDMaxPos + iXe), 0 ), iContDMaxPos );
     294
     295      return;
     296    }
     297    else if( iXe > iContDMaxPos )
     298    {
     299      ruhXe = (UChar)iContDMaxPos;
     300      ruhYe = (UChar)min( max( (iContDMaxPos - (iXe - iContDMaxPos)), 0 ), iContDMaxPos );
    301301
    302302      std::swap( ruhXs, ruhXe );
     
    306306    else
    307307    {
    308       uiContDOri = 4;
    309308      ruhXe = (UChar)iXe;
    310       ruhYe = (UChar)(uiContDStartEndMax-1);
     309      ruhYe = (UChar)iContDMaxPos;
    311310
    312311      return;
     
    321320    case( 2 ):
    322321      {
    323         uiContDOri = 0;
    324322        ruhXs = (UChar)(iAlignedRefEndX-1);
    325323        ruhYs = 0;
    326324        ruhXe = 0;
    327         ruhYe = (UChar)Min( Max( iDeltaEnd, 0 ), (uiContDStartEndMax-1) );
     325        ruhYe = (UChar)min( max( iDeltaEnd, 0 ), iContDMaxPos );
    328326
    329327        return;
     
    331329    case( 3 ):
    332330      {
    333         uiContDOri = 1;
    334331        ruhXs = (UChar)(iAlignedRefEndX+1);
    335332        ruhYs = 0;
    336         ruhXe = (UChar)(uiContDStartEndMax-1);
    337         ruhYe = (UChar)Min( Max( -iDeltaEnd, 0 ), (uiContDStartEndMax-1) );
     333        ruhXe = (UChar)iContDMaxPos;
     334        ruhYe = (UChar)min( max( -iDeltaEnd, 0 ), iContDMaxPos );
    338335
    339336        std::swap( ruhXs, ruhXe );
     
    355352
    356353  // calc end point and determine orientation
    357   Int iVirtualEndX = (Int)ruhXs + roftoi( (Double)(uiContDStartEndMax-1) * ((Double)iA_DeltaX / (Double)iA_DeltaY) );
     354  Int iVirtualEndX = (Int)ruhXs + roftoi( (Double)iContDMaxPos * ((Double)iA_DeltaX / (Double)iA_DeltaY) );
    358355
    359356  if( iVirtualEndX < 0 )
     
    362359    if( iYe < (Int)uiContDStartEndMax )
    363360    {
    364       uiContDOri = 0;
    365361      ruhXe = 0;
    366       ruhYe = (UChar)Max( iYe, 0 );
     362      ruhYe = (UChar)max( iYe, 0 );
    367363
    368364      return;
     
    370366    else
    371367    {
    372       uiContDOri = 4;
    373       ruhXe = (UChar)Min( (iYe - (uiContDStartEndMax-1)), (uiContDStartEndMax-1) );
    374       ruhYe = (UChar)(uiContDStartEndMax-1);
    375 
    376       return;
    377     }
    378   }
    379   else if( iVirtualEndX > (uiContDStartEndMax-1) )
    380   {
    381     Int iYe = roftoi( (Double)((Int)(uiContDStartEndMax-1) - (Int)ruhXs) * ((Double)iA_DeltaY / (Double)iA_DeltaX) ) - iDeltaEnd;
     368      ruhXe = (UChar)min( (iYe - iContDMaxPos), iContDMaxPos );
     369      ruhYe = (UChar)iContDMaxPos;
     370
     371      return;
     372    }
     373  }
     374  else if( iVirtualEndX > iContDMaxPos )
     375  {
     376    Int iYe = roftoi( (Double)(iContDMaxPos - (Int)ruhXs) * ((Double)iA_DeltaY / (Double)iA_DeltaX) ) - iDeltaEnd;
    382377    if( iYe < (Int)uiContDStartEndMax )
    383378    {
    384       uiContDOri = 1;
    385       ruhXe = (UChar)(uiContDStartEndMax-1);
    386       ruhYe = (UChar)Max( iYe, 0 );
     379      ruhXe = (UChar)iContDMaxPos;
     380      ruhYe = (UChar)max( iYe, 0 );
    387381
    388382      std::swap( ruhXs, ruhXe );
     
    392386    else
    393387    {
    394       uiContDOri = 4;
    395       ruhXe = (UChar)Max( ((uiContDStartEndMax-1) - (iYe - (uiContDStartEndMax-1))), 0 );
    396       ruhYe = (UChar)(uiContDStartEndMax-1);
     388      ruhXe = (UChar)max( (iContDMaxPos - (iYe - iContDMaxPos)), 0 );
     389      ruhYe = (UChar)iContDMaxPos;
    397390
    398391      return;
     
    404397    if( iXe < 0 )
    405398    {
    406       uiContDOri = 0;
    407399      ruhXe = 0;
    408       ruhYe = (UChar)Max( ((uiContDStartEndMax-1) + iXe), 0 );
    409 
    410       return;
    411     }
    412     else if( iXe > (uiContDStartEndMax-1) )
    413     {
    414       uiContDOri = 1;
    415       ruhXe = (UChar)(uiContDStartEndMax-1);
    416       ruhYe = (UChar)Max( ((uiContDStartEndMax-1) - (iXe - (uiContDStartEndMax-1))), 0 );
     400      ruhYe = (UChar)max( (iContDMaxPos + iXe), 0 );
     401
     402      return;
     403    }
     404    else if( iXe > iContDMaxPos )
     405    {
     406      ruhXe = (UChar)iContDMaxPos;
     407      ruhYe = (UChar)max( (iContDMaxPos - (iXe - iContDMaxPos)), 0 );
    417408
    418409      std::swap( ruhXs, ruhXe );
     
    422413    else
    423414    {
    424       uiContDOri = 4;
    425415      ruhXe = (UChar)iXe;
    426       ruhYe = (UChar)(uiContDStartEndMax-1);
     416      ruhYe = (UChar)iContDMaxPos;
    427417
    428418      return;
     
    437427  ruhXe = 0;
    438428  ruhYe = 0;
    439   UInt uiContDOri;
    440429
    441430  // get start/end of reference (=this) wedgelet
     
    454443  case(   HALF_PEL ): { uiContDStartEndMax = (uiPredDirBlockSize<<1); uiContDStartEndOffset = (uiPredDirBlockOffset<<1); break; }
    455444  }
     445  Int iContDMaxPos = (Int)uiContDStartEndMax - 1;
    456446
    457447  // swap if start/end if line orientation is not from left to right
     
    482472    if( iYe < 0 )
    483473    {
    484       uiContDOri = 0;
    485       ruhXe = (UChar)Min( Max( ((uiContDStartEndMax-1) + iYe), 0 ), (uiContDStartEndMax-1) );
     474      ruhXe = (UChar)min( max( (iContDMaxPos + iYe), 0 ), iContDMaxPos );
    486475      ruhYe = 0;
    487476
     
    490479      return;
    491480    }
    492     else if( iYe > (uiContDStartEndMax-1) )
    493     {
    494       uiContDOri = 3;
    495       ruhXe = (UChar)Min( Max( ((uiContDStartEndMax-1) - (iYe - (uiContDStartEndMax-1))), 0 ), (uiContDStartEndMax-1) );
    496       ruhYe = (UChar)(uiContDStartEndMax-1);
     481    else if( iYe > iContDMaxPos )
     482    {
     483      ruhXe = (UChar)min( max( (iContDMaxPos - (iYe - iContDMaxPos)), 0 ), iContDMaxPos );
     484      ruhYe = (UChar)iContDMaxPos;
    497485
    498486      return;
     
    500488    else
    501489    {
    502       uiContDOri = 5;
    503       ruhXe = (UChar)(uiContDStartEndMax-1);
     490      ruhXe = (UChar)iContDMaxPos;
    504491      ruhYe = (UChar)iYe;
    505492
     
    517504    case( 1 ):
    518505      {
    519         uiContDOri = 3;
    520506        ruhXs = 0;
    521507        ruhYs = (UChar)(iAlignedRefEndY+1);
    522         ruhXe = (UChar)Min( Max( iDeltaEnd, 0 ), (uiContDStartEndMax-1) );
    523         ruhYe = (UChar)(uiContDStartEndMax-1);
     508        ruhXe = (UChar)min( max( iDeltaEnd, 0 ), iContDMaxPos );
     509        ruhYe = (UChar)iContDMaxPos;
    524510
    525511        return;
     
    527513    case( 2 ):
    528514      {
    529         uiContDOri = 0;
    530515        ruhXs = 0;
    531516        ruhYs = (UChar)(iAlignedRefEndY-1);
    532         ruhXe = (UChar)Min( Max( -iDeltaEnd, 0 ), (uiContDStartEndMax-1) );
     517        ruhXe = (UChar)min( max( -iDeltaEnd, 0 ), iContDMaxPos );
    533518        ruhYe = 0;
    534519
     
    551536
    552537  // calc end point and determine orientation
    553   Int iVirtualEndY = (Int)ruhYs + roftoi( (Double)(uiContDStartEndMax-1) * ((Double)iL_DeltaY / (Double)iL_DeltaX) );
     538  Int iVirtualEndY = (Int)ruhYs + roftoi( (Double)iContDMaxPos * ((Double)iL_DeltaY / (Double)iL_DeltaX) );
    554539
    555540  if( iVirtualEndY < 0 )
     
    558543    if( iXe < (Int)uiContDStartEndMax )
    559544    {
    560       uiContDOri = 0;
    561       ruhXe = (UChar)Max( iXe, 0 );
     545      ruhXe = (UChar)max( iXe, 0 );
    562546      ruhYe = 0;
    563547
     
    568552    else
    569553    {
    570       uiContDOri = 5;
    571       ruhXe = (UChar)(uiContDStartEndMax-1);
    572       ruhYe = (UChar)Min( (iXe - (uiContDStartEndMax-1)), (uiContDStartEndMax-1) );
     554      ruhXe = (UChar)iContDMaxPos;
     555      ruhYe = (UChar)min( (iXe - iContDMaxPos), iContDMaxPos );
    573556
    574557      std::swap( ruhXs, ruhXe );
     
    577560    }
    578561  }
    579   else if( iVirtualEndY > (uiContDStartEndMax-1) )
    580   {
    581     Int iXe = roftoi( (Double)((Int)(uiContDStartEndMax-1) - (Int)ruhYs ) * ((Double)iL_DeltaX / (Double)iL_DeltaY) ) + iDeltaEnd;
     562  else if( iVirtualEndY > iContDMaxPos )
     563  {
     564    Int iXe = roftoi( (Double)(iContDMaxPos - (Int)ruhYs ) * ((Double)iL_DeltaX / (Double)iL_DeltaY) ) + iDeltaEnd;
    582565    if( iXe < (Int)uiContDStartEndMax )
    583566    {
    584       uiContDOri = 3;
    585       ruhXe = (UChar)Max( iXe, 0 );
    586       ruhYe = (UChar)(uiContDStartEndMax-1);
     567      ruhXe = (UChar)max( iXe, 0 );
     568      ruhYe = (UChar)iContDMaxPos;
    587569
    588570      return;
     
    590572    else
    591573    {
    592       uiContDOri = 5;
    593       ruhXe = (UChar)(uiContDStartEndMax-1);
    594       ruhYe = (UChar)Max( ((uiContDStartEndMax-1) - (iXe - (uiContDStartEndMax-1))), 0 );
     574      ruhXe = (UChar)iContDMaxPos;
     575      ruhYe = (UChar)max( (iContDMaxPos - (iXe - iContDMaxPos)), 0 );
    595576
    596577      std::swap( ruhXs, ruhXe );
     
    604585    if( iYe < 0 )
    605586    {
    606       uiContDOri = 0;
    607       ruhXe = (UChar)Max( ((uiContDStartEndMax-1) + iYe), 0 );
     587      ruhXe = (UChar)max( (iContDMaxPos + iYe), 0 );
    608588      ruhYe = 0;
    609589
     
    612592      return;
    613593    }
    614     else if( iYe > (uiContDStartEndMax-1) )
    615     {
    616       uiContDOri = 3;
    617       ruhXe = (UChar)Max( ((uiContDStartEndMax-1) - (iYe - (uiContDStartEndMax-1))), 0 );
    618       ruhYe = (UChar)(uiContDStartEndMax-1);
     594    else if( iYe > iContDMaxPos )
     595    {
     596      ruhXe = (UChar)max( (iContDMaxPos - (iYe - iContDMaxPos)), 0 );
     597      ruhYe = (UChar)iContDMaxPos;
    619598
    620599      return;
     
    622601    else
    623602    {
    624       uiContDOri = 5;
    625       ruhXe = (UChar)(uiContDStartEndMax-1);
     603      ruhXe = (UChar)iContDMaxPos;
    626604      ruhYe = (UChar)iYe;
    627605
     
    666644  case( 2 ): { for( UInt iX = uiTempBlockSize-1; iX > uhXs;            iX-- ) { UInt iY = uiTempBlockSize-1; while( pbTempPattern[(iY * iTempStride) + iX] == false ) { pbTempPattern[(iY * iTempStride) + iX] = true; iY--; } } } break;
    667645  case( 3 ): { for( UInt iY = uiTempBlockSize-1; iY > uhYs;            iY-- ) { UInt iX = 0;                 while( pbTempPattern[(iY * iTempStride) + iX] == false ) { pbTempPattern[(iY * iTempStride) + iX] = true; iX++; } } } break;
    668   case( 4 ): { for( UInt iY = 0;                 iY < uiTempBlockSize; iY++ ) { UInt iX = 0;                 while( pbTempPattern[(iY * iTempStride) + iX] == false ) { pbTempPattern[(iY * iTempStride) + iX] = true; iX++; } } } break;
    669   case( 5 ): { for( UInt iX = 0;                 iX < uiTempBlockSize; iX++ ) { UInt iY = 0;                 while( pbTempPattern[(iY * iTempStride) + iX] == false ) { pbTempPattern[(iY * iTempStride) + iX] = true; iY++; } } } break;
     646  case( 4 ): { for( UInt iY = 0;               iY < uiTempBlockSize; iY++ ) { UInt iX = 0;                 while( pbTempPattern[(iY * iTempStride) + iX] == false ) { pbTempPattern[(iY * iTempStride) + iX] = true; iX++; } } } break;
     647  case( 5 ): { for( UInt iX = 0;               iX < uiTempBlockSize; iX++ ) { UInt iY = 0;                 while( pbTempPattern[(iY * iTempStride) + iX] == false ) { pbTempPattern[(iY * iTempStride) + iX] = true; iY++; } } } break;
    670648  }
    671649
     
    754732  }
    755733}
     734
     735#if HHI_DMM_PRED_TEX
     736TComWedgeDist::TComWedgeDist()
     737{
     738  init();
     739}
     740
     741TComWedgeDist::~TComWedgeDist()
     742{
     743}
     744
     745Void TComWedgeDist::init()
     746{
     747  m_afpDistortFunc[0] = TComWedgeDist::xGetSAD4;
     748  m_afpDistortFunc[1] = TComWedgeDist::xGetSAD8;
     749  m_afpDistortFunc[2] = TComWedgeDist::xGetSAD16;
     750  m_afpDistortFunc[3] = TComWedgeDist::xGetSAD32;
     751
     752  m_afpDistortFunc[4] = TComWedgeDist::xGetSSE4;
     753  m_afpDistortFunc[5] = TComWedgeDist::xGetSSE8;
     754  m_afpDistortFunc[6] = TComWedgeDist::xGetSSE16;
     755  m_afpDistortFunc[7] = TComWedgeDist::xGetSSE32;
     756}
     757
     758UInt TComWedgeDist::xGetSAD4( WedgeDistParam* pcDtParam )
     759{
     760  Pel* piOrg   = pcDtParam->pOrg;
     761  Pel* piCur   = pcDtParam->pCur;
     762  Int  iRows   = pcDtParam->iRows;
     763  Int  iSubShift  = pcDtParam->iSubShift;
     764  Int  iSubStep   = ( 1 << iSubShift );
     765  Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
     766  Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
     767
     768  UInt uiSum = 0;
     769
     770  for( ; iRows != 0; iRows-=iSubStep )
     771  {
     772    uiSum += abs( piOrg[0] - piCur[0] );
     773    uiSum += abs( piOrg[1] - piCur[1] );
     774    uiSum += abs( piOrg[2] - piCur[2] );
     775    uiSum += abs( piOrg[3] - piCur[3] );
     776
     777    piOrg += iStrideOrg;
     778    piCur += iStrideCur;
     779  }
     780
     781  uiSum <<= iSubShift;
     782  return ( uiSum >> g_uiBitIncrement );
     783}
     784
     785UInt TComWedgeDist::xGetSAD8( WedgeDistParam* pcDtParam )
     786{
     787  Pel* piOrg      = pcDtParam->pOrg;
     788  Pel* piCur      = pcDtParam->pCur;
     789  Int  iRows      = pcDtParam->iRows;
     790  Int  iSubShift  = pcDtParam->iSubShift;
     791  Int  iSubStep   = ( 1 << iSubShift );
     792  Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
     793  Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
     794
     795  UInt uiSum = 0;
     796
     797  for( ; iRows != 0; iRows-=iSubStep )
     798  {
     799    uiSum += abs( piOrg[0] - piCur[0] );
     800    uiSum += abs( piOrg[1] - piCur[1] );
     801    uiSum += abs( piOrg[2] - piCur[2] );
     802    uiSum += abs( piOrg[3] - piCur[3] );
     803    uiSum += abs( piOrg[4] - piCur[4] );
     804    uiSum += abs( piOrg[5] - piCur[5] );
     805    uiSum += abs( piOrg[6] - piCur[6] );
     806    uiSum += abs( piOrg[7] - piCur[7] );
     807
     808    piOrg += iStrideOrg;
     809    piCur += iStrideCur;
     810  }
     811
     812  uiSum <<= iSubShift;
     813  return ( uiSum >> g_uiBitIncrement );
     814}
     815
     816UInt TComWedgeDist::xGetSAD16( WedgeDistParam* pcDtParam )
     817{
     818  Pel* piOrg   = pcDtParam->pOrg;
     819  Pel* piCur   = pcDtParam->pCur;
     820  Int  iRows   = pcDtParam->iRows;
     821  Int  iSubShift  = pcDtParam->iSubShift;
     822  Int  iSubStep   = ( 1 << iSubShift );
     823  Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
     824  Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
     825
     826  UInt uiSum = 0;
     827
     828  for( ; iRows != 0; iRows-=iSubStep )
     829  {
     830    uiSum += abs( piOrg[0] - piCur[0] );
     831    uiSum += abs( piOrg[1] - piCur[1] );
     832    uiSum += abs( piOrg[2] - piCur[2] );
     833    uiSum += abs( piOrg[3] - piCur[3] );
     834    uiSum += abs( piOrg[4] - piCur[4] );
     835    uiSum += abs( piOrg[5] - piCur[5] );
     836    uiSum += abs( piOrg[6] - piCur[6] );
     837    uiSum += abs( piOrg[7] - piCur[7] );
     838    uiSum += abs( piOrg[8] - piCur[8] );
     839    uiSum += abs( piOrg[9] - piCur[9] );
     840    uiSum += abs( piOrg[10] - piCur[10] );
     841    uiSum += abs( piOrg[11] - piCur[11] );
     842    uiSum += abs( piOrg[12] - piCur[12] );
     843    uiSum += abs( piOrg[13] - piCur[13] );
     844    uiSum += abs( piOrg[14] - piCur[14] );
     845    uiSum += abs( piOrg[15] - piCur[15] );
     846
     847    piOrg += iStrideOrg;
     848    piCur += iStrideCur;
     849  }
     850
     851  uiSum <<= iSubShift;
     852  return ( uiSum >> g_uiBitIncrement );
     853}
     854
     855UInt TComWedgeDist::xGetSAD32( WedgeDistParam* pcDtParam )
     856{
     857  Pel* piOrg   = pcDtParam->pOrg;
     858  Pel* piCur   = pcDtParam->pCur;
     859  Int  iRows   = pcDtParam->iRows;
     860  Int  iSubShift  = pcDtParam->iSubShift;
     861  Int  iSubStep   = ( 1 << iSubShift );
     862  Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
     863  Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
     864
     865  UInt uiSum = 0;
     866
     867  for( ; iRows != 0; iRows-=iSubStep )
     868  {
     869    uiSum += abs( piOrg[0] - piCur[0] );
     870    uiSum += abs( piOrg[1] - piCur[1] );
     871    uiSum += abs( piOrg[2] - piCur[2] );
     872    uiSum += abs( piOrg[3] - piCur[3] );
     873    uiSum += abs( piOrg[4] - piCur[4] );
     874    uiSum += abs( piOrg[5] - piCur[5] );
     875    uiSum += abs( piOrg[6] - piCur[6] );
     876    uiSum += abs( piOrg[7] - piCur[7] );
     877    uiSum += abs( piOrg[8] - piCur[8] );
     878    uiSum += abs( piOrg[9] - piCur[9] );
     879    uiSum += abs( piOrg[10] - piCur[10] );
     880    uiSum += abs( piOrg[11] - piCur[11] );
     881    uiSum += abs( piOrg[12] - piCur[12] );
     882    uiSum += abs( piOrg[13] - piCur[13] );
     883    uiSum += abs( piOrg[14] - piCur[14] );
     884    uiSum += abs( piOrg[15] - piCur[15] );
     885    uiSum += abs( piOrg[16] - piCur[16] );
     886    uiSum += abs( piOrg[17] - piCur[17] );
     887    uiSum += abs( piOrg[18] - piCur[18] );
     888    uiSum += abs( piOrg[19] - piCur[19] );
     889    uiSum += abs( piOrg[20] - piCur[20] );
     890    uiSum += abs( piOrg[21] - piCur[21] );
     891    uiSum += abs( piOrg[22] - piCur[22] );
     892    uiSum += abs( piOrg[23] - piCur[23] );
     893    uiSum += abs( piOrg[24] - piCur[24] );
     894    uiSum += abs( piOrg[25] - piCur[25] );
     895    uiSum += abs( piOrg[26] - piCur[26] );
     896    uiSum += abs( piOrg[27] - piCur[27] );
     897    uiSum += abs( piOrg[28] - piCur[28] );
     898    uiSum += abs( piOrg[29] - piCur[29] );
     899    uiSum += abs( piOrg[30] - piCur[30] );
     900    uiSum += abs( piOrg[31] - piCur[31] );
     901
     902    piOrg += iStrideOrg;
     903    piCur += iStrideCur;
     904  }
     905
     906  uiSum <<= iSubShift;
     907  return ( uiSum >> g_uiBitIncrement );
     908}
     909
     910UInt TComWedgeDist::xGetSSE4( WedgeDistParam* pcDtParam )
     911{
     912  Pel* piOrg   = pcDtParam->pOrg;
     913  Pel* piCur   = pcDtParam->pCur;
     914  Int  iRows   = pcDtParam->iRows;
     915  Int  iStrideOrg = pcDtParam->iStrideOrg;
     916  Int  iStrideCur = pcDtParam->iStrideCur;
     917
     918  UInt uiSum = 0;
     919  UInt uiShift = g_uiBitIncrement<<1;
     920
     921  Int  iTemp;
     922
     923  for( ; iRows != 0; iRows-- )
     924  {
     925
     926    iTemp = piOrg[0] - piCur[0]; uiSum += ( iTemp * iTemp ) >> uiShift;
     927    iTemp = piOrg[1] - piCur[1]; uiSum += ( iTemp * iTemp ) >> uiShift;
     928    iTemp = piOrg[2] - piCur[2]; uiSum += ( iTemp * iTemp ) >> uiShift;
     929    iTemp = piOrg[3] - piCur[3]; uiSum += ( iTemp * iTemp ) >> uiShift;
     930
     931    piOrg += iStrideOrg;
     932    piCur += iStrideCur;
     933  }
     934
     935  return ( uiSum );
     936}
     937
     938UInt TComWedgeDist::xGetSSE8( WedgeDistParam* pcDtParam )
     939{
     940  Pel* piOrg   = pcDtParam->pOrg;
     941  Pel* piCur   = pcDtParam->pCur;
     942  Int  iRows   = pcDtParam->iRows;
     943  Int  iStrideOrg = pcDtParam->iStrideOrg;
     944  Int  iStrideCur = pcDtParam->iStrideCur;
     945
     946  UInt uiSum = 0;
     947  UInt uiShift = g_uiBitIncrement<<1;
     948
     949  Int  iTemp;
     950
     951  for( ; iRows != 0; iRows-- )
     952  {
     953    iTemp = piOrg[0] - piCur[0]; uiSum += ( iTemp * iTemp ) >> uiShift;
     954    iTemp = piOrg[1] - piCur[1]; uiSum += ( iTemp * iTemp ) >> uiShift;
     955    iTemp = piOrg[2] - piCur[2]; uiSum += ( iTemp * iTemp ) >> uiShift;
     956    iTemp = piOrg[3] - piCur[3]; uiSum += ( iTemp * iTemp ) >> uiShift;
     957    iTemp = piOrg[4] - piCur[4]; uiSum += ( iTemp * iTemp ) >> uiShift;
     958    iTemp = piOrg[5] - piCur[5]; uiSum += ( iTemp * iTemp ) >> uiShift;
     959    iTemp = piOrg[6] - piCur[6]; uiSum += ( iTemp * iTemp ) >> uiShift;
     960    iTemp = piOrg[7] - piCur[7]; uiSum += ( iTemp * iTemp ) >> uiShift;
     961
     962    piOrg += iStrideOrg;
     963    piCur += iStrideCur;
     964  }
     965
     966  return ( uiSum );
     967}
     968
     969UInt TComWedgeDist::xGetSSE16( WedgeDistParam* pcDtParam )
     970{
     971  Pel* piOrg   = pcDtParam->pOrg;
     972  Pel* piCur   = pcDtParam->pCur;
     973  Int  iRows   = pcDtParam->iRows;
     974  Int  iStrideOrg = pcDtParam->iStrideOrg;
     975  Int  iStrideCur = pcDtParam->iStrideCur;
     976
     977  UInt uiSum = 0;
     978  UInt uiShift = g_uiBitIncrement<<1;
     979
     980  Int  iTemp;
     981
     982  for( ; iRows != 0; iRows-- )
     983  {
     984
     985    iTemp = piOrg[ 0] - piCur[ 0]; uiSum += ( iTemp * iTemp ) >> uiShift;
     986    iTemp = piOrg[ 1] - piCur[ 1]; uiSum += ( iTemp * iTemp ) >> uiShift;
     987    iTemp = piOrg[ 2] - piCur[ 2]; uiSum += ( iTemp * iTemp ) >> uiShift;
     988    iTemp = piOrg[ 3] - piCur[ 3]; uiSum += ( iTemp * iTemp ) >> uiShift;
     989    iTemp = piOrg[ 4] - piCur[ 4]; uiSum += ( iTemp * iTemp ) >> uiShift;
     990    iTemp = piOrg[ 5] - piCur[ 5]; uiSum += ( iTemp * iTemp ) >> uiShift;
     991    iTemp = piOrg[ 6] - piCur[ 6]; uiSum += ( iTemp * iTemp ) >> uiShift;
     992    iTemp = piOrg[ 7] - piCur[ 7]; uiSum += ( iTemp * iTemp ) >> uiShift;
     993    iTemp = piOrg[ 8] - piCur[ 8]; uiSum += ( iTemp * iTemp ) >> uiShift;
     994    iTemp = piOrg[ 9] - piCur[ 9]; uiSum += ( iTemp * iTemp ) >> uiShift;
     995    iTemp = piOrg[10] - piCur[10]; uiSum += ( iTemp * iTemp ) >> uiShift;
     996    iTemp = piOrg[11] - piCur[11]; uiSum += ( iTemp * iTemp ) >> uiShift;
     997    iTemp = piOrg[12] - piCur[12]; uiSum += ( iTemp * iTemp ) >> uiShift;
     998    iTemp = piOrg[13] - piCur[13]; uiSum += ( iTemp * iTemp ) >> uiShift;
     999    iTemp = piOrg[14] - piCur[14]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1000    iTemp = piOrg[15] - piCur[15]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1001
     1002    piOrg += iStrideOrg;
     1003    piCur += iStrideCur;
     1004  }
     1005
     1006  return ( uiSum );
     1007}
     1008
     1009UInt TComWedgeDist::xGetSSE32( WedgeDistParam* pcDtParam )
     1010{
     1011  Pel* piOrg   = pcDtParam->pOrg;
     1012  Pel* piCur   = pcDtParam->pCur;
     1013  Int  iRows   = pcDtParam->iRows;
     1014  Int  iStrideOrg = pcDtParam->iStrideOrg;
     1015  Int  iStrideCur = pcDtParam->iStrideCur;
     1016
     1017  UInt uiSum = 0;
     1018  UInt uiShift = g_uiBitIncrement<<1;
     1019  Int  iTemp;
     1020
     1021  for( ; iRows != 0; iRows-- )
     1022  {
     1023
     1024    iTemp = piOrg[ 0] - piCur[ 0]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1025    iTemp = piOrg[ 1] - piCur[ 1]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1026    iTemp = piOrg[ 2] - piCur[ 2]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1027    iTemp = piOrg[ 3] - piCur[ 3]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1028    iTemp = piOrg[ 4] - piCur[ 4]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1029    iTemp = piOrg[ 5] - piCur[ 5]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1030    iTemp = piOrg[ 6] - piCur[ 6]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1031    iTemp = piOrg[ 7] - piCur[ 7]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1032    iTemp = piOrg[ 8] - piCur[ 8]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1033    iTemp = piOrg[ 9] - piCur[ 9]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1034    iTemp = piOrg[10] - piCur[10]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1035    iTemp = piOrg[11] - piCur[11]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1036    iTemp = piOrg[12] - piCur[12]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1037    iTemp = piOrg[13] - piCur[13]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1038    iTemp = piOrg[14] - piCur[14]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1039    iTemp = piOrg[15] - piCur[15]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1040    iTemp = piOrg[16] - piCur[16]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1041    iTemp = piOrg[17] - piCur[17]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1042    iTemp = piOrg[18] - piCur[18]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1043    iTemp = piOrg[19] - piCur[19]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1044    iTemp = piOrg[20] - piCur[20]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1045    iTemp = piOrg[21] - piCur[21]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1046    iTemp = piOrg[22] - piCur[22]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1047    iTemp = piOrg[23] - piCur[23]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1048    iTemp = piOrg[24] - piCur[24]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1049    iTemp = piOrg[25] - piCur[25]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1050    iTemp = piOrg[26] - piCur[26]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1051    iTemp = piOrg[27] - piCur[27]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1052    iTemp = piOrg[28] - piCur[28]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1053    iTemp = piOrg[29] - piCur[29]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1054    iTemp = piOrg[30] - piCur[30]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1055    iTemp = piOrg[31] - piCur[31]; uiSum += ( iTemp * iTemp ) >> uiShift;
     1056
     1057    piOrg += iStrideOrg;
     1058    piCur += iStrideCur;
     1059  }
     1060
     1061  return ( uiSum );
     1062}
     1063
     1064Void TComWedgeDist::setDistParam( UInt uiBlkWidth, UInt uiBlkHeight, WedgeDist eWDist, WedgeDistParam& rcDistParam )
     1065{
     1066  // set Block Width / Height
     1067  rcDistParam.iCols    = uiBlkWidth;
     1068  rcDistParam.iRows    = uiBlkHeight;
     1069  rcDistParam.DistFunc = m_afpDistortFunc[eWDist + g_aucConvertToBit[ rcDistParam.iCols ] ];
     1070
     1071  // initialize
     1072  rcDistParam.iSubShift  = 0;
     1073}
     1074
     1075UInt TComWedgeDist::getDistPart( Pel* piCur, Int iCurStride,  Pel* piOrg, Int iOrgStride, UInt uiBlkWidth, UInt uiBlkHeight, WedgeDist eWDist )
     1076{
     1077  WedgeDistParam cDtParam;
     1078  setDistParam( uiBlkWidth, uiBlkHeight, eWDist, cDtParam );
     1079  cDtParam.pOrg       = piOrg;
     1080  cDtParam.pCur       = piCur;
     1081  cDtParam.iStrideOrg = iOrgStride;
     1082  cDtParam.iStrideCur = iCurStride;
     1083  cDtParam.iStep      = 1;
     1084
     1085  return cDtParam.DistFunc( &cDtParam );
     1086}
     1087#endif
Note: See TracChangeset for help on using the changeset viewer.