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

Last change on this file since 1497 was 1480, checked in by seregin, 9 years ago

port rev 4615 and update the SHM version to 10.1

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