source: 3DVCSoftware/trunk/source/Lib/TLibCommon/TComRom.cpp @ 1313

Last change on this file since 1313 was 1313, checked in by tech, 9 years ago

Merged 14.1-update-dev1@1312.

  • Property svn:eol-style set to native
File size: 39.7 KB
Line 
1/* The copyright in this software is being made available under the BSD
2 * License, included below. This software may be subject to other third party
3 * and contributor rights, including patent rights, and no such rights are
4 * granted under this license.
5 *
6 * Copyright (c) 2010-2015, 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/** \file     TComRom.cpp
34    \brief    global variables & functions
35*/
36#include "TComRom.h"
37#include <memory.h>
38#include <stdlib.h>
39#include <stdio.h>
40#include <iomanip>
41#include <assert.h>
42#include "TComDataCU.h"
43#include "Debug.h"
44// ====================================================================================================================
45// Initialize / destroy functions
46// ====================================================================================================================
47//! \ingroup TLibCommon
48//! \{
49const Char* nalUnitTypeToString(NalUnitType type)
50{
51  switch (type)
52  {
53  case NAL_UNIT_CODED_SLICE_TRAIL_R:    return "TRAIL_R";
54  case NAL_UNIT_CODED_SLICE_TRAIL_N:    return "TRAIL_N";
55  case NAL_UNIT_CODED_SLICE_TSA_R:      return "TSA_R";
56  case NAL_UNIT_CODED_SLICE_TSA_N:      return "TSA_N";
57  case NAL_UNIT_CODED_SLICE_STSA_R:     return "STSA_R";
58  case NAL_UNIT_CODED_SLICE_STSA_N:     return "STSA_N";
59  case NAL_UNIT_CODED_SLICE_BLA_W_LP:   return "BLA_W_LP";
60  case NAL_UNIT_CODED_SLICE_BLA_W_RADL: return "BLA_W_RADL";
61  case NAL_UNIT_CODED_SLICE_BLA_N_LP:   return "BLA_N_LP";
62  case NAL_UNIT_CODED_SLICE_IDR_W_RADL: return "IDR_W_RADL";
63  case NAL_UNIT_CODED_SLICE_IDR_N_LP:   return "IDR_N_LP";
64  case NAL_UNIT_CODED_SLICE_CRA:        return "CRA";
65  case NAL_UNIT_CODED_SLICE_RADL_R:     return "RADL_R";
66  case NAL_UNIT_CODED_SLICE_RADL_N:     return "RADL_N";
67  case NAL_UNIT_CODED_SLICE_RASL_R:     return "RASL_R";
68  case NAL_UNIT_CODED_SLICE_RASL_N:     return "RASL_N";
69  case NAL_UNIT_VPS:                    return "VPS";
70  case NAL_UNIT_SPS:                    return "SPS";
71  case NAL_UNIT_PPS:                    return "PPS";
72  case NAL_UNIT_ACCESS_UNIT_DELIMITER:  return "AUD";
73  case NAL_UNIT_EOS:                    return "EOS";
74  case NAL_UNIT_EOB:                    return "EOB";
75  case NAL_UNIT_FILLER_DATA:            return "FILLER";
76  case NAL_UNIT_PREFIX_SEI:             return "Prefix SEI";
77  case NAL_UNIT_SUFFIX_SEI:             return "Suffix SEI";
78  default:                              return "UNK";
79  }
80}
81class ScanGenerator
82{
83private:
84  UInt m_line, m_column;
85  const UInt m_blockWidth, m_blockHeight;
86  const UInt m_stride;
87  const COEFF_SCAN_TYPE m_scanType;
88public:
89  ScanGenerator(UInt blockWidth, UInt blockHeight, UInt stride, COEFF_SCAN_TYPE scanType)
90    : m_line(0), m_column(0), m_blockWidth(blockWidth), m_blockHeight(blockHeight), m_stride(stride), m_scanType(scanType)
91  { }
92  UInt GetCurrentX() const { return m_column; }
93  UInt GetCurrentY() const { return m_line; }
94  UInt GetNextIndex(UInt blockOffsetX, UInt blockOffsetY)
95  {
96    Int rtn=((m_line + blockOffsetY) * m_stride) + m_column + blockOffsetX;
97    //advance line and column to the next position
98    switch (m_scanType)
99    {
100      //------------------------------------------------
101      case SCAN_DIAG:
102        {
103          if ((m_column == (m_blockWidth - 1)) || (m_line == 0)) //if we reach the end of a rank, go diagonally down to the next one
104          {
105            m_line   += m_column + 1;
106            m_column  = 0;
107            if (m_line >= m_blockHeight) //if that takes us outside the block, adjust so that we are back on the bottom row
108            {
109              m_column += m_line - (m_blockHeight - 1);
110              m_line    = m_blockHeight - 1;
111            }
112          }
113          else
114          {
115            m_column++;
116            m_line--;
117          }
118        }
119        break;
120      //------------------------------------------------
121      case SCAN_HOR:
122        {
123          if (m_column == (m_blockWidth - 1))
124          {
125            m_line++;
126            m_column = 0;
127          }
128          else
129          {
130            m_column++;
131          }
132        }
133        break;
134      //------------------------------------------------
135      case SCAN_VER:
136        {
137          if (m_line == (m_blockHeight - 1))
138          {
139            m_column++;
140            m_line = 0;
141          }
142          else
143          {
144            m_line++;
145          }
146        }
147        break;
148      //------------------------------------------------
149      default:
150        {
151          std::cerr << "ERROR: Unknown scan type \"" << m_scanType << "\"in ScanGenerator::GetNextIndex" << std::endl;
152          exit(1);
153        }
154        break;
155    }
156    return rtn;
157  }
158};
159// initialize ROM variables
160Void initROM()
161{
162  Int i, c;
163  // g_aucConvertToBit[ x ]: log2(x/4), if x=4 -> 0, x=8 -> 1, x=16 -> 2, ...
164  ::memset( g_aucConvertToBit,   -1, sizeof( g_aucConvertToBit ) );
165  c=0;
166  for ( i=4; i<=MAX_CU_SIZE; i*=2 )
167  {
168    g_aucConvertToBit[ i ] = c;
169    c++;
170  }
171  // initialise scan orders
172  for(UInt log2BlockHeight = 0; log2BlockHeight < MAX_CU_DEPTH; log2BlockHeight++)
173  {
174    for(UInt log2BlockWidth = 0; log2BlockWidth < MAX_CU_DEPTH; log2BlockWidth++)
175    {
176      const UInt blockWidth  = 1 << log2BlockWidth;
177      const UInt blockHeight = 1 << log2BlockHeight;
178      const UInt totalValues = blockWidth * blockHeight;
179      //--------------------------------------------------------------------------------------------------
180      //non-grouped scan orders
181      for (UInt scanTypeIndex = 0; scanTypeIndex < SCAN_NUMBER_OF_TYPES; scanTypeIndex++)
182      {
183        const COEFF_SCAN_TYPE scanType = COEFF_SCAN_TYPE(scanTypeIndex);
184        g_scanOrder[SCAN_UNGROUPED][scanType][log2BlockWidth][log2BlockHeight] = new UInt[totalValues];
185        ScanGenerator fullBlockScan(blockWidth, blockHeight, blockWidth, scanType);
186        for (UInt scanPosition = 0; scanPosition < totalValues; scanPosition++)
187        {
188          g_scanOrder[SCAN_UNGROUPED][scanType][log2BlockWidth][log2BlockHeight][scanPosition] = fullBlockScan.GetNextIndex(0, 0);
189        }
190      }
191      //--------------------------------------------------------------------------------------------------
192      //grouped scan orders
193      const UInt  groupWidth           = 1           << MLS_CG_LOG2_WIDTH;
194      const UInt  groupHeight          = 1           << MLS_CG_LOG2_HEIGHT;
195      const UInt  widthInGroups        = blockWidth  >> MLS_CG_LOG2_WIDTH;
196      const UInt  heightInGroups       = blockHeight >> MLS_CG_LOG2_HEIGHT;
197      const UInt  groupSize            = groupWidth    * groupHeight;
198      const UInt  totalGroups          = widthInGroups * heightInGroups;
199      for (UInt scanTypeIndex = 0; scanTypeIndex < SCAN_NUMBER_OF_TYPES; scanTypeIndex++)
200      {
201        const COEFF_SCAN_TYPE scanType = COEFF_SCAN_TYPE(scanTypeIndex);
202        g_scanOrder[SCAN_GROUPED_4x4][scanType][log2BlockWidth][log2BlockHeight] = new UInt[totalValues];
203        ScanGenerator fullBlockScan(widthInGroups, heightInGroups, groupWidth, scanType);
204        for (UInt groupIndex = 0; groupIndex < totalGroups; groupIndex++)
205        {
206          const UInt groupPositionY  = fullBlockScan.GetCurrentY();
207          const UInt groupPositionX  = fullBlockScan.GetCurrentX();
208          const UInt groupOffsetX    = groupPositionX * groupWidth;
209          const UInt groupOffsetY    = groupPositionY * groupHeight;
210          const UInt groupOffsetScan = groupIndex     * groupSize;
211          ScanGenerator groupScan(groupWidth, groupHeight, blockWidth, scanType);
212          for (UInt scanPosition = 0; scanPosition < groupSize; scanPosition++)
213          {
214            g_scanOrder[SCAN_GROUPED_4x4][scanType][log2BlockWidth][log2BlockHeight][groupOffsetScan + scanPosition] = groupScan.GetNextIndex(groupOffsetX, groupOffsetY);
215          }
216          fullBlockScan.GetNextIndex(0,0);
217        }
218      }
219      //--------------------------------------------------------------------------------------------------
220    }
221  }
222#if NH_MV
223#if H_MV_HLS_PTL_LIMITS
224 g_generalTierAndLevelLimits[ Level::LEVEL1   ] = TComGeneralTierAndLevelLimits(    36864,     350,  INT_MIN,   16,   1,   1 );
225 g_generalTierAndLevelLimits[ Level::LEVEL2   ] = TComGeneralTierAndLevelLimits(   122880,    1500,  INT_MIN,   16,   1,   1 );
226 g_generalTierAndLevelLimits[ Level::LEVEL2_1 ] = TComGeneralTierAndLevelLimits(   245760,    3000,  INT_MIN,   20,   1,   1 );
227 g_generalTierAndLevelLimits[ Level::LEVEL3   ] = TComGeneralTierAndLevelLimits(   552960,    6000,  INT_MIN,   30,   2,   2 );
228 g_generalTierAndLevelLimits[ Level::LEVEL3_1 ] = TComGeneralTierAndLevelLimits(   983040,   10000,  INT_MIN,   40,   3,   3 );
229 g_generalTierAndLevelLimits[ Level::LEVEL4   ] = TComGeneralTierAndLevelLimits(  2228224,   12000,    30000,   75,   5,   5 );
230 g_generalTierAndLevelLimits[ Level::LEVEL4_1 ] = TComGeneralTierAndLevelLimits(  2228224,   20000,    50000,   75,   5,   5 );
231 g_generalTierAndLevelLimits[ Level::LEVEL5   ] = TComGeneralTierAndLevelLimits(  8912896,   25000,   100000,  200,  11,  10 );
232 g_generalTierAndLevelLimits[ Level::LEVEL5_1 ] = TComGeneralTierAndLevelLimits(  8912896,   40000,   160000,  200,  11,  10 );
233 g_generalTierAndLevelLimits[ Level::LEVEL5_2 ] = TComGeneralTierAndLevelLimits(  8912896,   60000,   240000,  200,  11,  10 );
234 g_generalTierAndLevelLimits[ Level::LEVEL6   ] = TComGeneralTierAndLevelLimits( 35651584,   60000,   240000,  600,  22,  20 );
235 g_generalTierAndLevelLimits[ Level::LEVEL6_1 ] = TComGeneralTierAndLevelLimits( 35651584,  120000,   480000,  600,  22,  20 );
236 g_generalTierAndLevelLimits[ Level::LEVEL6_2 ] = TComGeneralTierAndLevelLimits( 35651584,  240000,   800000,  600,  22,  20 );
237#endif
238#endif
239}
240Void destroyROM()
241{
242  for(UInt groupTypeIndex = 0; groupTypeIndex < SCAN_NUMBER_OF_GROUP_TYPES; groupTypeIndex++)
243  {
244    for (UInt scanOrderIndex = 0; scanOrderIndex < SCAN_NUMBER_OF_TYPES; scanOrderIndex++)
245    {
246      for (UInt log2BlockWidth = 0; log2BlockWidth < MAX_CU_DEPTH; log2BlockWidth++)
247      {
248        for (UInt log2BlockHeight = 0; log2BlockHeight < MAX_CU_DEPTH; log2BlockHeight++)
249        {
250          delete [] g_scanOrder[groupTypeIndex][scanOrderIndex][log2BlockWidth][log2BlockHeight];
251        }
252      }
253    }
254  }
255#if NH_3D_DMM
256  if( !g_dmmWedgeLists.empty() ) 
257  {
258    for( UInt ui = 0; ui < g_dmmWedgeLists.size(); ui++ ) { g_dmmWedgeLists[ui].clear(); }
259    g_dmmWedgeLists.clear();
260  }
261  if( !g_dmmWedgeNodeLists.empty() )
262  {
263    for( UInt ui = 0; ui < g_dmmWedgeNodeLists.size(); ui++ ) { g_dmmWedgeNodeLists[ui].clear(); }
264    g_dmmWedgeNodeLists.clear();
265  }
266#endif
267}
268// ====================================================================================================================
269// Data structure related table & variable
270// ====================================================================================================================
271UInt g_auiZscanToRaster [ MAX_NUM_PART_IDXS_IN_CTU_WIDTH*MAX_NUM_PART_IDXS_IN_CTU_WIDTH ] = { 0, };
272UInt g_auiRasterToZscan [ MAX_NUM_PART_IDXS_IN_CTU_WIDTH*MAX_NUM_PART_IDXS_IN_CTU_WIDTH ] = { 0, };
273UInt g_auiRasterToPelX  [ MAX_NUM_PART_IDXS_IN_CTU_WIDTH*MAX_NUM_PART_IDXS_IN_CTU_WIDTH ] = { 0, };
274UInt g_auiRasterToPelY  [ MAX_NUM_PART_IDXS_IN_CTU_WIDTH*MAX_NUM_PART_IDXS_IN_CTU_WIDTH ] = { 0, };
275const UInt g_auiPUOffset[NUMBER_OF_PART_SIZES] = { 0, 8, 4, 4, 2, 10, 1, 5};
276Void initZscanToRaster ( Int iMaxDepth, Int iDepth, UInt uiStartVal, UInt*& rpuiCurrIdx )
277{
278  Int iStride = 1 << ( iMaxDepth - 1 );
279  if ( iDepth == iMaxDepth )
280  {
281    rpuiCurrIdx[0] = uiStartVal;
282    rpuiCurrIdx++;
283  }
284  else
285  {
286    Int iStep = iStride >> iDepth;
287    initZscanToRaster( iMaxDepth, iDepth+1, uiStartVal,                     rpuiCurrIdx );
288    initZscanToRaster( iMaxDepth, iDepth+1, uiStartVal+iStep,               rpuiCurrIdx );
289    initZscanToRaster( iMaxDepth, iDepth+1, uiStartVal+iStep*iStride,       rpuiCurrIdx );
290    initZscanToRaster( iMaxDepth, iDepth+1, uiStartVal+iStep*iStride+iStep, rpuiCurrIdx );
291  }
292}
293Void initRasterToZscan ( UInt uiMaxCUWidth, UInt uiMaxCUHeight, UInt uiMaxDepth )
294{
295  UInt  uiMinCUWidth  = uiMaxCUWidth  >> ( uiMaxDepth - 1 );
296  UInt  uiMinCUHeight = uiMaxCUHeight >> ( uiMaxDepth - 1 );
297  UInt  uiNumPartInWidth  = (UInt)uiMaxCUWidth  / uiMinCUWidth;
298  UInt  uiNumPartInHeight = (UInt)uiMaxCUHeight / uiMinCUHeight;
299  for ( UInt i = 0; i < uiNumPartInWidth*uiNumPartInHeight; i++ )
300  {
301    g_auiRasterToZscan[ g_auiZscanToRaster[i] ] = i;
302  }
303}
304Void initRasterToPelXY ( UInt uiMaxCUWidth, UInt uiMaxCUHeight, UInt uiMaxDepth )
305{
306  UInt    i;
307  UInt* uiTempX = &g_auiRasterToPelX[0];
308  UInt* uiTempY = &g_auiRasterToPelY[0];
309  UInt  uiMinCUWidth  = uiMaxCUWidth  >> ( uiMaxDepth - 1 );
310  UInt  uiMinCUHeight = uiMaxCUHeight >> ( uiMaxDepth - 1 );
311  UInt  uiNumPartInWidth  = uiMaxCUWidth  / uiMinCUWidth;
312  UInt  uiNumPartInHeight = uiMaxCUHeight / uiMinCUHeight;
313  uiTempX[0] = 0; uiTempX++;
314  for ( i = 1; i < uiNumPartInWidth; i++ )
315  {
316    uiTempX[0] = uiTempX[-1] + uiMinCUWidth; uiTempX++;
317  }
318  for ( i = 1; i < uiNumPartInHeight; i++ )
319  {
320    memcpy(uiTempX, uiTempX-uiNumPartInWidth, sizeof(UInt)*uiNumPartInWidth);
321    uiTempX += uiNumPartInWidth;
322  }
323  for ( i = 1; i < uiNumPartInWidth*uiNumPartInHeight; i++ )
324  {
325    uiTempY[i] = ( i / uiNumPartInWidth ) * uiMinCUWidth;
326  }
327}
328const Int g_quantScales[SCALING_LIST_REM_NUM] =
329{
330  26214,23302,20560,18396,16384,14564
331};
332const Int g_invQuantScales[SCALING_LIST_REM_NUM] =
333{
334  40,45,51,57,64,72
335};
336//--------------------------------------------------------------------------------------------------
337//structures
338#define DEFINE_DST4x4_MATRIX(a,b,c,d) \
339{ \
340  {  a,  b,  c,  d }, \
341  {  c,  c,  0, -c }, \
342  {  d, -a, -c,  b }, \
343  {  b, -d,  c, -a }, \
344}
345#define DEFINE_DCT4x4_MATRIX(a,b,c) \
346{ \
347  { a,  a,  a,  a}, \
348  { b,  c, -c, -b}, \
349  { a, -a, -a,  a}, \
350  { c, -b,  b, -c}  \
351}
352#define DEFINE_DCT8x8_MATRIX(a,b,c,d,e,f,g) \
353{ \
354  { a,  a,  a,  a,  a,  a,  a,  a}, \
355  { d,  e,  f,  g, -g, -f, -e, -d}, \
356  { b,  c, -c, -b, -b, -c,  c,  b}, \
357  { e, -g, -d, -f,  f,  d,  g, -e}, \
358  { a, -a, -a,  a,  a, -a, -a,  a}, \
359  { f, -d,  g,  e, -e, -g,  d, -f}, \
360  { c, -b,  b, -c, -c,  b, -b,  c}, \
361  { g, -f,  e, -d,  d, -e,  f, -g}  \
362}
363#define DEFINE_DCT16x16_MATRIX(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) \
364{ \
365  { a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a}, \
366  { h,  i,  j,  k,  l,  m,  n,  o, -o, -n, -m, -l, -k, -j, -i, -h}, \
367  { d,  e,  f,  g, -g, -f, -e, -d, -d, -e, -f, -g,  g,  f,  e,  d}, \
368  { i,  l,  o, -m, -j, -h, -k, -n,  n,  k,  h,  j,  m, -o, -l, -i}, \
369  { b,  c, -c, -b, -b, -c,  c,  b,  b,  c, -c, -b, -b, -c,  c,  b}, \
370  { j,  o, -k, -i, -n,  l,  h,  m, -m, -h, -l,  n,  i,  k, -o, -j}, \
371  { e, -g, -d, -f,  f,  d,  g, -e, -e,  g,  d,  f, -f, -d, -g,  e}, \
372  { k, -m, -i,  o,  h,  n, -j, -l,  l,  j, -n, -h, -o,  i,  m, -k}, \
373  { a, -a, -a,  a,  a, -a, -a,  a,  a, -a, -a,  a,  a, -a, -a,  a}, \
374  { l, -j, -n,  h, -o, -i,  m,  k, -k, -m,  i,  o, -h,  n,  j, -l}, \
375  { f, -d,  g,  e, -e, -g,  d, -f, -f,  d, -g, -e,  e,  g, -d,  f}, \
376  { m, -h,  l,  n, -i,  k,  o, -j,  j, -o, -k,  i, -n, -l,  h, -m}, \
377  { c, -b,  b, -c, -c,  b, -b,  c,  c, -b,  b, -c, -c,  b, -b,  c}, \
378  { n, -k,  h, -j,  m,  o, -l,  i, -i,  l, -o, -m,  j, -h,  k, -n}, \
379  { g, -f,  e, -d,  d, -e,  f, -g, -g,  f, -e,  d, -d,  e, -f,  g}, \
380  { o, -n,  m, -l,  k, -j,  i, -h,  h, -i,  j, -k,  l, -m,  n, -o}  \
381}
382#define DEFINE_DCT32x32_MATRIX(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E) \
383{ \
384  { a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a}, \
385  { p,  q,  r,  s,  t,  u,  v,  w,  x,  y,  z,  A,  B,  C,  D,  E, -E, -D, -C, -B, -A, -z, -y, -x, -w, -v, -u, -t, -s, -r, -q, -p}, \
386  { h,  i,  j,  k,  l,  m,  n,  o, -o, -n, -m, -l, -k, -j, -i, -h, -h, -i, -j, -k, -l, -m, -n, -o,  o,  n,  m,  l,  k,  j,  i,  h}, \
387  { q,  t,  w,  z,  C, -E, -B, -y, -v, -s, -p, -r, -u, -x, -A, -D,  D,  A,  x,  u,  r,  p,  s,  v,  y,  B,  E, -C, -z, -w, -t, -q}, \
388  { d,  e,  f,  g, -g, -f, -e, -d, -d, -e, -f, -g,  g,  f,  e,  d,  d,  e,  f,  g, -g, -f, -e, -d, -d, -e, -f, -g,  g,  f,  e,  d}, \
389  { r,  w,  B, -D, -y, -t, -p, -u, -z, -E,  A,  v,  q,  s,  x,  C, -C, -x, -s, -q, -v, -A,  E,  z,  u,  p,  t,  y,  D, -B, -w, -r}, \
390  { i,  l,  o, -m, -j, -h, -k, -n,  n,  k,  h,  j,  m, -o, -l, -i, -i, -l, -o,  m,  j,  h,  k,  n, -n, -k, -h, -j, -m,  o,  l,  i}, \
391  { s,  z, -D, -w, -p, -v, -C,  A,  t,  r,  y, -E, -x, -q, -u, -B,  B,  u,  q,  x,  E, -y, -r, -t, -A,  C,  v,  p,  w,  D, -z, -s}, \
392  { b,  c, -c, -b, -b, -c,  c,  b,  b,  c, -c, -b, -b, -c,  c,  b,  b,  c, -c, -b, -b, -c,  c,  b,  b,  c, -c, -b, -b, -c,  c,  b}, \
393  { t,  C, -y, -p, -x,  D,  u,  s,  B, -z, -q, -w,  E,  v,  r,  A, -A, -r, -v, -E,  w,  q,  z, -B, -s, -u, -D,  x,  p,  y, -C, -t}, \
394  { j,  o, -k, -i, -n,  l,  h,  m, -m, -h, -l,  n,  i,  k, -o, -j, -j, -o,  k,  i,  n, -l, -h, -m,  m,  h,  l, -n, -i, -k,  o,  j}, \
395  { u, -E, -t, -v,  D,  s,  w, -C, -r, -x,  B,  q,  y, -A, -p, -z,  z,  p,  A, -y, -q, -B,  x,  r,  C, -w, -s, -D,  v,  t,  E, -u}, \
396  { e, -g, -d, -f,  f,  d,  g, -e, -e,  g,  d,  f, -f, -d, -g,  e,  e, -g, -d, -f,  f,  d,  g, -e, -e,  g,  d,  f, -f, -d, -g,  e}, \
397  { v, -B, -p, -C,  u,  w, -A, -q, -D,  t,  x, -z, -r, -E,  s,  y, -y, -s,  E,  r,  z, -x, -t,  D,  q,  A, -w, -u,  C,  p,  B, -v}, \
398  { k, -m, -i,  o,  h,  n, -j, -l,  l,  j, -n, -h, -o,  i,  m, -k, -k,  m,  i, -o, -h, -n,  j,  l, -l, -j,  n,  h,  o, -i, -m,  k}, \
399  { w, -y, -u,  A,  s, -C, -q,  E,  p,  D, -r, -B,  t,  z, -v, -x,  x,  v, -z, -t,  B,  r, -D, -p, -E,  q,  C, -s, -A,  u,  y, -w}, \
400  { a, -a, -a,  a,  a, -a, -a,  a,  a, -a, -a,  a,  a, -a, -a,  a,  a, -a, -a,  a,  a, -a, -a,  a,  a, -a, -a,  a,  a, -a, -a,  a}, \
401  { x, -v, -z,  t,  B, -r, -D,  p, -E, -q,  C,  s, -A, -u,  y,  w, -w, -y,  u,  A, -s, -C,  q,  E, -p,  D,  r, -B, -t,  z,  v, -x}, \
402  { l, -j, -n,  h, -o, -i,  m,  k, -k, -m,  i,  o, -h,  n,  j, -l, -l,  j,  n, -h,  o,  i, -m, -k,  k,  m, -i, -o,  h, -n, -j,  l}, \
403  { y, -s, -E,  r, -z, -x,  t,  D, -q,  A,  w, -u, -C,  p, -B, -v,  v,  B, -p,  C,  u, -w, -A,  q, -D, -t,  x,  z, -r,  E,  s, -y}, \
404  { f, -d,  g,  e, -e, -g,  d, -f, -f,  d, -g, -e,  e,  g, -d,  f,  f, -d,  g,  e, -e, -g,  d, -f, -f,  d, -g, -e,  e,  g, -d,  f}, \
405  { z, -p,  A,  y, -q,  B,  x, -r,  C,  w, -s,  D,  v, -t,  E,  u, -u, -E,  t, -v, -D,  s, -w, -C,  r, -x, -B,  q, -y, -A,  p, -z}, \
406  { m, -h,  l,  n, -i,  k,  o, -j,  j, -o, -k,  i, -n, -l,  h, -m, -m,  h, -l, -n,  i, -k, -o,  j, -j,  o,  k, -i,  n,  l, -h,  m}, \
407  { A, -r,  v, -E, -w,  q, -z, -B,  s, -u,  D,  x, -p,  y,  C, -t,  t, -C, -y,  p, -x, -D,  u, -s,  B,  z, -q,  w,  E, -v,  r, -A}, \
408  { c, -b,  b, -c, -c,  b, -b,  c,  c, -b,  b, -c, -c,  b, -b,  c,  c, -b,  b, -c, -c,  b, -b,  c,  c, -b,  b, -c, -c,  b, -b,  c}, \
409  { B, -u,  q, -x,  E,  y, -r,  t, -A, -C,  v, -p,  w, -D, -z,  s, -s,  z,  D, -w,  p, -v,  C,  A, -t,  r, -y, -E,  x, -q,  u, -B}, \
410  { n, -k,  h, -j,  m,  o, -l,  i, -i,  l, -o, -m,  j, -h,  k, -n, -n,  k, -h,  j, -m, -o,  l, -i,  i, -l,  o,  m, -j,  h, -k,  n}, \
411  { C, -x,  s, -q,  v, -A, -E,  z, -u,  p, -t,  y, -D, -B,  w, -r,  r, -w,  B,  D, -y,  t, -p,  u, -z,  E,  A, -v,  q, -s,  x, -C}, \
412  { g, -f,  e, -d,  d, -e,  f, -g, -g,  f, -e,  d, -d,  e, -f,  g,  g, -f,  e, -d,  d, -e,  f, -g, -g,  f, -e,  d, -d,  e, -f,  g}, \
413  { D, -A,  x, -u,  r, -p,  s, -v,  y, -B,  E,  C, -z,  w, -t,  q, -q,  t, -w,  z, -C, -E,  B, -y,  v, -s,  p, -r,  u, -x,  A, -D}, \
414  { o, -n,  m, -l,  k, -j,  i, -h,  h, -i,  j, -k,  l, -m,  n, -o, -o,  n, -m,  l, -k,  j, -i,  h, -h,  i, -j,  k, -l,  m, -n,  o}, \
415  { E, -D,  C, -B,  A, -z,  y, -x,  w, -v,  u, -t,  s, -r,  q, -p,  p, -q,  r, -s,  t, -u,  v, -w,  x, -y,  z, -A,  B, -C,  D, -E}  \
416}
417//--------------------------------------------------------------------------------------------------
418//coefficients
419#if RExt__HIGH_PRECISION_FORWARD_TRANSFORM
420const TMatrixCoeff g_aiT4 [TRANSFORM_NUMBER_OF_DIRECTIONS][4][4]   =
421{
422  DEFINE_DCT4x4_MATRIX  (16384, 21266,  9224),
423  DEFINE_DCT4x4_MATRIX  (   64,    83,    36)
424};
425const TMatrixCoeff g_aiT8 [TRANSFORM_NUMBER_OF_DIRECTIONS][8][8]   =
426{
427  DEFINE_DCT8x8_MATRIX  (16384, 21266,  9224, 22813, 19244, 12769,  4563),
428  DEFINE_DCT8x8_MATRIX  (   64,    83,    36,    89,    75,    50,    18)
429};
430const TMatrixCoeff g_aiT16[TRANSFORM_NUMBER_OF_DIRECTIONS][16][16] =
431{
432  DEFINE_DCT16x16_MATRIX(16384, 21266,  9224, 22813, 19244, 12769,  4563, 23120, 22063, 20450, 17972, 14642, 11109,  6446,  2316),
433  DEFINE_DCT16x16_MATRIX(   64,    83,    36,    89,    75,    50,    18,    90,    87,    80,    70,    57,    43,    25,     9)
434};
435const TMatrixCoeff g_aiT32[TRANSFORM_NUMBER_OF_DIRECTIONS][32][32] =
436{
437  DEFINE_DCT32x32_MATRIX(16384, 21266,  9224, 22813, 19244, 12769,  4563, 23120, 22063, 20450, 17972, 14642, 11109,  6446,  2316, 23106, 22852, 22445, 21848, 20995, 19810, 18601, 17143, 15718, 13853, 11749,  9846,  7908,  5573,  3281,   946),
438  DEFINE_DCT32x32_MATRIX(   64,    83,    36,    89,    75,    50,    18,    90,    87,    80,    70,    57,    43,    25,     9,    90,    90,    88,    85,    82,    78,    73,    67,    61,    54,    46,    38,    31,    22,    13,     4)
439};
440const TMatrixCoeff g_as_DST_MAT_4[TRANSFORM_NUMBER_OF_DIRECTIONS][4][4] =
441{
442  DEFINE_DST4x4_MATRIX( 7424, 14081, 18893, 21505),
443  DEFINE_DST4x4_MATRIX(   29,    55,    74,    84)
444};
445#else
446const TMatrixCoeff g_aiT4 [TRANSFORM_NUMBER_OF_DIRECTIONS][4][4]   =
447{
448  DEFINE_DCT4x4_MATRIX  (   64,    83,    36),
449  DEFINE_DCT4x4_MATRIX  (   64,    83,    36)
450};
451const TMatrixCoeff g_aiT8 [TRANSFORM_NUMBER_OF_DIRECTIONS][8][8]   =
452{
453  DEFINE_DCT8x8_MATRIX  (   64,    83,    36,    89,    75,    50,    18),
454  DEFINE_DCT8x8_MATRIX  (   64,    83,    36,    89,    75,    50,    18)
455};
456const TMatrixCoeff g_aiT16[TRANSFORM_NUMBER_OF_DIRECTIONS][16][16] =
457{
458  DEFINE_DCT16x16_MATRIX(   64,    83,    36,    89,    75,    50,    18,    90,    87,    80,    70,    57,    43,    25,     9),
459  DEFINE_DCT16x16_MATRIX(   64,    83,    36,    89,    75,    50,    18,    90,    87,    80,    70,    57,    43,    25,     9)
460};
461const TMatrixCoeff g_aiT32[TRANSFORM_NUMBER_OF_DIRECTIONS][32][32] =
462{
463  DEFINE_DCT32x32_MATRIX(   64,    83,    36,    89,    75,    50,    18,    90,    87,    80,    70,    57,    43,    25,     9,    90,    90,    88,    85,    82,    78,    73,    67,    61,    54,    46,    38,    31,    22,    13,     4),
464  DEFINE_DCT32x32_MATRIX(   64,    83,    36,    89,    75,    50,    18,    90,    87,    80,    70,    57,    43,    25,     9,    90,    90,    88,    85,    82,    78,    73,    67,    61,    54,    46,    38,    31,    22,    13,     4)
465};
466const TMatrixCoeff g_as_DST_MAT_4[TRANSFORM_NUMBER_OF_DIRECTIONS][4][4] =
467{
468  DEFINE_DST4x4_MATRIX(   29,    55,    74,    84),
469  DEFINE_DST4x4_MATRIX(   29,    55,    74,    84)
470};
471#endif
472//--------------------------------------------------------------------------------------------------
473#undef DEFINE_DST4x4_MATRIX
474#undef DEFINE_DCT4x4_MATRIX
475#undef DEFINE_DCT8x8_MATRIX
476#undef DEFINE_DCT16x16_MATRIX
477#undef DEFINE_DCT32x32_MATRIX
478//--------------------------------------------------------------------------------------------------
479const UChar g_aucChromaScale[NUM_CHROMA_FORMAT][chromaQPMappingTableSize]=
480{
481  //0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57
482  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
483  { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,29,30,31,32,33,33,34,34,35,35,36,36,37,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51 },
484  { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,51,51,51,51,51,51 },
485  { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,51,51,51,51,51,51 }
486};
487// ====================================================================================================================
488// Intra prediction
489// ====================================================================================================================
490const UChar g_aucIntraModeNumFast_UseMPM[MAX_CU_DEPTH] =
491{
492  3,  //   2x2
493  8,  //   4x4
494  8,  //   8x8
495  3,  //  16x16
496  3,  //  32x32
497  3   //  64x64
498};
499const UChar g_aucIntraModeNumFast_NotUseMPM[MAX_CU_DEPTH] =
500{
501  3,  //   2x2
502  9,  //   4x4
503  9,  //   8x8
504  4,  //  16x16   33
505  4,  //  32x32   33
506  5   //  64x64   33
507};
508const UChar g_chroma422IntraAngleMappingTable[NUM_INTRA_MODE] =
509  //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, DM
510  { 0, 1, 2, 2, 2, 2, 3, 5, 7, 8, 10, 12, 13, 15, 17, 18, 19, 20, 21, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31, DM_CHROMA_IDX};
511#if NH_3D_DMM
512// ====================================================================================================================
513// Depth coding modes
514// ====================================================================================================================
515const WedgeResolution g_dmmWedgeResolution[6] = 
516{
517  HALF_PEL,    //   4x4
518  HALF_PEL,    //   8x8
519  FULL_PEL,    //  16x16
520  FULL_PEL,    //  32x32
521  FULL_PEL,    //  64x64
522  FULL_PEL     // 128x128
523};
524const UChar g_dmm1TabIdxBits[6] =
525{ //2x2   4x4   8x8 16x16 32x32 64x64
526     0,    7,   10,   9,    9,   13 };
527Bool g_wedgePattern[32*32];
528extern std::vector< std::vector<TComWedgelet> >   g_dmmWedgeLists;
529extern std::vector< std::vector<TComWedgeNode> >  g_dmmWedgeNodeLists;
530#endif
531// ====================================================================================================================
532// Misc.
533// ====================================================================================================================
534Char  g_aucConvertToBit  [ MAX_CU_SIZE+1 ];
535#if ENC_DEC_TRACE
536FILE*  g_hTrace = NULL; // Set to NULL to open up a file. Set to stdout to use the current output
537const Bool g_bEncDecTraceEnable  = true;
538const Bool g_bEncDecTraceDisable = false;
539Bool   g_HLSTraceEnable = false;
540Bool   g_bJustDoIt = false;
541UInt64 g_nSymbolCounter = 0;
542#if H_MV_ENC_DEC_TRAC
543Bool g_traceCU = false; 
544Bool g_tracePU = false; 
545Bool g_traceTU = false; 
546Bool g_disableNumbering = false; 
547Bool g_disableHLSTrace = false; 
548UInt64 g_stopAtCounter         = 4660; 
549Bool g_traceCopyBack           = false; 
550Bool g_decTraceDispDer         = false; 
551Bool g_decTraceMvFromMerge     = false; 
552Bool g_decTracePicOutput       = false; 
553Bool g_startStopTrace          = false; 
554Bool g_outputPos               = false;
555Bool g_traceCameraParameters   = false; 
556Bool g_encNumberOfWrittenBits  = false; 
557Bool g_traceEncFracBits        = false; 
558Bool g_traceIntraSearchCost    = false; 
559Bool g_traceRDCost             = false; 
560Bool g_traceSAOCost            = false; 
561Bool g_traceModeCheck          = false; 
562UInt g_indent                  = false; 
563#endif
564#endif
565// ====================================================================================================================
566// Scanning order & context model mapping
567// ====================================================================================================================
568// scanning order table
569UInt* g_scanOrder[SCAN_NUMBER_OF_GROUP_TYPES][SCAN_NUMBER_OF_TYPES][ MAX_CU_DEPTH ][ MAX_CU_DEPTH ];
570const UInt ctxIndMap4x4[4*4] =
571{
572  0, 1, 4, 5,
573  2, 3, 4, 5,
574  6, 6, 8, 8,
575  7, 7, 8, 8
576};
577const UInt g_uiMinInGroup[ LAST_SIGNIFICANT_GROUPS ] = {0,1,2,3,4,6,8,12,16,24};
578const UInt g_uiGroupIdx[ MAX_TU_SIZE ]   = {0,1,2,3,4,4,5,5,6,6,6,6,7,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9};
579const Char *MatrixType[SCALING_LIST_SIZE_NUM][SCALING_LIST_NUM] =
580{
581  {
582    "INTRA4X4_LUMA",
583    "INTRA4X4_CHROMAU",
584    "INTRA4X4_CHROMAV",
585    "INTER4X4_LUMA",
586    "INTER4X4_CHROMAU",
587    "INTER4X4_CHROMAV"
588  },
589  {
590    "INTRA8X8_LUMA",
591    "INTRA8X8_CHROMAU",
592    "INTRA8X8_CHROMAV",
593    "INTER8X8_LUMA",
594    "INTER8X8_CHROMAU",
595    "INTER8X8_CHROMAV"
596  },
597  {
598    "INTRA16X16_LUMA",
599    "INTRA16X16_CHROMAU",
600    "INTRA16X16_CHROMAV",
601    "INTER16X16_LUMA",
602    "INTER16X16_CHROMAU",
603    "INTER16X16_CHROMAV"
604  },
605  {
606   "INTRA32X32_LUMA",
607   "INTRA32X32_CHROMAU_FROM16x16_CHROMAU",
608   "INTRA32X32_CHROMAV_FROM16x16_CHROMAV",
609   "INTER32X32_LUMA",
610   "INTER32X32_CHROMAU_FROM16x16_CHROMAU",
611   "INTER32X32_CHROMAV_FROM16x16_CHROMAV"
612  },
613};
614const Char *MatrixType_DC[SCALING_LIST_SIZE_NUM][SCALING_LIST_NUM] =
615{
616  {
617  },
618  {
619  },
620  {
621    "INTRA16X16_LUMA_DC",
622    "INTRA16X16_CHROMAU_DC",
623    "INTRA16X16_CHROMAV_DC",
624    "INTER16X16_LUMA_DC",
625    "INTER16X16_CHROMAU_DC",
626    "INTER16X16_CHROMAV_DC"
627  },
628  {
629    "INTRA32X32_LUMA_DC",
630    "INTRA32X32_CHROMAU_DC_FROM16x16_CHROMAU",
631    "INTRA32X32_CHROMAV_DC_FROM16x16_CHROMAV",
632    "INTER32X32_LUMA_DC",
633    "INTER32X32_CHROMAU_DC_FROM16x16_CHROMAU",
634    "INTER32X32_CHROMAV_DC_FROM16x16_CHROMAV"
635  },
636};
637const Int g_quantTSDefault4x4[4*4] =
638{
639  16,16,16,16,
640  16,16,16,16,
641  16,16,16,16,
642  16,16,16,16
643};
644const Int g_quantIntraDefault8x8[8*8] =
645{
646  16,16,16,16,17,18,21,24,
647  16,16,16,16,17,19,22,25,
648  16,16,17,18,20,22,25,29,
649  16,16,18,21,24,27,31,36,
650  17,17,20,24,30,35,41,47,
651  18,19,22,27,35,44,54,65,
652  21,22,25,31,41,54,70,88,
653  24,25,29,36,47,65,88,115
654};
655const Int g_quantInterDefault8x8[8*8] =
656{
657  16,16,16,16,17,18,20,24,
658  16,16,16,17,18,20,24,25,
659  16,16,17,18,20,24,25,28,
660  16,17,18,20,24,25,28,33,
661  17,18,20,24,25,28,33,41,
662  18,20,24,25,28,33,41,54,
663  20,24,25,28,33,41,54,71,
664  24,25,28,33,41,54,71,91
665};
666const UInt g_scalingListSize   [SCALING_LIST_SIZE_NUM] = {16,64,256,1024};
667const UInt g_scalingListSizeX  [SCALING_LIST_SIZE_NUM] = { 4, 8, 16,  32};
668#if H_MV_ENC_DEC_TRAC
669#if ENC_DEC_TRACE
670Void tracePSHeader( const Char* psName, Int layerId )
671{ 
672  if ( !g_disableHLSTrace  ) 
673  {
674    fprintf( g_hTrace, "=========== ");   
675    fprintf( g_hTrace, "%s", psName );   
676    fprintf( g_hTrace, " Layer %d ===========", layerId );   
677    fprintf( g_hTrace, "\n" );   
678    fflush ( g_hTrace );   
679  }
680}
681Void stopAtPos( Int poc, Int layerId, Int cuPelX, Int cuPelY, Int cuWidth, Int cuHeight )
682{
683  if ( g_outputPos ) 
684  {
685    std::cout << "POC\t"        << poc
686              << "\tLayerId\t"  << layerId
687              << "\tCuPelX\t"   << cuPelX 
688              << "\tCuPelY\t"   << cuPelY
689              << "\tCuWidth\t"  << cuWidth
690              << "\tCuHeight\t" << cuHeight
691              << std::endl; 
692  }
693  Bool startTrace = false; 
694  if ( g_startStopTrace && poc == 0 && layerId == 0 )
695  {   
696    startTrace = ( cuPelX  == 0 ) && ( cuPelY  == 0 ) && ( cuWidth == 64 ) && ( cuHeight == 64 ); 
697  }
698  if ( startTrace )
699  { 
700    g_outputPos              = true; 
701    g_traceEncFracBits       = false;   
702    g_traceIntraSearchCost   = false;     
703    g_encNumberOfWrittenBits = false;     
704    g_traceRDCost            = true; 
705    g_traceModeCheck         = true; 
706    g_traceCopyBack          = false; 
707  } 
708  Bool stopTrace = false; 
709  if ( g_startStopTrace && poc == 0 && layerId == 0 )
710  {
711    stopTrace = ( cuPelX  == 128 ) && ( cuPelY  == 0 ) && ( cuWidth == 64 ) && ( cuHeight == 64 ); 
712  }
713  if ( stopTrace )
714  { 
715    g_outputPos              = false; 
716    g_traceModeCheck         = false; 
717    g_traceEncFracBits       = false; 
718    g_traceIntraSearchCost   = false;       
719    g_encNumberOfWrittenBits = false; 
720    g_traceRDCost            = false; 
721    g_traceCopyBack          = false;     
722  } 
723}
724Void writeToTraceFile( const Char* symbolName, Int val, Bool doIt )
725{
726  if ( ( ( g_nSymbolCounter >= COUNTER_START && g_nSymbolCounter <= COUNTER_END )|| g_bJustDoIt ) && doIt  ) 
727  {
728    incSymbolCounter(); 
729    if ( !g_disableNumbering )
730    { 
731      fprintf( g_hTrace, "%8lld  ", g_nSymbolCounter );
732    }
733    fprintf( g_hTrace, "%-50s       : %d\n", symbolName, val );     
734    fflush ( g_hTrace );   
735  }
736}
737UInt64 incSymbolCounter( )
738{
739  g_nSymbolCounter++; 
740  if ( g_stopAtCounter == g_nSymbolCounter )
741  {
742    std::cout << "Break point here." << std::endl; 
743  } 
744  return g_nSymbolCounter; 
745}
746Void writeToTraceFile( const Char* symbolName, Bool doIt )
747{
748  if ( ( ( g_nSymbolCounter >= COUNTER_START && g_nSymbolCounter <= COUNTER_END )|| g_bJustDoIt ) && doIt  ) 
749  {
750    incSymbolCounter(); 
751    fprintf( g_hTrace, "%s", symbolName );   
752    fflush ( g_hTrace );   
753  }
754}
755Void printStr( std::string str )
756{
757  std::cout << str << std::endl; 
758}
759Void printStrIndent( Bool b, std::string strStr )
760{
761  if ( b )
762  { 
763    std::cout << std::string(g_indent, ' ');
764    printStr( strStr );
765  }
766}
767Void prinStrIncIndent( Bool b,  std::string strStr )
768{
769  if ( b )
770  {
771    printStrIndent( true,  strStr );
772    if (g_indent < 50)
773    {
774      g_indent++;
775    }
776  } 
777}
778Void decIndent( Bool b )
779{
780  if (b && g_indent > 0)
781  {
782    g_indent--; 
783  } 
784}
785#endif
786#endif
787#if NH_3D_DMM
788std::vector< std::vector<TComWedgelet>  > g_dmmWedgeLists;
789std::vector< std::vector<TComWedgeNode> > g_dmmWedgeNodeLists;
790Void initWedgeLists( Bool initNodeList )
791{
792  if( !g_dmmWedgeLists.empty() ) return;
793  for( UInt ui = g_aucConvertToBit[DMM_MIN_SIZE]; ui < (g_aucConvertToBit[DMM_MAX_SIZE]); ui++ )
794  {
795    UInt uiWedgeBlockSize = ((UInt)DMM_MIN_SIZE)<<ui;
796    std::vector<TComWedgelet> acWedgeList;
797    std::vector<TComWedgeRef> acWedgeRefList;
798    createWedgeList( uiWedgeBlockSize, uiWedgeBlockSize, acWedgeList, acWedgeRefList, g_dmmWedgeResolution[ui] );
799    g_dmmWedgeLists.push_back( acWedgeList );
800    if( initNodeList )
801    {
802      // create WedgeNodeList
803      std::vector<TComWedgeNode> acWedgeNodeList;
804      for( UInt uiPos = 0; uiPos < acWedgeList.size(); uiPos++ )
805      {
806        if( acWedgeList[uiPos].getIsCoarse() )
807        {
808          TComWedgeNode cWedgeNode;
809          cWedgeNode.setPatternIdx( uiPos );
810          UInt uiRefPos = 0;
811          for( Int iOffS = -1; iOffS <= 1; iOffS++ )
812          {
813            for( Int iOffE = -1; iOffE <= 1; iOffE++ )
814            {
815              if( iOffS == 0 && iOffE == 0 ) { continue; }
816              Int iSx = (Int)acWedgeList[uiPos].getStartX();
817              Int iSy = (Int)acWedgeList[uiPos].getStartY();
818              Int iEx = (Int)acWedgeList[uiPos].getEndX();
819              Int iEy = (Int)acWedgeList[uiPos].getEndY();
820              switch( acWedgeList[uiPos].getOri() )
821              {
822              case( 0 ): { iSx += iOffS; iEy += iOffE; } break;
823              case( 1 ): { iSy += iOffS; iEx -= iOffE; } break;
824              case( 2 ): { iSx -= iOffS; iEy -= iOffE; } break;
825              case( 3 ): { iSy -= iOffS; iEx += iOffE; } break;
826              case( 4 ): { iSx += iOffS; iEx += iOffE; } break;
827              case( 5 ): { iSy += iOffS; iEy += iOffE; } break;
828              default: assert( 0 );
829              }
830              for( UInt k = 0; k < acWedgeRefList.size(); k++ )
831              {
832                if( iSx == (Int)acWedgeRefList[k].getStartX() && 
833                  iSy == (Int)acWedgeRefList[k].getStartY() && 
834                  iEx == (Int)acWedgeRefList[k].getEndX()   && 
835                  iEy == (Int)acWedgeRefList[k].getEndY()      )
836                {
837                  if( acWedgeRefList[k].getRefIdx() != cWedgeNode.getPatternIdx() )
838                  {
839                    Bool bNew = true;
840                    for( UInt m = 0; m < uiRefPos; m++ ) { if( acWedgeRefList[k].getRefIdx() == cWedgeNode.getRefineIdx( m ) ) { bNew = false; break; } }
841                    if( bNew ) 
842                    {
843                      cWedgeNode.setRefineIdx( acWedgeRefList[k].getRefIdx(), uiRefPos );
844                      uiRefPos++;
845                      break;
846                    }
847                  }
848                }
849              }
850            }
851          }
852          acWedgeNodeList.push_back( cWedgeNode );
853        }
854      }
855      g_dmmWedgeNodeLists.push_back( acWedgeNodeList );
856    }
857  }
858}
859Void createWedgeList( UInt uiWidth, UInt uiHeight, std::vector<TComWedgelet> &racWedgeList, std::vector<TComWedgeRef> &racWedgeRefList, WedgeResolution eWedgeRes )
860{
861  assert( uiWidth == uiHeight );
862  Int posStart = 0, posEnd = 0;
863  UInt uiBlockSize = 0;
864  switch( eWedgeRes )
865  {
866  case(   FULL_PEL ): { uiBlockSize =  uiWidth;     break; }
867  case(   HALF_PEL ): { uiBlockSize = (uiWidth<<1); break; }
868  }
869  TComWedgelet cTempWedgelet( uiWidth, uiHeight );
870  for( UInt uiOri = 0; uiOri < 6; uiOri++ )
871  {
872    posEnd = (Int) racWedgeList.size();
873    if (uiOri == 0 || uiOri == 4)
874    {
875    for( Int iK = 0; iK < uiBlockSize; iK += (uiWidth>=16 ?2:1))
876    {
877      for( Int iL = 0; iL < uiBlockSize; iL += ((uiWidth>=16 && uiOri<4)?2:1) )
878      {
879        Int xS = iK;
880        Int yS = 0;
881        Int xE = (uiOri == 0) ? 0 : iL;
882        Int yE = (uiOri == 0) ? iL : uiBlockSize - 1;
883        cTempWedgelet.setWedgelet( xS, yS, xE, yE, uiOri, eWedgeRes, ((iL%2)==0 && (iK%2)==0) );
884        addWedgeletToList( cTempWedgelet, racWedgeList, racWedgeRefList );
885      }
886    }
887    }
888    else
889    {
890      for (Int pos = posStart; pos < posEnd; pos++)
891      {
892        cTempWedgelet.generateWedgePatternByRotate(racWedgeList[pos], uiOri);
893        addWedgeletToList( cTempWedgelet, racWedgeList, racWedgeRefList );
894      }
895    }
896    posStart = posEnd;
897  }
898}
899Void addWedgeletToList( TComWedgelet cWedgelet, std::vector<TComWedgelet> &racWedgeList, std::vector<TComWedgeRef> &racWedgeRefList )
900{
901  Bool bValid = cWedgelet.checkNotPlain();
902  if( bValid )
903  {
904    for( UInt uiPos = 0; uiPos < racWedgeList.size(); uiPos++ )
905    {
906      if( cWedgelet.checkIdentical( racWedgeList[uiPos].getPattern() ) )
907      {
908        TComWedgeRef cWedgeRef;
909        cWedgeRef.setWedgeRef( cWedgelet.getStartX(), cWedgelet.getStartY(), cWedgelet.getEndX(), cWedgelet.getEndY(), uiPos );
910        racWedgeRefList.push_back( cWedgeRef );
911        bValid = false;
912        return;
913      }
914    }
915  }
916  if( bValid )
917  {
918    for( UInt uiPos = 0; uiPos < racWedgeList.size(); uiPos++ )
919    {
920      if( cWedgelet.checkInvIdentical( racWedgeList[uiPos].getPattern() ) )
921      {
922        TComWedgeRef cWedgeRef;
923        cWedgeRef.setWedgeRef( cWedgelet.getStartX(), cWedgelet.getStartY(), cWedgelet.getEndX(), cWedgelet.getEndY(), uiPos );
924        racWedgeRefList.push_back( cWedgeRef );
925        bValid = false;
926        return;
927      }
928    }
929  }
930  if( bValid )
931  {
932    racWedgeList.push_back( cWedgelet );
933    TComWedgeRef cWedgeRef;
934    cWedgeRef.setWedgeRef( cWedgelet.getStartX(), cWedgelet.getStartY(), cWedgelet.getEndX(), cWedgelet.getEndY(), (UInt)(racWedgeList.size()-1) );
935    racWedgeRefList.push_back( cWedgeRef );
936  }
937}
938WedgeList* getWedgeListScaled( UInt blkSize ) 
939{ 
940  return &g_dmmWedgeLists[ g_aucConvertToBit[( 16 >= blkSize ) ? blkSize : 16] ]; 
941}
942WedgeNodeList* getWedgeNodeListScaled( UInt blkSize )
943{
944  return &g_dmmWedgeNodeLists[ g_aucConvertToBit[( 16 >= blkSize ) ? blkSize : 16] ]; 
945}
946#endif //NH_3D_DMM
947//! \}
Note: See TracBrowser for help on using the repository browser.