source: 3DVCSoftware/branches/HTM-4.0.1-VSP-dev0/source/Lib/TLibCommon/CommonDef.h @ 193

Last change on this file since 193 was 193, checked in by mitsubishi-htm, 12 years ago

A second release, as planned

  • Migrate to HTM 4.1
  • Move VSP related switches to cfg file instead of #define in the source code
  • A few bug fixes
  • For VC project files, only VC9 file is updated

TODO

  • Migrate to HTM 5.0, to be used as anchor for CE1 toward Geneva meeting
  • Property svn:eol-style set to native
File size: 18.9 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-2012, 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 constants, macros and tool parameters
36*/
37
38#ifndef __COMMONDEF__
39#define __COMMONDEF__
40
41#include <algorithm>
42
43#if _MSC_VER > 1000
44// disable "signed and unsigned mismatch"
45#pragma warning( disable : 4018 )
46// disable bool coercion "performance warning"
47#pragma warning( disable : 4800 )
48#endif // _MSC_VER > 1000
49#include "TypeDef.h"
50
51#include <stdio.h>
52//! \ingroup TLibCommon
53//! \{
54
55// ====================================================================================================================
56// Version information
57// ====================================================================================================================
58
59#define HM_VERSION        "6.1"
60#define NV_VERSION        "4.1"                  ///< Current software version
61
62// ====================================================================================================================
63// Platform information
64// ====================================================================================================================
65
66#ifdef __GNUC__
67#define NVM_COMPILEDBY  "[GCC %d.%d.%d]", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__
68#ifdef __IA64__
69#define NVM_ONARCH    "[on 64-bit] "
70#else
71#define NVM_ONARCH    "[on 32-bit] "
72#endif
73#endif
74
75#ifdef __INTEL_COMPILER
76#define NVM_COMPILEDBY  "[ICC %d]", __INTEL_COMPILER
77#elif  _MSC_VER
78#define NVM_COMPILEDBY  "[VS %d]", _MSC_VER
79#endif
80
81#ifndef NVM_COMPILEDBY
82#define NVM_COMPILEDBY "[Unk-CXX]"
83#endif
84
85#ifdef _WIN32
86#define NVM_ONOS        "[Windows]"
87#elif  __linux
88#define NVM_ONOS        "[Linux]"
89#elif  __CYGWIN__
90#define NVM_ONOS        "[Cygwin]"
91#elif __APPLE__
92#define NVM_ONOS        "[Mac OS X]"
93#else
94#define NVM_ONOS "[Unk-OS]"
95#endif
96
97#define NVM_BITS          "[%d bit] ", (sizeof(void*) == 8 ? 64 : 32) ///< used for checking 64-bit O/S
98
99#ifndef NULL
100#define NULL              0
101#endif
102
103// ====================================================================================================================
104// Common constants
105// ====================================================================================================================
106
107#define _SUMMARY_OUT_               0           ///< print-out PSNR results of all slices to summary.txt
108#define _SUMMARY_PIC_               0           ///< print-out PSNR results for each slice type to summary.txt
109
110#define MAX_GOP                     64          ///< max. value of hierarchical GOP size
111
112#if VSP_N
113#define MAX_NUM_REF                 5           ///< max. value of multiple reference frames
114#define MAX_NUM_REF_LC              10          ///< max. value of combined reference frames
115#else
116#define MAX_NUM_REF                 4           ///< max. value of multiple reference frames
117#define MAX_NUM_REF_LC              8           ///< max. value of combined reference frames
118#endif
119
120#define MAX_UINT                    0xFFFFFFFFU ///< max. value of unsigned 32-bit integer
121#define MAX_INT                     2147483647  ///< max. value of signed 32-bit integer
122#define MIN_INT                     (-2147483647-1) // < min. value of signed 32-bit integer
123#define MAX_DOUBLE                  1.7e+308    ///< max. value of double-type value
124
125#define MIN_QP                      0
126#define MAX_QP                      51
127
128#define NOT_VALID                   -1
129
130// ====================================================================================================================
131// 3D constants
132// ====================================================================================================================
133#define MAX_VIEW_NUM                10
134
135#if ( HHI_INTER_VIEW_MOTION_PRED || HHI_INTER_VIEW_RESIDUAL_PRED )
136#define DEPTH_MAP_GENERATION        1
137#define PDM_REMOVE_DEPENDENCE       1      //bug-fix for DMDV JCT2-A0095
138#else
139#define DEPTH_MAP_GENERATION        0
140#endif
141
142//>>>>> generation and usage of virtual prediction depth maps >>>>>
143#define PDM_ONE_DEPTH_PER_PU              1         // use only a single depth for a prediction unit (in update)
144#define PDM_NO_INTER_UPDATE               1         // no update for inter (but not inter-view) predicted blocks
145#define PDM_MERGE_POS                     0         // position of pdm in merge list (0..4)
146#if SAIT_IMPROV_MOTION_PRED_M24829&!QC_MULTI_DIS_CAN
147#define PDM_AMVP_POS                      0         // position of pdm in amvp list  (0..3)
148#else
149#define PDM_AMVP_POS                      2         // position of pdm in amvp list  (0..3)
150#endif
151#define PDM_OUTPUT_PRED_DEPTH_MAP         0         // output prediction depth map (for debugging)
152
153#define PDM_INTERNAL_CALC_BIT_DEPTH       31        // bit depth for internal calculations (32 - 1 for signed values)
154#define PDM_BITDEPTH_VIRT_DEPTH           15        // bit depth for virtual depth storage (16 - 1 for signed values)
155#define PDM_LOG2_MAX_ABS_NORMAL_DISPARITY 8         // maximum absolute normal disparity = 256 (for setting accuracy)
156#define PDM_VIRT_DEPTH_PRECISION          4         // must be greater than or equal to 2 (since MVs are given in quarter-pel units)
157
158#define PDM_INTER_CALC_SHIFT              ( PDM_INTERNAL_CALC_BIT_DEPTH - PDM_BITDEPTH_VIRT_DEPTH )         // avoids overflow
159#define PDM_LOG4_SCALE_DENOMINATOR        ( PDM_LOG2_MAX_ABS_NORMAL_DISPARITY + PDM_VIRT_DEPTH_PRECISION )  // accuracy of scaling factor
160#define PDM_OFFSET_SHIFT                  ( PDM_LOG2_MAX_ABS_NORMAL_DISPARITY )                             // accuracy of offset
161
162#define PDM_MAX_ABS_VIRT_DEPTH            (  ( 1 << PDM_BITDEPTH_VIRT_DEPTH ) - 1 )
163#define PDM_UNDEFINED_DEPTH               ( -( 1 << PDM_BITDEPTH_VIRT_DEPTH )     )
164
165#define PDM_USE_FOR_IVIEW                 1
166#define PDM_USE_FOR_INTER                 2
167#define PDM_USE_FOR_MERGE                 4
168
169#define PDM_SUBSAMPLING_EXP               2         // subsampling factor is 2^PDM_SUBSAMPLING_EXP
170#define PDM_SUB_SAMP_EXP_X(Pdm)           ((Pdm)==1?PDM_SUBSAMPLING_EXP:0)
171#define PDM_SUB_SAMP_EXP_Y(Pdm)           ((Pdm)==1?PDM_SUBSAMPLING_EXP:0)
172//<<<<< generation and usage of virtual prediction depth maps <<<<<
173
174#define OUTPUT_RESIDUAL_PICTURES          0         // output residual pictures (for debugging)
175
176#define STD_CAM_PARAMETERS_PRECISION 5        ///< quarter luma sample accuarcy for derived disparities (as default)
177
178#define LOG2_DISP_PREC_LUT           2          ///< log2 of disparity precision used in integer disparity LUTs
179
180// ====================================================================================================================
181// VPS constants
182// ====================================================================================================================
183#if VIDYO_VPS_INTEGRATION
184#define MAX_LAYER_NUM                     MAX_VIEW_NUM
185#define VPS_EXTENSION_TYPE_MULTI_VIEW     0
186#endif
187
188// ====================================================================================================================
189// Macro functions
190// ====================================================================================================================
191extern UInt g_uiIBDI_MAX;
192
193/** clip x, such that 0 <= x <= #g_uiIBDI_MAX */
194template <typename T> inline T Clip(T x) { return std::min<T>(T(g_uiIBDI_MAX), std::max<T>( T(0), x)); }
195
196/** clip a, such that minVal <= a <= maxVal */
197template <typename T> inline T Clip3( T minVal, T maxVal, T a) { return std::min<T> (std::max<T> (minVal, a) , maxVal); }  ///< general min/max clip
198
199#define DATA_ALIGN                  1                                                                 ///< use 32-bit aligned malloc/free
200#if     DATA_ALIGN && _WIN32 && ( _MSC_VER > 1300 )
201#define xMalloc( type, len )        _aligned_malloc( sizeof(type)*(len), 32 )
202#define xFree( ptr )                _aligned_free  ( ptr )
203#else
204#define xMalloc( type, len )        malloc   ( sizeof(type)*(len) )
205#define xFree( ptr )                free     ( ptr )
206#endif
207
208#define FATAL_ERROR_0(MESSAGE, EXITCODE)                      \
209{                                                             \
210  printf(MESSAGE);                                            \
211  exit(EXITCODE);                                             \
212}
213
214#define ROF( exp )            \
215{                             \
216  if( !( exp ) )              \
217{                           \
218  assert( 0 );              \
219  return -1;                \
220}                           \
221}
222
223#define ROT( exp )            \
224{                             \
225  if( ( exp ) )               \
226{                           \
227  assert( 0 );              \
228  return -1;                \
229}                           \
230}
231
232#define ROFS( exp )           \
233{                             \
234  if( !( exp ) )              \
235{                           \
236  return -1;                \
237}                           \
238}
239
240#define ROTS( exp )           \
241{                             \
242  if( ( exp ) )               \
243{                           \
244  return -1;                \
245}                           \
246}
247
248#define ROFR( exp, retVal )   \
249{                             \
250  if( !( exp ) )              \
251{                           \
252  assert( 0 );              \
253  return retVal;            \
254}                           \
255}
256
257#define ROTR( exp, retVal )   \
258{                             \
259  if( ( exp ) )               \
260{                           \
261  assert( 0 );              \
262  return retVal;            \
263}                           \
264}
265
266#define ROFRS( exp, retVal )  \
267{                             \
268  if( !( exp ) )              \
269{                           \
270  return retVal;            \
271}                           \
272}
273
274#define ROTRS( exp, retVal )  \
275{                             \
276  if( ( exp ) )               \
277{                           \
278  return retVal;            \
279}                           \
280}
281
282#define ROFV( exp )           \
283{                             \
284  if( !( exp ) )              \
285{                           \
286  assert( 0 );              \
287  return;                   \
288}                           \
289}
290
291#define ROTV( exp )           \
292{                             \
293  if( ( exp ) )               \
294{                           \
295  assert( 0 );              \
296  return;                   \
297}                           \
298}
299
300#define ROFVS( exp )          \
301{                             \
302  if( !( exp ) )              \
303{                           \
304  return;                   \
305}                           \
306}
307
308#define ROTVS( exp )          \
309{                             \
310  if( ( exp ) )               \
311{                           \
312  return;                   \
313}                           \
314}
315
316#define RNOK( exp )                   \
317{                                     \
318  const ErrVal nMSysRetVal = ( exp ); \
319  if( 0 != nMSysRetVal )              \
320{                                   \
321  assert( 0 );                      \
322  return nMSysRetVal;               \
323}                                   \
324}
325
326#define RNOKR( exp, retVal )        \
327{                                   \
328  if( 0 != ( exp ) )                \
329{                                 \
330  assert( 0 );                    \
331  return retVal;                  \
332}                                 \
333}
334
335#define RNOKS( exp )                  \
336{                                     \
337  const ErrVal nMSysRetVal = ( exp ); \
338  if( 0 != nMSysRetVal )              \
339{                                   \
340  return nMSysRetVal;               \
341}                                   \
342}
343
344#define RNOKRS( exp, retVal )       \
345{                                   \
346  if( 0 != ( exp ) )                \
347{                                 \
348  return retVal;                  \
349}                                 \
350}
351
352#define RNOKV( exp )                \
353{                                   \
354  if( 0 != ( exp ) )                \
355{                                 \
356  assert( 0 );                    \
357  return;                         \
358}                                 \
359}
360
361#define RNOKVS( exp )               \
362{                                   \
363  if( 0 != ( exp ) )                \
364{                                 \
365  return;                         \
366}                                 \
367}
368
369#define ANOK( exp )                 \
370{                                   \
371  if( 0 != ( exp ) )                \
372{                                 \
373  assert( 0 );                    \
374}                                 \
375}
376
377#define AOF( exp )                  \
378{                                   \
379  if( !( exp ) )                    \
380{                                 \
381  assert( 0 );                    \
382}                                 \
383}
384
385#define AOT( exp )            \
386{                             \
387  if( ( exp ) )               \
388{                           \
389  assert( 0 );              \
390}                           \
391}
392
393template <typename T>
394__inline T gSign(const T& t)
395{
396  if( t == 0 )
397    return T(0);
398  else
399    return (t < 0) ? T(-1) : T(1);
400}
401
402#define Max(x, y)                   ((x)>(y)?(x):(y))                                                 ///< max of (x, y)
403#define Min(x, y)                   ((x)<(y)?(x):(y))                                                 ///< min of (x, y)
404#define Median(a,b,c)               ((a)>(b)?(a)>(c)?(b)>(c)?(b):(c):(a):(b)>(c)?(a)>(c)?(a):(c):(b)) ///< 3-point median
405#define Clip(x)                     ( Min(g_uiIBDI_MAX, Max( 0, (x)) ) )                              ///< clip with bit-depth range
406#define Clip3( MinVal, MaxVal, a)   ( ((a)<(MinVal)) ? (MinVal) : (((a)>(MaxVal)) ? (MaxVal) :(a)) )  ///< general min/max clip
407#define RemoveBitIncrement(x)       ( (x + ( (1 << g_uiBitIncrement) >> 1 )) >> g_uiBitIncrement )     ///< Remove Bit increment
408
409#if SAIT_VSO_EST_A0033
410#define ROUND(a)  (((a) < 0)? (int)((a) - 0.5) : (int)((a) + 0.5))
411#endif
412
413// ====================================================================================================================
414// Coding tool configuration
415// ====================================================================================================================
416
417// AMVP: advanced motion vector prediction
418#define AMVP_MAX_NUM_CANDS          2           ///< max number of final candidates
419#if HHI_INTER_VIEW_MOTION_PRED
420#define AMVP_MAX_NUM_CANDS_MEM      4           ///< max number of candidates
421#else
422#define AMVP_MAX_NUM_CANDS_MEM      3           ///< max number of candidates
423#endif
424// MERGE
425#define MRG_MAX_NUM_CANDS           5
426#if HHI_INTER_VIEW_MOTION_PRED
427#define MRG_MAX_NUM_CANDS_MEM       (MRG_MAX_NUM_CANDS+1) // one extra for inter-view motion prediction
428#endif
429
430// Reference memory management
431#define DYN_REF_FREE                0           ///< dynamic free of reference memories
432
433// Explicit temporal layer QP offset
434#if H0567_DPB_PARAMETERS_PER_TEMPORAL_LAYER
435#define MAX_TLAYER                  8           ///< max number of temporal layer
436#else
437#define MAX_TLAYER                  4           ///< max number of temporal layer
438#endif
439#define HB_LAMBDA_FOR_LDC           1           ///< use of B-style lambda for non-key pictures in low-delay mode
440
441// Fast estimation of generalized B in low-delay mode
442#define GPB_SIMPLE                  1           ///< Simple GPB mode
443#if     GPB_SIMPLE
444#define GPB_SIMPLE_UNI              1           ///< Simple mode for uni-direction
445#endif
446
447// Fast ME using smoother MV assumption
448#define FASTME_SMOOTHER_MV          1           ///< reduce ME time using faster option
449
450// Adaptive search range depending on POC difference
451#define ADAPT_SR_SCALE              1           ///< division factor for adaptive search range
452
453#define CLIP_TO_709_RANGE           0
454
455// IBDI range restriction for skipping clip
456#define IBDI_NOCLIP_RANGE           0           ///< restrict max. value after IBDI to skip clip
457
458// Early-skip threshold (encoder)
459#define EARLY_SKIP_THRES            1.50        ///< if RD < thres*avg[BestSkipRD]
460
461#define MAX_NUM_REF_PICS 16
462
463#if !NAL_REF_FLAG
464enum NalRefIdc
465{
466  NAL_REF_IDC_PRIORITY_LOWEST = 0,
467  NAL_REF_IDC_PRIORITY_LOW,
468  NAL_REF_IDC_PRIORITY_HIGH,
469  NAL_REF_IDC_PRIORITY_HIGHEST
470};
471#endif
472
473enum NalUnitType
474{
475  NAL_UNIT_UNSPECIFIED_0 = 0,
476  NAL_UNIT_CODED_SLICE,
477#if H0566_TLA
478  NAL_UNIT_CODED_SLICE_IDV,
479  NAL_UNIT_CODED_SLICE_TLA,
480  NAL_UNIT_CODED_SLICE_CRA,
481#else
482  NAL_UNIT_CODED_SLICE_DATAPART_A,
483  NAL_UNIT_CODED_SLICE_DATAPART_B,
484  NAL_UNIT_CODED_SLICE_CDR,
485#endif
486  NAL_UNIT_CODED_SLICE_IDR,
487  NAL_UNIT_SEI,
488  NAL_UNIT_SPS,
489  NAL_UNIT_PPS,
490  NAL_UNIT_ACCESS_UNIT_DELIMITER,
491  NAL_UNIT_RESERVED_10,
492  NAL_UNIT_RESERVED_11,
493  NAL_UNIT_FILLER_DATA,
494  NAL_UNIT_RESERVED_13,
495  NAL_UNIT_APS,
496  NAL_UNIT_RESERVED_15,
497  NAL_UNIT_RESERVED_16,
498  NAL_UNIT_RESERVED_17,
499  NAL_UNIT_RESERVED_18,
500  NAL_UNIT_RESERVED_19,
501  NAL_UNIT_RESERVED_20,
502  NAL_UNIT_RESERVED_21,
503  NAL_UNIT_RESERVED_22,
504  NAL_UNIT_RESERVED_23,
505  NAL_UNIT_UNSPECIFIED_24,
506#if VIDYO_VPS_INTEGRATION
507  NAL_UNIT_VPS,
508#else
509  NAL_UNIT_UNSPECIFIED_25,
510#endif
511  NAL_UNIT_UNSPECIFIED_26,
512  NAL_UNIT_UNSPECIFIED_27,
513  NAL_UNIT_UNSPECIFIED_28,
514  NAL_UNIT_UNSPECIFIED_29,
515  NAL_UNIT_UNSPECIFIED_30,
516  NAL_UNIT_UNSPECIFIED_31,
517  NAL_UNIT_INVALID,
518};
519
520//PICYUV
521#define PICYUV_PAD         16
522
523//RENDERER
524#define REN_LUMA_MARGIN   ( g_uiMaxCUWidth + PICYUV_PAD )
525#define REN_VDWEIGHT_PREC  8
526#define REN_IS_FILLED     ( 1 << REN_VDWEIGHT_PREC )
527#define REN_USED_PEL       g_uiIBDI_MAX
528#define REN_UNUSED_PEL     0
529#define REN_IS_HOLE        0
530
531
532typedef Int64 PicOrderCnt;
533
534//! \}
535
536#endif // end of #ifndef  __COMMONDEF__
537
Note: See TracBrowser for help on using the repository browser.