libbpg/jctvc/TLibCommon/CommonDef.h
2015-01-16 13:46:18 +01:00

299 lines
12 KiB
C++

/* 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-2014, 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 <algorithm>
#include <iostream>
#include <assert.h>
#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
// ====================================================================================================================
#define NV_VERSION "16.2" ///< Current software version
// ====================================================================================================================
// 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
// ====================================================================================================================
extern Int g_bitDepth[MAX_NUM_CHANNEL_TYPE];
template <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
template <typename T> inline T ClipBD(const T x, const Int bitDepth) { return Clip3(T(0), T((1 << bitDepth)-1), x); }
template <typename T> inline T Clip (const T x, const ChannelType type) { return ClipBD(x, g_bitDepth[type]); }
template <typename T> 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 <typename ValueType> inline ValueType leftShift (const ValueType value, const Int shift) { return (shift >= 0) ? ( value << shift) : ( value >> -shift); }
template <typename ValueType> inline ValueType rightShift (const ValueType value, const Int shift) { return (shift >= 0) ? ( value >> shift) : ( value << -shift); }
template <typename ValueType> inline ValueType leftShift_round (const ValueType value, const Int shift) { return (shift >= 0) ? ( value << shift) : ((value + (ValueType(1) << (-shift - 1))) >> -shift); }
template <typename ValueType> 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 <typename ValueType> 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
#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_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,
};
//! \}
#endif // end of #ifndef __COMMONDEF__