source: SHVCSoftware/branches/SHM-dev/source/Lib/TLibCommon/TComRom.cpp @ 1606

Last change on this file since 1606 was 1600, checked in by seregin, 7 years ago

fix for the ticket #92
If the current picture min CU size is larger than 16x16, 16x16 granularity as in the inter-layer motion resampling should be used for the inter-layer motion derivation.
LAYER_CTB macro is enabled as well, since different zig-zag scannings should be used.

  • Property svn:eol-style set to native
File size: 30.8 KB
RevLine 
[313]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
[1029]4 * granted under this license.
[313]5 *
[1550]6 * Copyright (c) 2010-2016, ITU/ISO/IEC
[313]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>
[1029]42#include <iomanip>
43#include <assert.h>
44#include "TComDataCU.h"
45#include "Debug.h"
[313]46// ====================================================================================================================
47// Initialize / destroy functions
48// ====================================================================================================================
49
50//! \ingroup TLibCommon
51//! \{
52
[1442]53const TChar* nalUnitTypeToString(NalUnitType type)
[1353]54{
55#if SVC_EXTENSION
56  switch (type)
57  {
[1377]58    case NAL_UNIT_CODED_SLICE_TRAIL_R:    return "   TRAIL_R";
59    case NAL_UNIT_CODED_SLICE_TRAIL_N:    return "   TRAIL_N";
60    case NAL_UNIT_CODED_SLICE_TSA_R:      return "     TSA_R";
61    case NAL_UNIT_CODED_SLICE_TSA_N:      return "     TSA_N";
62    case NAL_UNIT_CODED_SLICE_STSA_R:     return "    STSA_R";
63    case NAL_UNIT_CODED_SLICE_STSA_N:     return "    STSA_N";
64    case NAL_UNIT_CODED_SLICE_BLA_W_LP:   return "  BLA_W_LP";
65    case NAL_UNIT_CODED_SLICE_BLA_W_RADL: return "BLA_W_RADL";
66    case NAL_UNIT_CODED_SLICE_BLA_N_LP:   return "  BLA_N_LP";
67    case NAL_UNIT_CODED_SLICE_IDR_W_RADL: return "IDR_W_RADL";
68    case NAL_UNIT_CODED_SLICE_IDR_N_LP:   return "  IDR_N_LP";
69    case NAL_UNIT_CODED_SLICE_CRA:        return "       CRA";
70    case NAL_UNIT_CODED_SLICE_RADL_R:     return "    RADL_R";
71    case NAL_UNIT_CODED_SLICE_RADL_N:     return "    RADL_N";
72    case NAL_UNIT_CODED_SLICE_RASL_R:     return "    RASL_R";
73    case NAL_UNIT_CODED_SLICE_RASL_N:     return "    RASL_N";
74    case NAL_UNIT_VPS:                    return "       VPS";
75    case NAL_UNIT_SPS:                    return "       SPS";
76    case NAL_UNIT_PPS:                    return "       PPS";
77    case NAL_UNIT_ACCESS_UNIT_DELIMITER:  return "       AUD";
78    case NAL_UNIT_EOS:                    return "       EOS";
79    case NAL_UNIT_EOB:                    return "       EOB";
80    case NAL_UNIT_FILLER_DATA:            return "    FILLER";
81    case NAL_UNIT_PREFIX_SEI:             return "       SEI";
82    case NAL_UNIT_SUFFIX_SEI:             return "       SEI";
83    default:                              return "       UNK";
84  }
85#else
86  switch (type)
87  {
[1353]88  case NAL_UNIT_CODED_SLICE_TRAIL_R:    return "TRAIL_R";
89  case NAL_UNIT_CODED_SLICE_TRAIL_N:    return "TRAIL_N";
90  case NAL_UNIT_CODED_SLICE_TSA_R:      return "TSA_R";
91  case NAL_UNIT_CODED_SLICE_TSA_N:      return "TSA_N";
92  case NAL_UNIT_CODED_SLICE_STSA_R:     return "STSA_R";
93  case NAL_UNIT_CODED_SLICE_STSA_N:     return "STSA_N";
94  case NAL_UNIT_CODED_SLICE_BLA_W_LP:   return "BLA_W_LP";
95  case NAL_UNIT_CODED_SLICE_BLA_W_RADL: return "BLA_W_RADL";
96  case NAL_UNIT_CODED_SLICE_BLA_N_LP:   return "BLA_N_LP";
97  case NAL_UNIT_CODED_SLICE_IDR_W_RADL: return "IDR_W_RADL";
98  case NAL_UNIT_CODED_SLICE_IDR_N_LP:   return "IDR_N_LP";
99  case NAL_UNIT_CODED_SLICE_CRA:        return "CRA";
100  case NAL_UNIT_CODED_SLICE_RADL_R:     return "RADL_R";
101  case NAL_UNIT_CODED_SLICE_RADL_N:     return "RADL_N";
102  case NAL_UNIT_CODED_SLICE_RASL_R:     return "RASL_R";
103  case NAL_UNIT_CODED_SLICE_RASL_N:     return "RASL_N";
104  case NAL_UNIT_VPS:                    return "VPS";
105  case NAL_UNIT_SPS:                    return "SPS";
106  case NAL_UNIT_PPS:                    return "PPS";
107  case NAL_UNIT_ACCESS_UNIT_DELIMITER:  return "AUD";
108  case NAL_UNIT_EOS:                    return "EOS";
109  case NAL_UNIT_EOB:                    return "EOB";
110  case NAL_UNIT_FILLER_DATA:            return "FILLER";
111  case NAL_UNIT_PREFIX_SEI:             return "Prefix SEI";
112  case NAL_UNIT_SUFFIX_SEI:             return "Suffix SEI";
113  default:                              return "UNK";
114  }
115#endif
116}
117
[1029]118class ScanGenerator
119{
120private:
121  UInt m_line, m_column;
122  const UInt m_blockWidth, m_blockHeight;
123  const UInt m_stride;
124  const COEFF_SCAN_TYPE m_scanType;
125
126public:
127  ScanGenerator(UInt blockWidth, UInt blockHeight, UInt stride, COEFF_SCAN_TYPE scanType)
128    : m_line(0), m_column(0), m_blockWidth(blockWidth), m_blockHeight(blockHeight), m_stride(stride), m_scanType(scanType)
129  { }
130
131  UInt GetCurrentX() const { return m_column; }
132  UInt GetCurrentY() const { return m_line; }
133
134  UInt GetNextIndex(UInt blockOffsetX, UInt blockOffsetY)
135  {
136    Int rtn=((m_line + blockOffsetY) * m_stride) + m_column + blockOffsetX;
137
138    //advance line and column to the next position
139    switch (m_scanType)
140    {
141      //------------------------------------------------
142
143      case SCAN_DIAG:
144        {
145          if ((m_column == (m_blockWidth - 1)) || (m_line == 0)) //if we reach the end of a rank, go diagonally down to the next one
146          {
147            m_line   += m_column + 1;
148            m_column  = 0;
149
150            if (m_line >= m_blockHeight) //if that takes us outside the block, adjust so that we are back on the bottom row
151            {
152              m_column += m_line - (m_blockHeight - 1);
153              m_line    = m_blockHeight - 1;
154            }
155          }
156          else
157          {
158            m_column++;
159            m_line--;
160          }
161        }
162        break;
163
164      //------------------------------------------------
165
166      case SCAN_HOR:
167        {
168          if (m_column == (m_blockWidth - 1))
169          {
170            m_line++;
171            m_column = 0;
172          }
[1246]173          else
174          {
175            m_column++;
176          }
[1029]177        }
178        break;
179
180      //------------------------------------------------
181
182      case SCAN_VER:
183        {
184          if (m_line == (m_blockHeight - 1))
185          {
186            m_column++;
187            m_line = 0;
188          }
[1246]189          else
190          {
191            m_line++;
192          }
[1029]193        }
194        break;
195
196      //------------------------------------------------
197
198      default:
199        {
200          std::cerr << "ERROR: Unknown scan type \"" << m_scanType << "\"in ScanGenerator::GetNextIndex" << std::endl;
201          exit(1);
202        }
203        break;
204    }
205
206    return rtn;
207  }
208};
209
[313]210// initialize ROM variables
211Void initROM()
212{
213  Int i, c;
[1029]214
[313]215  // g_aucConvertToBit[ x ]: log2(x/4), if x=4 -> 0, x=8 -> 1, x=16 -> 2, ...
216  ::memset( g_aucConvertToBit,   -1, sizeof( g_aucConvertToBit ) );
217  c=0;
[442]218  for ( i=4; i<=MAX_CU_SIZE; i*=2 )
[313]219  {
220    g_aucConvertToBit[ i ] = c;
221    c++;
222  }
[1029]223
224  // initialise scan orders
225  for(UInt log2BlockHeight = 0; log2BlockHeight < MAX_CU_DEPTH; log2BlockHeight++)
[313]226  {
[1029]227    for(UInt log2BlockWidth = 0; log2BlockWidth < MAX_CU_DEPTH; log2BlockWidth++)
228    {
229      const UInt blockWidth  = 1 << log2BlockWidth;
230      const UInt blockHeight = 1 << log2BlockHeight;
231      const UInt totalValues = blockWidth * blockHeight;
[313]232
[1029]233      //--------------------------------------------------------------------------------------------------
234
235      //non-grouped scan orders
236
237      for (UInt scanTypeIndex = 0; scanTypeIndex < SCAN_NUMBER_OF_TYPES; scanTypeIndex++)
238      {
239        const COEFF_SCAN_TYPE scanType = COEFF_SCAN_TYPE(scanTypeIndex);
240
241        g_scanOrder[SCAN_UNGROUPED][scanType][log2BlockWidth][log2BlockHeight] = new UInt[totalValues];
242
243        ScanGenerator fullBlockScan(blockWidth, blockHeight, blockWidth, scanType);
244
245        for (UInt scanPosition = 0; scanPosition < totalValues; scanPosition++)
246        {
247          g_scanOrder[SCAN_UNGROUPED][scanType][log2BlockWidth][log2BlockHeight][scanPosition] = fullBlockScan.GetNextIndex(0, 0);
248        }
249      }
250
251      //--------------------------------------------------------------------------------------------------
252
253      //grouped scan orders
254
255      const UInt  groupWidth           = 1           << MLS_CG_LOG2_WIDTH;
256      const UInt  groupHeight          = 1           << MLS_CG_LOG2_HEIGHT;
257      const UInt  widthInGroups        = blockWidth  >> MLS_CG_LOG2_WIDTH;
258      const UInt  heightInGroups       = blockHeight >> MLS_CG_LOG2_HEIGHT;
259
260      const UInt  groupSize            = groupWidth    * groupHeight;
261      const UInt  totalGroups          = widthInGroups * heightInGroups;
262
263      for (UInt scanTypeIndex = 0; scanTypeIndex < SCAN_NUMBER_OF_TYPES; scanTypeIndex++)
264      {
265        const COEFF_SCAN_TYPE scanType = COEFF_SCAN_TYPE(scanTypeIndex);
266
267        g_scanOrder[SCAN_GROUPED_4x4][scanType][log2BlockWidth][log2BlockHeight] = new UInt[totalValues];
268
269        ScanGenerator fullBlockScan(widthInGroups, heightInGroups, groupWidth, scanType);
270
271        for (UInt groupIndex = 0; groupIndex < totalGroups; groupIndex++)
272        {
273          const UInt groupPositionY  = fullBlockScan.GetCurrentY();
274          const UInt groupPositionX  = fullBlockScan.GetCurrentX();
275          const UInt groupOffsetX    = groupPositionX * groupWidth;
276          const UInt groupOffsetY    = groupPositionY * groupHeight;
277          const UInt groupOffsetScan = groupIndex     * groupSize;
278
279          ScanGenerator groupScan(groupWidth, groupHeight, blockWidth, scanType);
280
281          for (UInt scanPosition = 0; scanPosition < groupSize; scanPosition++)
282          {
283            g_scanOrder[SCAN_GROUPED_4x4][scanType][log2BlockWidth][log2BlockHeight][groupOffsetScan + scanPosition] = groupScan.GetNextIndex(groupOffsetX, groupOffsetY);
284          }
285
286          fullBlockScan.GetNextIndex(0,0);
287        }
288      }
289
290      //--------------------------------------------------------------------------------------------------
291    }
292  }
[313]293}
294
295Void destroyROM()
296{
[1029]297  for(UInt groupTypeIndex = 0; groupTypeIndex < SCAN_NUMBER_OF_GROUP_TYPES; groupTypeIndex++)
[313]298  {
[1029]299    for (UInt scanOrderIndex = 0; scanOrderIndex < SCAN_NUMBER_OF_TYPES; scanOrderIndex++)
300    {
301      for (UInt log2BlockWidth = 0; log2BlockWidth < MAX_CU_DEPTH; log2BlockWidth++)
302      {
303        for (UInt log2BlockHeight = 0; log2BlockHeight < MAX_CU_DEPTH; log2BlockHeight++)
304        {
305          delete [] g_scanOrder[groupTypeIndex][scanOrderIndex][log2BlockWidth][log2BlockHeight];
306        }
307      }
308    }
[313]309  }
310}
311
312// ====================================================================================================================
313// Data structure related table & variable
314// ====================================================================================================================
[595]315
[1335]316UInt g_auiZscanToRaster [ MAX_NUM_PART_IDXS_IN_CTU_WIDTH*MAX_NUM_PART_IDXS_IN_CTU_WIDTH ] = { 0, };
317UInt g_auiRasterToZscan [ MAX_NUM_PART_IDXS_IN_CTU_WIDTH*MAX_NUM_PART_IDXS_IN_CTU_WIDTH ] = { 0, };
318UInt g_auiRasterToPelX  [ MAX_NUM_PART_IDXS_IN_CTU_WIDTH*MAX_NUM_PART_IDXS_IN_CTU_WIDTH ] = { 0, };
319UInt g_auiRasterToPelY  [ MAX_NUM_PART_IDXS_IN_CTU_WIDTH*MAX_NUM_PART_IDXS_IN_CTU_WIDTH ] = { 0, };
[313]320
[1292]321const UInt g_auiPUOffset[NUMBER_OF_PART_SIZES] = { 0, 8, 4, 4, 2, 10, 1, 5};
[313]322
323Void initZscanToRaster ( Int iMaxDepth, Int iDepth, UInt uiStartVal, UInt*& rpuiCurrIdx )
324{
325  Int iStride = 1 << ( iMaxDepth - 1 );
[1029]326
[313]327  if ( iDepth == iMaxDepth )
328  {
329    rpuiCurrIdx[0] = uiStartVal;
330    rpuiCurrIdx++;
331  }
332  else
333  {
334    Int iStep = iStride >> iDepth;
335    initZscanToRaster( iMaxDepth, iDepth+1, uiStartVal,                     rpuiCurrIdx );
336    initZscanToRaster( iMaxDepth, iDepth+1, uiStartVal+iStep,               rpuiCurrIdx );
337    initZscanToRaster( iMaxDepth, iDepth+1, uiStartVal+iStep*iStride,       rpuiCurrIdx );
338    initZscanToRaster( iMaxDepth, iDepth+1, uiStartVal+iStep*iStride+iStep, rpuiCurrIdx );
339  }
340}
341
342Void initRasterToZscan ( UInt uiMaxCUWidth, UInt uiMaxCUHeight, UInt uiMaxDepth )
343{
344  UInt  uiMinCUWidth  = uiMaxCUWidth  >> ( uiMaxDepth - 1 );
345  UInt  uiMinCUHeight = uiMaxCUHeight >> ( uiMaxDepth - 1 );
[1029]346
[313]347  UInt  uiNumPartInWidth  = (UInt)uiMaxCUWidth  / uiMinCUWidth;
348  UInt  uiNumPartInHeight = (UInt)uiMaxCUHeight / uiMinCUHeight;
[1029]349
[313]350  for ( UInt i = 0; i < uiNumPartInWidth*uiNumPartInHeight; i++ )
351  {
352    g_auiRasterToZscan[ g_auiZscanToRaster[i] ] = i;
353  }
354}
355
356Void initRasterToPelXY ( UInt uiMaxCUWidth, UInt uiMaxCUHeight, UInt uiMaxDepth )
357{
358  UInt    i;
[1029]359
[313]360  UInt* uiTempX = &g_auiRasterToPelX[0];
361  UInt* uiTempY = &g_auiRasterToPelY[0];
[1029]362
[313]363  UInt  uiMinCUWidth  = uiMaxCUWidth  >> ( uiMaxDepth - 1 );
364  UInt  uiMinCUHeight = uiMaxCUHeight >> ( uiMaxDepth - 1 );
[1029]365
[313]366  UInt  uiNumPartInWidth  = uiMaxCUWidth  / uiMinCUWidth;
367  UInt  uiNumPartInHeight = uiMaxCUHeight / uiMinCUHeight;
[1029]368
[313]369  uiTempX[0] = 0; uiTempX++;
370  for ( i = 1; i < uiNumPartInWidth; i++ )
371  {
372    uiTempX[0] = uiTempX[-1] + uiMinCUWidth; uiTempX++;
373  }
374  for ( i = 1; i < uiNumPartInHeight; i++ )
375  {
376    memcpy(uiTempX, uiTempX-uiNumPartInWidth, sizeof(UInt)*uiNumPartInWidth);
377    uiTempX += uiNumPartInWidth;
378  }
[1029]379
[1600]380  uiTempY[0] = 0;
[313]381  for ( i = 1; i < uiNumPartInWidth*uiNumPartInHeight; i++ )
382  {
383    uiTempY[i] = ( i / uiNumPartInWidth ) * uiMinCUWidth;
384  }
[1029]385}
[313]386
[1292]387const Int g_quantScales[SCALING_LIST_REM_NUM] =
[313]388{
389  26214,23302,20560,18396,16384,14564
[1029]390};
[313]391
[1292]392const Int g_invQuantScales[SCALING_LIST_REM_NUM] =
[313]393{
394  40,45,51,57,64,72
395};
396
[1029]397//--------------------------------------------------------------------------------------------------
398
399//structures
400
401#define DEFINE_DST4x4_MATRIX(a,b,c,d) \
402{ \
403  {  a,  b,  c,  d }, \
404  {  c,  c,  0, -c }, \
405  {  d, -a, -c,  b }, \
406  {  b, -d,  c, -a }, \
407}
408
409#define DEFINE_DCT4x4_MATRIX(a,b,c) \
410{ \
411  { a,  a,  a,  a}, \
412  { b,  c, -c, -b}, \
413  { a, -a, -a,  a}, \
414  { c, -b,  b, -c}  \
415}
416
417#define DEFINE_DCT8x8_MATRIX(a,b,c,d,e,f,g) \
418{ \
419  { a,  a,  a,  a,  a,  a,  a,  a}, \
420  { d,  e,  f,  g, -g, -f, -e, -d}, \
421  { b,  c, -c, -b, -b, -c,  c,  b}, \
422  { e, -g, -d, -f,  f,  d,  g, -e}, \
423  { a, -a, -a,  a,  a, -a, -a,  a}, \
424  { f, -d,  g,  e, -e, -g,  d, -f}, \
425  { c, -b,  b, -c, -c,  b, -b,  c}, \
426  { g, -f,  e, -d,  d, -e,  f, -g}  \
427}
428
429#define DEFINE_DCT16x16_MATRIX(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) \
430{ \
431  { a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a,  a}, \
432  { h,  i,  j,  k,  l,  m,  n,  o, -o, -n, -m, -l, -k, -j, -i, -h}, \
433  { d,  e,  f,  g, -g, -f, -e, -d, -d, -e, -f, -g,  g,  f,  e,  d}, \
434  { i,  l,  o, -m, -j, -h, -k, -n,  n,  k,  h,  j,  m, -o, -l, -i}, \
435  { b,  c, -c, -b, -b, -c,  c,  b,  b,  c, -c, -b, -b, -c,  c,  b}, \
436  { j,  o, -k, -i, -n,  l,  h,  m, -m, -h, -l,  n,  i,  k, -o, -j}, \
437  { e, -g, -d, -f,  f,  d,  g, -e, -e,  g,  d,  f, -f, -d, -g,  e}, \
438  { k, -m, -i,  o,  h,  n, -j, -l,  l,  j, -n, -h, -o,  i,  m, -k}, \
439  { a, -a, -a,  a,  a, -a, -a,  a,  a, -a, -a,  a,  a, -a, -a,  a}, \
440  { l, -j, -n,  h, -o, -i,  m,  k, -k, -m,  i,  o, -h,  n,  j, -l}, \
441  { f, -d,  g,  e, -e, -g,  d, -f, -f,  d, -g, -e,  e,  g, -d,  f}, \
442  { m, -h,  l,  n, -i,  k,  o, -j,  j, -o, -k,  i, -n, -l,  h, -m}, \
443  { c, -b,  b, -c, -c,  b, -b,  c,  c, -b,  b, -c, -c,  b, -b,  c}, \
444  { n, -k,  h, -j,  m,  o, -l,  i, -i,  l, -o, -m,  j, -h,  k, -n}, \
445  { g, -f,  e, -d,  d, -e,  f, -g, -g,  f, -e,  d, -d,  e, -f,  g}, \
446  { o, -n,  m, -l,  k, -j,  i, -h,  h, -i,  j, -k,  l, -m,  n, -o}  \
447}
448
449#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) \
450{ \
451  { 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}, \
452  { 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}, \
453  { 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}, \
454  { 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}, \
455  { 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}, \
456  { 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}, \
457  { 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}, \
458  { 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}, \
459  { 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}, \
460  { 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}, \
461  { 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}, \
462  { 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}, \
463  { 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}, \
464  { 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}, \
465  { 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}, \
466  { 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}, \
467  { 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}, \
468  { 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}, \
469  { 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}, \
470  { 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}, \
471  { 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}, \
472  { 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}, \
473  { 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}, \
474  { 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}, \
475  { 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}, \
476  { 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}, \
477  { 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}, \
478  { 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}, \
479  { 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}, \
480  { 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}, \
481  { 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}, \
482  { 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}  \
483}
484
485//--------------------------------------------------------------------------------------------------
486
487//coefficients
488
489#if RExt__HIGH_PRECISION_FORWARD_TRANSFORM
490const TMatrixCoeff g_aiT4 [TRANSFORM_NUMBER_OF_DIRECTIONS][4][4]   =
[313]491{
[1029]492  DEFINE_DCT4x4_MATRIX  (16384, 21266,  9224),
493  DEFINE_DCT4x4_MATRIX  (   64,    83,    36)
[313]494};
495
[1029]496const TMatrixCoeff g_aiT8 [TRANSFORM_NUMBER_OF_DIRECTIONS][8][8]   =
[313]497{
[1029]498  DEFINE_DCT8x8_MATRIX  (16384, 21266,  9224, 22813, 19244, 12769,  4563),
499  DEFINE_DCT8x8_MATRIX  (   64,    83,    36,    89,    75,    50,    18)
[313]500};
501
[1029]502const TMatrixCoeff g_aiT16[TRANSFORM_NUMBER_OF_DIRECTIONS][16][16] =
[313]503{
[1029]504  DEFINE_DCT16x16_MATRIX(16384, 21266,  9224, 22813, 19244, 12769,  4563, 23120, 22063, 20450, 17972, 14642, 11109,  6446,  2316),
505  DEFINE_DCT16x16_MATRIX(   64,    83,    36,    89,    75,    50,    18,    90,    87,    80,    70,    57,    43,    25,     9)
[313]506};
507
[1029]508const TMatrixCoeff g_aiT32[TRANSFORM_NUMBER_OF_DIRECTIONS][32][32] =
[313]509{
[1029]510  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),
511  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)
[313]512};
513
[1029]514const TMatrixCoeff g_as_DST_MAT_4[TRANSFORM_NUMBER_OF_DIRECTIONS][4][4] =
[313]515{
[1029]516  DEFINE_DST4x4_MATRIX( 7424, 14081, 18893, 21505),
517  DEFINE_DST4x4_MATRIX(   29,    55,    74,    84)
[313]518};
519
[1029]520#else
[313]521
[1029]522const TMatrixCoeff g_aiT4 [TRANSFORM_NUMBER_OF_DIRECTIONS][4][4]   =
[313]523{
[1029]524  DEFINE_DCT4x4_MATRIX  (   64,    83,    36),
525  DEFINE_DCT4x4_MATRIX  (   64,    83,    36)
[313]526};
527
[1029]528const TMatrixCoeff g_aiT8 [TRANSFORM_NUMBER_OF_DIRECTIONS][8][8]   =
529{
530  DEFINE_DCT8x8_MATRIX  (   64,    83,    36,    89,    75,    50,    18),
531  DEFINE_DCT8x8_MATRIX  (   64,    83,    36,    89,    75,    50,    18)
532};
[313]533
[1029]534const TMatrixCoeff g_aiT16[TRANSFORM_NUMBER_OF_DIRECTIONS][16][16] =
535{
536  DEFINE_DCT16x16_MATRIX(   64,    83,    36,    89,    75,    50,    18,    90,    87,    80,    70,    57,    43,    25,     9),
537  DEFINE_DCT16x16_MATRIX(   64,    83,    36,    89,    75,    50,    18,    90,    87,    80,    70,    57,    43,    25,     9)
538};
539
540const TMatrixCoeff g_aiT32[TRANSFORM_NUMBER_OF_DIRECTIONS][32][32] =
541{
542  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),
543  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)
544};
545
546const TMatrixCoeff g_as_DST_MAT_4[TRANSFORM_NUMBER_OF_DIRECTIONS][4][4] =
547{
548  DEFINE_DST4x4_MATRIX(   29,    55,    74,    84),
549  DEFINE_DST4x4_MATRIX(   29,    55,    74,    84)
550};
551#endif
552
553
554//--------------------------------------------------------------------------------------------------
555
556#undef DEFINE_DST4x4_MATRIX
557#undef DEFINE_DCT4x4_MATRIX
558#undef DEFINE_DCT8x8_MATRIX
559#undef DEFINE_DCT16x16_MATRIX
560#undef DEFINE_DCT32x32_MATRIX
561
562//--------------------------------------------------------------------------------------------------
563
564
565const UChar g_aucChromaScale[NUM_CHROMA_FORMAT][chromaQPMappingTableSize]=
566{
567  //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
568  { 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 },
569  { 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 },
570  { 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 },
571  { 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 }
572};
573
[313]574// ====================================================================================================================
[1315]575// Intra prediction
[313]576// ====================================================================================================================
577
[1327]578const UChar g_aucIntraModeNumFast_UseMPM[MAX_CU_DEPTH] =
[313]579{
580  3,  //   2x2
581  8,  //   4x4
582  8,  //   8x8
[1029]583  3,  //  16x16
584  3,  //  32x32
585  3   //  64x64
[313]586};
[1327]587const UChar g_aucIntraModeNumFast_NotUseMPM[MAX_CU_DEPTH] =
[313]588{
589  3,  //   2x2
590  9,  //   4x4
591  9,  //   8x8
592  4,  //  16x16   33
593  4,  //  32x32   33
[442]594  5   //  64x64   33
[313]595};
596
[1029]597const UChar g_chroma422IntraAngleMappingTable[NUM_INTRA_MODE] =
598  //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
599  { 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};
[313]600
601// ====================================================================================================================
602// Misc.
603// ====================================================================================================================
604
[1442]605SChar  g_aucConvertToBit  [ MAX_CU_SIZE+1 ];
[313]606
607#if ENC_DEC_TRACE
[1029]608FILE*  g_hTrace = NULL; // Set to NULL to open up a file. Set to stdout to use the current output
[313]609const Bool g_bEncDecTraceEnable  = true;
610const Bool g_bEncDecTraceDisable = false;
611Bool   g_HLSTraceEnable = true;
612Bool   g_bJustDoIt = false;
613UInt64 g_nSymbolCounter = 0;
614#endif
615// ====================================================================================================================
616// Scanning order & context model mapping
617// ====================================================================================================================
618
619// scanning order table
[1029]620UInt* g_scanOrder[SCAN_NUMBER_OF_GROUP_TYPES][SCAN_NUMBER_OF_TYPES][ MAX_CU_DEPTH ][ MAX_CU_DEPTH ];
[313]621
[1029]622const UInt ctxIndMap4x4[4*4] =
[313]623{
[1029]624  0, 1, 4, 5,
625  2, 3, 4, 5,
626  6, 6, 8, 8,
627  7, 7, 8, 8
[313]628};
629
[1029]630const UInt g_uiMinInGroup[ LAST_SIGNIFICANT_GROUPS ] = {0,1,2,3,4,6,8,12,16,24};
631const 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};
[313]632
[1442]633const TChar *MatrixType[SCALING_LIST_SIZE_NUM][SCALING_LIST_NUM] =
[313]634{
635  {
[1029]636    "INTRA4X4_LUMA",
637    "INTRA4X4_CHROMAU",
638    "INTRA4X4_CHROMAV",
639    "INTER4X4_LUMA",
640    "INTER4X4_CHROMAU",
641    "INTER4X4_CHROMAV"
642  },
[313]643  {
[1029]644    "INTRA8X8_LUMA",
645    "INTRA8X8_CHROMAU",
646    "INTRA8X8_CHROMAV",
647    "INTER8X8_LUMA",
648    "INTER8X8_CHROMAU",
649    "INTER8X8_CHROMAV"
650  },
[313]651  {
[1029]652    "INTRA16X16_LUMA",
653    "INTRA16X16_CHROMAU",
654    "INTRA16X16_CHROMAV",
655    "INTER16X16_LUMA",
656    "INTER16X16_CHROMAU",
657    "INTER16X16_CHROMAV"
658  },
[313]659  {
[1029]660   "INTRA32X32_LUMA",
661   "INTRA32X32_CHROMAU_FROM16x16_CHROMAU",
662   "INTRA32X32_CHROMAV_FROM16x16_CHROMAV",
663   "INTER32X32_LUMA",
664   "INTER32X32_CHROMAU_FROM16x16_CHROMAU",
665   "INTER32X32_CHROMAV_FROM16x16_CHROMAV"
666  },
667};
[313]668
[1442]669const TChar *MatrixType_DC[SCALING_LIST_SIZE_NUM][SCALING_LIST_NUM] =
[1029]670{
[313]671  {
[1029]672  },
[313]673  {
[1029]674  },
[313]675  {
[1029]676    "INTRA16X16_LUMA_DC",
677    "INTRA16X16_CHROMAU_DC",
678    "INTRA16X16_CHROMAV_DC",
679    "INTER16X16_LUMA_DC",
680    "INTER16X16_CHROMAU_DC",
681    "INTER16X16_CHROMAV_DC"
682  },
[313]683  {
[1029]684    "INTRA32X32_LUMA_DC",
685    "INTRA32X32_CHROMAU_DC_FROM16x16_CHROMAU",
686    "INTRA32X32_CHROMAV_DC_FROM16x16_CHROMAV",
687    "INTER32X32_LUMA_DC",
688    "INTER32X32_CHROMAU_DC_FROM16x16_CHROMAU",
689    "INTER32X32_CHROMAV_DC_FROM16x16_CHROMAV"
690  },
691};
[313]692
[1292]693const Int g_quantTSDefault4x4[4*4] =
[313]694{
695  16,16,16,16,
696  16,16,16,16,
697  16,16,16,16,
698  16,16,16,16
699};
700
[1292]701const Int g_quantIntraDefault8x8[8*8] =
[313]702{
703  16,16,16,16,17,18,21,24,
704  16,16,16,16,17,19,22,25,
705  16,16,17,18,20,22,25,29,
706  16,16,18,21,24,27,31,36,
707  17,17,20,24,30,35,41,47,
708  18,19,22,27,35,44,54,65,
709  21,22,25,31,41,54,70,88,
710  24,25,29,36,47,65,88,115
711};
712
[1292]713const Int g_quantInterDefault8x8[8*8] =
[313]714{
715  16,16,16,16,17,18,20,24,
716  16,16,16,17,18,20,24,25,
717  16,16,17,18,20,24,25,28,
718  16,17,18,20,24,25,28,33,
719  17,18,20,24,25,28,33,41,
720  18,20,24,25,28,33,41,54,
721  20,24,25,28,33,41,54,71,
722  24,25,28,33,41,54,71,91
723};
724
[1292]725const UInt g_scalingListSize   [SCALING_LIST_SIZE_NUM] = {16,64,256,1024};
726const UInt g_scalingListSizeX  [SCALING_LIST_SIZE_NUM] = { 4, 8, 16,  32};
[1029]727
[595]728#if LAYER_CTB
[1520]729UInt g_auiLayerZscanToRaster[MAX_LAYERS][ MAX_NUM_PART_IDXS_IN_CTU_WIDTH*MAX_NUM_PART_IDXS_IN_CTU_WIDTH ];
730UInt g_auiLayerRasterToZscan[MAX_LAYERS][ MAX_NUM_PART_IDXS_IN_CTU_WIDTH*MAX_NUM_PART_IDXS_IN_CTU_WIDTH ];
731UInt g_auiLayerRasterToPelX[MAX_LAYERS][ MAX_NUM_PART_IDXS_IN_CTU_WIDTH*MAX_NUM_PART_IDXS_IN_CTU_WIDTH ];
732UInt g_auiLayerRasterToPelY[MAX_LAYERS][ MAX_NUM_PART_IDXS_IN_CTU_WIDTH*MAX_NUM_PART_IDXS_IN_CTU_WIDTH ];
[313]733#endif
734
[1600]735#if SVC_EXTENSION
736Void initRasterToZscan( UInt uiMaxCUWidth, UInt uiMaxCUHeight, UInt uiMaxDepth, UInt* inZscanToRaster, UInt* outRasterToZscan )
737{
738  UInt  uiMinCUWidth = uiMaxCUWidth >> ( uiMaxDepth - 1 );
739  UInt  uiMinCUHeight = uiMaxCUHeight >> ( uiMaxDepth - 1 );
740
741  UInt  uiNumPartInWidth = (UInt)uiMaxCUWidth / uiMinCUWidth;
742  UInt  uiNumPartInHeight = (UInt)uiMaxCUHeight / uiMinCUHeight;
743
744  for( UInt i = 0; i < uiNumPartInWidth*uiNumPartInHeight; i++ )
745  {
746    outRasterToZscan[inZscanToRaster[i]] = i;
747  }
748}
749
750Void initRasterToPelXY( UInt uiMaxCUWidth, UInt uiMaxCUHeight, UInt uiMaxDepth, UInt* outRasterToPelX, UInt* outRasterToPelY )
751{
752  UInt    i;
753
754  UInt* uiTempX = outRasterToPelX;
755  UInt* uiTempY = outRasterToPelY;
756
757  UInt  uiMinCUWidth = uiMaxCUWidth >> ( uiMaxDepth - 1 );
758  UInt  uiMinCUHeight = uiMaxCUHeight >> ( uiMaxDepth - 1 );
759
760  UInt  uiNumPartInWidth = uiMaxCUWidth / uiMinCUWidth;
761  UInt  uiNumPartInHeight = uiMaxCUHeight / uiMinCUHeight;
762
763  uiTempX[0] = 0; uiTempX++;
764  for( i = 1; i < uiNumPartInWidth; i++ )
765  {
766    uiTempX[0] = uiTempX[-1] + uiMinCUWidth; uiTempX++;
767  }
768  for( i = 1; i < uiNumPartInHeight; i++ )
769  {
770    memcpy( uiTempX, uiTempX - uiNumPartInWidth, sizeof( *uiTempX )*uiNumPartInWidth );
771    uiTempX += uiNumPartInWidth;
772  }
773 
774  uiTempY[0] = 0;
775  for( i = 1; i < uiNumPartInWidth*uiNumPartInHeight; i++ )
776  {
777    uiTempY[i] = ( i / uiNumPartInWidth ) * uiMinCUWidth;
778  }
779}
780#endif
781
[313]782//! \}
Note: See TracBrowser for help on using the repository browser.