source: 3DVCSoftware/branches/HTM-10.2-dev3-MediaTek/source/Lib/TLibCommon/TComRom.cpp @ 904

Last change on this file since 904 was 902, checked in by mediatek-htm, 11 years ago

Integration of low-latency IC encoding as proposed in JCT3V-H0086.
The MACRO is "MTK_LOW_LATENCY_IC_ENCODING_H0086"
The configuration files are modified by adding one additional control parameter "IlluCompLowLatencyEnc" which is set to 0 for CTC.

By Yi-Wen Chen (yiwen.chen@…)

  • Property svn:eol-style set to native
File size: 28.5 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-2014, 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     TComRom.cpp
35    \brief    global variables & functions
36*/
37
38#include "TComRom.h"
39#include <memory.h>
40#include <stdlib.h>
41#include <stdio.h>
42// ====================================================================================================================
43// Initialize / destroy functions
44// ====================================================================================================================
45
46//! \ingroup TLibCommon
47//! \{
48
49// initialize ROM variables
50Void initROM()
51{
52  Int i, c;
53 
54  // g_aucConvertToBit[ x ]: log2(x/4), if x=4 -> 0, x=8 -> 1, x=16 -> 2, ...
55  ::memset( g_aucConvertToBit,   -1, sizeof( g_aucConvertToBit ) );
56  c=0;
57  for ( i=4; i<=MAX_CU_SIZE; i*=2 )
58  {
59    g_aucConvertToBit[ i ] = c;
60    c++;
61  }
62 
63  c=2;
64  for ( i=0; i<MAX_CU_DEPTH; i++ )
65  {
66    g_auiSigLastScan[0][i] = new UInt[ c*c ];
67    g_auiSigLastScan[1][i] = new UInt[ c*c ];
68    g_auiSigLastScan[2][i] = new UInt[ c*c ];
69    initSigLastScan( g_auiSigLastScan[0][i], g_auiSigLastScan[1][i], g_auiSigLastScan[2][i], c, c);
70
71    c <<= 1;
72  } 
73}
74
75Void destroyROM()
76{
77  for (Int i=0; i<MAX_CU_DEPTH; i++ )
78  {
79    delete[] g_auiSigLastScan[0][i];
80    delete[] g_auiSigLastScan[1][i];
81    delete[] g_auiSigLastScan[2][i];
82  }
83
84#if H_3D_DIM_DMM
85  if( !g_dmmWedgeLists.empty() ) 
86  {
87    for( UInt ui = 0; ui < g_dmmWedgeLists.size(); ui++ ) { g_dmmWedgeLists[ui].clear(); }
88    g_dmmWedgeLists.clear();
89  }
90  if( !g_dmmWedgeRefLists.empty() )
91  {
92    for( UInt ui = 0; ui < g_dmmWedgeRefLists.size(); ui++ ) { g_dmmWedgeRefLists[ui].clear(); }
93    g_dmmWedgeRefLists.clear();
94  }
95
96  if( !g_dmmWedgeNodeLists.empty() )
97  {
98    for( UInt ui = 0; ui < g_dmmWedgeNodeLists.size(); ui++ ) { g_dmmWedgeNodeLists[ui].clear(); }
99    g_dmmWedgeNodeLists.clear();
100  }
101#endif
102}
103
104// ====================================================================================================================
105// Data structure related table & variable
106// ====================================================================================================================
107
108UInt g_uiMaxCUWidth  = MAX_CU_SIZE;
109UInt g_uiMaxCUHeight = MAX_CU_SIZE;
110UInt g_uiMaxCUDepth  = MAX_CU_DEPTH;
111UInt g_uiAddCUDepth  = 0;
112UInt g_auiZscanToRaster [ MAX_NUM_SPU_W*MAX_NUM_SPU_W ] = { 0, };
113UInt g_auiRasterToZscan [ MAX_NUM_SPU_W*MAX_NUM_SPU_W ] = { 0, };
114UInt g_auiRasterToPelX  [ MAX_NUM_SPU_W*MAX_NUM_SPU_W ] = { 0, };
115UInt g_auiRasterToPelY  [ MAX_NUM_SPU_W*MAX_NUM_SPU_W ] = { 0, };
116
117UInt g_auiPUOffset[8] = { 0, 8, 4, 4, 2, 10, 1, 5};
118
119Void initZscanToRaster ( Int iMaxDepth, Int iDepth, UInt uiStartVal, UInt*& rpuiCurrIdx )
120{
121  Int iStride = 1 << ( iMaxDepth - 1 );
122 
123  if ( iDepth == iMaxDepth )
124  {
125    rpuiCurrIdx[0] = uiStartVal;
126    rpuiCurrIdx++;
127  }
128  else
129  {
130    Int iStep = iStride >> iDepth;
131    initZscanToRaster( iMaxDepth, iDepth+1, uiStartVal,                     rpuiCurrIdx );
132    initZscanToRaster( iMaxDepth, iDepth+1, uiStartVal+iStep,               rpuiCurrIdx );
133    initZscanToRaster( iMaxDepth, iDepth+1, uiStartVal+iStep*iStride,       rpuiCurrIdx );
134    initZscanToRaster( iMaxDepth, iDepth+1, uiStartVal+iStep*iStride+iStep, rpuiCurrIdx );
135  }
136}
137
138Void initRasterToZscan ( UInt uiMaxCUWidth, UInt uiMaxCUHeight, UInt uiMaxDepth )
139{
140  UInt  uiMinCUWidth  = uiMaxCUWidth  >> ( uiMaxDepth - 1 );
141  UInt  uiMinCUHeight = uiMaxCUHeight >> ( uiMaxDepth - 1 );
142 
143  UInt  uiNumPartInWidth  = (UInt)uiMaxCUWidth  / uiMinCUWidth;
144  UInt  uiNumPartInHeight = (UInt)uiMaxCUHeight / uiMinCUHeight;
145 
146  for ( UInt i = 0; i < uiNumPartInWidth*uiNumPartInHeight; i++ )
147  {
148    g_auiRasterToZscan[ g_auiZscanToRaster[i] ] = i;
149  }
150}
151
152Void initRasterToPelXY ( UInt uiMaxCUWidth, UInt uiMaxCUHeight, UInt uiMaxDepth )
153{
154  UInt    i;
155 
156  UInt* uiTempX = &g_auiRasterToPelX[0];
157  UInt* uiTempY = &g_auiRasterToPelY[0];
158 
159  UInt  uiMinCUWidth  = uiMaxCUWidth  >> ( uiMaxDepth - 1 );
160  UInt  uiMinCUHeight = uiMaxCUHeight >> ( uiMaxDepth - 1 );
161 
162  UInt  uiNumPartInWidth  = uiMaxCUWidth  / uiMinCUWidth;
163  UInt  uiNumPartInHeight = uiMaxCUHeight / uiMinCUHeight;
164 
165  uiTempX[0] = 0; uiTempX++;
166  for ( i = 1; i < uiNumPartInWidth; i++ )
167  {
168    uiTempX[0] = uiTempX[-1] + uiMinCUWidth; uiTempX++;
169  }
170  for ( i = 1; i < uiNumPartInHeight; i++ )
171  {
172    memcpy(uiTempX, uiTempX-uiNumPartInWidth, sizeof(UInt)*uiNumPartInWidth);
173    uiTempX += uiNumPartInWidth;
174  }
175 
176  for ( i = 1; i < uiNumPartInWidth*uiNumPartInHeight; i++ )
177  {
178    uiTempY[i] = ( i / uiNumPartInWidth ) * uiMinCUWidth;
179  }
180};
181
182
183Int g_quantScales[6] =
184{
185  26214,23302,20560,18396,16384,14564
186};   
187
188Int g_invQuantScales[6] =
189{
190  40,45,51,57,64,72
191};
192
193const Short g_aiT4[4][4] =
194{
195  { 64, 64, 64, 64},
196  { 83, 36,-36,-83},
197  { 64,-64,-64, 64},
198  { 36,-83, 83,-36}
199};
200
201const Short g_aiT8[8][8] =
202{
203  { 64, 64, 64, 64, 64, 64, 64, 64},
204  { 89, 75, 50, 18,-18,-50,-75,-89},
205  { 83, 36,-36,-83,-83,-36, 36, 83},
206  { 75,-18,-89,-50, 50, 89, 18,-75},
207  { 64,-64,-64, 64, 64,-64,-64, 64},
208  { 50,-89, 18, 75,-75,-18, 89,-50},
209  { 36,-83, 83,-36,-36, 83,-83, 36},
210  { 18,-50, 75,-89, 89,-75, 50,-18}
211};
212
213const Short g_aiT16[16][16] =
214{
215  { 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64},
216  { 90, 87, 80, 70, 57, 43, 25,  9, -9,-25,-43,-57,-70,-80,-87,-90},
217  { 89, 75, 50, 18,-18,-50,-75,-89,-89,-75,-50,-18, 18, 50, 75, 89},
218  { 87, 57,  9,-43,-80,-90,-70,-25, 25, 70, 90, 80, 43, -9,-57,-87},
219  { 83, 36,-36,-83,-83,-36, 36, 83, 83, 36,-36,-83,-83,-36, 36, 83},
220  { 80,  9,-70,-87,-25, 57, 90, 43,-43,-90,-57, 25, 87, 70, -9,-80},
221  { 75,-18,-89,-50, 50, 89, 18,-75,-75, 18, 89, 50,-50,-89,-18, 75},
222  { 70,-43,-87,  9, 90, 25,-80,-57, 57, 80,-25,-90, -9, 87, 43,-70},
223  { 64,-64,-64, 64, 64,-64,-64, 64, 64,-64,-64, 64, 64,-64,-64, 64},
224  { 57,-80,-25, 90, -9,-87, 43, 70,-70,-43, 87,  9,-90, 25, 80,-57},
225  { 50,-89, 18, 75,-75,-18, 89,-50,-50, 89,-18,-75, 75, 18,-89, 50},
226  { 43,-90, 57, 25,-87, 70,  9,-80, 80, -9,-70, 87,-25,-57, 90,-43},
227  { 36,-83, 83,-36,-36, 83,-83, 36, 36,-83, 83,-36,-36, 83,-83, 36},
228  { 25,-70, 90,-80, 43,  9,-57, 87,-87, 57, -9,-43, 80,-90, 70,-25},
229  { 18,-50, 75,-89, 89,-75, 50,-18,-18, 50,-75, 89,-89, 75,-50, 18},
230  {  9,-25, 43,-57, 70,-80, 87,-90, 90,-87, 80,-70, 57,-43, 25, -9}
231};
232
233const Short g_aiT32[32][32] =
234{
235  { 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64},
236  { 90, 90, 88, 85, 82, 78, 73, 67, 61, 54, 46, 38, 31, 22, 13,  4, -4,-13,-22,-31,-38,-46,-54,-61,-67,-73,-78,-82,-85,-88,-90,-90},
237  { 90, 87, 80, 70, 57, 43, 25,  9, -9,-25,-43,-57,-70,-80,-87,-90,-90,-87,-80,-70,-57,-43,-25, -9,  9, 25, 43, 57, 70, 80, 87, 90},
238  { 90, 82, 67, 46, 22, -4,-31,-54,-73,-85,-90,-88,-78,-61,-38,-13, 13, 38, 61, 78, 88, 90, 85, 73, 54, 31,  4,-22,-46,-67,-82,-90},
239  { 89, 75, 50, 18,-18,-50,-75,-89,-89,-75,-50,-18, 18, 50, 75, 89, 89, 75, 50, 18,-18,-50,-75,-89,-89,-75,-50,-18, 18, 50, 75, 89},
240  { 88, 67, 31,-13,-54,-82,-90,-78,-46, -4, 38, 73, 90, 85, 61, 22,-22,-61,-85,-90,-73,-38,  4, 46, 78, 90, 82, 54, 13,-31,-67,-88},
241  { 87, 57,  9,-43,-80,-90,-70,-25, 25, 70, 90, 80, 43, -9,-57,-87,-87,-57, -9, 43, 80, 90, 70, 25,-25,-70,-90,-80,-43,  9, 57, 87},
242  { 85, 46,-13,-67,-90,-73,-22, 38, 82, 88, 54, -4,-61,-90,-78,-31, 31, 78, 90, 61,  4,-54,-88,-82,-38, 22, 73, 90, 67, 13,-46,-85},
243  { 83, 36,-36,-83,-83,-36, 36, 83, 83, 36,-36,-83,-83,-36, 36, 83, 83, 36,-36,-83,-83,-36, 36, 83, 83, 36,-36,-83,-83,-36, 36, 83},
244  { 82, 22,-54,-90,-61, 13, 78, 85, 31,-46,-90,-67,  4, 73, 88, 38,-38,-88,-73, -4, 67, 90, 46,-31,-85,-78,-13, 61, 90, 54,-22,-82},
245  { 80,  9,-70,-87,-25, 57, 90, 43,-43,-90,-57, 25, 87, 70, -9,-80,-80, -9, 70, 87, 25,-57,-90,-43, 43, 90, 57,-25,-87,-70,  9, 80},
246  { 78, -4,-82,-73, 13, 85, 67,-22,-88,-61, 31, 90, 54,-38,-90,-46, 46, 90, 38,-54,-90,-31, 61, 88, 22,-67,-85,-13, 73, 82,  4,-78},
247  { 75,-18,-89,-50, 50, 89, 18,-75,-75, 18, 89, 50,-50,-89,-18, 75, 75,-18,-89,-50, 50, 89, 18,-75,-75, 18, 89, 50,-50,-89,-18, 75},
248  { 73,-31,-90,-22, 78, 67,-38,-90,-13, 82, 61,-46,-88, -4, 85, 54,-54,-85,  4, 88, 46,-61,-82, 13, 90, 38,-67,-78, 22, 90, 31,-73},
249  { 70,-43,-87,  9, 90, 25,-80,-57, 57, 80,-25,-90, -9, 87, 43,-70,-70, 43, 87, -9,-90,-25, 80, 57,-57,-80, 25, 90,  9,-87,-43, 70},
250  { 67,-54,-78, 38, 85,-22,-90,  4, 90, 13,-88,-31, 82, 46,-73,-61, 61, 73,-46,-82, 31, 88,-13,-90, -4, 90, 22,-85,-38, 78, 54,-67},
251  { 64,-64,-64, 64, 64,-64,-64, 64, 64,-64,-64, 64, 64,-64,-64, 64, 64,-64,-64, 64, 64,-64,-64, 64, 64,-64,-64, 64, 64,-64,-64, 64},
252  { 61,-73,-46, 82, 31,-88,-13, 90, -4,-90, 22, 85,-38,-78, 54, 67,-67,-54, 78, 38,-85,-22, 90,  4,-90, 13, 88,-31,-82, 46, 73,-61},
253  { 57,-80,-25, 90, -9,-87, 43, 70,-70,-43, 87,  9,-90, 25, 80,-57,-57, 80, 25,-90,  9, 87,-43,-70, 70, 43,-87, -9, 90,-25,-80, 57},
254  { 54,-85, -4, 88,-46,-61, 82, 13,-90, 38, 67,-78,-22, 90,-31,-73, 73, 31,-90, 22, 78,-67,-38, 90,-13,-82, 61, 46,-88,  4, 85,-54},
255  { 50,-89, 18, 75,-75,-18, 89,-50,-50, 89,-18,-75, 75, 18,-89, 50, 50,-89, 18, 75,-75,-18, 89,-50,-50, 89,-18,-75, 75, 18,-89, 50},
256  { 46,-90, 38, 54,-90, 31, 61,-88, 22, 67,-85, 13, 73,-82,  4, 78,-78, -4, 82,-73,-13, 85,-67,-22, 88,-61,-31, 90,-54,-38, 90,-46},
257  { 43,-90, 57, 25,-87, 70,  9,-80, 80, -9,-70, 87,-25,-57, 90,-43,-43, 90,-57,-25, 87,-70, -9, 80,-80,  9, 70,-87, 25, 57,-90, 43},
258  { 38,-88, 73, -4,-67, 90,-46,-31, 85,-78, 13, 61,-90, 54, 22,-82, 82,-22,-54, 90,-61,-13, 78,-85, 31, 46,-90, 67,  4,-73, 88,-38},
259  { 36,-83, 83,-36,-36, 83,-83, 36, 36,-83, 83,-36,-36, 83,-83, 36, 36,-83, 83,-36,-36, 83,-83, 36, 36,-83, 83,-36,-36, 83,-83, 36},
260  { 31,-78, 90,-61,  4, 54,-88, 82,-38,-22, 73,-90, 67,-13,-46, 85,-85, 46, 13,-67, 90,-73, 22, 38,-82, 88,-54, -4, 61,-90, 78,-31},
261  { 25,-70, 90,-80, 43,  9,-57, 87,-87, 57, -9,-43, 80,-90, 70,-25,-25, 70,-90, 80,-43, -9, 57,-87, 87,-57,  9, 43,-80, 90,-70, 25},
262  { 22,-61, 85,-90, 73,-38, -4, 46,-78, 90,-82, 54,-13,-31, 67,-88, 88,-67, 31, 13,-54, 82,-90, 78,-46,  4, 38,-73, 90,-85, 61,-22},
263  { 18,-50, 75,-89, 89,-75, 50,-18,-18, 50,-75, 89,-89, 75,-50, 18, 18,-50, 75,-89, 89,-75, 50,-18,-18, 50,-75, 89,-89, 75,-50, 18},
264  { 13,-38, 61,-78, 88,-90, 85,-73, 54,-31,  4, 22,-46, 67,-82, 90,-90, 82,-67, 46,-22, -4, 31,-54, 73,-85, 90,-88, 78,-61, 38,-13},
265  {  9,-25, 43,-57, 70,-80, 87,-90, 90,-87, 80,-70, 57,-43, 25, -9, -9, 25,-43, 57,-70, 80,-87, 90,-90, 87,-80, 70,-57, 43,-25,  9},
266  {  4,-13, 22,-31, 38,-46, 54,-61, 67,-73, 78,-82, 85,-88, 90,-90, 90,-90, 88,-85, 82,-78, 73,-67, 61,-54, 46,-38, 31,-22, 13, -4}
267};
268
269const UChar g_aucChromaScale[58]=
270{
271   0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,
272  17,18,19,20,21,22,23,24,25,26,27,28,29,29,30,31,32,
273  33,33,34,34,35,35,36,36,37,37,38,39,40,41,42,43,44,
274  45,46,47,48,49,50,51
275};
276
277
278// Mode-Dependent DCT/DST
279const Short g_as_DST_MAT_4 [4][4]=
280{
281  {29,   55,    74,   84},
282  {74,   74,    0 ,  -74},
283  {84,  -29,   -74,   55},
284  {55,  -84,    74,  -29},
285};
286
287
288// ====================================================================================================================
289// ADI
290// ====================================================================================================================
291
292#if FAST_UDI_USE_MPM
293const UChar g_aucIntraModeNumFast[MAX_CU_DEPTH] =
294{
295  3,  //   2x2
296  8,  //   4x4
297  8,  //   8x8
298  3,  //  16x16   
299  3,  //  32x32   
300  3   //  64x64   
301};
302#else // FAST_UDI_USE_MPM
303const UChar g_aucIntraModeNumFast[MAX_CU_DEPTH] =
304{
305  3,  //   2x2
306  9,  //   4x4
307  9,  //   8x8
308  4,  //  16x16   33
309  4,  //  32x32   33
310  5   //  64x64   33
311};
312#endif // FAST_UDI_USE_MPM
313
314// chroma
315
316const UChar g_aucConvertTxtTypeToIdx[4] = { 0, 1, 1, 2 };
317
318
319// ====================================================================================================================
320// Bit-depth
321// ====================================================================================================================
322
323Int  g_bitDepthY = 8;
324Int  g_bitDepthC = 8;
325
326UInt g_uiPCMBitDepthLuma     = 8;    // PCM bit-depth
327UInt g_uiPCMBitDepthChroma   = 8;    // PCM bit-depth
328
329#if H_3D_DIM_DMM
330// ====================================================================================================================
331// Depth coding modes
332// ====================================================================================================================
333const WedgeResolution g_dmmWedgeResolution[6] = 
334{
335  HALF_PEL,    //   4x4
336  HALF_PEL,    //   8x8
337  FULL_PEL,    //  16x16
338  DOUBLE_PEL,  //  32x32
339  DOUBLE_PEL,  //  64x64
340  DOUBLE_PEL   // 128x128
341};
342
343const UChar g_dmm1TabIdxBits[6] =
344{ //2x2   4x4   8x8 16x16 32x32 64x64
345     0,    7,   10,   11,   11,   13 };
346
347const UChar g_dmm3IntraTabIdxBits[6] =
348{ //2x2   4x4   8x8 16x16 32x32 64x64
349     0,    4,    7,    8,    8,    0 };
350
351extern std::vector< std::vector<TComWedgelet> >   g_dmmWedgeLists;
352extern std::vector< std::vector<TComWedgeRef> >   g_dmmWedgeRefLists;
353extern std::vector< std::vector<TComWedgeNode> >  g_dmmWedgeNodeLists;
354#endif
355
356// ====================================================================================================================
357// Misc.
358// ====================================================================================================================
359
360Char  g_aucConvertToBit  [ MAX_CU_SIZE+1 ];
361#if MTK_LOW_LATENCY_IC_ENCODING_H0086
362UInt g_aICEnableCANDIDATE[10] = { 0, };
363UInt g_aICEnableNUM[ 10 ] = { 0, };
364Int g_lastlayer=0;
365#endif
366#if ENC_DEC_TRACE
367FILE*  g_hTrace = NULL;
368const Bool g_bEncDecTraceEnable  = true;
369const Bool g_bEncDecTraceDisable = false;
370Bool   g_HLSTraceEnable = true;
371Bool   g_bJustDoIt = false;
372UInt64 g_nSymbolCounter = 0;
373#if H_MV_ENC_DEC_TRAC
374Bool g_traceCU = true; 
375Bool g_tracePU = true; 
376Bool g_traceTU = true; 
377Bool g_disableHLSTrace = false; 
378UInt64 g_stopAtCounter       = 0; 
379Bool g_traceCopyBack         = false; 
380Bool g_decTraceDispDer       = false; 
381Bool g_decTraceMvFromMerge   = false; 
382Bool g_stopAtPos             = false; 
383Bool g_outputPos             = false; 
384#endif
385#endif
386// ====================================================================================================================
387// Scanning order & context model mapping
388// ====================================================================================================================
389
390// scanning order table
391UInt* g_auiSigLastScan[ 3 ][ MAX_CU_DEPTH ];
392
393const UInt g_sigLastScan8x8[ 3 ][ 4 ] =
394{
395  {0, 2, 1, 3},
396  {0, 1, 2, 3},
397  {0, 2, 1, 3}
398};
399UInt g_sigLastScanCG32x32[ 64 ];
400
401const UInt g_uiMinInGroup[ 10 ] = {0,1,2,3,4,6,8,12,16,24};
402const UInt g_uiGroupIdx[ 32 ]   = {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};
403
404Void initSigLastScan(UInt* pBuffD, UInt* pBuffH, UInt* pBuffV, Int iWidth, Int iHeight)
405{
406  const UInt  uiNumScanPos  = UInt( iWidth * iWidth );
407  UInt        uiNextScanPos = 0;
408
409  if( iWidth < 16 )
410  {
411  UInt* pBuffTemp = pBuffD;
412  if( iWidth == 8 )
413  {
414    pBuffTemp = g_sigLastScanCG32x32;
415  }
416  for( UInt uiScanLine = 0; uiNextScanPos < uiNumScanPos; uiScanLine++ )
417  {
418    Int    iPrimDim  = Int( uiScanLine );
419    Int    iScndDim  = 0;
420    while( iPrimDim >= iWidth )
421    {
422      iScndDim++;
423      iPrimDim--;
424    }
425    while( iPrimDim >= 0 && iScndDim < iWidth )
426    {
427      pBuffTemp[ uiNextScanPos ] = iPrimDim * iWidth + iScndDim ;
428      uiNextScanPos++;
429      iScndDim++;
430      iPrimDim--;
431    }
432  }
433  }
434  if( iWidth > 4 )
435  {
436    UInt uiNumBlkSide = iWidth >> 2;
437    UInt uiNumBlks    = uiNumBlkSide * uiNumBlkSide;
438    UInt log2Blk      = g_aucConvertToBit[ uiNumBlkSide ] + 1;
439
440    for( UInt uiBlk = 0; uiBlk < uiNumBlks; uiBlk++ )
441    {
442      uiNextScanPos   = 0;
443      UInt initBlkPos = g_auiSigLastScan[ SCAN_DIAG ][ log2Blk ][ uiBlk ];
444      if( iWidth == 32 )
445      {
446        initBlkPos = g_sigLastScanCG32x32[ uiBlk ];
447      }
448      UInt offsetY    = initBlkPos / uiNumBlkSide;
449      UInt offsetX    = initBlkPos - offsetY * uiNumBlkSide;
450      UInt offsetD    = 4 * ( offsetX + offsetY * iWidth );
451      UInt offsetScan = 16 * uiBlk;
452      for( UInt uiScanLine = 0; uiNextScanPos < 16; uiScanLine++ )
453      {
454        Int    iPrimDim  = Int( uiScanLine );
455        Int    iScndDim  = 0;
456        while( iPrimDim >= 4 )
457        {
458          iScndDim++;
459          iPrimDim--;
460        }
461        while( iPrimDim >= 0 && iScndDim < 4 )
462        {
463          pBuffD[ uiNextScanPos + offsetScan ] = iPrimDim * iWidth + iScndDim + offsetD;
464          uiNextScanPos++;
465          iScndDim++;
466          iPrimDim--;
467        }
468      }
469    }
470  }
471 
472  UInt uiCnt = 0;
473  if( iWidth > 2 )
474  {
475    UInt numBlkSide = iWidth >> 2;
476    for(Int blkY=0; blkY < numBlkSide; blkY++)
477    {
478      for(Int blkX=0; blkX < numBlkSide; blkX++)
479      {
480        UInt offset    = blkY * 4 * iWidth + blkX * 4;
481        for(Int y=0; y < 4; y++)
482        {
483          for(Int x=0; x < 4; x++)
484          {
485            pBuffH[uiCnt] = y*iWidth + x + offset;
486            uiCnt ++;
487          }
488        }
489      }
490    }
491
492    uiCnt = 0;
493    for(Int blkX=0; blkX < numBlkSide; blkX++)
494    {
495      for(Int blkY=0; blkY < numBlkSide; blkY++)
496      {
497        UInt offset    = blkY * 4 * iWidth + blkX * 4;
498        for(Int x=0; x < 4; x++)
499        {
500          for(Int y=0; y < 4; y++)
501          {
502            pBuffV[uiCnt] = y*iWidth + x + offset;
503            uiCnt ++;
504          }
505        }
506      }
507    }
508  }
509  else
510  {
511  for(Int iY=0; iY < iHeight; iY++)
512  {
513    for(Int iX=0; iX < iWidth; iX++)
514    {
515      pBuffH[uiCnt] = iY*iWidth + iX;
516      uiCnt ++;
517    }
518  }
519
520  uiCnt = 0;
521  for(Int iX=0; iX < iWidth; iX++)
522  {
523    for(Int iY=0; iY < iHeight; iY++)
524    {
525      pBuffV[uiCnt] = iY*iWidth + iX;
526      uiCnt ++;
527    }
528  }   
529  }
530}
531
532Int g_quantTSDefault4x4[16] =
533{
534  16,16,16,16,
535  16,16,16,16,
536  16,16,16,16,
537  16,16,16,16
538};
539
540Int g_quantIntraDefault8x8[64] =
541{
542  16,16,16,16,17,18,21,24,
543  16,16,16,16,17,19,22,25,
544  16,16,17,18,20,22,25,29,
545  16,16,18,21,24,27,31,36,
546  17,17,20,24,30,35,41,47,
547  18,19,22,27,35,44,54,65,
548  21,22,25,31,41,54,70,88,
549  24,25,29,36,47,65,88,115
550};
551
552Int g_quantInterDefault8x8[64] =
553{
554  16,16,16,16,17,18,20,24,
555  16,16,16,17,18,20,24,25,
556  16,16,17,18,20,24,25,28,
557  16,17,18,20,24,25,28,33,
558  17,18,20,24,25,28,33,41,
559  18,20,24,25,28,33,41,54,
560  20,24,25,28,33,41,54,71,
561  24,25,28,33,41,54,71,91
562};
563UInt g_scalingListSize   [4] = {16,64,256,1024}; 
564UInt g_scalingListSizeX  [4] = { 4, 8, 16,  32};
565UInt g_scalingListNum[SCALING_LIST_SIZE_NUM]={6,6,6,2};
566Int  g_eTTable[4] = {0,3,1,2};
567
568#if H_MV_ENC_DEC_TRAC
569#if ENC_DEC_TRACE
570Void stopAtPos( Int poc, Int layerId, Int cuPelX, Int cuPelY, Int cuWidth, Int cuHeight )
571{
572
573  if ( g_outputPos ) 
574  {
575    std::cout << "POC\t"        << poc
576              << "\tLayerId\t"  << layerId
577              << "\tCuPelX\t"   << cuPelX 
578              << "\tCuPelY\t"   << cuPelY
579              << "\tCuWidth\t"  << cuWidth
580              << "\tCuHeight\t" << cuHeight
581              << std::endl; 
582  }
583
584  Bool stopFlag = false; 
585  if ( g_stopAtPos && poc == 0 && layerId == 1 )
586  {
587    Bool stopAtCU = true; 
588    if ( stopAtCU )        // Stop at CU with specific size
589    {   
590      stopFlag = ( cuPelX  == 888 ) && ( cuPelY  == 248 ) && ( cuWidth == 8 ) && ( cuHeight == 8); 
591    }
592    else
593    {                     // Stop at specific position
594      Int xPos = 888; 
595      Int yPos = 248; 
596
597      Int cuPelXEnd = cuPelX + cuWidth  - 1; 
598      Int cuPelYEnd = cuPelY + cuHeight - 1; 
599
600      stopFlag = (cuPelX <= xPos ) && (cuPelXEnd >= xPos ) && (cuPelY <= yPos ) && (cuPelYEnd >= yPos ); 
601    }
602  }
603 
604  if ( stopFlag )
605  { // Set breakpoint here.
606    std::cout << "Stop position. Break point here." << std::endl; 
607  } 
608}
609
610Void writeToTraceFile( const Char* symbolName, Int val, Bool doIt )
611{
612  if ( ( ( g_nSymbolCounter >= COUNTER_START && g_nSymbolCounter <= COUNTER_END )|| g_bJustDoIt ) && doIt  ) 
613  {
614    if ( g_stopAtCounter == g_nSymbolCounter )
615    {
616      std::cout << "Break point here." << std::endl; 
617    }
618    fprintf( g_hTrace, "%8lld  ", g_nSymbolCounter++ );
619    fprintf( g_hTrace, "%-50s       : %d\n", symbolName, val );     
620    fflush ( g_hTrace );
621    g_nSymbolCounter++; 
622  }
623}
624
625Void writeToTraceFile( const Char* symbolName, Bool doIt )
626{
627  if ( ( ( g_nSymbolCounter >= COUNTER_START && g_nSymbolCounter <= COUNTER_END )|| g_bJustDoIt ) && doIt  ) 
628  {
629    fprintf( g_hTrace, "%s", symbolName );   
630    fflush ( g_hTrace );
631    g_nSymbolCounter++; 
632  }
633}
634
635#endif
636#endif
637#if H_3D_DIM_DMM
638std::vector< std::vector<TComWedgelet>  > g_dmmWedgeLists;
639std::vector< std::vector<TComWedgeRef>  > g_dmmWedgeRefLists;
640std::vector< std::vector<TComWedgeNode> > g_dmmWedgeNodeLists;
641
642Void initWedgeLists( Bool initNodeList )
643{
644  if( !g_dmmWedgeLists.empty() ) return;
645
646  for( UInt ui = g_aucConvertToBit[DIM_MIN_SIZE]; ui < (g_aucConvertToBit[DIM_MAX_SIZE]+1); ui++ )
647  {
648    UInt uiWedgeBlockSize = ((UInt)DIM_MIN_SIZE)<<ui;
649    std::vector<TComWedgelet> acWedgeList;
650    std::vector<TComWedgeRef> acWedgeRefList;
651    createWedgeList( uiWedgeBlockSize, uiWedgeBlockSize, acWedgeList, acWedgeRefList, g_dmmWedgeResolution[ui] );
652    g_dmmWedgeLists.push_back( acWedgeList );
653    g_dmmWedgeRefLists.push_back( acWedgeRefList );
654
655    if( initNodeList )
656    {
657      // create WedgeNodeList
658      std::vector<TComWedgeNode> acWedgeNodeList;
659      for( UInt uiPos = 0; uiPos < acWedgeList.size(); uiPos++ )
660      {
661        if( acWedgeList[uiPos].getIsCoarse() )
662        {
663          TComWedgeNode cWedgeNode;
664          cWedgeNode.setPatternIdx( uiPos );
665
666          UInt uiRefPos = 0;
667          for( Int iOffS = -1; iOffS <= 1; iOffS++ )
668          {
669            for( Int iOffE = -1; iOffE <= 1; iOffE++ )
670            {
671              if( iOffS == 0 && iOffE == 0 ) { continue; }
672
673              Int iSx = (Int)acWedgeList[uiPos].getStartX();
674              Int iSy = (Int)acWedgeList[uiPos].getStartY();
675              Int iEx = (Int)acWedgeList[uiPos].getEndX();
676              Int iEy = (Int)acWedgeList[uiPos].getEndY();
677
678              switch( acWedgeList[uiPos].getOri() )
679              {
680              case( 0 ): { iSx += iOffS; iEy += iOffE; } break;
681              case( 1 ): { iSy += iOffS; iEx -= iOffE; } break;
682              case( 2 ): { iSx -= iOffS; iEy -= iOffE; } break;
683              case( 3 ): { iSy -= iOffS; iEx += iOffE; } break;
684              case( 4 ): { iSx += iOffS; iEx += iOffE; } break;
685              case( 5 ): { iSy += iOffS; iEy += iOffE; } break;
686              default: assert( 0 );
687              }
688
689              for( UInt k = 0; k < acWedgeRefList.size(); k++ )
690              {
691                if( iSx == (Int)acWedgeRefList[k].getStartX() && 
692                  iSy == (Int)acWedgeRefList[k].getStartY() && 
693                  iEx == (Int)acWedgeRefList[k].getEndX()   && 
694                  iEy == (Int)acWedgeRefList[k].getEndY()      )
695                {
696                  if( acWedgeRefList[k].getRefIdx() != cWedgeNode.getPatternIdx() )
697                  {
698                    Bool bNew = true;
699                    for( UInt m = 0; m < uiRefPos; m++ ) { if( acWedgeRefList[k].getRefIdx() == cWedgeNode.getRefineIdx( m ) ) { bNew = false; break; } }
700
701                    if( bNew ) 
702                    {
703                      cWedgeNode.setRefineIdx( acWedgeRefList[k].getRefIdx(), uiRefPos );
704                      uiRefPos++;
705                      break;
706                    }
707                  }
708                }
709              }
710            }
711          }
712          acWedgeNodeList.push_back( cWedgeNode );
713        }
714      }
715      g_dmmWedgeNodeLists.push_back( acWedgeNodeList );
716    }
717  }
718}
719
720Void createWedgeList( UInt uiWidth, UInt uiHeight, std::vector<TComWedgelet> &racWedgeList, std::vector<TComWedgeRef> &racWedgeRefList, WedgeResolution eWedgeRes )
721{
722  assert( uiWidth == uiHeight );
723
724  UChar    uhStartX = 0,    uhStartY = 0,    uhEndX = 0,    uhEndY = 0;
725  Int   iStepStartX = 0, iStepStartY = 0, iStepEndX = 0, iStepEndY = 0;
726
727  UInt uiBlockSize = 0;
728  switch( eWedgeRes )
729  {
730  case( DOUBLE_PEL ): { uiBlockSize = (uiWidth>>1); break; }
731  case(   FULL_PEL ): { uiBlockSize =  uiWidth;     break; }
732  case(   HALF_PEL ): { uiBlockSize = (uiWidth<<1); break; }
733  }
734
735  TComWedgelet cTempWedgelet( uiWidth, uiHeight );
736  for( UInt uiOri = 0; uiOri < 6; uiOri++ )
737  {
738    // init the edge line parameters for each of the 6 wedgelet types
739    switch( uiOri )
740    {
741    case( 0 ): {  uhStartX = 0;               uhStartY = 0;               uhEndX = 0;               uhEndY = 0;               iStepStartX = +1; iStepStartY =  0; iStepEndX =  0; iStepEndY = +1; break; }
742    case( 1 ): {  uhStartX = (uiBlockSize-1); uhStartY = 0;               uhEndX = (uiBlockSize-1); uhEndY = 0;               iStepStartX =  0; iStepStartY = +1; iStepEndX = -1; iStepEndY =  0; break; }
743    case( 2 ): {  uhStartX = (uiBlockSize-1); uhStartY = (uiBlockSize-1); uhEndX = (uiBlockSize-1); uhEndY = (uiBlockSize-1); iStepStartX = -1; iStepStartY =  0; iStepEndX =  0; iStepEndY = -1; break; }
744    case( 3 ): {  uhStartX = 0;               uhStartY = (uiBlockSize-1); uhEndX = 0;               uhEndY = (uiBlockSize-1); iStepStartX =  0; iStepStartY = -1; iStepEndX = +1; iStepEndY =  0; break; }
745    case( 4 ): {  uhStartX = 0;               uhStartY = 0;               uhEndX = 0;               uhEndY = (uiBlockSize-1); iStepStartX = +1; iStepStartY =  0; iStepEndX = +1; iStepEndY =  0; break; }
746    case( 5 ): {  uhStartX = (uiBlockSize-1); uhStartY = 0;               uhEndX = 0;               uhEndY = 0;               iStepStartX =  0; iStepStartY = +1; iStepEndX =  0; iStepEndY = +1; break; }
747    }
748
749    for( Int iK = 0; iK < uiBlockSize; iK++ )
750    {
751      for( Int iL = 0; iL < uiBlockSize; iL++ )
752      {
753        cTempWedgelet.setWedgelet( uhStartX + (iK*iStepStartX) , uhStartY + (iK*iStepStartY), uhEndX + (iL*iStepEndX), uhEndY + (iL*iStepEndY), (UChar)uiOri, eWedgeRes, ((iL%2)==0 && (iK%2)==0) );
754        addWedgeletToList( cTempWedgelet, racWedgeList, racWedgeRefList );
755      }
756    }
757  }
758
759
760}
761
762Void addWedgeletToList( TComWedgelet cWedgelet, std::vector<TComWedgelet> &racWedgeList, std::vector<TComWedgeRef> &racWedgeRefList )
763{
764  Bool bValid = cWedgelet.checkNotPlain();
765  if( bValid )
766  {
767    for( UInt uiPos = 0; uiPos < racWedgeList.size(); uiPos++ )
768    {
769      if( cWedgelet.checkIdentical( racWedgeList[uiPos].getPattern() ) )
770      {
771        TComWedgeRef cWedgeRef;
772        cWedgeRef.setWedgeRef( cWedgelet.getStartX(), cWedgelet.getStartY(), cWedgelet.getEndX(), cWedgelet.getEndY(), uiPos );
773        racWedgeRefList.push_back( cWedgeRef );
774        bValid = false;
775        return;
776      }
777    }
778  }
779  if( bValid )
780  {
781    for( UInt uiPos = 0; uiPos < racWedgeList.size(); uiPos++ )
782    {
783      if( cWedgelet.checkInvIdentical( racWedgeList[uiPos].getPattern() ) )
784      {
785        TComWedgeRef cWedgeRef;
786        cWedgeRef.setWedgeRef( cWedgelet.getStartX(), cWedgelet.getStartY(), cWedgelet.getEndX(), cWedgelet.getEndY(), uiPos );
787        racWedgeRefList.push_back( cWedgeRef );
788        bValid = false;
789        return;
790      }
791    }
792  }
793  if( bValid )
794  {
795    cWedgelet.findClosestAngle();
796    racWedgeList.push_back( cWedgelet );
797    TComWedgeRef cWedgeRef;
798    cWedgeRef.setWedgeRef( cWedgelet.getStartX(), cWedgelet.getStartY(), cWedgelet.getEndX(), cWedgelet.getEndY(), (UInt)(racWedgeList.size()-1) );
799    racWedgeRefList.push_back( cWedgeRef );
800  }
801}
802#endif //H_3D_DIM_DMM
803
804//! \}
Note: See TracBrowser for help on using the repository browser.