/* The copyright in this software is being made available under the BSD * License, included below. This software may be subject to other third party * and contributor rights, including patent rights, and no such rights are * granted under this license. * * Copyright (c) 2010-2013, ITU/ISO/IEC * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the ITU/ISO/IEC nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ /** \file CommonDef.h \brief Defines constants, macros and tool parameters */ #ifndef __COMMONDEF__ #define __COMMONDEF__ #include #if _MSC_VER > 1000 // disable "signed and unsigned mismatch" #pragma warning( disable : 4018 ) // disable bool coercion "performance warning" #pragma warning( disable : 4800 ) #endif // _MSC_VER > 1000 #include "TypeDef.h" //! \ingroup TLibCommon //! \{ // ==================================================================================================================== // Version information // ==================================================================================================================== #if H_MV #define NV_VERSION "0.3" ///< Current software version #define HM_VERSION "10.1" ///< #else #define NV_VERSION "10.1" ///< Current software version #endif // ==================================================================================================================== // Platform information // ==================================================================================================================== #ifdef __GNUC__ #define NVM_COMPILEDBY "[GCC %d.%d.%d]", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__ #ifdef __IA64__ #define NVM_ONARCH "[on 64-bit] " #else #define NVM_ONARCH "[on 32-bit] " #endif #endif #ifdef __INTEL_COMPILER #define NVM_COMPILEDBY "[ICC %d]", __INTEL_COMPILER #elif _MSC_VER #define NVM_COMPILEDBY "[VS %d]", _MSC_VER #endif #ifndef NVM_COMPILEDBY #define NVM_COMPILEDBY "[Unk-CXX]" #endif #ifdef _WIN32 #define NVM_ONOS "[Windows]" #elif __linux #define NVM_ONOS "[Linux]" #elif __CYGWIN__ #define NVM_ONOS "[Cygwin]" #elif __APPLE__ #define NVM_ONOS "[Mac OS X]" #else #define NVM_ONOS "[Unk-OS]" #endif #define NVM_BITS "[%d bit] ", (sizeof(void*) == 8 ? 64 : 32) ///< used for checking 64-bit O/S #ifndef NULL #define NULL 0 #endif // ==================================================================================================================== // Common constants // ==================================================================================================================== #define _SUMMARY_OUT_ 0 ///< print-out PSNR results of all slices to summary.txt #define _SUMMARY_PIC_ 0 ///< print-out PSNR results for each slice type to summary.txt #define MAX_GOP 64 ///< max. value of hierarchical GOP size #define MAX_NUM_REF_PICS 16 ///< max. number of pictures used for reference #define MAX_NUM_REF 16 ///< max. number of entries in picture reference list #if !L0034_COMBINED_LIST_CLEANUP #define MAX_NUM_REF_LC MAX_NUM_REF_PICS // TODO: remove this macro definition (leftover from combined list concept) #endif #define MAX_UINT 0xFFFFFFFFU ///< max. value of unsigned 32-bit integer #define MAX_INT 2147483647 ///< max. value of signed 32-bit integer #if H_3D #define MIN_INT (-2147483647-1) // < min. value of signed 32-bit integer #endif #define MAX_INT64 0x7FFFFFFFFFFFFFFFLL ///< max. value of signed 64-bit integer #define MAX_DOUBLE 1.7e+308 ///< max. value of double-type value #define MIN_QP 0 #define MAX_QP 51 #define NOT_VALID -1 // ==================================================================================================================== // Macro functions // ==================================================================================================================== extern Int g_bitDepthY; extern Int g_bitDepthC; /** clip x, such that 0 <= x <= #g_maxLumaVal */ template inline T ClipY(T x) { return std::min(T((1 << g_bitDepthY)-1), std::max( T(0), x)); } template inline T ClipC(T x) { return std::min(T((1 << g_bitDepthC)-1), std::max( T(0), x)); } /** clip a, such that minVal <= a <= maxVal */ template inline T Clip3( T minVal, T maxVal, T a) { return std::min (std::max (minVal, a) , maxVal); } ///< general min/max clip #define DATA_ALIGN 1 ///< use 32-bit aligned malloc/free #if DATA_ALIGN && _WIN32 && ( _MSC_VER > 1300 ) #define xMalloc( type, len ) _aligned_malloc( sizeof(type)*(len), 32 ) #define xFree( ptr ) _aligned_free ( ptr ) #else #define xMalloc( type, len ) malloc ( sizeof(type)*(len) ) #define xFree( ptr ) free ( ptr ) #endif #define FATAL_ERROR_0(MESSAGE, EXITCODE) \ { \ printf(MESSAGE); \ exit(EXITCODE); \ } #if H_MV #define AOF( exp ) \ { \ if( !( exp ) ) \ { \ assert( 0 ); \ } \ } #define AOT( exp ) \ { \ if( ( exp ) ) \ { \ assert( 0 ); \ } \ } #if H_3D_IV_MERGE #define ROFVS( exp ) \ { \ if( !( exp ) ) \ { \ return; \ } \ } #define ROTVS( exp ) \ { \ if( ( exp ) ) \ { \ return; \ } \ } #define ROTRS( exp, retVal ) \ { \ if( ( exp ) ) \ { \ return retVal; \ } \ } #define ROFRS( exp, retVal ) \ { \ if( !( exp ) ) \ { \ return retVal; \ } \ } #endif template __inline T gSign(const T& t) { if( t == 0 ) return T(0); else return (t < 0) ? T(-1) : T(1); } #define RemoveBitIncrement( exp ) ( exp >> ( g_bitDepthY - 8 ) ) #endif // ==================================================================================================================== // Coding tool configuration // ==================================================================================================================== // AMVP: advanced motion vector prediction #define AMVP_MAX_NUM_CANDS 2 ///< max number of final candidates #define AMVP_MAX_NUM_CANDS_MEM 3 ///< max number of candidates // MERGE #define MRG_MAX_NUM_CANDS 5 #if H_3D_IV_MERGE #define MRG_MAX_NUM_CANDS_MEM (MRG_MAX_NUM_CANDS+1) // one extra for inter-view motion prediction #endif // Reference memory management #define DYN_REF_FREE 0 ///< dynamic free of reference memories // Explicit temporal layer QP offset #define MAX_TLAYER 8 ///< max number of temporal layer #define HB_LAMBDA_FOR_LDC 1 ///< use of B-style lambda for non-key pictures in low-delay mode // Fast estimation of generalized B in low-delay mode #define GPB_SIMPLE 1 ///< Simple GPB mode #if GPB_SIMPLE #define GPB_SIMPLE_UNI 1 ///< Simple mode for uni-direction #endif // Fast ME using smoother MV assumption #define FASTME_SMOOTHER_MV 1 ///< reduce ME time using faster option // Adaptive search range depending on POC difference #define ADAPT_SR_SCALE 1 ///< division factor for adaptive search range #define CLIP_TO_709_RANGE 0 // Early-skip threshold (encoder) #define EARLY_SKIP_THRES 1.50 ///< if RD < thres*avg[BestSkipRD] #define MAX_CHROMA_FORMAT_IDC 3 // TODO: Existing names used for the different NAL unit types can be altered to better reflect the names in the spec. // However, the names in the spec are not yet stable at this point. Once the names are stable, a cleanup // effort can be done without use of macros to alter the names used to indicate the different NAL unit types. enum NalUnitType { NAL_UNIT_CODED_SLICE_TRAIL_N = 0, // 0 NAL_UNIT_CODED_SLICE_TRAIL_R, // 1 NAL_UNIT_CODED_SLICE_TSA_N, // 2 NAL_UNIT_CODED_SLICE_TLA_R, // 3 NAL_UNIT_CODED_SLICE_STSA_N, // 4 NAL_UNIT_CODED_SLICE_STSA_R, // 5 NAL_UNIT_CODED_SLICE_RADL_N, // 6 NAL_UNIT_CODED_SLICE_RADL_R, // 7 NAL_UNIT_CODED_SLICE_RASL_N, // 8 NAL_UNIT_CODED_SLICE_RASL_R, // 9 NAL_UNIT_RESERVED_VCL_N10, NAL_UNIT_RESERVED_VCL_R11, NAL_UNIT_RESERVED_VCL_N12, NAL_UNIT_RESERVED_VCL_R13, NAL_UNIT_RESERVED_VCL_N14, NAL_UNIT_RESERVED_VCL_R15, NAL_UNIT_CODED_SLICE_BLA_W_LP, // 16 NAL_UNIT_CODED_SLICE_BLA_W_RADL, // 17 NAL_UNIT_CODED_SLICE_BLA_N_LP, // 18 NAL_UNIT_CODED_SLICE_IDR_W_RADL, // 19 NAL_UNIT_CODED_SLICE_IDR_N_LP, // 20 NAL_UNIT_CODED_SLICE_CRA, // 21 NAL_UNIT_RESERVED_IRAP_VCL22, NAL_UNIT_RESERVED_IRAP_VCL23, NAL_UNIT_RESERVED_VCL24, NAL_UNIT_RESERVED_VCL25, NAL_UNIT_RESERVED_VCL26, NAL_UNIT_RESERVED_VCL27, NAL_UNIT_RESERVED_VCL28, NAL_UNIT_RESERVED_VCL29, NAL_UNIT_RESERVED_VCL30, NAL_UNIT_RESERVED_VCL31, NAL_UNIT_VPS, // 32 NAL_UNIT_SPS, // 33 NAL_UNIT_PPS, // 34 NAL_UNIT_ACCESS_UNIT_DELIMITER, // 35 NAL_UNIT_EOS, // 36 NAL_UNIT_EOB, // 37 NAL_UNIT_FILLER_DATA, // 38 NAL_UNIT_PREFIX_SEI, // 39 NAL_UNIT_SUFFIX_SEI, // 40 NAL_UNIT_RESERVED_NVCL41, NAL_UNIT_RESERVED_NVCL42, NAL_UNIT_RESERVED_NVCL43, NAL_UNIT_RESERVED_NVCL44, NAL_UNIT_RESERVED_NVCL45, NAL_UNIT_RESERVED_NVCL46, NAL_UNIT_RESERVED_NVCL47, NAL_UNIT_UNSPECIFIED_48, NAL_UNIT_UNSPECIFIED_49, NAL_UNIT_UNSPECIFIED_50, NAL_UNIT_UNSPECIFIED_51, NAL_UNIT_UNSPECIFIED_52, NAL_UNIT_UNSPECIFIED_53, NAL_UNIT_UNSPECIFIED_54, NAL_UNIT_UNSPECIFIED_55, NAL_UNIT_UNSPECIFIED_56, NAL_UNIT_UNSPECIFIED_57, NAL_UNIT_UNSPECIFIED_58, NAL_UNIT_UNSPECIFIED_59, NAL_UNIT_UNSPECIFIED_60, NAL_UNIT_UNSPECIFIED_61, NAL_UNIT_UNSPECIFIED_62, NAL_UNIT_UNSPECIFIED_63, NAL_UNIT_INVALID, }; #if H_3D //PICYUV #define PICYUV_PAD 16 //RENDERER #define REN_LUMA_MARGIN ( g_uiMaxCUWidth + PICYUV_PAD ) #define REN_VDWEIGHT_PREC 8 #define REN_IS_FILLED ( 1 << REN_VDWEIGHT_PREC ) #define REN_USED_PEL ( (1 << g_bitDepthY) - 1 ) #define REN_UNUSED_PEL 0 #define REN_IS_HOLE 0 // CAMERA PARAMETERS #define LOG2_DISP_PREC_LUT 2 ///< log2 of disparity precision used in integer disparity LUTs #define STD_CAM_PARAMETERS_PRECISION 5 ///< quarter luma sample accuarcy for derived disparities (as default) #if H_3D_IV_MERGE // GT: To be checked if all of this is still necessary. #define PDM_USE_FOR_IVIEW 1 #define PDM_USE_FOR_INTER 2 #define PDM_USE_FOR_MERGE 4 #define MAX_VIEW_NUM 10 #define PDM_SUBSAMPLING_EXP 2 // subsampling factor is 2^PDM_SUBSAMPLING_EXP #define PDM_SUB_SAMP_EXP_X(Pdm) ((Pdm)==1?PDM_SUBSAMPLING_EXP:0) #define PDM_SUB_SAMP_EXP_Y(Pdm) ((Pdm)==1?PDM_SUBSAMPLING_EXP:0) #define PDM_INTERNAL_CALC_BIT_DEPTH 31 // bit depth for internal calculations (32 - 1 for signed values) #define PDM_BITDEPTH_VIRT_DEPTH 15 // bit depth for virtual depth storage (16 - 1 for signed values) #define PDM_LOG2_MAX_ABS_NORMAL_DISPARITY 8 // maximum absolute normal disparity = 256 (for setting accuracy) #define PDM_VIRT_DEPTH_PRECISION 4 // must be greater than or equal to 2 (since MVs are given in quarter-pel units) #define PDM_INTER_CALC_SHIFT ( PDM_INTERNAL_CALC_BIT_DEPTH - PDM_BITDEPTH_VIRT_DEPTH ) // avoids overflow #define PDM_LOG4_SCALE_DENOMINATOR ( PDM_LOG2_MAX_ABS_NORMAL_DISPARITY + PDM_VIRT_DEPTH_PRECISION ) // accuracy of scaling factor #define PDM_OFFSET_SHIFT ( PDM_LOG2_MAX_ABS_NORMAL_DISPARITY ) // accuracy of offset #endif #endif // end of H_3D //! \} #endif // end of #ifndef __COMMONDEF__