source: 3DVCSoftware/trunk/source/Lib/TLibCommon/TComYuv.cpp @ 2

Last change on this file since 2 was 2, checked in by hhi, 12 years ago

inital import

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