obs-studio/build_dependencies/aja/include/ajalibraries/ajantv2/includes/ntv2fixed.h
Ward Nakchbandi b48576284b first commit
2023-03-04 20:33:16 +03:00

105 lines
2.3 KiB
C

/* SPDX-License-Identifier: MIT */
/**
@file ntv2fixed.h
@brief Declares several fixed-point math routines. Assumes 16-bit fraction.
@copyright (C) 2004-2021 AJA Video Systems, Inc. All rights reserved.
**/
#ifndef NTV2FIXED_H
#define NTV2FIXED_H
#include "ajatypes.h"
#define FIXED_ONE (1<<16)
#ifdef MSWindows
//Visual Studio 2008 or lower
#if (_MSC_VER <= 1500)
#define inline __inline
#endif
#endif
#if defined (AJAMac) | defined (AJAVirtual)
// MacOS still defines the functions below in CarbonCore/FixMath.h
#ifdef FixedRound
#undef FixedRound
#endif
#ifdef FloatToFixed
#undef FloatToFixed
#endif
#ifdef FixedToFloat
#undef FixedToFloat
#endif
#if !defined (FixedTrunc)
// Conflicts with FixedTrunc function in AJABase's videoutilities.h
#define FixedTrunc(__x__) ((__x__)>>16)
#endif
#define FixedRound(__x__) (((__x__) < 0) ? (-((-(__x__)+0x8000)>>16)) : (((__x__) + 0x8000)>>16))
#define FixedMix(__min__,__max__,__mixer__) (FixedRound(((__max__)-(__min__))*(__mixer__)+(__min__)))
#define FloatToFixed(__x__) ((Fixed_)((__x__) * (float)FIXED_ONE))
#define FixedToFloat(__x__) (((float)(__x__) / (float) 65536.0))
#define FixedFrac(__x__) (((__x__) < 0) ? (-(__x__) & 0xFFFF)) : ((__x__) & 0xFFFF)
#else // not AJAMac
// Prevent unsupported-floating link errors in Linux device driver.
// The following are not used in the Linux driver but cause the 2.6 kernel
// linker to fail anyway.
#ifndef __KERNEL__
inline Fixed_ FloatToFixed(float inFlt)
{
return (Fixed_)(inFlt * (float)FIXED_ONE);
}
inline float FixedToFloat(Fixed_ inFix)
{
return((float)inFix/(float)65536.0);
}
#endif // if __KERNEL__ undefined
inline Word FixedRound(Fixed_ inFix)
{
Word retValue;
if ( inFix < 0 )
{
retValue = (Word)(-((-inFix+0x8000)>>16));
}
else
{
retValue = (Word)((inFix + 0x8000)>>16);
}
return retValue;
}
inline Fixed_ FixedFrac(Fixed_ inFix)
{
Fixed_ retValue;
if ( inFix < 0 )
{
retValue = -inFix&0xFFFF;
}
else
{
retValue = inFix&0xFFFF;
}
return retValue;
}
inline Fixed_ FixedTrunc(Fixed_ inFix)
{
return (inFix>>16);
}
inline Word FixedMix(Word min, Word max, Fixed_ mixer)
{
Fixed_ result = (max-min)*mixer+min;
return FixedRound(result);
}
#endif // else not AJAMac
#endif // NTV2FIXED_H