source: 3DVCSoftware/branches/0.2-poznan-univ/source/Lib/TLibCommon/TComYuv.cpp @ 145

Last change on this file since 145 was 12, checked in by poznan-univ, 13 years ago

Poznan Tools

  • Depth base motion vector prediction
  • Property svn:eol-style set to native
File size: 32.2 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-2011, 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 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
35
36/** \file     TComYuv.cpp
37    \brief    general YUV buffer class
38    \todo     this should be merged with TComPicYuv
39*/
40
41#include <stdlib.h>
42#include <memory.h>
43#include <assert.h>
44#include <math.h>
45
46#include "CommonDef.h"
47#include "TComYuv.h"
48
49TComYuv::TComYuv()
50{
51  m_apiBufY = NULL;
52  m_apiBufU = NULL;
53  m_apiBufV = NULL;
54}
55
56TComYuv::~TComYuv()
57{
58}
59
60Void TComYuv::printout()
61{
62  Int  x, y;
63 
64  Pel* pSrc = getLumaAddr(  );
65  Int  iStride = getStride();
66 
67 
68  printf("\nY ...");
69  for ( y = 0; y < iStride; y++ )
70  {
71    printf ("\n");
72    for ( x = 0; x < iStride; x++ )
73    {
74      printf ("%d ", pSrc[x]);
75    }
76    pSrc += iStride;
77  }
78}
79
80Void TComYuv::create( UInt iWidth, UInt iHeight )
81{
82  // memory allocation
83  m_apiBufY  = (Pel*)xMalloc( Pel, iWidth*iHeight    );
84  m_apiBufU  = (Pel*)xMalloc( Pel, iWidth*iHeight >> 2 );
85  m_apiBufV  = (Pel*)xMalloc( Pel, iWidth*iHeight >> 2 );
86 
87  // set width and height
88  m_iWidth   = iWidth;
89  m_iHeight  = iHeight;
90  m_iCWidth  = iWidth  >> 1;
91  m_iCHeight = iHeight >> 1;
92}
93
94Void TComYuv::destroy()
95{
96  // memory free
97  xFree( m_apiBufY ); m_apiBufY = NULL;
98  xFree( m_apiBufU ); m_apiBufU = NULL;
99  xFree( m_apiBufV ); m_apiBufV = NULL;
100}
101
102Void TComYuv::clear()
103{
104  ::memset( m_apiBufY, 0, ( m_iWidth  * m_iHeight  )*sizeof(Pel) );
105  ::memset( m_apiBufU, 0, ( m_iCWidth * m_iCHeight )*sizeof(Pel) );
106  ::memset( m_apiBufV, 0, ( m_iCWidth * m_iCHeight )*sizeof(Pel) );
107}
108
109Void TComYuv::copyToPicYuv   ( TComPicYuv* pcPicYuvDst, UInt iCuAddr, UInt uiAbsZorderIdx, UInt uiPartDepth, UInt uiPartIdx )
110{
111  copyToPicLuma  ( pcPicYuvDst, iCuAddr, uiAbsZorderIdx, uiPartDepth, uiPartIdx );
112  copyToPicChroma( pcPicYuvDst, iCuAddr, uiAbsZorderIdx, uiPartDepth, uiPartIdx );
113}
114
115Void TComYuv::copyToPicLuma  ( TComPicYuv* pcPicYuvDst, UInt iCuAddr, UInt uiAbsZorderIdx, UInt uiPartDepth, UInt uiPartIdx )
116{
117  Int  y, iWidth, iHeight;
118  iWidth  = m_iWidth >>uiPartDepth;
119  iHeight = m_iHeight>>uiPartDepth;
120 
121  Pel* pSrc     = getLumaAddr(uiPartIdx, iWidth);
122  Pel* pDst     = pcPicYuvDst->getLumaAddr ( iCuAddr, uiAbsZorderIdx );
123 
124  UInt  iSrcStride  = getStride();
125  UInt  iDstStride  = pcPicYuvDst->getStride();
126 
127  for ( y = iHeight; y != 0; y-- )
128  {
129    ::memcpy( pDst, pSrc, sizeof(Pel)*iWidth);
130    pDst += iDstStride;
131    pSrc += iSrcStride;
132  }
133}
134
135Void TComYuv::copyToPicChroma( TComPicYuv* pcPicYuvDst, UInt iCuAddr, UInt uiAbsZorderIdx, UInt uiPartDepth, UInt uiPartIdx )
136{
137  Int  y, iWidth, iHeight;
138  iWidth  = m_iCWidth >>uiPartDepth;
139  iHeight = m_iCHeight>>uiPartDepth;
140 
141  Pel* pSrcU      = getCbAddr(uiPartIdx, iWidth);
142  Pel* pSrcV      = getCrAddr(uiPartIdx, iWidth);
143  Pel* pDstU      = pcPicYuvDst->getCbAddr( iCuAddr, uiAbsZorderIdx );
144  Pel* pDstV      = pcPicYuvDst->getCrAddr( iCuAddr, uiAbsZorderIdx );
145 
146  UInt  iSrcStride = getCStride();
147  UInt  iDstStride = pcPicYuvDst->getCStride();
148  for ( y = iHeight; y != 0; y-- )
149  {
150    ::memcpy( pDstU, pSrcU, sizeof(Pel)*(iWidth) );
151    ::memcpy( pDstV, pSrcV, sizeof(Pel)*(iWidth) );
152    pSrcU += iSrcStride;
153    pSrcV += iSrcStride;
154    pDstU += iDstStride;
155    pDstV += iDstStride;
156  }
157}
158
159Void TComYuv::copyFromPicYuv   ( TComPicYuv* pcPicYuvSrc, UInt iCuAddr, UInt uiAbsZorderIdx )
160{
161  copyFromPicLuma  ( pcPicYuvSrc, iCuAddr, uiAbsZorderIdx );
162  copyFromPicChroma( pcPicYuvSrc, iCuAddr, uiAbsZorderIdx );
163}
164
165Void TComYuv::copyFromPicLuma  ( TComPicYuv* pcPicYuvSrc, UInt iCuAddr, UInt uiAbsZorderIdx )
166{
167  Int  y;
168 
169  Pel* pDst     = m_apiBufY;
170  Pel* pSrc     = pcPicYuvSrc->getLumaAddr ( iCuAddr, uiAbsZorderIdx );
171 
172  UInt  iDstStride  = getStride();
173  UInt  iSrcStride  = pcPicYuvSrc->getStride();
174  for ( y = m_iHeight; y != 0; y-- )
175  {
176    ::memcpy( pDst, pSrc, sizeof(Pel)*m_iWidth);
177    pDst += iDstStride;
178    pSrc += iSrcStride;
179  }
180}
181
182Void TComYuv::copyFromPicChroma( TComPicYuv* pcPicYuvSrc, UInt iCuAddr, UInt uiAbsZorderIdx )
183{
184  Int  y;
185 
186  Pel* pDstU      = m_apiBufU;
187  Pel* pDstV      = m_apiBufV;
188  Pel* pSrcU      = pcPicYuvSrc->getCbAddr( iCuAddr, uiAbsZorderIdx );
189  Pel* pSrcV      = pcPicYuvSrc->getCrAddr( iCuAddr, uiAbsZorderIdx );
190 
191  UInt  iDstStride = getCStride();
192  UInt  iSrcStride = pcPicYuvSrc->getCStride();
193  for ( y = m_iCHeight; y != 0; y-- )
194  {
195    ::memcpy( pDstU, pSrcU, sizeof(Pel)*(m_iCWidth) );
196    ::memcpy( pDstV, pSrcV, sizeof(Pel)*(m_iCWidth) );
197    pSrcU += iSrcStride;
198    pSrcV += iSrcStride;
199    pDstU += iDstStride;
200    pDstV += iDstStride;
201  }
202}
203
204Void TComYuv::copyToPartYuv( TComYuv* pcYuvDst, UInt uiDstPartIdx )
205{
206  copyToPartLuma  ( pcYuvDst, uiDstPartIdx );
207  copyToPartChroma( pcYuvDst, uiDstPartIdx );
208}
209
210Void TComYuv::copyToPartLuma( TComYuv* pcYuvDst, UInt uiDstPartIdx )
211{
212  Int  y;
213 
214  Pel* pSrc     = m_apiBufY;
215  Pel* pDst     = pcYuvDst->getLumaAddr( uiDstPartIdx );
216 
217  UInt  iSrcStride  = getStride();
218  UInt  iDstStride  = pcYuvDst->getStride();
219  for ( y = m_iHeight; y != 0; y-- )
220  {
221    ::memcpy( pDst, pSrc, sizeof(Pel)*m_iWidth);
222    pDst += iDstStride;
223    pSrc += iSrcStride;
224  }
225}
226
227Void TComYuv::copyToPartChroma( TComYuv* pcYuvDst, UInt uiDstPartIdx )
228{
229  Int  y;
230 
231  Pel* pSrcU      = m_apiBufU;
232  Pel* pSrcV      = m_apiBufV;
233  Pel* pDstU      = pcYuvDst->getCbAddr( uiDstPartIdx );
234  Pel* pDstV      = pcYuvDst->getCrAddr( uiDstPartIdx );
235 
236  UInt  iSrcStride = getCStride();
237  UInt  iDstStride = pcYuvDst->getCStride();
238  for ( y = m_iCHeight; y != 0; y-- )
239  {
240    ::memcpy( pDstU, pSrcU, sizeof(Pel)*(m_iCWidth) );
241    ::memcpy( pDstV, pSrcV, sizeof(Pel)*(m_iCWidth) );
242    pSrcU += iSrcStride;
243    pSrcV += iSrcStride;
244    pDstU += iDstStride;
245    pDstV += iDstStride;
246  }
247}
248
249Void TComYuv::copyPartToYuv( TComYuv* pcYuvDst, UInt uiSrcPartIdx )
250{
251  copyPartToLuma  ( pcYuvDst, uiSrcPartIdx );
252  copyPartToChroma( pcYuvDst, uiSrcPartIdx );
253}
254
255Void TComYuv::copyPartToLuma( TComYuv* pcYuvDst, UInt uiSrcPartIdx )
256{
257  Int  y;
258 
259  Pel* pSrc     = getLumaAddr(uiSrcPartIdx);
260  Pel* pDst     = pcYuvDst->getLumaAddr( 0 );
261 
262  UInt  iSrcStride  = getStride();
263  UInt  iDstStride  = pcYuvDst->getStride();
264 
265  UInt uiHeight = pcYuvDst->getHeight();
266  UInt uiWidth = pcYuvDst->getWidth();
267 
268  for ( y = uiHeight; y != 0; y-- )
269  {
270    ::memcpy( pDst, pSrc, sizeof(Pel)*uiWidth);
271    pDst += iDstStride;
272    pSrc += iSrcStride;
273  }
274}
275
276Void TComYuv::copyPartToChroma( TComYuv* pcYuvDst, UInt uiSrcPartIdx )
277{
278  Int  y;
279 
280  Pel* pSrcU      = getCbAddr( uiSrcPartIdx );
281  Pel* pSrcV      = getCrAddr( uiSrcPartIdx );
282  Pel* pDstU      = pcYuvDst->getCbAddr( 0 );
283  Pel* pDstV      = pcYuvDst->getCrAddr( 0 );
284 
285  UInt  iSrcStride = getCStride();
286  UInt  iDstStride = pcYuvDst->getCStride();
287 
288  UInt uiCHeight = pcYuvDst->getCHeight();
289  UInt uiCWidth = pcYuvDst->getCWidth();
290 
291  for ( y = uiCHeight; y != 0; y-- )
292  {
293    ::memcpy( pDstU, pSrcU, sizeof(Pel)*(uiCWidth) );
294    ::memcpy( pDstV, pSrcV, sizeof(Pel)*(uiCWidth) );
295    pSrcU += iSrcStride;
296    pSrcV += iSrcStride;
297    pDstU += iDstStride;
298    pDstV += iDstStride;
299  }
300}
301
302Void TComYuv::copyPartToPartYuv   ( TComYuv* pcYuvDst, UInt uiPartIdx, UInt iWidth, UInt iHeight )
303{
304  copyPartToPartLuma   (pcYuvDst, uiPartIdx, iWidth, iHeight );
305  copyPartToPartChroma (pcYuvDst, uiPartIdx, iWidth>>1, iHeight>>1 );
306}
307
308Void TComYuv::copyPartToPartLuma  ( TComYuv* pcYuvDst, UInt uiPartIdx, UInt iWidth, UInt iHeight )
309{
310  Pel* pSrc =           getLumaAddr(uiPartIdx);
311  Pel* pDst = pcYuvDst->getLumaAddr(uiPartIdx);
312  if( pSrc == pDst )
313  {
314    //th not a good idea
315    //th best would be to fix the caller
316    return ;
317  }
318 
319  UInt  iSrcStride = getStride();
320  UInt  iDstStride = pcYuvDst->getStride();
321  for ( UInt y = iHeight; y != 0; y-- )
322  {
323    ::memcpy( pDst, pSrc, iWidth * sizeof(Pel) );
324    pSrc += iSrcStride;
325    pDst += iDstStride;
326  }
327}
328
329Void TComYuv::copyPartToPartChroma( TComYuv* pcYuvDst, UInt uiPartIdx, UInt iWidth, UInt iHeight )
330{
331  Pel*  pSrcU =           getCbAddr(uiPartIdx);
332  Pel*  pSrcV =           getCrAddr(uiPartIdx);
333  Pel*  pDstU = pcYuvDst->getCbAddr(uiPartIdx);
334  Pel*  pDstV = pcYuvDst->getCrAddr(uiPartIdx);
335 
336  if( pSrcU == pDstU && pSrcV == pDstV)
337  {
338    //th not a good idea
339    //th best would be to fix the caller
340    return ;
341  }
342 
343  UInt   iSrcStride = getCStride();
344  UInt   iDstStride = pcYuvDst->getCStride();
345  for ( UInt y = iHeight; y != 0; y-- )
346  {
347    ::memcpy( pDstU, pSrcU, iWidth * sizeof(Pel) );
348    ::memcpy( pDstV, pSrcV, iWidth * sizeof(Pel) );
349    pSrcU += iSrcStride;
350    pSrcV += iSrcStride;
351    pDstU += iDstStride;
352    pDstV += iDstStride;
353  }
354}
355
356#if POZNAN_EIVD
357
358Void TComYuv::copyPartToPartYuv_EIVD   ( TComYuv* pcYuvDst, UInt uiPartIdx, UInt uiPosX, UInt uiPosY )
359{
360  copyPartToPartLuma_EIVD   (pcYuvDst, uiPartIdx, uiPosX, uiPosY );
361  copyPartToPartChroma_EIVD (pcYuvDst, uiPartIdx, uiPosX>>1, uiPosY>>1 );
362}
363
364Void TComYuv::copyPartToPartLuma_EIVD  ( TComYuv* pcYuvDst, UInt uiPartIdx, UInt uiPosX, UInt uiPosY )
365{
366  Pel* pSrc =           getLumaAddr(uiPartIdx);
367  Pel* pDst = pcYuvDst->getLumaAddr(uiPartIdx);
368  if( pSrc == pDst )
369  {
370    //th not a good idea
371    //th best would be to fix the caller
372    return ;
373  }
374 
375  UInt  iSrcStride = getStride();
376  UInt  iDstStride = pcYuvDst->getStride();
377
378  ::memcpy( pDst+uiPosY*iDstStride+uiPosX, pSrc+uiPosY*iSrcStride+uiPosX, sizeof(Pel) );
379}
380
381Void TComYuv::copyPartToPartChroma_EIVD( TComYuv* pcYuvDst, UInt uiPartIdx, UInt uiPosX, UInt uiPosY )
382{
383  Pel*  pSrcU =           getCbAddr(uiPartIdx);
384  Pel*  pSrcV =           getCrAddr(uiPartIdx);
385  Pel*  pDstU = pcYuvDst->getCbAddr(uiPartIdx);
386  Pel*  pDstV = pcYuvDst->getCrAddr(uiPartIdx);
387 
388  if( getCbAddr() == NULL || getCrAddr() == NULL || pcYuvDst->getCbAddr() == NULL || pcYuvDst->getCrAddr() == NULL ) //KUBA CHROMA
389  {
390    return ;
391  }
392  if( pSrcU == pDstU && pSrcV == pDstV)
393  {
394    //th not a good idea
395    //th best would be to fix the caller
396    return ;
397  }
398 
399  UInt   iSrcStride = getCStride();
400  UInt   iDstStride = pcYuvDst->getCStride();
401
402  ::memcpy( pDstU+uiPosY*iDstStride+uiPosX, pSrcU+uiPosY*iSrcStride+uiPosX, sizeof(Pel) );
403  ::memcpy( pDstV+uiPosY*iDstStride+uiPosX, pSrcV+uiPosY*iSrcStride+uiPosX, sizeof(Pel) );
404}
405
406#endif
407
408Void TComYuv::addClipPartLuma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize )
409{
410  Int x, y;
411
412  Pel* pSrc0 = pcYuvSrc0->getLumaAddr( uiTrUnitIdx);
413  Pel* pSrc1 = pcYuvSrc1->getLumaAddr( uiTrUnitIdx);
414  Pel* pDst  = getLumaAddr( uiTrUnitIdx);
415
416  UInt iSrc0Stride = pcYuvSrc0->getStride();
417  UInt iSrc1Stride = pcYuvSrc1->getStride();
418  UInt iDstStride  = getStride();
419  for ( y = uiPartSize-1; y >= 0; y-- )
420  {
421    for ( x = uiPartSize-1; x >= 0; x-- )
422    {
423      pDst[x] = xClip( pSrc0[x] + pSrc1[x] );     
424    }
425    pSrc0 += iSrc0Stride;
426    pSrc1 += iSrc1Stride;
427    pDst  += iDstStride;
428  }
429}
430
431Void
432TComYuv::add( TComYuv* pcYuvAdd, Int iWidth, Int iHeight, Bool bSubtract )
433{
434  addLuma   ( pcYuvAdd, iWidth,    iHeight,    bSubtract );
435  addChroma ( pcYuvAdd, iWidth>>1, iHeight>>1, bSubtract );
436}
437
438Void
439TComYuv::addLuma( TComYuv* pcYuvAdd, Int iWidth, Int iHeight, Bool bSubtract )
440{
441  Int   iScale      = ( bSubtract ? -1 : 1 );
442  Int   iAddStride  = pcYuvAdd->getStride();
443  Int   iDstStride  = getStride();
444  Pel*  pAddSamples = pcYuvAdd->getLumaAddr();
445  Pel*  pDstSamples = getLumaAddr();
446  for( Int iY = 0; iY < iHeight; iY++, pDstSamples += iDstStride, pAddSamples += iAddStride )
447  {
448    for( Int iX = 0; iX < iWidth; iX++ )
449    {
450      pDstSamples[iX] += iScale * pAddSamples[iX];
451    }
452  }
453}
454
455Void
456TComYuv::addChroma( TComYuv* pcYuvAdd, Int iWidth, Int iHeight, Bool bSubtract )
457{
458  Int   iScale        = ( bSubtract ? -1 : 1 );
459  Int   iAddStride    = pcYuvAdd->getCStride();
460  Int   iDstStride    = getCStride();
461  Pel*  pAddSamplesCb = pcYuvAdd->getCbAddr();
462  Pel*  pAddSamplesCr = pcYuvAdd->getCrAddr();
463  Pel*  pDstSamplesCb = getCbAddr();
464  Pel*  pDstSamplesCr = getCrAddr();
465  for( Int iY = 0; iY < iHeight; iY++, pDstSamplesCb += iDstStride, pAddSamplesCb += iAddStride,
466                                       pDstSamplesCr += iDstStride, pAddSamplesCr += iAddStride  )
467  {
468    for( Int iX = 0; iX < iWidth; iX++ )
469    {
470      pDstSamplesCb[iX] += iScale * pAddSamplesCb[iX];
471      pDstSamplesCr[iX] += iScale * pAddSamplesCr[iX];
472    }
473  }
474}
475
476Void
477TComYuv::clip( Int iWidth, Int iHeight )
478{
479  clipLuma   ( iWidth,    iHeight    );
480  clipChroma ( iWidth>>1, iHeight>>1 );
481}
482
483Void
484TComYuv::clipLuma( Int iWidth, Int iHeight )
485{
486  Int   iStride  = getStride();
487  Pel*  pSamples = getLumaAddr();
488  for( Int iY = 0; iY < iHeight; iY++, pSamples += iStride )
489  {
490    for( Int iX = 0; iX < iWidth; iX++ )
491    {
492      pSamples[iX] = xClip( pSamples[iX] );
493    }
494  }
495}
496
497Void
498TComYuv::clipChroma( Int iWidth, Int iHeight )
499{
500  Int   iStride    = getCStride();
501  Pel*  pSamplesCb = getCbAddr();
502  Pel*  pSamplesCr = getCrAddr();
503  for( Int iY = 0; iY < iHeight; iY++, pSamplesCb += iStride, pSamplesCr += iStride )
504  {
505    for( Int iX = 0; iX < iWidth; iX++ )
506    {
507      pSamplesCb[iX] = xClip( pSamplesCb[iX] );
508      pSamplesCr[iX] = xClip( pSamplesCr[iX] );
509    }
510  }
511}
512
513
514Void TComYuv::addClip( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize )
515{
516  addClipLuma   ( pcYuvSrc0, pcYuvSrc1, uiTrUnitIdx, uiPartSize     );
517  addClipChroma ( pcYuvSrc0, pcYuvSrc1, uiTrUnitIdx, uiPartSize>>1  );
518}
519
520Void TComYuv::addClipLuma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize )
521{
522  Int x, y;
523 
524  Pel* pSrc0 = pcYuvSrc0->getLumaAddr( uiTrUnitIdx, uiPartSize );
525  Pel* pSrc1 = pcYuvSrc1->getLumaAddr( uiTrUnitIdx, uiPartSize );
526  Pel* pDst  = getLumaAddr( uiTrUnitIdx, uiPartSize );
527 
528  UInt iSrc0Stride = pcYuvSrc0->getStride();
529  UInt iSrc1Stride = pcYuvSrc1->getStride();
530  UInt iDstStride  = getStride();
531  for ( y = uiPartSize-1; y >= 0; y-- )
532  {
533    for ( x = uiPartSize-1; x >= 0; x-- )
534    {
535      pDst[x] = xClip( pSrc0[x] + pSrc1[x] );
536    }
537    pSrc0 += iSrc0Stride;
538    pSrc1 += iSrc1Stride;
539    pDst  += iDstStride;
540  }
541}
542
543Void TComYuv::addClipChroma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize )
544{
545  Int x, y;
546 
547  Pel* pSrcU0 = pcYuvSrc0->getCbAddr( uiTrUnitIdx, uiPartSize );
548  Pel* pSrcU1 = pcYuvSrc1->getCbAddr( uiTrUnitIdx, uiPartSize );
549  Pel* pSrcV0 = pcYuvSrc0->getCrAddr( uiTrUnitIdx, uiPartSize );
550  Pel* pSrcV1 = pcYuvSrc1->getCrAddr( uiTrUnitIdx, uiPartSize );
551  Pel* pDstU = getCbAddr( uiTrUnitIdx, uiPartSize );
552  Pel* pDstV = getCrAddr( uiTrUnitIdx, uiPartSize );
553 
554  UInt  iSrc0Stride = pcYuvSrc0->getCStride();
555  UInt  iSrc1Stride = pcYuvSrc1->getCStride();
556  UInt  iDstStride  = getCStride();
557  for ( y = uiPartSize-1; y >= 0; y-- )
558  {
559    for ( x = uiPartSize-1; x >= 0; x-- )
560    {
561      pDstU[x] = xClip( pSrcU0[x] + pSrcU1[x] );
562      pDstV[x] = xClip( pSrcV0[x] + pSrcV1[x] );
563    }
564   
565    pSrcU0 += iSrc0Stride;
566    pSrcU1 += iSrc1Stride;
567    pSrcV0 += iSrc0Stride;
568    pSrcV1 += iSrc1Stride;
569    pDstU  += iDstStride;
570    pDstV  += iDstStride;
571  }
572}
573
574Void TComYuv::subtract( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize )
575{
576  subtractLuma  ( pcYuvSrc0, pcYuvSrc1,  uiTrUnitIdx, uiPartSize    );
577  subtractChroma( pcYuvSrc0, pcYuvSrc1,  uiTrUnitIdx, uiPartSize>>1 );
578}
579
580Void TComYuv::subtractLuma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize )
581{
582  Int x, y;
583 
584  Pel* pSrc0 = pcYuvSrc0->getLumaAddr( uiTrUnitIdx, uiPartSize );
585  Pel* pSrc1 = pcYuvSrc1->getLumaAddr( uiTrUnitIdx, uiPartSize );
586  Pel* pDst  = getLumaAddr( uiTrUnitIdx, uiPartSize );
587 
588  Int  iSrc0Stride = pcYuvSrc0->getStride();
589  Int  iSrc1Stride = pcYuvSrc1->getStride();
590  Int  iDstStride  = getStride();
591  for ( y = uiPartSize-1; y >= 0; y-- )
592  {
593    for ( x = uiPartSize-1; x >= 0; x-- )
594    {
595      pDst[x] = pSrc0[x] - pSrc1[x];
596    }
597    pSrc0 += iSrc0Stride;
598    pSrc1 += iSrc1Stride;
599    pDst  += iDstStride;
600  }
601}
602
603Void TComYuv::subtractChroma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize )
604{
605  Int x, y;
606 
607  Pel* pSrcU0 = pcYuvSrc0->getCbAddr( uiTrUnitIdx, uiPartSize );
608  Pel* pSrcU1 = pcYuvSrc1->getCbAddr( uiTrUnitIdx, uiPartSize );
609  Pel* pSrcV0 = pcYuvSrc0->getCrAddr( uiTrUnitIdx, uiPartSize );
610  Pel* pSrcV1 = pcYuvSrc1->getCrAddr( uiTrUnitIdx, uiPartSize );
611  Pel* pDstU  = getCbAddr( uiTrUnitIdx, uiPartSize );
612  Pel* pDstV  = getCrAddr( uiTrUnitIdx, uiPartSize );
613 
614  Int  iSrc0Stride = pcYuvSrc0->getCStride();
615  Int  iSrc1Stride = pcYuvSrc1->getCStride();
616  Int  iDstStride  = getCStride();
617  for ( y = uiPartSize-1; y >= 0; y-- )
618  {
619    for ( x = uiPartSize-1; x >= 0; x-- )
620    {
621      pDstU[x] = pSrcU0[x] - pSrcU1[x];
622      pDstV[x] = pSrcV0[x] - pSrcV1[x];
623    }
624    pSrcU0 += iSrc0Stride;
625    pSrcU1 += iSrc1Stride;
626    pSrcV0 += iSrc0Stride;
627    pSrcV1 += iSrc1Stride;
628    pDstU  += iDstStride;
629    pDstV  += iDstStride;
630  }
631}
632
633#ifdef ROUNDING_CONTROL_BIPRED
634
635Void TComYuv::addAvg( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt iPartUnitIdx, UInt iWidth, UInt iHeight, Bool bRound )
636{
637  Int x, y;
638 
639  Pel* pSrcY0  = pcYuvSrc0->getLumaAddr( iPartUnitIdx );
640  Pel* pSrcU0  = pcYuvSrc0->getCbAddr  ( iPartUnitIdx );
641  Pel* pSrcV0  = pcYuvSrc0->getCrAddr  ( iPartUnitIdx );
642 
643  Pel* pSrcY1  = pcYuvSrc1->getLumaAddr( iPartUnitIdx );
644  Pel* pSrcU1  = pcYuvSrc1->getCbAddr  ( iPartUnitIdx );
645  Pel* pSrcV1  = pcYuvSrc1->getCrAddr  ( iPartUnitIdx );
646 
647  Pel* pDstY   = getLumaAddr( iPartUnitIdx );
648  Pel* pDstU   = getCbAddr  ( iPartUnitIdx );
649  Pel* pDstV   = getCrAddr  ( iPartUnitIdx );
650 
651  UInt  iSrc0Stride = pcYuvSrc0->getStride();
652  UInt  iSrc1Stride = pcYuvSrc1->getStride();
653  UInt  iDstStride  = getStride();
654
655#if HIGH_ACCURACY_BI
656  Int shiftNum = 15 - (g_uiBitDepth + g_uiBitIncrement);
657  Int offset = (1<<(shiftNum - 1));
658 
659  for ( y = iHeight-1; y >= 0; y-- )
660  {
661    for ( x = iWidth-1; x >= 0; )
662    {
663      // note: luma min width is 4
664      pDstY[x] = Clip((pSrcY0[x] + pSrcY1[x] + offset) >> shiftNum ); x--;
665      pDstY[x] = Clip((pSrcY0[x] + pSrcY1[x] + offset) >> shiftNum); x--;
666      pDstY[x] = Clip((pSrcY0[x] + pSrcY1[x] + offset) >> shiftNum); x--;
667      pDstY[x] = Clip((pSrcY0[x] + pSrcY1[x] + offset) >> shiftNum); x--;
668    }
669    pSrcY0 += iSrc0Stride;
670    pSrcY1 += iSrc1Stride;
671    pDstY  += iDstStride;
672  }
673 
674  iSrc0Stride = pcYuvSrc0->getCStride();
675  iSrc1Stride = pcYuvSrc1->getCStride();
676  iDstStride  = getCStride();
677 
678  iWidth  >>=1;
679  iHeight >>=1;
680 
681  for ( y = iHeight-1; y >= 0; y-- )
682  {
683    for ( x = iWidth-1; x >= 0; )
684    {
685      // note: chroma min width is 2
686      pDstU[x] = Clip((pSrcU0[x] + pSrcU1[x] + offset) >> shiftNum);
687      pDstV[x] = Clip((pSrcV0[x] + pSrcV1[x] + offset) >> shiftNum); x--;
688      pDstU[x] = Clip((pSrcU0[x] + pSrcU1[x] + offset) >> shiftNum);
689      pDstV[x] = Clip((pSrcV0[x] + pSrcV1[x] + offset) >> shiftNum); x--;
690    }
691   
692    pSrcU0 += iSrc0Stride;
693    pSrcU1 += iSrc1Stride;
694    pSrcV0 += iSrc0Stride;
695    pSrcV1 += iSrc1Stride;
696    pDstU  += iDstStride;
697    pDstV  += iDstStride;
698  }
699
700#else
701
702  for ( y = iHeight-1; y >= 0; y-- )
703  {
704    for ( x = iWidth-1; x >= 0; )
705    {
706      // note: luma min width is 4
707      pDstY[x] = (pSrcY0[x] + pSrcY1[x] + bRound) >> 1; x--;
708      pDstY[x] = (pSrcY0[x] + pSrcY1[x] + bRound) >> 1; x--;
709      pDstY[x] = (pSrcY0[x] + pSrcY1[x] + bRound) >> 1; x--;
710      pDstY[x] = (pSrcY0[x] + pSrcY1[x] + bRound) >> 1; x--;
711    }
712    pSrcY0 += iSrc0Stride;
713    pSrcY1 += iSrc1Stride;
714    pDstY  += iDstStride;
715  }
716 
717  iSrc0Stride = pcYuvSrc0->getCStride();
718  iSrc1Stride = pcYuvSrc1->getCStride();
719  iDstStride  = getCStride();
720 
721  iWidth  >>=1;
722  iHeight >>=1;
723 
724  for ( y = iHeight-1; y >= 0; y-- )
725  {
726    for ( x = iWidth-1; x >= 0; )
727    {
728      // note: chroma min width is 2
729      pDstU[x] = (pSrcU0[x] + pSrcU1[x] + bRound) >> 1;
730      pDstV[x] = (pSrcV0[x] + pSrcV1[x] + bRound) >> 1; x--;
731      pDstU[x] = (pSrcU0[x] + pSrcU1[x] + bRound) >> 1;
732      pDstV[x] = (pSrcV0[x] + pSrcV1[x] + bRound) >> 1; x--;
733    }
734   
735    pSrcU0 += iSrc0Stride;
736    pSrcU1 += iSrc1Stride;
737    pSrcV0 += iSrc0Stride;
738    pSrcV1 += iSrc1Stride;
739    pDstU  += iDstStride;
740    pDstV  += iDstStride;
741  }
742#endif
743}
744
745#endif
746
747Void TComYuv::addAvg( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt iPartUnitIdx, UInt iWidth, UInt iHeight )
748{
749  Int x, y;
750 
751  Pel* pSrcY0  = pcYuvSrc0->getLumaAddr( iPartUnitIdx );
752  Pel* pSrcU0  = pcYuvSrc0->getCbAddr  ( iPartUnitIdx );
753  Pel* pSrcV0  = pcYuvSrc0->getCrAddr  ( iPartUnitIdx );
754 
755  Pel* pSrcY1  = pcYuvSrc1->getLumaAddr( iPartUnitIdx );
756  Pel* pSrcU1  = pcYuvSrc1->getCbAddr  ( iPartUnitIdx );
757  Pel* pSrcV1  = pcYuvSrc1->getCrAddr  ( iPartUnitIdx );
758 
759  Pel* pDstY   = getLumaAddr( iPartUnitIdx );
760  Pel* pDstU   = getCbAddr  ( iPartUnitIdx );
761  Pel* pDstV   = getCrAddr  ( iPartUnitIdx );
762 
763  UInt  iSrc0Stride = pcYuvSrc0->getStride();
764  UInt  iSrc1Stride = pcYuvSrc1->getStride();
765  UInt  iDstStride  = getStride();
766#if HIGH_ACCURACY_BI
767  Int shiftNum = 15 - (g_uiBitDepth + g_uiBitIncrement);
768  Int offset = (1<<(shiftNum - 1));
769 
770  for ( y = iHeight-1; y >= 0; y-- )
771  {
772    for ( x = iWidth-1; x >= 0; )
773    {
774      // note: luma min width is 4
775      pDstY[x] = Clip((pSrcY0[x] + pSrcY1[x] + offset) >> shiftNum ); x--;
776      pDstY[x] = Clip((pSrcY0[x] + pSrcY1[x] + offset) >> shiftNum); x--;
777      pDstY[x] = Clip((pSrcY0[x] + pSrcY1[x] + offset) >> shiftNum); x--;
778      pDstY[x] = Clip((pSrcY0[x] + pSrcY1[x] + offset) >> shiftNum); x--;
779    }
780    pSrcY0 += iSrc0Stride;
781    pSrcY1 += iSrc1Stride;
782    pDstY  += iDstStride;
783  }
784 
785  iSrc0Stride = pcYuvSrc0->getCStride();
786  iSrc1Stride = pcYuvSrc1->getCStride();
787  iDstStride  = getCStride();
788 
789  iWidth  >>=1;
790  iHeight >>=1;
791 
792  for ( y = iHeight-1; y >= 0; y-- )
793  {
794    for ( x = iWidth-1; x >= 0; )
795    {
796      // note: chroma min width is 2
797      pDstU[x] = Clip((pSrcU0[x] + pSrcU1[x] + offset) >> shiftNum);
798      pDstV[x] = Clip((pSrcV0[x] + pSrcV1[x] + offset) >> shiftNum); x--;
799      pDstU[x] = Clip((pSrcU0[x] + pSrcU1[x] + offset) >> shiftNum);
800      pDstV[x] = Clip((pSrcV0[x] + pSrcV1[x] + offset) >> shiftNum); x--;
801    }
802   
803    pSrcU0 += iSrc0Stride;
804    pSrcU1 += iSrc1Stride;
805    pSrcV0 += iSrc0Stride;
806    pSrcV1 += iSrc1Stride;
807    pDstU  += iDstStride;
808    pDstV  += iDstStride;
809  }
810
811#else 
812  for ( y = iHeight-1; y >= 0; y-- )
813  {
814    for ( x = iWidth-1; x >= 0; )
815    {
816      // note: luma min width is 4
817      pDstY[x] = (pSrcY0[x] + pSrcY1[x] + 1) >> 1; x--;
818      pDstY[x] = (pSrcY0[x] + pSrcY1[x] + 1) >> 1; x--;
819      pDstY[x] = (pSrcY0[x] + pSrcY1[x] + 1) >> 1; x--;
820      pDstY[x] = (pSrcY0[x] + pSrcY1[x] + 1) >> 1; x--;
821    }
822    pSrcY0 += iSrc0Stride;
823    pSrcY1 += iSrc1Stride;
824    pDstY  += iDstStride;
825  }
826 
827  iSrc0Stride = pcYuvSrc0->getCStride();
828  iSrc1Stride = pcYuvSrc1->getCStride();
829  iDstStride  = getCStride();
830 
831  iWidth  >>=1;
832  iHeight >>=1;
833 
834  for ( y = iHeight-1; y >= 0; y-- )
835  {
836    for ( x = iWidth-1; x >= 0; )
837    {
838      // note: chroma min width is 2
839      pDstU[x] = (pSrcU0[x] + pSrcU1[x] + 1) >> 1;
840      pDstV[x] = (pSrcV0[x] + pSrcV1[x] + 1) >> 1; x--;
841      pDstU[x] = (pSrcU0[x] + pSrcU1[x] + 1) >> 1;
842      pDstV[x] = (pSrcV0[x] + pSrcV1[x] + 1) >> 1; x--;
843    }
844   
845    pSrcU0 += iSrc0Stride;
846    pSrcU1 += iSrc1Stride;
847    pSrcV0 += iSrc0Stride;
848    pSrcV1 += iSrc1Stride;
849    pDstU  += iDstStride;
850    pDstV  += iDstStride;
851  }
852#endif
853}
854
855#if POZNAN_EIVD
856
857#ifdef ROUNDING_CONTROL_BIPRED
858
859Void TComYuv::addAvg_EIVD( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt iPartUnitIdx, UInt iPosX, UInt iPosY, Bool bRound )
860{
861  Pel* pSrcY0  = pcYuvSrc0->getLumaAddr( iPartUnitIdx );
862  Pel* pSrcU0  = pcYuvSrc0->getCbAddr  ( iPartUnitIdx );
863  Pel* pSrcV0  = pcYuvSrc0->getCrAddr  ( iPartUnitIdx );
864 
865  Pel* pSrcY1  = pcYuvSrc1->getLumaAddr( iPartUnitIdx );
866  Pel* pSrcU1  = pcYuvSrc1->getCbAddr  ( iPartUnitIdx );
867  Pel* pSrcV1  = pcYuvSrc1->getCrAddr  ( iPartUnitIdx );
868 
869  Pel* pDstY   = getLumaAddr( iPartUnitIdx );
870  Pel* pDstU   = getCbAddr  ( iPartUnitIdx );
871  Pel* pDstV   = getCrAddr  ( iPartUnitIdx );
872 
873  UInt  iSrc0Stride = pcYuvSrc0->getStride();
874  UInt  iSrc1Stride = pcYuvSrc1->getStride();
875  UInt  iDstStride  = getStride();
876
877#if HIGH_ACCURACY_BI
878  Int shiftNum = 15 - (g_uiBitDepth + g_uiBitIncrement);
879  Int offset = (1<<(shiftNum - 1));
880 
881  //Luma
882  (pDstY+iPosY*iDstStride)[iPosX] = Clip(((pSrcY0+iPosY*iSrc0Stride)[iPosX] + (pSrcY1+iPosY*iSrc1Stride)[iPosX] + offset) >> shiftNum );
883   
884  iSrc0Stride = pcYuvSrc0->getCStride();
885  iSrc1Stride = pcYuvSrc1->getCStride();
886  iDstStride  = getCStride();
887
888  //Chroma
889  (pDstU+(iPosY>>1)*iDstStride)[(iPosX>>1)] = Clip(((pSrcU0+(iPosY>>1)*iSrc0Stride)[(iPosX>>1)] + (pSrcU1+(iPosY>>1)*iSrc1Stride)[(iPosX>>1)] + offset) >> shiftNum );
890  (pDstV+(iPosY>>1)*iDstStride)[(iPosX>>1)] = Clip(((pSrcV0+(iPosY>>1)*iSrc0Stride)[(iPosX>>1)] + (pSrcV1+(iPosY>>1)*iSrc1Stride)[(iPosX>>1)] + offset) >> shiftNum );
891 
892#else
893
894  //Luma
895  (pDstY+iPosY*iDstStride)[iPosX] = ((pSrcY0+iPosY*iSrc0Stride)[iPosX] + (pSrcY1+iPosY*iSrc1Stride)[iPosX] + bRound) >> 1;
896   
897  iSrc0Stride = pcYuvSrc0->getCStride();
898  iSrc1Stride = pcYuvSrc1->getCStride();
899  iDstStride  = getCStride();
900 
901  //Chroma
902  (pDstU+(iPosY>>1)*iDstStride)[(iPosX>>1)] = ((pSrcU0+(iPosY>>1)*iSrc0Stride)[(iPosX>>1)] + (pSrcU1+(iPosY>>1)*iSrc1Stride)[(iPosX>>1)] + bRound) >> 1;
903  (pDstV+(iPosY>>1)*iDstStride)[(iPosX>>1)] = ((pSrcV0+(iPosY>>1)*iSrc0Stride)[(iPosX>>1)] + (pSrcV1+(iPosY>>1)*iSrc1Stride)[(iPosX>>1)] + bRound) >> 1;
904#endif
905}
906
907#endif
908
909Void TComYuv::addAvg_EIVD( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt iPartUnitIdx, UInt iPosX, UInt iPosY )
910{
911  Pel* pSrcY0  = pcYuvSrc0->getLumaAddr( iPartUnitIdx );
912  Pel* pSrcU0  = pcYuvSrc0->getCbAddr  ( iPartUnitIdx );
913  Pel* pSrcV0  = pcYuvSrc0->getCrAddr  ( iPartUnitIdx );
914 
915  Pel* pSrcY1  = pcYuvSrc1->getLumaAddr( iPartUnitIdx );
916  Pel* pSrcU1  = pcYuvSrc1->getCbAddr  ( iPartUnitIdx );
917  Pel* pSrcV1  = pcYuvSrc1->getCrAddr  ( iPartUnitIdx );
918 
919  Pel* pDstY   = getLumaAddr( iPartUnitIdx );
920  Pel* pDstU   = getCbAddr  ( iPartUnitIdx );
921  Pel* pDstV   = getCrAddr  ( iPartUnitIdx );
922 
923  UInt  iSrc0Stride = pcYuvSrc0->getStride();
924  UInt  iSrc1Stride = pcYuvSrc1->getStride();
925  UInt  iDstStride  = getStride();
926#if HIGH_ACCURACY_BI
927  Int shiftNum = 15 - (g_uiBitDepth + g_uiBitIncrement);
928  Int offset = (1<<(shiftNum - 1));
929 
930  //Luma
931  (pDstY+iPosY*iDstStride)[iPosX] = Clip(((pSrcY0+iPosY*iSrc0Stride)[iPosX] + (pSrcY1+iPosY*iSrc1Stride)[iPosX] + offset) >> shiftNum );
932
933  iSrc0Stride = pcYuvSrc0->getCStride();
934  iSrc1Stride = pcYuvSrc1->getCStride();
935  iDstStride  = getCStride();
936 
937  //Chroma
938  (pDstU+(iPosY>>1)*iDstStride)[(iPosX>>1)] = Clip(((pSrcU0+(iPosY>>1)*iSrc0Stride)[(iPosX>>1)] + (pSrcU1+(iPosY>>1)*iSrc1Stride)[(iPosX>>1)] + offset) >> shiftNum );
939  (pDstV+(iPosY>>1)*iDstStride)[(iPosX>>1)] = Clip(((pSrcV0+(iPosY>>1)*iSrc0Stride)[(iPosX>>1)] + (pSrcV1+(iPosY>>1)*iSrc1Stride)[(iPosX>>1)] + offset) >> shiftNum );
940
941#else 
942  //Luma
943  (pDstY+iPosY*iDstStride)[iPosX] = ((pSrcY0+iPosY*iSrc0Stride)[iPosX] + (pSrcY1+iPosY*iSrc1Stride)[iPosX] + 1) >> 1;
944   
945  iSrc0Stride = pcYuvSrc0->getCStride();
946  iSrc1Stride = pcYuvSrc1->getCStride();
947  iDstStride  = getCStride();
948 
949  //Chroma
950  (pDstU+(iPosY>>1)*iDstStride)[(iPosX>>1)] = ((pSrcU0+(iPosY>>1)*iSrc0Stride)[(iPosX>>1)] + (pSrcU1+(iPosY>>1)*iSrc1Stride)[(iPosX>>1)] + 1) >> 1;
951  (pDstV+(iPosY>>1)*iDstStride)[(iPosX>>1)] = ((pSrcV0+(iPosY>>1)*iSrc0Stride)[(iPosX>>1)] + (pSrcV1+(iPosY>>1)*iSrc1Stride)[(iPosX>>1)] + 1) >> 1;
952#endif
953}
954
955#endif
956
957Void TComYuv::removeHighFreq( TComYuv* pcYuvSrc, UInt uiWidht, UInt uiHeight )
958{
959  Int x, y;
960 
961  Pel* pSrc  = pcYuvSrc->getLumaAddr();
962  Pel* pSrcU = pcYuvSrc->getCbAddr();
963  Pel* pSrcV = pcYuvSrc->getCrAddr();
964 
965  Pel* pDst  = m_apiBufY;
966  Pel* pDstU = m_apiBufU;
967  Pel* pDstV = m_apiBufV;
968 
969  Int  iSrcStride = pcYuvSrc->getStride();
970  Int  iDstStride = getStride();
971 
972  for ( y = uiHeight-1; y >= 0; y-- )
973  {
974    for ( x = uiWidht-1; x >= 0; x-- )
975    {
976      pDst[x ] = xClip( (pDst[x ]<<1) - pSrc[x ] );
977    }
978    pSrc += iSrcStride;
979    pDst += iDstStride;
980  }
981 
982  iSrcStride = pcYuvSrc->getCStride();
983  iDstStride = getCStride();
984 
985  uiHeight >>= 1;
986  uiWidht  >>= 1;
987 
988  for ( y = uiHeight-1; y >= 0; y-- )
989  {
990    for ( x = uiWidht-1; x >= 0; x-- )
991    {
992      pDstU[x ] = xClip( (pDstU[x ]<<1) - pSrcU[x ] );
993      pDstV[x ] = xClip( (pDstV[x ]<<1) - pSrcV[x ] );
994    }
995    pSrcU += iSrcStride;
996    pSrcV += iSrcStride;
997    pDstU += iDstStride;
998    pDstV += iDstStride;
999  }
1000}
1001
1002Void TComYuv::removeHighFreq( TComYuv* pcYuvSrc, UInt uiPartIdx, UInt uiWidht, UInt uiHeight )
1003{
1004  Int x, y;
1005 
1006  Pel* pSrc  = pcYuvSrc->getLumaAddr(uiPartIdx);
1007  Pel* pSrcU = pcYuvSrc->getCbAddr(uiPartIdx);
1008  Pel* pSrcV = pcYuvSrc->getCrAddr(uiPartIdx);
1009 
1010  Pel* pDst  = getLumaAddr(uiPartIdx);
1011  Pel* pDstU = getCbAddr(uiPartIdx);
1012  Pel* pDstV = getCrAddr(uiPartIdx);
1013 
1014  Int  iSrcStride = pcYuvSrc->getStride();
1015  Int  iDstStride = getStride();
1016 
1017  for ( y = uiHeight-1; y >= 0; y-- )
1018  {
1019    for ( x = uiWidht-1; x >= 0; x-- )
1020    {
1021      pDst[x ] = xClip( (pDst[x ]<<1) - pSrc[x ] );
1022    }
1023    pSrc += iSrcStride;
1024    pDst += iDstStride;
1025  }
1026 
1027  iSrcStride = pcYuvSrc->getCStride();
1028  iDstStride = getCStride();
1029 
1030  uiHeight >>= 1;
1031  uiWidht  >>= 1;
1032 
1033  for ( y = uiHeight-1; y >= 0; y-- )
1034  {
1035    for ( x = uiWidht-1; x >= 0; x-- )
1036    {
1037      pDstU[x ] = xClip( (pDstU[x ]<<1) - pSrcU[x ] );
1038      pDstV[x ] = xClip( (pDstV[x ]<<1) - pSrcV[x ] );
1039    }
1040    pSrcU += iSrcStride;
1041    pSrcV += iSrcStride;
1042    pDstU += iDstStride;
1043    pDstV += iDstStride;
1044  }
1045}
1046
1047
1048Pel* TComYuv::getLumaAddr( UInt uiPartUnitIdx )
1049{
1050  UInt iBlkX;
1051  UInt iBlkY;
1052  iBlkX = g_auiRasterToPelX[g_auiZscanToRaster[uiPartUnitIdx]];
1053  iBlkY = g_auiRasterToPelY[g_auiZscanToRaster[uiPartUnitIdx]];
1054 
1055  return m_apiBufY + iBlkY*getStride() + iBlkX;
1056}
1057
1058Pel* TComYuv::getCbAddr( UInt uiPartUnitIdx )
1059{
1060  UInt iBlkX;
1061  UInt iBlkY;
1062  iBlkX = g_auiRasterToPelX[g_auiZscanToRaster[uiPartUnitIdx]] >> 1;
1063  iBlkY = g_auiRasterToPelY[g_auiZscanToRaster[uiPartUnitIdx]] >> 1;
1064 
1065  return m_apiBufU + iBlkY*getCStride() + iBlkX;
1066}
1067
1068Pel* TComYuv::getCrAddr( UInt uiPartUnitIdx )
1069{
1070  UInt iBlkX;
1071  UInt iBlkY;
1072  iBlkX = g_auiRasterToPelX[g_auiZscanToRaster[uiPartUnitIdx]] >> 1;
1073  iBlkY = g_auiRasterToPelY[g_auiZscanToRaster[uiPartUnitIdx]] >> 1;
1074 
1075  return m_apiBufV + iBlkY*getCStride() + iBlkX;
1076}
1077
1078Pel* TComYuv::getLumaAddr( UInt iTransUnitIdx, UInt iBlkSize )
1079{
1080  UInt uiNumTrInWidth = m_iWidth / iBlkSize;
1081  UInt   iBlkX   = iTransUnitIdx % uiNumTrInWidth;
1082  UInt   iBlkY   = iTransUnitIdx / uiNumTrInWidth;
1083 
1084  return m_apiBufY + (iBlkX + iBlkY * getStride()) * iBlkSize;
1085}
1086
1087Pel* TComYuv::getCbAddr( UInt iTransUnitIdx, UInt iBlkSize )
1088{
1089  UInt uiNumTrInWidth = m_iCWidth / iBlkSize;
1090  UInt   iBlkX   = iTransUnitIdx % uiNumTrInWidth;
1091  UInt   iBlkY   = iTransUnitIdx / uiNumTrInWidth;
1092 
1093  return m_apiBufU + (iBlkX + iBlkY * getCStride()) * iBlkSize;
1094}
1095
1096Pel* TComYuv::getCrAddr( UInt iTransUnitIdx, UInt iBlkSize )
1097{
1098  UInt uiNumTrInWidth = m_iCWidth / iBlkSize;
1099  UInt   iBlkX   = iTransUnitIdx % uiNumTrInWidth;
1100  UInt   iBlkY   = iTransUnitIdx / uiNumTrInWidth;
1101 
1102  return m_apiBufV + (iBlkX + iBlkY * getCStride()) * iBlkSize;
1103}
Note: See TracBrowser for help on using the repository browser.