/* 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-2015, 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 #include #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" #ifdef _MSC_VER #if _MSC_VER <= 1500 inline Int64 abs (Int64 x) { return _abs64(x); }; #endif #endif //! \ingroup TLibCommon //! \{ // ==================================================================================================================== // Version information // ==================================================================================================================== #if SVC_EXTENSION #include #define NV_VERSION "9.0 (HM-16.4)" ///< Current SHM software version #else #define NV_VERSION "16.4" ///< 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 #define MAX_UINT 0xFFFFFFFFU ///< max. value of unsigned 32-bit integer #define MAX_INT 2147483647 ///< max. value of signed 32-bit integer #define MAX_INT64 0x7FFFFFFFFFFFFFFFLL ///< max. value of signed 64-bit integer #if RExt__HIGH_BIT_DEPTH_SUPPORT #define MAX_INTERMEDIATE_INT MAX_INT64 #else #define MAX_INTERMEDIATE_INT MAX_INT #endif #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 // ==================================================================================================================== template inline T Clip3 (const T minVal, const T maxVal, const T a) { return std::min (std::max (minVal, a) , maxVal); } ///< general min/max clip template inline T ClipBD(const T x, const Int bitDepth) { return Clip3(T(0), T((1 << bitDepth)-1), x); } template inline Void Check3( T minVal, T maxVal, T a) { if ((a > maxVal) || (a < minVal)) { std::cerr << "ERROR: Range check " << minVal << " >= " << a << " <= " << maxVal << " failed" << std::endl; assert(false); exit(1); } } ///< 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); \ } template inline ValueType leftShift (const ValueType value, const Int shift) { return (shift >= 0) ? ( value << shift) : ( value >> -shift); } template inline ValueType rightShift (const ValueType value, const Int shift) { return (shift >= 0) ? ( value >> shift) : ( value << -shift); } template inline ValueType leftShift_round (const ValueType value, const Int shift) { return (shift >= 0) ? ( value << shift) : ((value + (ValueType(1) << (-shift - 1))) >> -shift); } template inline ValueType rightShift_round(const ValueType value, const Int shift) { return (shift >= 0) ? ((value + (ValueType(1) << (shift - 1))) >> shift) : ( value << -shift); } #if O0043_BEST_EFFORT_DECODING // when shift = 0, returns value // when shift = 1, (value + 0 + value[1]) >> 1 // when shift = 2, (value + 1 + value[2]) >> 2 // when shift = 3, (value + 3 + value[3]) >> 3 template inline ValueType rightShiftEvenRounding(const ValueType value, const UInt shift) { return (shift == 0) ? value : ((value + (1<<(shift-1))-1 + ((value>>shift)&1)) >> shift) ; } #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 // Reference memory management #define DYN_REF_FREE 0 ///< dynamic free of reference memories // Explicit temporal layer QP offset #define MAX_TLAYER 7 ///< max number of temporal layer // Fast estimation of generalized B in low-delay mode #define GPB_SIMPLE_UNI 1 ///< Simple mode for uni-direction // Adaptive search range depending on POC difference #define ADAPT_SR_SCALE 1 ///< division factor for adaptive search range // 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_TSA_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 SVC_EXTENSION class CommonDecoderParams { Int m_targetLayerId; Int m_targetOutputLayerSetIdx; std::vector *m_targetDecLayerIdSet; Bool m_valueCheckedFlag; Int m_highestTId; public: CommonDecoderParams(): #if CONFORMANCE_BITSTREAM_MODE m_targetLayerId(MAX_VPS_LAYER_IDX_PLUS1) #else m_targetLayerId(0) #endif , m_targetOutputLayerSetIdx(-1) , m_targetDecLayerIdSet(NULL) , m_valueCheckedFlag(false) , m_highestTId(6) {} Void setTargetLayerId(const Int x) { m_targetLayerId = x; } Int getTargetLayerId() { return m_targetLayerId;} Void setTargetOutputLayerSetIdx(const Int x) { m_targetOutputLayerSetIdx = x; } Int getTargetOutputLayerSetIdx() { return m_targetOutputLayerSetIdx;} Void setTargetDecLayerIdSet(std::vector *x) { m_targetDecLayerIdSet = x; } std::vector* getTargetDecLayerIdSet() { return m_targetDecLayerIdSet;} Void setValueCheckedFlag(const Bool x) { m_valueCheckedFlag = x; } Bool getValueCheckedFlag() { return m_valueCheckedFlag;} Void setHighestTId(const Int x) { m_highestTId = x; } Int getHighestTId() { return m_highestTId; } }; #endif //! \} #endif // end of #ifndef __COMMONDEF__