source: 3DVCSoftware/branches/HTM-DEV-0.1-dev/source/Lib/TLibCommon/TComYuv.cpp @ 368

Last change on this file since 368 was 324, checked in by tech, 12 years ago

Initial development version for update to latest HM version.
Includes MV-HEVC and basic extensions for 3D-HEVC.

  • Property svn:eol-style set to native
File size: 18.7 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-2013, ITU/ISO/IEC
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions are met:
11 *
12 *  * Redistributions of source code must retain the above copyright notice,
13 *    this list of conditions and the following disclaimer.
14 *  * Redistributions in binary form must reproduce the above copyright notice,
15 *    this list of conditions and the following disclaimer in the documentation
16 *    and/or other materials provided with the distribution.
17 *  * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
18 *    be used to endorse or promote products derived from this software without
19 *    specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
31 * THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34/** \file     TComYuv.cpp
35    \brief    general YUV buffer class
36    \todo     this should be merged with TComPicYuv
37*/
38
39#include <stdlib.h>
40#include <memory.h>
41#include <assert.h>
42#include <math.h>
43
44#include "CommonDef.h"
45#include "TComYuv.h"
46#include "TComInterpolationFilter.h"
47
48//! \ingroup TLibCommon
49//! \{
50
51TComYuv::TComYuv()
52{
53  m_apiBufY = NULL;
54  m_apiBufU = NULL;
55  m_apiBufV = NULL;
56}
57
58TComYuv::~TComYuv()
59{
60}
61
62Void TComYuv::create( UInt iWidth, UInt iHeight )
63{
64  // memory allocation
65  m_apiBufY  = (Pel*)xMalloc( Pel, iWidth*iHeight    );
66  m_apiBufU  = (Pel*)xMalloc( Pel, iWidth*iHeight >> 2 );
67  m_apiBufV  = (Pel*)xMalloc( Pel, iWidth*iHeight >> 2 );
68 
69  // set width and height
70  m_iWidth   = iWidth;
71  m_iHeight  = iHeight;
72  m_iCWidth  = iWidth  >> 1;
73  m_iCHeight = iHeight >> 1;
74}
75
76Void TComYuv::destroy()
77{
78  // memory free
79  xFree( m_apiBufY ); m_apiBufY = NULL;
80  xFree( m_apiBufU ); m_apiBufU = NULL;
81  xFree( m_apiBufV ); m_apiBufV = NULL;
82}
83
84Void TComYuv::clear()
85{
86  ::memset( m_apiBufY, 0, ( m_iWidth  * m_iHeight  )*sizeof(Pel) );
87  ::memset( m_apiBufU, 0, ( m_iCWidth * m_iCHeight )*sizeof(Pel) );
88  ::memset( m_apiBufV, 0, ( m_iCWidth * m_iCHeight )*sizeof(Pel) );
89}
90
91Void TComYuv::copyToPicYuv   ( TComPicYuv* pcPicYuvDst, UInt iCuAddr, UInt uiAbsZorderIdx, UInt uiPartDepth, UInt uiPartIdx )
92{
93  copyToPicLuma  ( pcPicYuvDst, iCuAddr, uiAbsZorderIdx, uiPartDepth, uiPartIdx );
94  copyToPicChroma( pcPicYuvDst, iCuAddr, uiAbsZorderIdx, uiPartDepth, uiPartIdx );
95}
96
97Void TComYuv::copyToPicLuma  ( TComPicYuv* pcPicYuvDst, UInt iCuAddr, UInt uiAbsZorderIdx, UInt uiPartDepth, UInt uiPartIdx )
98{
99  Int  y, iWidth, iHeight;
100  iWidth  = m_iWidth >>uiPartDepth;
101  iHeight = m_iHeight>>uiPartDepth;
102 
103  Pel* pSrc     = getLumaAddr(uiPartIdx, iWidth);
104  Pel* pDst     = pcPicYuvDst->getLumaAddr ( iCuAddr, uiAbsZorderIdx );
105 
106  UInt  iSrcStride  = getStride();
107  UInt  iDstStride  = pcPicYuvDst->getStride();
108 
109  for ( y = iHeight; y != 0; y-- )
110  {
111    ::memcpy( pDst, pSrc, sizeof(Pel)*iWidth);
112    pDst += iDstStride;
113    pSrc += iSrcStride;
114  }
115}
116
117Void TComYuv::copyToPicChroma( TComPicYuv* pcPicYuvDst, UInt iCuAddr, UInt uiAbsZorderIdx, UInt uiPartDepth, UInt uiPartIdx )
118{
119  Int  y, iWidth, iHeight;
120  iWidth  = m_iCWidth >>uiPartDepth;
121  iHeight = m_iCHeight>>uiPartDepth;
122 
123  Pel* pSrcU      = getCbAddr(uiPartIdx, iWidth);
124  Pel* pSrcV      = getCrAddr(uiPartIdx, iWidth);
125  Pel* pDstU      = pcPicYuvDst->getCbAddr( iCuAddr, uiAbsZorderIdx );
126  Pel* pDstV      = pcPicYuvDst->getCrAddr( iCuAddr, uiAbsZorderIdx );
127 
128  UInt  iSrcStride = getCStride();
129  UInt  iDstStride = pcPicYuvDst->getCStride();
130  for ( y = iHeight; y != 0; y-- )
131  {
132    ::memcpy( pDstU, pSrcU, sizeof(Pel)*(iWidth) );
133    ::memcpy( pDstV, pSrcV, sizeof(Pel)*(iWidth) );
134    pSrcU += iSrcStride;
135    pSrcV += iSrcStride;
136    pDstU += iDstStride;
137    pDstV += iDstStride;
138  }
139}
140
141Void TComYuv::copyFromPicYuv   ( TComPicYuv* pcPicYuvSrc, UInt iCuAddr, UInt uiAbsZorderIdx )
142{
143  copyFromPicLuma  ( pcPicYuvSrc, iCuAddr, uiAbsZorderIdx );
144  copyFromPicChroma( pcPicYuvSrc, iCuAddr, uiAbsZorderIdx );
145}
146
147Void TComYuv::copyFromPicLuma  ( TComPicYuv* pcPicYuvSrc, UInt iCuAddr, UInt uiAbsZorderIdx )
148{
149  Int  y;
150 
151  Pel* pDst     = m_apiBufY;
152  Pel* pSrc     = pcPicYuvSrc->getLumaAddr ( iCuAddr, uiAbsZorderIdx );
153 
154  UInt  iDstStride  = getStride();
155  UInt  iSrcStride  = pcPicYuvSrc->getStride();
156  for ( y = m_iHeight; y != 0; y-- )
157  {
158    ::memcpy( pDst, pSrc, sizeof(Pel)*m_iWidth);
159    pDst += iDstStride;
160    pSrc += iSrcStride;
161  }
162}
163
164Void TComYuv::copyFromPicChroma( TComPicYuv* pcPicYuvSrc, UInt iCuAddr, UInt uiAbsZorderIdx )
165{
166  Int  y;
167 
168  Pel* pDstU      = m_apiBufU;
169  Pel* pDstV      = m_apiBufV;
170  Pel* pSrcU      = pcPicYuvSrc->getCbAddr( iCuAddr, uiAbsZorderIdx );
171  Pel* pSrcV      = pcPicYuvSrc->getCrAddr( iCuAddr, uiAbsZorderIdx );
172 
173  UInt  iDstStride = getCStride();
174  UInt  iSrcStride = pcPicYuvSrc->getCStride();
175  for ( y = m_iCHeight; y != 0; y-- )
176  {
177    ::memcpy( pDstU, pSrcU, sizeof(Pel)*(m_iCWidth) );
178    ::memcpy( pDstV, pSrcV, sizeof(Pel)*(m_iCWidth) );
179    pSrcU += iSrcStride;
180    pSrcV += iSrcStride;
181    pDstU += iDstStride;
182    pDstV += iDstStride;
183  }
184}
185
186Void TComYuv::copyToPartYuv( TComYuv* pcYuvDst, UInt uiDstPartIdx )
187{
188  copyToPartLuma  ( pcYuvDst, uiDstPartIdx );
189  copyToPartChroma( pcYuvDst, uiDstPartIdx );
190}
191
192Void TComYuv::copyToPartLuma( TComYuv* pcYuvDst, UInt uiDstPartIdx )
193{
194  Int  y;
195 
196  Pel* pSrc     = m_apiBufY;
197  Pel* pDst     = pcYuvDst->getLumaAddr( uiDstPartIdx );
198 
199  UInt  iSrcStride  = getStride();
200  UInt  iDstStride  = pcYuvDst->getStride();
201  for ( y = m_iHeight; y != 0; y-- )
202  {
203    ::memcpy( pDst, pSrc, sizeof(Pel)*m_iWidth);
204    pDst += iDstStride;
205    pSrc += iSrcStride;
206  }
207}
208
209Void TComYuv::copyToPartChroma( TComYuv* pcYuvDst, UInt uiDstPartIdx )
210{
211  Int  y;
212 
213  Pel* pSrcU      = m_apiBufU;
214  Pel* pSrcV      = m_apiBufV;
215  Pel* pDstU      = pcYuvDst->getCbAddr( uiDstPartIdx );
216  Pel* pDstV      = pcYuvDst->getCrAddr( uiDstPartIdx );
217 
218  UInt  iSrcStride = getCStride();
219  UInt  iDstStride = pcYuvDst->getCStride();
220  for ( y = m_iCHeight; y != 0; y-- )
221  {
222    ::memcpy( pDstU, pSrcU, sizeof(Pel)*(m_iCWidth) );
223    ::memcpy( pDstV, pSrcV, sizeof(Pel)*(m_iCWidth) );
224    pSrcU += iSrcStride;
225    pSrcV += iSrcStride;
226    pDstU += iDstStride;
227    pDstV += iDstStride;
228  }
229}
230
231Void TComYuv::copyPartToYuv( TComYuv* pcYuvDst, UInt uiSrcPartIdx )
232{
233  copyPartToLuma  ( pcYuvDst, uiSrcPartIdx );
234  copyPartToChroma( pcYuvDst, uiSrcPartIdx );
235}
236
237Void TComYuv::copyPartToLuma( TComYuv* pcYuvDst, UInt uiSrcPartIdx )
238{
239  Int  y;
240 
241  Pel* pSrc     = getLumaAddr(uiSrcPartIdx);
242  Pel* pDst     = pcYuvDst->getLumaAddr( 0 );
243 
244  UInt  iSrcStride  = getStride();
245  UInt  iDstStride  = pcYuvDst->getStride();
246 
247  UInt uiHeight = pcYuvDst->getHeight();
248  UInt uiWidth = pcYuvDst->getWidth();
249 
250  for ( y = uiHeight; y != 0; y-- )
251  {
252    ::memcpy( pDst, pSrc, sizeof(Pel)*uiWidth);
253    pDst += iDstStride;
254    pSrc += iSrcStride;
255  }
256}
257
258Void TComYuv::copyPartToChroma( TComYuv* pcYuvDst, UInt uiSrcPartIdx )
259{
260  Int  y;
261 
262  Pel* pSrcU      = getCbAddr( uiSrcPartIdx );
263  Pel* pSrcV      = getCrAddr( uiSrcPartIdx );
264  Pel* pDstU      = pcYuvDst->getCbAddr( 0 );
265  Pel* pDstV      = pcYuvDst->getCrAddr( 0 );
266 
267  UInt  iSrcStride = getCStride();
268  UInt  iDstStride = pcYuvDst->getCStride();
269 
270  UInt uiCHeight = pcYuvDst->getCHeight();
271  UInt uiCWidth = pcYuvDst->getCWidth();
272 
273  for ( y = uiCHeight; y != 0; y-- )
274  {
275    ::memcpy( pDstU, pSrcU, sizeof(Pel)*(uiCWidth) );
276    ::memcpy( pDstV, pSrcV, sizeof(Pel)*(uiCWidth) );
277    pSrcU += iSrcStride;
278    pSrcV += iSrcStride;
279    pDstU += iDstStride;
280    pDstV += iDstStride;
281  }
282}
283
284Void TComYuv::copyPartToPartYuv   ( TComYuv* pcYuvDst, UInt uiPartIdx, UInt iWidth, UInt iHeight )
285{
286  copyPartToPartLuma   (pcYuvDst, uiPartIdx, iWidth, iHeight );
287  copyPartToPartChroma (pcYuvDst, uiPartIdx, iWidth>>1, iHeight>>1 );
288}
289
290Void TComYuv::copyPartToPartLuma  ( TComYuv* pcYuvDst, UInt uiPartIdx, UInt iWidth, UInt iHeight )
291{
292  Pel* pSrc =           getLumaAddr(uiPartIdx);
293  Pel* pDst = pcYuvDst->getLumaAddr(uiPartIdx);
294  if( pSrc == pDst )
295  {
296    //th not a good idea
297    //th best would be to fix the caller
298    return ;
299  }
300 
301  UInt  iSrcStride = getStride();
302  UInt  iDstStride = pcYuvDst->getStride();
303  for ( UInt y = iHeight; y != 0; y-- )
304  {
305    ::memcpy( pDst, pSrc, iWidth * sizeof(Pel) );
306    pSrc += iSrcStride;
307    pDst += iDstStride;
308  }
309}
310
311Void TComYuv::copyPartToPartChroma( TComYuv* pcYuvDst, UInt uiPartIdx, UInt iWidth, UInt iHeight )
312{
313  Pel*  pSrcU =           getCbAddr(uiPartIdx);
314  Pel*  pSrcV =           getCrAddr(uiPartIdx);
315  Pel*  pDstU = pcYuvDst->getCbAddr(uiPartIdx);
316  Pel*  pDstV = pcYuvDst->getCrAddr(uiPartIdx);
317 
318  if( pSrcU == pDstU && pSrcV == pDstV)
319  {
320    //th not a good idea
321    //th best would be to fix the caller
322    return ;
323  }
324 
325  UInt   iSrcStride = getCStride();
326  UInt   iDstStride = pcYuvDst->getCStride();
327  for ( UInt y = iHeight; y != 0; y-- )
328  {
329    ::memcpy( pDstU, pSrcU, iWidth * sizeof(Pel) );
330    ::memcpy( pDstV, pSrcV, iWidth * sizeof(Pel) );
331    pSrcU += iSrcStride;
332    pSrcV += iSrcStride;
333    pDstU += iDstStride;
334    pDstV += iDstStride;
335  }
336}
337
338Void TComYuv::copyPartToPartChroma( TComYuv* pcYuvDst, UInt uiPartIdx, UInt iWidth, UInt iHeight, UInt chromaId)
339{
340  if(chromaId == 0)
341  {
342    Pel*  pSrcU =           getCbAddr(uiPartIdx);
343    Pel*  pDstU = pcYuvDst->getCbAddr(uiPartIdx);
344    if( pSrcU == pDstU)
345    {
346      return ;
347    }
348    UInt   iSrcStride = getCStride();
349    UInt   iDstStride = pcYuvDst->getCStride();
350    for ( UInt y = iHeight; y != 0; y-- )
351    {
352      ::memcpy( pDstU, pSrcU, iWidth * sizeof(Pel) );
353      pSrcU += iSrcStride;
354      pDstU += iDstStride;
355    }
356  }
357  else if (chromaId == 1)
358  {
359    Pel*  pSrcV =           getCrAddr(uiPartIdx);
360    Pel*  pDstV = pcYuvDst->getCrAddr(uiPartIdx);
361    if( pSrcV == pDstV)
362    {
363      return;
364    }
365    UInt   iSrcStride = getCStride();
366    UInt   iDstStride = pcYuvDst->getCStride();
367    for ( UInt y = iHeight; y != 0; y-- )
368    { 
369      ::memcpy( pDstV, pSrcV, iWidth * sizeof(Pel) );
370      pSrcV += iSrcStride;
371      pDstV += iDstStride;
372    }
373  }
374  else
375  {
376    Pel*  pSrcU =           getCbAddr(uiPartIdx);
377    Pel*  pSrcV =           getCrAddr(uiPartIdx);
378    Pel*  pDstU = pcYuvDst->getCbAddr(uiPartIdx);
379    Pel*  pDstV = pcYuvDst->getCrAddr(uiPartIdx);
380   
381    if( pSrcU == pDstU && pSrcV == pDstV)
382    {
383      //th not a good idea
384      //th best would be to fix the caller
385      return ;
386    }
387    UInt   iSrcStride = getCStride();
388    UInt   iDstStride = pcYuvDst->getCStride();
389    for ( UInt y = iHeight; y != 0; y-- )
390    {
391      ::memcpy( pDstU, pSrcU, iWidth * sizeof(Pel) );
392      ::memcpy( pDstV, pSrcV, iWidth * sizeof(Pel) );
393      pSrcU += iSrcStride;
394      pSrcV += iSrcStride;
395      pDstU += iDstStride;
396      pDstV += iDstStride;
397    }
398  }
399}
400
401Void TComYuv::addClip( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize )
402{
403  addClipLuma   ( pcYuvSrc0, pcYuvSrc1, uiTrUnitIdx, uiPartSize     );
404  addClipChroma ( pcYuvSrc0, pcYuvSrc1, uiTrUnitIdx, uiPartSize>>1  );
405}
406
407Void TComYuv::addClipLuma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize )
408{
409  Int x, y;
410 
411  Pel* pSrc0 = pcYuvSrc0->getLumaAddr( uiTrUnitIdx, uiPartSize );
412  Pel* pSrc1 = pcYuvSrc1->getLumaAddr( uiTrUnitIdx, uiPartSize );
413  Pel* pDst  = getLumaAddr( uiTrUnitIdx, uiPartSize );
414 
415  UInt iSrc0Stride = pcYuvSrc0->getStride();
416  UInt iSrc1Stride = pcYuvSrc1->getStride();
417  UInt iDstStride  = getStride();
418  for ( y = uiPartSize-1; y >= 0; y-- )
419  {
420    for ( x = uiPartSize-1; x >= 0; x-- )
421    {
422      pDst[x] = ClipY( pSrc0[x] + pSrc1[x] );
423    }
424    pSrc0 += iSrc0Stride;
425    pSrc1 += iSrc1Stride;
426    pDst  += iDstStride;
427  }
428}
429
430Void TComYuv::addClipChroma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize )
431{
432  Int x, y;
433 
434  Pel* pSrcU0 = pcYuvSrc0->getCbAddr( uiTrUnitIdx, uiPartSize );
435  Pel* pSrcU1 = pcYuvSrc1->getCbAddr( uiTrUnitIdx, uiPartSize );
436  Pel* pSrcV0 = pcYuvSrc0->getCrAddr( uiTrUnitIdx, uiPartSize );
437  Pel* pSrcV1 = pcYuvSrc1->getCrAddr( uiTrUnitIdx, uiPartSize );
438  Pel* pDstU = getCbAddr( uiTrUnitIdx, uiPartSize );
439  Pel* pDstV = getCrAddr( uiTrUnitIdx, uiPartSize );
440 
441  UInt  iSrc0Stride = pcYuvSrc0->getCStride();
442  UInt  iSrc1Stride = pcYuvSrc1->getCStride();
443  UInt  iDstStride  = getCStride();
444  for ( y = uiPartSize-1; y >= 0; y-- )
445  {
446    for ( x = uiPartSize-1; x >= 0; x-- )
447    {
448      pDstU[x] = ClipC( pSrcU0[x] + pSrcU1[x] );
449      pDstV[x] = ClipC( pSrcV0[x] + pSrcV1[x] );
450    }
451   
452    pSrcU0 += iSrc0Stride;
453    pSrcU1 += iSrc1Stride;
454    pSrcV0 += iSrc0Stride;
455    pSrcV1 += iSrc1Stride;
456    pDstU  += iDstStride;
457    pDstV  += iDstStride;
458  }
459}
460
461Void TComYuv::subtract( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize )
462{
463  subtractLuma  ( pcYuvSrc0, pcYuvSrc1,  uiTrUnitIdx, uiPartSize    );
464  subtractChroma( pcYuvSrc0, pcYuvSrc1,  uiTrUnitIdx, uiPartSize>>1 );
465}
466
467Void TComYuv::subtractLuma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize )
468{
469  Int x, y;
470 
471  Pel* pSrc0 = pcYuvSrc0->getLumaAddr( uiTrUnitIdx, uiPartSize );
472  Pel* pSrc1 = pcYuvSrc1->getLumaAddr( uiTrUnitIdx, uiPartSize );
473  Pel* pDst  = getLumaAddr( uiTrUnitIdx, uiPartSize );
474 
475  Int  iSrc0Stride = pcYuvSrc0->getStride();
476  Int  iSrc1Stride = pcYuvSrc1->getStride();
477  Int  iDstStride  = getStride();
478  for ( y = uiPartSize-1; y >= 0; y-- )
479  {
480    for ( x = uiPartSize-1; x >= 0; x-- )
481    {
482      pDst[x] = pSrc0[x] - pSrc1[x];
483    }
484    pSrc0 += iSrc0Stride;
485    pSrc1 += iSrc1Stride;
486    pDst  += iDstStride;
487  }
488}
489
490Void TComYuv::subtractChroma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize )
491{
492  Int x, y;
493 
494  Pel* pSrcU0 = pcYuvSrc0->getCbAddr( uiTrUnitIdx, uiPartSize );
495  Pel* pSrcU1 = pcYuvSrc1->getCbAddr( uiTrUnitIdx, uiPartSize );
496  Pel* pSrcV0 = pcYuvSrc0->getCrAddr( uiTrUnitIdx, uiPartSize );
497  Pel* pSrcV1 = pcYuvSrc1->getCrAddr( uiTrUnitIdx, uiPartSize );
498  Pel* pDstU  = getCbAddr( uiTrUnitIdx, uiPartSize );
499  Pel* pDstV  = getCrAddr( uiTrUnitIdx, uiPartSize );
500 
501  Int  iSrc0Stride = pcYuvSrc0->getCStride();
502  Int  iSrc1Stride = pcYuvSrc1->getCStride();
503  Int  iDstStride  = getCStride();
504  for ( y = uiPartSize-1; y >= 0; y-- )
505  {
506    for ( x = uiPartSize-1; x >= 0; x-- )
507    {
508      pDstU[x] = pSrcU0[x] - pSrcU1[x];
509      pDstV[x] = pSrcV0[x] - pSrcV1[x];
510    }
511    pSrcU0 += iSrc0Stride;
512    pSrcU1 += iSrc1Stride;
513    pSrcV0 += iSrc0Stride;
514    pSrcV1 += iSrc1Stride;
515    pDstU  += iDstStride;
516    pDstV  += iDstStride;
517  }
518}
519
520Void TComYuv::addAvg( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt iPartUnitIdx, UInt iWidth, UInt iHeight )
521{
522  Int x, y;
523 
524  Pel* pSrcY0  = pcYuvSrc0->getLumaAddr( iPartUnitIdx );
525  Pel* pSrcU0  = pcYuvSrc0->getCbAddr  ( iPartUnitIdx );
526  Pel* pSrcV0  = pcYuvSrc0->getCrAddr  ( iPartUnitIdx );
527 
528  Pel* pSrcY1  = pcYuvSrc1->getLumaAddr( iPartUnitIdx );
529  Pel* pSrcU1  = pcYuvSrc1->getCbAddr  ( iPartUnitIdx );
530  Pel* pSrcV1  = pcYuvSrc1->getCrAddr  ( iPartUnitIdx );
531 
532  Pel* pDstY   = getLumaAddr( iPartUnitIdx );
533  Pel* pDstU   = getCbAddr  ( iPartUnitIdx );
534  Pel* pDstV   = getCrAddr  ( iPartUnitIdx );
535 
536  UInt  iSrc0Stride = pcYuvSrc0->getStride();
537  UInt  iSrc1Stride = pcYuvSrc1->getStride();
538  UInt  iDstStride  = getStride();
539  Int shiftNum = IF_INTERNAL_PREC + 1 - g_bitDepthY;
540  Int offset = ( 1 << ( shiftNum - 1 ) ) + 2 * IF_INTERNAL_OFFS;
541 
542  for ( y = 0; y < iHeight; y++ )
543  {
544    for ( x = 0; x < iWidth; x += 4 )
545    {
546      pDstY[ x + 0 ] = ClipY( ( pSrcY0[ x + 0 ] + pSrcY1[ x + 0 ] + offset ) >> shiftNum );
547      pDstY[ x + 1 ] = ClipY( ( pSrcY0[ x + 1 ] + pSrcY1[ x + 1 ] + offset ) >> shiftNum );
548      pDstY[ x + 2 ] = ClipY( ( pSrcY0[ x + 2 ] + pSrcY1[ x + 2 ] + offset ) >> shiftNum );
549      pDstY[ x + 3 ] = ClipY( ( pSrcY0[ x + 3 ] + pSrcY1[ x + 3 ] + offset ) >> shiftNum );
550    }
551    pSrcY0 += iSrc0Stride;
552    pSrcY1 += iSrc1Stride;
553    pDstY  += iDstStride;
554  }
555 
556  shiftNum = IF_INTERNAL_PREC + 1 - g_bitDepthC;
557  offset = ( 1 << ( shiftNum - 1 ) ) + 2 * IF_INTERNAL_OFFS;
558
559  iSrc0Stride = pcYuvSrc0->getCStride();
560  iSrc1Stride = pcYuvSrc1->getCStride();
561  iDstStride  = getCStride();
562 
563  iWidth  >>=1;
564  iHeight >>=1;
565 
566  for ( y = iHeight-1; y >= 0; y-- )
567  {
568    for ( x = iWidth-1; x >= 0; )
569    {
570      // note: chroma min width is 2
571      pDstU[x] = ClipC((pSrcU0[x] + pSrcU1[x] + offset) >> shiftNum);
572      pDstV[x] = ClipC((pSrcV0[x] + pSrcV1[x] + offset) >> shiftNum); x--;
573      pDstU[x] = ClipC((pSrcU0[x] + pSrcU1[x] + offset) >> shiftNum);
574      pDstV[x] = ClipC((pSrcV0[x] + pSrcV1[x] + offset) >> shiftNum); x--;
575    }
576   
577    pSrcU0 += iSrc0Stride;
578    pSrcU1 += iSrc1Stride;
579    pSrcV0 += iSrc0Stride;
580    pSrcV1 += iSrc1Stride;
581    pDstU  += iDstStride;
582    pDstV  += iDstStride;
583  }
584}
585
586Void TComYuv::removeHighFreq( TComYuv* pcYuvSrc, UInt uiPartIdx, UInt uiWidht, UInt uiHeight )
587{
588  Int x, y;
589 
590  Pel* pSrc  = pcYuvSrc->getLumaAddr(uiPartIdx);
591  Pel* pSrcU = pcYuvSrc->getCbAddr(uiPartIdx);
592  Pel* pSrcV = pcYuvSrc->getCrAddr(uiPartIdx);
593 
594  Pel* pDst  = getLumaAddr(uiPartIdx);
595  Pel* pDstU = getCbAddr(uiPartIdx);
596  Pel* pDstV = getCrAddr(uiPartIdx);
597 
598  Int  iSrcStride = pcYuvSrc->getStride();
599  Int  iDstStride = getStride();
600 
601  for ( y = uiHeight-1; y >= 0; y-- )
602  {
603    for ( x = uiWidht-1; x >= 0; x-- )
604    {
605#if DISABLING_CLIP_FOR_BIPREDME
606      pDst[x ] = (pDst[x ]<<1) - pSrc[x ] ;
607#else
608      pDst[x ] = Clip( (pDst[x ]<<1) - pSrc[x ] );
609#endif
610    }
611    pSrc += iSrcStride;
612    pDst += iDstStride;
613  }
614 
615  iSrcStride = pcYuvSrc->getCStride();
616  iDstStride = getCStride();
617 
618  uiHeight >>= 1;
619  uiWidht  >>= 1;
620 
621  for ( y = uiHeight-1; y >= 0; y-- )
622  {
623    for ( x = uiWidht-1; x >= 0; x-- )
624    {
625#if DISABLING_CLIP_FOR_BIPREDME
626      pDstU[x ] = (pDstU[x ]<<1) - pSrcU[x ] ;
627      pDstV[x ] = (pDstV[x ]<<1) - pSrcV[x ] ;
628#else
629      pDstU[x ] = Clip( (pDstU[x ]<<1) - pSrcU[x ] );
630      pDstV[x ] = Clip( (pDstV[x ]<<1) - pSrcV[x ] );
631#endif
632    }
633    pSrcU += iSrcStride;
634    pSrcV += iSrcStride;
635    pDstU += iDstStride;
636    pDstV += iDstStride;
637  }
638}
639//! \}
Note: See TracBrowser for help on using the repository browser.