source: SHVCSoftware/branches/SHM-dev/source/Lib/TLibCommon/CommonDef.h @ 1348

Last change on this file since 1348 was 1335, checked in by seregin, 9 years ago

port rev 4413

  • Property svn:eol-style set to native
File size: 17.1 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
34/** \file     CommonDef.h
35    \brief    Defines version information, constants and small in-line functions
36*/
37
38#ifndef __COMMONDEF__
39#define __COMMONDEF__
40
41#include <algorithm>
42#include <iostream>
43#include <assert.h>
44
45#if _MSC_VER > 1000
46// disable "signed and unsigned mismatch"
47#pragma warning( disable : 4018 )
48// disable Bool coercion "performance warning"
49#pragma warning( disable : 4800 )
50#endif // _MSC_VER > 1000
51#include "TypeDef.h"
52
53#ifdef _MSC_VER
54#if _MSC_VER <= 1500
55inline Int64 abs (Int64 x) { return _abs64(x); };
56#endif
57#endif
58
59//! \ingroup TLibCommon
60//! \{
61
62// ====================================================================================================================
63// Version information
64// ====================================================================================================================
65
66#if SVC_EXTENSION
67#include <vector>
68#define NV_VERSION        "9.0 (HM-16.4)"        ///< Current SHM software version
69#else
70#define NV_VERSION        "16.4"                 ///< Current software version
71#endif
72
73// ====================================================================================================================
74// Platform information
75// ====================================================================================================================
76
77#ifdef __GNUC__
78#define NVM_COMPILEDBY  "[GCC %d.%d.%d]", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__
79#ifdef __IA64__
80#define NVM_ONARCH    "[on 64-bit] "
81#else
82#define NVM_ONARCH    "[on 32-bit] "
83#endif
84#endif
85
86#ifdef __INTEL_COMPILER
87#define NVM_COMPILEDBY  "[ICC %d]", __INTEL_COMPILER
88#elif  _MSC_VER
89#define NVM_COMPILEDBY  "[VS %d]", _MSC_VER
90#endif
91
92#ifndef NVM_COMPILEDBY
93#define NVM_COMPILEDBY "[Unk-CXX]"
94#endif
95
96#ifdef _WIN32
97#define NVM_ONOS        "[Windows]"
98#elif  __linux
99#define NVM_ONOS        "[Linux]"
100#elif  __CYGWIN__
101#define NVM_ONOS        "[Cygwin]"
102#elif __APPLE__
103#define NVM_ONOS        "[Mac OS X]"
104#else
105#define NVM_ONOS "[Unk-OS]"
106#endif
107
108#define NVM_BITS          "[%d bit] ", (sizeof(Void*) == 8 ? 64 : 32) ///< used for checking 64-bit O/S
109
110#ifndef NULL
111#define NULL              0
112#endif
113
114// ====================================================================================================================
115// Common constants
116// ====================================================================================================================
117
118static const UInt   MAX_UINT =                            0xFFFFFFFFU; ///< max. value of unsigned 32-bit integer
119static const Int    MAX_INT =                              2147483647; ///< max. value of signed 32-bit integer
120static const Double MAX_DOUBLE =                             1.7e+308; ///< max. value of Double-type value
121
122// ====================================================================================================================
123// Coding tool configuration
124// ====================================================================================================================
125// Most of these should not be changed - they resolve the meaning of otherwise magic numbers.
126
127static const Int MAX_GOP =                                         64; ///< max. value of hierarchical GOP size
128static const Int MAX_NUM_REF_PICS =                                16; ///< max. number of pictures used for reference
129static const Int MAX_NUM_REF =                                     16; ///< max. number of entries in picture reference list
130static const Int MAX_QP =                                          51;
131static const Int NOT_VALID =                                       -1;
132
133static const Int AMVP_MAX_NUM_CANDS =                               2; ///< AMVP: advanced motion vector prediction - max number of final candidates
134static const Int AMVP_MAX_NUM_CANDS_MEM =                           3; ///< AMVP: advanced motion vector prediction - max number of candidates
135static const Int AMVP_DECIMATION_FACTOR =                           4;
136static const Int MRG_MAX_NUM_CANDS =                                5; ///< MERGE
137
138
139static const Int MAX_TLAYER =                                       7; ///< Explicit temporal layer QP offset - max number of temporal layer
140
141static const Int ADAPT_SR_SCALE =                                   1; ///< division factor for adaptive search range
142
143static const Int MAX_NUM_PICS_IN_SOP =                           1024;
144
145static const Int MAX_NESTING_NUM_OPS =                           1024;
146static const Int MAX_NESTING_NUM_LAYER =                           64;
147
148static const Int MAX_VPS_NUM_HRD_PARAMETERS =                       1;
149static const Int MAX_VPS_OP_SETS_PLUS1 =                         1024;
150static const Int MAX_VPS_NUH_RESERVED_ZERO_LAYER_ID_PLUS1 =         1;
151
152static const Int MAXIMUM_INTRA_FILTERED_WIDTH =                    16;
153static const Int MAXIMUM_INTRA_FILTERED_HEIGHT =                   16;
154
155static const Int MAX_CPB_CNT =                                     32; ///< Upper bound of (cpb_cnt_minus1 + 1)
156#if SVC_EXTENSION
157static const Int MAX_NUM_LAYER_IDS =                               63;
158#else
159static const Int MAX_NUM_LAYER_IDS =                               64;
160#endif
161
162static const Int COEF_REMAIN_BIN_REDUCTION =                        3; ///< indicates the level at which the VLC transitions from Golomb-Rice to TU+EG(k)
163
164static const Int CU_DQP_TU_CMAX =                                   5; ///< max number bins for truncated unary
165static const Int CU_DQP_EG_k =                                      0; ///< expgolomb order
166
167static const Int SBH_THRESHOLD =                                    4; ///< value of the fixed SBH controlling threshold
168
169static const Int C1FLAG_NUMBER =                                    8; // maximum number of largerThan1 flag coded in one chunk:  16 in HM5
170static const Int C2FLAG_NUMBER =                                    1; // maximum number of largerThan2 flag coded in one chunk:  16 in HM5
171
172static const Int MAX_NUM_VPS =                                     16;
173static const Int MAX_NUM_SPS =                                     16;
174static const Int MAX_NUM_PPS =                                     64;
175
176
177static const Int MLS_GRP_NUM =                                     64; ///< Max number of coefficient groups, max(16, 64)
178static const Int MLS_CG_LOG2_WIDTH =                                2;
179static const Int MLS_CG_LOG2_HEIGHT =                               2;
180static const Int MLS_CG_SIZE =                                      4; ///< Coefficient group size of 4x4; = MLS_CG_LOG2_WIDTH + MLS_CG_LOG2_HEIGHT
181
182#if ADAPTIVE_QP_SELECTION
183static const Int ARL_C_PRECISION =                                  7; ///< G382: 7-bit arithmetic precision
184static const Int LEVEL_RANGE =                                     30; ///< G382: max coefficient level in statistics collection
185#endif
186
187static const Int RVM_VCEGAM10_M =                                   4;
188
189static const Int FAST_UDI_MAX_RDMODE_NUM =                         35; ///< maximum number of RD comparison in fast-UDI estimation loop
190
191static const Int NUM_INTRA_MODE =                                  36;
192static const Int PLANAR_IDX =                                       0;
193static const Int VER_IDX =                                         26; ///< index for intra VERTICAL   mode
194static const Int HOR_IDX =                                         10; ///< index for intra HORIZONTAL mode
195static const Int DC_IDX =                                           1; ///< index for intra DC mode
196static const Int NUM_CHROMA_MODE =                                  5; ///< total number of chroma modes
197static const Int DM_CHROMA_IDX =                                   36; ///< chroma mode index for derived from luma intra mode
198
199static const Int MDCS_ANGLE_LIMIT =                                 4; ///< 0 = Horizontal/vertical only, 1 = Horizontal/vertical +/- 1, 2 = Horizontal/vertical +/- 2 etc...
200static const Int MDCS_MAXIMUM_WIDTH =                               8; ///< (measured in pixels) TUs with width greater than this can only use diagonal scan
201static const Int MDCS_MAXIMUM_HEIGHT =                              8; ///< (measured in pixels) TUs with height greater than this can only use diagonal scan
202
203
204static const Int LOG2_MAX_NUM_COLUMNS_MINUS1 =                      7;
205static const Int LOG2_MAX_NUM_ROWS_MINUS1 =                         7;
206
207static const Int CABAC_INIT_PRESENT_FLAG =                          1;
208
209static const Int LUMA_INTERPOLATION_FILTER_SUB_SAMPLE_POSITIONS =   4;
210static const Int CHROMA_INTERPOLATION_FILTER_SUB_SAMPLE_POSITIONS = 8;
211
212static const Int MAX_NUM_LONG_TERM_REF_PICS =                      33;
213static const Int NUM_LONG_TERM_REF_PIC_SPS =                        0;
214
215
216static const Int MAX_QP_OFFSET_LIST_SIZE =                          6; ///< Maximum size of QP offset list is 6 entries
217
218// Cost mode support
219static const Int LOSSLESS_AND_MIXED_LOSSLESS_RD_COST_TEST_QP =      0; ///< QP to use for lossless coding.
220static const Int LOSSLESS_AND_MIXED_LOSSLESS_RD_COST_TEST_QP_PRIME =4; ///< QP' to use for mixed_lossy_lossless coding.
221
222static const Int RExt__GOLOMB_RICE_ADAPTATION_STATISTICS_SETS =     4;
223static const Int RExt__GOLOMB_RICE_INCREMENT_DIVISOR =              4;
224
225static const Int RExt__PREDICTION_WEIGHTING_ANALYSIS_DC_PRECISION = 0; ///< Additional fixed bit precision used during encoder-side weighting prediction analysis. Currently only used when high_precision_prediction_weighting_flag is set, for backwards compatibility reasons.
226
227static const Int MAX_TIMECODE_SEI_SETS =                            3; ///< Maximum number of time sets
228
229static const Int MAX_CU_DEPTH =                                     6; ///< log2(CTUSize)
230static const Int MAX_CU_SIZE =                                     64; ///< = 1<<(MAX_CU_DEPTH)
231static const Int MIN_PU_SIZE =                                      4;
232static const Int MIN_TU_SIZE =                                      4;
233static const Int MAX_TU_SIZE =                                     32;
234static const Int MAX_NUM_PART_IDXS_IN_CTU_WIDTH = MAX_CU_SIZE/MIN_PU_SIZE; ///< maximum number of partition indices across the width of a CTU (or height of a CTU)
235static const Int SCALING_LIST_REM_NUM =                             6;
236
237static const Int QUANT_SHIFT =                                     14; ///< Q(4) = 2^14
238static const Int IQUANT_SHIFT =                                     6;
239static const Int SCALE_BITS =                                      15; ///< For fractional bit estimates in RDOQ
240
241static const Int SCALING_LIST_NUM = MAX_NUM_COMPONENT * NUMBER_OF_PREDICTION_MODES; ///< list number for quantization matrix
242
243static const Int SCALING_LIST_START_VALUE =                        8 ; ///< start value for dpcm mode
244static const Int MAX_MATRIX_COEF_NUM =                            64 ; ///< max coefficient number for quantization matrix
245static const Int MAX_MATRIX_SIZE_NUM =                             8 ; ///< max size number for quantization matrix
246static const Int SCALING_LIST_BITS =                               8 ; ///< bit depth of scaling list entries
247static const Int LOG2_SCALING_LIST_NEUTRAL_VALUE =                 4 ; ///< log2 of the value that, when used in a scaling list, has no effect on quantisation
248static const Int SCALING_LIST_DC =                                16 ; ///< default DC value
249
250static const Int CONTEXT_STATE_BITS =                              6 ;
251static const Int LAST_SIGNIFICANT_GROUPS =                        10 ;
252
253
254// ====================================================================================================================
255// Macro functions
256// ====================================================================================================================
257
258template <typename T> inline T Clip3 (const T minVal, const T maxVal, const T a) { return std::min<T> (std::max<T> (minVal, a) , maxVal); }  ///< general min/max clip
259template <typename T> inline T ClipBD(const T x, const Int bitDepth)             { return Clip3(T(0), T((1 << bitDepth)-1), x);           }
260
261template <typename T> inline Void Check3( T minVal, T maxVal, T a)
262{
263  if ((a > maxVal) || (a < minVal))
264  {
265    std::cerr << "ERROR: Range check " << minVal << " >= " << a << " <= " << maxVal << " failed" << std::endl;
266    assert(false);
267    exit(1);
268  }
269}  ///< general min/max clip
270
271#define DATA_ALIGN                  1                                                                 ///< use 32-bit aligned malloc/free
272#if     DATA_ALIGN && _WIN32 && ( _MSC_VER > 1300 )
273#define xMalloc( type, len )        _aligned_malloc( sizeof(type)*(len), 32 )
274#define xFree( ptr )                _aligned_free  ( ptr )
275#else
276#define xMalloc( type, len )        malloc   ( sizeof(type)*(len) )
277#define xFree( ptr )                free     ( ptr )
278#endif
279
280#define FATAL_ERROR_0(MESSAGE, EXITCODE)                      \
281{                                                             \
282  printf(MESSAGE);                                            \
283  exit(EXITCODE);                                             \
284}
285
286template <typename ValueType> inline ValueType leftShift       (const ValueType value, const Int shift) { return (shift >= 0) ? ( value                                  << shift) : ( value                                   >> -shift); }
287template <typename ValueType> inline ValueType rightShift      (const ValueType value, const Int shift) { return (shift >= 0) ? ( value                                  >> shift) : ( value                                   << -shift); }
288template <typename ValueType> inline ValueType leftShift_round (const ValueType value, const Int shift) { return (shift >= 0) ? ( value                                  << shift) : ((value + (ValueType(1) << (-shift - 1))) >> -shift); }
289template <typename ValueType> inline ValueType rightShift_round(const ValueType value, const Int shift) { return (shift >= 0) ? ((value + (ValueType(1) << (shift - 1))) >> shift) : ( value                                   << -shift); }
290#if O0043_BEST_EFFORT_DECODING
291// when shift = 0, returns value
292// when shift = 1, (value + 0 + value[1]) >> 1
293// when shift = 2, (value + 1 + value[2]) >> 2
294// when shift = 3, (value + 3 + value[3]) >> 3
295template <typename ValueType> inline ValueType rightShiftEvenRounding(const ValueType value, const UInt shift) { return (shift == 0) ? value : ((value + (1<<(shift-1))-1 + ((value>>shift)&1)) >> shift) ; }
296#endif
297
298#if SVC_EXTENSION
299class CommonDecoderParams
300{
301  Int m_targetLayerId;
302  Int m_targetOutputLayerSetIdx;
303  std::vector<Int> *m_targetDecLayerIdSet;
304  Bool m_valueCheckedFlag;
305  Int m_highestTId;
306public:
307  CommonDecoderParams():
308#if CONFORMANCE_BITSTREAM_MODE
309    m_targetLayerId(MAX_VPS_LAYER_IDX_PLUS1)
310#else
311    m_targetLayerId(0)
312#endif
313    , m_targetOutputLayerSetIdx(-1)
314    , m_targetDecLayerIdSet(NULL)
315    , m_valueCheckedFlag(false)
316    , m_highestTId(6)
317 {}
318
319  Void setTargetLayerId(const Int x) { m_targetLayerId = x;   }
320  Int  getTargetLayerId()            { return m_targetLayerId;}
321 
322  Void setTargetOutputLayerSetIdx(const Int x) { m_targetOutputLayerSetIdx = x;   }
323  Int  getTargetOutputLayerSetIdx()            { return m_targetOutputLayerSetIdx;}
324
325  Void               setTargetDecLayerIdSet(std::vector<Int> *x) { m_targetDecLayerIdSet = x;   }
326  std::vector<Int>*  getTargetDecLayerIdSet()                    { return m_targetDecLayerIdSet;}
327 
328  Void setValueCheckedFlag(const Bool x) { m_valueCheckedFlag = x;   }
329  Bool getValueCheckedFlag()            { return m_valueCheckedFlag;}
330 
331  Void setHighestTId(const Int x) { m_highestTId = x; }
332  Int  getHighestTId()            { return m_highestTId; }
333};
334#endif
335//! \}
336
337#endif // end of #ifndef  __COMMONDEF__
338
Note: See TracBrowser for help on using the repository browser.