Ignore:
Timestamp:
11 Jun 2013, 20:35:00 (11 years ago)
Author:
zhang
Message:

Implementation of ARP from QC

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibCommon/TComYuv.cpp

    r446 r464  
    661661  }
    662662}
     663
     664#if H_3D_ARP
     665Void TComYuv::addARP( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, Bool bClip )
     666{
     667  addARPLuma   ( pcYuvSrc0, pcYuvSrc1, uiAbsPartIdx, uiWidth   , uiHeight    , bClip );
     668  addARPChroma ( pcYuvSrc0, pcYuvSrc1, uiAbsPartIdx, uiWidth>>1, uiHeight>>1 , bClip );
     669}
     670
     671Void TComYuv::addARPLuma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, Bool bClip )
     672{
     673  Int x, y;
     674
     675  Pel* pSrc0 = pcYuvSrc0->getLumaAddr( uiAbsPartIdx );
     676  Pel* pSrc1 = pcYuvSrc1->getLumaAddr( uiAbsPartIdx );
     677  Pel* pDst  = getLumaAddr( uiAbsPartIdx );
     678
     679  UInt iSrc0Stride = pcYuvSrc0->getStride();
     680  UInt iSrc1Stride = pcYuvSrc1->getStride();
     681  UInt iDstStride  = getStride();
     682  for ( y = uiHeight-1; y >= 0; y-- )
     683  {
     684    for ( x = uiWidth-1; x >= 0; x-- )
     685    {
     686      pDst[x] = pSrc0[x] + pSrc1[x];
     687      if( bClip )
     688      {
     689        pDst[x] = ClipY( pDst[x] );
     690      }
     691    }
     692    pSrc0 += iSrc0Stride;
     693    pSrc1 += iSrc1Stride;
     694    pDst  += iDstStride;
     695  }
     696}
     697
     698Void TComYuv::addARPChroma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, Bool bClip )
     699{
     700  Int x, y;
     701
     702  Pel* pSrcU0 = pcYuvSrc0->getCbAddr( uiAbsPartIdx );
     703  Pel* pSrcU1 = pcYuvSrc1->getCbAddr( uiAbsPartIdx );
     704  Pel* pSrcV0 = pcYuvSrc0->getCrAddr( uiAbsPartIdx );
     705  Pel* pSrcV1 = pcYuvSrc1->getCrAddr( uiAbsPartIdx );
     706  Pel* pDstU = getCbAddr( uiAbsPartIdx );
     707  Pel* pDstV = getCrAddr( uiAbsPartIdx );
     708
     709  UInt  iSrc0Stride = pcYuvSrc0->getCStride();
     710  UInt  iSrc1Stride = pcYuvSrc1->getCStride();
     711  UInt  iDstStride  = getCStride();
     712  for ( y = uiHeight-1; y >= 0; y-- )
     713  {
     714    for ( x = uiWidth-1; x >= 0; x-- )
     715    {
     716      pDstU[x] = pSrcU0[x] + pSrcU1[x];
     717      pDstV[x] = pSrcV0[x] + pSrcV1[x];
     718      if( bClip )
     719      {
     720        pDstU[x] = ClipC( pDstU[x] );
     721        pDstV[x] = ClipC( pDstV[x] );
     722      }
     723    }
     724
     725    pSrcU0 += iSrc0Stride;
     726    pSrcU1 += iSrc1Stride;
     727    pSrcV0 += iSrc0Stride;
     728    pSrcV1 += iSrc1Stride;
     729    pDstU  += iDstStride;
     730    pDstV  += iDstStride;
     731  }
     732}
     733
     734Void TComYuv::subtractARP( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth , UInt uiHeight )
     735{
     736  subtractARPLuma  ( pcYuvSrc0, pcYuvSrc1,  uiAbsPartIdx, uiWidth    , uiHeight    );
     737  subtractARPChroma( pcYuvSrc0, pcYuvSrc1,  uiAbsPartIdx, uiWidth>>1 , uiHeight>>1 );
     738}
     739
     740Void TComYuv::subtractARPLuma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth , UInt uiHeight )
     741{
     742  Int x, y;
     743
     744  Pel* pSrc0 = pcYuvSrc0->getLumaAddr( uiAbsPartIdx );
     745  Pel* pSrc1 = pcYuvSrc1->getLumaAddr( uiAbsPartIdx );
     746  Pel* pDst  = getLumaAddr( uiAbsPartIdx );
     747
     748  Int  iSrc0Stride = pcYuvSrc0->getStride();
     749  Int  iSrc1Stride = pcYuvSrc1->getStride();
     750  Int  iDstStride  = getStride();
     751  for ( y = uiHeight-1; y >= 0; y-- )
     752  {
     753    for ( x = uiWidth-1; x >= 0; x-- )
     754    {
     755      pDst[x] = pSrc0[x] - pSrc1[x];
     756    }
     757    pSrc0 += iSrc0Stride;
     758    pSrc1 += iSrc1Stride;
     759    pDst  += iDstStride;
     760  }
     761}
     762
     763Void TComYuv::subtractARPChroma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth , UInt uiHeight )
     764{
     765  Int x, y;
     766
     767  Pel* pSrcU0 = pcYuvSrc0->getCbAddr( uiAbsPartIdx );
     768  Pel* pSrcU1 = pcYuvSrc1->getCbAddr( uiAbsPartIdx );
     769  Pel* pSrcV0 = pcYuvSrc0->getCrAddr( uiAbsPartIdx );
     770  Pel* pSrcV1 = pcYuvSrc1->getCrAddr( uiAbsPartIdx );
     771  Pel* pDstU  = getCbAddr( uiAbsPartIdx );
     772  Pel* pDstV  = getCrAddr( uiAbsPartIdx );
     773
     774  Int  iSrc0Stride = pcYuvSrc0->getCStride();
     775  Int  iSrc1Stride = pcYuvSrc1->getCStride();
     776  Int  iDstStride  = getCStride();
     777  for ( y = uiHeight-1; y >= 0; y-- )
     778  {
     779    for ( x = uiWidth-1; x >= 0; x-- )
     780    {
     781      pDstU[x] = pSrcU0[x] - pSrcU1[x];
     782      pDstV[x] = pSrcV0[x] - pSrcV1[x];
     783    }
     784    pSrcU0 += iSrc0Stride;
     785    pSrcU1 += iSrc1Stride;
     786    pSrcV0 += iSrc0Stride;
     787    pSrcV1 += iSrc1Stride;
     788    pDstU  += iDstStride;
     789    pDstV  += iDstStride;
     790  }
     791}
     792
     793Void TComYuv::multiplyARP( UInt uiAbsPartIdx , UInt uiWidth , UInt uiHeight , UChar dW )
     794{
     795  multiplyARPLuma( uiAbsPartIdx , uiWidth , uiHeight , dW );
     796  multiplyARPChroma( uiAbsPartIdx , uiWidth >> 1 , uiHeight >> 1 , dW );
     797}
     798
     799Void TComYuv::xxMultiplyLine( Pel* pSrcDst , UInt uiWidth , UChar dW )
     800{
     801  assert( dW == 2 );
     802  for( UInt x = 0 ; x < uiWidth ; x++ )
     803    pSrcDst[x] =  pSrcDst[x] >> 1;
     804}
     805
     806Void TComYuv::multiplyARPLuma( UInt uiAbsPartIdx , UInt uiWidth , UInt uiHeight , UChar dW )
     807{
     808  Pel* pDst  = getLumaAddr( uiAbsPartIdx );
     809  Int  iDstStride  = getStride();
     810  for ( Int y = uiHeight-1; y >= 0; y-- )
     811  {
     812    xxMultiplyLine( pDst , uiWidth , dW );
     813    pDst  += iDstStride;
     814  }
     815}
     816
     817Void TComYuv::multiplyARPChroma( UInt uiAbsPartIdx , UInt uiWidth , UInt uiHeight , UChar dW )
     818{
     819  Pel* pDstU  = getCbAddr( uiAbsPartIdx );
     820  Pel* pDstV  = getCrAddr( uiAbsPartIdx );
     821
     822  Int  iDstStride  = getCStride();
     823  for ( Int y = uiHeight-1; y >= 0; y-- )
     824  {
     825    xxMultiplyLine( pDstU , uiWidth , dW );
     826    xxMultiplyLine( pDstV , uiWidth , dW );
     827    pDstU  += iDstStride;
     828    pDstV  += iDstStride;
     829  }
     830}
     831#endif
    663832#endif
    664833//! \}
Note: See TracChangeset for help on using the changeset viewer.