source: 3DVCSoftware/branches/HTM-6.2-dev2-MERL/source/Lib/TLibCommon/TComPrediction.cpp @ 417

Last change on this file since 417 was 417, checked in by mitsubishi-htm, 11 years ago

-update variable names.

  • Property svn:eol-style set to native
File size: 132.9 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-2012, 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     TComPrediction.cpp
35    \brief    prediction class
36*/
37
38#include <memory.h>
39#include "TComPrediction.h"
40
41//! \ingroup TLibCommon
42//! \{
43
44// ====================================================================================================================
45// Constructor / destructor / initialize
46// ====================================================================================================================
47
48#if LGE_EDGE_INTRA_A0070
49#define MAX_DISTANCE_EDGEINTRA 255
50#endif
51
52#if MERL_VSP_C0152
53#if MERL_CVSP_D0165
54Int TComPrediction::m_iRangeLuma[12]   = {14, 34, 21, 15, 36, 26, 21, 49, 41, 36, 80, 72};
55Int TComPrediction::m_iRangeChroma[12] = { 2,  8,  5,  4, 11,  9,  8, 19, 17, 15, 34, 32};
56#endif
57#endif
58
59TComPrediction::TComPrediction()
60: m_pLumaRecBuffer(0)
61{
62  m_piYuvExt = NULL;
63#if MERL_VSP_C0152
64  m_pDepth = (Int*) malloc(64*64*sizeof(Int)); // TODO: Use a smart way to determine the size of the array
65  if (m_pDepth == NULL)
66  {
67      printf("ERROR: UKTGHU, No memory allocated.\n");
68  }
69#endif
70}
71
72TComPrediction::~TComPrediction()
73{
74 
75#if MERL_VSP_C0152
76  if (m_pDepth != NULL)
77  {
78      free(m_pDepth);
79  }
80#endif
81  delete[] m_piYuvExt;
82
83  m_acYuvPred[0].destroy();
84  m_acYuvPred[1].destroy();
85
86  m_cYuvPredTemp.destroy();
87#if QC_ARP_D0177
88  m_acYuvPredBase[0].destroy();
89  m_acYuvPredBase[1].destroy();
90  m_acYuvDiff[0].destroy();
91  m_acYuvDiff[1].destroy();
92#endif
93  if( m_pLumaRecBuffer )
94  {
95    delete [] m_pLumaRecBuffer;
96  }
97 
98  Int i, j;
99  for (i = 0; i < 4; i++)
100  {
101    for (j = 0; j < 4; j++)
102    {
103      m_filteredBlock[i][j].destroy();
104    }
105    m_filteredBlockTmp[i].destroy();
106  }
107}
108
109Void TComPrediction::initTempBuff()
110{
111  if( m_piYuvExt == NULL )
112  {
113    Int extWidth  = g_uiMaxCUWidth + 16; 
114    Int extHeight = g_uiMaxCUHeight + 1;
115    Int i, j;
116    for (i = 0; i < 4; i++)
117    {
118      m_filteredBlockTmp[i].create(extWidth, extHeight + 7);
119      for (j = 0; j < 4; j++)
120      {
121        m_filteredBlock[i][j].create(extWidth, extHeight);
122      }
123    }
124    m_iYuvExtHeight  = ((g_uiMaxCUHeight + 2) << 4);
125    m_iYuvExtStride = ((g_uiMaxCUWidth  + 8) << 4);
126    m_piYuvExt = new Int[ m_iYuvExtStride * m_iYuvExtHeight ];
127
128    // new structure
129    m_acYuvPred[0] .create( g_uiMaxCUWidth, g_uiMaxCUHeight );
130    m_acYuvPred[1] .create( g_uiMaxCUWidth, g_uiMaxCUHeight );
131
132    m_cYuvPredTemp.create( g_uiMaxCUWidth, g_uiMaxCUHeight );
133#if QC_ARP_D0177
134    m_acYuvPredBase[0] .create( g_uiMaxCUWidth, g_uiMaxCUHeight );
135    m_acYuvPredBase[1] .create( g_uiMaxCUWidth, g_uiMaxCUHeight );
136    m_acYuvDiff    [0] .create( g_uiMaxCUWidth, g_uiMaxCUHeight );
137    m_acYuvDiff    [1] .create( g_uiMaxCUWidth, g_uiMaxCUHeight );
138#endif
139  }
140
141  m_iLumaRecStride =  (g_uiMaxCUWidth>>1) + 1;
142  m_pLumaRecBuffer = new Pel[ m_iLumaRecStride * m_iLumaRecStride ];
143
144  for( Int i = 1; i < 64; i++ )
145  {
146    m_uiaShift[i-1] = ( (1 << 15) + i/2 ) / i;
147  }
148}
149
150// ====================================================================================================================
151// Public member functions
152// ====================================================================================================================
153
154// Function for calculating DC value of the reference samples used in Intra prediction
155Pel TComPrediction::predIntraGetPredValDC( Int* pSrc, Int iSrcStride, UInt iWidth, UInt iHeight, Bool bAbove, Bool bLeft )
156{
157  Int iInd, iSum = 0;
158  Pel pDcVal;
159
160  if (bAbove)
161  {
162    for (iInd = 0;iInd < iWidth;iInd++)
163    {
164      iSum += pSrc[iInd-iSrcStride];
165    }
166  }
167  if (bLeft)
168  {
169    for (iInd = 0;iInd < iHeight;iInd++)
170    {
171      iSum += pSrc[iInd*iSrcStride-1];
172    }
173  }
174
175  if (bAbove && bLeft)
176  {
177    pDcVal = (iSum + iWidth) / (iWidth + iHeight);
178  }
179  else if (bAbove)
180  {
181    pDcVal = (iSum + iWidth/2) / iWidth;
182  }
183  else if (bLeft)
184  {
185    pDcVal = (iSum + iHeight/2) / iHeight;
186  }
187  else
188  {
189    pDcVal = pSrc[-1]; // Default DC value already calculated and placed in the prediction array if no neighbors are available
190  }
191 
192  return pDcVal;
193}
194
195// Function for deriving the angular Intra predictions
196
197/** Function for deriving the simplified angular intra predictions.
198 * \param pSrc pointer to reconstructed sample array
199 * \param srcStride the stride of the reconstructed sample array
200 * \param rpDst reference to pointer for the prediction sample array
201 * \param dstStride the stride of the prediction sample array
202 * \param width the width of the block
203 * \param height the height of the block
204 * \param dirMode the intra prediction mode index
205 * \param blkAboveAvailable boolean indication if the block above is available
206 * \param blkLeftAvailable boolean indication if the block to the left is available
207 *
208 * This function derives the prediction samples for the angular mode based on the prediction direction indicated by
209 * the prediction mode index. The prediction direction is given by the displacement of the bottom row of the block and
210 * the reference row above the block in the case of vertical prediction or displacement of the rightmost column
211 * of the block and reference column left from the block in the case of the horizontal prediction. The displacement
212 * is signalled at 1/32 pixel accuracy. When projection of the predicted pixel falls inbetween reference samples,
213 * the predicted value for the pixel is linearly interpolated from the reference samples. All reference samples are taken
214 * from the extended main reference.
215 */
216Void TComPrediction::xPredIntraAng( Int* pSrc, Int srcStride, Pel*& rpDst, Int dstStride, UInt width, UInt height, UInt dirMode, Bool blkAboveAvailable, Bool blkLeftAvailable, Bool bFilter )
217{
218  Int k,l;
219  Int blkSize        = width;
220  Pel* pDst          = rpDst;
221
222  // Map the mode index to main prediction direction and angle
223  assert( dirMode > 0 ); //no planar
224  Bool modeDC        = dirMode < 2;
225  Bool modeHor       = !modeDC && (dirMode < 18);
226  Bool modeVer       = !modeDC && !modeHor;
227  Int intraPredAngle = modeVer ? (Int)dirMode - VER_IDX : modeHor ? -((Int)dirMode - HOR_IDX) : 0;
228  Int absAng         = abs(intraPredAngle);
229  Int signAng        = intraPredAngle < 0 ? -1 : 1;
230
231  // Set bitshifts and scale the angle parameter to block size
232  Int angTable[9]    = {0,    2,    5,   9,  13,  17,  21,  26,  32};
233  Int invAngTable[9] = {0, 4096, 1638, 910, 630, 482, 390, 315, 256}; // (256 * 32) / Angle
234  Int invAngle       = invAngTable[absAng];
235  absAng             = angTable[absAng];
236  intraPredAngle     = signAng * absAng;
237
238  // Do the DC prediction
239  if (modeDC)
240  {
241    Pel dcval = predIntraGetPredValDC(pSrc, srcStride, width, height, blkAboveAvailable, blkLeftAvailable);
242
243    for (k=0;k<blkSize;k++)
244    {
245      for (l=0;l<blkSize;l++)
246      {
247        pDst[k*dstStride+l] = dcval;
248      }
249    }
250  }
251
252  // Do angular predictions
253  else
254  {
255    Pel* refMain;
256    Pel* refSide;
257    Pel  refAbove[2*MAX_CU_SIZE+1];
258    Pel  refLeft[2*MAX_CU_SIZE+1];
259
260    // Initialise the Main and Left reference array.
261    if (intraPredAngle < 0)
262    {
263      for (k=0;k<blkSize+1;k++)
264      {
265        refAbove[k+blkSize-1] = pSrc[k-srcStride-1];
266      }
267      for (k=0;k<blkSize+1;k++)
268      {
269        refLeft[k+blkSize-1] = pSrc[(k-1)*srcStride-1];
270      }
271      refMain = (modeVer ? refAbove : refLeft) + (blkSize-1);
272      refSide = (modeVer ? refLeft : refAbove) + (blkSize-1);
273
274      // Extend the Main reference to the left.
275      Int invAngleSum    = 128;       // rounding for (shift by 8)
276      for (k=-1; k>blkSize*intraPredAngle>>5; k--)
277      {
278        invAngleSum += invAngle;
279        refMain[k] = refSide[invAngleSum>>8];
280      }
281    }
282    else
283    {
284      for (k=0;k<2*blkSize+1;k++)
285      {
286        refAbove[k] = pSrc[k-srcStride-1];
287      }
288      for (k=0;k<2*blkSize+1;k++)
289      {
290        refLeft[k] = pSrc[(k-1)*srcStride-1];
291      }
292      refMain = modeVer ? refAbove : refLeft;
293      refSide = modeVer ? refLeft  : refAbove;
294    }
295
296    if (intraPredAngle == 0)
297    {
298      for (k=0;k<blkSize;k++)
299      {
300        for (l=0;l<blkSize;l++)
301        {
302          pDst[k*dstStride+l] = refMain[l+1];
303        }
304      }
305
306      if ( bFilter )
307      {
308        for (k=0;k<blkSize;k++)
309        {
310          pDst[k*dstStride] = Clip ( pDst[k*dstStride] + (( refSide[k+1] - refSide[0] ) >> 1) );
311        }
312      }
313    }
314    else
315    {
316      Int deltaPos=0;
317      Int deltaInt;
318      Int deltaFract;
319      Int refMainIndex;
320
321      for (k=0;k<blkSize;k++)
322      {
323        deltaPos += intraPredAngle;
324        deltaInt   = deltaPos >> 5;
325        deltaFract = deltaPos & (32 - 1);
326
327        if (deltaFract)
328        {
329          // Do linear filtering
330          for (l=0;l<blkSize;l++)
331          {
332            refMainIndex        = l+deltaInt+1;
333            pDst[k*dstStride+l] = (Pel) ( ((32-deltaFract)*refMain[refMainIndex]+deltaFract*refMain[refMainIndex+1]+16) >> 5 );
334          }
335        }
336        else
337        {
338          // Just copy the integer samples
339          for (l=0;l<blkSize;l++)
340          {
341            pDst[k*dstStride+l] = refMain[l+deltaInt+1];
342          }
343        }
344      }
345    }
346
347    // Flip the block if this is the horizontal mode
348    if (modeHor)
349    {
350      Pel  tmp;
351      for (k=0;k<blkSize-1;k++)
352      {
353        for (l=k+1;l<blkSize;l++)
354        {
355          tmp                 = pDst[k*dstStride+l];
356          pDst[k*dstStride+l] = pDst[l*dstStride+k];
357          pDst[l*dstStride+k] = tmp;
358        }
359      }
360    }
361  }
362}
363
364Void TComPrediction::predIntraLumaAng(TComPattern* pcTComPattern, UInt uiDirMode, Pel* piPred, UInt uiStride, Int iWidth, Int iHeight,  TComDataCU* pcCU, Bool bAbove, Bool bLeft )
365{
366  Pel *pDst = piPred;
367  Int *ptrSrc;
368
369  assert( g_aucConvertToBit[ iWidth ] >= 0 ); //   4x  4
370  assert( g_aucConvertToBit[ iWidth ] <= 5 ); // 128x128
371  assert( iWidth == iHeight  );
372
373  ptrSrc = pcTComPattern->getPredictorPtr( uiDirMode, g_aucConvertToBit[ iWidth ] + 2, m_piYuvExt );
374
375  // get starting pixel in block
376  Int sw = 2 * iWidth + 1;
377
378  // Create the prediction
379  if ( uiDirMode == PLANAR_IDX )
380  {
381    xPredIntraPlanar( ptrSrc+sw+1, sw, pDst, uiStride, iWidth, iHeight );
382  }
383  else
384  {
385    xPredIntraAng( ptrSrc+sw+1, sw, pDst, uiStride, iWidth, iHeight, uiDirMode, bAbove, bLeft, true );
386
387    if( (uiDirMode == DC_IDX ) && bAbove && bLeft )
388    {
389      xDCPredFiltering( ptrSrc+sw+1, sw, pDst, uiStride, iWidth, iHeight);
390    }
391  }
392}
393
394// Angular chroma
395Void TComPrediction::predIntraChromaAng( TComPattern* pcTComPattern, Int* piSrc, UInt uiDirMode, Pel* piPred, UInt uiStride, Int iWidth, Int iHeight, TComDataCU* pcCU, Bool bAbove, Bool bLeft )
396{
397  Pel *pDst = piPred;
398  Int *ptrSrc = piSrc;
399
400  // get starting pixel in block
401  Int sw = 2 * iWidth + 1;
402
403  if ( uiDirMode == PLANAR_IDX )
404  {
405    xPredIntraPlanar( ptrSrc+sw+1, sw, pDst, uiStride, iWidth, iHeight );
406  }
407  else
408  {
409    // Create the prediction
410    xPredIntraAng( ptrSrc+sw+1, sw, pDst, uiStride, iWidth, iHeight, uiDirMode, bAbove, bLeft, false );
411  }
412}
413
414/** Function for checking identical motion.
415 * \param TComDataCU* pcCU
416 * \param UInt PartAddr
417 */
418Bool TComPrediction::xCheckIdenticalMotion ( TComDataCU* pcCU, UInt PartAddr )
419{
420  if( pcCU->getSlice()->isInterB() && pcCU->getSlice()->getPPS()->getWPBiPredIdc() == 0 )
421  {
422    if( pcCU->getCUMvField(REF_PIC_LIST_0)->getRefIdx(PartAddr) >= 0 && pcCU->getCUMvField(REF_PIC_LIST_1)->getRefIdx(PartAddr) >= 0)
423    {
424      Int RefPOCL0    = pcCU->getSlice()->getRefPic(REF_PIC_LIST_0, pcCU->getCUMvField(REF_PIC_LIST_0)->getRefIdx(PartAddr))->getPOC();
425      Int RefViewIdL0 = pcCU->getSlice()->getRefPic(REF_PIC_LIST_0, pcCU->getCUMvField(REF_PIC_LIST_0)->getRefIdx(PartAddr))->getViewId();
426      Int RefPOCL1    = pcCU->getSlice()->getRefPic(REF_PIC_LIST_1, pcCU->getCUMvField(REF_PIC_LIST_1)->getRefIdx(PartAddr))->getPOC();
427      Int RefViewIdL1 = pcCU->getSlice()->getRefPic(REF_PIC_LIST_1, pcCU->getCUMvField(REF_PIC_LIST_1)->getRefIdx(PartAddr))->getViewId();
428      if(RefPOCL0 == RefPOCL1 && RefViewIdL0 == RefViewIdL1 && pcCU->getCUMvField(REF_PIC_LIST_0)->getMv(PartAddr) == pcCU->getCUMvField(REF_PIC_LIST_1)->getMv(PartAddr))
429      {
430        return true;
431      }
432    }
433  }
434  return false;
435}
436
437#if LGE_EDGE_INTRA_A0070
438Void TComPrediction::predIntraLumaEdge ( TComDataCU* pcCU, TComPattern* pcTComPattern, UInt uiAbsPartIdx, Int iWidth, Int iHeight, Pel* piPred, UInt uiStride, Bool bDelta )
439{
440  Pel *piDst = piPred;
441  Int *piSrc;
442  Int iSrcStride = ( iWidth<<1 ) + 1;
443  Int iDstStride = uiStride;
444
445  piSrc = pcTComPattern->getPredictorPtr( 0, g_aucConvertToBit[ iWidth ] + 2, m_piYuvExt );
446
447  xPredIntraEdge ( pcCU, uiAbsPartIdx, iWidth, iHeight, piSrc, iSrcStride, piDst, iDstStride
448#if LGE_EDGE_INTRA_DELTA_DC
449    , bDelta
450#endif
451    );
452}
453
454Pel  TComPrediction::xGetNearestNeighbor( Int x, Int y, Int* pSrc, Int srcStride, Int iWidth, Int iHeight, Bool* bpRegion )
455{
456  Bool bLeft = (x < y) ? true : false;
457  Bool bFound = false;
458  Int  iFoundX = -1, iFoundY = -1;
459  Int  cResult = 0;
460
461  UChar* piTopDistance = new UChar[iWidth];
462  UChar* piLeftDistance = new UChar[iHeight];
463
464  for( Int i = 0; i < iWidth; i++ )
465  {
466    int Abs = x > i ? x - i : i - x;
467    piTopDistance[ i ] = y + Abs;
468
469    Abs = y > i ? y - i : i - y;
470    piLeftDistance[ i ] = x + Abs;
471  }
472
473  for( Int dist = 0; dist < MAX_DISTANCE_EDGEINTRA && !bFound; dist++ )
474  {
475    if( !bLeft )
476    {
477      for( Int i = 0; i < iWidth; i++ )
478      {
479        if( piTopDistance[ i ] == dist )
480        {
481          if( bpRegion[ i ] == bpRegion[ x + y * iWidth ] )
482          {
483            iFoundX = i;
484            iFoundY = 0;
485            bFound = true;
486          }
487        }
488      }
489      for( Int i = 0; i < iHeight; i++ )
490      {
491        if( piLeftDistance[ i ] == dist )
492        {
493          if( bpRegion[ i * iWidth ] == bpRegion[ x + y * iWidth ] )
494          {
495            iFoundX = 0;
496            iFoundY = i;
497            bFound = true;
498          }
499        }
500      }
501    }
502    else
503    {
504      for( Int i = 0; i < iHeight; i++ )
505      {
506        if( piLeftDistance[ i ] == dist )
507        {
508          if( bpRegion[ i * iWidth ] == bpRegion[ x + y * iWidth ] )
509          {
510            iFoundX = 0;
511            iFoundY = i;
512            bFound = true;
513          }
514        }
515      }
516      for( Int i = 0; i < iWidth; i++ )
517      {
518        if( piTopDistance[ i ] == dist )
519        {
520          if( bpRegion[ i ] == bpRegion[ x + y * iWidth ] )
521          {
522            iFoundX = i;
523            iFoundY = 0;
524            bFound = true;
525          }
526        }
527      }
528    }
529  }
530
531  if( iFoundY == 0 )
532  {
533    cResult = pSrc[ iFoundX + 1 ];
534  }
535  else // iFoundX == 0
536  {
537    cResult = pSrc[ (iFoundY + 1) * srcStride ];
538  }
539
540  delete[] piTopDistance;  piTopDistance = NULL;
541  delete[] piLeftDistance; piLeftDistance = NULL;
542
543  assert( bFound );
544
545  return cResult;
546}
547
548Void TComPrediction::xPredIntraEdge( TComDataCU* pcCU, UInt uiAbsPartIdx, Int iWidth, Int iHeight, Int* pSrc, Int srcStride, Pel*& rpDst, Int dstStride, Bool bDelta )
549{
550  Pel* pDst = rpDst;
551  Bool* pbRegion = pcCU->getEdgePartition( uiAbsPartIdx );
552
553  // Do prediction
554  {
555    //UInt uiSum0 = 0, uiSum1 = 0;
556    Int iSum0 = 0, iSum1 = 0;
557    //UInt uiMean0, uiMean1;
558    Int iMean0, iMean1;
559    //UInt uiCount0 = 0, uiCount1 = 0;
560    Int iCount0 = 0, iCount1 = 0;
561    for( UInt ui = 0; ui < iWidth; ui++ )
562    {
563      if( pbRegion[ ui ] == false )
564      {
565        iSum0 += (pSrc[ ui + 1 ]);
566        iCount0++;
567      }
568      else
569      {
570        iSum1 += (pSrc[ ui + 1 ]);
571        iCount1++;
572      }
573    }
574    for( UInt ui = 0; ui < iHeight; ui++ ) // (0,0) recount (to avoid division)
575    {
576      if( pbRegion[ ui * iWidth ] == false )
577      {
578        iSum0 += (pSrc[ (ui + 1) * srcStride ]);
579        iCount0++;
580      }
581      else
582      {
583        iSum1 += (pSrc[ (ui + 1) * srcStride ]);
584        iCount1++;
585      }
586    }
587    if( iCount0 == 0 )
588      assert(false);
589    if( iCount1 == 0 )
590      assert(false);
591    iMean0 = iSum0 / iCount0; // TODO : integer op.
592    iMean1 = iSum1 / iCount1;
593#if LGE_EDGE_INTRA_DELTA_DC
594    if( bDelta ) 
595    {
596      Int iDeltaDC0 = pcCU->getEdgeDeltaDC0( uiAbsPartIdx );
597      Int iDeltaDC1 = pcCU->getEdgeDeltaDC1( uiAbsPartIdx );
598      xDeltaDCQuantScaleUp( pcCU, iDeltaDC0 );
599      xDeltaDCQuantScaleUp( pcCU, iDeltaDC1 );
600      iMean0 = Clip( iMean0 + iDeltaDC0 );
601      iMean1 = Clip( iMean1 + iDeltaDC1 );
602    }
603#endif
604    for( UInt ui = 0; ui < iHeight; ui++ )
605    {
606      for( UInt uii = 0; uii < iWidth; uii++ )
607      {
608        if( pbRegion[ uii + ui * iWidth ] == false )
609          pDst[ uii + ui * dstStride ] = iMean0;
610        else
611          pDst[ uii + ui * dstStride ] = iMean1;
612      }
613    }
614  }
615}
616#endif
617
618#if DEPTH_MAP_GENERATION
619#if MERL_VSP_C0152
620Void TComPrediction::motionCompensation( TComDataCU* pcCU, TComYuv* pcYuvPred, UInt uiAbsPartIdx, RefPicList eRefPicList, Int iPartIdx, Bool bPrdDepthMap, UInt uiSubSampExpX, UInt uiSubSampExpY )
621#else
622Void TComPrediction::motionCompensation( TComDataCU* pcCU, TComYuv* pcYuvPred, RefPicList eRefPicList, Int iPartIdx, Bool bPrdDepthMap, UInt uiSubSampExpX, UInt uiSubSampExpY )
623#endif
624#else
625#if MERL_VSP_C0152
626Void TComPrediction::motionCompensation ( TComDataCU* pcCU, TComYuv* pcYuvPred, UInt uiAbsPartIdx, RefPicList eRefPicList, Int iPartIdx )
627#else
628Void TComPrediction::motionCompensation ( TComDataCU* pcCU, TComYuv* pcYuvPred, RefPicList eRefPicList, Int iPartIdx )
629#endif
630#endif
631{
632  Int         iWidth;
633  Int         iHeight;
634  UInt        uiPartAddr;
635
636  if ( iPartIdx >= 0 )
637  {
638    pcCU->getPartIndexAndSize( iPartIdx, uiPartAddr, iWidth, iHeight );
639
640#if DEPTH_MAP_GENERATION
641    if( bPrdDepthMap )
642    {
643      iWidth  >>= uiSubSampExpX;
644      iHeight >>= uiSubSampExpY;
645    }
646#endif
647
648    if ( eRefPicList != REF_PIC_LIST_X )
649    {
650#if LGE_ILLUCOMP_B0045
651      if( pcCU->getSlice()->getPPS()->getUseWP() && !pcCU->getICFlag(uiPartAddr))
652#else
653      if( pcCU->getSlice()->getPPS()->getUseWP())
654#endif
655      {
656#if MERL_VSP_C0152
657        xPredInterUni (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr, iWidth, iHeight, eRefPicList, pcYuvPred, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, true );
658#else
659        xPredInterUni (pcCU, uiPartAddr, iWidth, iHeight, eRefPicList, pcYuvPred, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, true );
660#endif
661      }
662      else
663      {
664#if MERL_VSP_C0152
665        xPredInterUni (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr, iWidth, iHeight, eRefPicList, pcYuvPred, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, false );
666#else       
667        xPredInterUni (pcCU, uiPartAddr, iWidth, iHeight, eRefPicList, pcYuvPred, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, false );
668#endif
669      }
670#if LGE_ILLUCOMP_B0045
671      if( pcCU->getSlice()->getPPS()->getUseWP() && !pcCU->getICFlag(uiPartAddr) )
672#else
673      if ( pcCU->getSlice()->getPPS()->getUseWP() )
674#endif
675      {
676        xWeightedPredictionUni( pcCU, pcYuvPred, uiPartAddr, iWidth, iHeight, eRefPicList, pcYuvPred, iPartIdx );
677      }
678    }
679    else
680    {
681      if( xCheckIdenticalMotion( pcCU, uiPartAddr ) && !bPrdDepthMap )
682      {
683#if MERL_VSP_C0152
684        xPredInterUni (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr, iWidth, iHeight, REF_PIC_LIST_0, pcYuvPred, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, false );
685#else
686        xPredInterUni (pcCU, uiPartAddr, iWidth, iHeight, REF_PIC_LIST_0, pcYuvPred, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, false );
687#endif
688      }
689      else
690      {
691#if MERL_VSP_C0152
692        xPredInterBi  (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr, iWidth, iHeight, uiSubSampExpX, uiSubSampExpY, pcYuvPred, iPartIdx, bPrdDepthMap );
693#else
694        xPredInterBi  (pcCU, uiPartAddr, iWidth, iHeight, uiSubSampExpX, uiSubSampExpY, pcYuvPred, iPartIdx, bPrdDepthMap );
695#endif
696      }
697    }
698    return;
699  }
700
701  for ( iPartIdx = 0; iPartIdx < pcCU->getNumPartInter(); iPartIdx++ )
702  {
703    pcCU->getPartIndexAndSize( iPartIdx, uiPartAddr, iWidth, iHeight );
704
705    if( bPrdDepthMap )
706    {
707      iWidth  >>= uiSubSampExpX;
708      iHeight >>= uiSubSampExpY;
709    }
710
711    if ( eRefPicList != REF_PIC_LIST_X )
712    {
713#if LGE_ILLUCOMP_B0045
714      if( pcCU->getSlice()->getPPS()->getUseWP() && !pcCU->getICFlag(uiPartAddr))
715#else
716      if( pcCU->getSlice()->getPPS()->getUseWP())
717#endif
718      {
719#if MERL_VSP_C0152
720        xPredInterUni (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr, iWidth, iHeight, eRefPicList, pcYuvPred, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, true );
721#else
722        xPredInterUni (pcCU, uiPartAddr, iWidth, iHeight, eRefPicList, pcYuvPred, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, true );
723#endif
724  }
725  else
726  {
727#if MERL_VSP_C0152
728        xPredInterUni (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr, iWidth, iHeight, eRefPicList, pcYuvPred, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, false );
729#else
730        xPredInterUni (pcCU, uiPartAddr, iWidth, iHeight, eRefPicList, pcYuvPred, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, false );
731#endif
732      }
733#if MERL_VSP_C0152
734      xPredInterUni (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr, iWidth, iHeight, eRefPicList, pcYuvPred, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, false );
735#else
736      xPredInterUni (pcCU, uiPartAddr, iWidth, iHeight, eRefPicList, pcYuvPred, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, false );
737#endif
738
739#if LGE_ILLUCOMP_B0045
740      if( pcCU->getSlice()->getPPS()->getUseWP() && !pcCU->getICFlag(uiPartAddr))
741#else
742      if( pcCU->getSlice()->getPPS()->getUseWP())
743#endif
744      {
745        xWeightedPredictionUni( pcCU, pcYuvPred, uiPartAddr, iWidth, iHeight, eRefPicList, pcYuvPred, iPartIdx );
746      }
747    }
748    else
749    {
750      if ( xCheckIdenticalMotion( pcCU, uiPartAddr ) )
751      {
752#if MERL_VSP_C0152
753        xPredInterUni (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr, iWidth, iHeight, REF_PIC_LIST_0, pcYuvPred, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, false );
754#else
755        xPredInterUni (pcCU, uiPartAddr, iWidth, iHeight, REF_PIC_LIST_0, pcYuvPred, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, false );
756#endif
757      }
758      else
759      {
760#if MERL_VSP_C0152
761        xPredInterBi  (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr, iWidth, iHeight, uiSubSampExpX, uiSubSampExpY, pcYuvPred, iPartIdx, bPrdDepthMap );
762#else
763        xPredInterBi  (pcCU, uiPartAddr, iWidth, iHeight, uiSubSampExpX, uiSubSampExpY, pcYuvPred, iPartIdx, bPrdDepthMap );
764#endif   
765      }
766    }
767  }
768  return;
769}
770
771#if H3D_IVRP & !QC_ARP_D0177
772Void TComPrediction::residualPrediction(TComDataCU* pcCU, TComYuv* pcYuvPred, TComYuv* pcYuvResPred)
773{
774  Int         iWidth;
775  Int         iHeight;
776  UInt        uiPartAddr;
777
778  pcCU->getPartIndexAndSize( 0, uiPartAddr, iWidth, iHeight );
779
780  Bool bResAvail = false;
781
782  bResAvail = pcCU->getResidualSamples( 0, true, pcYuvResPred );
783
784  assert (bResAvail);
785
786  pcYuvPred->add(pcYuvResPred, iWidth, iHeight);
787}
788#endif
789
790#if MERL_VSP_C0152
791// Function to perform VSP block compensation
792Void  TComPrediction::xPredInterVSPBlk(TComDataCU* pcCU, UInt uiPartAddr, UInt uiAbsPartIdx, Int iWidth, Int iHeight, TComMv cMv, RefPicList eRefPicList, TComYuv*& rpcYuvPred, Bool bi )
793{
794  TComPic*    pRefPicBaseTxt        = NULL;
795  TComPicYuv* pcBaseViewTxtPicYuv   = NULL;
796  TComPicYuv* pcBaseViewDepthPicYuv = NULL;
797  Int iBlkX = 0;
798  Int iBlkY = 0;
799  Int* pShiftLUT;
800  Int  iShiftPrec;
801
802#if !MERL_VSP_NBDV_RefVId_Fix_D0166
803  pRefPicBaseTxt        = pcCU->getSlice()->getRefPicBaseTxt();
804  pcBaseViewTxtPicYuv   = pRefPicBaseTxt->getPicYuvRec();
805  TComPic* pRefPicBaseDepth = pcCU->getSlice()->getRefPicBaseDepth();
806  pcBaseViewDepthPicYuv     = pRefPicBaseDepth->getPicYuvRec();
807
808  Int iBlkX = ( pcCU->getAddr() % pRefPicBaseDepth->getFrameWidthInCU() ) * g_uiMaxCUWidth  + g_auiRasterToPelX[ g_auiZscanToRaster[ uiAbsPartIdx ] ];
809  Int iBlkY = ( pcCU->getAddr() / pRefPicBaseDepth->getFrameWidthInCU() ) * g_uiMaxCUHeight + g_auiRasterToPelY[ g_auiZscanToRaster[ uiAbsPartIdx ] ];
810  pcCU->getSlice()->getBWVSPLUTParam(pShiftLUT, iShiftPrec);
811  xPredInterLumaBlkFromDM  ( pcBaseViewTxtPicYuv, pcBaseViewDepthPicYuv, pShiftLUT, iShiftPrec, &cMv, uiPartAddr, iBlkX,    iBlkY,    iWidth,    iHeight,    pcCU->getSlice()->getSPS()->isDepth(), rpcYuvPred );
812  xPredInterChromaBlkFromDM( pcBaseViewTxtPicYuv, pcBaseViewDepthPicYuv, pShiftLUT, iShiftPrec, &cMv, uiPartAddr, iBlkX>>1, iBlkY>>1, iWidth>>1, iHeight>>1, pcCU->getSlice()->getSPS()->isDepth(), rpcYuvPred );
813
814#else // MERL_VSP_NBDV_RefVId_Fix_D0166
815
816  //recover VSP reference frame according to negative refIdx number
817  RefPicList privateRefPicList = (RefPicList) pcCU->getVSPDir( uiPartAddr );
818  assert(privateRefPicList == REF_PIC_LIST_0 || privateRefPicList == REF_PIC_LIST_1);
819
820  // Step 1: get depth reference
821  Int  refIdx = -1-pcCU->getCUMvField( privateRefPicList )->getRefIdx( uiPartAddr ); // texture ref index, a trick when storing refIdx
822  Int  viewId = pcCU->getSlice()->getRefViewId(privateRefPicList, refIdx);  // texture view id
823  Int  refPoc = pcCU->getSlice()->getRefPOC(privateRefPicList, refIdx);     // texture POC
824  TComPic* pRefPicBaseDepth = pcCU->getSlice()->getDepthRefPic(viewId, refPoc);
825
826  pcBaseViewDepthPicYuv = pRefPicBaseDepth->getPicYuvRec();
827  assert(refPoc == pcCU->getSlice()->getPOC());
828  assert(pRefPicBaseDepth != NULL);
829  assert(pcBaseViewDepthPicYuv != NULL);
830
831  iBlkX = ( pcCU->getAddr() % pRefPicBaseDepth->getFrameWidthInCU() ) * g_uiMaxCUWidth  + g_auiRasterToPelX[ g_auiZscanToRaster[ uiAbsPartIdx ] ];
832  iBlkY = ( pcCU->getAddr() / pRefPicBaseDepth->getFrameWidthInCU() ) * g_uiMaxCUHeight + g_auiRasterToPelY[ g_auiZscanToRaster[ uiAbsPartIdx ] ];
833#if MERL_Bi_VSP_D0166
834  // Step 2: get texture reference
835  pRefPicBaseTxt = xGetVspRefTxt( pcCU, uiPartAddr, eRefPicList);
836  pcBaseViewTxtPicYuv = pRefPicBaseTxt->getPicYuvRec();
837  assert(pcBaseViewTxtPicYuv != NULL);
838
839  //initialize the LUT according to the reference view idx
840  pcCU->getSlice()->getBWVSPLUTParam(pShiftLUT, iShiftPrec, pRefPicBaseTxt->getViewId());
841
842  // Step 3: Do compensation
843  xPredInterLumaBlkFromDM  ( pcBaseViewTxtPicYuv, pcBaseViewDepthPicYuv, pShiftLUT, iShiftPrec, &cMv, uiPartAddr, iBlkX,    iBlkY,    iWidth,    iHeight,    pcCU->getSlice()->getSPS()->isDepth(), rpcYuvPred, bi );
844  xPredInterChromaBlkFromDM( pcBaseViewTxtPicYuv, pcBaseViewDepthPicYuv, pShiftLUT, iShiftPrec, &cMv, uiPartAddr, iBlkX>>1, iBlkY>>1, iWidth>>1, iHeight>>1, pcCU->getSlice()->getSPS()->isDepth(), rpcYuvPred, bi );
845#else
846  // Step 2: get texture reference
847  pRefPicBaseTxt = pcCU->getSlice()->getRefPic(privateRefPicList, refIdx);
848  pcBaseViewTxtPicYuv = pRefPicBaseTxt->getPicYuvRec();
849  assert(pcBaseViewTxtPicYuv != NULL);
850
851  //initialize the LUT according to the reference view idx
852  pcCU->getSlice()->getBWVSPLUTParam(pShiftLUT, iShiftPrec, pRefPicBaseTxt->getViewId());
853
854  // Step 3: Do compensation
855  xPredInterLumaBlkFromDM  ( pcBaseViewTxtPicYuv, pcBaseViewDepthPicYuv, pShiftLUT, iShiftPrec, &cMv, uiPartAddr, iBlkX,    iBlkY,    iWidth,    iHeight,    pcCU->getSlice()->getSPS()->isDepth(), rpcYuvPred );
856  xPredInterChromaBlkFromDM( pcBaseViewTxtPicYuv, pcBaseViewDepthPicYuv, pShiftLUT, iShiftPrec, &cMv, uiPartAddr, iBlkX>>1, iBlkY>>1, iWidth>>1, iHeight>>1, pcCU->getSlice()->getSPS()->isDepth(), rpcYuvPred );
857#endif
858
859#endif
860}
861
862
863
864#if MERL_Bi_VSP_D0166
865TComPic*  TComPrediction::xGetVspRefTxt(TComDataCU* pcCU, UInt uiPartAddr, RefPicList eRefPicList)
866{
867  RefPicList  privateRefPicList = (RefPicList) pcCU->getVSPDir( uiPartAddr );
868  Int         refIdx = -1-pcCU->getCUMvField( privateRefPicList )->getRefIdx( uiPartAddr ); // texture ref index, a trick when storing refIdx
869  Int         viewId = pcCU->getSlice()->getRefViewId(privateRefPicList, refIdx);  // texture view id
870  TComPic*    refPic = NULL;
871
872  assert(privateRefPicList == REF_PIC_LIST_0 || privateRefPicList == REF_PIC_LIST_1);
873
874  if (privateRefPicList == eRefPicList)
875  {
876    Int  refIdxt = -1-pcCU->getCUMvField( eRefPicList )->getRefIdx( uiPartAddr );
877    assert(refIdxt>= 0);
878    refPic = pcCU->getSlice()->getRefPic(eRefPicList, refIdxt);
879  }
880  else
881  {
882    // Find the other interview reference in order to do VSP
883    RefPicList otherRefPicList = privateRefPicList == REF_PIC_LIST_0 ? REF_PIC_LIST_1 : REF_PIC_LIST_0;
884    Bool isFound = false;
885    for (Int iRefIdx = 0; iRefIdx <pcCU->getSlice()->getNumRefIdx(otherRefPicList); iRefIdx ++ )
886    {
887      Int refViewIdx  = pcCU->getSlice()->getRefViewId( otherRefPicList, iRefIdx);
888      if ( (refViewIdx != pcCU->getSlice()->getViewId()) && (refViewIdx != viewId ) )
889      {
890        refPic = pcCU->getSlice()->getRefPic(otherRefPicList, iRefIdx);
891        isFound = true;
892        break;
893      }
894    }
895
896    if (isFound == false)
897    {
898      Int  refIdxTxt = -1-pcCU->getCUMvField( privateRefPicList )->getRefIdx( uiPartAddr );
899      assert(refIdxTxt >= 0);
900      refPic = pcCU->getSlice()->getRefPic(privateRefPicList, refIdxTxt);
901    }
902    assert(isFound);
903  }
904  assert(refPic != NULL);
905  return refPic;
906}
907#endif
908#endif
909
910#if MERL_VSP_C0152
911Void TComPrediction::xPredInterUni ( TComDataCU* pcCU, UInt uiPartAddr, UInt uiAbsPartIdx, Int iWidth, Int iHeight, RefPicList eRefPicList, TComYuv*& rpcYuvPred, Int iPartIdx, Bool bPrdDepthMap, UInt uiSubSampExpX, UInt uiSubSampExpY, Bool bi )
912#else
913Void TComPrediction::xPredInterUni ( TComDataCU* pcCU, UInt uiPartAddr, Int iWidth, Int iHeight, RefPicList eRefPicList, TComYuv*& rpcYuvPred, Int iPartIdx, Bool bPrdDepthMap, UInt uiSubSampExpX, UInt uiSubSampExpY, Bool bi )
914#endif
915{
916#if MERL_VSP_C0152
917  Int  iRefIdx = pcCU->getCUMvField( eRefPicList )->getRefIdx( uiPartAddr );   
918  Int  vspIdx  = pcCU->getVSPIndex(uiPartAddr);
919  if (vspIdx != 0)
920  {
921    if (iRefIdx >= 0)
922    {
923      printf("vspIdx = %d, iRefIdx = %d\n", vspIdx, iRefIdx);
924    }
925    assert (iRefIdx < 0); // assert (iRefIdx == NOT_VALID);
926  }
927  else
928  {
929    assert (iRefIdx >= 0);
930  }
931#else
932  Int         iRefIdx     = pcCU->getCUMvField( eRefPicList )->getRefIdx( uiPartAddr );           assert (iRefIdx >= 0);
933#endif
934
935  TComMv cMv = pcCU->getCUMvField( eRefPicList )->getMv( uiPartAddr );
936  pcCU->clipMv(cMv);
937
938#if DEPTH_MAP_GENERATION
939  if( bPrdDepthMap )
940  {
941    UInt uiRShift = 0;
942    if( pcCU->getPic()->getStoredPDMforV2() == 1 )
943      xPredInterPrdDepthMap( pcCU, pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPredDepthMapTemp(), uiPartAddr, &cMv, iWidth, iHeight, uiSubSampExpX, uiSubSampExpY, rpcYuvPred, uiRShift, 0 );
944    else
945      xPredInterPrdDepthMap( pcCU, pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPredDepthMap(), uiPartAddr, &cMv, iWidth, iHeight, uiSubSampExpX, uiSubSampExpY, rpcYuvPred, uiRShift, 0 );
946
947    return;
948  }
949#endif
950#if QC_ARP_D0177
951  if(
952#if MERL_VSP_C0152       
953       vspIdx == 0 &&   // TODO: Maybe logically redundant, but easier to read. Need verification before being removed
954#endif
955       pcCU->getSlice()->getSPS()->isDepth() == false
956    && pcCU->getSlice()->getSPS()->getViewId() > 0
957    && pcCU->getSlice()->getSPS()->getUseAdvRP() > 0
958    && pcCU->getARPW( uiPartAddr ) > 0 
959    && pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPOC()!= pcCU->getSlice()->getPOC()
960    && (pcCU->getPartitionSize(uiPartAddr)==SIZE_2Nx2N || pcCU->isSkipped(uiPartAddr))
961    )
962  {
963    xPredInterUniARP( pcCU , uiPartAddr , iWidth , iHeight , eRefPicList , rpcYuvPred , iPartIdx , bi );
964  }
965  else
966  {
967#endif
968#if HHI_FULL_PEL_DEPTH_MAP_MV_ACC
969  if( pcCU->getSlice()->getSPS()->isDepth() )
970  {
971#if MERL_VSP_C0152
972    if (vspIdx != 0)
973    { // depth, vsp compensation
974      xPredInterVSPBlk(pcCU, uiPartAddr, uiAbsPartIdx, iWidth, iHeight, cMv, eRefPicList, rpcYuvPred, bi );
975    }
976    else
977    {
978#endif
979      UInt uiRShift = ( bi ? 14-g_uiBitDepth-g_uiBitIncrement : 0 );
980      UInt uiOffset = bi ? IF_INTERNAL_OFFS : 0;
981#if LGE_ILLUCOMP_DEPTH_C0046
982    Bool bICFlag = pcCU->getICFlag(uiPartAddr) && (pcCU->getSlice()->getRefViewId( eRefPicList, iRefIdx ) != pcCU->getSlice()->getViewId());
983#endif
984#if DEPTH_MAP_GENERATION
985    xPredInterPrdDepthMap( pcCU, pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPicYuvRec(), uiPartAddr, &cMv, iWidth, iHeight, 0, 0, rpcYuvPred, uiRShift, uiOffset
986#if LGE_ILLUCOMP_DEPTH_C0046
987        , bICFlag
988#endif
989        );
990#else
991      xPredInterPrdDepthMap( pcCU, pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPicYuvRec(), uiPartAddr, &cMv, iWidth, iHeight, rpcYuvPred, uiRShift, uiOffset );
992#endif
993#if MERL_VSP_C0152
994    }
995#endif// MERL_VSP_C0152 //else
996  }
997  else  // texture
998  {
999#endif
1000#if MERL_VSP_C0152
1001    if ( vspIdx != 0 )
1002    { // texture, vsp compensation
1003      xPredInterVSPBlk(pcCU, uiPartAddr, uiAbsPartIdx, iWidth, iHeight, cMv, eRefPicList, rpcYuvPred, bi );
1004    }
1005    else//texture not VSP
1006    {
1007#endif //MERL_VSP_C0152
1008#if LGE_ILLUCOMP_B0045
1009      Bool bICFlag = pcCU->getICFlag(uiPartAddr) && (pcCU->getSlice()->getRefViewId( eRefPicList, iRefIdx ) != pcCU->getSlice()->getViewId());
1010
1011      xPredInterLumaBlk  ( pcCU, pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPicYuvRec(), uiPartAddr, &cMv, iWidth, iHeight, rpcYuvPred, bi, bICFlag);
1012#else
1013      xPredInterLumaBlk  ( pcCU, pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPicYuvRec(), uiPartAddr, &cMv, iWidth, iHeight, rpcYuvPred, bi );
1014#endif
1015#if MERL_VSP_C0152
1016     } //texture not VSP
1017#endif
1018#if HHI_FULL_PEL_DEPTH_MAP_MV_ACC
1019  }
1020#endif
1021
1022#if MERL_VSP_C0152
1023  if ( vspIdx == 0 )//Not VSP
1024  {
1025#endif
1026#if LGE_ILLUCOMP_B0045
1027  Bool bICFlag = pcCU->getICFlag(uiPartAddr) && (pcCU->getSlice()->getRefViewId( eRefPicList, iRefIdx ) != pcCU->getSlice()->getViewId());
1028
1029  xPredInterChromaBlk( pcCU, pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPicYuvRec(), uiPartAddr, &cMv, iWidth, iHeight, rpcYuvPred, bi, bICFlag );
1030#else
1031  xPredInterChromaBlk( pcCU, pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPicYuvRec(), uiPartAddr, &cMv, iWidth, iHeight, rpcYuvPred, bi );
1032#endif
1033#if MERL_VSP_C0152
1034   }
1035#endif
1036#if QC_ARP_D0177
1037  }
1038#endif
1039}
1040
1041#if QC_ARP_D0177
1042Void TComPrediction::xPredInterUniARP( TComDataCU* pcCU, UInt uiPartAddr, Int iWidth, Int iHeight, RefPicList eRefPicList, TComYuv*& rpcYuvPred, Int iPartIdx, Bool bi, TComMvField * pNewMvFiled )
1043{
1044  Int         iRefIdx     = pcCU->getCUMvField( eRefPicList )->getRefIdx( uiPartAddr );           
1045  TComMv      cMv         = pcCU->getCUMvField( eRefPicList )->getMv( uiPartAddr );
1046  Bool        bTobeScaled = false;
1047  UChar dW = pcCU->getARPW ( uiPartAddr );
1048  TComPic* pcPicYuvBaseCol =  NULL;
1049  TComPic* pcPicYuvBaseRef =  NULL;
1050  DisInfo cDistparity;
1051
1052  if( pNewMvFiled )
1053  {
1054    iRefIdx = pNewMvFiled->getRefIdx(); 
1055    cMv = pNewMvFiled->getMv();
1056  }
1057
1058#if QC_CU_NBDV_D0181
1059  cDistparity.bDV           = pcCU->getDvInfo(uiPartAddr).bDV;
1060  if( cDistparity.bDV )
1061  {
1062#if MERL_VSP_C0152
1063    cDistparity.m_acMvCand[0] = pcCU->getDvInfo(0).m_acMvCandNoRef[0];
1064#else
1065    cDistparity.m_acMvCand[0] = pcCU->getDvInfo(0).m_acMvCand[0];
1066#endif
1067    assert(pcCU->getDvInfo(uiPartAddr).bDV ==  pcCU->getDvInfo(0).bDV);
1068    cDistparity.m_aVIdxCan[0] = pcCU->getDvInfo(uiPartAddr).m_aVIdxCan[0];
1069    cDistparity.iN            = pcCU->getDvInfo(uiPartAddr).iN;
1070  }
1071  else
1072    cDistparity.iN    =  0;
1073#else
1074  pcCU->getDisMvpCandNBDV( iPartIdx, uiPartAddr,  &cDistparity, false );
1075#endif
1076
1077  dW = !cDistparity.iN ? 0: dW;
1078  if( cDistparity.iN ) 
1079  {
1080    if(dW > 0 && pcCU->getSlice()->getRefPic( eRefPicList, 0 )->getPOC()!= pcCU->getSlice()->getPOC())
1081      bTobeScaled = true;
1082    pcPicYuvBaseCol =  pcCU->getSlice()->getBaseViewRefPic( pcCU->getSlice()->getPOC(),                              cDistparity.m_aVIdxCan[0] );
1083    pcPicYuvBaseRef =  pcCU->getSlice()->getBaseViewRefPic( pcCU->getSlice()->getRefPic( eRefPicList, 0 )->getPOC(), cDistparity.m_aVIdxCan[0] );
1084    if( (!pcPicYuvBaseCol || pcPicYuvBaseCol->getPOC() != pcCU->getSlice()->getPOC()) || (!pcPicYuvBaseRef || pcPicYuvBaseRef->getPOC() != pcCU->getSlice()->getRefPic( eRefPicList, 0 )->getPOC() ))
1085    {
1086      dW = 0;
1087      bTobeScaled = false;
1088    }
1089    else
1090      assert( pcPicYuvBaseCol->getPOC() == pcCU->getSlice()->getPOC() && pcPicYuvBaseRef->getPOC() == pcCU->getSlice()->getRefPic( eRefPicList, 0 )->getPOC() );
1091    if(bTobeScaled)
1092    {     
1093      Int iCurrPOC = pcCU->getSlice()->getPOC();
1094      Int iColRefPOC  = pcCU->getSlice()->getRefPOC( eRefPicList, iRefIdx );
1095      Int iCurrRefPOC = pcCU->getSlice()->getRefPOC( eRefPicList,  0);
1096      Int iScale = pcCU-> xGetDistScaleFactor(iCurrPOC, iCurrRefPOC, iCurrPOC, iColRefPOC);
1097      if ( iScale != 4096 )
1098        cMv = cMv.scaleMv( iScale );
1099      iRefIdx = 0;
1100    }
1101  }
1102  pcCU->clipMv(cMv);
1103  TComPicYuv* pcPicYuvRef = pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPicYuvRec();
1104  xPredInterLumaBlk  ( pcCU, pcPicYuvRef, uiPartAddr, &cMv, iWidth, iHeight, rpcYuvPred, bi
1105#if LGE_ILLUCOMP_B0045
1106    , false
1107#endif
1108    , true 
1109    );
1110  xPredInterChromaBlk( pcCU, pcPicYuvRef, uiPartAddr, &cMv, iWidth, iHeight, rpcYuvPred, bi
1111#if LGE_ILLUCOMP_B0045
1112    , false
1113#endif
1114    , true
1115    );
1116  if( dW > 0 )
1117  {
1118    TComYuv * pYuvmB0 = &m_acYuvPredBase[0];
1119    TComYuv * pYuvB1  = &m_acYuvPredBase[1];
1120    assert ( cDistparity.iN == 1 );
1121    pcPicYuvRef = pcPicYuvBaseCol->getPicYuvRec();
1122    xPredInterLumaBlk  ( pcCU, pcPicYuvRef, uiPartAddr, &cDistparity.m_acMvCand[0], iWidth, iHeight, pYuvB1, bi
1123#if LGE_ILLUCOMP_B0045
1124      , false
1125#endif
1126      ,  true
1127      );
1128    xPredInterChromaBlk( pcCU, pcPicYuvRef, uiPartAddr, &cDistparity.m_acMvCand[0], iWidth, iHeight, pYuvB1, bi
1129#if LGE_ILLUCOMP_B0045
1130      , false
1131#endif
1132      , true
1133      );
1134    pcPicYuvRef = pcPicYuvBaseRef->getPicYuvRec();
1135    TComMv cMVwithDisparity = cMv + cDistparity.m_acMvCand[0];
1136    pcCU->clipMv(cMVwithDisparity);
1137    xPredInterLumaBlk  ( pcCU, pcPicYuvRef, uiPartAddr, &cMVwithDisparity, iWidth, iHeight, pYuvmB0, bi
1138#if LGE_ILLUCOMP_B0045
1139      , false
1140#endif
1141      , true
1142      );
1143    xPredInterChromaBlk( pcCU, pcPicYuvRef, uiPartAddr, &cMVwithDisparity, iWidth, iHeight, pYuvmB0, bi
1144#if LGE_ILLUCOMP_B0045
1145      , false
1146#endif
1147      , true
1148      );
1149    pYuvB1->subtractARP( pYuvB1 , pYuvmB0 , uiPartAddr , iWidth , iHeight );
1150    if(dW == 2)
1151      pYuvB1->multiplyARP( uiPartAddr , iWidth , iHeight , dW );
1152    rpcYuvPred->addARP( rpcYuvPred , pYuvB1 , uiPartAddr , iWidth , iHeight , !bi );
1153  }
1154}
1155#endif
1156
1157#if MERL_VSP_C0152
1158Void TComPrediction::xPredInterBi ( TComDataCU* pcCU, UInt uiPartAddr, UInt uiAbsPartIdx, Int iWidth, Int iHeight, UInt uiSubSampExpX, UInt uiSubSampExpY, TComYuv*& rpcYuvPred, Int iPartIdx, Bool bPrdDepthMap )
1159#else
1160Void TComPrediction::xPredInterBi ( TComDataCU* pcCU, UInt uiPartAddr, Int iWidth, Int iHeight, UInt uiSubSampExpX, UInt uiSubSampExpY, TComYuv*& rpcYuvPred, Int iPartIdx, Bool bPrdDepthMap )
1161#endif
1162{
1163  TComYuv* pcMbYuv;
1164  Int      iRefIdx[2] = {-1, -1};
1165
1166#if MERL_Bi_VSP_D0166
1167  Bool biDecision = 0;
1168  Int  predDirVSP = 0;
1169  if (pcCU->getVSPIndex(uiPartAddr) != 0) // is VSP
1170  {
1171    Int biVSPAvail = 0;
1172    //test whether VSP is Bi or Uni
1173    //Step1. Get derived DV view id
1174    RefPicList privateRefPicList = (RefPicList) pcCU->getVSPDir( uiPartAddr );
1175    RefPicList otherRefPicList = privateRefPicList == REF_PIC_LIST_0 ? REF_PIC_LIST_1 : REF_PIC_LIST_0;
1176    assert(privateRefPicList == REF_PIC_LIST_0 || privateRefPicList == REF_PIC_LIST_1);
1177    Int  refIdx = -1-pcCU->getCUMvField( privateRefPicList )->getRefIdx( uiPartAddr );
1178    assert(refIdx >= 0);
1179    Int  viewId = pcCU->getSlice()->getRefViewId(privateRefPicList, refIdx);
1180    Int  refPoc = pcCU->getSlice()->getRefPOC(privateRefPicList, refIdx);
1181
1182    assert(refPoc == pcCU->getSlice()->getPOC());
1183//    if(refPoc != pcCU->getSlice()->getPOC() )
1184//    {
1185//      printf("refPOC= %d, and current POC=%d\n", refPoc, pcCU->getSlice()->getPOC() );
1186//    }
1187    //Step 2. Get initial prediction direction value according to reference picture list availability
1188    Int iInterDir = ((pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_0) > 0 && pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_1) > 0) ? 3 :
1189      (pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_0) > 0 ? 1 : 2)); 
1190    //Step 3.  Check the availability of Bi VSP by checking the interview reference availability in the other reference list
1191    if(iInterDir == 3)
1192    {
1193      for (Int jRefIdx = 0; jRefIdx <pcCU->getSlice()->getNumRefIdx(otherRefPicList); jRefIdx++ )
1194      {
1195        Int refViewIdx  = pcCU->getSlice()->getRefViewId( otherRefPicList, jRefIdx);
1196        if ( (refViewIdx != pcCU->getSlice()->getViewId()) && (refViewIdx != viewId ) )
1197        {
1198          biVSPAvail = 1;
1199          break;
1200        }
1201      }
1202    }
1203    //Step 4. Update the Bi VSP prediction direction
1204    if ( iInterDir == 3 && biVSPAvail == 1)
1205    {
1206      biDecision   = 1;
1207      predDirVSP = 3;
1208    }
1209    else
1210    {
1211      biDecision = 0;
1212      if ( privateRefPicList == REF_PIC_LIST_0 )
1213        predDirVSP = 1;
1214      else
1215        predDirVSP = 2;
1216    }
1217  }
1218  else 
1219  {//not VSP
1220    if( ( pcCU->getCUMvField( REF_PIC_LIST_0 )->getRefIdx( uiPartAddr ) >= 0 && pcCU->getCUMvField( REF_PIC_LIST_1 )->getRefIdx( uiPartAddr ) >= 0 ) )
1221      biDecision = 1;
1222    else
1223      biDecision = 0;
1224  }
1225#endif
1226
1227  for ( Int iRefList = 0; iRefList < 2; iRefList++ )
1228  {
1229    RefPicList eRefPicList = (iRefList ? REF_PIC_LIST_1 : REF_PIC_LIST_0);
1230    iRefIdx[iRefList] = pcCU->getCUMvField( eRefPicList )->getRefIdx( uiPartAddr );
1231
1232#if MERL_VSP_C0152
1233    if(!pcCU->getVSPIndex(uiPartAddr))
1234    {
1235      if ( iRefIdx[iRefList] < 0 )
1236      {
1237        continue;
1238      }
1239    }
1240    else
1241    {
1242
1243#if !MERL_Bi_VSP_D0166 //both lists should go
1244      if ( iRefList == REF_PIC_LIST_1 && iRefIdx[iRefList] < 0 ) // iRefIdx[iRefList] ==NOT_VALID
1245      {
1246        continue;
1247      }
1248#else
1249      //Reference list loop termination
1250      RefPicList privateVSPRefPicList = (RefPicList) pcCU->getVSPDir( uiPartAddr );
1251      if( (pcCU->getVSPIndex(uiPartAddr)!=0) &&  iRefList != privateVSPRefPicList && !biDecision  ) 
1252      {//when VSP mode, if it is uni prediction, the other reference list should skip
1253        continue;
1254      }
1255#endif
1256
1257    }
1258#else
1259    if ( iRefIdx[iRefList] < 0 )
1260    {
1261      continue;
1262    }
1263#endif
1264
1265    assert( iRefIdx[iRefList] < pcCU->getSlice()->getNumRefIdx(eRefPicList) );
1266
1267    pcMbYuv = &m_acYuvPred[iRefList];
1268
1269#if MERL_Bi_VSP_D0166
1270    if(biDecision == 1)
1271#else
1272    if( pcCU->getCUMvField( REF_PIC_LIST_0 )->getRefIdx( uiPartAddr ) >= 0 && pcCU->getCUMvField( REF_PIC_LIST_1 )->getRefIdx( uiPartAddr ) >= 0 )
1273#endif
1274    {
1275#if MERL_VSP_C0152
1276      xPredInterUni ( pcCU, uiPartAddr, uiAbsPartIdx, iWidth, iHeight, eRefPicList, pcMbYuv, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, true );
1277#else
1278      xPredInterUni ( pcCU, uiPartAddr, iWidth, iHeight, eRefPicList, pcMbYuv, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, true );
1279#endif
1280    }
1281    else
1282    {
1283#if FIX_LGE_WP_FOR_3D_C0223
1284      if ( ( pcCU->getSlice()->getPPS()->getUseWP()      && pcCU->getSlice()->getSliceType() == P_SLICE ) || 
1285         ( pcCU->getSlice()->getPPS()->getWPBiPredIdc() && pcCU->getSlice()->getSliceType() == B_SLICE ) )
1286#else
1287      if ( pcCU->getSlice()->getPPS()->getWPBiPredIdc() )
1288#endif
1289      {
1290#if MERL_VSP_C0152
1291        xPredInterUni ( pcCU, uiPartAddr, uiAbsPartIdx, iWidth, iHeight, eRefPicList, pcMbYuv, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, true );
1292#else
1293        xPredInterUni ( pcCU, uiPartAddr, iWidth, iHeight, eRefPicList, pcMbYuv, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, true );
1294#endif
1295      }
1296      else
1297      {
1298#if MERL_VSP_C0152
1299        xPredInterUni ( pcCU, uiPartAddr, uiAbsPartIdx, iWidth, iHeight, eRefPicList, pcMbYuv, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, false );
1300#else
1301        xPredInterUni ( pcCU, uiPartAddr, iWidth, iHeight, eRefPicList, pcMbYuv, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, false );
1302#endif
1303      }
1304    }
1305  }
1306#if FIX_LGE_WP_FOR_3D_C0223
1307  if ( pcCU->getSlice()->getPPS()->getWPBiPredIdc() && pcCU->getSlice()->getSliceType() == B_SLICE  )
1308#else
1309  if ( pcCU->getSlice()->getPPS()->getWPBiPredIdc() )
1310#endif
1311  {
1312#if MERL_VSP_C0152
1313#if !MERL_Bi_VSP_D0166
1314    if(pcCU->getVSPIndex(uiPartAddr))
1315      m_acYuvPred[0].copyPartToPartYuv( rpcYuvPred, uiPartAddr, iWidth, iHeight );
1316    else
1317#endif
1318#endif
1319    xWeightedPredictionBi( pcCU, &m_acYuvPred[0], &m_acYuvPred[1], iRefIdx[0], iRefIdx[1], uiPartAddr, iWidth, iHeight, rpcYuvPred );
1320  }
1321#if FIX_LGE_WP_FOR_3D_C0223
1322  else if ( pcCU->getSlice()->getPPS()->getUseWP() && pcCU->getSlice()->getSliceType() == P_SLICE )
1323
1324  {
1325#if MERL_VSP_C0152
1326#if !MERL_Bi_VSP_D0166
1327    if(pcCU->getVSPIndex(uiPartAddr))
1328      m_acYuvPred[0].copyPartToPartYuv( rpcYuvPred, uiPartAddr, iWidth, iHeight );
1329    else
1330#endif
1331#endif
1332      xWeightedPredictionUni( pcCU, &m_acYuvPred[0], uiPartAddr, iWidth, iHeight, REF_PIC_LIST_0, rpcYuvPred, iPartIdx ); 
1333  }
1334#endif
1335  else
1336  {
1337    if ( bPrdDepthMap )
1338    {
1339      xWeightedAveragePdm( pcCU, &m_acYuvPred[0], &m_acYuvPred[1], iRefIdx[0], iRefIdx[1], uiPartAddr, iWidth, iHeight, rpcYuvPred, uiSubSampExpX, uiSubSampExpY );
1340    }
1341    else
1342    {
1343#if MERL_VSP_C0152
1344#if !MERL_Bi_VSP_D0166
1345      if(pcCU->getVSPIndex(uiPartAddr))
1346        m_acYuvPred[0].copyPartToPartYuv( rpcYuvPred, uiPartAddr, iWidth, iHeight );
1347      else
1348        xWeightedAverage( pcCU, &m_acYuvPred[0], &m_acYuvPred[1], iRefIdx[0], iRefIdx[1], uiPartAddr, iWidth, iHeight, rpcYuvPred );
1349#else
1350      xWeightedAverage( pcCU, &m_acYuvPred[0], &m_acYuvPred[1], iRefIdx[0], iRefIdx[1], uiPartAddr, iWidth, iHeight, rpcYuvPred, predDirVSP );
1351#endif
1352#else
1353      xWeightedAverage( pcCU, &m_acYuvPred[0], &m_acYuvPred[1], iRefIdx[0], iRefIdx[1], uiPartAddr, iWidth, iHeight, rpcYuvPred );
1354#endif
1355    }
1356  }
1357}
1358
1359
1360
1361Void
1362TComPrediction::xPredInterPrdDepthMap( TComDataCU* pcCU, TComPicYuv* pcPicYuvRef, UInt uiPartAddr, TComMv* pcMv, Int iWidth, Int iHeight, UInt uiSubSampExpX, UInt uiSubSampExpY, TComYuv*& rpcYuv, UInt uiRShift, UInt uiOffset
1363#if LGE_ILLUCOMP_DEPTH_C0046
1364, Bool bICFlag
1365#endif
1366)
1367{
1368  Int     iShiftX     = 2 + uiSubSampExpX;
1369  Int     iShiftY     = 2 + uiSubSampExpY;
1370  Int     iAddX       = ( 1 << iShiftX ) >> 1;
1371  Int     iAddY       = ( 1 << iShiftY ) >> 1;
1372  Int     iHor        = ( pcMv->getHor() + iAddX ) >> iShiftX;
1373  Int     iVer        = ( pcMv->getVer() + iAddY ) >> iShiftY;
1374#if HHI_FULL_PEL_DEPTH_MAP_MV_ACC
1375  if( pcCU->getSlice()->getSPS()->isDepth() )
1376  {
1377    iHor = pcMv->getHor();
1378    iVer = pcMv->getVer();
1379  }
1380#endif
1381  Int     iRefStride  = pcPicYuvRef->getStride();
1382  Int     iDstStride  = rpcYuv->getStride();
1383  Int     iRefOffset  = iHor + iVer * iRefStride;
1384
1385  Pel*    piRefY      = pcPicYuvRef->getLumaAddr( pcCU->getAddr(), pcCU->getZorderIdxInCU() + uiPartAddr ) + iRefOffset;
1386  Pel*    piDstY      = rpcYuv->getLumaAddr( uiPartAddr );
1387
1388  for( Int y = 0; y < iHeight; y++, piDstY += iDstStride, piRefY += iRefStride )
1389  {
1390    for( Int x = 0; x < iWidth; x++ )
1391    {
1392      piDstY[ x ] = ( piRefY[ x ] << uiRShift ) - uiOffset;
1393    }
1394  }
1395
1396#if LGE_ILLUCOMP_DEPTH_C0046
1397  if(bICFlag)
1398  {
1399    Int a, b, iShift;
1400    TComMv tTmpMV(pcMv->getHor()<<2, pcMv->getVer()<<2);
1401
1402    piRefY      = pcPicYuvRef->getLumaAddr( pcCU->getAddr(), pcCU->getZorderIdxInCU() + uiPartAddr ) + iRefOffset;
1403    piDstY      = rpcYuv->getLumaAddr( uiPartAddr );
1404
1405    xGetLLSICPrediction(pcCU, &tTmpMV, pcPicYuvRef, a, b, iShift);
1406
1407    for( Int y = 0; y < iHeight; y++, piDstY += iDstStride, piRefY += iRefStride )
1408    {
1409      for( Int x = 0; x < iWidth; x++ )
1410      {
1411        if(uiOffset)
1412        {
1413          Int iIFshift = IF_INTERNAL_PREC - ( g_uiBitDepth + g_uiBitIncrement );
1414          piDstY[ x ] = ( (a*piDstY[ x ]+a*IF_INTERNAL_OFFS) >> iShift ) + b*(1<<iIFshift) - IF_INTERNAL_OFFS;
1415        }
1416        else
1417          piDstY[ x ] = Clip( ( (a*piDstY[ x ]) >> iShift ) + b );
1418      }
1419    }
1420  }
1421#endif
1422}
1423
1424
1425/**
1426 * \brief Generate motion-compensated luma block
1427 *
1428 * \param cu       Pointer to current CU
1429 * \param refPic   Pointer to reference picture
1430 * \param partAddr Address of block within CU
1431 * \param mv       Motion vector
1432 * \param width    Width of block
1433 * \param height   Height of block
1434 * \param dstPic   Pointer to destination picture
1435 * \param bi       Flag indicating whether bipred is used
1436 */
1437#if LGE_ILLUCOMP_B0045
1438Void TComPrediction::xPredInterLumaBlk( TComDataCU *cu, TComPicYuv *refPic, UInt partAddr, TComMv *mv, Int width, Int height, TComYuv *&dstPic, Bool bi, Bool bICFlag
1439#if QC_ARP_D0177
1440    ,
1441    Int filterType
1442#endif
1443    )
1444#else
1445Void TComPrediction::xPredInterLumaBlk( TComDataCU *cu, TComPicYuv *refPic, UInt partAddr, TComMv *mv, Int width, Int height, TComYuv *&dstPic, Bool bi
1446#if QC_ARP_D0177
1447    ,
1448    Int filterType
1449#endif
1450    )
1451#endif
1452{
1453  Int refStride = refPic->getStride(); 
1454  Int refOffset = ( mv->getHor() >> 2 ) + ( mv->getVer() >> 2 ) * refStride;
1455  Pel *ref      = refPic->getLumaAddr( cu->getAddr(), cu->getZorderIdxInCU() + partAddr ) + refOffset;
1456 
1457  Int dstStride = dstPic->getStride();
1458  Pel *dst      = dstPic->getLumaAddr( partAddr );
1459 
1460  Int xFrac = mv->getHor() & 0x3;
1461  Int yFrac = mv->getVer() & 0x3;
1462
1463#if HHI_FULL_PEL_DEPTH_MAP_MV_ACC
1464  assert( ! cu->getSlice()->getIsDepth() || ( xFrac == 0 && yFrac == 0 ) );
1465#endif
1466
1467  if ( yFrac == 0 )
1468  {
1469    m_if.filterHorLuma( ref, refStride, dst, dstStride, width, height, xFrac,       !bi
1470#if QC_ARP_D0177
1471    ,
1472    filterType
1473#endif
1474    );
1475  }
1476  else if ( xFrac == 0 )
1477  {
1478    m_if.filterVerLuma( ref, refStride, dst, dstStride, width, height, yFrac, true, !bi
1479#if QC_ARP_D0177
1480    ,
1481    filterType
1482#endif
1483    );
1484  }
1485  else
1486  {
1487    Int tmpStride = m_filteredBlockTmp[0].getStride();
1488    Short *tmp    = m_filteredBlockTmp[0].getLumaAddr();
1489
1490    Int filterSize = NTAPS_LUMA;
1491    Int halfFilterSize = ( filterSize >> 1 );
1492
1493    m_if.filterHorLuma(ref - (halfFilterSize-1)*refStride, refStride, tmp, tmpStride, width, height+filterSize-1, xFrac, false     
1494 #if QC_ARP_D0177
1495    ,
1496    filterType
1497#endif
1498    );
1499    m_if.filterVerLuma(tmp + (halfFilterSize-1)*tmpStride, tmpStride, dst, dstStride, width, height,              yFrac, false, !bi
1500 #if QC_ARP_D0177
1501    ,
1502    filterType
1503#endif
1504    );   
1505  }
1506
1507#if LGE_ILLUCOMP_B0045
1508  if(bICFlag)
1509  {
1510    Int a, b, iShift, i, j;
1511
1512    xGetLLSICPrediction(cu, mv, refPic, a, b, iShift);
1513
1514    for (i = 0; i < height; i++)
1515    {
1516      for (j = 0; j < width; j++)
1517      {
1518        if(bi)
1519        {
1520          Int iIFshift = IF_INTERNAL_PREC - ( g_uiBitDepth + g_uiBitIncrement );
1521          dst[j] = ( (a*dst[j]+a*IF_INTERNAL_OFFS) >> iShift ) + b*(1<<iIFshift) - IF_INTERNAL_OFFS;
1522        }
1523        else
1524          dst[j] = Clip( ( (a*dst[j]) >> iShift ) + b );
1525      }
1526      dst += dstStride;
1527    }
1528  }
1529#endif
1530}
1531
1532/**
1533 * \brief Generate motion-compensated chroma block
1534 *
1535 * \param cu       Pointer to current CU
1536 * \param refPic   Pointer to reference picture
1537 * \param partAddr Address of block within CU
1538 * \param mv       Motion vector
1539 * \param width    Width of block
1540 * \param height   Height of block
1541 * \param dstPic   Pointer to destination picture
1542 * \param bi       Flag indicating whether bipred is used
1543 */
1544#if LGE_ILLUCOMP_B0045
1545Void TComPrediction::xPredInterChromaBlk( TComDataCU *cu, TComPicYuv *refPic, UInt partAddr, TComMv *mv, Int width, Int height, TComYuv *&dstPic, Bool bi, Bool bICFlag
1546#if QC_ARP_D0177
1547    ,
1548    Int filterType
1549#endif   
1550    )
1551#else
1552Void TComPrediction::xPredInterChromaBlk( TComDataCU *cu, TComPicYuv *refPic, UInt partAddr, TComMv *mv, Int width, Int height, TComYuv *&dstPic, Bool bi
1553#if QC_ARP_D0177
1554  , Int filterType
1555#endif
1556  )
1557#endif
1558{
1559  Int     refStride  = refPic->getCStride();
1560  Int     dstStride  = dstPic->getCStride();
1561 
1562  Int     refOffset  = (mv->getHor() >> 3) + (mv->getVer() >> 3) * refStride;
1563 
1564  Pel*    refCb     = refPic->getCbAddr( cu->getAddr(), cu->getZorderIdxInCU() + partAddr ) + refOffset;
1565  Pel*    refCr     = refPic->getCrAddr( cu->getAddr(), cu->getZorderIdxInCU() + partAddr ) + refOffset;
1566 
1567  Pel* dstCb = dstPic->getCbAddr( partAddr );
1568  Pel* dstCr = dstPic->getCrAddr( partAddr );
1569 
1570  Int     xFrac  = mv->getHor() & 0x7;
1571  Int     yFrac  = mv->getVer() & 0x7;
1572  UInt    cxWidth  = width  >> 1;
1573  UInt    cxHeight = height >> 1;
1574 
1575  Int     extStride = m_filteredBlockTmp[0].getStride();
1576  Short*  extY      = m_filteredBlockTmp[0].getLumaAddr();
1577 
1578  Int filterSize = NTAPS_CHROMA;
1579 
1580  Int halfFilterSize = (filterSize>>1);
1581 
1582  if ( yFrac == 0 )
1583  {
1584    m_if.filterHorChroma(refCb, refStride, dstCb,  dstStride, cxWidth, cxHeight, xFrac, !bi
1585#if QC_ARP_D0177
1586    ,
1587    filterType
1588#endif   
1589    );   
1590    m_if.filterHorChroma(refCr, refStride, dstCr,  dstStride, cxWidth, cxHeight, xFrac, !bi
1591#if QC_ARP_D0177
1592    ,
1593    filterType
1594#endif   
1595    );   
1596  }
1597  else if ( xFrac == 0 )
1598  {
1599    m_if.filterVerChroma(refCb, refStride, dstCb, dstStride, cxWidth, cxHeight, yFrac, true, !bi
1600 #if QC_ARP_D0177
1601    ,
1602    filterType
1603#endif   
1604    );   
1605    m_if.filterVerChroma(refCr, refStride, dstCr, dstStride, cxWidth, cxHeight, yFrac, true, !bi
1606 #if QC_ARP_D0177
1607    ,
1608    filterType
1609#endif   
1610    );   
1611  }
1612  else
1613  {
1614    m_if.filterHorChroma(refCb - (halfFilterSize-1)*refStride, refStride, extY,  extStride, cxWidth, cxHeight+filterSize-1, xFrac, false
1615#if QC_ARP_D0177
1616    ,
1617    filterType
1618#endif   
1619    );
1620    m_if.filterVerChroma(extY  + (halfFilterSize-1)*extStride, extStride, dstCb, dstStride, cxWidth, cxHeight  , yFrac, false, !bi
1621#if QC_ARP_D0177
1622    ,
1623    filterType
1624#endif   
1625    );
1626   
1627    m_if.filterHorChroma(refCr - (halfFilterSize-1)*refStride, refStride, extY,  extStride, cxWidth, cxHeight+filterSize-1, xFrac, false
1628#if QC_ARP_D0177
1629    ,
1630    filterType
1631#endif   
1632    );
1633    m_if.filterVerChroma(extY  + (halfFilterSize-1)*extStride, extStride, dstCr, dstStride, cxWidth, cxHeight  , yFrac, false, !bi
1634#if QC_ARP_D0177
1635    ,
1636    filterType
1637#endif   
1638    );   
1639  }
1640#if LGE_ILLUCOMP_B0045
1641  if(bICFlag)
1642  {
1643    Int a, b, iShift, i, j;
1644    xGetLLSICPredictionChroma(cu, mv, refPic, a, b, iShift, 0); // Cb
1645    for (i = 0; i < cxHeight; i++)
1646    {
1647      for (j = 0; j < cxWidth; j++)
1648      {
1649        if(bi)
1650        {
1651          Int iIFshift = IF_INTERNAL_PREC - ( g_uiBitDepth + g_uiBitIncrement );
1652          dstCb[j] = ( (a*dstCb[j]+a*IF_INTERNAL_OFFS) >> iShift ) + b*(1<<iIFshift) - IF_INTERNAL_OFFS;
1653        }
1654        else
1655          dstCb[j] = Clip3(0, 255, ((a*dstCb[j])>>iShift)+b);
1656      }
1657      dstCb += dstStride;
1658    }
1659
1660    xGetLLSICPredictionChroma(cu, mv, refPic, a, b, iShift, 1); // Cr
1661    for (i = 0; i < cxHeight; i++)
1662    {
1663      for (j = 0; j < cxWidth; j++)
1664      {
1665        if(bi)
1666        {
1667          Int iIFshift = IF_INTERNAL_PREC - ( g_uiBitDepth + g_uiBitIncrement );
1668          dstCr[j] = ( (a*dstCr[j]+a*IF_INTERNAL_OFFS) >> iShift ) + b*(1<<iIFshift) - IF_INTERNAL_OFFS;
1669        }
1670        else
1671          dstCr[j] = Clip3(0, 255, ((a*dstCr[j])>>iShift)+b);
1672      }
1673      dstCr += dstStride;
1674    }
1675  }
1676#endif
1677}
1678
1679#if MERL_VSP_C0152
1680// Input:
1681// refPic: Ref picture. Full picture, with padding
1682// posX, posY:     PU position, texture
1683// sizeX, sizeY: PU size
1684// partAddr: z-order index
1685// mv: disparity vector. derived from neighboring blocks
1686//
1687// Output: dstPic, PU predictor 64x64
1688Void TComPrediction::xPredInterLumaBlkFromDM( TComPicYuv *refPic, TComPicYuv *pPicBaseDepth, Int* pShiftLUT, Int iShiftPrec, TComMv* mv, UInt partAddr,Int posX, Int posY, Int sizeX, Int sizeY, Bool isDepth, TComYuv *&dstPic
1689#if MERL_Bi_VSP_D0166
1690                                            , Bool bi
1691#endif         
1692                                            )
1693{
1694  Int widthLuma;
1695  Int heightLuma;
1696
1697  if (isDepth)
1698  {
1699    widthLuma   =  pPicBaseDepth->getWidth();
1700    heightLuma  =  pPicBaseDepth->getHeight();
1701  }
1702  else
1703  {
1704    widthLuma   =  refPic->getWidth();
1705    heightLuma  =  refPic->getHeight();
1706  }
1707
1708#if MERL_VSP_BLOCKSIZE_C0152 != 1
1709  Int widthDepth  = pPicBaseDepth->getWidth();
1710  Int heightDepth = pPicBaseDepth->getHeight();
1711#endif
1712
1713#if MERL_CVSP_D0165
1714  Int widthDepth  = pPicBaseDepth->getWidth();
1715  Int heightDepth = pPicBaseDepth->getHeight();
1716#endif
1717
1718  Int nTxtPerDepthX = widthLuma  / ( pPicBaseDepth->getWidth() );  // texture pixel # per depth pixel
1719  Int nTxtPerDepthY = heightLuma / ( pPicBaseDepth->getHeight() );
1720
1721  Int refStride = refPic->getStride();
1722  Int dstStride = dstPic->getStride();
1723  Int depStride =  pPicBaseDepth->getStride();
1724  Int depthPosX = Clip3(0,   widthLuma - sizeX,  (posX/nTxtPerDepthX) + (mv->getHor()>>2));
1725  Int depthPosY = Clip3(0,   heightLuma- sizeY,  (posY/nTxtPerDepthY) + (mv->getVer()>>2));
1726  Pel *ref    = refPic->getLumaAddr() + posX + posY * refStride;
1727  Pel *dst    = dstPic->getLumaAddr(partAddr);
1728  Pel *depth  = pPicBaseDepth->getLumaAddr() + depthPosX + depthPosY * depStride;
1729
1730#if MERL_VSP_BLOCKSIZE_C0152 != 1
1731#if MERL_VSP_BLOCKSIZE_C0152 == 2
1732  Int  dW = sizeX>>1;
1733  Int  dH = sizeY>>1;
1734#endif
1735#if MERL_VSP_BLOCKSIZE_C0152 == 4
1736  Int  dW = sizeX>>2;
1737  Int  dH = sizeY>>2;
1738#endif
1739  {
1740    Pel* depthi = depth;
1741    for (Int j = 0; j < dH; j++)
1742    {
1743      for (Int i = 0; i < dW; i++)
1744      {
1745        Pel* depthTmp;
1746#if MERL_VSP_BLOCKSIZE_C0152 == 2
1747        if (depthPosX + (i<<1) < widthDepth)
1748          depthTmp = depthi + (i << 1);
1749        else
1750          depthTmp = depthi + (widthDepth - depthPosX - 1);
1751#endif
1752#if MERL_VSP_BLOCKSIZE_C0152 == 4
1753        if (depthPosX + (i<<2) < widthDepth)
1754          depthTmp = depthi + (i << 2);
1755        else
1756          depthTmp = depthi + (widthDepth - depthPosX - 1);
1757#endif
1758        Int maxV = 0;
1759#if MTK_DEPTH_TO_DISP_D0138
1760        for (Int blockj = 0; blockj < MERL_VSP_BLOCKSIZE_C0152; blockj+=(MERL_VSP_BLOCKSIZE_C0152-1))
1761#else
1762        for (Int blockj = 0; blockj < MERL_VSP_BLOCKSIZE_C0152; blockj++)
1763#endif
1764        {
1765          Int iX = 0;
1766#if MTK_DEPTH_TO_DISP_D0138
1767          for (Int blocki = 0; blocki < MERL_VSP_BLOCKSIZE_C0152; blocki+=(MERL_VSP_BLOCKSIZE_C0152-1))
1768#else
1769          for (Int blocki = 0; blocki < MERL_VSP_BLOCKSIZE_C0152; blocki++)
1770#endif
1771          {
1772            if (maxV < depthTmp[iX])
1773              maxV = depthTmp[iX];
1774#if MERL_VSP_BLOCKSIZE_C0152 == 2
1775            if (depthPosX + (i<<1) + blocki < widthDepth - 1)
1776#else // MERL_VSP_BLOCKSIZE_C0152 == 4
1777            if (depthPosX + (i<<2) + blocki < widthDepth - 1)
1778#endif
1779              iX++;
1780          }
1781#if MERL_VSP_BLOCKSIZE_C0152 == 2
1782          if (depthPosY + (j<<1) + blockj < heightDepth - 1)
1783#else // MERL_VSP_BLOCKSIZE_C0152 == 4
1784          if (depthPosY + (j<<2) + blockj < heightDepth - 1)
1785#endif
1786            depthTmp += depStride;
1787        }
1788        m_pDepth[i+j*dW] = maxV;
1789      } // end of i < dW
1790#if MERL_VSP_BLOCKSIZE_C0152 == 2
1791      if (depthPosY + ((j+1)<<1) < heightDepth)
1792        depthi += (depStride << 1);
1793      else
1794        depthi  = depth + (heightDepth-depthPosY-1)*depStride;
1795#endif
1796#if MERL_VSP_BLOCKSIZE_C0152 == 4
1797      if (depthPosY + ((j+1)<<2) < heightDepth) // heightDepth-1
1798        depthi += (depStride << 2);
1799      else
1800        depthi  = depth + (heightDepth-depthPosY-1)*depStride; // the last line
1801#endif
1802    }
1803  }
1804#endif
1805 
1806#if MERL_VSP_BLOCKSIZE_C0152 == 1
1807#if MERL_CVSP_D0165
1808  //get LUT based horizontal reference range
1809  Int range = 0;
1810  if( sizeX == 4 && sizeY == 8 )
1811    range = m_iRangeLuma[0];
1812  else if( sizeX == 8 && sizeY == 4 )
1813    range = m_iRangeLuma[1];
1814  else if( sizeX == 8 && sizeY == 8 )
1815    range = m_iRangeLuma[2];
1816  else if( sizeX == 8 && sizeY == 16 )
1817    range = m_iRangeLuma[3];
1818  else if( sizeX == 16 && sizeY == 8 )
1819    range = m_iRangeLuma[4];
1820  else if( sizeX == 16 && sizeY == 16 )
1821    range = m_iRangeLuma[5];
1822  else if( sizeX == 16 && sizeY == 32 )
1823    range = m_iRangeLuma[6];
1824  else if( sizeX == 32 && sizeY == 16 )
1825    range = m_iRangeLuma[7];
1826  else if( sizeX == 32 && sizeY == 32 )
1827    range = m_iRangeLuma[8];
1828  else if( sizeX == 32 && sizeY == 64 )
1829    range = m_iRangeLuma[9];
1830  else if( sizeX == 64 && sizeY == 32 )
1831    range = m_iRangeLuma[10];
1832  else if( sizeX == 64 && sizeY == 64 )
1833    range = m_iRangeLuma[11];
1834  else 
1835    assert(0);
1836
1837  // The minimum depth value
1838  Int minRelativePos = 5000;
1839  Int maxRelativePos = -5000;
1840
1841  Pel* depthTemp, *depthInitial=depth;
1842  for (Int yTxt =0; yTxt<sizeY; yTxt++)
1843  {
1844    for (Int xTxt =0; xTxt<sizeX; xTxt++)
1845    {
1846      if (depthPosX+xTxt < widthDepth)
1847        depthTemp = depthInitial + xTxt;
1848      else
1849        depthTemp = depthInitial + (widthDepth - depthPosX - 1);
1850
1851      Int disparity = pShiftLUT[ *depthTemp ] << iShiftPrec;
1852      Int disparityInt = disparity >> 2;
1853
1854      if( disparity <= 0)
1855      {
1856        if (minRelativePos > disparityInt+xTxt)
1857            minRelativePos = disparityInt+xTxt;
1858      }
1859      else
1860      {
1861        if (maxRelativePos < disparityInt+xTxt)
1862            maxRelativePos = disparityInt+xTxt;
1863      }
1864    }
1865    if (depthPosY+yTxt < heightDepth)
1866      depthInitial = depthInitial + depStride;
1867  }
1868
1869  Int disparity_tmp = pShiftLUT[ *depth ] << iShiftPrec;
1870  if (disparity_tmp <= 0)
1871    maxRelativePos = minRelativePos + range -1 ;
1872  else
1873    minRelativePos = maxRelativePos - range +1 ;
1874#endif
1875#endif
1876
1877#if MERL_VSP_BLOCKSIZE_C0152 != 1
1878  Int yDepth = 0;
1879#endif
1880  for ( Int yTxt = 0; yTxt < sizeY; yTxt += nTxtPerDepthY )
1881  {
1882    for ( Int xTxt = 0, xDepth = 0; xTxt < sizeX; xTxt += nTxtPerDepthX, xDepth++ )
1883    {
1884      Pel repDepth = 0; // to store the depth value used for warping
1885#if MERL_VSP_BLOCKSIZE_C0152 == 1
1886      repDepth = depth[xDepth];
1887#endif
1888#if MERL_VSP_BLOCKSIZE_C0152 == 2
1889      repDepth = m_pDepth[(xTxt>>1) + (yTxt>>1)*dW];
1890#endif
1891#if MERL_VSP_BLOCKSIZE_C0152 == 4
1892      repDepth = m_pDepth[(xTxt>>2) + (yTxt>>2)*dW];
1893#endif
1894
1895      assert( repDepth >= 0 && repDepth <= 255 );
1896      Int disparity = pShiftLUT[ repDepth ] << iShiftPrec;
1897      Int refOffset = xTxt + (disparity >> 2);
1898      Int xFrac = disparity & 0x3;
1899#if MERL_CVSP_D0165
1900      if(refOffset<minRelativePos || refOffset>maxRelativePos)
1901        xFrac = 0;
1902      refOffset = Clip3(minRelativePos, maxRelativePos, refOffset);
1903#endif
1904      Int absX  = posX + refOffset;
1905
1906      if (xFrac == 0)
1907        absX = Clip3(0, widthLuma-1, absX);
1908      else
1909        absX = Clip3(4, widthLuma-5, absX);
1910
1911      refOffset = absX - posX;
1912
1913      assert( ref[refOffset] >= 0 && ref[refOffset]<= 255 );
1914#if MERL_Bi_VSP_D0166
1915      m_if.filterHorLuma( &ref[refOffset], refStride, &dst[xTxt], dstStride, nTxtPerDepthX, nTxtPerDepthY, xFrac, !bi );
1916#else
1917      m_if.filterHorLuma( &ref[refOffset], refStride, &dst[xTxt], dstStride, nTxtPerDepthX, nTxtPerDepthY, xFrac, true );
1918#endif
1919
1920    }
1921    ref   += refStride*nTxtPerDepthY;
1922    dst   += dstStride*nTxtPerDepthY;
1923    depth += depStride;
1924#if MERL_VSP_BLOCKSIZE_C0152 != 1
1925    yDepth++;
1926#endif
1927
1928  }
1929}
1930
1931Void TComPrediction::xPredInterChromaBlkFromDM ( TComPicYuv *refPic, TComPicYuv *pPicBaseDepth, Int* pShiftLUT, Int iShiftPrec, TComMv*mv, UInt partAddr, Int posX, Int posY, Int sizeX, Int sizeY, Bool isDepth, TComYuv *&dstPic
1932#if MERL_Bi_VSP_D0166
1933                                               , Bool bi
1934#endif
1935                                               )
1936{
1937  Int refStride = refPic->getCStride();
1938  Int dstStride = dstPic->getCStride();
1939  Int depStride = pPicBaseDepth->getStride();
1940
1941  Int widthChroma, heightChroma;
1942  if( isDepth)
1943  {
1944     widthChroma   = pPicBaseDepth->getWidth()>>1;
1945     heightChroma  = pPicBaseDepth->getHeight()>>1;
1946  }
1947  else
1948  {
1949     widthChroma   = refPic->getWidth()>>1;
1950     heightChroma  = refPic->getHeight()>>1;
1951  }
1952
1953  // Below is only for Texture chroma component
1954
1955  Int widthDepth  = pPicBaseDepth->getWidth();
1956  Int heightDepth = pPicBaseDepth->getHeight();
1957
1958  Int nTxtPerDepthX, nTxtPerDepthY;  // Number of texture samples per one depth sample
1959  Int nDepthPerTxtX, nDepthPerTxtY;  // Number of depth samples per one texture sample
1960
1961  Int depthPosX;  // Starting position in depth image
1962  Int depthPosY;
1963
1964  if ( widthChroma > widthDepth )
1965  {
1966    nTxtPerDepthX = widthChroma / widthDepth;
1967    nDepthPerTxtX = 1;
1968    depthPosX = posX / nTxtPerDepthX + (mv->getHor()>>2);        //mv denotes the disparity for VSP
1969  }
1970  else
1971  {
1972    nTxtPerDepthX = 1;
1973    nDepthPerTxtX = widthDepth / widthChroma;
1974    depthPosX = posX * nDepthPerTxtX + (mv->getHor()>>2);        //mv denotes the disparity for VSP
1975  }
1976  depthPosX = Clip3(0, widthDepth - (sizeX<<1), depthPosX);
1977  if ( heightChroma > heightDepth )
1978  {
1979    nTxtPerDepthY = heightChroma / heightDepth;
1980    nDepthPerTxtY = 1;
1981    depthPosY = posY / nTxtPerDepthY + (mv->getVer()>>2);     //mv denotes the disparity for VSP
1982  }
1983  else
1984  {
1985    nTxtPerDepthY = 1;
1986    nDepthPerTxtY = heightDepth / heightChroma;
1987    depthPosY = posY * nDepthPerTxtY + (mv->getVer()>>2);     //mv denotes the disparity for VSP
1988  }
1989  depthPosY = Clip3(0, heightDepth - (sizeY<<1), depthPosY);
1990
1991  Pel *refCb  = refPic->getCbAddr() + posX + posY * refStride;
1992  Pel *refCr  = refPic->getCrAddr() + posX + posY * refStride;
1993  Pel *dstCb  = dstPic->getCbAddr(partAddr);
1994  Pel *dstCr  = dstPic->getCrAddr(partAddr);
1995  Pel *depth  = pPicBaseDepth->getLumaAddr() + depthPosX + depthPosY * depStride;  // move the pointer to the current depth pixel position
1996 
1997  Int refStrideBlock = refStride * nTxtPerDepthY;
1998  Int dstStrideBlock = dstStride * nTxtPerDepthY;
1999  Int depStrideBlock = depStride * nDepthPerTxtY;
2000
2001  if ( widthChroma > widthDepth ) // We assume
2002  {
2003    assert( heightChroma > heightDepth );
2004    printf("This branch should never been reached.\n");
2005    exit(0);
2006  }
2007  else
2008  {
2009#if MERL_VSP_BLOCKSIZE_C0152 == 1
2010  Int  dW = sizeX;
2011  Int  dH = sizeY;
2012  Int  sW = 2; // search window size
2013  Int  sH = 2;
2014#endif
2015#if MERL_VSP_BLOCKSIZE_C0152 == 2
2016  Int  dW = sizeX;
2017  Int  dH = sizeY;
2018  Int  sW = 2; // search window size
2019  Int  sH = 2;
2020#endif
2021#if MERL_VSP_BLOCKSIZE_C0152 == 4
2022  Int  dW = sizeX>>1;
2023  Int  dH = sizeY>>1;
2024  Int  sW = 4; // search window size
2025  Int  sH = 4;
2026#endif
2027
2028  {
2029    Pel* depthi = depth;
2030    for (Int j = 0; j < dH; j++)
2031    {
2032      for (Int i = 0; i < dW; i++)
2033      {
2034        Pel* depthTmp;
2035#if MERL_VSP_BLOCKSIZE_C0152 == 1
2036        depthTmp = depthi + (i << 1);
2037#endif
2038#if MERL_VSP_BLOCKSIZE_C0152 == 2
2039        if (depthPosX + (i<<1) < widthDepth)
2040          depthTmp = depthi + (i << 1);
2041        else
2042          depthTmp = depthi + (widthDepth - depthPosX - 1);
2043#endif
2044#if MERL_VSP_BLOCKSIZE_C0152 == 4
2045        if (depthPosX + (i<<2) < widthDepth)
2046          depthTmp = depthi + (i << 2);
2047        else
2048          depthTmp = depthi + (widthDepth - depthPosX - 1);
2049#endif
2050        Int maxV = 0;
2051        for (Int blockj = 0; blockj < sH; blockj++)
2052        {
2053          Int iX = 0;
2054          for (Int blocki = 0; blocki < sW; blocki++)
2055          {
2056            if (maxV < depthTmp[iX])
2057              maxV = depthTmp[iX];
2058            if (depthPosX + i*sW + blocki < widthDepth - 1)
2059              iX++;
2060          }
2061          if (depthPosY + j*sH + blockj < heightDepth - 1)
2062            depthTmp += depStride;
2063        }
2064        m_pDepth[i+j*dW] = maxV;
2065      } // end of i < dW
2066#if MERL_VSP_BLOCKSIZE_C0152 == 1
2067      if (depthPosY + ((j+1)<<1) < heightDepth)
2068        depthi += (depStride << 1);
2069      else
2070        depthi  = depth + (heightDepth-1)*depStride;
2071#endif
2072#if MERL_VSP_BLOCKSIZE_C0152 == 2
2073      if (depthPosY + ((j+1)<<1) < heightDepth)
2074        depthi += (depStride << 1);
2075      else
2076        depthi  = depth + (heightDepth-depthPosY-1)*depStride;
2077#endif
2078#if MERL_VSP_BLOCKSIZE_C0152 == 4
2079      if (depthPosY + ((j+1)<<2) < heightDepth) // heightDepth-1
2080        depthi += (depStride << 2);
2081      else
2082        depthi  = depth + (heightDepth-depthPosY-1)*depStride; // the last line
2083#endif
2084    }
2085  }
2086
2087
2088#if MERL_VSP_BLOCKSIZE_C0152 == 1
2089#if MERL_CVSP_D0165
2090  //get LUT based horizontal reference range
2091  Int range=0;
2092  if( sizeX == 2 && sizeY == 4 )
2093    range = m_iRangeChroma[0];
2094  else if( sizeX == 4 && sizeY == 2 )
2095    range = m_iRangeChroma[1];
2096  else if( sizeX == 4 && sizeY == 4 )
2097    range = m_iRangeChroma[2];
2098  else if( sizeX == 4 && sizeY == 8 )
2099    range = m_iRangeChroma[3];
2100  else if( sizeX == 8 && sizeY == 4 )
2101    range = m_iRangeChroma[4];
2102  else if( sizeX == 8 && sizeY == 8 )
2103    range = m_iRangeChroma[5];
2104  else if( sizeX == 8 && sizeY == 16 )
2105    range = m_iRangeChroma[6];
2106  else if( sizeX == 16 && sizeY == 8 )
2107    range = m_iRangeChroma[7];
2108  else if( sizeX == 16 && sizeY == 16 )
2109    range = m_iRangeChroma[8];
2110  else if( sizeX == 16 && sizeY == 32 )
2111    range = m_iRangeChroma[9];
2112  else if( sizeX == 32 && sizeY == 16 )
2113    range = m_iRangeChroma[10];
2114  else if( sizeX == 32 && sizeY == 32 )
2115    range = m_iRangeChroma[11];
2116  else
2117    assert(0);
2118 
2119  // The minimum depth value
2120  Int minRelativePos = 5000;
2121  Int maxRelativePos = -5000;
2122
2123  Int depthTmp;
2124  for (Int yTxt=0; yTxt<sizeY; yTxt++)
2125  {
2126    for (Int xTxt=0; xTxt<sizeX; xTxt++)
2127    {
2128      depthTmp = m_pDepth[xTxt+yTxt*dW];
2129      Int disparity = pShiftLUT[ depthTmp ] << iShiftPrec;
2130      Int disparityInt = disparity >> 3;//in chroma resolution
2131
2132      if (disparityInt < 0)
2133      {
2134        if (minRelativePos > disparityInt+xTxt)
2135            minRelativePos = disparityInt+xTxt;
2136      }
2137      else
2138      {
2139        if (maxRelativePos < disparityInt+xTxt)
2140            maxRelativePos = disparityInt+xTxt;
2141      }
2142    }
2143  }
2144
2145  depthTmp = m_pDepth[0];
2146  Int disparity_tmp = pShiftLUT[ depthTmp ] << iShiftPrec;
2147  if ( disparity_tmp < 0 )
2148    maxRelativePos = minRelativePos + range - 1;
2149  else
2150    minRelativePos = maxRelativePos - range + 1;
2151
2152#endif
2153#endif
2154
2155    // (sizeX, sizeY) is Chroma block size
2156    for ( Int yTxt = 0, yDepth = 0; yTxt < sizeY; yTxt += nTxtPerDepthY, yDepth += nDepthPerTxtY )
2157    {
2158      for ( Int xTxt = 0, xDepth = 0; xTxt < sizeX; xTxt += nTxtPerDepthX, xDepth += nDepthPerTxtX )
2159      {
2160        Pel repDepth = 0; // to store the depth value used for warping
2161#if MERL_VSP_BLOCKSIZE_C0152 == 1
2162        repDepth = m_pDepth[(xTxt) + (yTxt)*dW];
2163#endif
2164#if MERL_VSP_BLOCKSIZE_C0152 == 2
2165        repDepth = m_pDepth[(xTxt) + (yTxt)*dW];
2166#endif
2167#if MERL_VSP_BLOCKSIZE_C0152 == 4
2168        repDepth = m_pDepth[(xTxt>>1) + (yTxt>>1)*dW];
2169#endif
2170
2171      // calculate the offset in the reference picture
2172        Int disparity = pShiftLUT[ repDepth ] << iShiftPrec;
2173        Int refOffset = xTxt + (disparity >> 3); // in integer pixel in chroma image
2174        Int xFrac = disparity & 0x7;
2175#if MERL_CVSP_D0165
2176        if(refOffset < minRelativePos || refOffset > maxRelativePos)
2177          xFrac = 0;
2178        refOffset = Clip3(minRelativePos, maxRelativePos, refOffset);
2179#endif
2180        Int absX  = posX + refOffset;
2181
2182        if (xFrac == 0)
2183          absX = Clip3(0, widthChroma-1, absX);
2184        else
2185          absX = Clip3(4, widthChroma-5, absX);
2186
2187        refOffset = absX - posX;
2188
2189        assert( refCb[refOffset] >= 0 && refCb[refOffset]<= 255 );
2190        assert( refCr[refOffset] >= 0 && refCr[refOffset]<= 255 );
2191#if MERL_Bi_VSP_D0166
2192        m_if.filterHorChroma(&refCb[refOffset], refStride, &dstCb[xTxt],  dstStride, nTxtPerDepthX, nTxtPerDepthY, xFrac, !bi);
2193        m_if.filterHorChroma(&refCr[refOffset], refStride, &dstCr[xTxt],  dstStride, nTxtPerDepthX, nTxtPerDepthY, xFrac, !bi);
2194#else
2195        m_if.filterHorChroma(&refCb[refOffset], refStride, &dstCb[xTxt],  dstStride, nTxtPerDepthX, nTxtPerDepthY, xFrac, true);
2196        m_if.filterHorChroma(&refCr[refOffset], refStride, &dstCr[xTxt],  dstStride, nTxtPerDepthX, nTxtPerDepthY, xFrac, true);
2197#endif
2198
2199      }
2200      refCb += refStrideBlock;
2201      refCr += refStrideBlock;
2202      dstCb += dstStrideBlock;
2203      dstCr += dstStrideBlock;
2204      depth += depStrideBlock;
2205    }
2206  }
2207
2208}
2209
2210#endif // MERL_VSP_C0152
2211
2212#if DEPTH_MAP_GENERATION
2213Void TComPrediction::xWeightedAveragePdm( TComDataCU* pcCU, TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, Int iRefIdx0, Int iRefIdx1, UInt uiPartIdx, Int iWidth, Int iHeight, TComYuv*& rpcYuvDst, UInt uiSubSampExpX, UInt uiSubSampExpY )
2214{
2215
2216  if( iRefIdx0 >= 0 && iRefIdx1 >= 0 )
2217  {
2218    rpcYuvDst->addAvgPdm( pcYuvSrc0, pcYuvSrc1, uiPartIdx, iWidth, iHeight, uiSubSampExpX, uiSubSampExpY );
2219  }
2220  else if ( iRefIdx0 >= 0 && iRefIdx1 <  0 )
2221  {
2222    pcYuvSrc0->copyPartToPartYuvPdm( rpcYuvDst, uiPartIdx, iWidth, iHeight, uiSubSampExpX, uiSubSampExpY );
2223  }
2224  else if ( iRefIdx0 <  0 && iRefIdx1 >= 0 )
2225  {
2226    pcYuvSrc1->copyPartToPartYuvPdm( rpcYuvDst, uiPartIdx, iWidth, iHeight, uiSubSampExpX, uiSubSampExpY );
2227  }
2228  else
2229  {
2230    assert (0);
2231  }
2232}
2233#endif
2234
2235Void TComPrediction::xWeightedAverage( TComDataCU* pcCU, TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, Int iRefIdx0, Int iRefIdx1, UInt uiPartIdx, Int iWidth, Int iHeight, TComYuv*& rpcYuvDst
2236#if MERL_Bi_VSP_D0166
2237                                 , Int predDirVSP
2238#endif
2239  )
2240{
2241#if MERL_Bi_VSP_D0166
2242  Bool isVSP = 0;
2243  if (pcCU->getVSPIndex(uiPartIdx)!=0)//is VSP
2244  {
2245    isVSP = 1;
2246  }
2247
2248  if(( !isVSP && iRefIdx0 >= 0 && iRefIdx1 >= 0 ) || ( isVSP && predDirVSP == 3 ))
2249#else
2250  if( iRefIdx0 >= 0 && iRefIdx1 >= 0 )
2251#endif
2252  {
2253    rpcYuvDst->addAvg( pcYuvSrc0, pcYuvSrc1, uiPartIdx, iWidth, iHeight );
2254  }
2255#if MERL_Bi_VSP_D0166
2256  else if ( ( !isVSP && iRefIdx0 >= 0 && iRefIdx1 <  0 ) || ( isVSP && predDirVSP == 1))
2257#else
2258  else if ( iRefIdx0 >= 0 && iRefIdx1 <  0 )
2259#endif
2260  {
2261    pcYuvSrc0->copyPartToPartYuv( rpcYuvDst, uiPartIdx, iWidth, iHeight );
2262  }
2263#if MERL_Bi_VSP_D0166
2264  else if (( !isVSP && iRefIdx0 <  0 && iRefIdx1 >= 0 ) || ( isVSP && predDirVSP == 2))
2265#else
2266  else if ( iRefIdx0 <  0 && iRefIdx1 >= 0 )
2267#endif
2268  {
2269    pcYuvSrc1->copyPartToPartYuv( rpcYuvDst, uiPartIdx, iWidth, iHeight );
2270  }
2271#if MERL_Bi_VSP_D0166
2272  else
2273  {//for debug test only
2274    assert(0);
2275  }
2276#endif
2277}
2278
2279// AMVP
2280Void TComPrediction::getMvPredAMVP( TComDataCU* pcCU, UInt uiPartIdx, UInt uiPartAddr, RefPicList eRefPicList, Int iRefIdx, TComMv& rcMvPred )
2281{
2282  AMVPInfo* pcAMVPInfo = pcCU->getCUMvField(eRefPicList)->getAMVPInfo();
2283
2284  if( pcCU->getAMVPMode(uiPartAddr) == AM_NONE || (pcAMVPInfo->iN <= 1 && pcCU->getAMVPMode(uiPartAddr) == AM_EXPL) )
2285  {
2286    rcMvPred = pcAMVPInfo->m_acMvCand[0];
2287
2288    pcCU->setMVPIdxSubParts( 0, eRefPicList, uiPartAddr, uiPartIdx, pcCU->getDepth(uiPartAddr));
2289    pcCU->setMVPNumSubParts( pcAMVPInfo->iN, eRefPicList, uiPartAddr, uiPartIdx, pcCU->getDepth(uiPartAddr));
2290    return;
2291  }
2292
2293  assert(pcCU->getMVPIdx(eRefPicList,uiPartAddr) >= 0);
2294  rcMvPred = pcAMVPInfo->m_acMvCand[pcCU->getMVPIdx(eRefPicList,uiPartAddr)];
2295  return;
2296}
2297
2298/** Function for deriving planar intra prediction.
2299 * \param pSrc pointer to reconstructed sample array
2300 * \param srcStride the stride of the reconstructed sample array
2301 * \param rpDst reference to pointer for the prediction sample array
2302 * \param dstStride the stride of the prediction sample array
2303 * \param width the width of the block
2304 * \param height the height of the block
2305 *
2306 * This function derives the prediction samples for planar mode (intra coding).
2307 */
2308Void TComPrediction::xPredIntraPlanar( Int* pSrc, Int srcStride, Pel* rpDst, Int dstStride, UInt width, UInt height )
2309{
2310  assert(width == height);
2311
2312  Int k, l, bottomLeft, topRight;
2313  Int horPred;
2314  Int leftColumn[MAX_CU_SIZE], topRow[MAX_CU_SIZE], bottomRow[MAX_CU_SIZE], rightColumn[MAX_CU_SIZE];
2315  UInt blkSize = width;
2316  UInt offset2D = width;
2317  UInt shift1D = g_aucConvertToBit[ width ] + 2;
2318  UInt shift2D = shift1D + 1;
2319
2320  // Get left and above reference column and row
2321  for(k=0;k<blkSize+1;k++)
2322  {
2323    topRow[k] = pSrc[k-srcStride];
2324    leftColumn[k] = pSrc[k*srcStride-1];
2325  }
2326
2327  // Prepare intermediate variables used in interpolation
2328  bottomLeft = leftColumn[blkSize];
2329  topRight   = topRow[blkSize];
2330  for (k=0;k<blkSize;k++)
2331  {
2332    bottomRow[k]   = bottomLeft - topRow[k];
2333    rightColumn[k] = topRight   - leftColumn[k];
2334    topRow[k]      <<= shift1D;
2335    leftColumn[k]  <<= shift1D;
2336  }
2337
2338  // Generate prediction signal
2339  for (k=0;k<blkSize;k++)
2340  {
2341    horPred = leftColumn[k] + offset2D;
2342    for (l=0;l<blkSize;l++)
2343    {
2344      horPred += rightColumn[k];
2345      topRow[l] += bottomRow[l];
2346      rpDst[k*dstStride+l] = ( (horPred + topRow[l]) >> shift2D );
2347    }
2348  }
2349}
2350
2351/** Function for deriving chroma LM intra prediction.
2352 * \param pcPattern pointer to neighbouring pixel access pattern
2353 * \param piSrc pointer to reconstructed chroma sample array
2354 * \param pPred pointer for the prediction sample array
2355 * \param uiPredStride the stride of the prediction sample array
2356 * \param uiCWidth the width of the chroma block
2357 * \param uiCHeight the height of the chroma block
2358 * \param uiChromaId boolean indication of chroma component
2359 *
2360 * This function derives the prediction samples for chroma LM mode (chroma intra coding)
2361 */
2362Void TComPrediction::predLMIntraChroma( TComPattern* pcPattern, Int* piSrc, Pel* pPred, UInt uiPredStride, UInt uiCWidth, UInt uiCHeight, UInt uiChromaId )
2363{
2364  UInt uiWidth  = 2 * uiCWidth;
2365
2366  xGetLLSPrediction( pcPattern, piSrc+uiWidth+2, uiWidth+1, pPred, uiPredStride, uiCWidth, uiCHeight, 1 ); 
2367}
2368
2369/** Function for deriving downsampled luma sample of current chroma block and its above, left causal pixel
2370 * \param pcPattern pointer to neighbouring pixel access pattern
2371 * \param uiCWidth the width of the chroma block
2372 * \param uiCHeight the height of the chroma block
2373 *
2374 * This function derives downsampled luma sample of current chroma block and its above, left causal pixel
2375 */
2376Void TComPrediction::getLumaRecPixels( TComPattern* pcPattern, UInt uiCWidth, UInt uiCHeight )
2377{
2378  UInt uiWidth  = 2 * uiCWidth;
2379  UInt uiHeight = 2 * uiCHeight; 
2380
2381  Pel* pRecSrc = pcPattern->getROIY();
2382  Pel* pDst0 = m_pLumaRecBuffer + m_iLumaRecStride + 1;
2383
2384  Int iRecSrcStride = pcPattern->getPatternLStride();
2385  Int iRecSrcStride2 = iRecSrcStride << 1;
2386  Int iDstStride = m_iLumaRecStride;
2387  Int iSrcStride = ( max( uiWidth, uiHeight ) << 1 ) + 1;
2388
2389  Int* ptrSrc = pcPattern->getAdiOrgBuf( uiWidth, uiHeight, m_piYuvExt );
2390
2391  // initial pointers
2392  Pel* pDst = pDst0 - 1 - iDstStride; 
2393  Int* piSrc = ptrSrc;
2394
2395  // top left corner downsampled from ADI buffer
2396  // don't need this point
2397
2398  // top row downsampled from ADI buffer
2399  pDst++;     
2400  piSrc ++;
2401  for (Int i = 0; i < uiCWidth; i++)
2402  {
2403    pDst[i] = ((piSrc[2*i] * 2 ) + piSrc[2*i - 1] + piSrc[2*i + 1] + 2) >> 2;
2404  }
2405
2406  // left column downsampled from ADI buffer
2407  pDst = pDst0 - 1; 
2408  piSrc = ptrSrc + iSrcStride;
2409  for (Int j = 0; j < uiCHeight; j++)
2410  {
2411    pDst[0] = ( piSrc[0] + piSrc[iSrcStride] ) >> 1;
2412    piSrc += iSrcStride << 1; 
2413    pDst += iDstStride;   
2414  }
2415
2416  // inner part from reconstructed picture buffer
2417  for( Int j = 0; j < uiCHeight; j++ )
2418  {
2419    for (Int i = 0; i < uiCWidth; i++)
2420    {
2421      pDst0[i] = (pRecSrc[2*i] + pRecSrc[2*i + iRecSrcStride]) >> 1;
2422    }
2423
2424    pDst0 += iDstStride;
2425    pRecSrc += iRecSrcStride2;
2426  }
2427}
2428
2429/** Function for deriving the positon of first non-zero binary bit of a value
2430 * \param x input value
2431 *
2432 * This function derives the positon of first non-zero binary bit of a value
2433 */
2434Int GetMSB( UInt x )
2435{
2436  Int iMSB = 0, bits = ( sizeof( Int ) << 3 ), y = 1;
2437
2438  while( x > 1 )
2439  {
2440    bits >>= 1;
2441    y = x >> bits;
2442
2443    if( y )
2444    {
2445      x = y;
2446      iMSB += bits;
2447    }
2448  }
2449
2450  iMSB+=y;
2451
2452  return iMSB;
2453}
2454
2455/** Function for counting leading number of zeros/ones
2456 * \param x input value
2457 \ This function counts leading number of zeros for positive numbers and
2458 \ leading number of ones for negative numbers. This can be implemented in
2459 \ single instructure cycle on many processors.
2460 */
2461
2462Short CountLeadingZerosOnes (Short x)
2463{
2464  Short clz;
2465  Short i;
2466
2467  if(x == 0)
2468  {
2469    clz = 0;
2470  }
2471  else
2472  {
2473    if (x == -1)
2474    {
2475      clz = 15;
2476    }
2477    else
2478    {
2479      if(x < 0)
2480      {
2481        x = ~x;
2482      }
2483      clz = 15;
2484      for(i = 0;i < 15;++i)
2485      {
2486        if(x) 
2487        {
2488          clz --;
2489        }
2490        x = x >> 1;
2491      }
2492    }
2493  }
2494  return clz;
2495}
2496
2497/** Function for deriving LM intra prediction.
2498 * \param pcPattern pointer to neighbouring pixel access pattern
2499 * \param pSrc0 pointer to reconstructed chroma sample array
2500 * \param iSrcStride the stride of reconstructed chroma sample array
2501 * \param pDst0 reference to pointer for the prediction sample array
2502 * \param iDstStride the stride of the prediction sample array
2503 * \param uiWidth the width of the chroma block
2504 * \param uiHeight the height of the chroma block
2505 * \param uiExt0 line number of neiggboirng pixels for calculating LM model parameter, default value is 1
2506 *
2507 * This function derives the prediction samples for chroma LM mode (chroma intra coding)
2508 */
2509Void TComPrediction::xGetLLSPrediction( TComPattern* pcPattern, Int* pSrc0, Int iSrcStride, Pel* pDst0, Int iDstStride, UInt uiWidth, UInt uiHeight, UInt uiExt0 )
2510{
2511
2512  Pel  *pDst, *pLuma;
2513  Int  *pSrc;
2514
2515  Int  iLumaStride = m_iLumaRecStride;
2516  Pel* pLuma0 = m_pLumaRecBuffer + uiExt0 * iLumaStride + uiExt0;
2517
2518  Int i, j, iCountShift = 0;
2519
2520  UInt uiExt = uiExt0;
2521
2522  // LLS parameters estimation -->
2523
2524  Int x = 0, y = 0, xx = 0, xy = 0;
2525
2526  pSrc  = pSrc0  - iSrcStride;
2527  pLuma = pLuma0 - iLumaStride;
2528
2529  for( j = 0; j < uiWidth; j++ )
2530  {
2531    x += pLuma[j];
2532    y += pSrc[j];
2533    xx += pLuma[j] * pLuma[j];
2534    xy += pLuma[j] * pSrc[j];
2535  }
2536  iCountShift += g_aucConvertToBit[ uiWidth ] + 2;
2537
2538  pSrc  = pSrc0 - uiExt;
2539  pLuma = pLuma0 - uiExt;
2540
2541  for( i = 0; i < uiHeight; i++ )
2542  {
2543    x += pLuma[0];
2544    y += pSrc[0];
2545    xx += pLuma[0] * pLuma[0];
2546    xy += pLuma[0] * pSrc[0];
2547
2548    pSrc  += iSrcStride;
2549    pLuma += iLumaStride;
2550  }
2551  iCountShift += iCountShift > 0 ? 1 : ( g_aucConvertToBit[ uiWidth ] + 2 );
2552
2553  Int iTempShift = ( g_uiBitDepth + g_uiBitIncrement ) + g_aucConvertToBit[ uiWidth ] + 3 - 15;
2554
2555  if(iTempShift > 0)
2556  {
2557    x  = ( x +  ( 1 << ( iTempShift - 1 ) ) ) >> iTempShift;
2558    y  = ( y +  ( 1 << ( iTempShift - 1 ) ) ) >> iTempShift;
2559    xx = ( xx + ( 1 << ( iTempShift - 1 ) ) ) >> iTempShift;
2560    xy = ( xy + ( 1 << ( iTempShift - 1 ) ) ) >> iTempShift;
2561    iCountShift -= iTempShift;
2562  }
2563
2564  Int a, b, iShift = 13;
2565
2566  if( iCountShift == 0 )
2567  {
2568    a = 0;
2569    b = 1 << (g_uiBitDepth + g_uiBitIncrement - 1);
2570    iShift = 0;
2571  }
2572  else
2573  {
2574    Int a1 = ( xy << iCountShift ) - y * x;
2575    Int a2 = ( xx << iCountShift ) - x * x;             
2576
2577    {
2578      const Int iShiftA2 = 6;
2579      const Int iShiftA1 = 15;
2580      const Int iAccuracyShift = 15;
2581
2582      Int iScaleShiftA2 = 0;
2583      Int iScaleShiftA1 = 0;
2584      Int a1s = a1;
2585      Int a2s = a2;
2586
2587      iScaleShiftA1 = GetMSB( abs( a1 ) ) - iShiftA1;
2588      iScaleShiftA2 = GetMSB( abs( a2 ) ) - iShiftA2; 
2589
2590      if( iScaleShiftA1 < 0 )
2591      {
2592        iScaleShiftA1 = 0;
2593      }
2594     
2595      if( iScaleShiftA2 < 0 )
2596      {
2597        iScaleShiftA2 = 0;
2598      }
2599     
2600      Int iScaleShiftA = iScaleShiftA2 + iAccuracyShift - iShift - iScaleShiftA1;
2601
2602      a2s = a2 >> iScaleShiftA2;
2603
2604      a1s = a1 >> iScaleShiftA1;
2605
2606      if (a2s >= 1)
2607      {
2608        a = a1s * m_uiaShift[ a2s - 1];
2609      }
2610      else
2611      {
2612        a = 0;
2613      }
2614     
2615      if( iScaleShiftA < 0 )
2616      {
2617        a = a << -iScaleShiftA;
2618      }
2619      else
2620      {
2621        a = a >> iScaleShiftA;
2622      }
2623     
2624       a = Clip3(-( 1 << 15 ), ( 1 << 15 ) - 1, a); 
2625     
2626      Int minA = -(1 << (6));
2627      Int maxA = (1 << 6) - 1;
2628      if( a <= maxA && a >= minA )
2629      {
2630        // do nothing
2631      }
2632      else
2633      {
2634        Short n = CountLeadingZerosOnes(a);
2635        a = a >> (9-n);
2636        iShift -= (9-n);
2637      }
2638
2639      b = (  y - ( ( a * x ) >> iShift ) + ( 1 << ( iCountShift - 1 ) ) ) >> iCountShift;
2640    }
2641  }   
2642
2643  // <-- end of LLS parameters estimation
2644
2645  // get prediction -->
2646  uiExt = uiExt0;
2647  pLuma = pLuma0;
2648  pDst = pDst0;
2649
2650  for( i = 0; i < uiHeight; i++ )
2651  {
2652    for( j = 0; j < uiWidth; j++ )
2653    {
2654      pDst[j] = Clip( ( ( a * pLuma[j] ) >> iShift ) + b );
2655    }
2656   
2657    pDst  += iDstStride;
2658    pLuma += iLumaStride;
2659  }
2660  // <-- end of get prediction
2661
2662}
2663
2664
2665#if LGE_ILLUCOMP_B0045
2666/** Function for deriving LM illumination compensation.
2667 */
2668Void TComPrediction::xGetLLSICPrediction(TComDataCU* pcCU, TComMv *pMv, TComPicYuv *pRefPic, Int &a, Int &b, Int &iShift)
2669{
2670  TComPicYuv *pRecPic = pcCU->getPic()->getPicYuvRec();
2671  Pel *pRec, *pRef;
2672  UInt uiWidth, uiHeight, uiTmpPartIdx;
2673  Int iRecStride = pRecPic->getStride(), iRefStride = pRefPic->getStride();
2674  Int iCUPelX, iCUPelY, iRefX, iRefY, iRefOffset;
2675
2676  iCUPelX = pcCU->getCUPelX() + g_auiRasterToPelX[g_auiZscanToRaster[pcCU->getZorderIdxInCU()]];
2677  iCUPelY = pcCU->getCUPelY() + g_auiRasterToPelY[g_auiZscanToRaster[pcCU->getZorderIdxInCU()]];
2678  iRefX   = iCUPelX + (pMv->getHor() >> 2);
2679  iRefY   = iCUPelY + (pMv->getVer() >> 2);
2680  uiWidth = pcCU->getWidth(0);
2681  uiHeight = pcCU->getHeight(0);
2682
2683  Int i, j, iCountShift = 0;
2684
2685  // LLS parameters estimation -->
2686
2687  Int x = 0, y = 0, xx = 0, xy = 0;
2688
2689  if(pcCU->getPUAbove(uiTmpPartIdx, pcCU->getZorderIdxInCU()) && iCUPelY > 0 && iRefY > 0)
2690  {
2691    iRefOffset = ( pMv->getHor() >> 2 ) + ( pMv->getVer() >> 2 ) * iRefStride - iRefStride;
2692    pRef = pRefPic->getLumaAddr( pcCU->getAddr(), pcCU->getZorderIdxInCU() ) + iRefOffset;
2693    pRec = pRecPic->getLumaAddr( pcCU->getAddr(), pcCU->getZorderIdxInCU() ) - iRecStride;
2694
2695    for( j = 0; j < uiWidth; j++ )
2696    {
2697      x += pRef[j];
2698      y += pRec[j];
2699      xx += pRef[j] * pRef[j];
2700      xy += pRef[j] * pRec[j];
2701    }
2702    iCountShift += g_aucConvertToBit[ uiWidth ] + 2;
2703  }
2704
2705
2706  if(pcCU->getPULeft(uiTmpPartIdx, pcCU->getZorderIdxInCU()) && iCUPelX > 0 && iRefX > 0)
2707  {
2708    iRefOffset = ( pMv->getHor() >> 2 ) + ( pMv->getVer() >> 2 ) * iRefStride - 1;
2709    pRef = pRefPic->getLumaAddr( pcCU->getAddr(), pcCU->getZorderIdxInCU() ) + iRefOffset;
2710    pRec = pRecPic->getLumaAddr( pcCU->getAddr(), pcCU->getZorderIdxInCU() ) - 1;
2711
2712    for( i = 0; i < uiHeight; i++ )
2713    {
2714      x += pRef[0];
2715      y += pRec[0];
2716      xx += pRef[0] * pRef[0];
2717      xy += pRef[0] * pRec[0];
2718
2719      pRef += iRefStride;
2720      pRec += iRecStride;
2721    }
2722    iCountShift += iCountShift > 0 ? 1 : ( g_aucConvertToBit[ uiWidth ] + 2 );
2723  }
2724
2725  Int iTempShift = ( g_uiBitDepth + g_uiBitIncrement ) + g_aucConvertToBit[ uiWidth ] + 3 - 15;
2726
2727  if(iTempShift > 0)
2728  {
2729    x  = ( x +  ( 1 << ( iTempShift - 1 ) ) ) >> iTempShift;
2730    y  = ( y +  ( 1 << ( iTempShift - 1 ) ) ) >> iTempShift;
2731    xx = ( xx + ( 1 << ( iTempShift - 1 ) ) ) >> iTempShift;
2732    xy = ( xy + ( 1 << ( iTempShift - 1 ) ) ) >> iTempShift;
2733    iCountShift -= iTempShift;
2734  }
2735
2736  iShift = 13;
2737
2738  if( iCountShift == 0 )
2739  {
2740    a = 1;
2741    b = 0;
2742    iShift = 0;
2743  }
2744  else
2745  {
2746    Int a1 = ( xy << iCountShift ) - y * x;
2747    Int a2 = ( xx << iCountShift ) - x * x;             
2748
2749    {
2750      const Int iShiftA2 = 6;
2751      const Int iShiftA1 = 15;
2752      const Int iAccuracyShift = 15;
2753
2754      Int iScaleShiftA2 = 0;
2755      Int iScaleShiftA1 = 0;
2756      Int a1s = a1;
2757      Int a2s = a2;
2758
2759      iScaleShiftA1 = GetMSB( abs( a1 ) ) - iShiftA1;
2760      iScaleShiftA2 = GetMSB( abs( a2 ) ) - iShiftA2; 
2761
2762      if( iScaleShiftA1 < 0 )
2763      {
2764        iScaleShiftA1 = 0;
2765      }
2766
2767      if( iScaleShiftA2 < 0 )
2768      {
2769        iScaleShiftA2 = 0;
2770      }
2771
2772      Int iScaleShiftA = iScaleShiftA2 + iAccuracyShift - iShift - iScaleShiftA1;
2773
2774      a2s = a2 >> iScaleShiftA2;
2775
2776      a1s = a1 >> iScaleShiftA1;
2777
2778      if (a2s >= 1)
2779      {
2780        a = a1s * m_uiaShift[ a2s - 1];
2781      }
2782      else
2783      {
2784        a = 0;
2785      }
2786
2787      if( iScaleShiftA < 0 )
2788      {
2789        a = a << -iScaleShiftA;
2790      }
2791      else
2792      {
2793        a = a >> iScaleShiftA;
2794      }
2795
2796      a = Clip3(-( 1 << 15 ), ( 1 << 15 ) - 1, a); 
2797
2798      Int minA = -(1 << (6));
2799      Int maxA = (1 << 6) - 1;
2800      if( a <= maxA && a >= minA )
2801      {
2802        // do nothing
2803      }
2804      else
2805      {
2806        Short n = CountLeadingZerosOnes(a);
2807        a = a >> (9-n);
2808        iShift -= (9-n);
2809      }
2810
2811      b = (  y - ( ( a * x ) >> iShift ) + ( 1 << ( iCountShift - 1 ) ) ) >> iCountShift;
2812    }
2813  }   
2814}
2815
2816Void TComPrediction::xGetLLSICPredictionChroma(TComDataCU* pcCU, TComMv *pMv, TComPicYuv *pRefPic, Int &a, Int &b, Int &iShift, Int iChromaId)
2817{
2818  TComPicYuv *pRecPic = pcCU->getPic()->getPicYuvRec();
2819  Pel *pRec = NULL, *pRef = NULL;
2820  UInt uiWidth, uiHeight, uiTmpPartIdx;
2821  Int iRecStride = pRecPic->getCStride(), iRefStride = pRefPic->getCStride();
2822  Int iCUPelX, iCUPelY, iRefX, iRefY, iRefOffset;
2823
2824  iCUPelX = pcCU->getCUPelX() + g_auiRasterToPelX[g_auiZscanToRaster[pcCU->getZorderIdxInCU()]];
2825  iCUPelY = pcCU->getCUPelY() + g_auiRasterToPelY[g_auiZscanToRaster[pcCU->getZorderIdxInCU()]];
2826  iRefX   = iCUPelX + (pMv->getHor() >> 2);
2827  iRefY   = iCUPelY + (pMv->getVer() >> 2);
2828  uiWidth = pcCU->getWidth(0) >> 1;
2829  uiHeight = pcCU->getHeight(0) >> 1;
2830
2831  Int i, j, iCountShift = 0;
2832
2833  // LLS parameters estimation -->
2834
2835  Int x = 0, y = 0, xx = 0, xy = 0;
2836
2837  if(pcCU->getPUAbove(uiTmpPartIdx, pcCU->getZorderIdxInCU()) && iCUPelY > 0 && iRefY > 0)
2838  {
2839    iRefOffset = ( pMv->getHor() >> 3 ) + ( pMv->getVer() >> 3 ) * iRefStride - iRefStride;
2840    if (iChromaId == 0) // Cb
2841    {
2842      pRef = pRefPic->getCbAddr( pcCU->getAddr(), pcCU->getZorderIdxInCU() ) + iRefOffset;
2843      pRec = pRecPic->getCbAddr( pcCU->getAddr(), pcCU->getZorderIdxInCU() ) - iRecStride;
2844    }
2845    else if (iChromaId == 1) // Cr
2846    {
2847      pRef = pRefPic->getCrAddr( pcCU->getAddr(), pcCU->getZorderIdxInCU() ) + iRefOffset;
2848      pRec = pRecPic->getCrAddr( pcCU->getAddr(), pcCU->getZorderIdxInCU() ) - iRecStride;
2849    }
2850
2851    for( j = 0; j < uiWidth; j++ )
2852    {
2853      x += pRef[j];
2854      y += pRec[j];
2855      xx += pRef[j] * pRef[j];
2856      xy += pRef[j] * pRec[j];
2857    }
2858    iCountShift += g_aucConvertToBit[ uiWidth ] + 2;
2859  }
2860
2861
2862  if(pcCU->getPULeft(uiTmpPartIdx, pcCU->getZorderIdxInCU()) && iCUPelX > 0 && iRefX > 0)
2863  {
2864    iRefOffset = ( pMv->getHor() >> 3 ) + ( pMv->getVer() >> 3 ) * iRefStride - 1;
2865    if (iChromaId == 0) // Cb
2866    {
2867      pRef = pRefPic->getCbAddr( pcCU->getAddr(), pcCU->getZorderIdxInCU() ) + iRefOffset;
2868      pRec = pRecPic->getCbAddr( pcCU->getAddr(), pcCU->getZorderIdxInCU() ) - 1;
2869    }
2870    else if (iChromaId == 1) // Cr
2871    {
2872      pRef = pRefPic->getCrAddr( pcCU->getAddr(), pcCU->getZorderIdxInCU() ) + iRefOffset;
2873      pRec = pRecPic->getCrAddr( pcCU->getAddr(), pcCU->getZorderIdxInCU() ) - 1;
2874    }
2875
2876    for( i = 0; i < uiHeight; i++ )
2877    {
2878      x += pRef[0];
2879      y += pRec[0];
2880      xx += pRef[0] * pRef[0];
2881      xy += pRef[0] * pRec[0];
2882
2883      pRef += iRefStride;
2884      pRec += iRecStride;
2885    }
2886    iCountShift += iCountShift > 0 ? 1 : ( g_aucConvertToBit[ uiWidth ] + 2 );
2887  }
2888
2889  Int iTempShift = ( g_uiBitDepth + g_uiBitIncrement ) + g_aucConvertToBit[ uiWidth ] + 3 - 15;
2890
2891  if(iTempShift > 0)
2892  {
2893    x  = ( x +  ( 1 << ( iTempShift - 1 ) ) ) >> iTempShift;
2894    y  = ( y +  ( 1 << ( iTempShift - 1 ) ) ) >> iTempShift;
2895    xx = ( xx + ( 1 << ( iTempShift - 1 ) ) ) >> iTempShift;
2896    xy = ( xy + ( 1 << ( iTempShift - 1 ) ) ) >> iTempShift;
2897    iCountShift -= iTempShift;
2898  }
2899
2900  iShift = 13;
2901
2902  if( iCountShift == 0 )
2903  {
2904    a = 1;
2905    b = 0;
2906    iShift = 0;
2907  }
2908  else
2909  {
2910    Int a1 = ( xy << iCountShift ) - y * x;
2911    Int a2 = ( xx << iCountShift ) - x * x;             
2912
2913    {
2914      const Int iShiftA2 = 6;
2915      const Int iShiftA1 = 15;
2916      const Int iAccuracyShift = 15;
2917
2918      Int iScaleShiftA2 = 0;
2919      Int iScaleShiftA1 = 0;
2920      Int a1s = a1;
2921      Int a2s = a2;
2922
2923      iScaleShiftA1 = GetMSB( abs( a1 ) ) - iShiftA1;
2924      iScaleShiftA2 = GetMSB( abs( a2 ) ) - iShiftA2; 
2925
2926      if( iScaleShiftA1 < 0 )
2927      {
2928        iScaleShiftA1 = 0;
2929      }
2930
2931      if( iScaleShiftA2 < 0 )
2932      {
2933        iScaleShiftA2 = 0;
2934      }
2935
2936      Int iScaleShiftA = iScaleShiftA2 + iAccuracyShift - iShift - iScaleShiftA1;
2937
2938      a2s = a2 >> iScaleShiftA2;
2939
2940      a1s = a1 >> iScaleShiftA1;
2941
2942      if (a2s >= 1)
2943      {
2944        a = a1s * m_uiaShift[ a2s - 1];
2945      }
2946      else
2947      {
2948        a = 0;
2949      }
2950
2951      if( iScaleShiftA < 0 )
2952      {
2953        a = a << -iScaleShiftA;
2954      }
2955      else
2956      {
2957        a = a >> iScaleShiftA;
2958      }
2959
2960      a = Clip3(-( 1 << 15 ), ( 1 << 15 ) - 1, a); 
2961
2962      Int minA = -(1 << (6));
2963      Int maxA = (1 << 6) - 1;
2964      if( a <= maxA && a >= minA )
2965      {
2966        // do nothing
2967      }
2968      else
2969      {
2970        Short n = CountLeadingZerosOnes(a);
2971        a = a >> (9-n);
2972        iShift -= (9-n);
2973      }
2974
2975      b = (  y - ( ( a * x ) >> iShift ) + ( 1 << ( iCountShift - 1 ) ) ) >> iCountShift;
2976    }
2977  }   
2978}
2979#endif
2980/** Function for filtering intra DC predictor.
2981 * \param pSrc pointer to reconstructed sample array
2982 * \param iSrcStride the stride of the reconstructed sample array
2983 * \param rpDst reference to pointer for the prediction sample array
2984 * \param iDstStride the stride of the prediction sample array
2985 * \param iWidth the width of the block
2986 * \param iHeight the height of the block
2987 *
2988 * This function performs filtering left and top edges of the prediction samples for DC mode (intra coding).
2989 */
2990Void TComPrediction::xDCPredFiltering( Int* pSrc, Int iSrcStride, Pel*& rpDst, Int iDstStride, Int iWidth, Int iHeight )
2991{
2992  Pel* pDst = rpDst;
2993  Int x, y, iDstStride2, iSrcStride2;
2994
2995  // boundary pixels processing
2996  pDst[0] = (Pel)((pSrc[-iSrcStride] + pSrc[-1] + 2 * pDst[0] + 2) >> 2);
2997
2998  for ( x = 1; x < iWidth; x++ )
2999  {
3000    pDst[x] = (Pel)((pSrc[x - iSrcStride] +  3 * pDst[x] + 2) >> 2);
3001  }
3002
3003  for ( y = 1, iDstStride2 = iDstStride, iSrcStride2 = iSrcStride-1; y < iHeight; y++, iDstStride2+=iDstStride, iSrcStride2+=iSrcStride )
3004  {
3005    pDst[iDstStride2] = (Pel)((pSrc[iSrcStride2] + 3 * pDst[iDstStride2] + 2) >> 2);
3006  }
3007
3008  return;
3009}
3010
3011#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
3012Void TComPrediction::predIntraLumaDMM( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiMode, Pel* piPred, UInt uiStride, Int iWidth, Int iHeight, Bool bAbove, Bool bLeft, Bool bEncoder )
3013{
3014#if HHI_DMM_WEDGE_INTRA
3015  if( uiMode == DMM_WEDGE_FULL_IDX        ) { xPredIntraWedgeFull ( pcCU, uiAbsPartIdx, piPred, uiStride, iWidth, iHeight, bAbove, bLeft, bEncoder, false, pcCU->getWedgeFullTabIdx ( uiAbsPartIdx ) ); }
3016  if( uiMode == DMM_WEDGE_FULL_D_IDX      ) { xPredIntraWedgeFull ( pcCU, uiAbsPartIdx, piPred, uiStride, iWidth, iHeight, bAbove, bLeft, bEncoder, true,  pcCU->getWedgeFullTabIdx( uiAbsPartIdx ), pcCU->getWedgeFullDeltaDC1( uiAbsPartIdx ), pcCU->getWedgeFullDeltaDC2( uiAbsPartIdx ) ); }
3017  if( uiMode == DMM_WEDGE_PREDDIR_IDX     ) { xPredIntraWedgeDir  ( pcCU, uiAbsPartIdx, piPred, uiStride, iWidth, iHeight, bAbove, bLeft, bEncoder, false, pcCU->getWedgePredDirDeltaEnd( uiAbsPartIdx ) ); }
3018  if( uiMode == DMM_WEDGE_PREDDIR_D_IDX   ) { xPredIntraWedgeDir  ( pcCU, uiAbsPartIdx, piPred, uiStride, iWidth, iHeight, bAbove, bLeft, bEncoder, true,  pcCU->getWedgePredDirDeltaEnd( uiAbsPartIdx ), pcCU->getWedgePredDirDeltaDC1( uiAbsPartIdx ), pcCU->getWedgePredDirDeltaDC2( uiAbsPartIdx ) ); }
3019#endif
3020#if HHI_DMM_PRED_TEX
3021  if( uiMode == DMM_WEDGE_PREDTEX_IDX     ) { xPredIntraWedgeTex  ( pcCU, uiAbsPartIdx, piPred, uiStride, iWidth, iHeight, bAbove, bLeft, bEncoder, false ); }
3022  if( uiMode == DMM_WEDGE_PREDTEX_D_IDX   ) { xPredIntraWedgeTex  ( pcCU, uiAbsPartIdx, piPred, uiStride, iWidth, iHeight, bAbove, bLeft, bEncoder, true, pcCU->getWedgePredTexDeltaDC1( uiAbsPartIdx ), pcCU->getWedgePredTexDeltaDC2( uiAbsPartIdx ) ); }
3023  if( uiMode == DMM_CONTOUR_PREDTEX_IDX   ) { xPredIntraContourTex( pcCU, uiAbsPartIdx, piPred, uiStride, iWidth, iHeight, bAbove, bLeft, bEncoder, false ); }
3024  if( uiMode == DMM_CONTOUR_PREDTEX_D_IDX ) { xPredIntraContourTex( pcCU, uiAbsPartIdx, piPred, uiStride, iWidth, iHeight, bAbove, bLeft, bEncoder, true, pcCU->getContourPredTexDeltaDC1( uiAbsPartIdx ), pcCU->getContourPredTexDeltaDC2( uiAbsPartIdx ) ); }
3025#endif
3026}
3027
3028Void TComPrediction::getWedgePredDCs( TComWedgelet* pcWedgelet, Int* piMask, Int iMaskStride, Int& riPredDC1, Int& riPredDC2, Bool bAbove, Bool bLeft )
3029{
3030  riPredDC1 = ( 1<<( g_uiBitDepth + g_uiBitIncrement - 1) ); //pred val, if no neighbors are available
3031  riPredDC2 = ( 1<<( g_uiBitDepth + g_uiBitIncrement - 1) );
3032
3033  if( !bAbove && !bLeft ) { return; }
3034
3035  UInt uiNumSmpDC1 = 0, uiNumSmpDC2 = 0;
3036  Int iPredDC1 = 0, iPredDC2 = 0;
3037
3038  Bool* pabWedgePattern = pcWedgelet->getPattern();
3039  UInt  uiWedgeStride   = pcWedgelet->getStride();
3040
3041#if HS_REFERENCE_SUBSAMPLE_C0154
3042  Int subSamplePix;
3043  if ( pcWedgelet->getWidth() == 32 )
3044  {
3045    subSamplePix = 2;
3046  }
3047  else
3048  {
3049    subSamplePix = 1;
3050  }
3051#endif
3052
3053  if( bAbove )
3054  {
3055#if HS_REFERENCE_SUBSAMPLE_C0154
3056    for( Int k = 0; k < pcWedgelet->getWidth(); k+=subSamplePix )
3057#else
3058    for( Int k = 0; k < pcWedgelet->getWidth(); k++ )
3059#endif
3060    {
3061      if( true == pabWedgePattern[k] )
3062      {
3063        iPredDC2 += piMask[k-iMaskStride];
3064        uiNumSmpDC2++;
3065      }
3066      else
3067      {
3068        iPredDC1 += piMask[k-iMaskStride];
3069        uiNumSmpDC1++;
3070      }
3071    }
3072  }
3073  if( bLeft )
3074  {
3075#if HS_REFERENCE_SUBSAMPLE_C0154
3076    for( Int k = 0; k < pcWedgelet->getHeight(); k+=subSamplePix )
3077#else
3078    for( Int k = 0; k < pcWedgelet->getHeight(); k++ )
3079#endif
3080    {
3081      if( true == pabWedgePattern[k*uiWedgeStride] )
3082      {
3083        iPredDC2 += piMask[k*iMaskStride-1];
3084        uiNumSmpDC2++;
3085      } 
3086      else
3087      {
3088        iPredDC1 += piMask[k*iMaskStride-1];
3089        uiNumSmpDC1++;
3090      }
3091    }
3092  }
3093
3094  if( uiNumSmpDC1 > 0 )
3095  {
3096    iPredDC1 /= uiNumSmpDC1;
3097    riPredDC1 = iPredDC1;
3098  }
3099  if( uiNumSmpDC2 > 0 )
3100  {
3101    iPredDC2 /= uiNumSmpDC2;
3102    riPredDC2 = iPredDC2;
3103  }
3104}
3105
3106Void TComPrediction::calcWedgeDCs( TComWedgelet* pcWedgelet, Pel* piOrig, UInt uiStride, Int& riDC1, Int& riDC2 )
3107{
3108  UInt uiDC1 = 0;
3109  UInt uiDC2 = 0;
3110  UInt uiNumPixDC1 = 0, uiNumPixDC2 = 0;
3111  Bool* pabWedgePattern = pcWedgelet->getPattern();
3112  if( uiStride == pcWedgelet->getStride() )
3113  {
3114    for( UInt k = 0; k < (pcWedgelet->getWidth() * pcWedgelet->getHeight()); k++ )
3115    {
3116      if( true == pabWedgePattern[k] ) 
3117      {
3118        uiDC2 += piOrig[k];
3119        uiNumPixDC2++;
3120      }
3121      else
3122      {
3123        uiDC1 += piOrig[k];
3124        uiNumPixDC1++;
3125      }
3126    }
3127  }
3128  else
3129  {
3130    Pel* piTemp = piOrig;
3131    UInt uiWedgeStride = pcWedgelet->getStride();
3132    for( UInt uiY = 0; uiY < pcWedgelet->getHeight(); uiY++ )
3133    {
3134      for( UInt uiX = 0; uiX < pcWedgelet->getWidth(); uiX++ )
3135      {
3136        if( true == pabWedgePattern[uiX] ) 
3137        {
3138          uiDC2 += piTemp[uiX];
3139          uiNumPixDC2++;
3140        }
3141        else
3142        {
3143          uiDC1 += piTemp[uiX];
3144          uiNumPixDC1++;
3145        }
3146      }
3147      piTemp          += uiStride;
3148      pabWedgePattern += uiWedgeStride;
3149    }
3150  }
3151
3152  if( uiNumPixDC1 > 0 ) { riDC1 = uiDC1 / uiNumPixDC1; }
3153  else                  { riDC1 = ( 1<<( g_uiBitDepth + g_uiBitIncrement - 1) ); }
3154
3155  if( uiNumPixDC2 > 0 ) { riDC2 = uiDC2 / uiNumPixDC2; }
3156  else                  { riDC2 = ( 1<<( g_uiBitDepth + g_uiBitIncrement - 1) ); }
3157}
3158
3159Void TComPrediction::assignWedgeDCs2Pred( TComWedgelet* pcWedgelet, Pel* piPred, UInt uiStride, Int iDC1, Int iDC2 )
3160{
3161  Bool* pabWedgePattern = pcWedgelet->getPattern();
3162
3163  if( uiStride == pcWedgelet->getStride() )
3164  {
3165    for( UInt k = 0; k < (pcWedgelet->getWidth() * pcWedgelet->getHeight()); k++ )
3166    {
3167      if( true == pabWedgePattern[k] ) 
3168      {
3169        piPred[k] = iDC2;
3170      }
3171      else
3172      {
3173        piPred[k] = iDC1;
3174      }
3175    }
3176  }
3177  else
3178  {
3179    Pel* piTemp = piPred;
3180    UInt uiWedgeStride = pcWedgelet->getStride();
3181    for( UInt uiY = 0; uiY < pcWedgelet->getHeight(); uiY++ )
3182    {
3183      for( UInt uiX = 0; uiX < pcWedgelet->getWidth(); uiX++ )
3184      {
3185        if( true == pabWedgePattern[uiX] ) 
3186        {
3187          piTemp[uiX] = iDC2;
3188        }
3189        else
3190        {
3191          piTemp[uiX] = iDC1;
3192        }
3193      }
3194      piTemp          += uiStride;
3195      pabWedgePattern += uiWedgeStride;
3196    }
3197  }
3198}
3199
3200Void TComPrediction::xDeltaDCQuantScaleUp( TComDataCU* pcCU, Int& riDeltaDC )
3201{
3202  Int  iSign  = riDeltaDC < 0 ? -1 : 1;
3203  UInt uiAbs  = abs( riDeltaDC );
3204
3205  Int iQp = pcCU->getQP(0);
3206  Double dMax = (Double)( 1<<( g_uiBitDepth + g_uiBitIncrement - 1) );
3207  Double dStepSize = Clip3( 1.0, dMax, pow( 2.0, iQp/10.0 + g_iDeltaDCsQuantOffset ) );
3208
3209  riDeltaDC = iSign * roftoi( uiAbs * dStepSize );
3210  return;
3211}
3212
3213Void TComPrediction::xDeltaDCQuantScaleDown( TComDataCU*  pcCU, Int& riDeltaDC )
3214{
3215  Int  iSign  = riDeltaDC < 0 ? -1 : 1;
3216  UInt uiAbs  = abs( riDeltaDC );
3217
3218  Int iQp = pcCU->getQP(0);
3219  Double dMax = (Double)( 1<<( g_uiBitDepth + g_uiBitIncrement - 1) );
3220  Double dStepSize = Clip3( 1.0, dMax, pow( 2.0, iQp/10.0 + g_iDeltaDCsQuantOffset ) );
3221
3222  riDeltaDC = iSign * roftoi( uiAbs / dStepSize );
3223  return;
3224}
3225#endif
3226
3227#if HHI_DMM_PRED_TEX
3228Void TComPrediction::getBestContourFromTex( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, TComWedgelet* pcContourWedge )
3229{
3230  pcContourWedge->clear();
3231
3232  // get copy of co-located texture luma block
3233  TComYuv cTempYuv;
3234  cTempYuv.create( uiWidth, uiHeight ); 
3235  cTempYuv.clear();
3236  Pel* piRefBlkY = cTempYuv.getLumaAddr();
3237  copyTextureLumaBlock( pcCU, uiAbsPartIdx, piRefBlkY, uiWidth, uiHeight );
3238  piRefBlkY = cTempYuv.getLumaAddr();
3239
3240  // find contour for texture luma block
3241  UInt iDC = 0;
3242  for( UInt k = 0; k < (uiWidth*uiHeight); k++ ) 
3243  { 
3244    iDC += piRefBlkY[k]; 
3245  }
3246  iDC /= (uiWidth*uiHeight);
3247  piRefBlkY = cTempYuv.getLumaAddr();
3248
3249  Bool* pabContourPattern = pcContourWedge->getPattern();
3250  for( UInt k = 0; k < (uiWidth*uiHeight); k++ ) 
3251  { 
3252    pabContourPattern[k] = (piRefBlkY[k] > iDC) ? true : false;
3253  }
3254
3255  cTempYuv.destroy();
3256}
3257
3258#if LGE_DMM3_SIMP_C0044
3259/**
3260 - fetch best Wedgelet pattern at decoder
3261 */
3262UInt TComPrediction::getBestWedgeFromTex( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, UInt IntraTabIdx)
3263{
3264  assert( uiWidth >= DMM_WEDGEMODEL_MIN_SIZE && uiWidth <= DMM_WEDGEMODEL_MAX_SIZE );
3265
3266  UInt          uiBestTabIdx = 0;
3267  TComPic*      pcPicTex = pcCU->getSlice()->getTexturePic();
3268  TComDataCU*   pcColTexCU = pcPicTex->getCU(pcCU->getAddr());
3269  UInt          uiTexPartIdx = pcCU->getZorderIdxInCU() + uiAbsPartIdx;
3270  Int           uiColTexIntraDir = pcColTexCU->isIntra( uiTexPartIdx ) ? pcColTexCU->getLumaIntraDir( uiTexPartIdx ) : 255;
3271
3272  std::vector< std::vector<UInt> > pauiWdgLstSz = g_aauiWdgLstM3[g_aucConvertToBit[uiWidth]];
3273
3274  if( uiColTexIntraDir > DC_IDX && uiColTexIntraDir < 35 )
3275  {
3276    std::vector<UInt>* pauiWdgLst = &pauiWdgLstSz[uiColTexIntraDir-2];
3277    uiBestTabIdx    =   pauiWdgLst->at(IntraTabIdx);
3278  }
3279  else
3280  {
3281    WedgeNodeList* pacWedgeNodeList = &g_aacWedgeNodeLists[(g_aucConvertToBit[uiWidth])];
3282    uiBestTabIdx = pacWedgeNodeList->at(IntraTabIdx).getPatternIdx();
3283  }
3284
3285  return uiBestTabIdx;
3286}
3287#endif
3288
3289#if LGE_DMM3_SIMP_C0044
3290/**
3291 - calculate best Wedgelet pattern at encoder
3292 */
3293UInt TComPrediction::getBestWedgeFromTex( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, Pel* piOrigi, UInt uiStride, UInt & ruiIntraTabIdx)
3294#else
3295UInt TComPrediction::getBestWedgeFromTex( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight )
3296#endif
3297{
3298  assert( uiWidth >= DMM_WEDGEMODEL_MIN_SIZE && uiWidth <= DMM_WEDGEMODEL_MAX_SIZE );
3299
3300  // get copy of co-located texture luma block
3301  TComYuv cTempYuv; 
3302  cTempYuv.create( uiWidth, uiHeight ); 
3303  cTempYuv.clear();
3304  Pel* piRefBlkY = cTempYuv.getLumaAddr();
3305
3306  copyTextureLumaBlock( pcCU, uiAbsPartIdx, piRefBlkY, uiWidth, uiHeight );
3307  piRefBlkY = cTempYuv.getLumaAddr();
3308
3309  // local pred buffer
3310  TComYuv cPredYuv; 
3311  cPredYuv.create( uiWidth, uiHeight ); 
3312  cPredYuv.clear();
3313  Pel* piPred = cPredYuv.getLumaAddr();
3314
3315  UInt uiPredStride = cPredYuv.getStride();
3316
3317  // wedge search
3318  TComWedgeDist cWedgeDist;
3319  UInt uiBestDist = MAX_UINT;
3320  UInt uiBestTabIdx = 0;
3321  Int  iDC1 = 0;
3322  Int  iDC2 = 0;
3323  WedgeList* pacWedgeList = &g_aacWedgeLists[(g_aucConvertToBit[uiWidth])];
3324#if LGE_DMM3_SIMP_C0044
3325  ruiIntraTabIdx  = 0;
3326#endif
3327  TComPic*      pcPicTex = pcCU->getSlice()->getTexturePic();
3328  TComDataCU* pcColTexCU = pcPicTex->getCU(pcCU->getAddr());
3329  UInt      uiTexPartIdx = pcCU->getZorderIdxInCU() + uiAbsPartIdx;
3330  Int   uiColTexIntraDir = pcColTexCU->isIntra( uiTexPartIdx ) ? pcColTexCU->getLumaIntraDir( uiTexPartIdx ) : 255;
3331
3332  std::vector< std::vector<UInt> > pauiWdgLstSz = g_aauiWdgLstM3[g_aucConvertToBit[uiWidth]];
3333  if( uiColTexIntraDir > DC_IDX && uiColTexIntraDir < 35 )
3334  {
3335    std::vector<UInt>* pauiWdgLst = &pauiWdgLstSz[uiColTexIntraDir-2];
3336    for( UInt uiIdxW = 0; uiIdxW < pauiWdgLst->size(); uiIdxW++ )
3337    {
3338      UInt uiIdx     =   pauiWdgLst->at(uiIdxW);
3339#if LGE_DMM3_SIMP_C0044
3340      calcWedgeDCs       ( &(pacWedgeList->at(uiIdx)), piOrigi,   uiWidth,      iDC1, iDC2 );
3341#else
3342      calcWedgeDCs       ( &(pacWedgeList->at(uiIdx)), piRefBlkY, uiWidth,      iDC1, iDC2 );
3343#endif
3344      assignWedgeDCs2Pred( &(pacWedgeList->at(uiIdx)), piPred,    uiPredStride, iDC1, iDC2 );
3345
3346#if LGE_DMM3_SIMP_C0044
3347      UInt uiActDist = cWedgeDist.getDistPart( piPred, uiPredStride, piOrigi, uiStride, uiWidth, uiHeight, WedgeDist_SAD );
3348#else
3349      UInt uiActDist = cWedgeDist.getDistPart( piPred, uiPredStride, piRefBlkY, uiWidth, uiWidth, uiHeight, WedgeDist_SAD );
3350#endif
3351
3352      if( uiActDist < uiBestDist || uiBestDist == MAX_UINT )
3353      {
3354        uiBestDist   = uiActDist;
3355        uiBestTabIdx = uiIdx;
3356#if LGE_DMM3_SIMP_C0044
3357        ruiIntraTabIdx = uiIdxW;
3358#endif
3359      }
3360    }
3361  }
3362  else
3363  {
3364    WedgeNodeList* pacWedgeNodeList = &g_aacWedgeNodeLists[(g_aucConvertToBit[uiWidth])];
3365    UInt uiBestNodeDist = MAX_UINT;
3366    UInt uiBestNodeId   = 0;
3367    for( UInt uiNodeId = 0; uiNodeId < pacWedgeNodeList->size(); uiNodeId++ )
3368    {
3369#if LGE_DMM3_SIMP_C0044
3370      calcWedgeDCs       ( &(pacWedgeList->at(pacWedgeNodeList->at(uiNodeId).getPatternIdx())), piOrigi, uiWidth,      iDC1, iDC2 );
3371#else
3372      calcWedgeDCs       ( &(pacWedgeList->at(pacWedgeNodeList->at(uiNodeId).getPatternIdx())), piRefBlkY, uiWidth,      iDC1, iDC2 );
3373#endif
3374      assignWedgeDCs2Pred( &(pacWedgeList->at(pacWedgeNodeList->at(uiNodeId).getPatternIdx())), piPred,    uiPredStride, iDC1, iDC2 );
3375
3376#if LGE_DMM3_SIMP_C0044
3377      UInt uiActDist = cWedgeDist.getDistPart( piPred, uiPredStride, piOrigi, uiStride, uiWidth, uiHeight, WedgeDist_SAD );
3378#else
3379      UInt uiActDist = cWedgeDist.getDistPart( piPred, uiPredStride, piRefBlkY, uiWidth, uiWidth, uiHeight, WedgeDist_SAD );
3380#endif
3381
3382      if( uiActDist < uiBestNodeDist || uiBestNodeDist == MAX_UINT )
3383      {
3384        uiBestNodeDist = uiActDist;
3385        uiBestNodeId   = uiNodeId;
3386#if LGE_DMM3_SIMP_C0044
3387        ruiIntraTabIdx = uiNodeId;
3388#endif
3389      }
3390    }
3391#if LGE_DMM3_SIMP_C0044
3392    uiBestTabIdx = pacWedgeNodeList->at(uiBestNodeId).getPatternIdx();
3393#else
3394    // refinement
3395    uiBestDist   = uiBestNodeDist;
3396    uiBestTabIdx = pacWedgeNodeList->at(uiBestNodeId).getPatternIdx();
3397    for( UInt uiRefId = 0; uiRefId < NUM_WEDGE_REFINES; uiRefId++ )
3398    {
3399      if( pacWedgeNodeList->at(uiBestNodeId).getRefineIdx( uiRefId ) != NO_IDX )
3400      {
3401        calcWedgeDCs       ( &(pacWedgeList->at(pacWedgeNodeList->at(uiBestNodeId).getRefineIdx( uiRefId ))), piRefBlkY, uiWidth,      iDC1, iDC2 );
3402        assignWedgeDCs2Pred( &(pacWedgeList->at(pacWedgeNodeList->at(uiBestNodeId).getRefineIdx( uiRefId ))), piPred,    uiPredStride, iDC1, iDC2 );
3403
3404        UInt uiActDist = cWedgeDist.getDistPart( piPred, uiPredStride, piRefBlkY, uiWidth, uiWidth, uiHeight, WedgeDist_SAD );
3405
3406        if( uiActDist < uiBestDist || uiBestDist == MAX_UINT )
3407        {
3408          uiBestDist   = uiActDist;
3409          uiBestTabIdx = pacWedgeNodeList->at(uiBestNodeId).getRefineIdx( uiRefId );
3410        }
3411      }
3412    }
3413#endif
3414  }
3415
3416  cPredYuv.destroy();
3417  cTempYuv.destroy();
3418  return uiBestTabIdx;
3419}
3420
3421Void TComPrediction::copyTextureLumaBlock( TComDataCU* pcCU, UInt uiAbsPartIdx, Pel* piDestBlockY, UInt uiWidth, UInt uiHeight )
3422{
3423  TComPicYuv* pcPicYuvRef = pcCU->getSlice()->getTexturePic()->getPicYuvRec();
3424  Int         iRefStride = pcPicYuvRef->getStride();
3425  Pel*        piRefY;
3426
3427  piRefY = pcPicYuvRef->getLumaAddr( pcCU->getAddr(), pcCU->getZorderIdxInCU() + uiAbsPartIdx );
3428
3429  for ( Int y = 0; y < uiHeight; y++ )
3430  {
3431    ::memcpy(piDestBlockY, piRefY, sizeof(Pel)*uiWidth);
3432//    ::memset(piDestBlockY, 128, sizeof(Pel)*uiWidth);
3433    piDestBlockY += uiWidth;
3434    piRefY += iRefStride;
3435  }
3436}
3437
3438Void TComPrediction::xPredIntraWedgeTex( TComDataCU* pcCU, UInt uiAbsPartIdx, Pel* piPred, UInt uiStride, Int iWidth, Int iHeight, Bool bAbove, Bool bLeft, Bool bEncoder, Bool bDelta, Int iDeltaDC1, Int iDeltaDC2 )
3439{
3440  assert( iWidth >= DMM_WEDGEMODEL_MIN_SIZE && iWidth <= DMM_WEDGEMODEL_MAX_SIZE );
3441  WedgeList* pacWedgeList = &g_aacWedgeLists[(g_aucConvertToBit[iWidth])];
3442
3443  // get wedge pattern
3444  UInt uiTextureWedgeTabIdx = 0;
3445  if( bEncoder ) 
3446  {
3447    // encoder: load stored wedge pattern from CU
3448    uiTextureWedgeTabIdx = pcCU->getWedgePredTexTabIdx( uiAbsPartIdx );
3449  }
3450  else
3451  {
3452    // decoder: get and store wedge pattern in CU
3453      // decoder: get and store wedge pattern in CU
3454#if LGE_DMM3_SIMP_C0044
3455    UInt uiIntraTabIdx   = pcCU->getWedgePredTexIntraTabIdx ( uiAbsPartIdx );
3456    uiTextureWedgeTabIdx = getBestWedgeFromTex( pcCU, uiAbsPartIdx, (UInt)iWidth, (UInt)iHeight, uiIntraTabIdx );
3457#else
3458    uiTextureWedgeTabIdx = getBestWedgeFromTex( pcCU, uiAbsPartIdx, (UInt)iWidth, (UInt)iHeight );
3459#endif
3460
3461    UInt uiDepth = (pcCU->getDepth(0)) + (pcCU->getPartitionSize(0) == SIZE_2Nx2N ? 0 : 1);
3462    pcCU->setWedgePredTexTabIdxSubParts( uiTextureWedgeTabIdx, uiAbsPartIdx, uiDepth );
3463  }
3464  TComWedgelet* pcWedgelet = &(pacWedgeList->at(uiTextureWedgeTabIdx));
3465
3466  // get wedge pred DCs
3467  Int iPredDC1 = 0;
3468  Int iPredDC2 = 0;
3469  Int* piMask = pcCU->getPattern()->getAdiOrgBuf( iWidth, iHeight, m_piYuvExt );
3470  Int iMaskStride = ( iWidth<<1 ) + 1;
3471  piMask += iMaskStride+1;
3472  getWedgePredDCs( pcWedgelet, piMask, iMaskStride, iPredDC1, iPredDC2, bAbove, bLeft );
3473
3474  // assign wedge pred DCs to prediction
3475  if( bDelta ) { assignWedgeDCs2Pred( pcWedgelet, piPred, uiStride, Clip ( iPredDC1+iDeltaDC1 ), Clip( iPredDC2+iDeltaDC2 ) ); }
3476  else         { assignWedgeDCs2Pred( pcWedgelet, piPred, uiStride,        iPredDC1,                   iPredDC2           ); }
3477}
3478
3479Void TComPrediction::xPredIntraContourTex( TComDataCU* pcCU, UInt uiAbsPartIdx, Pel* piPred, UInt uiStride, Int iWidth, Int iHeight, Bool bAbove, Bool bLeft, Bool bEncoder, Bool bDelta, Int iDeltaDC1, Int iDeltaDC2 )
3480{
3481  // get contour pattern
3482  TComWedgelet* pcContourWedge = new TComWedgelet( iWidth, iHeight );
3483  getBestContourFromTex( pcCU, uiAbsPartIdx, (UInt)iWidth, (UInt)iHeight, pcContourWedge );
3484
3485  // get wedge pred DCs
3486  Int iPredDC1 = 0;
3487  Int iPredDC2 = 0;
3488  Int* piMask = pcCU->getPattern()->getAdiOrgBuf( iWidth, iHeight, m_piYuvExt );
3489  Int iMaskStride = ( iWidth<<1 ) + 1;
3490  piMask += iMaskStride+1;
3491  getWedgePredDCs( pcContourWedge, piMask, iMaskStride, iPredDC1, iPredDC2, bAbove, bLeft );
3492
3493  // assign wedge pred DCs to prediction
3494  if( bDelta ) { assignWedgeDCs2Pred( pcContourWedge, piPred, uiStride, Clip ( iPredDC1+iDeltaDC1 ), Clip( iPredDC2+iDeltaDC2 ) ); }
3495  else         { assignWedgeDCs2Pred( pcContourWedge, piPred, uiStride,        iPredDC1,                   iPredDC2           ); }
3496
3497  pcContourWedge->destroy();
3498  delete pcContourWedge;
3499}
3500#endif // HHI_DMM_PRED_TEX
3501
3502#if HHI_DMM_WEDGE_INTRA
3503UInt TComPrediction::getBestContinueWedge( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, Int iDeltaEnd )
3504{
3505  UInt uiThisBlockSize = uiWidth;
3506  assert( uiThisBlockSize >= DMM_WEDGEMODEL_MIN_SIZE && uiThisBlockSize <= DMM_WEDGEMODEL_MAX_SIZE );
3507  WedgeRefList* pacContDWedgeRefList = &g_aacWedgeRefLists[(g_aucConvertToBit[uiThisBlockSize])];
3508
3509  UInt uiPredDirWedgeTabIdx = 0;
3510  TComDataCU* pcTempCU;
3511  UInt        uiTempPartIdx;
3512  // 1st: try continue above wedgelet
3513  pcTempCU = pcCU->getPUAbove( uiTempPartIdx, pcCU->getZorderIdxInCU() + uiAbsPartIdx );
3514  if( pcTempCU )
3515  {
3516    UChar uhLumaIntraDir = pcTempCU->getLumaIntraDir( uiTempPartIdx );
3517    if( DMM_WEDGE_FULL_IDX      == uhLumaIntraDir || 
3518        DMM_WEDGE_FULL_D_IDX    == uhLumaIntraDir || 
3519        DMM_WEDGE_PREDDIR_IDX   == uhLumaIntraDir || 
3520        DMM_WEDGE_PREDDIR_D_IDX == uhLumaIntraDir
3521#if HHI_DMM_PRED_TEX
3522        ||
3523        DMM_WEDGE_PREDTEX_IDX   == uhLumaIntraDir ||
3524        DMM_WEDGE_PREDTEX_D_IDX == uhLumaIntraDir   
3525#endif
3526      )
3527    {
3528      UInt uiRefWedgeSize = (UInt)g_aucIntraSizeIdxToWedgeSize[pcTempCU->getIntraSizeIdx( uiTempPartIdx )];
3529      WedgeList* pacWedgeList = &g_aacWedgeLists[(g_aucConvertToBit[uiRefWedgeSize])];
3530
3531      // get offset between current and reference block
3532      UInt uiOffsetX = 0;
3533      UInt uiOffsetY = 0;
3534      xGetBlockOffset( pcCU, uiAbsPartIdx, pcTempCU, uiTempPartIdx, uiOffsetX, uiOffsetY );
3535
3536      // get reference wedgelet
3537      UInt uiRefWedgeTabIdx = 0;
3538      switch( uhLumaIntraDir )
3539      {
3540      case( DMM_WEDGE_FULL_IDX      ): { uiRefWedgeTabIdx = pcTempCU->getWedgeFullTabIdx   ( uiTempPartIdx ); } break;
3541      case( DMM_WEDGE_FULL_D_IDX    ): { uiRefWedgeTabIdx = pcTempCU->getWedgeFullTabIdx   ( uiTempPartIdx ); } break;
3542      case( DMM_WEDGE_PREDDIR_IDX   ): { uiRefWedgeTabIdx = pcTempCU->getWedgePredDirTabIdx( uiTempPartIdx ); } break;
3543      case( DMM_WEDGE_PREDDIR_D_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgePredDirTabIdx( uiTempPartIdx ); } break;
3544#if HHI_DMM_PRED_TEX
3545      case( DMM_WEDGE_PREDTEX_IDX   ): { uiRefWedgeTabIdx = pcTempCU->getWedgePredTexTabIdx( uiTempPartIdx ); } break;
3546      case( DMM_WEDGE_PREDTEX_D_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgePredTexTabIdx( uiTempPartIdx ); } break;
3547#endif
3548      default: { assert( 0 ); return uiPredDirWedgeTabIdx; }
3549      }
3550      TComWedgelet* pcRefWedgelet;
3551      pcRefWedgelet = &(pacWedgeList->at( uiRefWedgeTabIdx ));
3552
3553      // find reference wedgelet, if direction is suitable for continue wedge
3554      if( pcRefWedgelet->checkPredDirAbovePossible( uiThisBlockSize, uiOffsetX ) )
3555      {
3556        UChar uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye;
3557        pcRefWedgelet->getPredDirStartEndAbove( uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye, uiThisBlockSize, uiOffsetX, iDeltaEnd );
3558        getWedgePatternIdx( pacContDWedgeRefList, uiPredDirWedgeTabIdx, uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye );
3559        return uiPredDirWedgeTabIdx;
3560      }
3561    }
3562  }
3563
3564  // 2nd: try continue left wedglelet
3565  pcTempCU = pcCU->getPULeft( uiTempPartIdx, pcCU->getZorderIdxInCU() + uiAbsPartIdx );
3566  if( pcTempCU )
3567  {
3568    UChar uhLumaIntraDir = pcTempCU->getLumaIntraDir( uiTempPartIdx );
3569    if( DMM_WEDGE_FULL_IDX      == uhLumaIntraDir || 
3570        DMM_WEDGE_FULL_D_IDX    == uhLumaIntraDir || 
3571        DMM_WEDGE_PREDDIR_IDX   == uhLumaIntraDir || 
3572        DMM_WEDGE_PREDDIR_D_IDX == uhLumaIntraDir
3573#if HHI_DMM_PRED_TEX
3574        ||
3575        DMM_WEDGE_PREDTEX_IDX   == uhLumaIntraDir ||
3576        DMM_WEDGE_PREDTEX_D_IDX == uhLumaIntraDir   
3577#endif
3578      )
3579    {
3580      UInt uiRefWedgeSize = (UInt)g_aucIntraSizeIdxToWedgeSize[pcTempCU->getIntraSizeIdx( uiTempPartIdx )];
3581      WedgeList* pacWedgeList = &g_aacWedgeLists[(g_aucConvertToBit[uiRefWedgeSize])];
3582
3583      // get offset between current and reference block
3584      UInt uiOffsetX = 0;
3585      UInt uiOffsetY = 0;
3586      xGetBlockOffset( pcCU, uiAbsPartIdx, pcTempCU, uiTempPartIdx, uiOffsetX, uiOffsetY );
3587
3588      // get reference wedgelet
3589      UInt uiRefWedgeTabIdx = 0;
3590      switch( uhLumaIntraDir )
3591      {
3592      case( DMM_WEDGE_FULL_IDX      ): { uiRefWedgeTabIdx = pcTempCU->getWedgeFullTabIdx   ( uiTempPartIdx ); } break;
3593      case( DMM_WEDGE_FULL_D_IDX    ): { uiRefWedgeTabIdx = pcTempCU->getWedgeFullTabIdx   ( uiTempPartIdx ); } break;
3594      case( DMM_WEDGE_PREDDIR_IDX   ): { uiRefWedgeTabIdx = pcTempCU->getWedgePredDirTabIdx( uiTempPartIdx ); } break;
3595      case( DMM_WEDGE_PREDDIR_D_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgePredDirTabIdx( uiTempPartIdx ); } break;
3596#if HHI_DMM_PRED_TEX
3597      case( DMM_WEDGE_PREDTEX_IDX   ): { uiRefWedgeTabIdx = pcTempCU->getWedgePredTexTabIdx( uiTempPartIdx ); } break;
3598      case( DMM_WEDGE_PREDTEX_D_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgePredTexTabIdx( uiTempPartIdx ); } break;
3599#endif
3600      default: { assert( 0 ); return uiPredDirWedgeTabIdx; }
3601      }
3602      TComWedgelet* pcRefWedgelet;
3603      pcRefWedgelet = &(pacWedgeList->at( uiRefWedgeTabIdx ));
3604
3605      // find reference wedgelet, if direction is suitable for continue wedge
3606      if( pcRefWedgelet->checkPredDirLeftPossible( uiThisBlockSize, uiOffsetY ) )
3607      {
3608        UChar uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye;
3609        pcRefWedgelet->getPredDirStartEndLeft( uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye, uiThisBlockSize, uiOffsetY, iDeltaEnd );
3610        getWedgePatternIdx( pacContDWedgeRefList, uiPredDirWedgeTabIdx, uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye );
3611        return uiPredDirWedgeTabIdx;
3612      }
3613    }
3614  }
3615
3616  // 3rd: (default) make wedglet from intra dir and max slope point
3617  Int iSlopeX = 0;
3618  Int iSlopeY = 0;
3619  UInt uiStartPosX = 0;
3620  UInt uiStartPosY = 0;
3621  if( xGetWedgeIntraDirPredData( pcCU, uiAbsPartIdx, uiThisBlockSize, iSlopeX, iSlopeY, uiStartPosX, uiStartPosY ) )
3622  {
3623    UChar uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye;
3624    xGetWedgeIntraDirStartEnd( pcCU, uiAbsPartIdx, uiThisBlockSize, iSlopeX, iSlopeY, uiStartPosX, uiStartPosY, uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye, iDeltaEnd );
3625    getWedgePatternIdx( pacContDWedgeRefList, uiPredDirWedgeTabIdx, uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye );
3626    return uiPredDirWedgeTabIdx;
3627  }
3628
3629  return uiPredDirWedgeTabIdx;
3630}
3631
3632Bool TComPrediction::getWedgePatternIdx( WedgeRefList* pcWedgeRefList, UInt& ruiTabIdx, UChar uhXs, UChar uhYs, UChar uhXe, UChar uhYe )
3633{
3634  ruiTabIdx = 0;
3635
3636  for( UInt uiIdx = 0; uiIdx < pcWedgeRefList->size(); uiIdx++ )
3637  {
3638    TComWedgeRef* pcTestWedgeRef = &(pcWedgeRefList->at(uiIdx));
3639
3640    if( pcTestWedgeRef->getStartX() == uhXs &&
3641      pcTestWedgeRef->getStartY() == uhYs &&
3642      pcTestWedgeRef->getEndX()   == uhXe &&
3643      pcTestWedgeRef->getEndY()   == uhYe    )
3644    {
3645      ruiTabIdx = pcTestWedgeRef->getRefIdx();
3646      return true;
3647    }
3648  }
3649
3650  return false;
3651}
3652
3653Void TComPrediction::xPredIntraWedgeFull( TComDataCU* pcCU, UInt uiAbsPartIdx, Pel* piPred, UInt uiStride, Int iWidth, Int iHeight, Bool bAbove, Bool bLeft, Bool bEncoder, Bool bDelta, UInt uiTabIdx, Int iDeltaDC1, Int iDeltaDC2 )
3654{
3655  assert( iWidth >= DMM_WEDGEMODEL_MIN_SIZE && iWidth <= DMM_WEDGEMODEL_MAX_SIZE );
3656  WedgeList* pacWedgeList = &g_aacWedgeLists[(g_aucConvertToBit[iWidth])];
3657  TComWedgelet* pcWedgelet = &(pacWedgeList->at(uiTabIdx));
3658
3659  // get wedge pred DCs
3660  Int iPredDC1 = 0;
3661  Int iPredDC2 = 0;
3662
3663  Int* piMask = pcCU->getPattern()->getAdiOrgBuf( iWidth, iHeight, m_piYuvExt );
3664  Int iMaskStride = ( iWidth<<1 ) + 1;
3665  piMask += iMaskStride+1;
3666  getWedgePredDCs( pcWedgelet, piMask, iMaskStride, iPredDC1, iPredDC2, bAbove, bLeft );
3667
3668  // assign wedge pred DCs to prediction
3669  if( bDelta ) { assignWedgeDCs2Pred( pcWedgelet, piPred, uiStride, Clip( iPredDC1+iDeltaDC1 ), Clip( iPredDC2+iDeltaDC2 ) ); }
3670  else         { assignWedgeDCs2Pred( pcWedgelet, piPred, uiStride, iPredDC1,           iPredDC2           ); }
3671}
3672
3673Void TComPrediction::xPredIntraWedgeDir( TComDataCU* pcCU, UInt uiAbsPartIdx, Pel* piPred, UInt uiStride, Int iWidth, Int iHeight, Bool bAbove, Bool bLeft, Bool bEncoder, Bool bDelta, Int iWedgeDeltaEnd, Int iDeltaDC1, Int iDeltaDC2 )
3674{
3675  assert( iWidth >= DMM_WEDGEMODEL_MIN_SIZE && iWidth <= DMM_WEDGEMODEL_MAX_SIZE );
3676  WedgeList* pacWedgeList = &g_aacWedgeLists[(g_aucConvertToBit[iWidth])];
3677
3678  // get wedge pattern
3679  UInt uiDirWedgeTabIdx = 0;
3680  if( bEncoder )
3681  {
3682    // encoder: load stored wedge pattern from CU
3683    uiDirWedgeTabIdx = pcCU->getWedgePredDirTabIdx( uiAbsPartIdx );
3684  }
3685  else
3686  {
3687    uiDirWedgeTabIdx = getBestContinueWedge( pcCU, uiAbsPartIdx, iWidth, iHeight, iWedgeDeltaEnd );
3688
3689    UInt uiDepth = (pcCU->getDepth(0)) + (pcCU->getPartitionSize(0) == SIZE_2Nx2N ? 0 : 1);
3690    pcCU->setWedgePredDirTabIdxSubParts( uiDirWedgeTabIdx, uiAbsPartIdx, uiDepth );
3691  }
3692  TComWedgelet* pcWedgelet = &(pacWedgeList->at(uiDirWedgeTabIdx));
3693
3694  // get wedge pred DCs
3695  Int iPredDC1 = 0;
3696  Int iPredDC2 = 0;
3697
3698  Int* piMask = pcCU->getPattern()->getAdiOrgBuf( iWidth, iHeight, m_piYuvExt );
3699  Int iMaskStride = ( iWidth<<1 ) + 1;
3700  piMask += iMaskStride+1;
3701  getWedgePredDCs( pcWedgelet, piMask, iMaskStride, iPredDC1, iPredDC2, bAbove, bLeft );
3702
3703  // assign wedge pred DCs to prediction
3704  if( bDelta ) { assignWedgeDCs2Pred( pcWedgelet, piPred, uiStride, Clip( iPredDC1+iDeltaDC1 ), Clip( iPredDC2+iDeltaDC2 ) ); }
3705  else         { assignWedgeDCs2Pred( pcWedgelet, piPred, uiStride,       iPredDC1,                   iPredDC2             ); }
3706}
3707
3708Void TComPrediction::xGetBlockOffset( TComDataCU* pcCU, UInt uiAbsPartIdx, TComDataCU* pcRefCU, UInt uiRefAbsPartIdx, UInt& ruiOffsetX, UInt& ruiOffsetY )
3709{
3710  ruiOffsetX = 0;
3711  ruiOffsetY = 0;
3712
3713  // get offset between current and above/left block
3714  UInt uiThisOriginX = pcCU->getCUPelX() + g_auiRasterToPelX[ g_auiZscanToRaster[uiAbsPartIdx] ];
3715  UInt uiThisOriginY = pcCU->getCUPelY() + g_auiRasterToPelY[ g_auiZscanToRaster[uiAbsPartIdx] ];
3716
3717  UInt uiNumPartInRefCU = pcRefCU->getTotalNumPart();
3718  UInt uiMaxDepthRefCU = 0;
3719  while( uiNumPartInRefCU > 1 )
3720  {
3721    uiNumPartInRefCU >>= 2;
3722    uiMaxDepthRefCU++;
3723  }
3724
3725  UInt uiDepthRefPU = (pcRefCU->getDepth(uiRefAbsPartIdx)) + (pcRefCU->getPartitionSize(uiRefAbsPartIdx) == SIZE_2Nx2N ? 0 : 1);
3726  UInt uiShifts = (uiMaxDepthRefCU - uiDepthRefPU)*2;
3727  UInt uiRefBlockOriginPartIdx = (uiRefAbsPartIdx>>uiShifts)<<uiShifts;
3728
3729  UInt uiRefOriginX = pcRefCU->getCUPelX() + g_auiRasterToPelX[ g_auiZscanToRaster[uiRefBlockOriginPartIdx] ];
3730  UInt uiRefOriginY = pcRefCU->getCUPelY() + g_auiRasterToPelY[ g_auiZscanToRaster[uiRefBlockOriginPartIdx] ];
3731
3732  if( (uiThisOriginX - uiRefOriginX) > 0 ) { ruiOffsetX = (UInt)(uiThisOriginX - uiRefOriginX); }
3733  if( (uiThisOriginY - uiRefOriginY) > 0 ) { ruiOffsetY = (UInt)(uiThisOriginY - uiRefOriginY); }
3734}
3735
3736Bool TComPrediction::xGetWedgeIntraDirPredData( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiBlockSize, Int& riSlopeX, Int& riSlopeY, UInt& ruiStartPosX, UInt& ruiStartPosY )
3737{
3738  riSlopeX     = 0;
3739  riSlopeY     = 0;
3740  ruiStartPosX = 0;
3741  ruiStartPosY = 0;
3742
3743  // 1st step: get wedge start point (max. slope)
3744  Int* piSource = pcCU->getPattern()->getAdiOrgBuf( uiBlockSize, uiBlockSize, m_piYuvExt );
3745  Int iSourceStride = ( uiBlockSize<<1 ) + 1;
3746
3747  UInt uiSlopeMaxAbove = 0;
3748  UInt uiPosSlopeMaxAbove = 0;
3749  for( UInt uiPosHor = 0; uiPosHor < (uiBlockSize-1); uiPosHor++ )
3750  {
3751    if( abs( piSource[uiPosHor+1] - piSource[uiPosHor] ) > uiSlopeMaxAbove )
3752    {
3753      uiSlopeMaxAbove = abs( piSource[uiPosHor+1] - piSource[uiPosHor] );
3754      uiPosSlopeMaxAbove = uiPosHor;
3755    }
3756  }
3757
3758  UInt uiSlopeMaxLeft = 0;
3759  UInt uiPosSlopeMaxLeft = 0;
3760  for( UInt uiPosVer = 0; uiPosVer < (uiBlockSize-1); uiPosVer++ )
3761  {
3762    if( abs( piSource[(uiPosVer+1)*iSourceStride] - piSource[uiPosVer*iSourceStride] ) > uiSlopeMaxLeft )
3763    {
3764      uiSlopeMaxLeft = abs( piSource[(uiPosVer+1)*iSourceStride] - piSource[uiPosVer*iSourceStride] );
3765      uiPosSlopeMaxLeft = uiPosVer;
3766    }
3767  }
3768
3769  if( uiSlopeMaxAbove == 0 && uiSlopeMaxLeft == 0 ) 
3770  { 
3771    return false; 
3772  }
3773
3774  if( uiSlopeMaxAbove > uiSlopeMaxLeft )
3775  {
3776    ruiStartPosX = uiPosSlopeMaxAbove;
3777    ruiStartPosY = 0;
3778  }
3779  else
3780  {
3781    ruiStartPosX = 0;
3782    ruiStartPosY = uiPosSlopeMaxLeft;
3783  }
3784
3785  // 2nd step: derive wedge direction
3786  Int uiPreds[3] = {-1, -1, -1};
3787  Int iMode = -1;
3788  Int iPredNum = pcCU->getIntraDirLumaPredictor( uiAbsPartIdx, uiPreds, &iMode ); 
3789
3790  UInt uiDirMode = 0;
3791  if( iMode >= 0 ) { iPredNum = iMode; }
3792  if( iPredNum == 1 ) { uiDirMode = uiPreds[0]; }
3793  if( iPredNum == 2 ) { uiDirMode = uiPreds[1]; }
3794
3795  if( uiDirMode < 2 ) { return false; } // no planar & DC
3796
3797  Bool modeHor       = (uiDirMode < 18);
3798  Bool modeVer       = !modeHor;
3799  Int intraPredAngle = modeVer ? (Int)uiDirMode - VER_IDX : modeHor ? -((Int)uiDirMode - HOR_IDX) : 0;
3800  Int absAng         = abs(intraPredAngle);
3801  Int signAng        = intraPredAngle < 0 ? -1 : 1;
3802  Int angTable[9]    = {0,2,5,9,13,17,21,26,32};
3803  absAng             = angTable[absAng];
3804  intraPredAngle     = signAng * absAng;
3805
3806  // 3rd step: set slope for direction
3807  if( modeHor )
3808  {
3809    if( intraPredAngle > 0 )
3810    {
3811      riSlopeX = -32;
3812      riSlopeY = intraPredAngle;
3813    }
3814    else
3815    {
3816      riSlopeX = 32;
3817      riSlopeY = -intraPredAngle;
3818    }
3819  }
3820  else if( modeVer )
3821  {
3822    if( intraPredAngle > 0 )
3823    {
3824      riSlopeX = intraPredAngle;
3825      riSlopeY = -32;
3826    }
3827    else
3828    {
3829      riSlopeX = -intraPredAngle;
3830      riSlopeY = 32;
3831    }
3832  }
3833
3834  return true;
3835}
3836
3837Void TComPrediction::xGetWedgeIntraDirStartEnd( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiBlockSize, Int iDeltaX, Int iDeltaY, UInt uiPMSPosX, UInt uiPMSPosY, UChar& ruhXs, UChar& ruhYs, UChar& ruhXe, UChar& ruhYe, Int iDeltaEnd )
3838{
3839  ruhXs = 0;
3840  ruhYs = 0;
3841  ruhXe = 0;
3842  ruhYe = 0;
3843
3844  // scaling of start pos and block size to wedge resolution
3845  UInt uiScaledStartPosX = 0;
3846  UInt uiScaledStartPosY = 0;
3847  UInt uiScaledBlockSize = 0;
3848  WedgeResolution eWedgeRes = g_aeWedgeResolutionList[(UInt)g_aucConvertToBit[uiBlockSize]];
3849  switch( eWedgeRes )
3850  {
3851  case( DOUBLE_PEL ): { uiScaledStartPosX = (uiPMSPosX>>1); uiScaledStartPosY = (uiPMSPosY>>1); uiScaledBlockSize = (uiBlockSize>>1); break; }
3852  case(   FULL_PEL ): { uiScaledStartPosX =  uiPMSPosX;     uiScaledStartPosY =  uiPMSPosY;     uiScaledBlockSize =  uiBlockSize;     break; }
3853  case(   HALF_PEL ): { uiScaledStartPosX = (uiPMSPosX<<1); uiScaledStartPosY = (uiPMSPosY<<1); uiScaledBlockSize = (uiBlockSize<<1); break; }
3854  }
3855  Int iMaxPos = (Int)uiScaledBlockSize - 1;
3856
3857  // case above
3858  if( uiScaledStartPosX > 0 && uiScaledStartPosY == 0 )
3859  {
3860    ruhXs = (UChar)uiScaledStartPosX;
3861    ruhYs = 0;
3862
3863    if( iDeltaY == 0 )
3864    {
3865      if( iDeltaX < 0 )
3866      {
3867        ruhXe = 0;
3868        ruhYe = (UChar)std::min( std::max( iDeltaEnd, 0 ), iMaxPos );
3869        return;
3870      }
3871      else
3872      {
3873        ruhXe = (UChar)iMaxPos;
3874        ruhYe = (UChar)std::min( std::max( -iDeltaEnd, 0 ), iMaxPos );
3875        std::swap( ruhXs, ruhXe );
3876        std::swap( ruhYs, ruhYe );
3877        return;
3878      }
3879    }
3880
3881    // regular case
3882    Int iVirtualEndX = (Int)ruhXs + roftoi( (Double)iMaxPos * ((Double)iDeltaX / (Double)iDeltaY) );
3883
3884    if( iVirtualEndX < 0 )
3885    {
3886      Int iYe = roftoi( (Double)(0 - (Int)ruhXs) * ((Double)iDeltaY / (Double)iDeltaX) ) + iDeltaEnd;
3887      if( iYe < (Int)uiScaledBlockSize )
3888      {
3889        ruhXe = 0;
3890        ruhYe = (UChar)std::max( iYe, 0 );
3891        return;
3892      }
3893      else
3894      {
3895        ruhXe = (UChar)std::min( (iYe - iMaxPos), iMaxPos );
3896        ruhYe = (UChar)iMaxPos;
3897        return;
3898      }
3899    }
3900    else if( iVirtualEndX > iMaxPos )
3901    {
3902      Int iYe = roftoi( (Double)(iMaxPos - (Int)ruhXs) * ((Double)iDeltaY / (Double)iDeltaX) ) - iDeltaEnd;
3903      if( iYe < (Int)uiScaledBlockSize )
3904      {
3905        ruhXe = (UChar)iMaxPos;
3906        ruhYe = (UChar)std::max( iYe, 0 );
3907        std::swap( ruhXs, ruhXe );
3908        std::swap( ruhYs, ruhYe );
3909        return;
3910      }
3911      else
3912      {
3913        ruhXe = (UChar)std::max( (iMaxPos - (iYe - iMaxPos)), 0 );
3914        ruhYe = (UChar)iMaxPos;
3915        return;
3916      }
3917    }
3918    else
3919    {
3920      Int iXe = iVirtualEndX + iDeltaEnd;
3921      if( iXe < 0 )
3922      {
3923        ruhXe = 0;
3924        ruhYe = (UChar)std::max( (iMaxPos + iXe), 0 );
3925        return;
3926      }
3927      else if( iXe > iMaxPos )
3928      {
3929        ruhXe = (UChar)iMaxPos;
3930        ruhYe = (UChar)std::max( (iMaxPos - (iXe - iMaxPos)), 0 );
3931        std::swap( ruhXs, ruhXe );
3932        std::swap( ruhYs, ruhYe );
3933        return;
3934      }
3935      else
3936      {
3937        ruhXe = (UChar)iXe;
3938        ruhYe = (UChar)iMaxPos;
3939        return;
3940      }
3941    }
3942  }
3943
3944  // case left
3945  if( uiScaledStartPosY > 0 && uiScaledStartPosX == 0 )
3946  {
3947    ruhXs = 0;
3948    ruhYs = (UChar)uiScaledStartPosY;
3949
3950    if( iDeltaX == 0 )
3951    {
3952      if( iDeltaY < 0 )
3953      {
3954        ruhXe = (UChar)std::min( std::max( -iDeltaEnd, 0 ), iMaxPos );
3955        ruhYe = 0;
3956        std::swap( ruhXs, ruhXe );
3957        std::swap( ruhYs, ruhYe );
3958        return;
3959      }
3960      else
3961      {
3962        ruhXe = (UChar)std::min( std::max( iDeltaEnd, 0 ), iMaxPos );
3963        ruhYe = (UChar)iMaxPos;
3964        return; 
3965      }
3966    }
3967
3968    // regular case
3969    Int iVirtualEndY = (Int)ruhYs + roftoi( (Double)iMaxPos * ((Double)iDeltaY / (Double)iDeltaX) );
3970
3971    if( iVirtualEndY < 0 )
3972    {
3973      Int iXe = roftoi( (Double)(0 - (Int)ruhYs ) * ((Double)iDeltaX / (Double)iDeltaY) ) - iDeltaEnd;
3974      if( iXe < (Int)uiScaledBlockSize )
3975      {
3976        ruhXe = (UChar)std::max( iXe, 0 );
3977        ruhYe = 0;
3978        std::swap( ruhXs, ruhXe );
3979        std::swap( ruhYs, ruhYe );
3980        return;
3981      }
3982      else
3983      {
3984        ruhXe = (UChar)iMaxPos;
3985        ruhYe = (UChar)std::min( (iXe - iMaxPos), iMaxPos );
3986        std::swap( ruhXs, ruhXe );
3987        std::swap( ruhYs, ruhYe );
3988        return;
3989      }
3990    }
3991    else if( iVirtualEndY > (uiScaledBlockSize-1) )
3992    {
3993      Int iXe = roftoi( (Double)((Int)(uiScaledBlockSize-1) - (Int)ruhYs ) * ((Double)iDeltaX / (Double)iDeltaY) ) + iDeltaEnd;
3994      if( iXe < (Int)uiScaledBlockSize )
3995      {
3996        ruhXe = (UChar)std::max( iXe, 0 );
3997        ruhYe = (UChar)(uiScaledBlockSize-1);
3998        return;
3999      }
4000      else
4001      {
4002        ruhXe = (UChar)iMaxPos;
4003        ruhYe = (UChar)std::max( (iMaxPos - (iXe - iMaxPos)), 0 );
4004        std::swap( ruhXs, ruhXe );
4005        std::swap( ruhYs, ruhYe );
4006        return;
4007      }
4008    }
4009    else
4010    {
4011      Int iYe = iVirtualEndY - iDeltaEnd;
4012      if( iYe < 0 )
4013      {
4014        ruhXe = (UChar)std::max( (iMaxPos + iYe), 0 );
4015        ruhYe = 0;
4016        std::swap( ruhXs, ruhXe );
4017        std::swap( ruhYs, ruhYe );
4018        return;
4019      }
4020      else if( iYe > iMaxPos )
4021      {
4022        ruhXe = (UChar)std::max( (iMaxPos - (iYe - iMaxPos)), 0 );
4023        ruhYe = (UChar)iMaxPos;
4024        return;
4025      }
4026      else
4027      {
4028        ruhXe = (UChar)iMaxPos;
4029        ruhYe = (UChar)iYe;
4030        std::swap( ruhXs, ruhXe );
4031        std::swap( ruhYs, ruhYe );
4032        return;
4033      }
4034    }
4035  }
4036
4037  // case origin
4038  if( uiScaledStartPosX == 0 && uiScaledStartPosY == 0 )
4039  {
4040    if( iDeltaX*iDeltaY < 0 )
4041    {
4042      return;
4043    }
4044
4045    ruhXs = 0;
4046    ruhYs = 0;
4047
4048    if( iDeltaY == 0 )
4049    {
4050      ruhXe = (UChar)iMaxPos;
4051      ruhYe = 0;
4052      std::swap( ruhXs, ruhXe );
4053      std::swap( ruhYs, ruhYe );
4054      return;
4055    }
4056
4057    if( iDeltaX == 0 )
4058    {
4059      ruhXe = 0;
4060      ruhYe = (UChar)iMaxPos;
4061      return;
4062    }
4063
4064    Int iVirtualEndX = (Int)ruhXs + roftoi( (Double)iMaxPos * ((Double)iDeltaX / (Double)iDeltaY) );
4065
4066    if( iVirtualEndX > iMaxPos )
4067    {
4068      Int iYe = roftoi( (Double)((Int)iMaxPos - (Int)ruhXs) * ((Double)iDeltaY / (Double)iDeltaX) ) - iDeltaEnd;
4069      if( iYe < (Int)uiScaledBlockSize )
4070      {
4071        ruhXe = (UChar)(uiScaledBlockSize-1);
4072        ruhYe = (UChar)std::max( iYe, 0 );
4073        std::swap( ruhXs, ruhXe );
4074        std::swap( ruhYs, ruhYe );
4075        return;
4076      }
4077      else
4078      {
4079        ruhXe = (UChar)std::max( (iMaxPos - (iYe - iMaxPos)), 0 );
4080        ruhYe = (UChar)(uiScaledBlockSize-1);
4081        return;
4082      }
4083    }
4084    else
4085    {
4086      Int iXe = iVirtualEndX + iDeltaEnd;
4087      if( iXe < 0 )
4088      {
4089        ruhXe = 0;
4090        ruhYe = (UChar)std::max( (iMaxPos + iXe), 0 );
4091        return;
4092      }
4093      else if( iXe > iMaxPos )
4094      {
4095        ruhXe = (UChar)(uiScaledBlockSize-1);
4096        ruhYe = (UChar)std::max( (iMaxPos - (iXe - iMaxPos)), 0 );
4097        std::swap( ruhXs, ruhXe );
4098        std::swap( ruhYs, ruhYe );
4099        return;
4100      }
4101      else
4102      {
4103        ruhXe = (UChar)iXe;
4104        ruhYe = (UChar)(uiScaledBlockSize-1);
4105        return;
4106      }
4107    }
4108  }
4109}
4110#endif
4111
4112Void
4113TComPrediction::predIntraDepthAng(TComPattern* pcTComPattern, UInt uiDirMode, Pel* piPred, UInt uiStride, Int iWidth, Int iHeight )
4114{
4115  Pel*  pDst    = piPred;
4116  Int*  ptrSrc  = pcTComPattern->getAdiOrgBuf( iWidth, iHeight, m_piYuvExt );
4117  Int   sw      = ( iWidth<<1 ) + 1;
4118  xPredIntraAngDepth( ptrSrc+sw+1, sw, pDst, uiStride, iWidth, iHeight, uiDirMode );
4119}
4120
4121Int
4122TComPrediction::xGetDCDepth( Int* pSrc, Int iDelta, Int iBlkSize )
4123{
4124  Int iDC    = PDM_UNDEFINED_DEPTH;
4125  Int iSum   = 0;
4126  Int iNum   = 0;
4127  for( Int k = 0; k < iBlkSize; k++, pSrc += iDelta )
4128  {
4129    if( *pSrc != PDM_UNDEFINED_DEPTH )
4130    {
4131      iSum += *pSrc;
4132      iNum ++;
4133    }
4134  }
4135  if( iNum )
4136  {
4137    iDC = ( iSum + ( iNum >> 1 ) ) / iNum;
4138  }
4139  return iDC;
4140}
4141
4142Int
4143TComPrediction::xGetDCValDepth( Int iVal1, Int iVal2, Int iVal3, Int iVal4 )
4144{
4145  if     ( iVal1 != PDM_UNDEFINED_DEPTH )   return iVal1;
4146  else if( iVal2 != PDM_UNDEFINED_DEPTH )   return iVal2;
4147  else if( iVal3 != PDM_UNDEFINED_DEPTH )   return iVal3;
4148  return   iVal4;
4149}
4150
4151Void
4152TComPrediction::xPredIntraAngDepth( Int* pSrc, Int srcStride, Pel* pDst, Int dstStride, UInt width, UInt height, UInt dirMode )
4153{
4154  AOF( width == height );
4155  Int blkSize       = width;
4156  Int iDCAbove      = xGetDCDepth( pSrc - srcStride,                               1, blkSize );
4157  Int iDCAboveRight = xGetDCDepth( pSrc - srcStride + blkSize,                     1, blkSize );
4158  Int iDCLeft       = xGetDCDepth( pSrc -         1,                       srcStride, blkSize );
4159  Int iDCBelowLeft  = xGetDCDepth( pSrc -         1 + blkSize * srcStride, srcStride, blkSize );
4160  Int iWgt, iDC1, iDC2;
4161  if( dirMode < 2 ) // 1..2
4162  {
4163    iDC1  = xGetDCValDepth( iDCAbove, iDCAboveRight, iDCLeft,  iDCBelowLeft  );
4164    iDC2  = xGetDCValDepth( iDCLeft,  iDCBelowLeft,  iDCAbove, iDCAboveRight );
4165    iWgt  = 8;
4166  }
4167  else if( dirMode < 11 ) // 3..10
4168  {
4169    iDC1  = xGetDCValDepth( iDCLeft,  iDCBelowLeft,  iDCAbove, iDCAboveRight );
4170    iDC2  = xGetDCValDepth( iDCBelowLeft,  iDCLeft,  iDCAbove, iDCAboveRight );
4171    iWgt  = 6 + dirMode; 
4172  }
4173  else if( dirMode < 27 ) // 11..26
4174  {
4175    iDC1  = xGetDCValDepth( iDCAbove, iDCAboveRight, iDCLeft,  iDCBelowLeft  );
4176    iDC2  = xGetDCValDepth( iDCLeft,  iDCBelowLeft,  iDCAbove, iDCAboveRight );
4177    iWgt  = dirMode - 10;
4178  }
4179  else if( dirMode < 35 ) // 27..34
4180  {
4181    iDC1  = xGetDCValDepth( iDCAbove, iDCAboveRight, iDCLeft,  iDCBelowLeft  );
4182    iDC2  = xGetDCValDepth( iDCAboveRight, iDCAbove, iDCLeft,  iDCBelowLeft  );
4183    iWgt  = 42 - dirMode;
4184  }
4185  else // (wedgelet -> use simple DC prediction
4186  {
4187    iDC1  = xGetDCValDepth( iDCAbove, iDCAboveRight, iDCLeft,  iDCBelowLeft  );
4188    iDC2  = xGetDCValDepth( iDCLeft,  iDCBelowLeft,  iDCAbove, iDCAboveRight );
4189    iWgt  = 8;
4190  }
4191  Int iWgt2   = 16 - iWgt;
4192  Int iDCVal  = ( iWgt * iDC1 + iWgt2 * iDC2 + 8 ) >> 4;
4193
4194  // set depth
4195  for( Int iY = 0; iY < blkSize; iY++, pDst += dstStride )
4196  {
4197    for( Int iX = 0; iX < blkSize; iX++ )
4198    {
4199      pDst[ iX ] = iDCVal;
4200    }
4201  }
4202}
4203
4204//! \}
Note: See TracBrowser for help on using the repository browser.