diff options
64 files changed, 5147 insertions, 2167 deletions
@@ -22,10 +22,16 @@ cc_library_static { "-Wno-#warnings", "-Wuninitialized", "-Wno-self-assign", + "-Wno-implicit-fallthrough", ], sanitize: { - misc_undefined:["unsigned-integer-overflow", "signed-integer-overflow"], - cfi: true, + misc_undefined:[ + "unsigned-integer-overflow", + "signed-integer-overflow", + "bounds", + ], + // Enable CFI if this becomes a shared library. + // cfi: true, }, shared_libs: [ "liblog", diff --git a/documentation/aacDecoder.pdf b/documentation/aacDecoder.pdf Binary files differindex 1dec334..eb2a75e 100644 --- a/documentation/aacDecoder.pdf +++ b/documentation/aacDecoder.pdf diff --git a/libAACdec/include/aacdecoder_lib.h b/libAACdec/include/aacdecoder_lib.h index 3a9b910..6c2fda4 100644 --- a/libAACdec/include/aacdecoder_lib.h +++ b/libAACdec/include/aacdecoder_lib.h @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -741,66 +741,77 @@ typedef enum { ::CONCEAL_INTER. only some AOTs are supported). \n */ AAC_DRC_BOOST_FACTOR = - 0x0200, /*!< Dynamic Range Control: Scaling factor for boosting gain - values. Defines how the boosting DRC factors (conveyed in the - bitstream) will be applied to the decoded signal. The valid - values range from 0 (don't apply boost factors) to 127 (fully - apply boost factors). Default value is 0. */ - AAC_DRC_ATTENUATION_FACTOR = - 0x0201, /*!< Dynamic Range Control: Scaling factor for attenuating gain - values. Same as - ::AAC_DRC_BOOST_FACTOR but for attenuating DRC factors. */ + 0x0200, /*!< MPEG-4 / MPEG-D Dynamic Range Control (DRC): Scaling factor + for boosting gain values. Defines how the boosting DRC factors + (conveyed in the bitstream) will be applied to the decoded + signal. The valid values range from 0 (don't apply boost + factors) to 127 (fully apply boost factors). Default value is 0 + for MPEG-4 DRC and 127 for MPEG-D DRC. */ + AAC_DRC_ATTENUATION_FACTOR = 0x0201, /*!< MPEG-4 / MPEG-D DRC: Scaling factor + for attenuating gain values. Same as + ::AAC_DRC_BOOST_FACTOR but for + attenuating DRC factors. */ AAC_DRC_REFERENCE_LEVEL = - 0x0202, /*!< Dynamic Range Control (DRC): Target reference level. Defines - the level below full-scale (quantized in steps of 0.25dB) to - which the output audio signal will be normalized to by the DRC - module. The parameter controls loudness normalization for both - MPEG-4 DRC and MPEG-D DRC. The valid values range from 40 (-10 - dBFS) to 127 (-31.75 dBFS). Any value smaller than 0 switches - off loudness normalization and MPEG-4 DRC. By default, loudness - normalization and MPEG-4 DRC is switched off. */ + 0x0202, /*!< MPEG-4 / MPEG-D DRC: Target reference level / decoder target + loudness.\n Defines the level below full-scale (quantized in + steps of 0.25dB) to which the output audio signal will be + normalized to by the DRC module.\n The parameter controls + loudness normalization for both MPEG-4 DRC and MPEG-D DRC. The + valid values range from 40 (-10 dBFS) to 127 (-31.75 dBFS).\n + Example values:\n + 124 (-31 dBFS) for audio/video receivers (AVR) or other + devices allowing audio playback with high dynamic range,\n 96 + (-24 dBFS) for TV sets or equivalent devices (default),\n 64 + (-16 dBFS) for mobile devices where the dynamic range of audio + playback is restricted.\n Any value smaller than 0 switches off + loudness normalization and MPEG-4 DRC. */ AAC_DRC_HEAVY_COMPRESSION = - 0x0203, /*!< Dynamic Range Control: En-/Disable DVB specific heavy - compression (aka RF mode). If set to 1, the decoder will apply - the compression values from the DVB specific ancillary data - field. At the same time the MPEG-4 Dynamic Range Control tool - will be disabled. By default, heavy compression is disabled. */ + 0x0203, /*!< MPEG-4 DRC: En-/Disable DVB specific heavy compression (aka + RF mode). If set to 1, the decoder will apply the compression + values from the DVB specific ancillary data field. At the same + time the MPEG-4 Dynamic Range Control tool will be disabled. By + default, heavy compression is disabled. */ AAC_DRC_DEFAULT_PRESENTATION_MODE = - 0x0204, /*!< Dynamic Range Control: Default presentation mode (DRC - parameter handling). \n Defines the handling of the DRC - parameters boost factor, attenuation factor and heavy - compression, if no presentation mode is indicated in the - bitstream.\n For options, see - ::AAC_DRC_DEFAULT_PRESENTATION_MODE_OPTIONS.\n Default: + 0x0204, /*!< MPEG-4 DRC: Default presentation mode (DRC parameter + handling). \n Defines the handling of the DRC parameters boost + factor, attenuation factor and heavy compression, if no + presentation mode is indicated in the bitstream.\n For options, + see ::AAC_DRC_DEFAULT_PRESENTATION_MODE_OPTIONS.\n Default: ::AAC_DRC_PARAMETER_HANDLING_DISABLED */ AAC_DRC_ENC_TARGET_LEVEL = - 0x0205, /*!< Dynamic Range Control: Encoder target level for light (i.e. - not heavy) compression.\n If known, this declares the target - reference level that was assumed at the encoder for calculation - of limiting gains. The valid values range from 0 (full-scale) - to 127 (31.75 dB below full-scale). This parameter is used only + 0x0205, /*!< MPEG-4 DRC: Encoder target level for light (i.e. not heavy) + compression.\n If known, this declares the target reference + level that was assumed at the encoder for calculation of + limiting gains. The valid values range from 0 (full-scale) to + 127 (31.75 dB below full-scale). This parameter is used only with ::AAC_DRC_PARAMETER_HANDLING_ENABLED and ignored otherwise.\n Default: 127 (worst-case assumption).\n */ + AAC_UNIDRC_SET_EFFECT = 0x0206, /*!< MPEG-D DRC: Request a DRC effect type for + selection of a DRC set.\n Supported indices + are:\n -1: DRC off. Completely disables + MPEG-D DRC.\n 0: None (default). Disables + MPEG-D DRC, but automatically enables DRC + if necessary to prevent clipping.\n 1: Late + night\n 2: Noisy environment\n 3: Limited + playback range\n 4: Low playback level\n 5: + Dialog enhancement\n 6: General + compression. Used for generally enabling + MPEG-D DRC without particular request.\n */ + AAC_UNIDRC_ALBUM_MODE = + 0x0207, /*!< MPEG-D DRC: Enable album mode. 0: Disabled (default), 1: + Enabled.\n Disabled album mode leads to application of gain + sequences for fading in and out, if provided in the + bitstream.\n Enabled album mode makes use of dedicated album + loudness information, if provided in the bitstream.\n */ AAC_QMF_LOWPOWER = 0x0300, /*!< Quadrature Mirror Filter (QMF) Bank processing mode. \n -1: Use internal default. Implies MPEG Surround partially complex accordingly. \n 0: Use complex QMF data mode. \n 1: Use real (low power) QMF data mode. \n */ AAC_TPDEC_CLEAR_BUFFER = - 0x0603, /*!< Clear internal bit stream buffer of transport layers. The - decoder will start decoding at new data passed after this event - and any previous data is discarded. */ - AAC_UNIDRC_SET_EFFECT = 0x0903 /*!< MPEG-D DRC: Request a DRC effect type for - selection of a DRC set.\n Supported indices - are:\n -1: DRC off. Completely disables - MPEG-D DRC.\n 0: None (default). Disables - MPEG-D DRC, but automatically enables DRC if - necessary to prevent clipping.\n 1: Late - night\n 2: Noisy environment\n 3: Limited - playback range\n 4: Low playback level\n 5: - Dialog enhancement\n 6: General compression. - Used for generally enabling MPEG-D DRC - without particular request.\n */ + 0x0603 /*!< Clear internal bit stream buffer of transport layers. The + decoder will start decoding at new data passed after this event + and any previous data is discarded. */ } AACDEC_PARAM; diff --git a/libAACdec/src/aacdec_drc.cpp b/libAACdec/src/aacdec_drc.cpp index 922a09e..4129d0f 100644 --- a/libAACdec/src/aacdec_drc.cpp +++ b/libAACdec/src/aacdec_drc.cpp @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -174,9 +174,9 @@ void aacDecoder_drcInit(HANDLE_AAC_DRC self) { pParams->usrCut = FL2FXCONST_DBL(0.0f); pParams->boost = FL2FXCONST_DBL(0.0f); pParams->usrBoost = FL2FXCONST_DBL(0.0f); - pParams->targetRefLevel = -1; + pParams->targetRefLevel = 96; pParams->expiryFrame = AACDEC_DRC_DFLT_EXPIRY_FRAMES; - pParams->applyDigitalNorm = OFF; + pParams->applyDigitalNorm = ON; pParams->applyHeavyCompression = OFF; pParams->usrApplyHeavyCompression = OFF; diff --git a/libAACdec/src/aacdec_hcrs.cpp b/libAACdec/src/aacdec_hcrs.cpp index 1d5aa27..d2bc867 100644 --- a/libAACdec/src/aacdec_hcrs.cpp +++ b/libAACdec/src/aacdec_hcrs.cpp @@ -367,7 +367,10 @@ static UINT InitSegmentBitfield(UINT *pNumSegment, UINT tempWord; USHORT numValidSegment; - *pNumWordForBitfield = ((*pNumSegment - 1) >> THIRTYTWO_LOG_DIV_TWO_LOG) + 1; + *pNumWordForBitfield = + (*pNumSegment == 0) + ? 0 + : ((*pNumSegment - 1) >> THIRTYTWO_LOG_DIV_TWO_LOG) + 1; /* loop over all words, which are completely used or only partial */ /* bit in pSegmentBitfield is zero if segment is empty; bit in diff --git a/libAACdec/src/aacdecoder.cpp b/libAACdec/src/aacdecoder.cpp index 24907ee..7617937 100644 --- a/libAACdec/src/aacdecoder.cpp +++ b/libAACdec/src/aacdecoder.cpp @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -234,7 +234,8 @@ void CAacDecoder_SyncQmfMode(HANDLE_AACDECODER self) { MODE_HQ))) { /* MPS decoder does support the requested mode. */ break; } - } /* Fall-through: */ + } + FDK_FALLTHROUGH; default: if (self->qmfModeUser == NOT_DEFINED) { /* Revert in case mpegSurroundDecoder_SetParam() fails. */ @@ -538,13 +539,7 @@ static int CProgramConfigElement_Read(HANDLE_FDK_BITSTREAM bs, sizeof(CProgramConfig)); /* Store the complete PCE */ pceStatus = 1; /* New PCE but no change of config */ break; - case 2: /* The number of channels are identical but not the config */ - if (channelConfig == 0) { - FDKmemcpy(pce, tmpPce, - sizeof(CProgramConfig)); /* Store the complete PCE */ - pceStatus = 2; /* Decoder needs re-configuration */ - } - break; + case 2: /* The number of channels are identical but not the config */ case -1: /* The channel configuration is completely different */ pceStatus = -1; /* Not supported! */ break; @@ -775,7 +770,7 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_PreRollExtensionPayloadParse( /* For every AU get length and offset in the bitstream */ prerollAULength[i] = escapedValue(hBs, 16, 16, 0); if (prerollAULength[i] > 0) { - prerollAUOffset[i] = auStartAnchor - FDKgetValidBits(hBs); + prerollAUOffset[i] = auStartAnchor - (INT)FDKgetValidBits(hBs); independencyFlag = FDKreadBit(hBs); if (i == 0 && !independencyFlag) { *numPrerollAU = 0; @@ -938,6 +933,7 @@ static AAC_DECODER_ERROR CAacDecoder_ExtPayloadParse( case EXT_SBR_DATA_CRC: crcFlag = 1; + FDK_FALLTHROUGH; case EXT_SBR_DATA: if (IS_CHANNEL_ELEMENT(previous_element)) { SBR_ERROR sbrError; @@ -1076,6 +1072,7 @@ static AAC_DECODER_ERROR CAacDecoder_ExtPayloadParse( * intentional. */ break; } + FDK_FALLTHROUGH; case EXT_FIL: @@ -1108,12 +1105,13 @@ static AAC_DECODER_ERROR aacDecoder_ParseExplicitMpsAndSbr( /* get the remaining bits of this frame */ bitCnt = transportDec_GetAuBitsRemaining(self->hInput, 0); - if ((bitCnt > 0) && (self->flags[0] & AC_SBR_PRESENT) && + if ((self->flags[0] & AC_SBR_PRESENT) && (self->flags[0] & (AC_USAC | AC_RSVD50 | AC_ELD | AC_DRM))) { SBR_ERROR err = SBRDEC_OK; int chElIdx, numChElements = el_cnt[ID_SCE] + el_cnt[ID_CPE] + el_cnt[ID_LFE] + el_cnt[ID_USAC_SCE] + el_cnt[ID_USAC_CPE] + el_cnt[ID_USAC_LFE]; + INT bitCntTmp = bitCnt; if (self->flags[0] & AC_USAC) { chElIdx = numChElements - 1; @@ -1123,6 +1121,7 @@ static AAC_DECODER_ERROR aacDecoder_ParseExplicitMpsAndSbr( for (; chElIdx < numChElements; chElIdx += 1) { MP4_ELEMENT_ID sbrType; + SBR_ERROR errTmp; if (self->flags[0] & (AC_USAC)) { FDK_ASSERT((self->elements[element_index] == ID_USAC_SCE) || (self->elements[element_index] == ID_USAC_CPE)); @@ -1132,19 +1131,21 @@ static AAC_DECODER_ERROR aacDecoder_ParseExplicitMpsAndSbr( : ID_SCE; } else sbrType = self->elements[chElIdx]; - err = sbrDecoder_Parse(self->hSbrDecoder, bs, self->pDrmBsBuffer, - self->drmBsBufferSize, &bitCnt, -1, - self->flags[0] & AC_SBRCRC, sbrType, chElIdx, - self->flags[0], self->elFlags); - if (err != SBRDEC_OK) { - break; + errTmp = sbrDecoder_Parse(self->hSbrDecoder, bs, self->pDrmBsBuffer, + self->drmBsBufferSize, &bitCnt, -1, + self->flags[0] & AC_SBRCRC, sbrType, chElIdx, + self->flags[0], self->elFlags); + if (errTmp != SBRDEC_OK) { + err = errTmp; + bitCntTmp = bitCnt; + bitCnt = 0; } } switch (err) { case SBRDEC_PARSE_ERROR: /* Can not go on parsing because we do not know the length of the SBR extension data. */ - FDKpushFor(bs, bitCnt); + FDKpushFor(bs, bitCntTmp); bitCnt = 0; break; case SBRDEC_OK: @@ -1495,11 +1496,13 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc, switch (asc->m_aot) { case AOT_AAC_LC: self->streamInfo.profile = 1; + FDK_FALLTHROUGH; case AOT_ER_AAC_SCAL: if (asc->m_sc.m_gaSpecificConfig.m_layer > 0) { /* aac_scalable_extension_element() currently not supported. */ return AAC_DEC_UNSUPPORTED_FORMAT; } + FDK_FALLTHROUGH; case AOT_SBR: case AOT_PS: case AOT_ER_AAC_LC: @@ -1812,6 +1815,9 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc, self->useLdQmfTimeAlign = asc->m_sc.m_eldSpecificConfig.m_useLdQmfTimeAlign; } + if (self->sbrEnabled != asc->m_sbrPresentFlag) { + ascChanged = 1; + } } self->streamInfo.extAot = asc->m_extensionAudioObjectType; @@ -3024,9 +3030,11 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( aacChannels = 0; } - if (TRANSPORTDEC_OK != transportDec_CrcCheck(self->hInput)) { - ErrorStatus = AAC_DEC_CRC_ERROR; - self->frameOK = 0; + if (!(flags & (AACDEC_CONCEAL | AACDEC_FLUSH))) { + if (TRANSPORTDEC_OK != transportDec_CrcCheck(self->hInput)) { + ErrorStatus = AAC_DEC_CRC_ERROR; + self->frameOK = 0; + } } /* Ensure that in case of concealment a proper error status is set. */ diff --git a/libAACdec/src/aacdecoder_lib.cpp b/libAACdec/src/aacdecoder_lib.cpp index d98cf5a..86ec899 100644 --- a/libAACdec/src/aacdecoder_lib.cpp +++ b/libAACdec/src/aacdecoder_lib.cpp @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -119,8 +119,8 @@ amm-info@iis.fraunhofer.de /* Decoder library info */ #define AACDECODER_LIB_VL0 3 -#define AACDECODER_LIB_VL1 0 -#define AACDECODER_LIB_VL2 0 +#define AACDECODER_LIB_VL1 1 +#define AACDECODER_LIB_VL2 2 #define AACDECODER_LIB_TITLE "AAC Decoder Lib" #ifdef __ANDROID__ #define AACDECODER_LIB_BUILD_DATE "" @@ -368,9 +368,26 @@ static INT aacDecoder_CtrlCFGChangeCallback( return errTp; } +static INT aacDecoder_SbrCallback( + void *handle, HANDLE_FDK_BITSTREAM hBs, const INT sampleRateIn, + const INT sampleRateOut, const INT samplesPerFrame, + const AUDIO_OBJECT_TYPE coreCodec, const MP4_ELEMENT_ID elementID, + const INT elementIndex, const UCHAR harmonicSBR, + const UCHAR stereoConfigIndex, const UCHAR configMode, UCHAR *configChanged, + const INT downscaleFactor) { + HANDLE_SBRDECODER self = (HANDLE_SBRDECODER)handle; + + INT errTp = sbrDecoder_Header(self, hBs, sampleRateIn, sampleRateOut, + samplesPerFrame, coreCodec, elementID, + elementIndex, harmonicSBR, stereoConfigIndex, + configMode, configChanged, downscaleFactor); + + return errTp; +} + static INT aacDecoder_SscCallback(void *handle, HANDLE_FDK_BITSTREAM hBs, const AUDIO_OBJECT_TYPE coreCodec, - const INT samplingRate, + const INT samplingRate, const INT frameSize, const INT stereoConfigIndex, const INT coreSbrFrameLengthIndex, const INT configBytes, const UCHAR configMode, @@ -381,8 +398,8 @@ static INT aacDecoder_SscCallback(void *handle, HANDLE_FDK_BITSTREAM hBs, err = mpegSurroundDecoder_Config( (CMpegSurroundDecoder *)hAacDecoder->pMpegSurroundDecoder, hBs, coreCodec, - samplingRate, stereoConfigIndex, coreSbrFrameLengthIndex, configBytes, - configMode, configChanged); + samplingRate, frameSize, stereoConfigIndex, coreSbrFrameLengthIndex, + configBytes, configMode, configChanged); switch (err) { case MPS_UNSUPPORTED_CONFIG: @@ -617,6 +634,7 @@ static AAC_DECODER_ERROR setConcealMethod( switch (err) { case PCMDMX_INVALID_HANDLE: errorStatus = AAC_DEC_INVALID_HANDLE; + break; case PCMDMX_OK: break; default: @@ -805,11 +823,15 @@ LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_SetParam( case AAC_DRC_ATTENUATION_FACTOR: /* DRC compression factor (where 0 is no and 127 is max compression) */ errorStatus = aacDecoder_drcSetParam(hDrcInfo, DRC_CUT_SCALE, value); + uniDrcErr = FDK_drcDec_SetParam(self->hUniDrcDecoder, DRC_DEC_COMPRESS, + value * (FL2FXCONST_DBL(0.5f / 127.0f))); break; case AAC_DRC_BOOST_FACTOR: /* DRC boost factor (where 0 is no and 127 is max boost) */ errorStatus = aacDecoder_drcSetParam(hDrcInfo, DRC_BOOST_SCALE, value); + uniDrcErr = FDK_drcDec_SetParam(self->hUniDrcDecoder, DRC_DEC_BOOST, + value * (FL2FXCONST_DBL(0.5f / 127.0f))); break; case AAC_DRC_REFERENCE_LEVEL: @@ -853,6 +875,11 @@ LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_SetParam( uniDrcErr = FDK_drcDec_SetParam(self->hUniDrcDecoder, DRC_DEC_EFFECT_TYPE, (FIXP_DBL)value); break; + case AAC_UNIDRC_ALBUM_MODE: + uniDrcErr = FDK_drcDec_SetParam(self->hUniDrcDecoder, DRC_DEC_ALBUM_MODE, + (FIXP_DBL)value); + break; + case AAC_TPDEC_CLEAR_BUFFER: errTp = transportDec_SetParam(hTpDec, TPDEC_PARAM_RESET, 1); self->streamInfo.numLostAccessUnits = 0; @@ -959,7 +986,7 @@ LINKSPEC_CPP HANDLE_AACDECODER aacDecoder_Open(TRANSPORT_TYPE transportFmt, goto bail; } aacDec->qmfModeUser = NOT_DEFINED; - transportDec_RegisterSbrCallback(aacDec->hInput, (cbSbr_t)sbrDecoder_Header, + transportDec_RegisterSbrCallback(aacDec->hInput, aacDecoder_SbrCallback, (void *)aacDec->hSbrDecoder); if (mpegSurroundDecoder_Open( @@ -1380,9 +1407,13 @@ aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern, mpegSurroundDecoder_ConfigureQmfDomain( (CMpegSurroundDecoder *)self->pMpegSurroundDecoder, sac_interface, (UINT)self->streamInfo.aacSampleRate, self->streamInfo.aot); - self->qmfDomain.globalConf.nQmfTimeSlots_requested = - self->streamInfo.aacSamplesPerFrame / - self->qmfDomain.globalConf.nBandsAnalysis_requested; + if (self->qmfDomain.globalConf.nBandsAnalysis_requested > 0) { + self->qmfDomain.globalConf.nQmfTimeSlots_requested = + self->streamInfo.aacSamplesPerFrame / + self->qmfDomain.globalConf.nBandsAnalysis_requested; + } else { + self->qmfDomain.globalConf.nQmfTimeSlots_requested = 0; + } } self->qmfDomain.globalConf.TDinput = pTimeData; @@ -1645,6 +1676,13 @@ aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern, reverseOutChannelMap[ch] = ch; } + /* Update sampleRate and frameSize. This may be necessary in case of + * implicit SBR signaling */ + FDK_drcDec_SetParam(self->hUniDrcDecoder, DRC_DEC_SAMPLE_RATE, + self->streamInfo.sampleRate); + FDK_drcDec_SetParam(self->hUniDrcDecoder, DRC_DEC_FRAME_SIZE, + self->streamInfo.frameSize); + /* If SBR and/or MPS is active, the DRC gains are aligned to the QMF domain signal before the QMF synthesis. Therefore the DRC gains need to be delayed by the QMF synthesis delay. */ @@ -1865,7 +1903,7 @@ aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern, } /* USAC DASH IPF flushing possible end */ if (accessUnit < numPrerollAU) { - FDKpushBack(hBsAu, auStartAnchor - FDKgetValidBits(hBsAu)); + FDKpushBack(hBsAu, auStartAnchor - (INT)FDKgetValidBits(hBsAu)); } else { if ((self->buildUpStatus == AACDEC_RSV60_BUILD_UP_ON) || (self->buildUpStatus == AACDEC_RSV60_BUILD_UP_ON_IN_BAND) || diff --git a/libAACdec/src/block.cpp b/libAACdec/src/block.cpp index 7d2a4b9..b3d09a6 100644 --- a/libAACdec/src/block.cpp +++ b/libAACdec/src/block.cpp @@ -127,9 +127,11 @@ amm-info@iis.fraunhofer.de The function reads the escape sequence from the bitstream, if the absolute value of the quantized coefficient has the value 16. - A limitation is implemented to maximal 31 bits to prevent endless loops. - If it strikes, MAX_QUANTIZED_VALUE + 1 is returned, independent of the sign of - parameter q. + A limitation is implemented to maximal 21 bits according to + ISO/IEC 14496-3:2009(E) 4.6.3.3. + This limits the escape prefix to a maximum of eight 1's. + If more than eight 1's are read, MAX_QUANTIZED_VALUE + 1 is + returned, independent of the sign of parameter q. \return quantized coefficient */ @@ -139,11 +141,11 @@ LONG CBlock_GetEscape(HANDLE_FDK_BITSTREAM bs, /*!< pointer to bitstream */ if (fAbs(q) != 16) return (q); LONG i, off; - for (i = 4; i < 32; i++) { + for (i = 4; i < 13; i++) { if (FDKreadBit(bs) == 0) break; } - if (i == 32) return (MAX_QUANTIZED_VALUE + 1); + if (i == 13) return (MAX_QUANTIZED_VALUE + 1); off = FDKreadBits(bs, i); i = off + (1 << i); diff --git a/libAACdec/src/channel.cpp b/libAACdec/src/channel.cpp index cfffd57..a020034 100644 --- a/libAACdec/src/channel.cpp +++ b/libAACdec/src/channel.cpp @@ -592,6 +592,7 @@ AAC_DECODER_ERROR CChannelElement_Read( line: ~599 */ /* Note: The missing "break" is intentional here, since we need to call * CBlock_ReadScaleFactorData(). */ + FDK_FALLTHROUGH; case scale_factor_data: if (flags & AC_ER_RVLC) { diff --git a/libAACdec/src/channelinfo.h b/libAACdec/src/channelinfo.h index 45a288f..4523400 100644 --- a/libAACdec/src/channelinfo.h +++ b/libAACdec/src/channelinfo.h @@ -359,7 +359,7 @@ typedef struct { shouldBeUnion { struct { FIXP_DBL fac_data0[LFAC]; - UCHAR fac_data_e[4]; + SCHAR fac_data_e[4]; FIXP_DBL *fac_data[4]; /* Pointers to unused parts of pSpectralCoefficient */ diff --git a/libAACdec/src/conceal.cpp b/libAACdec/src/conceal.cpp index 569d672..5895cb8 100644 --- a/libAACdec/src/conceal.cpp +++ b/libAACdec/src/conceal.cpp @@ -1894,6 +1894,7 @@ INT CConcealment_TDFading( case ConcealState_FadeIn: idx = cntFadeFrames; idx -= TDFadeInStopBeforeFullLevel; + FDK_FALLTHROUGH; case ConcealState_Ok: fadeFactor = pConcealParams->fadeInFactor; idx = (concealState == ConcealState_Ok) ? -1 : idx; diff --git a/libAACdec/src/ldfiltbank.cpp b/libAACdec/src/ldfiltbank.cpp index 66a5914..c7d2928 100644 --- a/libAACdec/src/ldfiltbank.cpp +++ b/libAACdec/src/ldfiltbank.cpp @@ -216,6 +216,7 @@ int InvMdctTransformLowDelay_fdk(FIXP_DBL *mdctData, const int mdctData_e, int scale = mdctData_e + MDCT_OUT_HEADROOM - LDFB_HEADROOM; /* The LDFB_HEADROOM is compensated inside multE2_DinvF_fdk() below */ + int i; /* Select LD window slope */ switch (N) { @@ -261,10 +262,11 @@ int InvMdctTransformLowDelay_fdk(FIXP_DBL *mdctData, const int mdctData_e, } if (gain != (FIXP_DBL)0) { - scaleValuesWithFactor(mdctData, gain, N, scale); - } else { - scaleValues(mdctData, N, scale); + for (i = 0; i < N; i++) { + mdctData[i] = fMult(mdctData[i], gain); + } } + scaleValuesSaturate(mdctData, N, scale); /* Since all exponent and factors have been applied, current exponent is zero. */ diff --git a/libAACdec/src/usacdec_acelp.cpp b/libAACdec/src/usacdec_acelp.cpp index af1f488..c836c6a 100644 --- a/libAACdec/src/usacdec_acelp.cpp +++ b/libAACdec/src/usacdec_acelp.cpp @@ -309,7 +309,7 @@ static FIXP_DBL calc_period_factor(FIXP_DBL exc[], FIXP_SGL gain_pit, ener_exc = (FIXP_DBL)0; for (int i = 0; i < L_SUBFR; i++) { ener_exc += fPow2Div2(exc[i]) >> s; - if (ener_exc > FL2FXCONST_DBL(0.5f)) { + if (ener_exc >= FL2FXCONST_DBL(0.5f)) { ener_exc >>= 1; s++; } @@ -579,11 +579,11 @@ void Syn_filt(const FIXP_LPC a[], /* (i) : a[m] prediction coefficients Q12 */ L_tmp = (FIXP_DBL)0; for (j = 0; j < M_LP_FILTER_ORDER; j++) { - L_tmp -= fMultDiv2(a[j], y[i - (j + 1)]); + L_tmp -= fMultDiv2(a[j], y[i - (j + 1)]) >> (LP_FILTER_SCALE - 1); } - L_tmp = scaleValue(L_tmp, a_exp + 1); - y[i] = L_tmp + x[i]; + L_tmp = scaleValue(L_tmp, a_exp + LP_FILTER_SCALE); + y[i] = fAddSaturate(L_tmp, x[i]); } return; @@ -631,10 +631,10 @@ void E_UTIL_residu(const FIXP_LPC *a, const INT a_exp, FIXP_DBL *x, FIXP_DBL *y, s = (FIXP_DBL)0; for (j = 0; j < M_LP_FILTER_ORDER; j++) { - s += fMultDiv2(a[j], x[i - j - 1]); + s += fMultDiv2(a[j], x[i - j - 1]) >> (LP_FILTER_SCALE - 1); } - s = scaleValue(s, a_exp + 1); + s = scaleValue(s, a_exp + LP_FILTER_SCALE); y[i] = fAddSaturate(s, x[i]); } diff --git a/libAACdec/src/usacdec_const.h b/libAACdec/src/usacdec_const.h index c7dbae7..f68e808 100644 --- a/libAACdec/src/usacdec_const.h +++ b/libAACdec/src/usacdec_const.h @@ -115,6 +115,7 @@ amm-info@iis.fraunhofer.de /* definitions which are independent of coreCoderFrameLength */ #define M_LP_FILTER_ORDER 16 /* LP filter order */ +#define LP_FILTER_SCALE 4 /* LP filter scale */ #define PIT_MIN_12k8 34 /* Minimum pitch lag with resolution 1/4 */ #define PIT_MAX_12k8 231 /* Maximum pitch lag for fs=12.8kHz */ diff --git a/libAACdec/src/usacdec_fac.cpp b/libAACdec/src/usacdec_fac.cpp index 71ce4a9..0d3d844 100644 --- a/libAACdec/src/usacdec_fac.cpp +++ b/libAACdec/src/usacdec_fac.cpp @@ -142,7 +142,7 @@ FIXP_DBL *CLpd_FAC_GetMemory(CAacDecoderChannelInfo *pAacDecoderChannelInfo, return ptr; } -int CLpd_FAC_Read(HANDLE_FDK_BITSTREAM hBs, FIXP_DBL *pFac, UCHAR *pFacScale, +int CLpd_FAC_Read(HANDLE_FDK_BITSTREAM hBs, FIXP_DBL *pFac, SCHAR *pFacScale, int length, int use_gain, int frame) { FIXP_DBL fac_gain; int fac_gain_e = 0; @@ -191,13 +191,11 @@ static void Syn_filt_zero(const FIXP_LPC a[], const INT a_exp, INT length, L_tmp = (FIXP_DBL)0; for (j = 0; j < fMin(i, M_LP_FILTER_ORDER); j++) { - L_tmp -= fMultDiv2(a[j], x[i - (j + 1)]); + L_tmp -= fMultDiv2(a[j], x[i - (j + 1)]) >> (LP_FILTER_SCALE - 1); } - L_tmp = scaleValue(L_tmp, a_exp + 1); - - x[i] = scaleValueSaturate((x[i] >> 1) + (L_tmp >> 1), - 1); /* Avoid overflow issues and saturate. */ + L_tmp = scaleValue(L_tmp, a_exp + LP_FILTER_SCALE); + x[i] = fAddSaturate(x[i], L_tmp); } } @@ -536,10 +534,12 @@ INT CLpd_FAC_Acelp2Mdct(H_MDCT hMdct, FIXP_DBL *output, FIXP_DBL *_pSpec, /* Optional scaling of time domain - no yet windowed - of current spectrum */ if (total_gain != (FIXP_DBL)0) { - scaleValuesWithFactor(pSpec, total_gain, tl, spec_scale[0] + scale); - } else { - scaleValues(pSpec, tl, spec_scale[0] + scale); + for (i = 0; i < tl; i++) { + pSpec[i] = fMult(pSpec[i], total_gain); + } } + int loc_scale = fixmin_I(spec_scale[0] + scale, (INT)DFRACT_BITS - 1); + scaleValuesSaturate(pSpec, tl, loc_scale); pOut1 += fl / 2 - 1; pCurr = pSpec + tl - fl / 2; @@ -625,10 +625,12 @@ INT CLpd_FAC_Acelp2Mdct(H_MDCT hMdct, FIXP_DBL *output, FIXP_DBL *_pSpec, */ /* and de-scale current spectrum signal (time domain, no yet windowed) */ if (total_gain != (FIXP_DBL)0) { - scaleValuesWithFactor(pSpec, total_gain, tl, spec_scale[w] + scale); - } else { - scaleValues(pSpec, tl, spec_scale[w] + scale); + for (i = 0; i < tl; i++) { + pSpec[i] = fMult(pSpec[i], total_gain); + } } + loc_scale = fixmin_I(spec_scale[w] + scale, (INT)DFRACT_BITS - 1); + scaleValuesSaturate(pSpec, tl, loc_scale); if (noOutSamples <= nrSamples) { /* Divert output first half to overlap buffer if we already got enough diff --git a/libAACdec/src/usacdec_fac.h b/libAACdec/src/usacdec_fac.h index bf13552..100a6fa 100644 --- a/libAACdec/src/usacdec_fac.h +++ b/libAACdec/src/usacdec_fac.h @@ -131,7 +131,7 @@ FIXP_DBL *CLpd_FAC_GetMemory(CAacDecoderChannelInfo *pAacDecoderChannelInfo, * Always 0 for FD case. * \return 0 on success, -1 on error. */ -int CLpd_FAC_Read(HANDLE_FDK_BITSTREAM hBs, FIXP_DBL *pFac, UCHAR *pFacScale, +int CLpd_FAC_Read(HANDLE_FDK_BITSTREAM hBs, FIXP_DBL *pFac, SCHAR *pFacScale, int length, int use_gain, int frame); /** diff --git a/libAACdec/src/usacdec_lpd.cpp b/libAACdec/src/usacdec_lpd.cpp index 22069a6..e0a2631 100644 --- a/libAACdec/src/usacdec_lpd.cpp +++ b/libAACdec/src/usacdec_lpd.cpp @@ -418,6 +418,7 @@ void CLpd_AdaptLowFreqDeemph(FIXP_DBL x[], int lg, FIXP_DBL alfd_gains[], FIXP_DBL tmp_pow2[32]; s = s * 2 + ALFDPOW2_SCALE; + s = fMin(31, s); k = 8; i_max = lg / 4; /* ALFD range = 1600Hz (lg = 6400Hz) */ @@ -1221,8 +1222,7 @@ AAC_DECODER_ERROR CLpdChannelStream_Read( (INT)(samplingRate * PIT_MIN_12k8 + (FSCALE_DENOM / 2)) / FSCALE_DENOM - (INT)PIT_MIN_12k8; - if (pSamplingRateInfo->samplingRate > - FAC_FSCALE_MAX /* maximum allowed core sampling frequency */) { + if ((samplingRate < 6000) || (samplingRate > 24000)) { error = AAC_DEC_PARSE_ERROR; goto bail; } diff --git a/libAACenc/src/aacenc_lib.cpp b/libAACenc/src/aacenc_lib.cpp index 11db3da..0f0094f 100644 --- a/libAACenc/src/aacenc_lib.cpp +++ b/libAACenc/src/aacenc_lib.cpp @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -907,6 +907,7 @@ static AACENC_ERROR FDKaacEnc_AdjustEncSettings(HANDLE_AACENCODER hAacEncoder, case AOT_MP2_AAC_LC: case AOT_MP2_SBR: hAacConfig->usePns = 0; + FDK_FALLTHROUGH; case AOT_AAC_LC: case AOT_SBR: case AOT_PS: @@ -1215,7 +1216,8 @@ static INT aacenc_SbrCallback(void *self, HANDLE_FDK_BITSTREAM hBs, INT aacenc_SscCallback(void *self, HANDLE_FDK_BITSTREAM hBs, const AUDIO_OBJECT_TYPE coreCodec, - const INT samplingRate, const INT stereoConfigIndex, + const INT samplingRate, const INT frameSize, + const INT stereoConfigIndex, const INT coreSbrFrameLengthIndex, const INT configBytes, const UCHAR configMode, UCHAR *configChanged) { HANDLE_AACENCODER hAacEncoder = (HANDLE_AACENCODER)self; @@ -1733,9 +1735,10 @@ AACENC_ERROR aacEncEncode(const HANDLE_AACENCODER hAacEncoder, } /* check if buffer descriptors are filled out properly. */ - if ((AACENC_OK != validateBufDesc(inBufDesc)) || - (AACENC_OK != validateBufDesc(outBufDesc)) || (inargs == NULL) || - (outargs == NULL)) { + if ((inargs == NULL) || (outargs == NULL) || + ((AACENC_OK != validateBufDesc(inBufDesc)) && + (inargs->numInSamples > 0)) || + (AACENC_OK != validateBufDesc(outBufDesc))) { err = AACENC_UNSUPPORTED_PARAMETER; goto bail; } @@ -1758,6 +1761,10 @@ AACENC_ERROR aacEncEncode(const HANDLE_AACENCODER hAacEncoder, hAacEncoder->inputBuffer + (hAacEncoder->inputBufferOffset + hAacEncoder->nSamplesRead) / hAacEncoder->aacConfig.nChannels; + newSamples -= + (newSamples % + hAacEncoder->extParam + .nChannels); /* process multiple samples of input channels */ /* Copy new input samples to internal buffer */ if (inBufDesc->bufElSizes[idx] == (INT)sizeof(INT_PCM)) { @@ -2090,12 +2097,14 @@ AACENC_ERROR aacEncoder_SetParam(const HANDLE_AACENCODER hAacEncoder, err = AACENC_INVALID_CONFIG; goto bail; } + FDK_FALLTHROUGH; case AOT_SBR: case AOT_MP2_SBR: if (!(hAacEncoder->encoder_modis & (ENC_MODE_FLAG_SBR))) { err = AACENC_INVALID_CONFIG; goto bail; } + FDK_FALLTHROUGH; case AOT_AAC_LC: case AOT_MP2_AAC_LC: case AOT_ER_AAC_LD: diff --git a/libAACenc/src/adj_thr.cpp b/libAACenc/src/adj_thr.cpp index 6e19680..226d003 100644 --- a/libAACenc/src/adj_thr.cpp +++ b/libAACenc/src/adj_thr.cpp @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -591,13 +591,11 @@ static void FDKaacEnc_initAvoidHoleFlag( if (sfbEn > avgEn) { FIXP_DBL tmpMinSnrLdData; if (psyOutChannel[ch]->lastWindowSequence == LONG_WINDOW) - tmpMinSnrLdData = - fixMax(SnrLdFac + (FIXP_DBL)(avgEnLdData - sfbEnLdData), - (FIXP_DBL)SnrLdMin1); + tmpMinSnrLdData = SnrLdFac + fixMax(avgEnLdData - sfbEnLdData, + SnrLdMin1 - SnrLdFac); else - tmpMinSnrLdData = - fixMax(SnrLdFac + (FIXP_DBL)(avgEnLdData - sfbEnLdData), - (FIXP_DBL)SnrLdMin3); + tmpMinSnrLdData = SnrLdFac + fixMax(avgEnLdData - sfbEnLdData, + SnrLdMin3 - SnrLdFac); qcOutChan->sfbMinSnrLdData[sfbGrp + sfb] = fixMin( qcOutChan->sfbMinSnrLdData[sfbGrp + sfb], tmpMinSnrLdData); diff --git a/libAACenc/src/bitenc.cpp b/libAACenc/src/bitenc.cpp index 652d1fd..957e821 100644 --- a/libAACenc/src/bitenc.cpp +++ b/libAACenc/src/bitenc.cpp @@ -643,6 +643,7 @@ static INT FDKaacEnc_writeExtensionPayload(HANDLE_FDK_BITSTREAM hBitStream, FDKwriteBits(hBitStream, *extPayloadData++, 4); /* nibble */ } extBitsUsed += 4; + FDK_FALLTHROUGH; case EXT_DYNAMIC_RANGE: case EXT_SBR_DATA: case EXT_SBR_DATA_CRC: @@ -690,6 +691,7 @@ static INT FDKaacEnc_writeExtensionPayload(HANDLE_FDK_BITSTREAM hBitStream, case EXT_FILL_DATA: fillByte = 0xA5; + FDK_FALLTHROUGH; case EXT_FIL: default: if (hBitStream != NULL) { diff --git a/libAACenc/src/intensity.cpp b/libAACenc/src/intensity.cpp index a160a4f..0944fa3 100644 --- a/libAACenc/src/intensity.cpp +++ b/libAACenc/src/intensity.cpp @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -661,6 +661,7 @@ void FDKaacEnc_IntensityStereoProcessing( for (sfboffs = 0; sfboffs < maxSfbPerGroup; sfboffs++) { INT sL, sR; FIXP_DBL inv_n; + INT mdct_spec_sf = MDCT_SPEC_SF; msMask[sfb + sfboffs] = 0; if (isMask[sfb + sfboffs] == 0) { @@ -682,6 +683,12 @@ void FDKaacEnc_IntensityStereoProcessing( } } + if (sfbOffset[sfb + sfboffs + 1] - sfbOffset[sfb + sfboffs] > + 1 << mdct_spec_sf) { + mdct_spec_sf++; /* This is for rare cases where the number of bins in a + scale factor band is > 64 */ + } + inv_n = GetInvInt( (sfbOffset[sfb + sfboffs + 1] - sfbOffset[sfb + sfboffs]) >> 1); // scaled with 2 to compensate fMultDiv2() in subsequent loop @@ -707,11 +714,11 @@ void FDKaacEnc_IntensityStereoProcessing( j++) { d = ((mdctSpectrumLeft[j] << s0) >> 1) - ((mdctSpectrumRight[j] << s0) >> 1); - ed += fMultDiv2(d, d) >> (MDCT_SPEC_SF - 1); + ed += fMultDiv2(d, d) >> (mdct_spec_sf - 1); } msMask[sfb + sfboffs] = 1; tmp = fDivNorm(sfbEnergyLeft[sfb + sfboffs], ed, &s1); - s2 = (s1) + (2 * s0) - 2 - MDCT_SPEC_SF; + s2 = (s1) + (2 * s0) - 2 - mdct_spec_sf; if (s2 & 1) { tmp = tmp >> 1; s2 = s2 + 1; @@ -748,12 +755,12 @@ void FDKaacEnc_IntensityStereoProcessing( s = ((mdctSpectrumLeft[j] << s0) >> 1) + ((mdctSpectrumRight[j] << s0) >> 1); es += fMultDiv2(s, s) >> - (MDCT_SPEC_SF - - 1); // scaled 2*(mdctScale - s0 + 1) + MDCT_SPEC_SF + (mdct_spec_sf - + 1); // scaled 2*(mdctScale - s0 + 1) + mdct_spec_sf } msMask[sfb + sfboffs] = 0; tmp = fDivNorm(sfbEnergyLeft[sfb + sfboffs], es, &s1); - s2 = (s1) + (2 * s0) - 2 - MDCT_SPEC_SF; + s2 = (s1) + (2 * s0) - 2 - mdct_spec_sf; if (s2 & 1) { tmp = tmp >> 1; s2 = s2 + 1; diff --git a/libArithCoding/src/ac_arith_coder.cpp b/libArithCoding/src/ac_arith_coder.cpp index b791f39..a433b08 100644 --- a/libArithCoding/src/ac_arith_coder.cpp +++ b/libArithCoding/src/ac_arith_coder.cpp @@ -609,13 +609,16 @@ static inline ULONG get_pk_v2(ULONG s) { return (j & 0x3F); } -static void decode2(HANDLE_FDK_BITSTREAM bbuf, UCHAR *RESTRICT c_prev, - FIXP_DBL *RESTRICT pSpectralCoefficient, INT n, INT nt) { +static ARITH_CODING_ERROR decode2(HANDLE_FDK_BITSTREAM bbuf, + UCHAR *RESTRICT c_prev, + FIXP_DBL *RESTRICT pSpectralCoefficient, + INT n, INT nt) { Tastat as; int i, l, r; INT lev, esc_nb, pki; USHORT state_inc; UINT s; + ARITH_CODING_ERROR ErrorStatus = ARITH_CODER_OK; int c_3 = 0; /* context of current frame 3 time steps ago */ int c_2 = 0; /* context of current frame 2 time steps ago */ @@ -655,6 +658,8 @@ static void decode2(HANDLE_FDK_BITSTREAM bbuf, UCHAR *RESTRICT c_prev, lev++; + if (lev > 23) return ARITH_CODER_ERROR; + if (esc_nb < 7) { esc_nb++; } @@ -721,6 +726,8 @@ static void decode2(HANDLE_FDK_BITSTREAM bbuf, UCHAR *RESTRICT c_prev, } FDKmemset(&c_prev[i], 1, sizeof(c_prev[0]) * (nt - i)); + + return ErrorStatus; } CArcoData *CArco_Create(void) { return GetArcoData(); } @@ -763,7 +770,8 @@ ARITH_CODING_ERROR CArco_DecodeArithData(CArcoData *pArcoData, pArcoData->m_numberLinesPrev = lg_max; if (lg > 0) { - decode2(hBs, pArcoData->c_prev + 2, mdctSpectrum, lg >> 1, lg_max >> 1); + ErrorStatus = + decode2(hBs, pArcoData->c_prev + 2, mdctSpectrum, lg >> 1, lg_max >> 1); } else { FDKmemset(&pArcoData->c_prev[2], 1, sizeof(pArcoData->c_prev[2]) * (lg_max >> 1)); diff --git a/libDRCdec/include/FDK_drcDecLib.h b/libDRCdec/include/FDK_drcDecLib.h index e187e18..2d28d23 100644 --- a/libDRCdec/include/FDK_drcDecLib.h +++ b/libDRCdec/include/FDK_drcDecLib.h @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -134,6 +134,7 @@ typedef enum { DRC_DEC_EFFECT_TYPE, DRC_DEC_EFFECT_TYPE_FALLBACK_CODE, DRC_DEC_LOUDNESS_MEASUREMENT_METHOD, + DRC_DEC_ALBUM_MODE, /* set only system (not user) parameters */ DRC_DEC_DOWNMIX_ID, DRC_DEC_TARGET_CHANNEL_COUNT_REQUESTED, /**< number of output channels @@ -141,6 +142,8 @@ typedef enum { choosing an appropriate downmixInstruction */ DRC_DEC_BASE_CHANNEL_COUNT, + DRC_DEC_FRAME_SIZE, + DRC_DEC_SAMPLE_RATE, /* get only system parameters */ DRC_DEC_IS_MULTIBAND_DRC_1, DRC_DEC_IS_MULTIBAND_DRC_2, diff --git a/libDRCdec/src/FDK_drcDecLib.cpp b/libDRCdec/src/FDK_drcDecLib.cpp index b29b79d..4f8ebc7 100644 --- a/libDRCdec/src/FDK_drcDecLib.cpp +++ b/libDRCdec/src/FDK_drcDecLib.cpp @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -173,13 +173,11 @@ static int isResetNeeded(HANDLE_DRC_DECODER hDrcDec, return resetNeeded; } -static DRC_DEC_ERROR startSelectionProcess(HANDLE_DRC_DECODER hDrcDec) { - DRC_ERROR dErr = DE_OK; - DRCDEC_SELECTION_PROCESS_RETURN sErr = DRCDEC_SELECTION_PROCESS_NO_ERROR; +static void startSelectionProcess(HANDLE_DRC_DECODER hDrcDec) { int uniDrcConfigHasChanged = 0; SEL_PROC_OUTPUT oldSelProcOutput = hDrcDec->selProcOutput; - if (!hDrcDec->status) return DRC_DEC_NOT_READY; + if (!hDrcDec->status) return; if (hDrcDec->functionalRange & DRC_DEC_SELECTION) { uniDrcConfigHasChanged = hDrcDec->uniDrcConfig.diff; @@ -189,10 +187,9 @@ static DRC_DEC_ERROR startSelectionProcess(HANDLE_DRC_DECODER hDrcDec) { */ hDrcDec->selProcOutput.numSelectedDrcSets = 0; - sErr = drcDec_SelectionProcess_Process( + drcDec_SelectionProcess_Process( hDrcDec->hSelectionProc, &(hDrcDec->uniDrcConfig), &(hDrcDec->loudnessInfoSet), &(hDrcDec->selProcOutput)); - if (sErr) return DRC_DEC_OK; hDrcDec->selProcInputDiff = 0; hDrcDec->uniDrcConfig.diff = 0; @@ -202,15 +199,12 @@ static DRC_DEC_ERROR startSelectionProcess(HANDLE_DRC_DECODER hDrcDec) { if (hDrcDec->functionalRange & DRC_DEC_GAIN) { if (isResetNeeded(hDrcDec, oldSelProcOutput) || uniDrcConfigHasChanged) { - dErr = - drcDec_GainDecoder_Config(hDrcDec->hGainDec, &(hDrcDec->uniDrcConfig), - hDrcDec->selProcOutput.numSelectedDrcSets, - hDrcDec->selProcOutput.selectedDrcSetIds, - hDrcDec->selProcOutput.selectedDownmixIds); - if (dErr) return DRC_DEC_OK; + drcDec_GainDecoder_Config(hDrcDec->hGainDec, &(hDrcDec->uniDrcConfig), + hDrcDec->selProcOutput.numSelectedDrcSets, + hDrcDec->selProcOutput.selectedDrcSetIds, + hDrcDec->selProcOutput.selectedDownmixIds); } } - return DRC_DEC_OK; } DRC_DEC_ERROR @@ -342,7 +336,13 @@ FDK_drcDec_Init(HANDLE_DRC_DECODER hDrcDec, const int frameSize, } if (hDrcDec->functionalRange & DRC_DEC_GAIN) { - dErr = drcDec_GainDecoder_Init(hDrcDec->hGainDec, frameSize, sampleRate); + dErr = drcDec_GainDecoder_SetParam(hDrcDec->hGainDec, GAIN_DEC_FRAME_SIZE, + frameSize); + if (dErr) return DRC_DEC_NOT_OK; + dErr = drcDec_GainDecoder_SetParam(hDrcDec->hGainDec, GAIN_DEC_SAMPLE_RATE, + sampleRate); + if (dErr) return DRC_DEC_NOT_OK; + dErr = drcDec_GainDecoder_Init(hDrcDec->hGainDec); if (dErr) return DRC_DEC_NOT_OK; } @@ -383,73 +383,99 @@ DRC_DEC_ERROR FDK_drcDec_SetParam(HANDLE_DRC_DECODER hDrcDec, const DRC_DEC_USERPARAM requestType, const FIXP_DBL requestValue) { + DRC_ERROR dErr = DE_OK; DRCDEC_SELECTION_PROCESS_RETURN sErr = DRCDEC_SELECTION_PROCESS_NO_ERROR; + int invalidParameter = 0; if (hDrcDec == NULL) return DRC_DEC_NOT_OPENED; - if (hDrcDec->functionalRange == DRC_DEC_GAIN) - return DRC_DEC_NOT_OK; /* not supported for DRC_DEC_GAIN. All parameters are - handed over to selection process lib. */ + if (hDrcDec->functionalRange & DRC_DEC_GAIN) { + switch (requestType) { + case DRC_DEC_SAMPLE_RATE: + dErr = drcDec_GainDecoder_SetParam( + hDrcDec->hGainDec, GAIN_DEC_SAMPLE_RATE, (int)requestValue); + if (dErr) return DRC_DEC_PARAM_OUT_OF_RANGE; + break; + case DRC_DEC_FRAME_SIZE: + dErr = drcDec_GainDecoder_SetParam( + hDrcDec->hGainDec, GAIN_DEC_FRAME_SIZE, (int)requestValue); + if (dErr) return DRC_DEC_PARAM_OUT_OF_RANGE; + break; + default: + invalidParameter |= DRC_DEC_GAIN; + } + } - switch (requestType) { - case DRC_DEC_BOOST: - sErr = drcDec_SelectionProcess_SetParam(hDrcDec->hSelectionProc, - SEL_PROC_BOOST, requestValue, - &(hDrcDec->selProcInputDiff)); - if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; - break; - case DRC_DEC_COMPRESS: - sErr = drcDec_SelectionProcess_SetParam(hDrcDec->hSelectionProc, - SEL_PROC_COMPRESS, requestValue, - &(hDrcDec->selProcInputDiff)); - if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; - break; - case DRC_DEC_LOUDNESS_NORMALIZATION_ON: - sErr = drcDec_SelectionProcess_SetParam( - hDrcDec->hSelectionProc, SEL_PROC_LOUDNESS_NORMALIZATION_ON, - requestValue, &(hDrcDec->selProcInputDiff)); - if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; - break; - case DRC_DEC_TARGET_LOUDNESS: - sErr = drcDec_SelectionProcess_SetParam( - hDrcDec->hSelectionProc, SEL_PROC_TARGET_LOUDNESS, requestValue, - &(hDrcDec->selProcInputDiff)); - if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; - break; - case DRC_DEC_EFFECT_TYPE: - sErr = drcDec_SelectionProcess_SetParam( - hDrcDec->hSelectionProc, SEL_PROC_EFFECT_TYPE, requestValue, - &(hDrcDec->selProcInputDiff)); - if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; - break; - case DRC_DEC_DOWNMIX_ID: - sErr = drcDec_SelectionProcess_SetParam(hDrcDec->hSelectionProc, - SEL_PROC_DOWNMIX_ID, requestValue, - &(hDrcDec->selProcInputDiff)); - if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; - break; - case DRC_DEC_TARGET_CHANNEL_COUNT_REQUESTED: - sErr = drcDec_SelectionProcess_SetParam( - hDrcDec->hSelectionProc, SEL_PROC_TARGET_CHANNEL_COUNT, requestValue, - &(hDrcDec->selProcInputDiff)); - if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; - break; - case DRC_DEC_BASE_CHANNEL_COUNT: - sErr = drcDec_SelectionProcess_SetParam( - hDrcDec->hSelectionProc, SEL_PROC_BASE_CHANNEL_COUNT, requestValue, - &(hDrcDec->selProcInputDiff)); - if (sErr) return DRC_DEC_NOT_OK; - break; - case DRC_DEC_LOUDNESS_MEASUREMENT_METHOD: - sErr = drcDec_SelectionProcess_SetParam( - hDrcDec->hSelectionProc, SEL_PROC_LOUDNESS_MEASUREMENT_METHOD, - requestValue, &(hDrcDec->selProcInputDiff)); - if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; - break; - default: - return DRC_DEC_INVALID_PARAM; + if (hDrcDec->functionalRange & DRC_DEC_SELECTION) { + switch (requestType) { + case DRC_DEC_BOOST: + sErr = drcDec_SelectionProcess_SetParam(hDrcDec->hSelectionProc, + SEL_PROC_BOOST, requestValue, + &(hDrcDec->selProcInputDiff)); + if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; + break; + case DRC_DEC_COMPRESS: + sErr = drcDec_SelectionProcess_SetParam(hDrcDec->hSelectionProc, + SEL_PROC_COMPRESS, requestValue, + &(hDrcDec->selProcInputDiff)); + if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; + break; + case DRC_DEC_LOUDNESS_NORMALIZATION_ON: + sErr = drcDec_SelectionProcess_SetParam( + hDrcDec->hSelectionProc, SEL_PROC_LOUDNESS_NORMALIZATION_ON, + requestValue, &(hDrcDec->selProcInputDiff)); + if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; + break; + case DRC_DEC_TARGET_LOUDNESS: + sErr = drcDec_SelectionProcess_SetParam( + hDrcDec->hSelectionProc, SEL_PROC_TARGET_LOUDNESS, requestValue, + &(hDrcDec->selProcInputDiff)); + if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; + break; + case DRC_DEC_EFFECT_TYPE: + sErr = drcDec_SelectionProcess_SetParam( + hDrcDec->hSelectionProc, SEL_PROC_EFFECT_TYPE, requestValue, + &(hDrcDec->selProcInputDiff)); + if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; + break; + case DRC_DEC_DOWNMIX_ID: + sErr = drcDec_SelectionProcess_SetParam( + hDrcDec->hSelectionProc, SEL_PROC_DOWNMIX_ID, requestValue, + &(hDrcDec->selProcInputDiff)); + if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; + break; + case DRC_DEC_TARGET_CHANNEL_COUNT_REQUESTED: + sErr = drcDec_SelectionProcess_SetParam( + hDrcDec->hSelectionProc, SEL_PROC_TARGET_CHANNEL_COUNT, + requestValue, &(hDrcDec->selProcInputDiff)); + if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; + break; + case DRC_DEC_BASE_CHANNEL_COUNT: + sErr = drcDec_SelectionProcess_SetParam( + hDrcDec->hSelectionProc, SEL_PROC_BASE_CHANNEL_COUNT, requestValue, + &(hDrcDec->selProcInputDiff)); + if (sErr) return DRC_DEC_NOT_OK; + break; + case DRC_DEC_LOUDNESS_MEASUREMENT_METHOD: + sErr = drcDec_SelectionProcess_SetParam( + hDrcDec->hSelectionProc, SEL_PROC_LOUDNESS_MEASUREMENT_METHOD, + requestValue, &(hDrcDec->selProcInputDiff)); + if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; + break; + case DRC_DEC_ALBUM_MODE: + sErr = drcDec_SelectionProcess_SetParam( + hDrcDec->hSelectionProc, SEL_PROC_ALBUM_MODE, requestValue, + &(hDrcDec->selProcInputDiff)); + if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; + break; + default: + invalidParameter |= DRC_DEC_SELECTION; + } } + if (invalidParameter == hDrcDec->functionalRange) + return DRC_DEC_INVALID_PARAM; + /* All parameters need a new start of the selection process */ startSelectionProcess(hDrcDec); @@ -721,9 +747,9 @@ FDK_drcDec_ReadUniDrc(HANDLE_DRC_DECODER hDrcDec, drcDec_GainDecoder_GetFrameSize(hDrcDec->hGainDec), drcDec_GainDecoder_GetDeltaTminDefault(hDrcDec->hGainDec), &(hDrcDec->uniDrcGain)); - if (dErr) return DRC_DEC_NOT_OK; startSelectionProcess(hDrcDec); + if (dErr) return DRC_DEC_NOT_OK; hDrcDec->status = DRC_DEC_NEW_GAIN_PAYLOAD; diff --git a/libDRCdec/src/drcDec_gainDecoder.cpp b/libDRCdec/src/drcDec_gainDecoder.cpp index ca81fad..9d91267 100644 --- a/libDRCdec/src/drcDec_gainDecoder.cpp +++ b/libDRCdec/src/drcDec_gainDecoder.cpp @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -170,11 +170,10 @@ drcDec_GainDecoder_Open(HANDLE_DRC_GAIN_DECODER* phGainDec) { } DRC_ERROR -drcDec_GainDecoder_Init(HANDLE_DRC_GAIN_DECODER hGainDec, const int frameSize, - const int sampleRate) { +drcDec_GainDecoder_Init(HANDLE_DRC_GAIN_DECODER hGainDec) { DRC_ERROR err = DE_OK; - err = initGainDec(hGainDec, frameSize, sampleRate); + err = initGainDec(hGainDec); if (err) return err; initDrcGainBuffers(hGainDec->frameSize, &hGainDec->drcGainBuffers); @@ -183,6 +182,25 @@ drcDec_GainDecoder_Init(HANDLE_DRC_GAIN_DECODER hGainDec, const int frameSize, } DRC_ERROR +drcDec_GainDecoder_SetParam(HANDLE_DRC_GAIN_DECODER hGainDec, + const GAIN_DEC_PARAM paramType, + const int paramValue) { + switch (paramType) { + case GAIN_DEC_FRAME_SIZE: + if (paramValue < 0) return DE_PARAM_OUT_OF_RANGE; + hGainDec->frameSize = paramValue; + break; + case GAIN_DEC_SAMPLE_RATE: + if (paramValue < 0) return DE_PARAM_OUT_OF_RANGE; + hGainDec->deltaTminDefault = getDeltaTmin(paramValue); + break; + default: + return DE_PARAM_INVALID; + } + return DE_OK; +} + +DRC_ERROR drcDec_GainDecoder_SetCodecDependentParameters( HANDLE_DRC_GAIN_DECODER hGainDec, const DELAY_MODE delayMode, const int timeDomainSupported, diff --git a/libDRCdec/src/drcDec_gainDecoder.h b/libDRCdec/src/drcDec_gainDecoder.h index 2f4df4c..394b455 100644 --- a/libDRCdec/src/drcDec_gainDecoder.h +++ b/libDRCdec/src/drcDec_gainDecoder.h @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -134,6 +134,8 @@ typedef enum { GAIN_DEC_DRC2_DRC3 } GAIN_DEC_LOCATION; +typedef enum { GAIN_DEC_FRAME_SIZE, GAIN_DEC_SAMPLE_RATE } GAIN_DEC_PARAM; + typedef struct { FIXP_DBL gainLin; /* e = 7 */ SHORT time; @@ -195,8 +197,12 @@ DRC_ERROR drcDec_GainDecoder_Open(HANDLE_DRC_GAIN_DECODER* phGainDec); DRC_ERROR -drcDec_GainDecoder_Init(HANDLE_DRC_GAIN_DECODER hGainDec, const int frameSize, - const int sampleRate); +drcDec_GainDecoder_Init(HANDLE_DRC_GAIN_DECODER hGainDec); + +DRC_ERROR +drcDec_GainDecoder_SetParam(HANDLE_DRC_GAIN_DECODER hGainDec, + const GAIN_DEC_PARAM paramType, + const int paramValue); DRC_ERROR drcDec_GainDecoder_SetCodecDependentParameters( diff --git a/libDRCdec/src/drcDec_reader.cpp b/libDRCdec/src/drcDec_reader.cpp index 6fe7a04..a784457 100644 --- a/libDRCdec/src/drcDec_reader.cpp +++ b/libDRCdec/src/drcDec_reader.cpp @@ -185,10 +185,18 @@ drcDec_readUniDrc(HANDLE_FDK_BITSTREAM hBs, HANDLE_UNI_DRC_CONFIG hUniDrcConfig, uniDrcConfigPresent = FDKreadBits(hBs, 1); if (uniDrcConfigPresent) { err = drcDec_readUniDrcConfig(hBs, hUniDrcConfig); - if (err) return err; + if (err) { + /* clear config, if parsing error occured */ + FDKmemclear(hUniDrcConfig, sizeof(UNI_DRC_CONFIG)); + hUniDrcConfig->diff = 1; + } } err = drcDec_readLoudnessInfoSet(hBs, hLoudnessInfoSet); - if (err) return err; + if (err) { + /* clear config, if parsing error occured */ + FDKmemclear(hLoudnessInfoSet, sizeof(LOUDNESS_INFO_SET)); + hLoudnessInfoSet->diff = 1; + } } if (hUniDrcGain != NULL) { @@ -1130,7 +1138,7 @@ static DRC_ERROR _readDrcCoefficientsUniDrc(HANDLE_FDK_BITSTREAM hBs, drcCharacteristicLeftPresent = FDKreadBits(hBs, 1); if (drcCharacteristicLeftPresent) { pCoef->characteristicLeftCount = FDKreadBits(hBs, 4); - if ((pCoef->characteristicLeftCount + 1) > 8) return DE_MEMORY_ERROR; + if ((pCoef->characteristicLeftCount + 1) > 16) return DE_MEMORY_ERROR; for (i = 0; i < pCoef->characteristicLeftCount; i++) { err = _readCustomDrcCharacteristic( hBs, CS_LEFT, &(pCoef->characteristicLeftFormat[i + 1]), @@ -1141,7 +1149,7 @@ static DRC_ERROR _readDrcCoefficientsUniDrc(HANDLE_FDK_BITSTREAM hBs, drcCharacteristicRightPresent = FDKreadBits(hBs, 1); if (drcCharacteristicRightPresent) { pCoef->characteristicRightCount = FDKreadBits(hBs, 4); - if ((pCoef->characteristicRightCount + 1) > 8) return DE_MEMORY_ERROR; + if ((pCoef->characteristicRightCount + 1) > 16) return DE_MEMORY_ERROR; for (i = 0; i < pCoef->characteristicRightCount; i++) { err = _readCustomDrcCharacteristic( hBs, CS_RIGHT, &(pCoef->characteristicRightFormat[i + 1]), diff --git a/libDRCdec/src/drcDec_selectionProcess.cpp b/libDRCdec/src/drcDec_selectionProcess.cpp index 54b731d..c33bf74 100644 --- a/libDRCdec/src/drcDec_selectionProcess.cpp +++ b/libDRCdec/src/drcDec_selectionProcess.cpp @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -555,6 +555,11 @@ drcDec_SelectionProcess_SetParam(HANDLE_DRC_SELECTION_PROCESS hInstance, diff |= _compAssign(&pSelProcInput->loudnessMeasurementMethod, requestValueInt); break; + case SEL_PROC_ALBUM_MODE: + if ((requestValueInt < 0) || (requestValueInt > 1)) + return DRCDEC_SELECTION_PROCESS_PARAM_OUT_OF_RANGE; + diff |= _compAssign(&pSelProcInput->albumMode, requestValueInt); + break; case SEL_PROC_DOWNMIX_ID: diff |= _compAssign(&pSelProcInput->targetConfigRequestType, TCRT_DOWNMIX_ID); @@ -598,14 +603,21 @@ drcDec_SelectionProcess_SetParam(HANDLE_DRC_SELECTION_PROCESS hInstance, if ((requestValue < (FIXP_DBL)0) || (requestValue > FL2FXCONST_DBL(1.0f / (float)(1 << 1)))) return DRCDEC_SELECTION_PROCESS_PARAM_OUT_OF_RANGE; - diff |= _compAssign(&pSelProcInput->boost, FX_DBL2FX_SGL(requestValue)); + diff |= _compAssign( + &pSelProcInput->boost, + FX_DBL2FX_SGL( + requestValue + + (FIXP_DBL)(1 << 15))); /* convert to FIXP_SGL with rounding */ break; case SEL_PROC_COMPRESS: if ((requestValue < (FIXP_DBL)0) || (requestValue > FL2FXCONST_DBL(1.0f / (float)(1 << 1)))) return DRCDEC_SELECTION_PROCESS_PARAM_OUT_OF_RANGE; - diff |= - _compAssign(&pSelProcInput->compress, FX_DBL2FX_SGL(requestValue)); + diff |= _compAssign( + &pSelProcInput->compress, + FX_DBL2FX_SGL( + requestValue + + (FIXP_DBL)(1 << 15))); /* convert to FIXP_SGL with rounding */ break; default: return DRCDEC_SELECTION_PROCESS_INVALID_PARAM; @@ -1006,15 +1018,23 @@ static DRCDEC_SELECTION_PROCESS_RETURN _preSelectionRequirement7( return DRCDEC_SELECTION_PROCESS_NO_ERROR; } -static void _setSelectionDataInfo(DRCDEC_SELECTION_DATA* pData, - FIXP_DBL loudness, - FIXP_DBL loudnessNormalizationGainDb, - FIXP_DBL loudnessNormalizationGainDbMax, - FIXP_DBL loudnessDeviationMax, - FIXP_DBL signalPeakLevel, - FIXP_DBL outputPeakLevelMax, - int applyAdjustment) { - FIXP_DBL adjustment = 0; +static void _setSelectionDataInfo( + DRCDEC_SELECTION_DATA* pData, FIXP_DBL loudness, /* e = 7 */ + FIXP_DBL loudnessNormalizationGainDb, /* e = 7 */ + FIXP_DBL loudnessNormalizationGainDbMax, /* e = 7 */ + FIXP_DBL loudnessDeviationMax, /* e = 7 */ + FIXP_DBL signalPeakLevel, /* e = 7 */ + FIXP_DBL outputPeakLevelMax, /* e = 7 */ + int applyAdjustment) { + FIXP_DBL adjustment = 0; /* e = 8 */ + + /* use e = 8 for all function parameters to prevent overflow */ + loudness >>= 1; + loudnessNormalizationGainDb >>= 1; + loudnessNormalizationGainDbMax >>= 1; + loudnessDeviationMax >>= 1; + signalPeakLevel >>= 1; + outputPeakLevelMax >>= 1; if (applyAdjustment) { adjustment = @@ -1028,6 +1048,14 @@ static void _setSelectionDataInfo(DRCDEC_SELECTION_DATA* pData, pData->outputLoudness = loudness + pData->loudnessNormalizationGainDbAdjusted; pData->outputPeakLevel = signalPeakLevel + pData->loudnessNormalizationGainDbAdjusted; + + /* shift back to e = 7 using saturation */ + pData->loudnessNormalizationGainDbAdjusted = SATURATE_LEFT_SHIFT( + pData->loudnessNormalizationGainDbAdjusted, 1, DFRACT_BITS); + pData->outputLoudness = + SATURATE_LEFT_SHIFT(pData->outputLoudness, 1, DFRACT_BITS); + pData->outputPeakLevel = + SATURATE_LEFT_SHIFT(pData->outputPeakLevel, 1, DFRACT_BITS); } static int _targetLoudnessInRange( @@ -2157,6 +2185,9 @@ static DRCDEC_SELECTION_PROCESS_RETURN _selectDownmixMatrix( if (hSelProcOutput->activeDownmixId != 0) { for (i = 0; i < hUniDrcConfig->downmixInstructionsCount; i++) { DOWNMIX_INSTRUCTIONS* pDown = &(hUniDrcConfig->downmixInstructions[i]); + if (pDown->targetChannelCount > 8) { + continue; + } if (hSelProcOutput->activeDownmixId == pDown->downmixId) { hSelProcOutput->targetChannelCount = pDown->targetChannelCount; @@ -2809,6 +2840,8 @@ static int _downmixCoefficientsArePresent(HANDLE_UNI_DRC_CONFIG hUniDrcConfig, for (i = 0; i < hUniDrcConfig->downmixInstructionsCount; i++) { if (hUniDrcConfig->downmixInstructions[i].downmixId == downmixId) { if (hUniDrcConfig->downmixInstructions[i].downmixCoefficientsPresent) { + if (hUniDrcConfig->downmixInstructions[i].targetChannelCount > 8) + return 0; *pIndex = i; return 1; } diff --git a/libDRCdec/src/drcDec_selectionProcess.h b/libDRCdec/src/drcDec_selectionProcess.h index 9e0e3fb..420bae6 100644 --- a/libDRCdec/src/drcDec_selectionProcess.h +++ b/libDRCdec/src/drcDec_selectionProcess.h @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -146,6 +146,7 @@ typedef enum { SEL_PROC_EFFECT_TYPE, SEL_PROC_EFFECT_TYPE_FALLBACK_CODE, SEL_PROC_LOUDNESS_MEASUREMENT_METHOD, + SEL_PROC_ALBUM_MODE, SEL_PROC_DOWNMIX_ID, SEL_PROC_TARGET_LAYOUT, SEL_PROC_TARGET_CHANNEL_COUNT, diff --git a/libDRCdec/src/drcDec_types.h b/libDRCdec/src/drcDec_types.h index 28c17f3..6b99018 100644 --- a/libDRCdec/src/drcDec_types.h +++ b/libDRCdec/src/drcDec_types.h @@ -249,11 +249,11 @@ typedef struct { UCHAR drcFrameSizePresent; USHORT drcFrameSize; UCHAR characteristicLeftCount; - UCHAR characteristicLeftFormat[8]; - CUSTOM_DRC_CHAR customCharacteristicLeft[8]; + UCHAR characteristicLeftFormat[16]; + CUSTOM_DRC_CHAR customCharacteristicLeft[16]; UCHAR characteristicRightCount; - UCHAR characteristicRightFormat[8]; - CUSTOM_DRC_CHAR customCharacteristicRight[8]; + UCHAR characteristicRightFormat[16]; + CUSTOM_DRC_CHAR customCharacteristicRight[16]; UCHAR gainSequenceCount; /* unsaturated value, i.e. as provided in bitstream */ UCHAR gainSetCount; /* saturated to 12 */ diff --git a/libDRCdec/src/drcGainDec_init.cpp b/libDRCdec/src/drcGainDec_init.cpp index 38f3243..89d0f55 100644 --- a/libDRCdec/src/drcGainDec_init.cpp +++ b/libDRCdec/src/drcGainDec_init.cpp @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -184,24 +184,11 @@ static DRC_ERROR _generateDrcInstructionsDerivedData( } DRC_ERROR -initGainDec(HANDLE_DRC_GAIN_DECODER hGainDec, const int frameSize, - const int sampleRate) { +initGainDec(HANDLE_DRC_GAIN_DECODER hGainDec) { int i, j, k; - if (frameSize < 1) { - return DE_NOT_OK; - } - - hGainDec->frameSize = frameSize; - - if (hGainDec->frameSize * 1000 < sampleRate) { - return DE_NOT_OK; - } - - hGainDec->deltaTminDefault = getDeltaTmin(sampleRate); - if (hGainDec->deltaTminDefault > hGainDec->frameSize) { - return DE_NOT_OK; - } + /* sanity check */ + if (hGainDec->deltaTminDefault > hGainDec->frameSize) return DE_NOT_OK; for (i = 0; i < MAX_ACTIVE_DRCS; i++) { for (j = 0; j < 8; j++) { @@ -336,9 +323,11 @@ initActiveDrcOffset(HANDLE_DRC_GAIN_DECODER hGainDec) { for (a = 0; a < hGainDec->nActiveDrcs; a++) { hGainDec->activeDrc[a].activeDrcOffset = accGainElementCount; accGainElementCount += hGainDec->activeDrc[a].gainElementCount; + if (accGainElementCount > 12) { + hGainDec->nActiveDrcs = a; + return DE_NOT_OK; + } } - if (accGainElementCount > 12) return DE_NOT_OK; - return DE_OK; } diff --git a/libDRCdec/src/drcGainDec_init.h b/libDRCdec/src/drcGainDec_init.h index 9215bc3..c0b9853 100644 --- a/libDRCdec/src/drcGainDec_init.h +++ b/libDRCdec/src/drcGainDec_init.h @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -104,8 +104,7 @@ amm-info@iis.fraunhofer.de #define DRCGAINDEC_INIT_H DRC_ERROR -initGainDec(HANDLE_DRC_GAIN_DECODER hGainDec, const int frameSize, - const int sampleRate); +initGainDec(HANDLE_DRC_GAIN_DECODER hGainDec); void initDrcGainBuffers(const int frameSize, DRC_GAIN_BUFFERS* drcGainBuffers); diff --git a/libDRCdec/src/drcGainDec_preprocess.cpp b/libDRCdec/src/drcGainDec_preprocess.cpp index 7919589..c543c53 100644 --- a/libDRCdec/src/drcGainDec_preprocess.cpp +++ b/libDRCdec/src/drcGainDec_preprocess.cpp @@ -300,8 +300,9 @@ static DRC_ERROR _compressorIO_sigmoid(const CUSTOM_DRC_CHAR_SIGMOID* pCChar, FIXP_SGL exp = pCChar->exp; DRC_ERROR err = DE_OK; - tmp = fMultDiv2(DRC_INPUT_LOUDNESS_TARGET - inLevelDb, pCChar->ioRatio); - tmp = SATURATE_LEFT_SHIFT(tmp, 2 + 1, DFRACT_BITS); + tmp = fMultDiv2((DRC_INPUT_LOUDNESS_TARGET >> 1) - (inLevelDb >> 1), + pCChar->ioRatio); + tmp = SATURATE_LEFT_SHIFT(tmp, 2 + 1 + 1, DFRACT_BITS); if (exp < (FIXP_SGL)MAXVAL_SGL) { /* x = tmp / gainDbLimit; */ /* *outGainDb = tmp / pow(1.0f + pow(x, exp), 1.0f/exp); */ diff --git a/libFDK/include/scale.h b/libFDK/include/scale.h index 07bd3af..655ccaf 100644 --- a/libFDK/include/scale.h +++ b/libFDK/include/scale.h @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -123,7 +123,7 @@ void scaleValues(FIXP_DBL *dst, const FIXP_DBL *src, INT len, INT scalefactor); #if (SAMPLE_BITS == 16) void scaleValues(FIXP_PCM *dst, const FIXP_DBL *src, INT len, INT scalefactor); #endif -void scaleValues(FIXP_PCM *dst, const FIXP_SGL *src, INT len, INT scalefactor); +void scaleValues(FIXP_SGL *dst, const FIXP_SGL *src, INT len, INT scalefactor); void scaleCplxValues(FIXP_DBL *r_dst, FIXP_DBL *i_dst, const FIXP_DBL *r_src, const FIXP_DBL *i_src, INT len, INT scalefactor); void scaleValuesWithFactor(FIXP_DBL *vector, FIXP_DBL factor, INT len, @@ -268,11 +268,11 @@ inline void scaleValueInPlace(FIXP_DBL *value, /*!< Value */ * to avoid problems when inverting the sign of the result. */ #ifndef SATURATE_LEFT_SHIFT_ALT -#define SATURATE_LEFT_SHIFT_ALT(src, scale, dBits) \ - (((LONG)(src) > ((LONG)(((1U) << ((dBits)-1)) - 1) >> (scale))) \ - ? (LONG)(((1U) << ((dBits)-1)) - 1) \ - : ((LONG)(src) < ~((LONG)(((1U) << ((dBits)-1)) - 2) >> (scale))) \ - ? ~((LONG)(((1U) << ((dBits)-1)) - 2)) \ +#define SATURATE_LEFT_SHIFT_ALT(src, scale, dBits) \ + (((LONG)(src) > ((LONG)(((1U) << ((dBits)-1)) - 1) >> (scale))) \ + ? (LONG)(((1U) << ((dBits)-1)) - 1) \ + : ((LONG)(src) <= ~((LONG)(((1U) << ((dBits)-1)) - 1) >> (scale))) \ + ? ~((LONG)(((1U) << ((dBits)-1)) - 2)) \ : ((LONG)(src) << (scale))) #endif diff --git a/libFDK/src/FDK_decorrelate.cpp b/libFDK/src/FDK_decorrelate.cpp index 8e665b7..c5de79a 100644 --- a/libFDK/src/FDK_decorrelate.cpp +++ b/libFDK/src/FDK_decorrelate.cpp @@ -1086,8 +1086,9 @@ static INT DuckerCalcEnergy(DUCKER_INSTANCE *const self, pb = SpatialDecGetProcessingBand(maxHybBand, self->mapHybBands2ProcBands); for (qs = startHybBand; qs <= maxHybBand; qs++) { pb = SpatialDecGetProcessingBand(qs, self->mapHybBands2ProcBands); - energy[pb] += - (fPow2Div2(inputReal[qs] << clz) + fPow2Div2(inputImag[qs] << clz)); + energy[pb] = + fAddSaturate(energy[pb], fPow2Div2(inputReal[qs] << clz) + + fPow2Div2(inputImag[qs] << clz)); } pb++; @@ -1100,7 +1101,7 @@ static INT DuckerCalcEnergy(DUCKER_INSTANCE *const self, FIXP_DBL nrg = 0; qs_next = (int)self->qs_next[pb]; for (; qs < qs_next; qs++) { - nrg += fPow2Div2(inputReal[qs] << clz); + nrg = fAddSaturate(nrg, fPow2Div2(inputReal[qs] << clz)); } energy[pb] = nrg; } @@ -1138,13 +1139,14 @@ static INT DuckerCalcEnergy(DUCKER_INSTANCE *const self, #else for (qs = startHybBand; qs <= maxHybBand; qs++) { int pb = SpatialDecGetProcessingBand(qs, self->mapHybBands2ProcBands); - energy[pb] += - (fPow2Div2(inputReal[qs] << clz) + fPow2Div2(inputImag[qs] << clz)); + energy[pb] = + fAddSaturate(energy[pb], fPow2Div2(inputReal[qs] << clz) + + fPow2Div2(inputImag[qs] << clz)); } for (; qs <= maxHybridBand; qs++) { int pb = SpatialDecGetProcessingBand(qs, self->mapHybBands2ProcBands); - energy[pb] += fPow2Div2(inputReal[qs] << clz); + energy[pb] = fAddSaturate(energy[pb], fPow2Div2(inputReal[qs] << clz)); } #endif /* FUNCTION_DuckerCalcEnergy_func4 */ } @@ -1237,9 +1239,9 @@ static INT DuckerApply(DUCKER_INSTANCE *const self, tmp1 = scaleValue(tmp1, scaleSmoothDirRevNrg_asExponent); tmp2 = scaleValue(tmp2, scaleSmoothDirRevNrg_asExponent); - tmp1 = fMultAddDiv2(tmp1, directNrg[pb] >> scaleDirectNrg, + tmp1 = fMultAddDiv2(tmp1, scaleValue(directNrg[pb], -scaleDirectNrg), DUCK_ONE_MINUS_ALPHA_X4_FDK); - tmp2 = fMultAddDiv2(tmp2, reverbNrg[pb] >> scaleReverbNrg, + tmp2 = fMultAddDiv2(tmp2, scaleValue(reverbNrg[pb], -scaleReverbNrg), DUCK_ONE_MINUS_ALPHA_X4_FDK); } else { tmp1 = fMultAddDiv2(tmp1, directNrg[pb], DUCK_ONE_MINUS_ALPHA_X4_FDK); diff --git a/libFDK/src/FDK_qmf_domain.cpp b/libFDK/src/FDK_qmf_domain.cpp index 043a372..3245deb 100644 --- a/libFDK/src/FDK_qmf_domain.cpp +++ b/libFDK/src/FDK_qmf_domain.cpp @@ -786,6 +786,7 @@ void FDK_QmfDomain_ClearRequested(HANDLE_FDK_QMF_DOMAIN_GC hgc) { hgc->flags_requested = 0; hgc->nInputChannels_requested = 0; hgc->nOutputChannels_requested = 0; + hgc->parkChannel_requested = 0; hgc->nBandsAnalysis_requested = 0; hgc->nBandsSynthesis_requested = 0; hgc->nQmfTimeSlots_requested = 0; @@ -798,6 +799,7 @@ static void FDK_QmfDomain_ClearConfigured(HANDLE_FDK_QMF_DOMAIN_GC hgc) { hgc->flags = 0; hgc->nInputChannels = 0; hgc->nOutputChannels = 0; + hgc->parkChannel = 0; hgc->nBandsAnalysis = 0; hgc->nBandsSynthesis = 0; hgc->nQmfTimeSlots = 0; @@ -887,10 +889,6 @@ QMF_DOMAIN_ERROR FDK_QmfDomain_Configure(HANDLE_FDK_QMF_DOMAIN hqd) { !(hgc->flags & (QMF_FLAG_CLDFB | QMF_FLAG_MPSLDFB))) { hgc->flags_requested |= QMF_FLAG_DOWNSAMPLED; } - if ((hgc->flags_requested & QMF_FLAG_MPSLDFB) && - (hgc->flags_requested & QMF_FLAG_CLDFB)) { - hgc->flags_requested &= ~QMF_FLAG_CLDFB; - } hasChanged = 1; } @@ -899,6 +897,10 @@ QMF_DOMAIN_ERROR FDK_QmfDomain_Configure(HANDLE_FDK_QMF_DOMAIN hqd) { /* 5. set requested flags */ if (hgc->flags != hgc->flags_requested) { + if ((hgc->flags_requested & QMF_FLAG_MPSLDFB) && + (hgc->flags_requested & QMF_FLAG_CLDFB)) { + hgc->flags_requested &= ~QMF_FLAG_CLDFB; + } hgc->flags = hgc->flags_requested; hasChanged = 1; } @@ -981,9 +983,8 @@ QMF_DOMAIN_ERROR FDK_QmfDomain_Configure(HANDLE_FDK_QMF_DOMAIN hqd) { } bail: - if (err == QMF_DOMAIN_OUT_OF_MEMORY) { - FDK_QmfDomain_FreePersistentMemory(hqd); - FDK_QmfDomain_ClearConfigured(&hqd->globalConf); + if (err) { + FDK_QmfDomain_FreeMem(hqd); } return err; } diff --git a/libFDK/src/arm/dct_arm.cpp b/libFDK/src/arm/dct_arm.cpp deleted file mode 100644 index dd66109..0000000 --- a/libFDK/src/arm/dct_arm.cpp +++ /dev/null @@ -1,572 +0,0 @@ -/* ----------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten -Forschung e.V. All rights reserved. - - 1. INTRODUCTION -The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software -that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding -scheme for digital audio. This FDK AAC Codec software is intended to be used on -a wide variety of Android devices. - -AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient -general perceptual audio codecs. AAC-ELD is considered the best-performing -full-bandwidth communications codec by independent studies and is widely -deployed. AAC has been standardized by ISO and IEC as part of the MPEG -specifications. - -Patent licenses for necessary patent claims for the FDK AAC Codec (including -those of Fraunhofer) may be obtained through Via Licensing -(www.vialicensing.com) or through the respective patent owners individually for -the purpose of encoding or decoding bit streams in products that are compliant -with the ISO/IEC MPEG audio standards. Please note that most manufacturers of -Android devices already license these patent claims through Via Licensing or -directly from the patent owners, and therefore FDK AAC Codec software may -already be covered under those patent licenses when it is used for those -licensed purposes only. - -Commercially-licensed AAC software libraries, including floating-point versions -with enhanced sound quality, are also available from Fraunhofer. Users are -encouraged to check the Fraunhofer website for additional applications -information and documentation. - -2. COPYRIGHT LICENSE - -Redistribution and use in source and binary forms, with or without modification, -are permitted without payment of copyright license fees provided that you -satisfy the following conditions: - -You must retain the complete text of this software license in redistributions of -the FDK AAC Codec or your modifications thereto in source code form. - -You must retain the complete text of this software license in the documentation -and/or other materials provided with redistributions of the FDK AAC Codec or -your modifications thereto in binary form. You must make available free of -charge copies of the complete source code of the FDK AAC Codec and your -modifications thereto to recipients of copies in binary form. - -The name of Fraunhofer may not be used to endorse or promote products derived -from this library without prior written permission. - -You may not charge copyright license fees for anyone to use, copy or distribute -the FDK AAC Codec software or your modifications thereto. - -Your modified versions of the FDK AAC Codec must carry prominent notices stating -that you changed the software and the date of any change. For modified versions -of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" -must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK -AAC Codec Library for Android." - -3. NO PATENT LICENSE - -NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without -limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. -Fraunhofer provides no warranty of patent non-infringement with respect to this -software. - -You may use this FDK AAC Codec software or modifications thereto only for -purposes that are authorized by appropriate patent licenses. - -4. DISCLAIMER - -This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright -holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, -including but not limited to the implied warranties of merchantability and -fitness for a particular purpose. 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), arising in any way out of the use of -this software, even if advised of the possibility of such damage. - -5. CONTACT INFORMATION - -Fraunhofer Institute for Integrated Circuits IIS -Attention: Audio and Multimedia Departments - FDK AAC LL -Am Wolfsmantel 33 -91058 Erlangen, Germany - -www.iis.fraunhofer.de/amm -amm-info@iis.fraunhofer.de ------------------------------------------------------------------------------ */ - -/******************* Library for basic calculation routines ******************** - - Author(s): - - Description: - -*******************************************************************************/ - -#ifdef FUNCTION_dct_IV_func1 - -/* - Note: This assembler routine is here, because the ARM926 compiler does - not encode the inline assembler with optimal speed. - With this version, we save 2 cycles per loop iteration. -*/ - -__asm void dct_IV_func1(int i, const FIXP_SPK *twiddle, - FIXP_DBL *RESTRICT pDat_0, FIXP_DBL *RESTRICT pDat_1) { - /* Register map: - r0 i - r1 twiddle - r2 pDat_0 - r3 pDat_1 - r4 accu1 - r5 accu2 - r6 accu3 - r7 accu4 - r8 val_tw - r9 accuX - */ - PUSH{r4 - r9} - - /* 44 cycles for 2 iterations = 22 cycles/iteration */ - dct_IV_loop1_start - /* First iteration */ - LDR r8, - [r1], -# 4 // val_tw = *twiddle++; - LDR r5, - [ r2, #0 ] // accu2 = pDat_0[0] - LDR r4, - [ r3, #0 ] // accu1 = pDat_1[0] - - SMULWT r9, - r5, - r8 // accuX = accu2*val_tw.l - SMULWB r5, - r5, - r8 // accu2 = accu2*val_tw.h - RSB r9, - r9, -# 0 // accuX =-accu2*val_tw.l - SMLAWT r5, r4, r8, - r5 // accu2 = accu2*val_tw.h + accu1*val_tw.l - SMLAWB r4, - r4, r8, - r9 // accu1 = accu1*val_tw.h - accu2*val_tw.l - - LDR r8, - [r1], -# 4 // val_tw = *twiddle++; - LDR r7, - [ r3, # - 4 ] // accu4 = pDat_1[-1] - LDR r6, - [ r2, #4 ] // accu3 = pDat_0[1] - - SMULWB r9, - r7, - r8 // accuX = accu4*val_tw.h - SMULWT r7, - r7, - r8 // accu4 = accu4*val_tw.l - RSB r9, - r9, -# 0 // accuX =-accu4*val_tw.h - SMLAWB r7, r6, r8, - r7 // accu4 = accu4*val_tw.l+accu3*val_tw.h - SMLAWT r6, - r6, r8, - r9 // accu3 = accu3*val_tw.l-accu4*val_tw.h - - STR r5, - [r2], -# 4 // *pDat_0++ = accu2 - STR r4, [r2], -# 4 // *pDat_0++ = accu1 - STR r6, [r3], -#- 4 // *pDat_1-- = accu3 - STR r7, [r3], -#- 4 // *pDat_1-- = accu4 - - /* Second iteration */ - LDR r8, [r1], -# 4 // val_tw = *twiddle++; - LDR r5, - [ r2, #0 ] // accu2 = pDat_0[0] - LDR r4, - [ r3, #0 ] // accu1 = pDat_1[0] - - SMULWT r9, - r5, - r8 // accuX = accu2*val_tw.l - SMULWB r5, - r5, - r8 // accu2 = accu2*val_tw.h - RSB r9, - r9, -# 0 // accuX =-accu2*val_tw.l - SMLAWT r5, r4, r8, - r5 // accu2 = accu2*val_tw.h + accu1*val_tw.l - SMLAWB r4, - r4, r8, - r9 // accu1 = accu1*val_tw.h - accu2*val_tw.l - - LDR r8, - [r1], -# 4 // val_tw = *twiddle++; - LDR r7, - [ r3, # - 4 ] // accu4 = pDat_1[-1] - LDR r6, - [ r2, #4 ] // accu3 = pDat_0[1] - - SMULWB r9, - r7, - r8 // accuX = accu4*val_tw.h - SMULWT r7, - r7, - r8 // accu4 = accu4*val_tw.l - RSB r9, - r9, -# 0 // accuX =-accu4*val_tw.h - SMLAWB r7, r6, r8, - r7 // accu4 = accu4*val_tw.l+accu3*val_tw.h - SMLAWT r6, - r6, r8, - r9 // accu3 = accu3*val_tw.l-accu4*val_tw.h - - STR r5, - [r2], -# 4 // *pDat_0++ = accu2 - STR r4, [r2], -# 4 // *pDat_0++ = accu1 - STR r6, [r3], -#- 4 // *pDat_1-- = accu3 - STR r7, [r3], -#- 4 // *pDat_1-- = accu4 - - SUBS r0, r0, -# 1 BNE dct_IV_loop1_start - - POP { r4 - r9 } - - BX lr -} - -#endif /* FUNCTION_dct_IV_func1 */ - -#ifdef FUNCTION_dct_IV_func2 - -/* __attribute__((noinline)) */ -static inline void dct_IV_func2(int i, const FIXP_SPK *twiddle, - FIXP_DBL *pDat_0, FIXP_DBL *pDat_1, int inc) { - FIXP_DBL accu1, accu2, accu3, accu4, accuX; - LONG val_tw; - - accu1 = pDat_1[-2]; - accu2 = pDat_1[-1]; - - *--pDat_1 = -(pDat_0[1] >> 1); - *pDat_0++ = (pDat_0[0] >> 1); - - twiddle += inc; - - __asm { - LDR val_tw, [twiddle], inc, LSL #2 // val_tw = *twiddle; twiddle += inc - B dct_IV_loop2_2nd_part - - /* 42 cycles for 2 iterations = 21 cycles/iteration */ -dct_IV_loop2: - SMULWT accuX, accu2, val_tw - SMULWB accu2, accu2, val_tw - RSB accuX, accuX, #0 - SMLAWB accuX, accu1, val_tw, accuX - SMLAWT accu2, accu1, val_tw, accu2 - STR accuX, [pDat_0], #4 - STR accu2, [pDat_1, #-4] ! - - LDR accu4, [pDat_0, #4] - LDR accu3, [pDat_0] - SMULWB accuX, accu4, val_tw - SMULWT accu4, accu4, val_tw - RSB accuX, accuX, #0 - SMLAWT accuX, accu3, val_tw, accuX - SMLAWB accu4, accu3, val_tw, accu4 - - LDR accu1, [pDat_1, #-8] - LDR accu2, [pDat_1, #-4] - - LDR val_tw, [twiddle], inc, LSL #2 // val_tw = *twiddle; twiddle += inc - - STR accuX, [pDat_1, #-4] ! - STR accu4, [pDat_0], #4 - -dct_IV_loop2_2nd_part: - SMULWT accuX, accu2, val_tw - SMULWB accu2, accu2, val_tw - RSB accuX, accuX, #0 - SMLAWB accuX, accu1, val_tw, accuX - SMLAWT accu2, accu1, val_tw, accu2 - STR accuX, [pDat_0], #4 - STR accu2, [pDat_1, #-4] ! - - LDR accu4, [pDat_0, #4] - LDR accu3, [pDat_0] - SMULWB accuX, accu4, val_tw - SMULWT accu4, accu4, val_tw - RSB accuX, accuX, #0 - SMLAWT accuX, accu3, val_tw, accuX - SMLAWB accu4, accu3, val_tw, accu4 - - LDR accu1, [pDat_1, #-8] - LDR accu2, [pDat_1, #-4] - - STR accuX, [pDat_1, #-4] ! - STR accu4, [pDat_0], #4 - - LDR val_tw, [twiddle], inc, LSL #2 // val_tw = *twiddle; twiddle += inc - - SUBS i, i, #1 - BNE dct_IV_loop2 - } - - /* Last Sin and Cos value pair are the same */ - accu1 = fMultDiv2(accu1, WTC(0x5a82799a)); - accu2 = fMultDiv2(accu2, WTC(0x5a82799a)); - - *--pDat_1 = accu1 + accu2; - *pDat_0++ = accu1 - accu2; -} -#endif /* FUNCTION_dct_IV_func2 */ - -#ifdef FUNCTION_dst_IV_func1 - -__asm void dst_IV_func1(int i, const FIXP_SPK *twiddle, FIXP_DBL *pDat_0, - FIXP_DBL *pDat_1) { - /* Register map: - r0 i - r1 twiddle - r2 pDat_0 - r3 pDat_1 - r4 accu1 - r5 accu2 - r6 accu3 - r7 accu4 - r8 val_tw - r9 accuX - */ - PUSH{r4 - r9} - - dst_IV_loop1 LDR r8, - [r1], -# 4 // val_tw = *twiddle++ - LDR r5, - [r2] // accu2 = pDat_0[0] - LDR r6, - [ r2, #4 ] // accu3 = pDat_0[1] - RSB r5, - r5, -# 0 // accu2 = -accu2 - SMULWT r9, r5, - r8 // accuX = (-accu2)*val_tw.l - LDR r4, - [ r3, # - 4 ] // accu1 = pDat_1[-1] - RSB r9, - r9, -# 0 // accuX = -(-accu2)*val_tw.l - SMLAWB r9, r4, r8, - r9 // accuX = accu1*val_tw.h-(-accu2)*val_tw.l - SMULWT r4, - r4, - r8 // accu1 = accu1*val_tw.l - LDR r7, - [ r3, # - 8 ] // accu4 = pDat_1[-2] - SMLAWB r5, - r5, r8, - r4 // accu2 = (-accu2)*val_tw.t+accu1*val_tw.l - LDR r8, - [r1], -# 4 // val_tw = *twiddle++ - STR r5, [r2], -# 4 // *pDat_0++ = accu2 - STR r9, [r2], -# 4 // *pDat_0++ = accu1 (accuX) - RSB r7, r7, -# 0 // accu4 = -accu4 - SMULWB r5, r7, - r8 // accu2 = (-accu4)*val_tw.h - SMULWB r4, - r6, - r8 // accu1 = (-accu4)*val_tw.l - RSB r5, - r5, -# 0 // accu2 = -(-accu4)*val_tw.h - SMLAWT r6, r6, r8, - r5 // accu3 = (-accu4)*val_tw.l-(-accu3)*val_tw.h - SMLAWT r7, - r7, r8, - r4 // accu4 = (-accu3)*val_tw.l+(-accu4)*val_tw.h - STR r6, - [ r3, # - 4 ] ! // *--pDat_1 = accu3 - STR r7, - [ r3, # - 4 ] ! // *--pDat_1 = accu4 - - LDR r8, - [r1], -# 4 // val_tw = *twiddle++ - LDR r5, - [r2] // accu2 = pDat_0[0] - LDR r6, - [ r2, #4 ] // accu3 = pDat_0[1] - RSB r5, - r5, -# 0 // accu2 = -accu2 - SMULWT r9, r5, - r8 // accuX = (-accu2)*val_tw.l - LDR r4, - [ r3, # - 4 ] // accu1 = pDat_1[-1] - RSB r9, - r9, -# 0 // accuX = -(-accu2)*val_tw.l - SMLAWB r9, r4, r8, - r9 // accuX = accu1*val_tw.h-(-accu2)*val_tw.l - SMULWT r4, - r4, - r8 // accu1 = accu1*val_tw.l - LDR r7, - [ r3, # - 8 ] // accu4 = pDat_1[-2] - SMLAWB r5, - r5, r8, - r4 // accu2 = (-accu2)*val_tw.t+accu1*val_tw.l - LDR r8, - [r1], -# 4 // val_tw = *twiddle++ - STR r5, [r2], -# 4 // *pDat_0++ = accu2 - STR r9, [r2], -# 4 // *pDat_0++ = accu1 (accuX) - RSB r7, r7, -# 0 // accu4 = -accu4 - SMULWB r5, r7, - r8 // accu2 = (-accu4)*val_tw.h - SMULWB r4, - r6, - r8 // accu1 = (-accu4)*val_tw.l - RSB r5, - r5, -# 0 // accu2 = -(-accu4)*val_tw.h - SMLAWT r6, r6, r8, - r5 // accu3 = (-accu4)*val_tw.l-(-accu3)*val_tw.h - SMLAWT r7, - r7, r8, - r4 // accu4 = (-accu3)*val_tw.l+(-accu4)*val_tw.h - STR r6, - [ r3, # - 4 ] ! // *--pDat_1 = accu3 - STR r7, - [ r3, # - 4 ] ! // *--pDat_1 = accu4 - - SUBS r0, - r0, -# 4 // i-= 4 - BNE dst_IV_loop1 - - POP{r4 - r9} BX lr -} -#endif /* FUNCTION_dst_IV_func1 */ - -#ifdef FUNCTION_dst_IV_func2 - -/* __attribute__((noinline)) */ -static inline void dst_IV_func2(int i, const FIXP_SPK *twiddle, - FIXP_DBL *RESTRICT pDat_0, - FIXP_DBL *RESTRICT pDat_1, int inc) { - FIXP_DBL accu1, accu2, accu3, accu4; - LONG val_tw; - - accu4 = pDat_0[0]; - accu3 = pDat_0[1]; - accu4 >>= 1; - accu3 >>= 1; - accu4 = -accu4; - - accu1 = pDat_1[-1]; - accu2 = pDat_1[0]; - - *pDat_0++ = accu3; - *pDat_1-- = accu4; - - __asm { - B dst_IV_loop2_2nd_part - - /* 50 cycles for 2 iterations = 25 cycles/iteration */ - -dst_IV_loop2: - - LDR val_tw, [twiddle], inc, LSL #2 // val_tw = *twiddle; twiddle += inc - - RSB accu2, accu2, #0 // accu2 = -accu2 - RSB accu1, accu1, #0 // accu1 = -accu1 - SMULWT accu3, accu2, val_tw // accu3 = (-accu2)*val_tw.l - SMULWT accu4, accu1, val_tw // accu4 = (-accu1)*val_tw.l - RSB accu3, accu3, #0 // accu3 = -accu2*val_tw.l - SMLAWB accu1, accu1, val_tw, accu3 // accu1 = -accu1*val_tw.h-(-accu2)*val_tw.l - SMLAWB accu2, accu2, val_tw, accu4 // accu2 = (-accu1)*val_tw.l+(-accu2)*val_tw.h - STR accu1, [pDat_1], #-4 // *pDat_1-- = accu1 - STR accu2, [pDat_0], #4 // *pDat_0++ = accu2 - - LDR accu4, [pDat_0] // accu4 = pDat_0[0] - LDR accu3, [pDat_0, #4] // accu3 = pDat_0[1] - - RSB accu4, accu4, #0 // accu4 = -accu4 - RSB accu3, accu3, #0 // accu3 = -accu3 - - SMULWB accu1, accu3, val_tw // accu1 = (-accu3)*val_tw.h - SMULWT accu2, accu3, val_tw // accu2 = (-accu3)*val_tw.l - RSB accu1, accu1, #0 // accu1 = -(-accu3)*val_tw.h - SMLAWT accu3, accu4, val_tw, accu1 // accu3 = (-accu4)*val_tw.l-(-accu3)*val_tw.h - SMLAWB accu4, accu4, val_tw, accu2 // accu4 = (-accu3)*val_tw.l+(-accu4)*val_tw.h - - LDR accu1, [pDat_1, #-4] // accu1 = pDat_1[-1] - LDR accu2, [pDat_1] // accu2 = pDat_1[0] - - STR accu3, [pDat_0], #4 // *pDat_0++ = accu3 - STR accu4, [pDat_1], #-4 // *pDat_1-- = accu4 - -dst_IV_loop2_2nd_part: - - LDR val_tw, [twiddle], inc, LSL #2 // val_tw = *twiddle; twiddle += inc - - RSB accu2, accu2, #0 // accu2 = -accu2 - RSB accu1, accu1, #0 // accu1 = -accu1 - SMULWT accu3, accu2, val_tw // accu3 = (-accu2)*val_tw.l - SMULWT accu4, accu1, val_tw // accu4 = (-accu1)*val_tw.l - RSB accu3, accu3, #0 // accu3 = -accu2*val_tw.l - SMLAWB accu1, accu1, val_tw, accu3 // accu1 = -accu1*val_tw.h-(-accu2)*val_tw.l - SMLAWB accu2, accu2, val_tw, accu4 // accu2 = (-accu1)*val_tw.l+(-accu2)*val_tw.h - STR accu1, [pDat_1], #-4 // *pDat_1-- = accu1 - STR accu2, [pDat_0], #4 // *pDat_0++ = accu2 - - LDR accu4, [pDat_0] // accu4 = pDat_0[0] - LDR accu3, [pDat_0, #4] // accu3 = pDat_0[1] - - RSB accu4, accu4, #0 // accu4 = -accu4 - RSB accu3, accu3, #0 // accu3 = -accu3 - - SMULWB accu1, accu3, val_tw // accu1 = (-accu3)*val_tw.h - SMULWT accu2, accu3, val_tw // accu2 = (-accu3)*val_tw.l - RSB accu1, accu1, #0 // accu1 = -(-accu3)*val_tw.h - SMLAWT accu3, accu4, val_tw, accu1 // accu3 = (-accu4)*val_tw.l-(-accu3)*val_tw.h - SMLAWB accu4, accu4, val_tw, accu2 // accu4 = (-accu3)*val_tw.l+(-accu4)*val_tw.h - - LDR accu1, [pDat_1, #-4] // accu1 = pDat_1[-1] - LDR accu2, [pDat_1] // accu2 = pDat_1[0] - - STR accu3, [pDat_0], #4 // *pDat_0++ = accu3 - STR accu4, [pDat_1], #-4 // *pDat_1-- = accu4 - - SUBS i, i, #1 - BNE dst_IV_loop2 - } - - /* Last Sin and Cos value pair are the same */ - accu1 = fMultDiv2(-accu1, WTC(0x5a82799a)); - accu2 = fMultDiv2(-accu2, WTC(0x5a82799a)); - - *pDat_0 = accu1 + accu2; - *pDat_1 = accu1 - accu2; -} -#endif /* FUNCTION_dst_IV_func2 */ diff --git a/libFDK/src/dct.cpp b/libFDK/src/dct.cpp index a451331..776493e 100644 --- a/libFDK/src/dct.cpp +++ b/libFDK/src/dct.cpp @@ -124,10 +124,6 @@ amm-info@iis.fraunhofer.de #include "FDK_tools_rom.h" #include "fft.h" -#if defined(__arm__) -#include "arm/dct_arm.cpp" -#endif - void dct_getTables(const FIXP_WTP **ptwiddle, const FIXP_STP **sin_twiddle, int *sin_step, int length) { const FIXP_WTP *twiddle; @@ -387,12 +383,6 @@ void dct_IV(FIXP_DBL *pDat, int L, int *pDat_e) { dct_getTables(&twiddle, &sin_twiddle, &sin_step, L); -#ifdef FUNCTION_dct_IV_func1 - if (M >= 4 && (M & 3) == 0) { - /* ARM926: 44 cycles for 2 iterations = 22 cycles/iteration */ - dct_IV_func1(M >> 2, twiddle, &pDat[0], &pDat[L - 1]); - } else -#endif /* FUNCTION_dct_IV_func1 */ { FIXP_DBL *RESTRICT pDat_0 = &pDat[0]; FIXP_DBL *RESTRICT pDat_1 = &pDat[L - 2]; @@ -410,10 +400,10 @@ void dct_IV(FIXP_DBL *pDat, int L, int *pDat_e) { cplxMultDiv2(&accu1, &accu2, accu1, accu2, twiddle[i]); cplxMultDiv2(&accu3, &accu4, accu4, accu3, twiddle[i + 1]); - pDat_0[0] = accu2; - pDat_0[1] = accu1; - pDat_1[0] = accu4; - pDat_1[1] = -accu3; + pDat_0[0] = accu2 >> 1; + pDat_0[1] = accu1 >> 1; + pDat_1[0] = accu4 >> 1; + pDat_1[1] = -(accu3 >> 1); } if (M & 1) { FIXP_DBL accu1, accu2; @@ -423,19 +413,13 @@ void dct_IV(FIXP_DBL *pDat, int L, int *pDat_e) { cplxMultDiv2(&accu1, &accu2, accu1, accu2, twiddle[i]); - pDat_0[0] = accu2; - pDat_0[1] = accu1; + pDat_0[0] = accu2 >> 1; + pDat_0[1] = accu1 >> 1; } } fft(M, pDat, pDat_e); -#ifdef FUNCTION_dct_IV_func2 - if (M >= 4 && (M & 3) == 0) { - /* ARM926: 42 cycles for 2 iterations = 21 cycles/iteration */ - dct_IV_func2(M >> 2, sin_twiddle, &pDat[0], &pDat[L], sin_step); - } else -#endif /* FUNCTION_dct_IV_func2 */ { FIXP_DBL *RESTRICT pDat_0 = &pDat[0]; FIXP_DBL *RESTRICT pDat_1 = &pDat[L - 2]; @@ -446,20 +430,19 @@ void dct_IV(FIXP_DBL *pDat, int L, int *pDat_e) { accu1 = pDat_1[0]; accu2 = pDat_1[1]; - pDat_1[1] = -(pDat_0[1] >> 1); - pDat_0[0] = (pDat_0[0] >> 1); + pDat_1[1] = -pDat_0[1]; /* 28 cycles for ARM926 */ for (idx = sin_step, i = 1; i<(M + 1)>> 1; i++, idx += sin_step) { FIXP_STP twd = sin_twiddle[idx]; - cplxMultDiv2(&accu3, &accu4, accu1, accu2, twd); + cplxMult(&accu3, &accu4, accu1, accu2, twd); pDat_0[1] = accu3; pDat_1[0] = accu4; pDat_0 += 2; pDat_1 -= 2; - cplxMultDiv2(&accu3, &accu4, pDat_0[1], pDat_0[0], twd); + cplxMult(&accu3, &accu4, pDat_0[1], pDat_0[0], twd); accu1 = pDat_1[0]; accu2 = pDat_1[1]; @@ -470,8 +453,8 @@ void dct_IV(FIXP_DBL *pDat, int L, int *pDat_e) { if ((M & 1) == 0) { /* Last Sin and Cos value pair are the same */ - accu1 = fMultDiv2(accu1, WTC(0x5a82799a)); - accu2 = fMultDiv2(accu2, WTC(0x5a82799a)); + accu1 = fMult(accu1, WTC(0x5a82799a)); + accu2 = fMult(accu2, WTC(0x5a82799a)); pDat_1[0] = accu1 + accu2; pDat_0[1] = accu1 - accu2; @@ -497,11 +480,6 @@ void dst_IV(FIXP_DBL *pDat, int L, int *pDat_e) { dct_getTables(&twiddle, &sin_twiddle, &sin_step, L); -#ifdef FUNCTION_dst_IV_func1 - if ((M >= 4) && ((M & 3) == 0)) { - dst_IV_func1(M, twiddle, &pDat[0], &pDat[L]); - } else -#endif { FIXP_DBL *RESTRICT pDat_0 = &pDat[0]; FIXP_DBL *RESTRICT pDat_1 = &pDat[L - 2]; @@ -519,10 +497,10 @@ void dst_IV(FIXP_DBL *pDat, int L, int *pDat_e) { cplxMultDiv2(&accu1, &accu2, accu1, accu2, twiddle[i]); cplxMultDiv2(&accu3, &accu4, accu4, accu3, twiddle[i + 1]); - pDat_0[0] = accu2; - pDat_0[1] = accu1; - pDat_1[0] = accu4; - pDat_1[1] = -accu3; + pDat_0[0] = accu2 >> 1; + pDat_0[1] = accu1 >> 1; + pDat_1[0] = accu4 >> 1; + pDat_1[1] = -(accu3 >> 1); } if (M & 1) { FIXP_DBL accu1, accu2; @@ -532,19 +510,13 @@ void dst_IV(FIXP_DBL *pDat, int L, int *pDat_e) { cplxMultDiv2(&accu1, &accu2, accu1, accu2, twiddle[i]); - pDat_0[0] = accu2; - pDat_0[1] = accu1; + pDat_0[0] = accu2 >> 1; + pDat_0[1] = accu1 >> 1; } } fft(M, pDat, pDat_e); -#ifdef FUNCTION_dst_IV_func2 - if ((M >= 4) && ((M & 3) == 0)) { - dst_IV_func2(M >> 2, sin_twiddle + sin_step, &pDat[0], &pDat[L - 1], - sin_step); - } else -#endif /* FUNCTION_dst_IV_func2 */ { FIXP_DBL *RESTRICT pDat_0; FIXP_DBL *RESTRICT pDat_1; @@ -558,20 +530,20 @@ void dst_IV(FIXP_DBL *pDat, int L, int *pDat_e) { accu1 = pDat_1[0]; accu2 = pDat_1[1]; - pDat_1[1] = -(pDat_0[0] >> 1); - pDat_0[0] = (pDat_0[1] >> 1); + pDat_1[1] = -pDat_0[0]; + pDat_0[0] = pDat_0[1]; for (idx = sin_step, i = 1; i<(M + 1)>> 1; i++, idx += sin_step) { FIXP_STP twd = sin_twiddle[idx]; - cplxMultDiv2(&accu3, &accu4, accu1, accu2, twd); + cplxMult(&accu3, &accu4, accu1, accu2, twd); pDat_1[0] = -accu3; pDat_0[1] = -accu4; pDat_0 += 2; pDat_1 -= 2; - cplxMultDiv2(&accu3, &accu4, pDat_0[1], pDat_0[0], twd); + cplxMult(&accu3, &accu4, pDat_0[1], pDat_0[0], twd); accu1 = pDat_1[0]; accu2 = pDat_1[1]; @@ -582,8 +554,8 @@ void dst_IV(FIXP_DBL *pDat, int L, int *pDat_e) { if ((M & 1) == 0) { /* Last Sin and Cos value pair are the same */ - accu1 = fMultDiv2(accu1, WTC(0x5a82799a)); - accu2 = fMultDiv2(accu2, WTC(0x5a82799a)); + accu1 = fMult(accu1, WTC(0x5a82799a)); + accu2 = fMult(accu2, WTC(0x5a82799a)); pDat_0[1] = -accu1 - accu2; pDat_1[0] = accu2 - accu1; diff --git a/libMpegTPDec/include/tp_data.h b/libMpegTPDec/include/tp_data.h index b4ab802..b015332 100644 --- a/libMpegTPDec/include/tp_data.h +++ b/libMpegTPDec/include/tp_data.h @@ -367,7 +367,8 @@ typedef INT (*cbFreeMem_t)(void *, const CSAudioSpecificConfig *); typedef INT (*cbCtrlCFGChange_t)(void *, const CCtrlCFGChange *); typedef INT (*cbSsc_t)(void *, HANDLE_FDK_BITSTREAM, const AUDIO_OBJECT_TYPE coreCodec, - const INT samplingRate, const INT stereoConfigIndex, + const INT samplingRate, const INT frameSize, + const INT stereoConfigIndex, const INT coreSbrFrameLengthIndex, const INT configBytes, const UCHAR configMode, UCHAR *configChanged); diff --git a/libMpegTPDec/src/tpdec_adts.cpp b/libMpegTPDec/src/tpdec_adts.cpp index 6dc0275..1a4e3fd 100644 --- a/libMpegTPDec/src/tpdec_adts.cpp +++ b/libMpegTPDec/src/tpdec_adts.cpp @@ -180,7 +180,11 @@ TRANSPORTDEC_ERROR adtsRead_DecodeHeader(HANDLE_ADTS pAdts, have channelConfig=0 and no PCE in this frame. */ FDKmemcpy(&oldPce, &pAsc->m_progrConfigElement, sizeof(CProgramConfig)); - valBits = FDKgetValidBits(hBs); + valBits = FDKgetValidBits(hBs) + ADTS_SYNCLENGTH; + + if (valBits < ADTS_HEADERLENGTH) { + return TRANSPORTDEC_NOT_ENOUGH_BITS; + } /* adts_fixed_header */ bs.mpeg_id = FDKreadBits(hBs, Adts_Length_Id); @@ -205,6 +209,10 @@ TRANSPORTDEC_ERROR adtsRead_DecodeHeader(HANDLE_ADTS pAdts, adtsHeaderLength = ADTS_HEADERLENGTH; + if (valBits < bs.frame_length * 8) { + goto bail; + } + if (!bs.protection_absent) { FDKcrcReset(&pAdts->crcInfo); FDKpushBack(hBs, 56); /* complete fixed and variable header! */ @@ -213,6 +221,9 @@ TRANSPORTDEC_ERROR adtsRead_DecodeHeader(HANDLE_ADTS pAdts, } if (!bs.protection_absent && bs.num_raw_blocks > 0) { + if ((INT)FDKgetValidBits(hBs) < bs.num_raw_blocks * 16) { + goto bail; + } for (i = 0; i < bs.num_raw_blocks; i++) { pAdts->rawDataBlockDist[i] = (USHORT)FDKreadBits(hBs, 16); adtsHeaderLength += 16; @@ -230,6 +241,11 @@ TRANSPORTDEC_ERROR adtsRead_DecodeHeader(HANDLE_ADTS pAdts, USHORT crc_check; FDKcrcEndReg(&pAdts->crcInfo, hBs, crcReg); + + if ((INT)FDKgetValidBits(hBs) < Adts_Length_CrcCheck) { + goto bail; + } + crc_check = FDKreadBits(hBs, Adts_Length_CrcCheck); adtsHeaderLength += Adts_Length_CrcCheck; @@ -343,6 +359,10 @@ TRANSPORTDEC_ERROR adtsRead_DecodeHeader(HANDLE_ADTS pAdts, FDKmemcpy(&pAdts->bs, &bs, sizeof(STRUCT_ADTS_BS)); return TRANSPORTDEC_OK; + +bail: + FDKpushBack(hBs, adtsHeaderLength); + return TRANSPORTDEC_NOT_ENOUGH_BITS; } int adtsRead_GetRawDataBlockLength(HANDLE_ADTS pAdts, INT blockNum) { diff --git a/libMpegTPDec/src/tpdec_asc.cpp b/libMpegTPDec/src/tpdec_asc.cpp index 8d411e8..28bc22d 100644 --- a/libMpegTPDec/src/tpdec_asc.cpp +++ b/libMpegTPDec/src/tpdec_asc.cpp @@ -139,7 +139,7 @@ static const MP4_ELEMENT_ID channel_configuration_13[] = { ID_SCE, ID_CPE, ID_CPE, ID_CPE, ID_CPE, ID_SCE, ID_LFE, ID_LFE, ID_SCE, ID_CPE, ID_CPE, ID_SCE, ID_CPE, ID_SCE, ID_SCE, ID_CPE, ID_NONE}; static const MP4_ELEMENT_ID channel_configuration_14[] = { - ID_SCE, ID_CPE, ID_CPE, ID_LAST, ID_CPE, ID_NONE}; + ID_SCE, ID_CPE, ID_CPE, ID_LFE, ID_CPE, ID_NONE}; static const MP4_ELEMENT_ID *channel_configuration_array[] = { channel_configuration_0, channel_configuration_1, @@ -467,6 +467,7 @@ void CProgramConfig_GetDefault(CProgramConfig *pPce, const UINT channelConfig) { pPce->BackElementIsCpe[1] = 1; pPce->NumChannels += 1; pPce->NumEffectiveChannels += 1; + FDK_FALLTHROUGH; case 11: /* 3/0/3.1ch */ pPce->NumFrontChannelElements += 2; pPce->FrontElementIsCpe[0] = 0; @@ -482,25 +483,30 @@ void CProgramConfig_GetDefault(CProgramConfig *pPce, const UINT channelConfig) { /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ case 14: /* 2/0/0-3/0/2-0.1ch front height */ pPce->FrontElementHeightInfo[2] = 1; /* Top speaker */ - case 7: /* 5/0/2.1ch front */ + FDK_FALLTHROUGH; + case 7: /* 5/0/2.1ch front */ pPce->NumFrontChannelElements += 1; pPce->FrontElementIsCpe[2] = 1; pPce->NumChannels += 2; pPce->NumEffectiveChannels += 2; + FDK_FALLTHROUGH; case 6: /* 3/0/2.1ch */ pPce->NumLfeChannelElements += 1; pPce->NumChannels += 1; + FDK_FALLTHROUGH; case 5: /* 3/0/2.0ch */ case 4: /* 3/0/1.0ch */ pPce->NumBackChannelElements += 1; pPce->BackElementIsCpe[0] = (channelConfig > 4) ? 1 : 0; pPce->NumChannels += (channelConfig > 4) ? 2 : 1; pPce->NumEffectiveChannels += (channelConfig > 4) ? 2 : 1; + FDK_FALLTHROUGH; case 3: /* 3/0/0.0ch */ pPce->NumFrontChannelElements += 1; pPce->FrontElementIsCpe[1] = 1; pPce->NumChannels += 2; pPce->NumEffectiveChannels += 2; + FDK_FALLTHROUGH; case 1: /* 1/0/0.0ch */ pPce->NumFrontChannelElements += 1; pPce->FrontElementIsCpe[0] = 0; @@ -713,6 +719,7 @@ int CProgramConfig_LookupElement(CProgramConfig *pPce, UINT channelConfig, switch (elType) { case ID_CPE: isCpe = 1; + FDK_FALLTHROUGH; case ID_SCE: /* search in front channels */ for (i = 0; i < pPce->NumFrontChannelElements; i++) { @@ -1293,7 +1300,11 @@ static INT ld_sbr_header(CSAudioSpecificConfig *asc, const INT dsFactor, /* read elements of the passed channel_configuration until there is ID_NONE */ while ((element = channel_configuration_array[channelConfiguration][j]) != ID_NONE) { - if (element == ID_SCE || element == ID_CPE) { + /* Setup LFE element for upsampling too. This is essential especially for + * channel configs where the LFE element is not at the last position for + * example in channel config 13 or 14. It leads to memory leaks if the setup + * of the LFE element would be done later in the core. */ + if (element == ID_SCE || element == ID_CPE || element == ID_LFE) { error |= cb->cbSbr( cb->cbSbrData, hBs, asc->m_samplingFrequency / dsFactor, asc->m_extensionSamplingFrequency / dsFactor, @@ -1402,17 +1413,23 @@ static TRANSPORTDEC_ERROR EldSpecificConfig_Parse(CSAudioSpecificConfig *asc, esc->m_useLdQmfTimeAlign = 1; if (cb->cbSsc != NULL) { ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbSsc( - cb->cbSscData, hBs, asc->m_aot, asc->m_extensionSamplingFrequency, + cb->cbSscData, hBs, asc->m_aot, + asc->m_samplingFrequency << esc->m_sbrSamplingRate, + asc->m_samplesPerFrame << esc->m_sbrSamplingRate, 1, /* stereoConfigIndex */ -1, /* nTimeSlots: read from bitstream */ eldExtLen, asc->configMode, &asc->SacConfigChanged); if (ErrorStatus != TRANSPORTDEC_OK) { return TRANSPORTDEC_PARSE_ERROR; } + if (esc->m_downscaledSamplingFrequency != asc->m_samplingFrequency) { + return TRANSPORTDEC_UNSUPPORTED_FORMAT; /* ELDv2 w/ ELD downscaled + mode not allowed */ + } break; } - /* fall-through */ + FDK_FALLTHROUGH; default: for (cnt = 0; cnt < eldExtLen; cnt++) { FDKreadBits(hBs, 8); @@ -1430,6 +1447,10 @@ static TRANSPORTDEC_ERROR EldSpecificConfig_Parse(CSAudioSpecificConfig *asc, if (downscale_fill_nibble != 0x0) { return TRANSPORTDEC_PARSE_ERROR; } + if (esc->m_useLdQmfTimeAlign == 1) { + return TRANSPORTDEC_UNSUPPORTED_FORMAT; /* ELDv2 w/ ELD downscaled + mode not allowed */ + } break; } } @@ -1793,9 +1814,16 @@ static TRANSPORTDEC_ERROR UsacRsv60DecoderConfig_Parse( if (usc->element[i].m_stereoConfigIndex > 0) { if (cb->cbSsc != NULL) { + int samplesPerFrame = asc->m_samplesPerFrame; + + if (usc->m_sbrRatioIndex == 1) samplesPerFrame <<= 2; + if (usc->m_sbrRatioIndex == 2) + samplesPerFrame = (samplesPerFrame * 8) / 3; + if (usc->m_sbrRatioIndex == 3) samplesPerFrame <<= 1; + /* Mps212Config() ISO/IEC FDIS 23003-3 */ if (cb->cbSsc(cb->cbSscData, hBs, asc->m_aot, - asc->m_extensionSamplingFrequency, + asc->m_extensionSamplingFrequency, samplesPerFrame, usc->element[i].m_stereoConfigIndex, usc->m_coreSbrFrameLengthIndex, 0, /* don't know the length */ @@ -2022,6 +2050,7 @@ static TRANSPORTDEC_ERROR AudioSpecificConfig_ExtensionParse( break; case ASCEXT_MPS: /* 0x76a */ if (self->m_extensionAudioObjectType == AOT_MPEGS) break; + FDK_FALLTHROUGH; case ASCEXT_LDMPS: /* 0x7cc */ if ((ascExtId == ASCEXT_LDMPS) && (self->m_extensionAudioObjectType == AOT_LD_MPEGS)) @@ -2161,8 +2190,9 @@ TRANSPORTDEC_ERROR AudioSpecificConfig_Parse( case AOT_MPEGS: if (cb->cbSsc != NULL) { if (cb->cbSsc(cb->cbSscData, bs, self->m_aot, self->m_samplingFrequency, - 1, -1, /* nTimeSlots: read from bitstream */ - 0, /* don't know the length */ + self->m_samplesPerFrame, 1, + -1, /* nTimeSlots: read from bitstream */ + 0, /* don't know the length */ self->configMode, &self->SacConfigChanged)) { return TRANSPORTDEC_UNSUPPORTED_FORMAT; } @@ -2345,10 +2375,17 @@ static TRANSPORTDEC_ERROR Drm_xHEAACDecoderConfig( /*usc->element[elemIdx].m_stereoConfigIndex =*/FDKreadBits(hBs, 2); if (usc->element[elemIdx].m_stereoConfigIndex > 0) { if (cb->cbSsc != NULL) { + int samplesPerFrame = asc->m_samplesPerFrame; + + if (usc->m_sbrRatioIndex == 1) samplesPerFrame <<= 2; + if (usc->m_sbrRatioIndex == 2) + samplesPerFrame = (samplesPerFrame * 8) / 3; + if (usc->m_sbrRatioIndex == 3) samplesPerFrame <<= 1; + ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbSsc( cb->cbSscData, hBs, AOT_DRM_USAC, /* syntax differs from MPEG Mps212Config() */ - asc->m_extensionSamplingFrequency, + asc->m_extensionSamplingFrequency, samplesPerFrame, usc->element[elemIdx].m_stereoConfigIndex, usc->m_coreSbrFrameLengthIndex, 0, /* don't know the length */ asc->configMode, &asc->SacConfigChanged); @@ -2498,6 +2535,7 @@ TRANSPORTDEC_ERROR DrmRawSdcAudioConfig_Parse( switch (audioMode) { case 1: /* parametric stereo */ self->m_psPresentFlag = 1; + FDK_FALLTHROUGH; case 0: /* mono */ self->m_channelConfiguration = 1; break; diff --git a/libMpegTPDec/src/tpdec_lib.cpp b/libMpegTPDec/src/tpdec_lib.cpp index 1d8b7b3..506aed3 100644 --- a/libMpegTPDec/src/tpdec_lib.cpp +++ b/libMpegTPDec/src/tpdec_lib.cpp @@ -274,7 +274,7 @@ TRANSPORTDEC_ERROR transportDec_OutOfBandConfig(HANDLE_TRANSPORTDEC hTp, UCHAR configChanged = 0; UCHAR configMode = AC_CM_DET_CFG_CHANGE; - UCHAR tmpConf[1024]; + UCHAR tmpConf[1024] = {0}; if (length > 1024) { return TRANSPORTDEC_UNSUPPORTED_FORMAT; } @@ -736,9 +736,9 @@ static TRANSPORTDEC_ERROR transportDec_AdjustEndOfAccessUnit( hTp->parser.latm.m_audioMuxLengthBytes > 0) { int loasOffset; - loasOffset = (hTp->parser.latm.m_audioMuxLengthBytes * 8 + - FDKgetValidBits(hBs)) - - hTp->globalFramePos; + loasOffset = ((INT)hTp->parser.latm.m_audioMuxLengthBytes * 8 + + (INT)FDKgetValidBits(hBs)) - + (INT)hTp->globalFramePos; if (loasOffset != 0) { FDKpushBiDirectional(hBs, loasOffset); /* For ELD and other payloads there is an unknown amount of padding, @@ -871,7 +871,7 @@ static TRANSPORTDEC_ERROR transportDec_readHeader( int fConfigFound = (pfConfigFound != NULL) ? *pfConfigFound : 0; int startPos; - startPos = FDKgetValidBits(hBs); + startPos = (INT)FDKgetValidBits(hBs); switch (hTp->transportFmt) { case TT_MP4_ADTS: @@ -941,7 +941,7 @@ static TRANSPORTDEC_ERROR transportDec_readHeader( fTraverseMoreFrames = 0; } syncLayerFrameBits = (hTp->parser.adts.bs.frame_length << 3) - - ((INT)startPos - (INT)FDKgetValidBits(hBs)) - + (startPos - (INT)FDKgetValidBits(hBs)) - syncLength; if (syncLayerFrameBits <= 0) { err = TRANSPORTDEC_SYNC_ERROR; @@ -952,10 +952,11 @@ static TRANSPORTDEC_ERROR transportDec_readHeader( break; case TT_MP4_LOAS: if (hTp->numberOfRawDataBlocks <= 0) { - syncLayerFrameBits = FDKreadBits(hBs, 13); + syncLayerFrameBits = (INT)FDKreadBits(hBs, 13); hTp->parser.latm.m_audioMuxLengthBytes = syncLayerFrameBits; syncLayerFrameBits <<= 3; } + FDK_FALLTHROUGH; case TT_MP4_LATM_MCP1: case TT_MP4_LATM_MCP0: if (hTp->numberOfRawDataBlocks <= 0) { @@ -974,7 +975,7 @@ static TRANSPORTDEC_ERROR transportDec_readHeader( hTp->numberOfRawDataBlocks = CLatmDemux_GetNrOfSubFrames(&hTp->parser.latm); if (hTp->transportFmt == TT_MP4_LOAS) { - syncLayerFrameBits -= startPos - FDKgetValidBits(hBs) - (13); + syncLayerFrameBits -= startPos - (INT)FDKgetValidBits(hBs) - (13); } } } else { diff --git a/libMpegTPEnc/include/tp_data.h b/libMpegTPEnc/include/tp_data.h index 6f032d1..00de356 100644 --- a/libMpegTPEnc/include/tp_data.h +++ b/libMpegTPEnc/include/tp_data.h @@ -367,7 +367,8 @@ typedef INT (*cbFreeMem_t)(void *, const CSAudioSpecificConfig *); typedef INT (*cbCtrlCFGChange_t)(void *, const CCtrlCFGChange *); typedef INT (*cbSsc_t)(void *, HANDLE_FDK_BITSTREAM, const AUDIO_OBJECT_TYPE coreCodec, - const INT samplingRate, const INT stereoConfigIndex, + const INT samplingRate, const INT frameSize, + const INT stereoConfigIndex, const INT coreSbrFrameLengthIndex, const INT configBytes, const UCHAR configMode, UCHAR *configChanged); diff --git a/libMpegTPEnc/src/tpenc_asc.cpp b/libMpegTPEnc/src/tpenc_asc.cpp index ce4e364..0b484a0 100644 --- a/libMpegTPEnc/src/tpenc_asc.cpp +++ b/libMpegTPEnc/src/tpenc_asc.cpp @@ -795,7 +795,7 @@ static int transportEnc_writeELDSpecificConfig(HANDLE_FDK_BITSTREAM hBs, const INT eldExtLen = (cb->cbSsc(cb->cbSscData, NULL, config->aot, config->extSamplingRate, 0, - 0, 0, 0, NULL) + + 0, 0, 0, 0, NULL) + 7) >> 3; INT cnt = eldExtLen; @@ -818,7 +818,7 @@ static int transportEnc_writeELDSpecificConfig(HANDLE_FDK_BITSTREAM hBs, } cb->cbSsc(cb->cbSscData, hBs, config->aot, config->extSamplingRate, 0, 0, 0, - 0, NULL); + 0, 0, NULL); } if (config->downscaleSamplingRate != 0 && diff --git a/libMpegTPEnc/src/tpenc_lib.cpp b/libMpegTPEnc/src/tpenc_lib.cpp index a8567b9..14ea5fe 100644 --- a/libMpegTPEnc/src/tpenc_lib.cpp +++ b/libMpegTPEnc/src/tpenc_lib.cpp @@ -212,6 +212,7 @@ static INT getPceRepetitionRate(const CHANNEL_MODE channelMode, for potential matrix mixdown */ break; } + FDK_FALLTHROUGH; case TT_MP4_LOAS: /* PCE in ASC if chChonfig==0 */ case TT_MP4_LATM_MCP1: /* PCE in ASC if chChonfig==0 */ default: diff --git a/libPCMutils/src/pcmdmx_lib.cpp b/libPCMutils/src/pcmdmx_lib.cpp index b09a848..2070dbc 100644 --- a/libPCMutils/src/pcmdmx_lib.cpp +++ b/libPCMutils/src/pcmdmx_lib.cpp @@ -1043,6 +1043,7 @@ static PCMDMX_ERROR getMixFactors(const UCHAR inModeIsCfg, case CH_MODE_3_2_1_0: isValidCfg = FALSE; err = PCMDMX_INVALID_MODE; + FDK_FALLTHROUGH; case CH_MODE_3_0_3_1: /* chCfg 11 */ /* 6.1ch: C' = C; L' = L; R' = R; LFE' = LFE; Ls' = Ls*dmix_a_idx + Cs*dmix_b_idx; @@ -1080,9 +1081,11 @@ static PCMDMX_ERROR getMixFactors(const UCHAR inModeIsCfg, LEFT_REAR_CHANNEL, FL2FXCONST_DMX(0.5f), 1); dmxSetChannel(mixFactors, mixScales, LEFT_REAR_CHANNEL, LEFT_REAR_CHANNEL, FL2FXCONST_DMX(0.5f), 1); + FDK_FALLTHROUGH; case CH_MODE_5_2_1_0: isValidCfg = FALSE; err = PCMDMX_INVALID_MODE; + FDK_FALLTHROUGH; case CH_MODE_5_0_2_1: /* chCfg 7 || 14 */ if (inChCfg == 14) { /* 7.1ch Front Height: C' = C; Ls' = Ls; Rs' = Rs; LFE' = LFE; diff --git a/libSACdec/include/sac_dec_lib.h b/libSACdec/include/sac_dec_lib.h index 2797a10..9913279 100644 --- a/libSACdec/include/sac_dec_lib.h +++ b/libSACdec/include/sac_dec_lib.h @@ -315,9 +315,9 @@ SACDEC_ERROR mpegSurroundDecoder_Init( */ SACDEC_ERROR mpegSurroundDecoder_Config( CMpegSurroundDecoder *pMpegSurroundDecoder, HANDLE_FDK_BITSTREAM hBs, - AUDIO_OBJECT_TYPE coreCodec, INT samplingRate, INT stereoConfigIndex, - INT coreSbrFrameLengthIndex, INT configBytes, const UCHAR configMode, - UCHAR *configChanged); + AUDIO_OBJECT_TYPE coreCodec, INT samplingRate, INT frameSize, + INT stereoConfigIndex, INT coreSbrFrameLengthIndex, INT configBytes, + const UCHAR configMode, UCHAR *configChanged); SACDEC_ERROR mpegSurroundDecoder_ConfigureQmfDomain( diff --git a/libSACdec/src/sac_bitdec.cpp b/libSACdec/src/sac_bitdec.cpp index 37e0cf2..a1bdca4 100644 --- a/libSACdec/src/sac_bitdec.cpp +++ b/libSACdec/src/sac_bitdec.cpp @@ -291,13 +291,13 @@ SACDEC_ERROR SpatialDecParseSpecificConfigHeader( if (sacHeaderLen == 127) { sacHeaderLen += FDKreadBits(bitstream, 16); } - numFillBits = FDKgetValidBits(bitstream); + numFillBits = (INT)FDKgetValidBits(bitstream); err = SpatialDecParseSpecificConfig(bitstream, pSpatialSpecificConfig, sacHeaderLen, coreCodec); numFillBits -= - FDKgetValidBits(bitstream); /* the number of read bits (tmpBits) */ + (INT)FDKgetValidBits(bitstream); /* the number of read bits (tmpBits) */ numFillBits = (8 * sacHeaderLen) - numFillBits; if (numFillBits < 0) { /* Parsing went wrong */ @@ -325,6 +325,8 @@ SACDEC_ERROR SpatialDecParseMps212Config( INT coreSbrFrameLengthIndex) { int i; + FDKmemclear(pSpatialSpecificConfig, sizeof(SPATIAL_SPECIFIC_CONFIG)); + pSpatialSpecificConfig->stereoConfigIndex = stereoConfigIndex; pSpatialSpecificConfig->coreSbrFrameLengthIndex = coreSbrFrameLengthIndex; pSpatialSpecificConfig->freqRes = @@ -447,6 +449,8 @@ SACDEC_ERROR SpatialDecParseSpecificConfig( int numHeaderBits; int cfgStartPos, bitsAvailable; + FDKmemclear(pSpatialSpecificConfig, sizeof(SPATIAL_SPECIFIC_CONFIG)); + cfgStartPos = FDKgetValidBits(bitstream); /* It might be that we do not know the SSC length beforehand. */ if (sacHeaderLen == 0) { @@ -513,6 +517,10 @@ SACDEC_ERROR SpatialDecParseSpecificConfig( pSpatialSpecificConfig->tempShapeConfig = (SPATIALDEC_TS_CONF)FDKreadBits(bitstream, 2); + if (pSpatialSpecificConfig->tempShapeConfig > 2) { + return MPS_PARSE_ERROR; /* reserved value */ + } + pSpatialSpecificConfig->decorrConfig = (SPATIALDEC_DECORR_CONF)FDKreadBits(bitstream, 2); if (pSpatialSpecificConfig->decorrConfig > 2) { @@ -568,16 +576,18 @@ SACDEC_ERROR SpatialDecParseSpecificConfig( numHeaderBits = cfgStartPos - (INT)FDKgetValidBits(bitstream); bitsAvailable -= numHeaderBits; + if (bitsAvailable < 0) { + err = MPS_PARSE_ERROR; + goto bail; + } pSpatialSpecificConfig->sacExtCnt = 0; pSpatialSpecificConfig->bResidualCoding = 0; - if ((err == MPS_OK) && (bitsAvailable > 0)) { - err = SpatialDecParseExtensionConfig( - bitstream, pSpatialSpecificConfig, pSpatialSpecificConfig->nOttBoxes, - pSpatialSpecificConfig->nTttBoxes, - pSpatialSpecificConfig->nOutputChannels, bitsAvailable); - } + err = SpatialDecParseExtensionConfig( + bitstream, pSpatialSpecificConfig, pSpatialSpecificConfig->nOttBoxes, + pSpatialSpecificConfig->nTttBoxes, + pSpatialSpecificConfig->nOutputChannels, bitsAvailable); FDKbyteAlign( bitstream, @@ -1447,7 +1457,7 @@ static SACDEC_ERROR mapIndexData( FIXP_DBL (*pOttVsTotDb1)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS], FIXP_DBL (*pOttVsTotDb2)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS]) { int aParamSlots[MAX_PARAMETER_SETS]; - int aInterpolate[MAX_PARAMETER_SETS]; + int aInterpolate[MAX_PARAMETER_SETS] = {0}; int dataSets; int aMap[MAX_PARAMETER_BANDS + 1]; @@ -1552,6 +1562,7 @@ static SACDEC_ERROR mapIndexData( i2 = i; while (aInterpolate[i2] == 1) { i2++; + if (i2 >= MAX_PARAMETER_SETS) return MPS_WRONG_PARAMETERSETS; } x1 = paramSlot[i1]; xi = paramSlot[i]; @@ -1864,6 +1875,16 @@ SACDEC_ERROR SpatialDecDecodeFrame(spatialDec *self, SPATIAL_BS_FRAME *frame) { frame->numParameterSets = fixMin(MAX_PARAMETER_SETS, frame->numParameterSets + 1); frame->paramSlot[frame->numParameterSets - 1] = self->timeSlots - 1; + + for (int p = 0; p < frame->numParameterSets; p++) { + if (frame->paramSlot[p] > self->timeSlots - 1) { + frame->paramSlot[p] = self->timeSlots - 1; + err = MPS_PARSE_ERROR; + } + } + if (err != MPS_OK) { + goto bail; + } } bail: diff --git a/libSACdec/src/sac_calcM1andM2.cpp b/libSACdec/src/sac_calcM1andM2.cpp index 6e5a145..5826275 100644 --- a/libSACdec/src/sac_calcM1andM2.cpp +++ b/libSACdec/src/sac_calcM1andM2.cpp @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -474,80 +474,6 @@ static const FIXP_DBL CLD_m[N_CLD] = { FL2FXCONST_DBL(0.888178419700125), }; -static FIXP_DBL dequantIPD_CLD_ICC_splitAngle__FDK_Function(INT ipdIdx, - INT cldIdx, - INT iccIdx) { - FIXP_DBL cld; - SpatialDequantGetCLD2Values(cldIdx, &cld); - - /*const FIXP_DBL one_m = (FIXP_DBL)MAXVAL_DBL; - const int one_e = 0;*/ - const FIXP_DBL one_m = FL2FXCONST_DBL(0.5f); - const int one_e = 1; - /* iidLin = sqrt(cld); */ - FIXP_DBL iidLin_m = sqrt_CLD_m[cldIdx]; - int iidLin_e = sqrt_CLD_e[cldIdx]; - /* iidLin2 = cld; */ - FIXP_DBL iidLin2_m = CLD_m[cldIdx]; - int iidLin2_e = sqrt_CLD_e[cldIdx] << 1; - /* iidLin21 = iidLin2 + 1.0f; */ - int iidLin21_e; - FIXP_DBL iidLin21_m = - fAddNorm(iidLin2_m, iidLin2_e, one_m, one_e, &iidLin21_e); - /* iidIcc2 = iidLin * icc * 2.0f; */ - FIXP_CFG icc = dequantICC__FDK[iccIdx]; - FIXP_DBL temp1_m, temp1c_m; - int temp1_e, temp1c_e; - temp1_m = fMult(iidLin_m, icc); - temp1_e = iidLin_e + 1; - - FIXP_DBL cosIpd, sinIpd; - cosIpd = COS_IPD(ipdIdx); - sinIpd = SIN_IPD(ipdIdx); - - temp1c_m = fMult(temp1_m, cosIpd); - temp1c_e = temp1_e; //+cosIpd_e; - - int temp2_e, temp3_e, inv_temp3_e, ratio_e; - FIXP_DBL temp2_m = - fAddNorm(iidLin21_m, iidLin21_e, temp1c_m, temp1c_e, &temp2_e); - FIXP_DBL temp3_m = - fAddNorm(iidLin21_m, iidLin21_e, temp1_m, temp1_e, &temp3_e); - /* calculate 1/temp3 needed later */ - inv_temp3_e = temp3_e; - FIXP_DBL inv_temp3_m = invFixp(temp3_m, &inv_temp3_e); - FIXP_DBL ratio_m = - fAddNorm(fMult(inv_temp3_m, temp2_m), (inv_temp3_e + temp2_e), - FL2FXCONST_DBL(1e-9f), 0, &ratio_e); - - int weight2_e, tempb_atan2_e; - FIXP_DBL weight2_m = - fPow(ratio_m, ratio_e, FL2FXCONST_DBL(0.5f), -1, &weight2_e); - /* atan2(w2*sinIpd, w1*iidLin + w2*cosIpd) = atan2(w2*sinIpd, (2 - w2)*iidLin - * + w2*cosIpd) = atan2(w2*sinIpd, 2*iidLin + w2*(cosIpd - iidLin)); */ - /* tmpa_atan2 = w2*sinIpd; tmpb_atan2 = 2*iidLin + w2*(cosIpd - iidLin); */ - FIXP_DBL tempb_atan2_m = iidLin_m; - tempb_atan2_e = iidLin_e + 1; - int add_tmp1_e = 0; - FIXP_DBL add_tmp1_m = fAddNorm(cosIpd, 0, -iidLin_m, iidLin_e, &add_tmp1_e); - FIXP_DBL add_tmp2_m = fMult(add_tmp1_m, weight2_m); - int add_tmp2_e = add_tmp1_e + weight2_e; - tempb_atan2_m = fAddNorm(tempb_atan2_m, tempb_atan2_e, add_tmp2_m, add_tmp2_e, - &tempb_atan2_e); - - FIXP_DBL tempa_atan2_m = fMult(weight2_m, sinIpd); - int tempa_atan2_e = weight2_e; // + sinIpd_e; - - if (tempa_atan2_e > tempb_atan2_e) { - tempb_atan2_m = (tempb_atan2_m >> (tempa_atan2_e - tempb_atan2_e)); - tempb_atan2_e = tempa_atan2_e; - } else if (tempb_atan2_e > tempa_atan2_e) { - tempa_atan2_m = (tempa_atan2_m >> (tempb_atan2_e - tempa_atan2_e)); - } - - return fixp_atan2(tempa_atan2_m, tempb_atan2_m); -} - static void calculateOpd(spatialDec* self, INT ottBoxIndx, INT parameterSetIndx, FIXP_DBL opd[MAX_PARAMETER_BANDS]) { INT band; @@ -563,12 +489,12 @@ static void calculateOpd(spatialDec* self, INT ottBoxIndx, INT parameterSetIndx, SpatialDequantGetCLD2Values(idxCld, &cld); /* ipd(idxIpd==8) == PI */ - if ((cld == FL2FXCONST_DBL(0.0f)) && (idxIpd == 8)) { + if (((cld == FL2FXCONST_DBL(0.0f)) && (idxIpd == 8)) || (idxIpd == 0)) { opd[2 * band] = FL2FXCONST_DBL(0.0f); } else { - opd[2 * band] = (dequantIPD_CLD_ICC_splitAngle__FDK_Function( - idxIpd, idxCld, idxIcc) >> - (IPD_SCALE - AT2O_SF)); + FDK_ASSERT(idxIpd > 0); + opd[2 * band] = + dequantIPD_CLD_ICC_splitAngle__FDK[idxIpd - 1][idxCld][idxIcc]; } opd[2 * band + 1] = opd[2 * band] - ipd; } diff --git a/libSACdec/src/sac_dec.cpp b/libSACdec/src/sac_dec.cpp index 4537d6e..3f55a7d 100644 --- a/libSACdec/src/sac_dec.cpp +++ b/libSACdec/src/sac_dec.cpp @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -200,6 +200,7 @@ static void SpatialDecClearFrameData( /* parameter smoothing tool set to off */ bsFrame->bsSmoothMode[0] = 0; + initParameterSmoothing(self); /* reset residual data */ { diff --git a/libSACdec/src/sac_dec_lib.cpp b/libSACdec/src/sac_dec_lib.cpp index ebf9bee..bf6dedf 100644 --- a/libSACdec/src/sac_dec_lib.cpp +++ b/libSACdec/src/sac_dec_lib.cpp @@ -237,6 +237,11 @@ struct MpegSurroundDecoder { SPATIAL_DEC_CONFIG decConfig; }; +SACDEC_ERROR +static sscCheckOutOfBand(const SPATIAL_SPECIFIC_CONFIG *pSsc, + const INT coreCodec, const INT sampleRate, + const INT frameSize); + static SACDEC_ERROR sscParseCheck(const SPATIAL_SPECIFIC_CONFIG *pSsc); /** @@ -694,11 +699,13 @@ bail: **/ SACDEC_ERROR mpegSurroundDecoder_Config( CMpegSurroundDecoder *pMpegSurroundDecoder, HANDLE_FDK_BITSTREAM hBs, - AUDIO_OBJECT_TYPE coreCodec, INT samplingRate, INT stereoConfigIndex, - INT coreSbrFrameLengthIndex, INT configBytes, const UCHAR configMode, - UCHAR *configChanged) { + AUDIO_OBJECT_TYPE coreCodec, INT samplingRate, INT frameSize, + INT stereoConfigIndex, INT coreSbrFrameLengthIndex, INT configBytes, + const UCHAR configMode, UCHAR *configChanged) { SACDEC_ERROR err = MPS_OK; SPATIAL_SPECIFIC_CONFIG spatialSpecificConfig; + SPATIAL_SPECIFIC_CONFIG *pSsc = + &pMpegSurroundDecoder->spatialSpecificConfigBackup; switch (coreCodec) { case AOT_DRM_USAC: @@ -709,6 +716,7 @@ SACDEC_ERROR mpegSurroundDecoder_Config( err = SpatialDecParseMps212Config( hBs, &spatialSpecificConfig, samplingRate, coreCodec, stereoConfigIndex, coreSbrFrameLengthIndex); + pSsc = &spatialSpecificConfig; } else { err = SpatialDecParseMps212Config( hBs, &pMpegSurroundDecoder->spatialSpecificConfigBackup, @@ -723,6 +731,7 @@ SACDEC_ERROR mpegSurroundDecoder_Config( * into temporarily allocated structure */ err = SpatialDecParseSpecificConfig(hBs, &spatialSpecificConfig, configBytes, coreCodec); + pSsc = &spatialSpecificConfig; } else { err = SpatialDecParseSpecificConfig( hBs, &pMpegSurroundDecoder->spatialSpecificConfigBackup, @@ -738,14 +747,21 @@ SACDEC_ERROR mpegSurroundDecoder_Config( goto bail; } + err = sscCheckOutOfBand(pSsc, coreCodec, samplingRate, frameSize); + + if (err != MPS_OK) { + goto bail; + } + if (configMode & AC_CM_DET_CFG_CHANGE) { return err; } if (configMode & AC_CM_ALLOC_MEM) { if (*configChanged) { - if ((err = mpegSurroundDecoder_Open(&pMpegSurroundDecoder, - stereoConfigIndex, NULL))) { + err = mpegSurroundDecoder_Open(&pMpegSurroundDecoder, stereoConfigIndex, + NULL); + if (err) { return err; } } @@ -815,29 +831,9 @@ static MPEGS_OPMODE mpegSurroundOperationMode( * \return MPS_OK on sucess, and else on parse error. */ static SACDEC_ERROR sscParseCheck(const SPATIAL_SPECIFIC_CONFIG *pSsc) { - SACDEC_ERROR err = MPS_OK; - if (pSsc->samplingFreq > 96000) return MPS_PARSE_ERROR; if (pSsc->samplingFreq < 8000) return MPS_PARSE_ERROR; - switch (pSsc->freqRes) { - case SPATIALDEC_FREQ_RES_28: - case SPATIALDEC_FREQ_RES_20: - case SPATIALDEC_FREQ_RES_14: - case SPATIALDEC_FREQ_RES_10: - case SPATIALDEC_FREQ_RES_23: - case SPATIALDEC_FREQ_RES_15: - case SPATIALDEC_FREQ_RES_12: - case SPATIALDEC_FREQ_RES_9: - case SPATIALDEC_FREQ_RES_7: - case SPATIALDEC_FREQ_RES_5: - case SPATIALDEC_FREQ_RES_4: - break; - case SPATIALDEC_FREQ_RES_40: /* 40 doesn't exist in ISO/IEC 23003-1 */ - default: - return MPS_PARSE_ERROR; - } - if ((pSsc->treeConfig < 0) || (pSsc->treeConfig > 7)) { return MPS_PARSE_ERROR; } @@ -846,17 +842,9 @@ static SACDEC_ERROR sscParseCheck(const SPATIAL_SPECIFIC_CONFIG *pSsc) { return MPS_PARSE_ERROR; } - if (pSsc->tempShapeConfig == 3) { - return MPS_PARSE_ERROR; - } - - if (pSsc->decorrConfig == 3) { - return MPS_PARSE_ERROR; - } - /* now we are sure there were no parsing errors */ - return err; + return MPS_OK; } /** @@ -1024,6 +1012,11 @@ static SACDEC_ERROR sscCheckInBand(SPATIAL_SPECIFIC_CONFIG *pSsc, FDK_ASSERT(pSsc != NULL); + /* check ssc for parse errors */ + if (sscParseCheck(pSsc) != MPS_OK) { + err = MPS_PARSE_ERROR; + } + /* core fs and mps fs must match */ if (pSsc->samplingFreq != sampleRate) { err = MPS_PARSE_ERROR /* MPEGSDEC_SSC_PARSE_ERROR */; @@ -1087,12 +1080,90 @@ mpegSurroundDecoder_ConfigureQmfDomain( if (coreCodec == AOT_ER_AAC_ELD) { pGC->flags_requested |= QMF_FLAG_MPSLDFB; + pGC->flags_requested &= ~QMF_FLAG_CLDFB; } return err; } /** + * \brief Check out-of-band config + * + * \param pSsc spatial specific config handle. + * \param coreCodec core codec. + * \param sampleRate sampling frequency. + * + * \return errorStatus + */ +SACDEC_ERROR +sscCheckOutOfBand(const SPATIAL_SPECIFIC_CONFIG *pSsc, const INT coreCodec, + const INT sampleRate, const INT frameSize) { + FDK_ASSERT(pSsc != NULL); + int qmfBands = 0; + + /* check ssc for parse errors */ + if (sscParseCheck(pSsc) != MPS_OK) { + return MPS_PARSE_ERROR; + } + + switch (coreCodec) { + case AOT_USAC: + case AOT_DRM_USAC: + /* ISO/IEC 23003-1:2007(E), Chapter 6.3.3, Support for lower and higher + * sampling frequencies */ + if (pSsc->samplingFreq >= 55426) { + return MPS_PARSE_ERROR; + } + break; + case AOT_ER_AAC_LD: + case AOT_ER_AAC_ELD: + /* core fs and mps fs must match */ + if (pSsc->samplingFreq != sampleRate) { + return MPS_PARSE_ERROR; + } + + /* ISO/IEC 14496-3:2009 FDAM 3: Chapter 1.5.2.3, Levels for the Low Delay + * AAC v2 profile */ + if (pSsc->samplingFreq > 48000) { + return MPS_PARSE_ERROR; + } + + qmfBands = mpegSurroundDecoder_GetNrOfQmfBands(pSsc, pSsc->samplingFreq); + switch (frameSize) { + case 480: + if (!((qmfBands == 32) && (pSsc->nTimeSlots == 15))) { + return MPS_PARSE_ERROR; + } + break; + case 960: + if (!((qmfBands == 64) && (pSsc->nTimeSlots == 15))) { + return MPS_PARSE_ERROR; + } + break; + case 512: + if (!(((qmfBands == 32) && (pSsc->nTimeSlots == 16)) || + ((qmfBands == 64) && (pSsc->nTimeSlots == 8)))) { + return MPS_PARSE_ERROR; + } + break; + case 1024: + if (!((qmfBands == 64) && (pSsc->nTimeSlots == 16))) { + return MPS_PARSE_ERROR; + } + break; + default: + return MPS_PARSE_ERROR; + } + break; + default: + return MPS_PARSE_ERROR; + break; + } + + return MPS_OK; +} + +/** * \brief Decode MPEG Surround frame. **/ int mpegSurroundDecoder_ParseNoHeader( @@ -1232,7 +1303,7 @@ int mpegSurroundDecoder_Parse(CMpegSurroundDecoder *pMpegSurroundDecoder, FDK_ASSERT(pMpegSurroundDecoder->pSpatialDec); - mpsBsBits = FDKgetValidBits(hBs); + mpsBsBits = (INT)FDKgetValidBits(hBs); sscParse = &pMpegSurroundDecoder ->spatialSpecificConfig[pMpegSurroundDecoder->bsFrameParse]; @@ -1308,14 +1379,14 @@ int mpegSurroundDecoder_Parse(CMpegSurroundDecoder *pMpegSurroundDecoder, pMpegSurroundDecoder->spatialSpecificConfigBackup; /* Parse spatial specific config */ - bitsRead = FDKgetValidBits(hMpsBsData); + bitsRead = (INT)FDKgetValidBits(hMpsBsData); err = SpatialDecParseSpecificConfigHeader( hMpsBsData, &pMpegSurroundDecoder->spatialSpecificConfigBackup, coreCodec, pMpegSurroundDecoder->upmixType); - bitsRead = (bitsRead - FDKgetValidBits(hMpsBsData)); + bitsRead = (bitsRead - (INT)FDKgetValidBits(hMpsBsData)); parseResult = ((err == MPS_OK) ? bitsRead : -bitsRead); if (parseResult < 0) { @@ -1349,6 +1420,7 @@ int mpegSurroundDecoder_Parse(CMpegSurroundDecoder *pMpegSurroundDecoder, pMpegSurroundDecoder->mpegSurroundSscIsGlobalCfg = 0; } } + FDK_FALLTHROUGH; case MPEGS_ANCTYPE_FRAME: if (pMpegSurroundDecoder @@ -1429,7 +1501,7 @@ int mpegSurroundDecoder_Parse(CMpegSurroundDecoder *pMpegSurroundDecoder, bail: - *pMpsDataBits -= (mpsBsBits - FDKgetValidBits(hBs)); + *pMpsDataBits -= (mpsBsBits - (INT)FDKgetValidBits(hBs)); return err; } @@ -1586,6 +1658,10 @@ int mpegSurroundDecoder_Apply(CMpegSurroundDecoder *pMpegSurroundDecoder, initControlFlags = controlFlags; /* Check that provided output buffer is large enough. */ + if (pMpegSurroundDecoder->pQmfDomain->globalConf.nBandsAnalysis == 0) { + err = MPS_UNSUPPORTED_FORMAT; + goto bail; + } timeDataRequiredSize = (timeDataFrameSize * pMpegSurroundDecoder->pSpatialDec->numOutputChannelsAT * diff --git a/libSACdec/src/sac_rom.cpp b/libSACdec/src/sac_rom.cpp index 4285b65..600203f 100644 --- a/libSACdec/src/sac_rom.cpp +++ b/libSACdec/src/sac_rom.cpp @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -163,7 +163,7 @@ const FIXP_CFG dequantIPD__FDK[16] = { SCALE_IPD(4.71238898038469f), SCALE_IPD(5.105088062f), SCALE_IPD(5.49778714378214f), SCALE_IPD(5.890486225f)}; -#define SCALE_SPLIT_ANGLE(a) (FL2FXCONST_CFG(a / (float)(1 << IPD_SCALE))) +#define SCALE_SPLIT_ANGLE(a) (FL2FXCONST_DBL(a / (float)(1 << IPD_SCALE))) /* Generate table dequantIPD_CLD_ICC_splitAngle__FDK[16][31][8]: @@ -200,6 +200,3758 @@ const FIXP_CFG dequantIPD__FDK[16] = { atan2(w2 * sinIpd, w1 * iidLin + w2 * cosIpd); } */ +const FIXP_DBL dequantIPD_CLD_ICC_splitAngle__FDK[15][31][8] = { + { + {SCALE_SPLIT_ANGLE(0.39269909262657), + SCALE_SPLIT_ANGLE(0.39269909262657), + SCALE_SPLIT_ANGLE(0.39269909262657), + SCALE_SPLIT_ANGLE(0.39269909262657), + SCALE_SPLIT_ANGLE(0.39269909262657), + SCALE_SPLIT_ANGLE(0.39269909262657), + SCALE_SPLIT_ANGLE(0.39269909262657), + SCALE_SPLIT_ANGLE(0.39269909262657)}, + {SCALE_SPLIT_ANGLE(0.39055734872818), + SCALE_SPLIT_ANGLE(0.39055740833282), + SCALE_SPLIT_ANGLE(0.39055749773979), + SCALE_SPLIT_ANGLE(0.39055770635605), + SCALE_SPLIT_ANGLE(0.39055791497231), + SCALE_SPLIT_ANGLE(0.39055824279785), + SCALE_SPLIT_ANGLE(0.39055877923965), + SCALE_SPLIT_ANGLE(0.39055916666985)}, + {SCALE_SPLIT_ANGLE(0.38890451192856), + SCALE_SPLIT_ANGLE(0.38890469074249), + SCALE_SPLIT_ANGLE(0.38890495896339), + SCALE_SPLIT_ANGLE(0.38890564441681), + SCALE_SPLIT_ANGLE(0.38890630006790), + SCALE_SPLIT_ANGLE(0.38890734314919), + SCALE_SPLIT_ANGLE(0.38890904188156), + SCALE_SPLIT_ANGLE(0.38891020417213)}, + {SCALE_SPLIT_ANGLE(0.38599541783333), + SCALE_SPLIT_ANGLE(0.38599592447281), + SCALE_SPLIT_ANGLE(0.38599672913551), + SCALE_SPLIT_ANGLE(0.38599878549576), + SCALE_SPLIT_ANGLE(0.38600078225136), + SCALE_SPLIT_ANGLE(0.38600403070450), + SCALE_SPLIT_ANGLE(0.38600939512253), + SCALE_SPLIT_ANGLE(0.38601315021515)}, + {SCALE_SPLIT_ANGLE(0.38091576099396), + SCALE_SPLIT_ANGLE(0.38091731071472), + SCALE_SPLIT_ANGLE(0.38091966509819), + SCALE_SPLIT_ANGLE(0.38092571496964), + SCALE_SPLIT_ANGLE(0.38093179464340), + SCALE_SPLIT_ANGLE(0.38094165921211), + SCALE_SPLIT_ANGLE(0.38095843791962), + SCALE_SPLIT_ANGLE(0.38097056746483)}, + {SCALE_SPLIT_ANGLE(0.37216997146606), + SCALE_SPLIT_ANGLE(0.37217426300049), + SCALE_SPLIT_ANGLE(0.37218090891838), + SCALE_SPLIT_ANGLE(0.37219807505608), + SCALE_SPLIT_ANGLE(0.37221556901932), + SCALE_SPLIT_ANGLE(0.37224492430687), + SCALE_SPLIT_ANGLE(0.37229704856873), + SCALE_SPLIT_ANGLE(0.37233674526215)}, + {SCALE_SPLIT_ANGLE(0.36424967646599), + SCALE_SPLIT_ANGLE(0.36425727605820), + SCALE_SPLIT_ANGLE(0.36426907777786), + SCALE_SPLIT_ANGLE(0.36430004239082), + SCALE_SPLIT_ANGLE(0.36433213949203), + SCALE_SPLIT_ANGLE(0.36438730359077), + SCALE_SPLIT_ANGLE(0.36448970437050), + SCALE_SPLIT_ANGLE(0.36457163095474)}, + {SCALE_SPLIT_ANGLE(0.35356888175011), + SCALE_SPLIT_ANGLE(0.35358175635338), + SCALE_SPLIT_ANGLE(0.35360190272331), + SCALE_SPLIT_ANGLE(0.35365560650826), + SCALE_SPLIT_ANGLE(0.35371258854866), + SCALE_SPLIT_ANGLE(0.35381385684013), + SCALE_SPLIT_ANGLE(0.35401365160942), + SCALE_SPLIT_ANGLE(0.35418578982353)}, + {SCALE_SPLIT_ANGLE(0.33942583203316), + SCALE_SPLIT_ANGLE(0.33944645524025), + SCALE_SPLIT_ANGLE(0.33947896957397), + SCALE_SPLIT_ANGLE(0.33956742286682), + SCALE_SPLIT_ANGLE(0.33966416120529), + SCALE_SPLIT_ANGLE(0.33984372019768), + SCALE_SPLIT_ANGLE(0.34023007750511), + SCALE_SPLIT_ANGLE(0.34060221910477)}, + {SCALE_SPLIT_ANGLE(0.32115450501442), + SCALE_SPLIT_ANGLE(0.32118520140648), + SCALE_SPLIT_ANGLE(0.32123416662216), + SCALE_SPLIT_ANGLE(0.32137048244476), + SCALE_SPLIT_ANGLE(0.32152509689331), + SCALE_SPLIT_ANGLE(0.32182863354683), + SCALE_SPLIT_ANGLE(0.32256561517715), + SCALE_SPLIT_ANGLE(0.32340893149376)}, + {SCALE_SPLIT_ANGLE(0.29830521345139), + SCALE_SPLIT_ANGLE(0.29834723472595), + SCALE_SPLIT_ANGLE(0.29841500520706), + SCALE_SPLIT_ANGLE(0.29860860109329), + SCALE_SPLIT_ANGLE(0.29883742332458), + SCALE_SPLIT_ANGLE(0.29931786656380), + SCALE_SPLIT_ANGLE(0.30069106817245), + SCALE_SPLIT_ANGLE(0.30275771021843)}, + {SCALE_SPLIT_ANGLE(0.28050789237022), + SCALE_SPLIT_ANGLE(0.28055712580681), + SCALE_SPLIT_ANGLE(0.28063708543777), + SCALE_SPLIT_ANGLE(0.28086942434311), + SCALE_SPLIT_ANGLE(0.28115189075470), + SCALE_SPLIT_ANGLE(0.28177404403687), + SCALE_SPLIT_ANGLE(0.28380545973778), + SCALE_SPLIT_ANGLE(0.28782638907433)}, + {SCALE_SPLIT_ANGLE(0.26083287596703), + SCALE_SPLIT_ANGLE(0.26088824868202), + SCALE_SPLIT_ANGLE(0.26097872853279), + SCALE_SPLIT_ANGLE(0.26124578714371), + SCALE_SPLIT_ANGLE(0.26157897710800), + SCALE_SPLIT_ANGLE(0.26234793663025), + SCALE_SPLIT_ANGLE(0.26525345444679), + SCALE_SPLIT_ANGLE(0.27373576164246)}, + {SCALE_SPLIT_ANGLE(0.23960022628307), + SCALE_SPLIT_ANGLE(0.23966011404991), + SCALE_SPLIT_ANGLE(0.23975846171379), + SCALE_SPLIT_ANGLE(0.24005253612995), + SCALE_SPLIT_ANGLE(0.24042735993862), + SCALE_SPLIT_ANGLE(0.24132782220840), + SCALE_SPLIT_ANGLE(0.24525125324726), + SCALE_SPLIT_ANGLE(0.26534587144852)}, + {SCALE_SPLIT_ANGLE(0.21727463603020), + SCALE_SPLIT_ANGLE(0.21733720600605), + SCALE_SPLIT_ANGLE(0.21744030714035), + SCALE_SPLIT_ANGLE(0.21775111556053), + SCALE_SPLIT_ANGLE(0.21815299987793), + SCALE_SPLIT_ANGLE(0.21914559602737), + SCALE_SPLIT_ANGLE(0.22397418320179), + SCALE_SPLIT_ANGLE(0.27997341752052)}, + {SCALE_SPLIT_ANGLE(0.19442924857140), + SCALE_SPLIT_ANGLE(0.19449260830879), + SCALE_SPLIT_ANGLE(0.19459712505341), + SCALE_SPLIT_ANGLE(0.19491320848465), + SCALE_SPLIT_ANGLE(0.19532410800457), + SCALE_SPLIT_ANGLE(0.19634956121445), + SCALE_SPLIT_ANGLE(0.20156545937061), + SCALE_SPLIT_ANGLE(0.33650875091553)}, + {SCALE_SPLIT_ANGLE(0.17168679833412), + SCALE_SPLIT_ANGLE(0.17174908518791), + SCALE_SPLIT_ANGLE(0.17185173928738), + SCALE_SPLIT_ANGLE(0.17216140031815), + SCALE_SPLIT_ANGLE(0.17256212234497), + SCALE_SPLIT_ANGLE(0.17355351150036), + SCALE_SPLIT_ANGLE(0.17841057479382), + SCALE_SPLIT_ANGLE(0.23922468721867)}, + {SCALE_SPLIT_ANGLE(0.14965108036995), + SCALE_SPLIT_ANGLE(0.14971046149731), + SCALE_SPLIT_ANGLE(0.14980803430080), + SCALE_SPLIT_ANGLE(0.15010002255440), + SCALE_SPLIT_ANGLE(0.15047283470631), + SCALE_SPLIT_ANGLE(0.15137128531933), + SCALE_SPLIT_ANGLE(0.15533345937729), + SCALE_SPLIT_ANGLE(0.17691856622696)}, + {SCALE_SPLIT_ANGLE(0.12884500622749), + SCALE_SPLIT_ANGLE(0.12889973819256), + SCALE_SPLIT_ANGLE(0.12898921966553), + SCALE_SPLIT_ANGLE(0.12925371527672), + SCALE_SPLIT_ANGLE(0.12958450615406), + SCALE_SPLIT_ANGLE(0.13035117089748), + SCALE_SPLIT_ANGLE(0.13329000771046), + SCALE_SPLIT_ANGLE(0.14226883649826)}, + {SCALE_SPLIT_ANGLE(0.10966771841049), + SCALE_SPLIT_ANGLE(0.10971628874540), + SCALE_SPLIT_ANGLE(0.10979522019625), + SCALE_SPLIT_ANGLE(0.11002497375011), + SCALE_SPLIT_ANGLE(0.11030506342649), + SCALE_SPLIT_ANGLE(0.11092507839203), + SCALE_SPLIT_ANGLE(0.11297956109047), + SCALE_SPLIT_ANGLE(0.11718676239252)}, + {SCALE_SPLIT_ANGLE(0.09237616509199), + SCALE_SPLIT_ANGLE(0.09241759032011), + SCALE_SPLIT_ANGLE(0.09248441457748), + SCALE_SPLIT_ANGLE(0.09267570823431), + SCALE_SPLIT_ANGLE(0.09290253371000), + SCALE_SPLIT_ANGLE(0.09338124841452), + SCALE_SPLIT_ANGLE(0.09476862102747), + SCALE_SPLIT_ANGLE(0.09691140055656)}, + {SCALE_SPLIT_ANGLE(0.07020132243633), + SCALE_SPLIT_ANGLE(0.07023159414530), + SCALE_SPLIT_ANGLE(0.07027988880873), + SCALE_SPLIT_ANGLE(0.07041462510824), + SCALE_SPLIT_ANGLE(0.07056795060635), + SCALE_SPLIT_ANGLE(0.07087047398090), + SCALE_SPLIT_ANGLE(0.07161350548267), + SCALE_SPLIT_ANGLE(0.07247893512249)}, + {SCALE_SPLIT_ANGLE(0.05244029685855), + SCALE_SPLIT_ANGLE(0.05246063694358), + SCALE_SPLIT_ANGLE(0.05249277502298), + SCALE_SPLIT_ANGLE(0.05258031934500), + SCALE_SPLIT_ANGLE(0.05267634987831), + SCALE_SPLIT_ANGLE(0.05285539478064), + SCALE_SPLIT_ANGLE(0.05324416980147), + SCALE_SPLIT_ANGLE(0.05362326279283)}, + {SCALE_SPLIT_ANGLE(0.03864165768027), + SCALE_SPLIT_ANGLE(0.03865439072251), + SCALE_SPLIT_ANGLE(0.03867433592677), + SCALE_SPLIT_ANGLE(0.03872758522630), + SCALE_SPLIT_ANGLE(0.03878424316645), + SCALE_SPLIT_ANGLE(0.03888526186347), + SCALE_SPLIT_ANGLE(0.03908598423004), + SCALE_SPLIT_ANGLE(0.03926040604711)}, + {SCALE_SPLIT_ANGLE(0.02817477472126), + SCALE_SPLIT_ANGLE(0.02818230912089), + SCALE_SPLIT_ANGLE(0.02819401398301), + SCALE_SPLIT_ANGLE(0.02822477556765), + SCALE_SPLIT_ANGLE(0.02825673110783), + SCALE_SPLIT_ANGLE(0.02831180393696), + SCALE_SPLIT_ANGLE(0.02841453813016), + SCALE_SPLIT_ANGLE(0.02849725075066)}, + {SCALE_SPLIT_ANGLE(0.02037953026593), + SCALE_SPLIT_ANGLE(0.02038379199803), + SCALE_SPLIT_ANGLE(0.02039037831128), + SCALE_SPLIT_ANGLE(0.02040746994317), + SCALE_SPLIT_ANGLE(0.02042490243912), + SCALE_SPLIT_ANGLE(0.02045420184731), + SCALE_SPLIT_ANGLE(0.02050646767020), + SCALE_SPLIT_ANGLE(0.02054644003510)}, + {SCALE_SPLIT_ANGLE(0.01173160225153), + SCALE_SPLIT_ANGLE(0.01173313986510), + SCALE_SPLIT_ANGLE(0.01173550263047), + SCALE_SPLIT_ANGLE(0.01174154505134), + SCALE_SPLIT_ANGLE(0.01174758374691), + SCALE_SPLIT_ANGLE(0.01175745483488), + SCALE_SPLIT_ANGLE(0.01177425310016), + SCALE_SPLIT_ANGLE(0.01178644131869)}, + {SCALE_SPLIT_ANGLE(0.00668647512794), + SCALE_SPLIT_ANGLE(0.00668699946254), + SCALE_SPLIT_ANGLE(0.00668780272827), + SCALE_SPLIT_ANGLE(0.00668983906507), + SCALE_SPLIT_ANGLE(0.00669185025617), + SCALE_SPLIT_ANGLE(0.00669508520514), + SCALE_SPLIT_ANGLE(0.00670044543222), + SCALE_SPLIT_ANGLE(0.00670422753319)}, + {SCALE_SPLIT_ANGLE(0.00378898042254), + SCALE_SPLIT_ANGLE(0.00378915388137), + SCALE_SPLIT_ANGLE(0.00378941884264), + SCALE_SPLIT_ANGLE(0.00379008660093), + SCALE_SPLIT_ANGLE(0.00379074062221), + SCALE_SPLIT_ANGLE(0.00379178463481), + SCALE_SPLIT_ANGLE(0.00379348872229), + SCALE_SPLIT_ANGLE(0.00379467196763)}, + {SCALE_SPLIT_ANGLE(0.00213995971717), + SCALE_SPLIT_ANGLE(0.00214001606219), + SCALE_SPLIT_ANGLE(0.00214010174386), + SCALE_SPLIT_ANGLE(0.00214031711221), + SCALE_SPLIT_ANGLE(0.00214052735828), + SCALE_SPLIT_ANGLE(0.00214086147025), + SCALE_SPLIT_ANGLE(0.00214140163735), + SCALE_SPLIT_ANGLE(0.00214177416638)}, + {SCALE_SPLIT_ANGLE(0.00000001210151), + SCALE_SPLIT_ANGLE(0.00000001210151), + SCALE_SPLIT_ANGLE(0.00000001210151), + SCALE_SPLIT_ANGLE(0.00000001210151), + SCALE_SPLIT_ANGLE(0.00000001210151), + SCALE_SPLIT_ANGLE(0.00000001210151), + SCALE_SPLIT_ANGLE(0.00000001210151), + SCALE_SPLIT_ANGLE(0.00000001210151)}, + }, + { + {SCALE_SPLIT_ANGLE(0.78539812564850), + SCALE_SPLIT_ANGLE(0.78539812564850), + SCALE_SPLIT_ANGLE(0.78539812564850), + SCALE_SPLIT_ANGLE(0.78539812564850), + SCALE_SPLIT_ANGLE(0.78539812564850), + SCALE_SPLIT_ANGLE(0.78539812564850), + SCALE_SPLIT_ANGLE(0.78539812564850), + SCALE_SPLIT_ANGLE(0.78539812564850)}, + {SCALE_SPLIT_ANGLE(0.78143113851547), + SCALE_SPLIT_ANGLE(0.78143155574799), + SCALE_SPLIT_ANGLE(0.78143215179443), + SCALE_SPLIT_ANGLE(0.78143370151520), + SCALE_SPLIT_ANGLE(0.78143519163132), + SCALE_SPLIT_ANGLE(0.78143757581711), + SCALE_SPLIT_ANGLE(0.78144145011902), + SCALE_SPLIT_ANGLE(0.78144407272339)}, + {SCALE_SPLIT_ANGLE(0.77835679054260), + SCALE_SPLIT_ANGLE(0.77835804224014), + SCALE_SPLIT_ANGLE(0.77835988998413), + SCALE_SPLIT_ANGLE(0.77836471796036), + SCALE_SPLIT_ANGLE(0.77836942672729), + SCALE_SPLIT_ANGLE(0.77837687730789), + SCALE_SPLIT_ANGLE(0.77838897705078), + SCALE_SPLIT_ANGLE(0.77839738130569)}, + {SCALE_SPLIT_ANGLE(0.77291858196259), + SCALE_SPLIT_ANGLE(0.77292239665985), + SCALE_SPLIT_ANGLE(0.77292817831039), + SCALE_SPLIT_ANGLE(0.77294290065765), + SCALE_SPLIT_ANGLE(0.77295738458633), + SCALE_SPLIT_ANGLE(0.77298063039780), + SCALE_SPLIT_ANGLE(0.77301889657974), + SCALE_SPLIT_ANGLE(0.77304571866989)}, + {SCALE_SPLIT_ANGLE(0.76334190368652), + SCALE_SPLIT_ANGLE(0.76335322856903), + SCALE_SPLIT_ANGLE(0.76337057352066), + SCALE_SPLIT_ANGLE(0.76341474056244), + SCALE_SPLIT_ANGLE(0.76345866918564), + SCALE_SPLIT_ANGLE(0.76353001594543), + SCALE_SPLIT_ANGLE(0.76365023851395), + SCALE_SPLIT_ANGLE(0.76373648643494)}, + {SCALE_SPLIT_ANGLE(0.74662178754807), + SCALE_SPLIT_ANGLE(0.74665385484695), + SCALE_SPLIT_ANGLE(0.74670320749283), + SCALE_SPLIT_ANGLE(0.74683058261871), + SCALE_SPLIT_ANGLE(0.74695950746536), + SCALE_SPLIT_ANGLE(0.74717390537262), + SCALE_SPLIT_ANGLE(0.74754953384399), + SCALE_SPLIT_ANGLE(0.74783092737198)}, + {SCALE_SPLIT_ANGLE(0.73124057054520), + SCALE_SPLIT_ANGLE(0.73129826784134), + SCALE_SPLIT_ANGLE(0.73138761520386), + SCALE_SPLIT_ANGLE(0.73162078857422), + SCALE_SPLIT_ANGLE(0.73186045885086), + SCALE_SPLIT_ANGLE(0.73226773738861), + SCALE_SPLIT_ANGLE(0.73300832509995), + SCALE_SPLIT_ANGLE(0.73358738422394)}, + {SCALE_SPLIT_ANGLE(0.71016556024551), + SCALE_SPLIT_ANGLE(0.71026545763016), + SCALE_SPLIT_ANGLE(0.71042120456696), + SCALE_SPLIT_ANGLE(0.71083343029022), + SCALE_SPLIT_ANGLE(0.71126621961594), + SCALE_SPLIT_ANGLE(0.71202337741852), + SCALE_SPLIT_ANGLE(0.71347540616989), + SCALE_SPLIT_ANGLE(0.71468448638916)}, + {SCALE_SPLIT_ANGLE(0.68173062801361), + SCALE_SPLIT_ANGLE(0.68189471960068), + SCALE_SPLIT_ANGLE(0.68215268850327), + SCALE_SPLIT_ANGLE(0.68284785747528), + SCALE_SPLIT_ANGLE(0.68359774351120), + SCALE_SPLIT_ANGLE(0.68496215343475), + SCALE_SPLIT_ANGLE(0.68778359889984), + SCALE_SPLIT_ANGLE(0.69036644697189)}, + {SCALE_SPLIT_ANGLE(0.64424294233322), + SCALE_SPLIT_ANGLE(0.64449471235275), + SCALE_SPLIT_ANGLE(0.64489430189133), + SCALE_SPLIT_ANGLE(0.64599478244781), + SCALE_SPLIT_ANGLE(0.64722269773483), + SCALE_SPLIT_ANGLE(0.64957273006439), + SCALE_SPLIT_ANGLE(0.65497380495071), + SCALE_SPLIT_ANGLE(0.66069257259369)}, + {SCALE_SPLIT_ANGLE(0.59645885229111), + SCALE_SPLIT_ANGLE(0.59681373834610), + SCALE_SPLIT_ANGLE(0.59738290309906), + SCALE_SPLIT_ANGLE(0.59898978471756), + SCALE_SPLIT_ANGLE(0.60085380077362), + SCALE_SPLIT_ANGLE(0.60464859008789), + SCALE_SPLIT_ANGLE(0.61471658945084), + SCALE_SPLIT_ANGLE(0.62811440229416)}, + {SCALE_SPLIT_ANGLE(0.55878311395645), + SCALE_SPLIT_ANGLE(0.55920600891113), + SCALE_SPLIT_ANGLE(0.55988913774490), + SCALE_SPLIT_ANGLE(0.56185030937195), + SCALE_SPLIT_ANGLE(0.56418746709824), + SCALE_SPLIT_ANGLE(0.56916546821594), + SCALE_SPLIT_ANGLE(0.58402228355408), + SCALE_SPLIT_ANGLE(0.60877442359924)}, + {SCALE_SPLIT_ANGLE(0.51690864562988), + SCALE_SPLIT_ANGLE(0.51739054918289), + SCALE_SPLIT_ANGLE(0.51817405223846), + SCALE_SPLIT_ANGLE(0.52045875787735), + SCALE_SPLIT_ANGLE(0.52325224876404), + SCALE_SPLIT_ANGLE(0.52947413921356), + SCALE_SPLIT_ANGLE(0.55062562227249), + SCALE_SPLIT_ANGLE(0.59875661134720)}, + {SCALE_SPLIT_ANGLE(0.47171193361282), + SCALE_SPLIT_ANGLE(0.47223743796349), + SCALE_SPLIT_ANGLE(0.47309640049934), + SCALE_SPLIT_ANGLE(0.47563400864601), + SCALE_SPLIT_ANGLE(0.47880488634109), + SCALE_SPLIT_ANGLE(0.48615166544914), + SCALE_SPLIT_ANGLE(0.51456981897354), + SCALE_SPLIT_ANGLE(0.61478358507156)}, + {SCALE_SPLIT_ANGLE(0.42445337772369), + SCALE_SPLIT_ANGLE(0.42500329017639), + SCALE_SPLIT_ANGLE(0.42590543627739), + SCALE_SPLIT_ANGLE(0.42859473824501), + SCALE_SPLIT_ANGLE(0.43200695514679), + SCALE_SPLIT_ANGLE(0.44014197587967), + SCALE_SPLIT_ANGLE(0.47505444288254), + SCALE_SPLIT_ANGLE(0.70435541868210)}, + {SCALE_SPLIT_ANGLE(0.37662339210510), + SCALE_SPLIT_ANGLE(0.37717753648758), + SCALE_SPLIT_ANGLE(0.37808802723885), + SCALE_SPLIT_ANGLE(0.38081303238869), + SCALE_SPLIT_ANGLE(0.38429373502731), + SCALE_SPLIT_ANGLE(0.39269909262657), + SCALE_SPLIT_ANGLE(0.43061128258705), + SCALE_SPLIT_ANGLE(0.89949643611908)}, + {SCALE_SPLIT_ANGLE(0.32972764968872), + SCALE_SPLIT_ANGLE(0.33026659488678), + SCALE_SPLIT_ANGLE(0.33115157485008), + SCALE_SPLIT_ANGLE(0.33379590511322), + SCALE_SPLIT_ANGLE(0.33716440200806), + SCALE_SPLIT_ANGLE(0.34525617957115), + SCALE_SPLIT_ANGLE(0.38098797202110), + SCALE_SPLIT_ANGLE(0.66312330961227)}, + {SCALE_SPLIT_ANGLE(0.28508263826370), + SCALE_SPLIT_ANGLE(0.28558859229088), + SCALE_SPLIT_ANGLE(0.28641715645790), + SCALE_SPLIT_ANGLE(0.28887593746185), + SCALE_SPLIT_ANGLE(0.29197177290916), + SCALE_SPLIT_ANGLE(0.29924646019936), + SCALE_SPLIT_ANGLE(0.32879719138145), + SCALE_SPLIT_ANGLE(0.45467028021812)}, + {SCALE_SPLIT_ANGLE(0.24368345737457), + SCALE_SPLIT_ANGLE(0.24414120614529), + SCALE_SPLIT_ANGLE(0.24488738179207), + SCALE_SPLIT_ANGLE(0.24707712233067), + SCALE_SPLIT_ANGLE(0.24978286027908), + SCALE_SPLIT_ANGLE(0.25592401623726), + SCALE_SPLIT_ANGLE(0.27806487679482), + SCALE_SPLIT_ANGLE(0.33706206083298)}, + {SCALE_SPLIT_ANGLE(0.20616286993027), + SCALE_SPLIT_ANGLE(0.20656119287014), + SCALE_SPLIT_ANGLE(0.20720668137074), + SCALE_SPLIT_ANGLE(0.20907410979271), + SCALE_SPLIT_ANGLE(0.21132774651051), + SCALE_SPLIT_ANGLE(0.21623271703720), + SCALE_SPLIT_ANGLE(0.23177997767925), + SCALE_SPLIT_ANGLE(0.26115790009499)}, + {SCALE_SPLIT_ANGLE(0.17282110452652), + SCALE_SPLIT_ANGLE(0.17315416038036), + SCALE_SPLIT_ANGLE(0.17369024455547), + SCALE_SPLIT_ANGLE(0.17521673440933), + SCALE_SPLIT_ANGLE(0.17701178789139), + SCALE_SPLIT_ANGLE(0.18074953556061), + SCALE_SPLIT_ANGLE(0.19124270975590), + SCALE_SPLIT_ANGLE(0.20666223764420)}, + {SCALE_SPLIT_ANGLE(0.13066084682941), + SCALE_SPLIT_ANGLE(0.13089758157730), + SCALE_SPLIT_ANGLE(0.13127475976944), + SCALE_SPLIT_ANGLE(0.13232271373272), + SCALE_SPLIT_ANGLE(0.13350808620453), + SCALE_SPLIT_ANGLE(0.13582544028759), + SCALE_SPLIT_ANGLE(0.14140741527081), + SCALE_SPLIT_ANGLE(0.14774028956890)}, + {SCALE_SPLIT_ANGLE(0.09729286283255), + SCALE_SPLIT_ANGLE(0.09744835644960), + SCALE_SPLIT_ANGLE(0.09769364446402), + SCALE_SPLIT_ANGLE(0.09835994243622), + SCALE_SPLIT_ANGLE(0.09908767789602), + SCALE_SPLIT_ANGLE(0.10043603181839), + SCALE_SPLIT_ANGLE(0.10332850366831), + SCALE_SPLIT_ANGLE(0.10610697418451)}, + {SCALE_SPLIT_ANGLE(0.07155895978212), + SCALE_SPLIT_ANGLE(0.07165451347828), + SCALE_SPLIT_ANGLE(0.07180397957563), + SCALE_SPLIT_ANGLE(0.07220225036144), + SCALE_SPLIT_ANGLE(0.07262472063303), + SCALE_SPLIT_ANGLE(0.07337479293346), + SCALE_SPLIT_ANGLE(0.07485356926918), + SCALE_SPLIT_ANGLE(0.07612708956003)}, + {SCALE_SPLIT_ANGLE(0.05212157219648), + SCALE_SPLIT_ANGLE(0.05217727646232), + SCALE_SPLIT_ANGLE(0.05226379260421), + SCALE_SPLIT_ANGLE(0.05249078199267), + SCALE_SPLIT_ANGLE(0.05272606015205), + SCALE_SPLIT_ANGLE(0.05313042178750), + SCALE_SPLIT_ANGLE(0.05388085916638), + SCALE_SPLIT_ANGLE(0.05448162183166)}, + {SCALE_SPLIT_ANGLE(0.03767965734005), + SCALE_SPLIT_ANGLE(0.03771083429456), + SCALE_SPLIT_ANGLE(0.03775899112225), + SCALE_SPLIT_ANGLE(0.03788382932544), + SCALE_SPLIT_ANGLE(0.03801096230745), + SCALE_SPLIT_ANGLE(0.03822423517704), + SCALE_SPLIT_ANGLE(0.03860339149833), + SCALE_SPLIT_ANGLE(0.03889226913452)}, + {SCALE_SPLIT_ANGLE(0.02168158628047), + SCALE_SPLIT_ANGLE(0.02169270813465), + SCALE_SPLIT_ANGLE(0.02170977368951), + SCALE_SPLIT_ANGLE(0.02175341546535), + SCALE_SPLIT_ANGLE(0.02179697528481), + SCALE_SPLIT_ANGLE(0.02186812832952), + SCALE_SPLIT_ANGLE(0.02198898419738), + SCALE_SPLIT_ANGLE(0.02207652665675)}, + {SCALE_SPLIT_ANGLE(0.01235581003129), + SCALE_SPLIT_ANGLE(0.01235957816243), + SCALE_SPLIT_ANGLE(0.01236534118652), + SCALE_SPLIT_ANGLE(0.01237995270640), + SCALE_SPLIT_ANGLE(0.01239436585456), + SCALE_SPLIT_ANGLE(0.01241754554212), + SCALE_SPLIT_ANGLE(0.01245592255145), + SCALE_SPLIT_ANGLE(0.01248296815902)}, + {SCALE_SPLIT_ANGLE(0.00700127054006), + SCALE_SPLIT_ANGLE(0.00700251059607), + SCALE_SPLIT_ANGLE(0.00700440211222), + SCALE_SPLIT_ANGLE(0.00700917327777), + SCALE_SPLIT_ANGLE(0.00701385037974), + SCALE_SPLIT_ANGLE(0.00702130328864), + SCALE_SPLIT_ANGLE(0.00703346775845), + SCALE_SPLIT_ANGLE(0.00704190973192)}, + {SCALE_SPLIT_ANGLE(0.00395415630192), + SCALE_SPLIT_ANGLE(0.00395455770195), + SCALE_SPLIT_ANGLE(0.00395516818389), + SCALE_SPLIT_ANGLE(0.00395670533180), + SCALE_SPLIT_ANGLE(0.00395820522681), + SCALE_SPLIT_ANGLE(0.00396058429033), + SCALE_SPLIT_ANGLE(0.00396443530917), + SCALE_SPLIT_ANGLE(0.00396708538756)}, + {SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068)}, + }, + { + {SCALE_SPLIT_ANGLE(1.17809724807739), + SCALE_SPLIT_ANGLE(1.17809724807739), + SCALE_SPLIT_ANGLE(1.17809724807739), + SCALE_SPLIT_ANGLE(1.17809724807739), + SCALE_SPLIT_ANGLE(1.17809724807739), + SCALE_SPLIT_ANGLE(1.17809724807739), + SCALE_SPLIT_ANGLE(1.17809724807739), + SCALE_SPLIT_ANGLE(1.17809724807739)}, + {SCALE_SPLIT_ANGLE(1.17289519309998), + SCALE_SPLIT_ANGLE(1.17289638519287), + SCALE_SPLIT_ANGLE(1.17289805412292), + SCALE_SPLIT_ANGLE(1.17290234565735), + SCALE_SPLIT_ANGLE(1.17290651798248), + SCALE_SPLIT_ANGLE(1.17291307449341), + SCALE_SPLIT_ANGLE(1.17292368412018), + SCALE_SPLIT_ANGLE(1.17293095588684)}, + {SCALE_SPLIT_ANGLE(1.16883802413940), + SCALE_SPLIT_ANGLE(1.16884148120880), + SCALE_SPLIT_ANGLE(1.16884684562683), + SCALE_SPLIT_ANGLE(1.16886019706726), + SCALE_SPLIT_ANGLE(1.16887319087982), + SCALE_SPLIT_ANGLE(1.16889393329620), + SCALE_SPLIT_ANGLE(1.16892755031586), + SCALE_SPLIT_ANGLE(1.16895067691803)}, + {SCALE_SPLIT_ANGLE(1.16160655021667), + SCALE_SPLIT_ANGLE(1.16161727905273), + SCALE_SPLIT_ANGLE(1.16163372993469), + SCALE_SPLIT_ANGLE(1.16167509555817), + SCALE_SPLIT_ANGLE(1.16171574592590), + SCALE_SPLIT_ANGLE(1.16178059577942), + SCALE_SPLIT_ANGLE(1.16188669204712), + SCALE_SPLIT_ANGLE(1.16196048259735)}, + {SCALE_SPLIT_ANGLE(1.14870405197144), + SCALE_SPLIT_ANGLE(1.14873659610748), + SCALE_SPLIT_ANGLE(1.14878630638123), + SCALE_SPLIT_ANGLE(1.14891266822815), + SCALE_SPLIT_ANGLE(1.14903748035431), + SCALE_SPLIT_ANGLE(1.14923894405365), + SCALE_SPLIT_ANGLE(1.14957404136658), + SCALE_SPLIT_ANGLE(1.14981138706207)}, + {SCALE_SPLIT_ANGLE(1.12567496299744), + SCALE_SPLIT_ANGLE(1.12576997280121), + SCALE_SPLIT_ANGLE(1.12591612339020), + SCALE_SPLIT_ANGLE(1.12629067897797), + SCALE_SPLIT_ANGLE(1.12666594982147), + SCALE_SPLIT_ANGLE(1.12728190422058), + SCALE_SPLIT_ANGLE(1.12833762168884), + SCALE_SPLIT_ANGLE(1.12910997867584)}, + {SCALE_SPLIT_ANGLE(1.10394382476807), + SCALE_SPLIT_ANGLE(1.10412001609802), + SCALE_SPLIT_ANGLE(1.10439181327820), + SCALE_SPLIT_ANGLE(1.10509443283081), + SCALE_SPLIT_ANGLE(1.10580694675446), + SCALE_SPLIT_ANGLE(1.10699594020844), + SCALE_SPLIT_ANGLE(1.10909199714661), + SCALE_SPLIT_ANGLE(1.11067581176758)}, + {SCALE_SPLIT_ANGLE(1.07335853576660), + SCALE_SPLIT_ANGLE(1.07367515563965), + SCALE_SPLIT_ANGLE(1.07416594028473), + SCALE_SPLIT_ANGLE(1.07544887065887), + SCALE_SPLIT_ANGLE(1.07677161693573), + SCALE_SPLIT_ANGLE(1.07902932167053), + SCALE_SPLIT_ANGLE(1.08317446708679), + SCALE_SPLIT_ANGLE(1.08645892143250)}, + {SCALE_SPLIT_ANGLE(1.03070926666260), + SCALE_SPLIT_ANGLE(1.03125381469727), + SCALE_SPLIT_ANGLE(1.03210365772247), + SCALE_SPLIT_ANGLE(1.03435742855072), + SCALE_SPLIT_ANGLE(1.03673219680786), + SCALE_SPLIT_ANGLE(1.04091238975525), + SCALE_SPLIT_ANGLE(1.04904520511627), + SCALE_SPLIT_ANGLE(1.05597066879272)}, + {SCALE_SPLIT_ANGLE(0.97233027219772), + SCALE_SPLIT_ANGLE(0.97321176528931), + SCALE_SPLIT_ANGLE(0.97459858655930), + SCALE_SPLIT_ANGLE(0.97834444046021), + SCALE_SPLIT_ANGLE(0.98240250349045), + SCALE_SPLIT_ANGLE(0.98984360694885), + SCALE_SPLIT_ANGLE(1.00556409358978), + SCALE_SPLIT_ANGLE(1.02053046226501)}, + {SCALE_SPLIT_ANGLE(0.89506644010544), + SCALE_SPLIT_ANGLE(0.89638090133667), + SCALE_SPLIT_ANGLE(0.89846849441528), + SCALE_SPLIT_ANGLE(0.90423041582108), + SCALE_SPLIT_ANGLE(0.91068577766418), + SCALE_SPLIT_ANGLE(0.92315071821213), + SCALE_SPLIT_ANGLE(0.95268243551254), + SCALE_SPLIT_ANGLE(0.98626506328583)}, + {SCALE_SPLIT_ANGLE(0.83257329463959), + SCALE_SPLIT_ANGLE(0.83419400453568), + SCALE_SPLIT_ANGLE(0.83678525686264), + SCALE_SPLIT_ANGLE(0.84404885768890), + SCALE_SPLIT_ANGLE(0.85238879919052), + SCALE_SPLIT_ANGLE(0.86914122104645), + SCALE_SPLIT_ANGLE(0.91285765171051), + SCALE_SPLIT_ANGLE(0.97222852706909)}, + {SCALE_SPLIT_ANGLE(0.76227337121964), + SCALE_SPLIT_ANGLE(0.76417022943497), + SCALE_SPLIT_ANGLE(0.76722234487534), + SCALE_SPLIT_ANGLE(0.77590966224670), + SCALE_SPLIT_ANGLE(0.78613227605820), + SCALE_SPLIT_ANGLE(0.80752640962601), + SCALE_SPLIT_ANGLE(0.86987829208374), + SCALE_SPLIT_ANGLE(0.97863066196442)}, + {SCALE_SPLIT_ANGLE(0.68631619215012), + SCALE_SPLIT_ANGLE(0.68841683864594), + SCALE_SPLIT_ANGLE(0.69181632995605), + SCALE_SPLIT_ANGLE(0.70162522792816), + SCALE_SPLIT_ANGLE(0.71342813968658), + SCALE_SPLIT_ANGLE(0.73910331726074), + SCALE_SPLIT_ANGLE(0.82307606935501), + SCALE_SPLIT_ANGLE(1.03223013877869)}, + {SCALE_SPLIT_ANGLE(0.60781323909760), + SCALE_SPLIT_ANGLE(0.61001545190811), + SCALE_SPLIT_ANGLE(0.61359488964081), + SCALE_SPLIT_ANGLE(0.62403196096420), + SCALE_SPLIT_ANGLE(0.63681113719940), + SCALE_SPLIT_ANGLE(0.66548818349838), + SCALE_SPLIT_ANGLE(0.76931142807007), + SCALE_SPLIT_ANGLE(1.19638144969940)}, + {SCALE_SPLIT_ANGLE(0.53021633625031), + SCALE_SPLIT_ANGLE(0.53240889310837), + SCALE_SPLIT_ANGLE(0.53598147630692), + SCALE_SPLIT_ANGLE(0.54646170139313), + SCALE_SPLIT_ANGLE(0.55942362546921), + SCALE_SPLIT_ANGLE(0.58904862403870), + SCALE_SPLIT_ANGLE(0.70326197147369), + SCALE_SPLIT_ANGLE(1.46822571754456)}, + {SCALE_SPLIT_ANGLE(0.45655798912048), + SCALE_SPLIT_ANGLE(0.45864027738571), + SCALE_SPLIT_ANGLE(0.46203431487083), + SCALE_SPLIT_ANGLE(0.47199890017509), + SCALE_SPLIT_ANGLE(0.48433950543404), + SCALE_SPLIT_ANGLE(0.51260900497437), + SCALE_SPLIT_ANGLE(0.62212866544724), + SCALE_SPLIT_ANGLE(1.20720028877258)}, + {SCALE_SPLIT_ANGLE(0.38893291354179), + SCALE_SPLIT_ANGLE(0.39082619547844), + SCALE_SPLIT_ANGLE(0.39390671253204), + SCALE_SPLIT_ANGLE(0.40291145443916), + SCALE_SPLIT_ANGLE(0.41398161649704), + SCALE_SPLIT_ANGLE(0.43899387121201), + SCALE_SPLIT_ANGLE(0.53091615438461), + SCALE_SPLIT_ANGLE(0.85221332311630)}, + {SCALE_SPLIT_ANGLE(0.32840186357498), + SCALE_SPLIT_ANGLE(0.33005380630493), + SCALE_SPLIT_ANGLE(0.33273181319237), + SCALE_SPLIT_ANGLE(0.34049156308174), + SCALE_SPLIT_ANGLE(0.34989202022552), + SCALE_SPLIT_ANGLE(0.37057083845139), + SCALE_SPLIT_ANGLE(0.43990376591682), + SCALE_SPLIT_ANGLE(0.60593068599701)}, + {SCALE_SPLIT_ANGLE(0.27521029114723), + SCALE_SPLIT_ANGLE(0.27659532427788), + SCALE_SPLIT_ANGLE(0.27882957458496), + SCALE_SPLIT_ANGLE(0.28522574901581), + SCALE_SPLIT_ANGLE(0.29282194375992), + SCALE_SPLIT_ANGLE(0.30895602703094), + SCALE_SPLIT_ANGLE(0.35752716660500), + SCALE_SPLIT_ANGLE(0.44366976618767)}, + {SCALE_SPLIT_ANGLE(0.22909799218178), + SCALE_SPLIT_ANGLE(0.23021572828293), + SCALE_SPLIT_ANGLE(0.23200811445713), + SCALE_SPLIT_ANGLE(0.23706816136837), + SCALE_SPLIT_ANGLE(0.24294251203537), + SCALE_SPLIT_ANGLE(0.25494652986526), + SCALE_SPLIT_ANGLE(0.28743273019791), + SCALE_SPLIT_ANGLE(0.33326253294945)}, + {SCALE_SPLIT_ANGLE(0.17204397916794), + SCALE_SPLIT_ANGLE(0.17280195653439), + SCALE_SPLIT_ANGLE(0.17400608956814), + SCALE_SPLIT_ANGLE(0.17733128368855), + SCALE_SPLIT_ANGLE(0.18105845153332), + SCALE_SPLIT_ANGLE(0.18825364112854), + SCALE_SPLIT_ANGLE(0.20519739389420), + SCALE_SPLIT_ANGLE(0.22397252917290)}, + {SCALE_SPLIT_ANGLE(0.12763081490994), + SCALE_SPLIT_ANGLE(0.12810991704464), + SCALE_SPLIT_ANGLE(0.12886413931847), + SCALE_SPLIT_ANGLE(0.13090407848358), + SCALE_SPLIT_ANGLE(0.13311788439751), + SCALE_SPLIT_ANGLE(0.13718488812447), + SCALE_SPLIT_ANGLE(0.14578336477280), + SCALE_SPLIT_ANGLE(0.15392093360424)}, + {SCALE_SPLIT_ANGLE(0.09368771314621), + SCALE_SPLIT_ANGLE(0.09397350251675), + SCALE_SPLIT_ANGLE(0.09441984444857), + SCALE_SPLIT_ANGLE(0.09560553729534), + SCALE_SPLIT_ANGLE(0.09685769677162), + SCALE_SPLIT_ANGLE(0.09906788915396), + SCALE_SPLIT_ANGLE(0.10338338464499), + SCALE_SPLIT_ANGLE(0.10706327855587)}, + {SCALE_SPLIT_ANGLE(0.06817039847374), + SCALE_SPLIT_ANGLE(0.06833326816559), + SCALE_SPLIT_ANGLE(0.06858598440886), + SCALE_SPLIT_ANGLE(0.06924756616354), + SCALE_SPLIT_ANGLE(0.06993119418621), + SCALE_SPLIT_ANGLE(0.07110133767128), + SCALE_SPLIT_ANGLE(0.07325870543718), + SCALE_SPLIT_ANGLE(0.07497421652079)}, + {SCALE_SPLIT_ANGLE(0.04925633221865), + SCALE_SPLIT_ANGLE(0.04934597760439), + SCALE_SPLIT_ANGLE(0.04948436096311), + SCALE_SPLIT_ANGLE(0.04984252527356), + SCALE_SPLIT_ANGLE(0.05020647495985), + SCALE_SPLIT_ANGLE(0.05081529542804), + SCALE_SPLIT_ANGLE(0.05189275369048), + SCALE_SPLIT_ANGLE(0.05270983651280)}, + {SCALE_SPLIT_ANGLE(0.02833298407495), + SCALE_SPLIT_ANGLE(0.02836437709630), + SCALE_SPLIT_ANGLE(0.02841254509985), + SCALE_SPLIT_ANGLE(0.02853557839990), + SCALE_SPLIT_ANGLE(0.02865825034678), + SCALE_SPLIT_ANGLE(0.02885829657316), + SCALE_SPLIT_ANGLE(0.02919724024832), + SCALE_SPLIT_ANGLE(0.02944211289287)}, + {SCALE_SPLIT_ANGLE(0.01614447496831), + SCALE_SPLIT_ANGLE(0.01615499891341), + SCALE_SPLIT_ANGLE(0.01617109030485), + SCALE_SPLIT_ANGLE(0.01621186546981), + SCALE_SPLIT_ANGLE(0.01625206694007), + SCALE_SPLIT_ANGLE(0.01631666347384), + SCALE_SPLIT_ANGLE(0.01642346009612), + SCALE_SPLIT_ANGLE(0.01649860665202)}, + {SCALE_SPLIT_ANGLE(0.00914775021374), + SCALE_SPLIT_ANGLE(0.00915119145066), + SCALE_SPLIT_ANGLE(0.00915644038469), + SCALE_SPLIT_ANGLE(0.00916968286037), + SCALE_SPLIT_ANGLE(0.00918265152723), + SCALE_SPLIT_ANGLE(0.00920331478119), + SCALE_SPLIT_ANGLE(0.00923701003194), + SCALE_SPLIT_ANGLE(0.00926037877798)}, + {SCALE_SPLIT_ANGLE(0.00516638066620), + SCALE_SPLIT_ANGLE(0.00516748987138), + SCALE_SPLIT_ANGLE(0.00516917929053), + SCALE_SPLIT_ANGLE(0.00517342984676), + SCALE_SPLIT_ANGLE(0.00517757656053), + SCALE_SPLIT_ANGLE(0.00518415356055), + SCALE_SPLIT_ANGLE(0.00519479578361), + SCALE_SPLIT_ANGLE(0.00520211551338)}, + {SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564)}, + }, + { + {SCALE_SPLIT_ANGLE(1.57079637050629), + SCALE_SPLIT_ANGLE(1.57079637050629), + SCALE_SPLIT_ANGLE(1.57079637050629), + SCALE_SPLIT_ANGLE(1.57079637050629), + SCALE_SPLIT_ANGLE(1.57079637050629), + SCALE_SPLIT_ANGLE(1.57079637050629), + SCALE_SPLIT_ANGLE(1.57079637050629), + SCALE_SPLIT_ANGLE(1.57079637050629)}, + {SCALE_SPLIT_ANGLE(1.56514155864716), + SCALE_SPLIT_ANGLE(1.56514346599579), + SCALE_SPLIT_ANGLE(1.56514656543732), + SCALE_SPLIT_ANGLE(1.56515407562256), + SCALE_SPLIT_ANGLE(1.56516146659851), + SCALE_SPLIT_ANGLE(1.56517302989960), + SCALE_SPLIT_ANGLE(1.56519174575806), + SCALE_SPLIT_ANGLE(1.56520450115204)}, + {SCALE_SPLIT_ANGLE(1.56069743633270), + SCALE_SPLIT_ANGLE(1.56070363521576), + SCALE_SPLIT_ANGLE(1.56071317195892), + SCALE_SPLIT_ANGLE(1.56073689460754), + SCALE_SPLIT_ANGLE(1.56076002120972), + SCALE_SPLIT_ANGLE(1.56079673767090), + SCALE_SPLIT_ANGLE(1.56085586547852), + SCALE_SPLIT_ANGLE(1.56089639663696)}, + {SCALE_SPLIT_ANGLE(1.55270349979401), + SCALE_SPLIT_ANGLE(1.55272293090820), + SCALE_SPLIT_ANGLE(1.55275249481201), + SCALE_SPLIT_ANGLE(1.55282700061798), + SCALE_SPLIT_ANGLE(1.55289983749390), + SCALE_SPLIT_ANGLE(1.55301547050476), + SCALE_SPLIT_ANGLE(1.55320310592651), + SCALE_SPLIT_ANGLE(1.55333256721497)}, + {SCALE_SPLIT_ANGLE(1.53820896148682), + SCALE_SPLIT_ANGLE(1.53826904296875), + SCALE_SPLIT_ANGLE(1.53836083412170), + SCALE_SPLIT_ANGLE(1.53859281539917), + SCALE_SPLIT_ANGLE(1.53882038593292), + SCALE_SPLIT_ANGLE(1.53918409347534), + SCALE_SPLIT_ANGLE(1.53978037834167), + SCALE_SPLIT_ANGLE(1.54019629955292)}, + {SCALE_SPLIT_ANGLE(1.51160359382629), + SCALE_SPLIT_ANGLE(1.51178681850433), + SCALE_SPLIT_ANGLE(1.51206707954407), + SCALE_SPLIT_ANGLE(1.51277923583984), + SCALE_SPLIT_ANGLE(1.51348364353180), + SCALE_SPLIT_ANGLE(1.51462137699127), + SCALE_SPLIT_ANGLE(1.51652014255524), + SCALE_SPLIT_ANGLE(1.51787149906158)}, + {SCALE_SPLIT_ANGLE(1.48564028739929), + SCALE_SPLIT_ANGLE(1.48599278926849), + SCALE_SPLIT_ANGLE(1.48653328418732), + SCALE_SPLIT_ANGLE(1.48791313171387), + SCALE_SPLIT_ANGLE(1.48928797245026), + SCALE_SPLIT_ANGLE(1.49152994155884), + SCALE_SPLIT_ANGLE(1.49533641338348), + SCALE_SPLIT_ANGLE(1.49810016155243)}, + {SCALE_SPLIT_ANGLE(1.44770443439484), + SCALE_SPLIT_ANGLE(1.44837117195129), + SCALE_SPLIT_ANGLE(1.44939684867859), + SCALE_SPLIT_ANGLE(1.45203149318695), + SCALE_SPLIT_ANGLE(1.45468175411224), + SCALE_SPLIT_ANGLE(1.45906186103821), + SCALE_SPLIT_ANGLE(1.46668362617493), + SCALE_SPLIT_ANGLE(1.47238755226135)}, + {SCALE_SPLIT_ANGLE(1.39214622974396), + SCALE_SPLIT_ANGLE(1.39337480068207), + SCALE_SPLIT_ANGLE(1.39527153968811), + SCALE_SPLIT_ANGLE(1.40018463134766), + SCALE_SPLIT_ANGLE(1.40518975257874), + SCALE_SPLIT_ANGLE(1.41361439228058), + SCALE_SPLIT_ANGLE(1.42880713939667), + SCALE_SPLIT_ANGLE(1.44072246551514)}, + {SCALE_SPLIT_ANGLE(1.31133699417114), + SCALE_SPLIT_ANGLE(1.31350564956665), + SCALE_SPLIT_ANGLE(1.31686961650848), + SCALE_SPLIT_ANGLE(1.32567906379700), + SCALE_SPLIT_ANGLE(1.33480501174927), + SCALE_SPLIT_ANGLE(1.35055577754974), + SCALE_SPLIT_ANGLE(1.38048458099365), + SCALE_SPLIT_ANGLE(1.40579915046692)}, + {SCALE_SPLIT_ANGLE(1.19695901870728), + SCALE_SPLIT_ANGLE(1.20052528381348), + SCALE_SPLIT_ANGLE(1.20609176158905), + SCALE_SPLIT_ANGLE(1.22087836265564), + SCALE_SPLIT_ANGLE(1.23654139041901), + SCALE_SPLIT_ANGLE(1.26451897621155), + SCALE_SPLIT_ANGLE(1.32194638252258), + SCALE_SPLIT_ANGLE(1.37709856033325)}, + {SCALE_SPLIT_ANGLE(1.09969496726990), + SCALE_SPLIT_ANGLE(1.10437381267548), + SCALE_SPLIT_ANGLE(1.11171460151672), + SCALE_SPLIT_ANGLE(1.13144767284393), + SCALE_SPLIT_ANGLE(1.15274536609650), + SCALE_SPLIT_ANGLE(1.19192278385162), + SCALE_SPLIT_ANGLE(1.27820122241974), + SCALE_SPLIT_ANGLE(1.37287366390228)}, + {SCALE_SPLIT_ANGLE(0.98739641904831), + SCALE_SPLIT_ANGLE(0.99314504861832), + SCALE_SPLIT_ANGLE(1.00221848487854), + SCALE_SPLIT_ANGLE(1.02694928646088), + SCALE_SPLIT_ANGLE(1.05423069000244), + SCALE_SPLIT_ANGLE(1.10619938373566), + SCALE_SPLIT_ANGLE(1.23116791248322), + SCALE_SPLIT_ANGLE(1.39771795272827)}, + {SCALE_SPLIT_ANGLE(0.86566168069839), + SCALE_SPLIT_ANGLE(0.87219274044037), + SCALE_SPLIT_ANGLE(0.88256764411926), + SCALE_SPLIT_ANGLE(0.91127204895020), + SCALE_SPLIT_ANGLE(0.94370108842850), + SCALE_SPLIT_ANGLE(1.00792455673218), + SCALE_SPLIT_ANGLE(1.17914211750031), + SCALE_SPLIT_ANGLE(1.48121190071106)}, + {SCALE_SPLIT_ANGLE(0.74293035268784), + SCALE_SPLIT_ANGLE(0.74975663423538), + SCALE_SPLIT_ANGLE(0.76066619157791), + SCALE_SPLIT_ANGLE(0.79128372669220), + SCALE_SPLIT_ANGLE(0.82667875289917), + SCALE_SPLIT_ANGLE(0.89952337741852), + SCALE_SPLIT_ANGLE(1.11571300029755), + SCALE_SPLIT_ANGLE(1.67431199550629)}, + {SCALE_SPLIT_ANGLE(0.62761706113815), + SCALE_SPLIT_ANGLE(0.63421267271042), + SCALE_SPLIT_ANGLE(0.64480352401733), + SCALE_SPLIT_ANGLE(0.67486244440079), + SCALE_SPLIT_ANGLE(0.71025311946869), + SCALE_SPLIT_ANGLE(0.78539818525314), + SCALE_SPLIT_ANGLE(1.02937340736389), + SCALE_SPLIT_ANGLE(1.92301487922668)}, + {SCALE_SPLIT_ANGLE(0.52522456645966), + SCALE_SPLIT_ANGLE(0.53118568658829), + SCALE_SPLIT_ANGLE(0.54078328609467), + SCALE_SPLIT_ANGLE(0.56819748878479), + SCALE_SPLIT_ANGLE(0.60080903768539), + SCALE_SPLIT_ANGLE(0.67127299308777), + SCALE_SPLIT_ANGLE(0.91114157438278), + SCALE_SPLIT_ANGLE(1.73398244380951)}, + {SCALE_SPLIT_ANGLE(0.43751955032349), + SCALE_SPLIT_ANGLE(0.44262495636940), + SCALE_SPLIT_ANGLE(0.45084837079048), + SCALE_SPLIT_ANGLE(0.47435709834099), + SCALE_SPLIT_ANGLE(0.50235128402710), + SCALE_SPLIT_ANGLE(0.56287181377411), + SCALE_SPLIT_ANGLE(0.76705121994019), + SCALE_SPLIT_ANGLE(1.34888231754303)}, + {SCALE_SPLIT_ANGLE(0.36364197731018), + SCALE_SPLIT_ANGLE(0.36782836914063), + SCALE_SPLIT_ANGLE(0.37456014752388), + SCALE_SPLIT_ANGLE(0.39372295141220), + SCALE_SPLIT_ANGLE(0.41636970639229), + SCALE_SPLIT_ANGLE(0.46459695696831), + SCALE_SPLIT_ANGLE(0.61803084611893), + SCALE_SPLIT_ANGLE(0.96275907754898)}, + {SCALE_SPLIT_ANGLE(0.30166232585907), + SCALE_SPLIT_ANGLE(0.30497136712074), + SCALE_SPLIT_ANGLE(0.31027451157570), + SCALE_SPLIT_ANGLE(0.32524627447128), + SCALE_SPLIT_ANGLE(0.34269109368324), + SCALE_SPLIT_ANGLE(0.37887358665466), + SCALE_SPLIT_ANGLE(0.48432540893555), + SCALE_SPLIT_ANGLE(0.66878592967987)}, + {SCALE_SPLIT_ANGLE(0.24960109591484), + SCALE_SPLIT_ANGLE(0.25213342905045), + SCALE_SPLIT_ANGLE(0.25617361068726), + SCALE_SPLIT_ANGLE(0.26745575666428), + SCALE_SPLIT_ANGLE(0.28036275506020), + SCALE_SPLIT_ANGLE(0.30627736449242), + SCALE_SPLIT_ANGLE(0.37490701675415), + SCALE_SPLIT_ANGLE(0.47145301103592)}, + {SCALE_SPLIT_ANGLE(0.18661488592625), + SCALE_SPLIT_ANGLE(0.18822197616100), + SCALE_SPLIT_ANGLE(0.19076596200466), + SCALE_SPLIT_ANGLE(0.19773863255978), + SCALE_SPLIT_ANGLE(0.20547652244568), + SCALE_SPLIT_ANGLE(0.22024063766003), + SCALE_SPLIT_ANGLE(0.25452125072479), + SCALE_SPLIT_ANGLE(0.29236793518066)}, + {SCALE_SPLIT_ANGLE(0.13821771740913), + SCALE_SPLIT_ANGLE(0.13918289542198), + SCALE_SPLIT_ANGLE(0.14069861173630), + SCALE_SPLIT_ANGLE(0.14477686583996), + SCALE_SPLIT_ANGLE(0.14917233586311), + SCALE_SPLIT_ANGLE(0.15718193352222), + SCALE_SPLIT_ANGLE(0.17394064366817), + SCALE_SPLIT_ANGLE(0.18971265852451)}, + {SCALE_SPLIT_ANGLE(0.10140904784203), + SCALE_SPLIT_ANGLE(0.10196315497160), + SCALE_SPLIT_ANGLE(0.10282710194588), + SCALE_SPLIT_ANGLE(0.10511382669210), + SCALE_SPLIT_ANGLE(0.10751703381538), + SCALE_SPLIT_ANGLE(0.11173453181982), + SCALE_SPLIT_ANGLE(0.11990433931351), + SCALE_SPLIT_ANGLE(0.12683042883873)}, + {SCALE_SPLIT_ANGLE(0.07378087192774), + SCALE_SPLIT_ANGLE(0.07408788800240), + SCALE_SPLIT_ANGLE(0.07456368207932), + SCALE_SPLIT_ANGLE(0.07580613344908), + SCALE_SPLIT_ANGLE(0.07708553224802), + SCALE_SPLIT_ANGLE(0.07926639169455), + SCALE_SPLIT_ANGLE(0.08326309919357), + SCALE_SPLIT_ANGLE(0.08642497658730)}, + {SCALE_SPLIT_ANGLE(0.05331044271588), + SCALE_SPLIT_ANGLE(0.05347600579262), + SCALE_SPLIT_ANGLE(0.05373133346438), + SCALE_SPLIT_ANGLE(0.05439101532102), + SCALE_SPLIT_ANGLE(0.05505970120430), + SCALE_SPLIT_ANGLE(0.05617496743798), + SCALE_SPLIT_ANGLE(0.05813983827829), + SCALE_SPLIT_ANGLE(0.05962376296520)}, + {SCALE_SPLIT_ANGLE(0.03066622652113), + SCALE_SPLIT_ANGLE(0.03072291985154), + SCALE_SPLIT_ANGLE(0.03080986253917), + SCALE_SPLIT_ANGLE(0.03103173524141), + SCALE_SPLIT_ANGLE(0.03125262632966), + SCALE_SPLIT_ANGLE(0.03161224350333), + SCALE_SPLIT_ANGLE(0.03221991285682), + SCALE_SPLIT_ANGLE(0.03265778720379)}, + {SCALE_SPLIT_ANGLE(0.01747439615428), + SCALE_SPLIT_ANGLE(0.01749316416681), + SCALE_SPLIT_ANGLE(0.01752184517682), + SCALE_SPLIT_ANGLE(0.01759449020028), + SCALE_SPLIT_ANGLE(0.01766604930162), + SCALE_SPLIT_ANGLE(0.01778092049062), + SCALE_SPLIT_ANGLE(0.01797054335475), + SCALE_SPLIT_ANGLE(0.01810375973582)}, + {SCALE_SPLIT_ANGLE(0.00990140344948), + SCALE_SPLIT_ANGLE(0.00990749336779), + SCALE_SPLIT_ANGLE(0.00991678331047), + SCALE_SPLIT_ANGLE(0.00994021166116), + SCALE_SPLIT_ANGLE(0.00996314454824), + SCALE_SPLIT_ANGLE(0.00999966636300), + SCALE_SPLIT_ANGLE(0.01005917042494), + SCALE_SPLIT_ANGLE(0.01010039448738)}, + {SCALE_SPLIT_ANGLE(0.00559204118326), + SCALE_SPLIT_ANGLE(0.00559399509802), + SCALE_SPLIT_ANGLE(0.00559697346762), + SCALE_SPLIT_ANGLE(0.00560446362942), + SCALE_SPLIT_ANGLE(0.00561177125201), + SCALE_SPLIT_ANGLE(0.00562335411087), + SCALE_SPLIT_ANGLE(0.00564208766446), + SCALE_SPLIT_ANGLE(0.00565496599302)}, + {SCALE_SPLIT_ANGLE(0.00000003162278), + SCALE_SPLIT_ANGLE(0.00000003162278), + SCALE_SPLIT_ANGLE(0.00000003162278), + SCALE_SPLIT_ANGLE(0.00000003162278), + SCALE_SPLIT_ANGLE(0.00000003162278), + SCALE_SPLIT_ANGLE(0.00000003162278), + SCALE_SPLIT_ANGLE(0.00000003162278), + SCALE_SPLIT_ANGLE(0.00000003162278)}, + }, + { + {SCALE_SPLIT_ANGLE(1.96349537372589), + SCALE_SPLIT_ANGLE(1.96349537372589), + SCALE_SPLIT_ANGLE(1.96349537372589), + SCALE_SPLIT_ANGLE(1.96349537372589), + SCALE_SPLIT_ANGLE(1.96349537372589), + SCALE_SPLIT_ANGLE(1.96349537372589), + SCALE_SPLIT_ANGLE(1.96349537372589), + SCALE_SPLIT_ANGLE(1.96349537372589)}, + {SCALE_SPLIT_ANGLE(1.95824837684631), + SCALE_SPLIT_ANGLE(1.95825088024139), + SCALE_SPLIT_ANGLE(1.95825481414795), + SCALE_SPLIT_ANGLE(1.95826447010040), + SCALE_SPLIT_ANGLE(1.95827388763428), + SCALE_SPLIT_ANGLE(1.95828890800476), + SCALE_SPLIT_ANGLE(1.95831274986267), + SCALE_SPLIT_ANGLE(1.95832908153534)}, + {SCALE_SPLIT_ANGLE(1.95409297943115), + SCALE_SPLIT_ANGLE(1.95410108566284), + SCALE_SPLIT_ANGLE(1.95411336421967), + SCALE_SPLIT_ANGLE(1.95414412021637), + SCALE_SPLIT_ANGLE(1.95417404174805), + SCALE_SPLIT_ANGLE(1.95422136783600), + SCALE_SPLIT_ANGLE(1.95429730415344), + SCALE_SPLIT_ANGLE(1.95434916019440)}, + {SCALE_SPLIT_ANGLE(1.94654774665833), + SCALE_SPLIT_ANGLE(1.94657325744629), + SCALE_SPLIT_ANGLE(1.94661211967468), + SCALE_SPLIT_ANGLE(1.94670987129211), + SCALE_SPLIT_ANGLE(1.94680488109589), + SCALE_SPLIT_ANGLE(1.94695508480072), + SCALE_SPLIT_ANGLE(1.94719684123993), + SCALE_SPLIT_ANGLE(1.94736230373383)}, + {SCALE_SPLIT_ANGLE(1.93263375759125), + SCALE_SPLIT_ANGLE(1.93271493911743), + SCALE_SPLIT_ANGLE(1.93283843994141), + SCALE_SPLIT_ANGLE(1.93314898014069), + SCALE_SPLIT_ANGLE(1.93345153331757), + SCALE_SPLIT_ANGLE(1.93393051624298), + SCALE_SPLIT_ANGLE(1.93470382690430), + SCALE_SPLIT_ANGLE(1.93523514270782)}, + {SCALE_SPLIT_ANGLE(1.90630435943604), + SCALE_SPLIT_ANGLE(1.90656292438507), + SCALE_SPLIT_ANGLE(1.90695691108704), + SCALE_SPLIT_ANGLE(1.90794765949249), + SCALE_SPLIT_ANGLE(1.90891444683075), + SCALE_SPLIT_ANGLE(1.91044902801514), + SCALE_SPLIT_ANGLE(1.91294109821320), + SCALE_SPLIT_ANGLE(1.91466653347015)}, + {SCALE_SPLIT_ANGLE(1.87960743904114), + SCALE_SPLIT_ANGLE(1.88012742996216), + SCALE_SPLIT_ANGLE(1.88091933727264), + SCALE_SPLIT_ANGLE(1.88291192054749), + SCALE_SPLIT_ANGLE(1.88485777378082), + SCALE_SPLIT_ANGLE(1.88795232772827), + SCALE_SPLIT_ANGLE(1.89300394058228), + SCALE_SPLIT_ANGLE(1.89652991294861)}, + {SCALE_SPLIT_ANGLE(1.83877396583557), + SCALE_SPLIT_ANGLE(1.83982229232788), + SCALE_SPLIT_ANGLE(1.84141862392426), + SCALE_SPLIT_ANGLE(1.84543347358704), + SCALE_SPLIT_ANGLE(1.84935534000397), + SCALE_SPLIT_ANGLE(1.85560429096222), + SCALE_SPLIT_ANGLE(1.86587727069855), + SCALE_SPLIT_ANGLE(1.87314081192017)}, + {SCALE_SPLIT_ANGLE(1.77493417263031), + SCALE_SPLIT_ANGLE(1.77705264091492), + SCALE_SPLIT_ANGLE(1.78027474880219), + SCALE_SPLIT_ANGLE(1.78836548328400), + SCALE_SPLIT_ANGLE(1.79626095294952), + SCALE_SPLIT_ANGLE(1.80886054039001), + SCALE_SPLIT_ANGLE(1.82978034019470), + SCALE_SPLIT_ANGLE(1.84489548206329)}, + {SCALE_SPLIT_ANGLE(1.67321813106537), + SCALE_SPLIT_ANGLE(1.67747652530670), + SCALE_SPLIT_ANGLE(1.68394017219543), + SCALE_SPLIT_ANGLE(1.70011746883392), + SCALE_SPLIT_ANGLE(1.71586501598358), + SCALE_SPLIT_ANGLE(1.74102878570557), + SCALE_SPLIT_ANGLE(1.78345441818237), + SCALE_SPLIT_ANGLE(1.81531298160553)}, + {SCALE_SPLIT_ANGLE(1.51132118701935), + SCALE_SPLIT_ANGLE(1.51959395408630), + SCALE_SPLIT_ANGLE(1.53212559223175), + SCALE_SPLIT_ANGLE(1.56339788436890), + SCALE_SPLIT_ANGLE(1.59380054473877), + SCALE_SPLIT_ANGLE(1.64260375499725), + SCALE_SPLIT_ANGLE(1.72719120979309), + SCALE_SPLIT_ANGLE(1.79549276828766)}, + {SCALE_SPLIT_ANGLE(1.35904061794281), + SCALE_SPLIT_ANGLE(1.37121617794037), + SCALE_SPLIT_ANGLE(1.38967239856720), + SCALE_SPLIT_ANGLE(1.43583393096924), + SCALE_SPLIT_ANGLE(1.48093688488007), + SCALE_SPLIT_ANGLE(1.55410325527191), + SCALE_SPLIT_ANGLE(1.68521773815155), + SCALE_SPLIT_ANGLE(1.80024886131287)}, + {SCALE_SPLIT_ANGLE(1.17258906364441), + SCALE_SPLIT_ANGLE(1.18893885612488), + SCALE_SPLIT_ANGLE(1.21383893489838), + SCALE_SPLIT_ANGLE(1.27678310871124), + SCALE_SPLIT_ANGLE(1.33930420875549), + SCALE_SPLIT_ANGLE(1.44322526454926), + SCALE_SPLIT_ANGLE(1.64006817340851), + SCALE_SPLIT_ANGLE(1.83627605438232)}, + {SCALE_SPLIT_ANGLE(0.96933782100677), + SCALE_SPLIT_ANGLE(0.98854482173920), + SCALE_SPLIT_ANGLE(1.01807177066803), + SCALE_SPLIT_ANGLE(1.09429967403412), + SCALE_SPLIT_ANGLE(1.17245352268219), + SCALE_SPLIT_ANGLE(1.30826878547668), + SCALE_SPLIT_ANGLE(1.58911180496216), + SCALE_SPLIT_ANGLE(1.92719435691834)}, + {SCALE_SPLIT_ANGLE(0.77729862928391), + SCALE_SPLIT_ANGLE(0.79675698280334), + SCALE_SPLIT_ANGLE(0.82701611518860), + SCALE_SPLIT_ANGLE(0.90724968910217), + SCALE_SPLIT_ANGLE(0.99302649497986), + SCALE_SPLIT_ANGLE(1.15163993835449), + SCALE_SPLIT_ANGLE(1.52265202999115), + SCALE_SPLIT_ANGLE(2.09869623184204)}, + {SCALE_SPLIT_ANGLE(0.61765128374100), + SCALE_SPLIT_ANGLE(0.63503885269165), + SCALE_SPLIT_ANGLE(0.66235077381134), + SCALE_SPLIT_ANGLE(0.73653638362885), + SCALE_SPLIT_ANGLE(0.81904613971710), + SCALE_SPLIT_ANGLE(0.98174768686295), + SCALE_SPLIT_ANGLE(1.42110538482666), + SCALE_SPLIT_ANGLE(2.28386068344116)}, + {SCALE_SPLIT_ANGLE(0.49486333131790), + SCALE_SPLIT_ANGLE(0.50909578800201), + SCALE_SPLIT_ANGLE(0.53160983324051), + SCALE_SPLIT_ANGLE(0.59379214048386), + SCALE_SPLIT_ANGLE(0.66487491130829), + SCALE_SPLIT_ANGLE(0.81185549497604), + SCALE_SPLIT_ANGLE(1.26233386993408), + SCALE_SPLIT_ANGLE(2.16925764083862)}, + {SCALE_SPLIT_ANGLE(0.40230560302734), + SCALE_SPLIT_ANGLE(0.41332274675369), + SCALE_SPLIT_ANGLE(0.43082228302956), + SCALE_SPLIT_ANGLE(0.47957953810692), + SCALE_SPLIT_ANGLE(0.53603589534760), + SCALE_SPLIT_ANGLE(0.65522658824921), + SCALE_SPLIT_ANGLE(1.04503858089447), + SCALE_SPLIT_ANGLE(1.87041807174683)}, + {SCALE_SPLIT_ANGLE(0.33104607462883), + SCALE_SPLIT_ANGLE(0.33927726745605), + SCALE_SPLIT_ANGLE(0.35237133502960), + SCALE_SPLIT_ANGLE(0.38892474770546), + SCALE_SPLIT_ANGLE(0.43126159906387), + SCALE_SPLIT_ANGLE(0.52027010917664), + SCALE_SPLIT_ANGLE(0.80654186010361), + SCALE_SPLIT_ANGLE(1.41960310935974)}, + {SCALE_SPLIT_ANGLE(0.27415537834167), + SCALE_SPLIT_ANGLE(0.28015670180321), + SCALE_SPLIT_ANGLE(0.28969678282738), + SCALE_SPLIT_ANGLE(0.31623730063438), + SCALE_SPLIT_ANGLE(0.34670370817184), + SCALE_SPLIT_ANGLE(0.40939208865166), + SCALE_SPLIT_ANGLE(0.59604310989380), + SCALE_SPLIT_ANGLE(0.94309806823730)}, + {SCALE_SPLIT_ANGLE(0.22730343043804), + SCALE_SPLIT_ANGLE(0.23159568011761), + SCALE_SPLIT_ANGLE(0.23840220272541), + SCALE_SPLIT_ANGLE(0.25720024108887), + SCALE_SPLIT_ANGLE(0.27846288681030), + SCALE_SPLIT_ANGLE(0.32089167833328), + SCALE_SPLIT_ANGLE(0.43515858054161), + SCALE_SPLIT_ANGLE(0.60621982812881)}, + {SCALE_SPLIT_ANGLE(0.17074465751648), + SCALE_SPLIT_ANGLE(0.17326098680496), + SCALE_SPLIT_ANGLE(0.17722852528095), + SCALE_SPLIT_ANGLE(0.18802370131016), + SCALE_SPLIT_ANGLE(0.19990929961205), + SCALE_SPLIT_ANGLE(0.22246663272381), + SCALE_SPLIT_ANGLE(0.27514943480492), + SCALE_SPLIT_ANGLE(0.33505329489708)}, + {SCALE_SPLIT_ANGLE(0.12695817649364), + SCALE_SPLIT_ANGLE(0.12838459014893), + SCALE_SPLIT_ANGLE(0.13061878085136), + SCALE_SPLIT_ANGLE(0.13660037517548), + SCALE_SPLIT_ANGLE(0.14301040768623), + SCALE_SPLIT_ANGLE(0.15463486313820), + SCALE_SPLIT_ANGLE(0.17893929779530), + SCALE_SPLIT_ANGLE(0.20203559100628)}, + {SCALE_SPLIT_ANGLE(0.09338590502739), + SCALE_SPLIT_ANGLE(0.09417138993740), + SCALE_SPLIT_ANGLE(0.09539390355349), + SCALE_SPLIT_ANGLE(0.09861853718758), + SCALE_SPLIT_ANGLE(0.10199318081141), + SCALE_SPLIT_ANGLE(0.10789106786251), + SCALE_SPLIT_ANGLE(0.11927830427885), + SCALE_SPLIT_ANGLE(0.12894381582737)}, + {SCALE_SPLIT_ANGLE(0.06804535537958), + SCALE_SPLIT_ANGLE(0.06846775114536), + SCALE_SPLIT_ANGLE(0.06912153959274), + SCALE_SPLIT_ANGLE(0.07082461565733), + SCALE_SPLIT_ANGLE(0.07257289439440), + SCALE_SPLIT_ANGLE(0.07554303854704), + SCALE_SPLIT_ANGLE(0.08096561580896), + SCALE_SPLIT_ANGLE(0.08524779230356)}, + {SCALE_SPLIT_ANGLE(0.04920704290271), + SCALE_SPLIT_ANGLE(0.04942999407649), + SCALE_SPLIT_ANGLE(0.04977354034781), + SCALE_SPLIT_ANGLE(0.05065960064530), + SCALE_SPLIT_ANGLE(0.05155571550131), + SCALE_SPLIT_ANGLE(0.05304637551308), + SCALE_SPLIT_ANGLE(0.05566369369626), + SCALE_SPLIT_ANGLE(0.05763531476259)}, + {SCALE_SPLIT_ANGLE(0.02832321822643), + SCALE_SPLIT_ANGLE(0.02839783765376), + SCALE_SPLIT_ANGLE(0.02851220779121), + SCALE_SPLIT_ANGLE(0.02880378998816), + SCALE_SPLIT_ANGLE(0.02909369394183), + SCALE_SPLIT_ANGLE(0.02956490404904), + SCALE_SPLIT_ANGLE(0.03035926818848), + SCALE_SPLIT_ANGLE(0.03093044832349)}, + {SCALE_SPLIT_ANGLE(0.01614263281226), + SCALE_SPLIT_ANGLE(0.01616701297462), + SCALE_SPLIT_ANGLE(0.01620426215231), + SCALE_SPLIT_ANGLE(0.01629856042564), + SCALE_SPLIT_ANGLE(0.01639137230814), + SCALE_SPLIT_ANGLE(0.01654022186995), + SCALE_SPLIT_ANGLE(0.01678557507694), + SCALE_SPLIT_ANGLE(0.01695770025253)}, + {SCALE_SPLIT_ANGLE(0.00914741214365), + SCALE_SPLIT_ANGLE(0.00915526598692), + SCALE_SPLIT_ANGLE(0.00916724558920), + SCALE_SPLIT_ANGLE(0.00919744372368), + SCALE_SPLIT_ANGLE(0.00922699086368), + SCALE_SPLIT_ANGLE(0.00927402079105), + SCALE_SPLIT_ANGLE(0.00935057550669), + SCALE_SPLIT_ANGLE(0.00940357148647)}, + {SCALE_SPLIT_ANGLE(0.00516631966457), + SCALE_SPLIT_ANGLE(0.00516883004457), + SCALE_SPLIT_ANGLE(0.00517265405506), + SCALE_SPLIT_ANGLE(0.00518227089196), + SCALE_SPLIT_ANGLE(0.00519165024161), + SCALE_SPLIT_ANGLE(0.00520651414990), + SCALE_SPLIT_ANGLE(0.00523054087535), + SCALE_SPLIT_ANGLE(0.00524705136195)}, + {SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564)}, + }, + { + {SCALE_SPLIT_ANGLE(2.35619449615479), + SCALE_SPLIT_ANGLE(2.35619449615479), + SCALE_SPLIT_ANGLE(2.35619449615479), + SCALE_SPLIT_ANGLE(2.35619449615479), + SCALE_SPLIT_ANGLE(2.35619449615479), + SCALE_SPLIT_ANGLE(2.35619449615479), + SCALE_SPLIT_ANGLE(2.35619449615479), + SCALE_SPLIT_ANGLE(2.35619449615479)}, + {SCALE_SPLIT_ANGLE(2.35216379165649), + SCALE_SPLIT_ANGLE(2.35216617584229), + SCALE_SPLIT_ANGLE(2.35216999053955), + SCALE_SPLIT_ANGLE(2.35217905044556), + SCALE_SPLIT_ANGLE(2.35218811035156), + SCALE_SPLIT_ANGLE(2.35220217704773), + SCALE_SPLIT_ANGLE(2.35222482681274), + SCALE_SPLIT_ANGLE(2.35224032402039)}, + {SCALE_SPLIT_ANGLE(2.34895062446594), + SCALE_SPLIT_ANGLE(2.34895825386047), + SCALE_SPLIT_ANGLE(2.34897017478943), + SCALE_SPLIT_ANGLE(2.34899950027466), + SCALE_SPLIT_ANGLE(2.34902811050415), + SCALE_SPLIT_ANGLE(2.34907317161560), + SCALE_SPLIT_ANGLE(2.34914517402649), + SCALE_SPLIT_ANGLE(2.34919428825378)}, + {SCALE_SPLIT_ANGLE(2.34306812286377), + SCALE_SPLIT_ANGLE(2.34309291839600), + SCALE_SPLIT_ANGLE(2.34313082695007), + SCALE_SPLIT_ANGLE(2.34322524070740), + SCALE_SPLIT_ANGLE(2.34331679344177), + SCALE_SPLIT_ANGLE(2.34346079826355), + SCALE_SPLIT_ANGLE(2.34369087219238), + SCALE_SPLIT_ANGLE(2.34384727478027)}, + {SCALE_SPLIT_ANGLE(2.33205723762512), + SCALE_SPLIT_ANGLE(2.33213782310486), + SCALE_SPLIT_ANGLE(2.33226013183594), + SCALE_SPLIT_ANGLE(2.33256578445435), + SCALE_SPLIT_ANGLE(2.33286166191101), + SCALE_SPLIT_ANGLE(2.33332633972168), + SCALE_SPLIT_ANGLE(2.33406686782837), + SCALE_SPLIT_ANGLE(2.33456921577454)}, + {SCALE_SPLIT_ANGLE(2.31062912940979), + SCALE_SPLIT_ANGLE(2.31089663505554), + SCALE_SPLIT_ANGLE(2.31130218505859), + SCALE_SPLIT_ANGLE(2.31231284141541), + SCALE_SPLIT_ANGLE(2.31328654289246), + SCALE_SPLIT_ANGLE(2.31480789184570), + SCALE_SPLIT_ANGLE(2.31722092628479), + SCALE_SPLIT_ANGLE(2.31885290145874)}, + {SCALE_SPLIT_ANGLE(2.28808355331421), + SCALE_SPLIT_ANGLE(2.28864479064941), + SCALE_SPLIT_ANGLE(2.28949403762817), + SCALE_SPLIT_ANGLE(2.29160070419312), + SCALE_SPLIT_ANGLE(2.29361891746521), + SCALE_SPLIT_ANGLE(2.29675459861755), + SCALE_SPLIT_ANGLE(2.30169844627380), + SCALE_SPLIT_ANGLE(2.30503511428833)}, + {SCALE_SPLIT_ANGLE(2.25191521644592), + SCALE_SPLIT_ANGLE(2.25312566757202), + SCALE_SPLIT_ANGLE(2.25494909286499), + SCALE_SPLIT_ANGLE(2.25943517684937), + SCALE_SPLIT_ANGLE(2.26368880271912), + SCALE_SPLIT_ANGLE(2.27023100852966), + SCALE_SPLIT_ANGLE(2.28044486045837), + SCALE_SPLIT_ANGLE(2.28732299804688)}, + {SCALE_SPLIT_ANGLE(2.19093585014343), + SCALE_SPLIT_ANGLE(2.19366121292114), + SCALE_SPLIT_ANGLE(2.19773292541504), + SCALE_SPLIT_ANGLE(2.20759749412537), + SCALE_SPLIT_ANGLE(2.21677780151367), + SCALE_SPLIT_ANGLE(2.23064494132996), + SCALE_SPLIT_ANGLE(2.25193929672241), + SCALE_SPLIT_ANGLE(2.26625943183899)}, + {SCALE_SPLIT_ANGLE(2.08102917671204), + SCALE_SPLIT_ANGLE(2.08757281303406), + SCALE_SPLIT_ANGLE(2.09720706939697), + SCALE_SPLIT_ANGLE(2.11991167068481), + SCALE_SPLIT_ANGLE(2.14035654067993), + SCALE_SPLIT_ANGLE(2.17029213905334), + SCALE_SPLIT_ANGLE(2.21503138542175), + SCALE_SPLIT_ANGLE(2.24518108367920)}, + {SCALE_SPLIT_ANGLE(1.86738610267639), + SCALE_SPLIT_ANGLE(1.88426077365875), + SCALE_SPLIT_ANGLE(1.90853273868561), + SCALE_SPLIT_ANGLE(1.96333324909210), + SCALE_SPLIT_ANGLE(2.01024460792542), + SCALE_SPLIT_ANGLE(2.07577633857727), + SCALE_SPLIT_ANGLE(2.16986608505249), + SCALE_SPLIT_ANGLE(2.23406052589417)}, + {SCALE_SPLIT_ANGLE(1.61812174320221), + SCALE_SPLIT_ANGLE(1.64943754673004), + SCALE_SPLIT_ANGLE(1.69389235973358), + SCALE_SPLIT_ANGLE(1.79176020622253), + SCALE_SPLIT_ANGLE(1.87292492389679), + SCALE_SPLIT_ANGLE(1.98277986049652), + SCALE_SPLIT_ANGLE(2.13605809211731), + SCALE_SPLIT_ANGLE(2.24282979965210)}, + {SCALE_SPLIT_ANGLE(1.26556181907654), + SCALE_SPLIT_ANGLE(1.31512010097504), + SCALE_SPLIT_ANGLE(1.38608694076538), + SCALE_SPLIT_ANGLE(1.54419934749603), + SCALE_SPLIT_ANGLE(1.67621040344238), + SCALE_SPLIT_ANGLE(1.85417342185974), + SCALE_SPLIT_ANGLE(2.09956336021423), + SCALE_SPLIT_ANGLE(2.27729439735413)}, + {SCALE_SPLIT_ANGLE(0.88984864950180), + SCALE_SPLIT_ANGLE(0.94673132896423), + SCALE_SPLIT_ANGLE(1.03102219104767), + SCALE_SPLIT_ANGLE(1.23219704627991), + SCALE_SPLIT_ANGLE(1.41468584537506), + SCALE_SPLIT_ANGLE(1.67807435989380), + SCALE_SPLIT_ANGLE(2.05749273300171), + SCALE_SPLIT_ANGLE(2.35138511657715)}, + {SCALE_SPLIT_ANGLE(0.60630625486374), + SCALE_SPLIT_ANGLE(0.65551131963730), + SCALE_SPLIT_ANGLE(0.73032128810883), + SCALE_SPLIT_ANGLE(0.92225730419159), + SCALE_SPLIT_ANGLE(1.11866605281830), + SCALE_SPLIT_ANGLE(1.44806647300720), + SCALE_SPLIT_ANGLE(1.99872636795044), + SCALE_SPLIT_ANGLE(2.47302055358887)}, + {SCALE_SPLIT_ANGLE(0.43393731117249), + SCALE_SPLIT_ANGLE(0.47099208831787), + SCALE_SPLIT_ANGLE(0.52780759334564), + SCALE_SPLIT_ANGLE(0.67895972728729), + SCALE_SPLIT_ANGLE(0.84712409973145), + SCALE_SPLIT_ANGLE(1.17809724807739), + SCALE_SPLIT_ANGLE(1.89703977108002), + SCALE_SPLIT_ANGLE(2.59155654907227)}, + {SCALE_SPLIT_ANGLE(0.33522719144821), + SCALE_SPLIT_ANGLE(0.36133098602295), + SCALE_SPLIT_ANGLE(0.40159517526627), + SCALE_SPLIT_ANGLE(0.51039946079254), + SCALE_SPLIT_ANGLE(0.63590413331985), + SCALE_SPLIT_ANGLE(0.90812796354294), + SCALE_SPLIT_ANGLE(1.70793557167053), + SCALE_SPLIT_ANGLE(2.52852439880371)}, + {SCALE_SPLIT_ANGLE(0.27478924393654), + SCALE_SPLIT_ANGLE(0.29251149296761), + SCALE_SPLIT_ANGLE(0.32007756829262), + SCALE_SPLIT_ANGLE(0.39531299471855), + SCALE_SPLIT_ANGLE(0.48291319608688), + SCALE_SPLIT_ANGLE(0.67812001705170), + SCALE_SPLIT_ANGLE(1.39007341861725), + SCALE_SPLIT_ANGLE(2.34402561187744)}, + {SCALE_SPLIT_ANGLE(0.23185738921165), + SCALE_SPLIT_ANGLE(0.24370795488358), + SCALE_SPLIT_ANGLE(0.26227980852127), + SCALE_SPLIT_ANGLE(0.31327381730080), + SCALE_SPLIT_ANGLE(0.37241828441620), + SCALE_SPLIT_ANGLE(0.50202107429504), + SCALE_SPLIT_ANGLE(0.99085599184036), + SCALE_SPLIT_ANGLE(1.96553468704224)}, + {SCALE_SPLIT_ANGLE(0.19698308408260), + SCALE_SPLIT_ANGLE(0.20488271117210), + SCALE_SPLIT_ANGLE(0.21731524169445), + SCALE_SPLIT_ANGLE(0.25148212909698), + SCALE_SPLIT_ANGLE(0.29065516591072), + SCALE_SPLIT_ANGLE(0.37341466546059), + SCALE_SPLIT_ANGLE(0.65295964479446), + SCALE_SPLIT_ANGLE(1.28865826129913)}, + {SCALE_SPLIT_ANGLE(0.16667704284191), + SCALE_SPLIT_ANGLE(0.17194211483002), + SCALE_SPLIT_ANGLE(0.18023577332497), + SCALE_SPLIT_ANGLE(0.20293866097927), + SCALE_SPLIT_ANGLE(0.22855134308338), + SCALE_SPLIT_ANGLE(0.28041818737984), + SCALE_SPLIT_ANGLE(0.43142420053482), + SCALE_SPLIT_ANGLE(0.70030152797699)}, + {SCALE_SPLIT_ANGLE(0.12773877382278), + SCALE_SPLIT_ANGLE(0.13059370219707), + SCALE_SPLIT_ANGLE(0.13507819175720), + SCALE_SPLIT_ANGLE(0.14721076190472), + SCALE_SPLIT_ANGLE(0.16052412986755), + SCALE_SPLIT_ANGLE(0.18590225279331), + SCALE_SPLIT_ANGLE(0.24703904986382), + SCALE_SPLIT_ANGLE(0.32153329253197)}, + {SCALE_SPLIT_ANGLE(0.09603263437748), + SCALE_SPLIT_ANGLE(0.09756572544575), + SCALE_SPLIT_ANGLE(0.09996145218611), + SCALE_SPLIT_ANGLE(0.10635073482990), + SCALE_SPLIT_ANGLE(0.11317526549101), + SCALE_SPLIT_ANGLE(0.12554961442947), + SCALE_SPLIT_ANGLE(0.15168419480324), + SCALE_SPLIT_ANGLE(0.17713627219200)}, + {SCALE_SPLIT_ANGLE(0.07104731351137), + SCALE_SPLIT_ANGLE(0.07186015695333), + SCALE_SPLIT_ANGLE(0.07312334328890), + SCALE_SPLIT_ANGLE(0.07644616067410), + SCALE_SPLIT_ANGLE(0.07991369813681), + SCALE_SPLIT_ANGLE(0.08596338331699), + SCALE_SPLIT_ANGLE(0.09766443818808), + SCALE_SPLIT_ANGLE(0.10767273604870)}, + {SCALE_SPLIT_ANGLE(0.05192205682397), + SCALE_SPLIT_ANGLE(0.05234766751528), + SCALE_SPLIT_ANGLE(0.05300576984882), + SCALE_SPLIT_ANGLE(0.05471667647362), + SCALE_SPLIT_ANGLE(0.05646898597479), + SCALE_SPLIT_ANGLE(0.05943991243839), + SCALE_SPLIT_ANGLE(0.06485754251480), + SCALE_SPLIT_ANGLE(0.06914159655571)}, + {SCALE_SPLIT_ANGLE(0.03760399296880), + SCALE_SPLIT_ANGLE(0.03782445564866), + SCALE_SPLIT_ANGLE(0.03816393017769), + SCALE_SPLIT_ANGLE(0.03903824463487), + SCALE_SPLIT_ANGLE(0.03992090374231), + SCALE_SPLIT_ANGLE(0.04138650372624), + SCALE_SPLIT_ANGLE(0.04395476728678), + SCALE_SPLIT_ANGLE(0.04588782787323)}, + {SCALE_SPLIT_ANGLE(0.02166714705527), + SCALE_SPLIT_ANGLE(0.02173948101699), + SCALE_SPLIT_ANGLE(0.02185030654073), + SCALE_SPLIT_ANGLE(0.02213260531425), + SCALE_SPLIT_ANGLE(0.02241298183799), + SCALE_SPLIT_ANGLE(0.02286812849343), + SCALE_SPLIT_ANGLE(0.02363408915699), + SCALE_SPLIT_ANGLE(0.02418405190110)}, + {SCALE_SPLIT_ANGLE(0.01235313806683), + SCALE_SPLIT_ANGLE(0.01237650960684), + SCALE_SPLIT_ANGLE(0.01241220813245), + SCALE_SPLIT_ANGLE(0.01250253710896), + SCALE_SPLIT_ANGLE(0.01259138900787), + SCALE_SPLIT_ANGLE(0.01273377332836), + SCALE_SPLIT_ANGLE(0.01296819839627), + SCALE_SPLIT_ANGLE(0.01313247997314)}, + {SCALE_SPLIT_ANGLE(0.00700078532100), + SCALE_SPLIT_ANGLE(0.00700826756656), + SCALE_SPLIT_ANGLE(0.00701967673376), + SCALE_SPLIT_ANGLE(0.00704843224958), + SCALE_SPLIT_ANGLE(0.00707655772567), + SCALE_SPLIT_ANGLE(0.00712130358443), + SCALE_SPLIT_ANGLE(0.00719408970326), + SCALE_SPLIT_ANGLE(0.00724443979561)}, + {SCALE_SPLIT_ANGLE(0.00395406875759), + SCALE_SPLIT_ANGLE(0.00395645201206), + SCALE_SPLIT_ANGLE(0.00396008137614), + SCALE_SPLIT_ANGLE(0.00396920880303), + SCALE_SPLIT_ANGLE(0.00397810759023), + SCALE_SPLIT_ANGLE(0.00399220688269), + SCALE_SPLIT_ANGLE(0.00401498842984), + SCALE_SPLIT_ANGLE(0.00403063697740)}, + {SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068)}, + }, + { + {SCALE_SPLIT_ANGLE(2.74889349937439), + SCALE_SPLIT_ANGLE(2.74889349937439), + SCALE_SPLIT_ANGLE(2.74889349937439), + SCALE_SPLIT_ANGLE(2.74889349937439), + SCALE_SPLIT_ANGLE(2.74889349937439), + SCALE_SPLIT_ANGLE(2.74889349937439), + SCALE_SPLIT_ANGLE(2.74889349937439), + SCALE_SPLIT_ANGLE(2.74889349937439)}, + {SCALE_SPLIT_ANGLE(2.74670672416687), + SCALE_SPLIT_ANGLE(2.74670815467834), + SCALE_SPLIT_ANGLE(2.74671053886414), + SCALE_SPLIT_ANGLE(2.74671602249146), + SCALE_SPLIT_ANGLE(2.74672174453735), + SCALE_SPLIT_ANGLE(2.74673032760620), + SCALE_SPLIT_ANGLE(2.74674415588379), + SCALE_SPLIT_ANGLE(2.74675345420837)}, + {SCALE_SPLIT_ANGLE(2.74495577812195), + SCALE_SPLIT_ANGLE(2.74496054649353), + SCALE_SPLIT_ANGLE(2.74496769905090), + SCALE_SPLIT_ANGLE(2.74498581886292), + SCALE_SPLIT_ANGLE(2.74500346183777), + SCALE_SPLIT_ANGLE(2.74503111839294), + SCALE_SPLIT_ANGLE(2.74507498741150), + SCALE_SPLIT_ANGLE(2.74510502815247)}, + {SCALE_SPLIT_ANGLE(2.74173212051392), + SCALE_SPLIT_ANGLE(2.74174761772156), + SCALE_SPLIT_ANGLE(2.74177098274231), + SCALE_SPLIT_ANGLE(2.74182939529419), + SCALE_SPLIT_ANGLE(2.74188613891602), + SCALE_SPLIT_ANGLE(2.74197483062744), + SCALE_SPLIT_ANGLE(2.74211573600769), + SCALE_SPLIT_ANGLE(2.74221110343933)}, + {SCALE_SPLIT_ANGLE(2.73563575744629), + SCALE_SPLIT_ANGLE(2.73568630218506), + SCALE_SPLIT_ANGLE(2.73576331138611), + SCALE_SPLIT_ANGLE(2.73595523834229), + SCALE_SPLIT_ANGLE(2.73614001274109), + SCALE_SPLIT_ANGLE(2.73642849922180), + SCALE_SPLIT_ANGLE(2.73688435554504), + SCALE_SPLIT_ANGLE(2.73719072341919)}, + {SCALE_SPLIT_ANGLE(2.72353148460388), + SCALE_SPLIT_ANGLE(2.72370529174805), + SCALE_SPLIT_ANGLE(2.72396802902222), + SCALE_SPLIT_ANGLE(2.72461819648743), + SCALE_SPLIT_ANGLE(2.72523880004883), + SCALE_SPLIT_ANGLE(2.72619819641113), + SCALE_SPLIT_ANGLE(2.72769498825073), + SCALE_SPLIT_ANGLE(2.72869181632996)}, + {SCALE_SPLIT_ANGLE(2.71044087409973), + SCALE_SPLIT_ANGLE(2.71081781387329), + SCALE_SPLIT_ANGLE(2.71138477325439), + SCALE_SPLIT_ANGLE(2.71277689933777), + SCALE_SPLIT_ANGLE(2.71409153938293), + SCALE_SPLIT_ANGLE(2.71610021591187), + SCALE_SPLIT_ANGLE(2.71919155120850), + SCALE_SPLIT_ANGLE(2.72123122215271)}, + {SCALE_SPLIT_ANGLE(2.68862843513489), + SCALE_SPLIT_ANGLE(2.68948626518250), + SCALE_SPLIT_ANGLE(2.69076681137085), + SCALE_SPLIT_ANGLE(2.69386243820190), + SCALE_SPLIT_ANGLE(2.69673037528992), + SCALE_SPLIT_ANGLE(2.70102667808533), + SCALE_SPLIT_ANGLE(2.70749115943909), + SCALE_SPLIT_ANGLE(2.71170210838318)}, + {SCALE_SPLIT_ANGLE(2.64932370185852), + SCALE_SPLIT_ANGLE(2.65145039558411), + SCALE_SPLIT_ANGLE(2.65457701683044), + SCALE_SPLIT_ANGLE(2.66191530227661), + SCALE_SPLIT_ANGLE(2.66847491264343), + SCALE_SPLIT_ANGLE(2.67795729637146), + SCALE_SPLIT_ANGLE(2.69169545173645), + SCALE_SPLIT_ANGLE(2.70048093795776)}, + {SCALE_SPLIT_ANGLE(2.56864428520203), + SCALE_SPLIT_ANGLE(2.57483482360840), + SCALE_SPLIT_ANGLE(2.58364057540894), + SCALE_SPLIT_ANGLE(2.60311055183411), + SCALE_SPLIT_ANGLE(2.61933612823486), + SCALE_SPLIT_ANGLE(2.64129805564880), + SCALE_SPLIT_ANGLE(2.67107844352722), + SCALE_SPLIT_ANGLE(2.68960857391357)}, + {SCALE_SPLIT_ANGLE(2.35773015022278), + SCALE_SPLIT_ANGLE(2.38251185417175), + SCALE_SPLIT_ANGLE(2.41520094871521), + SCALE_SPLIT_ANGLE(2.47876882553101), + SCALE_SPLIT_ANGLE(2.52468156814575), + SCALE_SPLIT_ANGLE(2.57956743240356), + SCALE_SPLIT_ANGLE(2.64563941955566), + SCALE_SPLIT_ANGLE(2.68501615524292)}, + {SCALE_SPLIT_ANGLE(1.95455360412598), + SCALE_SPLIT_ANGLE(2.03550028800964), + SCALE_SPLIT_ANGLE(2.13431143760681), + SCALE_SPLIT_ANGLE(2.30167627334595), + SCALE_SPLIT_ANGLE(2.40472936630249), + SCALE_SPLIT_ANGLE(2.51241874694824), + SCALE_SPLIT_ANGLE(2.62649774551392), + SCALE_SPLIT_ANGLE(2.69151234626770)}, + {SCALE_SPLIT_ANGLE(1.08639848232269), + SCALE_SPLIT_ANGLE(1.25607907772064), + SCALE_SPLIT_ANGLE(1.49360668659210), + SCALE_SPLIT_ANGLE(1.93062829971313), + SCALE_SPLIT_ANGLE(2.18087863922119), + SCALE_SPLIT_ANGLE(2.40583086013794), + SCALE_SPLIT_ANGLE(2.60574340820313), + SCALE_SPLIT_ANGLE(2.71224212646484)}, + {SCALE_SPLIT_ANGLE(0.46298864483833), + SCALE_SPLIT_ANGLE(0.57069420814514), + SCALE_SPLIT_ANGLE(0.74941867589951), + SCALE_SPLIT_ANGLE(1.27059137821198), + SCALE_SPLIT_ANGLE(1.74987781047821), + SCALE_SPLIT_ANGLE(2.22410750389099), + SCALE_SPLIT_ANGLE(2.58140015602112), + SCALE_SPLIT_ANGLE(2.75301027297974)}, + {SCALE_SPLIT_ANGLE(0.23063218593597), + SCALE_SPLIT_ANGLE(0.29689303040504), + SCALE_SPLIT_ANGLE(0.39820966124535), + SCALE_SPLIT_ANGLE(0.70773023366928), + SCALE_SPLIT_ANGLE(1.13546586036682), + SCALE_SPLIT_ANGLE(1.89722001552582), + SCALE_SPLIT_ANGLE(2.54544758796692), + SCALE_SPLIT_ANGLE(2.81490159034729)}, + {SCALE_SPLIT_ANGLE(0.14590546488762), + SCALE_SPLIT_ANGLE(0.19153353571892), + SCALE_SPLIT_ANGLE(0.25519019365311), + SCALE_SPLIT_ANGLE(0.43163710832596), + SCALE_SPLIT_ANGLE(0.67776858806610), + SCALE_SPLIT_ANGLE(1.37444674968719), + SCALE_SPLIT_ANGLE(2.47591257095337), + SCALE_SPLIT_ANGLE(2.87223863601685)}, + {SCALE_SPLIT_ANGLE(0.12191537022591), + SCALE_SPLIT_ANGLE(0.15053890645504), + SCALE_SPLIT_ANGLE(0.19072309136391), + SCALE_SPLIT_ANGLE(0.29725375771523), + SCALE_SPLIT_ANGLE(0.43550044298172), + SCALE_SPLIT_ANGLE(0.85167354345322), + SCALE_SPLIT_ANGLE(2.31663155555725), + SCALE_SPLIT_ANGLE(2.84442567825317)}, + {SCALE_SPLIT_ANGLE(0.11467454582453), + SCALE_SPLIT_ANGLE(0.13146138191223), + SCALE_SPLIT_ANGLE(0.15621000528336), + SCALE_SPLIT_ANGLE(0.22212918102741), + SCALE_SPLIT_ANGLE(0.30330246686935), + SCALE_SPLIT_ANGLE(0.52478593587875), + SCALE_SPLIT_ANGLE(1.91173267364502), + SCALE_SPLIT_ANGLE(2.75908088684082)}, + {SCALE_SPLIT_ANGLE(0.10720870643854), + SCALE_SPLIT_ANGLE(0.11720535159111), + SCALE_SPLIT_ANGLE(0.13246683776379), + SCALE_SPLIT_ANGLE(0.17369449138641), + SCALE_SPLIT_ANGLE(0.22279064357281), + SCALE_SPLIT_ANGLE(0.34306266903877), + SCALE_SPLIT_ANGLE(1.11311781406403), + SCALE_SPLIT_ANGLE(2.55312228202820)}, + {SCALE_SPLIT_ANGLE(0.09705757349730), + SCALE_SPLIT_ANGLE(0.10320189595222), + SCALE_SPLIT_ANGLE(0.11274837702513), + SCALE_SPLIT_ANGLE(0.13873106241226), + SCALE_SPLIT_ANGLE(0.16888953745365), + SCALE_SPLIT_ANGLE(0.23647473752499), + SCALE_SPLIT_ANGLE(0.53898406028748), + SCALE_SPLIT_ANGLE(1.80699026584625)}, + {SCALE_SPLIT_ANGLE(0.08528346568346), + SCALE_SPLIT_ANGLE(0.08915080130100), + SCALE_SPLIT_ANGLE(0.09520188719034), + SCALE_SPLIT_ANGLE(0.11166745424271), + SCALE_SPLIT_ANGLE(0.13034184277058), + SCALE_SPLIT_ANGLE(0.16932605206966), + SCALE_SPLIT_ANGLE(0.29887470602989), + SCALE_SPLIT_ANGLE(0.63077676296234)}, + {SCALE_SPLIT_ANGLE(0.06733843684196), + SCALE_SPLIT_ANGLE(0.06931617110968), + SCALE_SPLIT_ANGLE(0.07241340726614), + SCALE_SPLIT_ANGLE(0.08076417446136), + SCALE_SPLIT_ANGLE(0.08993341028690), + SCALE_SPLIT_ANGLE(0.10759533941746), + SCALE_SPLIT_ANGLE(0.15204638242722), + SCALE_SPLIT_ANGLE(0.21143139898777)}, + {SCALE_SPLIT_ANGLE(0.05132640898228), + SCALE_SPLIT_ANGLE(0.05234802886844), + SCALE_SPLIT_ANGLE(0.05394187942147), + SCALE_SPLIT_ANGLE(0.05818277224898), + SCALE_SPLIT_ANGLE(0.06270807981491), + SCALE_SPLIT_ANGLE(0.07093632966280), + SCALE_SPLIT_ANGLE(0.08856786042452), + SCALE_SPLIT_ANGLE(0.10623694956303)}, + {SCALE_SPLIT_ANGLE(0.03821930661798), + SCALE_SPLIT_ANGLE(0.03874678537250), + SCALE_SPLIT_ANGLE(0.03956566005945), + SCALE_SPLIT_ANGLE(0.04171610623598), + SCALE_SPLIT_ANGLE(0.04395710676908), + SCALE_SPLIT_ANGLE(0.04786692932248), + SCALE_SPLIT_ANGLE(0.05546034500003), + SCALE_SPLIT_ANGLE(0.06201593577862)}, + {SCALE_SPLIT_ANGLE(0.02801758050919), + SCALE_SPLIT_ANGLE(0.02828873321414), + SCALE_SPLIT_ANGLE(0.02870770171285), + SCALE_SPLIT_ANGLE(0.02979558333755), + SCALE_SPLIT_ANGLE(0.03090834617615), + SCALE_SPLIT_ANGLE(0.03279331326485), + SCALE_SPLIT_ANGLE(0.03623208031058), + SCALE_SPLIT_ANGLE(0.03895835205913)}, + {SCALE_SPLIT_ANGLE(0.02032180689275), + SCALE_SPLIT_ANGLE(0.02046046219766), + SCALE_SPLIT_ANGLE(0.02067386545241), + SCALE_SPLIT_ANGLE(0.02122297696769), + SCALE_SPLIT_ANGLE(0.02177673391998), + SCALE_SPLIT_ANGLE(0.02269527874887), + SCALE_SPLIT_ANGLE(0.02430364489555), + SCALE_SPLIT_ANGLE(0.02551441825926)}, + {SCALE_SPLIT_ANGLE(0.01172095164657), + SCALE_SPLIT_ANGLE(0.01176583208144), + SCALE_SPLIT_ANGLE(0.01183457672596), + SCALE_SPLIT_ANGLE(0.01200959738344), + SCALE_SPLIT_ANGLE(0.01218330394477), + SCALE_SPLIT_ANGLE(0.01246506255120), + SCALE_SPLIT_ANGLE(0.01293875463307), + SCALE_SPLIT_ANGLE(0.01327861472964)}, + {SCALE_SPLIT_ANGLE(0.00668454170227), + SCALE_SPLIT_ANGLE(0.00669893343002), + SCALE_SPLIT_ANGLE(0.00672091403976), + SCALE_SPLIT_ANGLE(0.00677651492879), + SCALE_SPLIT_ANGLE(0.00683118170127), + SCALE_SPLIT_ANGLE(0.00691874232143), + SCALE_SPLIT_ANGLE(0.00706279883161), + SCALE_SPLIT_ANGLE(0.00716368528083)}, + {SCALE_SPLIT_ANGLE(0.00378863257356), + SCALE_SPLIT_ANGLE(0.00379322143272), + SCALE_SPLIT_ANGLE(0.00380021659657), + SCALE_SPLIT_ANGLE(0.00381784536876), + SCALE_SPLIT_ANGLE(0.00383508414961), + SCALE_SPLIT_ANGLE(0.00386250065640), + SCALE_SPLIT_ANGLE(0.00390707794577), + SCALE_SPLIT_ANGLE(0.00393790053204)}, + {SCALE_SPLIT_ANGLE(0.00213989755139), + SCALE_SPLIT_ANGLE(0.00214135553688), + SCALE_SPLIT_ANGLE(0.00214357557707), + SCALE_SPLIT_ANGLE(0.00214915862307), + SCALE_SPLIT_ANGLE(0.00215460127220), + SCALE_SPLIT_ANGLE(0.00216322275810), + SCALE_SPLIT_ANGLE(0.00217714952305), + SCALE_SPLIT_ANGLE(0.00218671280891)}, + {SCALE_SPLIT_ANGLE(0.00000001210151), + SCALE_SPLIT_ANGLE(0.00000001210151), + SCALE_SPLIT_ANGLE(0.00000001210151), + SCALE_SPLIT_ANGLE(0.00000001210152), + SCALE_SPLIT_ANGLE(0.00000001210152), + SCALE_SPLIT_ANGLE(0.00000001210152), + SCALE_SPLIT_ANGLE(0.00000001210152), + SCALE_SPLIT_ANGLE(0.00000001210152)}, + }, + { + {SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-3.14159226417542), + SCALE_SPLIT_ANGLE(-3.14159226417542), + SCALE_SPLIT_ANGLE(-3.14159226417542), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-0.00000036774148), + SCALE_SPLIT_ANGLE(-0.00000066993488), + SCALE_SPLIT_ANGLE(-0.00001151842844), + SCALE_SPLIT_ANGLE(-3.14159226417542), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-0.00000008554968), + SCALE_SPLIT_ANGLE(-0.00000012210570), + SCALE_SPLIT_ANGLE(-0.00000019699247), + SCALE_SPLIT_ANGLE(-0.00000110842382), + SCALE_SPLIT_ANGLE(-3.14159202575684), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-0.00000003016602), + SCALE_SPLIT_ANGLE(-0.00000005321843), + SCALE_SPLIT_ANGLE(-0.00000008440014), + SCALE_SPLIT_ANGLE(-0.00000020468090), + SCALE_SPLIT_ANGLE(-0.00000071846705), + SCALE_SPLIT_ANGLE(-3.14159226417542), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-0.00000000024720), + SCALE_SPLIT_ANGLE(-0.00000003226497), + SCALE_SPLIT_ANGLE(-0.00000005171609), + SCALE_SPLIT_ANGLE(-0.00000010526998), + SCALE_SPLIT_ANGLE(-0.00000020551137), + SCALE_SPLIT_ANGLE(-1.57079637050629), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-0.00000001688349), + SCALE_SPLIT_ANGLE(-0.00000002741881), + SCALE_SPLIT_ANGLE(-0.00000003926384), + SCALE_SPLIT_ANGLE(-0.00000006928260), + SCALE_SPLIT_ANGLE(-0.00000011240582), + SCALE_SPLIT_ANGLE(-0.00000033763689), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-0.00000002143362), + SCALE_SPLIT_ANGLE(-0.00000002640935), + SCALE_SPLIT_ANGLE(-0.00000003328325), + SCALE_SPLIT_ANGLE(-0.00000005112437), + SCALE_SPLIT_ANGLE(-0.00000007399619), + SCALE_SPLIT_ANGLE(-0.00000014946792), + SCALE_SPLIT_ANGLE(-3.14159226417542), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-0.00000002225921), + SCALE_SPLIT_ANGLE(-0.00000002497380), + SCALE_SPLIT_ANGLE(-0.00000002903169), + SCALE_SPLIT_ANGLE(-0.00000003987020), + SCALE_SPLIT_ANGLE(-0.00000005300816), + SCALE_SPLIT_ANGLE(-0.00000008783893), + SCALE_SPLIT_ANGLE(-0.00000093762065), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-0.00000002109218), + SCALE_SPLIT_ANGLE(-0.00000002269230), + SCALE_SPLIT_ANGLE(-0.00000002515904), + SCALE_SPLIT_ANGLE(-0.00000003183984), + SCALE_SPLIT_ANGLE(-0.00000003965878), + SCALE_SPLIT_ANGLE(-0.00000005782364), + SCALE_SPLIT_ANGLE(-0.00000016152633), + SCALE_SPLIT_ANGLE(-3.14159226417542)}, + {SCALE_SPLIT_ANGLE(-0.00000001895314), + SCALE_SPLIT_ANGLE(-0.00000001993623), + SCALE_SPLIT_ANGLE(-0.00000002146927), + SCALE_SPLIT_ANGLE(-0.00000002563087), + SCALE_SPLIT_ANGLE(-0.00000003036888), + SCALE_SPLIT_ANGLE(-0.00000004043087), + SCALE_SPLIT_ANGLE(-0.00000007667983), + SCALE_SPLIT_ANGLE(-0.00000021028936)}, + {SCALE_SPLIT_ANGLE(-0.00000001519980), + SCALE_SPLIT_ANGLE(-0.00000001569144), + SCALE_SPLIT_ANGLE(-0.00000001646043), + SCALE_SPLIT_ANGLE(-0.00000001853141), + SCALE_SPLIT_ANGLE(-0.00000002080756), + SCALE_SPLIT_ANGLE(-0.00000002521688), + SCALE_SPLIT_ANGLE(-0.00000003656274), + SCALE_SPLIT_ANGLE(-0.00000005247700)}, + {SCALE_SPLIT_ANGLE(-0.00000001166148), + SCALE_SPLIT_ANGLE(-0.00000001191188), + SCALE_SPLIT_ANGLE(-0.00000001230229), + SCALE_SPLIT_ANGLE(-0.00000001334031), + SCALE_SPLIT_ANGLE(-0.00000001444787), + SCALE_SPLIT_ANGLE(-0.00000001646512), + SCALE_SPLIT_ANGLE(-0.00000002081803), + SCALE_SPLIT_ANGLE(-0.00000002523831)}, + {SCALE_SPLIT_ANGLE(-0.00000000870876), + SCALE_SPLIT_ANGLE(-0.00000000883681), + SCALE_SPLIT_ANGLE(-0.00000000903554), + SCALE_SPLIT_ANGLE(-0.00000000955712), + SCALE_SPLIT_ANGLE(-0.00000001010047), + SCALE_SPLIT_ANGLE(-0.00000001104868), + SCALE_SPLIT_ANGLE(-0.00000001289412), + SCALE_SPLIT_ANGLE(-0.00000001449405)}, + {SCALE_SPLIT_ANGLE(-0.00000000639270), + SCALE_SPLIT_ANGLE(-0.00000000645810), + SCALE_SPLIT_ANGLE(-0.00000000655912), + SCALE_SPLIT_ANGLE(-0.00000000682132), + SCALE_SPLIT_ANGLE(-0.00000000708940), + SCALE_SPLIT_ANGLE(-0.00000000754343), + SCALE_SPLIT_ANGLE(-0.00000000837207), + SCALE_SPLIT_ANGLE(-0.00000000902983)}, + {SCALE_SPLIT_ANGLE(-0.00000000463970), + SCALE_SPLIT_ANGLE(-0.00000000467299), + SCALE_SPLIT_ANGLE(-0.00000000472421), + SCALE_SPLIT_ANGLE(-0.00000000485598), + SCALE_SPLIT_ANGLE(-0.00000000498881), + SCALE_SPLIT_ANGLE(-0.00000000520907), + SCALE_SPLIT_ANGLE(-0.00000000559469), + SCALE_SPLIT_ANGLE(-0.00000000588504)}, + {SCALE_SPLIT_ANGLE(-0.00000000267713), + SCALE_SPLIT_ANGLE(-0.00000000268785), + SCALE_SPLIT_ANGLE(-0.00000000270428), + SCALE_SPLIT_ANGLE(-0.00000000274608), + SCALE_SPLIT_ANGLE(-0.00000000278756), + SCALE_SPLIT_ANGLE(-0.00000000285483), + SCALE_SPLIT_ANGLE(-0.00000000296788), + SCALE_SPLIT_ANGLE(-0.00000000304897)}, + {SCALE_SPLIT_ANGLE(-0.00000000152698), + SCALE_SPLIT_ANGLE(-0.00000000153041), + SCALE_SPLIT_ANGLE(-0.00000000153564), + SCALE_SPLIT_ANGLE(-0.00000000154889), + SCALE_SPLIT_ANGLE(-0.00000000156191), + SCALE_SPLIT_ANGLE(-0.00000000158277), + SCALE_SPLIT_ANGLE(-0.00000000161707), + SCALE_SPLIT_ANGLE(-0.00000000164109)}, + {SCALE_SPLIT_ANGLE(-0.00000000086549), + SCALE_SPLIT_ANGLE(-0.00000000086658), + SCALE_SPLIT_ANGLE(-0.00000000086824), + SCALE_SPLIT_ANGLE(-0.00000000087244), + SCALE_SPLIT_ANGLE(-0.00000000087654), + SCALE_SPLIT_ANGLE(-0.00000000088306), + SCALE_SPLIT_ANGLE(-0.00000000089366), + SCALE_SPLIT_ANGLE(-0.00000000090099)}, + {SCALE_SPLIT_ANGLE(-0.00000000048885), + SCALE_SPLIT_ANGLE(-0.00000000048920), + SCALE_SPLIT_ANGLE(-0.00000000048972), + SCALE_SPLIT_ANGLE(-0.00000000049105), + SCALE_SPLIT_ANGLE(-0.00000000049235), + SCALE_SPLIT_ANGLE(-0.00000000049439), + SCALE_SPLIT_ANGLE(-0.00000000049770), + SCALE_SPLIT_ANGLE(-0.00000000049998)}, + {SCALE_SPLIT_ANGLE(-0.00000000000000), + SCALE_SPLIT_ANGLE(-0.00000000000000), + SCALE_SPLIT_ANGLE(-0.00000000000000), + SCALE_SPLIT_ANGLE(-0.00000000000000), + SCALE_SPLIT_ANGLE(-0.00000000000000), + SCALE_SPLIT_ANGLE(-0.00000000000000), + SCALE_SPLIT_ANGLE(-0.00000000000000), + SCALE_SPLIT_ANGLE(-0.00000000000000)}, + }, + { + {SCALE_SPLIT_ANGLE(-2.74889349937439), + SCALE_SPLIT_ANGLE(-2.74889349937439), + SCALE_SPLIT_ANGLE(-2.74889349937439), + SCALE_SPLIT_ANGLE(-2.74889349937439), + SCALE_SPLIT_ANGLE(-2.74889349937439), + SCALE_SPLIT_ANGLE(-2.74889349937439), + SCALE_SPLIT_ANGLE(-2.74889349937439), + SCALE_SPLIT_ANGLE(-2.74889349937439)}, + {SCALE_SPLIT_ANGLE(-2.74670672416687), + SCALE_SPLIT_ANGLE(-2.74670815467834), + SCALE_SPLIT_ANGLE(-2.74671053886414), + SCALE_SPLIT_ANGLE(-2.74671626091003), + SCALE_SPLIT_ANGLE(-2.74672174453735), + SCALE_SPLIT_ANGLE(-2.74673032760620), + SCALE_SPLIT_ANGLE(-2.74674415588379), + SCALE_SPLIT_ANGLE(-2.74675369262695)}, + {SCALE_SPLIT_ANGLE(-2.74495577812195), + SCALE_SPLIT_ANGLE(-2.74496054649353), + SCALE_SPLIT_ANGLE(-2.74496769905090), + SCALE_SPLIT_ANGLE(-2.74498581886292), + SCALE_SPLIT_ANGLE(-2.74500346183777), + SCALE_SPLIT_ANGLE(-2.74503111839294), + SCALE_SPLIT_ANGLE(-2.74507522583008), + SCALE_SPLIT_ANGLE(-2.74510502815247)}, + {SCALE_SPLIT_ANGLE(-2.74173235893250), + SCALE_SPLIT_ANGLE(-2.74174761772156), + SCALE_SPLIT_ANGLE(-2.74177098274231), + SCALE_SPLIT_ANGLE(-2.74182963371277), + SCALE_SPLIT_ANGLE(-2.74188613891602), + SCALE_SPLIT_ANGLE(-2.74197483062744), + SCALE_SPLIT_ANGLE(-2.74211597442627), + SCALE_SPLIT_ANGLE(-2.74221134185791)}, + {SCALE_SPLIT_ANGLE(-2.73563575744629), + SCALE_SPLIT_ANGLE(-2.73568654060364), + SCALE_SPLIT_ANGLE(-2.73576331138611), + SCALE_SPLIT_ANGLE(-2.73595523834229), + SCALE_SPLIT_ANGLE(-2.73614001274109), + SCALE_SPLIT_ANGLE(-2.73642849922180), + SCALE_SPLIT_ANGLE(-2.73688435554504), + SCALE_SPLIT_ANGLE(-2.73719096183777)}, + {SCALE_SPLIT_ANGLE(-2.72353172302246), + SCALE_SPLIT_ANGLE(-2.72370529174805), + SCALE_SPLIT_ANGLE(-2.72396802902222), + SCALE_SPLIT_ANGLE(-2.72461819648743), + SCALE_SPLIT_ANGLE(-2.72523903846741), + SCALE_SPLIT_ANGLE(-2.72619819641113), + SCALE_SPLIT_ANGLE(-2.72769522666931), + SCALE_SPLIT_ANGLE(-2.72869181632996)}, + {SCALE_SPLIT_ANGLE(-2.71044111251831), + SCALE_SPLIT_ANGLE(-2.71081781387329), + SCALE_SPLIT_ANGLE(-2.71138477325439), + SCALE_SPLIT_ANGLE(-2.71277689933777), + SCALE_SPLIT_ANGLE(-2.71409153938293), + SCALE_SPLIT_ANGLE(-2.71610021591187), + SCALE_SPLIT_ANGLE(-2.71919155120850), + SCALE_SPLIT_ANGLE(-2.72123122215271)}, + {SCALE_SPLIT_ANGLE(-2.68862843513489), + SCALE_SPLIT_ANGLE(-2.68948626518250), + SCALE_SPLIT_ANGLE(-2.69076681137085), + SCALE_SPLIT_ANGLE(-2.69386243820190), + SCALE_SPLIT_ANGLE(-2.69673061370850), + SCALE_SPLIT_ANGLE(-2.70102667808533), + SCALE_SPLIT_ANGLE(-2.70749115943909), + SCALE_SPLIT_ANGLE(-2.71170234680176)}, + {SCALE_SPLIT_ANGLE(-2.64932370185852), + SCALE_SPLIT_ANGLE(-2.65145063400269), + SCALE_SPLIT_ANGLE(-2.65457701683044), + SCALE_SPLIT_ANGLE(-2.66191530227661), + SCALE_SPLIT_ANGLE(-2.66847491264343), + SCALE_SPLIT_ANGLE(-2.67795729637146), + SCALE_SPLIT_ANGLE(-2.69169569015503), + SCALE_SPLIT_ANGLE(-2.70048117637634)}, + {SCALE_SPLIT_ANGLE(-2.56864428520203), + SCALE_SPLIT_ANGLE(-2.57483482360840), + SCALE_SPLIT_ANGLE(-2.58364057540894), + SCALE_SPLIT_ANGLE(-2.60311055183411), + SCALE_SPLIT_ANGLE(-2.61933612823486), + SCALE_SPLIT_ANGLE(-2.64129829406738), + SCALE_SPLIT_ANGLE(-2.67107868194580), + SCALE_SPLIT_ANGLE(-2.68960881233215)}, + {SCALE_SPLIT_ANGLE(-2.35773015022278), + SCALE_SPLIT_ANGLE(-2.38251185417175), + SCALE_SPLIT_ANGLE(-2.41520094871521), + SCALE_SPLIT_ANGLE(-2.47876906394959), + SCALE_SPLIT_ANGLE(-2.52468156814575), + SCALE_SPLIT_ANGLE(-2.57956743240356), + SCALE_SPLIT_ANGLE(-2.64563965797424), + SCALE_SPLIT_ANGLE(-2.68501615524292)}, + {SCALE_SPLIT_ANGLE(-1.95455360412598), + SCALE_SPLIT_ANGLE(-2.03550028800964), + SCALE_SPLIT_ANGLE(-2.13431143760681), + SCALE_SPLIT_ANGLE(-2.30167627334595), + SCALE_SPLIT_ANGLE(-2.40472936630249), + SCALE_SPLIT_ANGLE(-2.51241874694824), + SCALE_SPLIT_ANGLE(-2.62649774551392), + SCALE_SPLIT_ANGLE(-2.69151234626770)}, + {SCALE_SPLIT_ANGLE(-1.08639836311340), + SCALE_SPLIT_ANGLE(-1.25607907772064), + SCALE_SPLIT_ANGLE(-1.49360668659210), + SCALE_SPLIT_ANGLE(-1.93062829971313), + SCALE_SPLIT_ANGLE(-2.18087887763977), + SCALE_SPLIT_ANGLE(-2.40583086013794), + SCALE_SPLIT_ANGLE(-2.60574340820313), + SCALE_SPLIT_ANGLE(-2.71224212646484)}, + {SCALE_SPLIT_ANGLE(-0.46298858523369), + SCALE_SPLIT_ANGLE(-0.57069414854050), + SCALE_SPLIT_ANGLE(-0.74941855669022), + SCALE_SPLIT_ANGLE(-1.27059125900269), + SCALE_SPLIT_ANGLE(-1.74987781047821), + SCALE_SPLIT_ANGLE(-2.22410750389099), + SCALE_SPLIT_ANGLE(-2.58140015602112), + SCALE_SPLIT_ANGLE(-2.75301027297974)}, + {SCALE_SPLIT_ANGLE(-0.23063215613365), + SCALE_SPLIT_ANGLE(-0.29689297080040), + SCALE_SPLIT_ANGLE(-0.39820960164070), + SCALE_SPLIT_ANGLE(-0.70773017406464), + SCALE_SPLIT_ANGLE(-1.13546574115753), + SCALE_SPLIT_ANGLE(-1.89722001552582), + SCALE_SPLIT_ANGLE(-2.54544782638550), + SCALE_SPLIT_ANGLE(-2.81490182876587)}, + {SCALE_SPLIT_ANGLE(-0.14590544998646), + SCALE_SPLIT_ANGLE(-0.19153350591660), + SCALE_SPLIT_ANGLE(-0.25519016385078), + SCALE_SPLIT_ANGLE(-0.43163704872131), + SCALE_SPLIT_ANGLE(-0.67776852846146), + SCALE_SPLIT_ANGLE(-1.37444674968719), + SCALE_SPLIT_ANGLE(-2.47591280937195), + SCALE_SPLIT_ANGLE(-2.87223863601685)}, + {SCALE_SPLIT_ANGLE(-0.12191534787416), + SCALE_SPLIT_ANGLE(-0.15053887665272), + SCALE_SPLIT_ANGLE(-0.19072306156158), + SCALE_SPLIT_ANGLE(-0.29725372791290), + SCALE_SPLIT_ANGLE(-0.43550038337708), + SCALE_SPLIT_ANGLE(-0.85167348384857), + SCALE_SPLIT_ANGLE(-2.31663155555725), + SCALE_SPLIT_ANGLE(-2.84442567825317)}, + {SCALE_SPLIT_ANGLE(-0.11467452347279), + SCALE_SPLIT_ANGLE(-0.13146135210991), + SCALE_SPLIT_ANGLE(-0.15620997548103), + SCALE_SPLIT_ANGLE(-0.22212913632393), + SCALE_SPLIT_ANGLE(-0.30330240726471), + SCALE_SPLIT_ANGLE(-0.52478587627411), + SCALE_SPLIT_ANGLE(-1.91173267364502), + SCALE_SPLIT_ANGLE(-2.75908088684082)}, + {SCALE_SPLIT_ANGLE(-0.10720869153738), + SCALE_SPLIT_ANGLE(-0.11720532923937), + SCALE_SPLIT_ANGLE(-0.13246680796146), + SCALE_SPLIT_ANGLE(-0.17369446158409), + SCALE_SPLIT_ANGLE(-0.22279061377048), + SCALE_SPLIT_ANGLE(-0.34306260943413), + SCALE_SPLIT_ANGLE(-1.11311769485474), + SCALE_SPLIT_ANGLE(-2.55312228202820)}, + {SCALE_SPLIT_ANGLE(-0.09705755859613), + SCALE_SPLIT_ANGLE(-0.10320188105106), + SCALE_SPLIT_ANGLE(-0.11274836212397), + SCALE_SPLIT_ANGLE(-0.13873104751110), + SCALE_SPLIT_ANGLE(-0.16888950765133), + SCALE_SPLIT_ANGLE(-0.23647469282150), + SCALE_SPLIT_ANGLE(-0.53898400068283), + SCALE_SPLIT_ANGLE(-1.80699026584625)}, + {SCALE_SPLIT_ANGLE(-0.08528345078230), + SCALE_SPLIT_ANGLE(-0.08915078639984), + SCALE_SPLIT_ANGLE(-0.09520187228918), + SCALE_SPLIT_ANGLE(-0.11166743934155), + SCALE_SPLIT_ANGLE(-0.13034182786942), + SCALE_SPLIT_ANGLE(-0.16932602226734), + SCALE_SPLIT_ANGLE(-0.29887464642525), + SCALE_SPLIT_ANGLE(-0.63077670335770)}, + {SCALE_SPLIT_ANGLE(-0.06733842939138), + SCALE_SPLIT_ANGLE(-0.06931615620852), + SCALE_SPLIT_ANGLE(-0.07241339236498), + SCALE_SPLIT_ANGLE(-0.08076415956020), + SCALE_SPLIT_ANGLE(-0.08993339538574), + SCALE_SPLIT_ANGLE(-0.10759532451630), + SCALE_SPLIT_ANGLE(-0.15204635262489), + SCALE_SPLIT_ANGLE(-0.21143136918545)}, + {SCALE_SPLIT_ANGLE(-0.05132640153170), + SCALE_SPLIT_ANGLE(-0.05234802141786), + SCALE_SPLIT_ANGLE(-0.05394186824560), + SCALE_SPLIT_ANGLE(-0.05818276479840), + SCALE_SPLIT_ANGLE(-0.06270807236433), + SCALE_SPLIT_ANGLE(-0.07093632221222), + SCALE_SPLIT_ANGLE(-0.08856784552336), + SCALE_SPLIT_ANGLE(-0.10623692721128)}, + {SCALE_SPLIT_ANGLE(-0.03821930289268), + SCALE_SPLIT_ANGLE(-0.03874678164721), + SCALE_SPLIT_ANGLE(-0.03956565260887), + SCALE_SPLIT_ANGLE(-0.04171609878540), + SCALE_SPLIT_ANGLE(-0.04395709931850), + SCALE_SPLIT_ANGLE(-0.04786692187190), + SCALE_SPLIT_ANGLE(-0.05546033382416), + SCALE_SPLIT_ANGLE(-0.06201592460275)}, + {SCALE_SPLIT_ANGLE(-0.02801757678390), + SCALE_SPLIT_ANGLE(-0.02828872948885), + SCALE_SPLIT_ANGLE(-0.02870769798756), + SCALE_SPLIT_ANGLE(-0.02979557774961), + SCALE_SPLIT_ANGLE(-0.03090834245086), + SCALE_SPLIT_ANGLE(-0.03279330953956), + SCALE_SPLIT_ANGLE(-0.03623207286000), + SCALE_SPLIT_ANGLE(-0.03895834833384)}, + {SCALE_SPLIT_ANGLE(-0.02032180316746), + SCALE_SPLIT_ANGLE(-0.02046045847237), + SCALE_SPLIT_ANGLE(-0.02067386172712), + SCALE_SPLIT_ANGLE(-0.02122297324240), + SCALE_SPLIT_ANGLE(-0.02177673205733), + SCALE_SPLIT_ANGLE(-0.02269527502358), + SCALE_SPLIT_ANGLE(-0.02430364117026), + SCALE_SPLIT_ANGLE(-0.02551441267133)}, + {SCALE_SPLIT_ANGLE(-0.01172094978392), + SCALE_SPLIT_ANGLE(-0.01176583021879), + SCALE_SPLIT_ANGLE(-0.01183457486331), + SCALE_SPLIT_ANGLE(-0.01200959552079), + SCALE_SPLIT_ANGLE(-0.01218330208212), + SCALE_SPLIT_ANGLE(-0.01246506068856), + SCALE_SPLIT_ANGLE(-0.01293875277042), + SCALE_SPLIT_ANGLE(-0.01327861286700)}, + {SCALE_SPLIT_ANGLE(-0.00668454030529), + SCALE_SPLIT_ANGLE(-0.00669893249869), + SCALE_SPLIT_ANGLE(-0.00672091310844), + SCALE_SPLIT_ANGLE(-0.00677651399747), + SCALE_SPLIT_ANGLE(-0.00683118030429), + SCALE_SPLIT_ANGLE(-0.00691874139011), + SCALE_SPLIT_ANGLE(-0.00706279790029), + SCALE_SPLIT_ANGLE(-0.00716368434951)}, + {SCALE_SPLIT_ANGLE(-0.00378863210790), + SCALE_SPLIT_ANGLE(-0.00379322096705), + SCALE_SPLIT_ANGLE(-0.00380021613091), + SCALE_SPLIT_ANGLE(-0.00381784490310), + SCALE_SPLIT_ANGLE(-0.00383508345112), + SCALE_SPLIT_ANGLE(-0.00386250019073), + SCALE_SPLIT_ANGLE(-0.00390707701445), + SCALE_SPLIT_ANGLE(-0.00393790006638)}, + {SCALE_SPLIT_ANGLE(-0.00213989731856), + SCALE_SPLIT_ANGLE(-0.00214135507122), + SCALE_SPLIT_ANGLE(-0.00214357534423), + SCALE_SPLIT_ANGLE(-0.00214915839024), + SCALE_SPLIT_ANGLE(-0.00215460080653), + SCALE_SPLIT_ANGLE(-0.00216322229244), + SCALE_SPLIT_ANGLE(-0.00217714929022), + SCALE_SPLIT_ANGLE(-0.00218671257608)}, + {SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151)}, + }, + { + {SCALE_SPLIT_ANGLE(-2.35619449615479), + SCALE_SPLIT_ANGLE(-2.35619449615479), + SCALE_SPLIT_ANGLE(-2.35619449615479), + SCALE_SPLIT_ANGLE(-2.35619449615479), + SCALE_SPLIT_ANGLE(-2.35619449615479), + SCALE_SPLIT_ANGLE(-2.35619449615479), + SCALE_SPLIT_ANGLE(-2.35619449615479), + SCALE_SPLIT_ANGLE(-2.35619449615479)}, + {SCALE_SPLIT_ANGLE(-2.35216379165649), + SCALE_SPLIT_ANGLE(-2.35216617584229), + SCALE_SPLIT_ANGLE(-2.35216999053955), + SCALE_SPLIT_ANGLE(-2.35217928886414), + SCALE_SPLIT_ANGLE(-2.35218811035156), + SCALE_SPLIT_ANGLE(-2.35220241546631), + SCALE_SPLIT_ANGLE(-2.35222506523132), + SCALE_SPLIT_ANGLE(-2.35224032402039)}, + {SCALE_SPLIT_ANGLE(-2.34895062446594), + SCALE_SPLIT_ANGLE(-2.34895849227905), + SCALE_SPLIT_ANGLE(-2.34897017478943), + SCALE_SPLIT_ANGLE(-2.34899973869324), + SCALE_SPLIT_ANGLE(-2.34902834892273), + SCALE_SPLIT_ANGLE(-2.34907317161560), + SCALE_SPLIT_ANGLE(-2.34914541244507), + SCALE_SPLIT_ANGLE(-2.34919428825378)}, + {SCALE_SPLIT_ANGLE(-2.34306836128235), + SCALE_SPLIT_ANGLE(-2.34309315681458), + SCALE_SPLIT_ANGLE(-2.34313082695007), + SCALE_SPLIT_ANGLE(-2.34322524070740), + SCALE_SPLIT_ANGLE(-2.34331679344177), + SCALE_SPLIT_ANGLE(-2.34346079826355), + SCALE_SPLIT_ANGLE(-2.34369087219238), + SCALE_SPLIT_ANGLE(-2.34384727478027)}, + {SCALE_SPLIT_ANGLE(-2.33205747604370), + SCALE_SPLIT_ANGLE(-2.33213782310486), + SCALE_SPLIT_ANGLE(-2.33226013183594), + SCALE_SPLIT_ANGLE(-2.33256602287292), + SCALE_SPLIT_ANGLE(-2.33286190032959), + SCALE_SPLIT_ANGLE(-2.33332633972168), + SCALE_SPLIT_ANGLE(-2.33406710624695), + SCALE_SPLIT_ANGLE(-2.33456921577454)}, + {SCALE_SPLIT_ANGLE(-2.31062936782837), + SCALE_SPLIT_ANGLE(-2.31089687347412), + SCALE_SPLIT_ANGLE(-2.31130218505859), + SCALE_SPLIT_ANGLE(-2.31231284141541), + SCALE_SPLIT_ANGLE(-2.31328654289246), + SCALE_SPLIT_ANGLE(-2.31480813026428), + SCALE_SPLIT_ANGLE(-2.31722092628479), + SCALE_SPLIT_ANGLE(-2.31885290145874)}, + {SCALE_SPLIT_ANGLE(-2.28808355331421), + SCALE_SPLIT_ANGLE(-2.28864479064941), + SCALE_SPLIT_ANGLE(-2.28949403762817), + SCALE_SPLIT_ANGLE(-2.29160070419312), + SCALE_SPLIT_ANGLE(-2.29361891746521), + SCALE_SPLIT_ANGLE(-2.29675459861755), + SCALE_SPLIT_ANGLE(-2.30169844627380), + SCALE_SPLIT_ANGLE(-2.30503511428833)}, + {SCALE_SPLIT_ANGLE(-2.25191521644592), + SCALE_SPLIT_ANGLE(-2.25312590599060), + SCALE_SPLIT_ANGLE(-2.25494933128357), + SCALE_SPLIT_ANGLE(-2.25943517684937), + SCALE_SPLIT_ANGLE(-2.26368904113770), + SCALE_SPLIT_ANGLE(-2.27023124694824), + SCALE_SPLIT_ANGLE(-2.28044486045837), + SCALE_SPLIT_ANGLE(-2.28732323646545)}, + {SCALE_SPLIT_ANGLE(-2.19093608856201), + SCALE_SPLIT_ANGLE(-2.19366121292114), + SCALE_SPLIT_ANGLE(-2.19773292541504), + SCALE_SPLIT_ANGLE(-2.20759749412537), + SCALE_SPLIT_ANGLE(-2.21677803993225), + SCALE_SPLIT_ANGLE(-2.23064494132996), + SCALE_SPLIT_ANGLE(-2.25193929672241), + SCALE_SPLIT_ANGLE(-2.26625943183899)}, + {SCALE_SPLIT_ANGLE(-2.08102917671204), + SCALE_SPLIT_ANGLE(-2.08757305145264), + SCALE_SPLIT_ANGLE(-2.09720730781555), + SCALE_SPLIT_ANGLE(-2.11991167068481), + SCALE_SPLIT_ANGLE(-2.14035677909851), + SCALE_SPLIT_ANGLE(-2.17029237747192), + SCALE_SPLIT_ANGLE(-2.21503162384033), + SCALE_SPLIT_ANGLE(-2.24518132209778)}, + {SCALE_SPLIT_ANGLE(-1.86738622188568), + SCALE_SPLIT_ANGLE(-1.88426077365875), + SCALE_SPLIT_ANGLE(-1.90853285789490), + SCALE_SPLIT_ANGLE(-1.96333336830139), + SCALE_SPLIT_ANGLE(-2.01024460792542), + SCALE_SPLIT_ANGLE(-2.07577633857727), + SCALE_SPLIT_ANGLE(-2.16986608505249), + SCALE_SPLIT_ANGLE(-2.23406052589417)}, + {SCALE_SPLIT_ANGLE(-1.61812186241150), + SCALE_SPLIT_ANGLE(-1.64943766593933), + SCALE_SPLIT_ANGLE(-1.69389247894287), + SCALE_SPLIT_ANGLE(-1.79176032543182), + SCALE_SPLIT_ANGLE(-1.87292504310608), + SCALE_SPLIT_ANGLE(-1.98277997970581), + SCALE_SPLIT_ANGLE(-2.13605833053589), + SCALE_SPLIT_ANGLE(-2.24282979965210)}, + {SCALE_SPLIT_ANGLE(-1.26556181907654), + SCALE_SPLIT_ANGLE(-1.31512010097504), + SCALE_SPLIT_ANGLE(-1.38608694076538), + SCALE_SPLIT_ANGLE(-1.54419946670532), + SCALE_SPLIT_ANGLE(-1.67621028423309), + SCALE_SPLIT_ANGLE(-1.85417354106903), + SCALE_SPLIT_ANGLE(-2.09956336021423), + SCALE_SPLIT_ANGLE(-2.27729439735413)}, + {SCALE_SPLIT_ANGLE(-0.88984858989716), + SCALE_SPLIT_ANGLE(-0.94673115015030), + SCALE_SPLIT_ANGLE(-1.03102219104767), + SCALE_SPLIT_ANGLE(-1.23219704627991), + SCALE_SPLIT_ANGLE(-1.41468596458435), + SCALE_SPLIT_ANGLE(-1.67807447910309), + SCALE_SPLIT_ANGLE(-2.05749273300171), + SCALE_SPLIT_ANGLE(-2.35138511657715)}, + {SCALE_SPLIT_ANGLE(-0.60630625486374), + SCALE_SPLIT_ANGLE(-0.65551131963730), + SCALE_SPLIT_ANGLE(-0.73032110929489), + SCALE_SPLIT_ANGLE(-0.92225730419159), + SCALE_SPLIT_ANGLE(-1.11866605281830), + SCALE_SPLIT_ANGLE(-1.44806659221649), + SCALE_SPLIT_ANGLE(-1.99872648715973), + SCALE_SPLIT_ANGLE(-2.47302079200745)}, + {SCALE_SPLIT_ANGLE(-0.43393719196320), + SCALE_SPLIT_ANGLE(-0.47099208831787), + SCALE_SPLIT_ANGLE(-0.52780753374100), + SCALE_SPLIT_ANGLE(-0.67895972728729), + SCALE_SPLIT_ANGLE(-0.84712409973145), + SCALE_SPLIT_ANGLE(-1.17809724807739), + SCALE_SPLIT_ANGLE(-1.89703977108002), + SCALE_SPLIT_ANGLE(-2.59155678749084)}, + {SCALE_SPLIT_ANGLE(-0.33522716164589), + SCALE_SPLIT_ANGLE(-0.36133098602295), + SCALE_SPLIT_ANGLE(-0.40159514546394), + SCALE_SPLIT_ANGLE(-0.51039946079254), + SCALE_SPLIT_ANGLE(-0.63590413331985), + SCALE_SPLIT_ANGLE(-0.90812796354294), + SCALE_SPLIT_ANGLE(-1.70793569087982), + SCALE_SPLIT_ANGLE(-2.52852439880371)}, + {SCALE_SPLIT_ANGLE(-0.27478921413422), + SCALE_SPLIT_ANGLE(-0.29251146316528), + SCALE_SPLIT_ANGLE(-0.32007753849030), + SCALE_SPLIT_ANGLE(-0.39531296491623), + SCALE_SPLIT_ANGLE(-0.48291319608688), + SCALE_SPLIT_ANGLE(-0.67812001705170), + SCALE_SPLIT_ANGLE(-1.39007341861725), + SCALE_SPLIT_ANGLE(-2.34402585029602)}, + {SCALE_SPLIT_ANGLE(-0.23185737431049), + SCALE_SPLIT_ANGLE(-0.24370788037777), + SCALE_SPLIT_ANGLE(-0.26227977871895), + SCALE_SPLIT_ANGLE(-0.31327378749847), + SCALE_SPLIT_ANGLE(-0.37241828441620), + SCALE_SPLIT_ANGLE(-0.50202107429504), + SCALE_SPLIT_ANGLE(-0.99085599184036), + SCALE_SPLIT_ANGLE(-1.96553480625153)}, + {SCALE_SPLIT_ANGLE(-0.19698302447796), + SCALE_SPLIT_ANGLE(-0.20488265156746), + SCALE_SPLIT_ANGLE(-0.21731522679329), + SCALE_SPLIT_ANGLE(-0.25148209929466), + SCALE_SPLIT_ANGLE(-0.29065513610840), + SCALE_SPLIT_ANGLE(-0.37341463565826), + SCALE_SPLIT_ANGLE(-0.65295964479446), + SCALE_SPLIT_ANGLE(-1.28865838050842)}, + {SCALE_SPLIT_ANGLE(-0.16667704284191), + SCALE_SPLIT_ANGLE(-0.17194209992886), + SCALE_SPLIT_ANGLE(-0.18023575842381), + SCALE_SPLIT_ANGLE(-0.20293866097927), + SCALE_SPLIT_ANGLE(-0.22855132818222), + SCALE_SPLIT_ANGLE(-0.28041815757751), + SCALE_SPLIT_ANGLE(-0.43142417073250), + SCALE_SPLIT_ANGLE(-0.70030152797699)}, + {SCALE_SPLIT_ANGLE(-0.12773875892162), + SCALE_SPLIT_ANGLE(-0.13059368729591), + SCALE_SPLIT_ANGLE(-0.13507817685604), + SCALE_SPLIT_ANGLE(-0.14721076190472), + SCALE_SPLIT_ANGLE(-0.16052411496639), + SCALE_SPLIT_ANGLE(-0.18590225279331), + SCALE_SPLIT_ANGLE(-0.24703903496265), + SCALE_SPLIT_ANGLE(-0.32153329253197)}, + {SCALE_SPLIT_ANGLE(-0.09603262692690), + SCALE_SPLIT_ANGLE(-0.09756571799517), + SCALE_SPLIT_ANGLE(-0.09996144473553), + SCALE_SPLIT_ANGLE(-0.10635072737932), + SCALE_SPLIT_ANGLE(-0.11317525804043), + SCALE_SPLIT_ANGLE(-0.12554959952831), + SCALE_SPLIT_ANGLE(-0.15168417990208), + SCALE_SPLIT_ANGLE(-0.17713625729084)}, + {SCALE_SPLIT_ANGLE(-0.07104730606079), + SCALE_SPLIT_ANGLE(-0.07186015695333), + SCALE_SPLIT_ANGLE(-0.07312334328890), + SCALE_SPLIT_ANGLE(-0.07644615322351), + SCALE_SPLIT_ANGLE(-0.07991369068623), + SCALE_SPLIT_ANGLE(-0.08596337586641), + SCALE_SPLIT_ANGLE(-0.09766443073750), + SCALE_SPLIT_ANGLE(-0.10767272859812)}, + {SCALE_SPLIT_ANGLE(-0.05192205309868), + SCALE_SPLIT_ANGLE(-0.05234766378999), + SCALE_SPLIT_ANGLE(-0.05300575867295), + SCALE_SPLIT_ANGLE(-0.05471667274833), + SCALE_SPLIT_ANGLE(-0.05646898224950), + SCALE_SPLIT_ANGLE(-0.05943990871310), + SCALE_SPLIT_ANGLE(-0.06485753506422), + SCALE_SPLIT_ANGLE(-0.06914159655571)}, + {SCALE_SPLIT_ANGLE(-0.03760398924351), + SCALE_SPLIT_ANGLE(-0.03782445192337), + SCALE_SPLIT_ANGLE(-0.03816392645240), + SCALE_SPLIT_ANGLE(-0.03903824090958), + SCALE_SPLIT_ANGLE(-0.03992090001702), + SCALE_SPLIT_ANGLE(-0.04138650000095), + SCALE_SPLIT_ANGLE(-0.04395476356149), + SCALE_SPLIT_ANGLE(-0.04588782414794)}, + {SCALE_SPLIT_ANGLE(-0.02166714519262), + SCALE_SPLIT_ANGLE(-0.02173947915435), + SCALE_SPLIT_ANGLE(-0.02185030654073), + SCALE_SPLIT_ANGLE(-0.02213260345161), + SCALE_SPLIT_ANGLE(-0.02241297997534), + SCALE_SPLIT_ANGLE(-0.02286812663078), + SCALE_SPLIT_ANGLE(-0.02363408729434), + SCALE_SPLIT_ANGLE(-0.02418405003846)}, + {SCALE_SPLIT_ANGLE(-0.01235313713551), + SCALE_SPLIT_ANGLE(-0.01237650867552), + SCALE_SPLIT_ANGLE(-0.01241220720112), + SCALE_SPLIT_ANGLE(-0.01250253617764), + SCALE_SPLIT_ANGLE(-0.01259138714522), + SCALE_SPLIT_ANGLE(-0.01273377239704), + SCALE_SPLIT_ANGLE(-0.01296819653362), + SCALE_SPLIT_ANGLE(-0.01313247904181)}, + {SCALE_SPLIT_ANGLE(-0.00700078438967), + SCALE_SPLIT_ANGLE(-0.00700826710090), + SCALE_SPLIT_ANGLE(-0.00701967626810), + SCALE_SPLIT_ANGLE(-0.00704843178391), + SCALE_SPLIT_ANGLE(-0.00707655726001), + SCALE_SPLIT_ANGLE(-0.00712130265310), + SCALE_SPLIT_ANGLE(-0.00719408923760), + SCALE_SPLIT_ANGLE(-0.00724443932995)}, + {SCALE_SPLIT_ANGLE(-0.00395406875759), + SCALE_SPLIT_ANGLE(-0.00395645154640), + SCALE_SPLIT_ANGLE(-0.00396008091047), + SCALE_SPLIT_ANGLE(-0.00396920833737), + SCALE_SPLIT_ANGLE(-0.00397810759023), + SCALE_SPLIT_ANGLE(-0.00399220641702), + SCALE_SPLIT_ANGLE(-0.00401498842984), + SCALE_SPLIT_ANGLE(-0.00403063651174)}, + {SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068)}, + }, + { + {SCALE_SPLIT_ANGLE(-1.96349549293518), + SCALE_SPLIT_ANGLE(-1.96349549293518), + SCALE_SPLIT_ANGLE(-1.96349549293518), + SCALE_SPLIT_ANGLE(-1.96349549293518), + SCALE_SPLIT_ANGLE(-1.96349549293518), + SCALE_SPLIT_ANGLE(-1.96349549293518), + SCALE_SPLIT_ANGLE(-1.96349549293518), + SCALE_SPLIT_ANGLE(-1.96349549293518)}, + {SCALE_SPLIT_ANGLE(-1.95824849605560), + SCALE_SPLIT_ANGLE(-1.95825111865997), + SCALE_SPLIT_ANGLE(-1.95825493335724), + SCALE_SPLIT_ANGLE(-1.95826470851898), + SCALE_SPLIT_ANGLE(-1.95827412605286), + SCALE_SPLIT_ANGLE(-1.95828902721405), + SCALE_SPLIT_ANGLE(-1.95831298828125), + SCALE_SPLIT_ANGLE(-1.95832931995392)}, + {SCALE_SPLIT_ANGLE(-1.95409321784973), + SCALE_SPLIT_ANGLE(-1.95410120487213), + SCALE_SPLIT_ANGLE(-1.95411348342896), + SCALE_SPLIT_ANGLE(-1.95414435863495), + SCALE_SPLIT_ANGLE(-1.95417428016663), + SCALE_SPLIT_ANGLE(-1.95422148704529), + SCALE_SPLIT_ANGLE(-1.95429742336273), + SCALE_SPLIT_ANGLE(-1.95434927940369)}, + {SCALE_SPLIT_ANGLE(-1.94654786586761), + SCALE_SPLIT_ANGLE(-1.94657349586487), + SCALE_SPLIT_ANGLE(-1.94661235809326), + SCALE_SPLIT_ANGLE(-1.94671010971069), + SCALE_SPLIT_ANGLE(-1.94680511951447), + SCALE_SPLIT_ANGLE(-1.94695532321930), + SCALE_SPLIT_ANGLE(-1.94719707965851), + SCALE_SPLIT_ANGLE(-1.94736242294312)}, + {SCALE_SPLIT_ANGLE(-1.93263387680054), + SCALE_SPLIT_ANGLE(-1.93271505832672), + SCALE_SPLIT_ANGLE(-1.93283867835999), + SCALE_SPLIT_ANGLE(-1.93314921855927), + SCALE_SPLIT_ANGLE(-1.93345177173615), + SCALE_SPLIT_ANGLE(-1.93393063545227), + SCALE_SPLIT_ANGLE(-1.93470406532288), + SCALE_SPLIT_ANGLE(-1.93523526191711)}, + {SCALE_SPLIT_ANGLE(-1.90630447864532), + SCALE_SPLIT_ANGLE(-1.90656316280365), + SCALE_SPLIT_ANGLE(-1.90695703029633), + SCALE_SPLIT_ANGLE(-1.90794789791107), + SCALE_SPLIT_ANGLE(-1.90891468524933), + SCALE_SPLIT_ANGLE(-1.91044914722443), + SCALE_SPLIT_ANGLE(-1.91294133663177), + SCALE_SPLIT_ANGLE(-1.91466677188873)}, + {SCALE_SPLIT_ANGLE(-1.87960767745972), + SCALE_SPLIT_ANGLE(-1.88012754917145), + SCALE_SPLIT_ANGLE(-1.88091945648193), + SCALE_SPLIT_ANGLE(-1.88291203975677), + SCALE_SPLIT_ANGLE(-1.88485789299011), + SCALE_SPLIT_ANGLE(-1.88795256614685), + SCALE_SPLIT_ANGLE(-1.89300417900085), + SCALE_SPLIT_ANGLE(-1.89653015136719)}, + {SCALE_SPLIT_ANGLE(-1.83877408504486), + SCALE_SPLIT_ANGLE(-1.83982253074646), + SCALE_SPLIT_ANGLE(-1.84141874313354), + SCALE_SPLIT_ANGLE(-1.84543371200562), + SCALE_SPLIT_ANGLE(-1.84935557842255), + SCALE_SPLIT_ANGLE(-1.85560452938080), + SCALE_SPLIT_ANGLE(-1.86587750911713), + SCALE_SPLIT_ANGLE(-1.87314093112946)}, + {SCALE_SPLIT_ANGLE(-1.77493441104889), + SCALE_SPLIT_ANGLE(-1.77705287933350), + SCALE_SPLIT_ANGLE(-1.78027486801147), + SCALE_SPLIT_ANGLE(-1.78836560249329), + SCALE_SPLIT_ANGLE(-1.79626119136810), + SCALE_SPLIT_ANGLE(-1.80886065959930), + SCALE_SPLIT_ANGLE(-1.82978057861328), + SCALE_SPLIT_ANGLE(-1.84489572048187)}, + {SCALE_SPLIT_ANGLE(-1.67321836948395), + SCALE_SPLIT_ANGLE(-1.67747676372528), + SCALE_SPLIT_ANGLE(-1.68394041061401), + SCALE_SPLIT_ANGLE(-1.70011758804321), + SCALE_SPLIT_ANGLE(-1.71586525440216), + SCALE_SPLIT_ANGLE(-1.74102890491486), + SCALE_SPLIT_ANGLE(-1.78345453739166), + SCALE_SPLIT_ANGLE(-1.81531310081482)}, + {SCALE_SPLIT_ANGLE(-1.51132130622864), + SCALE_SPLIT_ANGLE(-1.51959407329559), + SCALE_SPLIT_ANGLE(-1.53212583065033), + SCALE_SPLIT_ANGLE(-1.56339812278748), + SCALE_SPLIT_ANGLE(-1.59380078315735), + SCALE_SPLIT_ANGLE(-1.64260387420654), + SCALE_SPLIT_ANGLE(-1.72719144821167), + SCALE_SPLIT_ANGLE(-1.79549288749695)}, + {SCALE_SPLIT_ANGLE(-1.35904073715210), + SCALE_SPLIT_ANGLE(-1.37121629714966), + SCALE_SPLIT_ANGLE(-1.38967263698578), + SCALE_SPLIT_ANGLE(-1.43583405017853), + SCALE_SPLIT_ANGLE(-1.48093712329865), + SCALE_SPLIT_ANGLE(-1.55410349369049), + SCALE_SPLIT_ANGLE(-1.68521809577942), + SCALE_SPLIT_ANGLE(-1.80024909973145)}, + {SCALE_SPLIT_ANGLE(-1.17258918285370), + SCALE_SPLIT_ANGLE(-1.18893885612488), + SCALE_SPLIT_ANGLE(-1.21383893489838), + SCALE_SPLIT_ANGLE(-1.27678334712982), + SCALE_SPLIT_ANGLE(-1.33930444717407), + SCALE_SPLIT_ANGLE(-1.44322550296783), + SCALE_SPLIT_ANGLE(-1.64006841182709), + SCALE_SPLIT_ANGLE(-1.83627629280090)}, + {SCALE_SPLIT_ANGLE(-0.96933782100677), + SCALE_SPLIT_ANGLE(-0.98854482173920), + SCALE_SPLIT_ANGLE(-1.01807177066803), + SCALE_SPLIT_ANGLE(-1.09429979324341), + SCALE_SPLIT_ANGLE(-1.17245376110077), + SCALE_SPLIT_ANGLE(-1.30826890468597), + SCALE_SPLIT_ANGLE(-1.58911192417145), + SCALE_SPLIT_ANGLE(-1.92719459533691)}, + {SCALE_SPLIT_ANGLE(-0.77729856967926), + SCALE_SPLIT_ANGLE(-0.79675692319870), + SCALE_SPLIT_ANGLE(-0.82701623439789), + SCALE_SPLIT_ANGLE(-0.90724974870682), + SCALE_SPLIT_ANGLE(-0.99302661418915), + SCALE_SPLIT_ANGLE(-1.15164005756378), + SCALE_SPLIT_ANGLE(-1.52265238761902), + SCALE_SPLIT_ANGLE(-2.09869647026062)}, + {SCALE_SPLIT_ANGLE(-0.61765122413635), + SCALE_SPLIT_ANGLE(-0.63503879308701), + SCALE_SPLIT_ANGLE(-0.66235071420670), + SCALE_SPLIT_ANGLE(-0.73653644323349), + SCALE_SPLIT_ANGLE(-0.81904625892639), + SCALE_SPLIT_ANGLE(-0.98174780607224), + SCALE_SPLIT_ANGLE(-1.42110574245453), + SCALE_SPLIT_ANGLE(-2.28386068344116)}, + {SCALE_SPLIT_ANGLE(-0.49486327171326), + SCALE_SPLIT_ANGLE(-0.50909572839737), + SCALE_SPLIT_ANGLE(-0.53160977363586), + SCALE_SPLIT_ANGLE(-0.59379214048386), + SCALE_SPLIT_ANGLE(-0.66487479209900), + SCALE_SPLIT_ANGLE(-0.81185555458069), + SCALE_SPLIT_ANGLE(-1.26233398914337), + SCALE_SPLIT_ANGLE(-2.16925764083862)}, + {SCALE_SPLIT_ANGLE(-0.40230554342270), + SCALE_SPLIT_ANGLE(-0.41332268714905), + SCALE_SPLIT_ANGLE(-0.43082219362259), + SCALE_SPLIT_ANGLE(-0.47957947850227), + SCALE_SPLIT_ANGLE(-0.53603595495224), + SCALE_SPLIT_ANGLE(-0.65522664785385), + SCALE_SPLIT_ANGLE(-1.04503870010376), + SCALE_SPLIT_ANGLE(-1.87041819095612)}, + {SCALE_SPLIT_ANGLE(-0.33104604482651), + SCALE_SPLIT_ANGLE(-0.33927723765373), + SCALE_SPLIT_ANGLE(-0.35237133502960), + SCALE_SPLIT_ANGLE(-0.38892474770546), + SCALE_SPLIT_ANGLE(-0.43126162886620), + SCALE_SPLIT_ANGLE(-0.52027010917664), + SCALE_SPLIT_ANGLE(-0.80654197931290), + SCALE_SPLIT_ANGLE(-1.41960346698761)}, + {SCALE_SPLIT_ANGLE(-0.27415531873703), + SCALE_SPLIT_ANGLE(-0.28015667200089), + SCALE_SPLIT_ANGLE(-0.28969678282738), + SCALE_SPLIT_ANGLE(-0.31623727083206), + SCALE_SPLIT_ANGLE(-0.34670370817184), + SCALE_SPLIT_ANGLE(-0.40939208865166), + SCALE_SPLIT_ANGLE(-0.59604328870773), + SCALE_SPLIT_ANGLE(-0.94309812784195)}, + {SCALE_SPLIT_ANGLE(-0.22730343043804), + SCALE_SPLIT_ANGLE(-0.23159568011761), + SCALE_SPLIT_ANGLE(-0.23840220272541), + SCALE_SPLIT_ANGLE(-0.25720024108887), + SCALE_SPLIT_ANGLE(-0.27846288681030), + SCALE_SPLIT_ANGLE(-0.32089167833328), + SCALE_SPLIT_ANGLE(-0.43515858054161), + SCALE_SPLIT_ANGLE(-0.60622000694275)}, + {SCALE_SPLIT_ANGLE(-0.17074464261532), + SCALE_SPLIT_ANGLE(-0.17326098680496), + SCALE_SPLIT_ANGLE(-0.17722851037979), + SCALE_SPLIT_ANGLE(-0.18802368640900), + SCALE_SPLIT_ANGLE(-0.19990929961205), + SCALE_SPLIT_ANGLE(-0.22246663272381), + SCALE_SPLIT_ANGLE(-0.27514943480492), + SCALE_SPLIT_ANGLE(-0.33505329489708)}, + {SCALE_SPLIT_ANGLE(-0.12695816159248), + SCALE_SPLIT_ANGLE(-0.12838459014893), + SCALE_SPLIT_ANGLE(-0.13061878085136), + SCALE_SPLIT_ANGLE(-0.13660037517548), + SCALE_SPLIT_ANGLE(-0.14301039278507), + SCALE_SPLIT_ANGLE(-0.15463486313820), + SCALE_SPLIT_ANGLE(-0.17893928289413), + SCALE_SPLIT_ANGLE(-0.20203559100628)}, + {SCALE_SPLIT_ANGLE(-0.09338590502739), + SCALE_SPLIT_ANGLE(-0.09417138248682), + SCALE_SPLIT_ANGLE(-0.09539389610291), + SCALE_SPLIT_ANGLE(-0.09861853718758), + SCALE_SPLIT_ANGLE(-0.10199318081141), + SCALE_SPLIT_ANGLE(-0.10789106041193), + SCALE_SPLIT_ANGLE(-0.11927829682827), + SCALE_SPLIT_ANGLE(-0.12894384562969)}, + {SCALE_SPLIT_ANGLE(-0.06804534792900), + SCALE_SPLIT_ANGLE(-0.06846774369478), + SCALE_SPLIT_ANGLE(-0.06912153959274), + SCALE_SPLIT_ANGLE(-0.07082460820675), + SCALE_SPLIT_ANGLE(-0.07257289439440), + SCALE_SPLIT_ANGLE(-0.07554303109646), + SCALE_SPLIT_ANGLE(-0.08096560835838), + SCALE_SPLIT_ANGLE(-0.08524779230356)}, + {SCALE_SPLIT_ANGLE(-0.04920703917742), + SCALE_SPLIT_ANGLE(-0.04942998290062), + SCALE_SPLIT_ANGLE(-0.04977353662252), + SCALE_SPLIT_ANGLE(-0.05065960064530), + SCALE_SPLIT_ANGLE(-0.05155571177602), + SCALE_SPLIT_ANGLE(-0.05304637178779), + SCALE_SPLIT_ANGLE(-0.05566369369626), + SCALE_SPLIT_ANGLE(-0.05763531103730)}, + {SCALE_SPLIT_ANGLE(-0.02832321636379), + SCALE_SPLIT_ANGLE(-0.02839783579111), + SCALE_SPLIT_ANGLE(-0.02851220592856), + SCALE_SPLIT_ANGLE(-0.02880378812551), + SCALE_SPLIT_ANGLE(-0.02909369207919), + SCALE_SPLIT_ANGLE(-0.02956490218639), + SCALE_SPLIT_ANGLE(-0.03035926632583), + SCALE_SPLIT_ANGLE(-0.03093044646084)}, + {SCALE_SPLIT_ANGLE(-0.01614263094962), + SCALE_SPLIT_ANGLE(-0.01616701111197), + SCALE_SPLIT_ANGLE(-0.01620426028967), + SCALE_SPLIT_ANGLE(-0.01629855856299), + SCALE_SPLIT_ANGLE(-0.01639137044549), + SCALE_SPLIT_ANGLE(-0.01654022000730), + SCALE_SPLIT_ANGLE(-0.01678557321429), + SCALE_SPLIT_ANGLE(-0.01695770025253)}, + {SCALE_SPLIT_ANGLE(-0.00914741121233), + SCALE_SPLIT_ANGLE(-0.00915526598692), + SCALE_SPLIT_ANGLE(-0.00916724465787), + SCALE_SPLIT_ANGLE(-0.00919744279236), + SCALE_SPLIT_ANGLE(-0.00922699086368), + SCALE_SPLIT_ANGLE(-0.00927401985973), + SCALE_SPLIT_ANGLE(-0.00935057457536), + SCALE_SPLIT_ANGLE(-0.00940357148647)}, + {SCALE_SPLIT_ANGLE(-0.00516631966457), + SCALE_SPLIT_ANGLE(-0.00516883004457), + SCALE_SPLIT_ANGLE(-0.00517265358940), + SCALE_SPLIT_ANGLE(-0.00518227042630), + SCALE_SPLIT_ANGLE(-0.00519164977595), + SCALE_SPLIT_ANGLE(-0.00520651368424), + SCALE_SPLIT_ANGLE(-0.00523054040968), + SCALE_SPLIT_ANGLE(-0.00524705089629)}, + {SCALE_SPLIT_ANGLE(-0.00000002921564), + SCALE_SPLIT_ANGLE(-0.00000002921564), + SCALE_SPLIT_ANGLE(-0.00000002921564), + SCALE_SPLIT_ANGLE(-0.00000002921564), + SCALE_SPLIT_ANGLE(-0.00000002921564), + SCALE_SPLIT_ANGLE(-0.00000002921564), + SCALE_SPLIT_ANGLE(-0.00000002921564), + SCALE_SPLIT_ANGLE(-0.00000002921564)}, + }, + { + {SCALE_SPLIT_ANGLE(-1.57079625129700), + SCALE_SPLIT_ANGLE(-1.57079625129700), + SCALE_SPLIT_ANGLE(-1.57079625129700), + SCALE_SPLIT_ANGLE(-1.57079625129700), + SCALE_SPLIT_ANGLE(-1.57079625129700), + SCALE_SPLIT_ANGLE(-1.57079625129700), + SCALE_SPLIT_ANGLE(-1.57079625129700), + SCALE_SPLIT_ANGLE(-1.57079625129700)}, + {SCALE_SPLIT_ANGLE(-1.56514143943787), + SCALE_SPLIT_ANGLE(-1.56514346599579), + SCALE_SPLIT_ANGLE(-1.56514644622803), + SCALE_SPLIT_ANGLE(-1.56515395641327), + SCALE_SPLIT_ANGLE(-1.56516134738922), + SCALE_SPLIT_ANGLE(-1.56517291069031), + SCALE_SPLIT_ANGLE(-1.56519162654877), + SCALE_SPLIT_ANGLE(-1.56520438194275)}, + {SCALE_SPLIT_ANGLE(-1.56069743633270), + SCALE_SPLIT_ANGLE(-1.56070363521576), + SCALE_SPLIT_ANGLE(-1.56071305274963), + SCALE_SPLIT_ANGLE(-1.56073689460754), + SCALE_SPLIT_ANGLE(-1.56076002120972), + SCALE_SPLIT_ANGLE(-1.56079661846161), + SCALE_SPLIT_ANGLE(-1.56085574626923), + SCALE_SPLIT_ANGLE(-1.56089639663696)}, + {SCALE_SPLIT_ANGLE(-1.55270349979401), + SCALE_SPLIT_ANGLE(-1.55272293090820), + SCALE_SPLIT_ANGLE(-1.55275249481201), + SCALE_SPLIT_ANGLE(-1.55282700061798), + SCALE_SPLIT_ANGLE(-1.55289971828461), + SCALE_SPLIT_ANGLE(-1.55301535129547), + SCALE_SPLIT_ANGLE(-1.55320298671722), + SCALE_SPLIT_ANGLE(-1.55333244800568)}, + {SCALE_SPLIT_ANGLE(-1.53820896148682), + SCALE_SPLIT_ANGLE(-1.53826904296875), + SCALE_SPLIT_ANGLE(-1.53836083412170), + SCALE_SPLIT_ANGLE(-1.53859269618988), + SCALE_SPLIT_ANGLE(-1.53882038593292), + SCALE_SPLIT_ANGLE(-1.53918409347534), + SCALE_SPLIT_ANGLE(-1.53978025913239), + SCALE_SPLIT_ANGLE(-1.54019618034363)}, + {SCALE_SPLIT_ANGLE(-1.51160359382629), + SCALE_SPLIT_ANGLE(-1.51178681850433), + SCALE_SPLIT_ANGLE(-1.51206707954407), + SCALE_SPLIT_ANGLE(-1.51277911663055), + SCALE_SPLIT_ANGLE(-1.51348364353180), + SCALE_SPLIT_ANGLE(-1.51462137699127), + SCALE_SPLIT_ANGLE(-1.51652014255524), + SCALE_SPLIT_ANGLE(-1.51787149906158)}, + {SCALE_SPLIT_ANGLE(-1.48564028739929), + SCALE_SPLIT_ANGLE(-1.48599267005920), + SCALE_SPLIT_ANGLE(-1.48653328418732), + SCALE_SPLIT_ANGLE(-1.48791313171387), + SCALE_SPLIT_ANGLE(-1.48928785324097), + SCALE_SPLIT_ANGLE(-1.49152994155884), + SCALE_SPLIT_ANGLE(-1.49533629417419), + SCALE_SPLIT_ANGLE(-1.49810016155243)}, + {SCALE_SPLIT_ANGLE(-1.44770431518555), + SCALE_SPLIT_ANGLE(-1.44837117195129), + SCALE_SPLIT_ANGLE(-1.44939672946930), + SCALE_SPLIT_ANGLE(-1.45203149318695), + SCALE_SPLIT_ANGLE(-1.45468175411224), + SCALE_SPLIT_ANGLE(-1.45906174182892), + SCALE_SPLIT_ANGLE(-1.46668362617493), + SCALE_SPLIT_ANGLE(-1.47238755226135)}, + {SCALE_SPLIT_ANGLE(-1.39214622974396), + SCALE_SPLIT_ANGLE(-1.39337480068207), + SCALE_SPLIT_ANGLE(-1.39527142047882), + SCALE_SPLIT_ANGLE(-1.40018463134766), + SCALE_SPLIT_ANGLE(-1.40518975257874), + SCALE_SPLIT_ANGLE(-1.41361439228058), + SCALE_SPLIT_ANGLE(-1.42880713939667), + SCALE_SPLIT_ANGLE(-1.44072234630585)}, + {SCALE_SPLIT_ANGLE(-1.31133687496185), + SCALE_SPLIT_ANGLE(-1.31350564956665), + SCALE_SPLIT_ANGLE(-1.31686961650848), + SCALE_SPLIT_ANGLE(-1.32567894458771), + SCALE_SPLIT_ANGLE(-1.33480489253998), + SCALE_SPLIT_ANGLE(-1.35055565834045), + SCALE_SPLIT_ANGLE(-1.38048458099365), + SCALE_SPLIT_ANGLE(-1.40579903125763)}, + {SCALE_SPLIT_ANGLE(-1.19695889949799), + SCALE_SPLIT_ANGLE(-1.20052516460419), + SCALE_SPLIT_ANGLE(-1.20609176158905), + SCALE_SPLIT_ANGLE(-1.22087824344635), + SCALE_SPLIT_ANGLE(-1.23654139041901), + SCALE_SPLIT_ANGLE(-1.26451897621155), + SCALE_SPLIT_ANGLE(-1.32194638252258), + SCALE_SPLIT_ANGLE(-1.37709844112396)}, + {SCALE_SPLIT_ANGLE(-1.09969496726990), + SCALE_SPLIT_ANGLE(-1.10437369346619), + SCALE_SPLIT_ANGLE(-1.11171460151672), + SCALE_SPLIT_ANGLE(-1.13144767284393), + SCALE_SPLIT_ANGLE(-1.15274536609650), + SCALE_SPLIT_ANGLE(-1.19192278385162), + SCALE_SPLIT_ANGLE(-1.27820122241974), + SCALE_SPLIT_ANGLE(-1.37287354469299)}, + {SCALE_SPLIT_ANGLE(-0.98739635944366), + SCALE_SPLIT_ANGLE(-0.99314498901367), + SCALE_SPLIT_ANGLE(-1.00221848487854), + SCALE_SPLIT_ANGLE(-1.02694928646088), + SCALE_SPLIT_ANGLE(-1.05423069000244), + SCALE_SPLIT_ANGLE(-1.10619938373566), + SCALE_SPLIT_ANGLE(-1.23116791248322), + SCALE_SPLIT_ANGLE(-1.39771783351898)}, + {SCALE_SPLIT_ANGLE(-0.86566168069839), + SCALE_SPLIT_ANGLE(-0.87219274044037), + SCALE_SPLIT_ANGLE(-0.88256770372391), + SCALE_SPLIT_ANGLE(-0.91127198934555), + SCALE_SPLIT_ANGLE(-0.94370102882385), + SCALE_SPLIT_ANGLE(-1.00792455673218), + SCALE_SPLIT_ANGLE(-1.17914199829102), + SCALE_SPLIT_ANGLE(-1.48121190071106)}, + {SCALE_SPLIT_ANGLE(-0.74293029308319), + SCALE_SPLIT_ANGLE(-0.74975663423538), + SCALE_SPLIT_ANGLE(-0.76066619157791), + SCALE_SPLIT_ANGLE(-0.79128366708755), + SCALE_SPLIT_ANGLE(-0.82667875289917), + SCALE_SPLIT_ANGLE(-0.89952337741852), + SCALE_SPLIT_ANGLE(-1.11571288108826), + SCALE_SPLIT_ANGLE(-1.67431199550629)}, + {SCALE_SPLIT_ANGLE(-0.62761706113815), + SCALE_SPLIT_ANGLE(-0.63421267271042), + SCALE_SPLIT_ANGLE(-0.64480352401733), + SCALE_SPLIT_ANGLE(-0.67486244440079), + SCALE_SPLIT_ANGLE(-0.71025305986404), + SCALE_SPLIT_ANGLE(-0.78539818525314), + SCALE_SPLIT_ANGLE(-1.02937340736389), + SCALE_SPLIT_ANGLE(-1.92301476001740)}, + {SCALE_SPLIT_ANGLE(-0.52522456645966), + SCALE_SPLIT_ANGLE(-0.53118568658829), + SCALE_SPLIT_ANGLE(-0.54078328609467), + SCALE_SPLIT_ANGLE(-0.56819742918015), + SCALE_SPLIT_ANGLE(-0.60080897808075), + SCALE_SPLIT_ANGLE(-0.67127293348312), + SCALE_SPLIT_ANGLE(-0.91114157438278), + SCALE_SPLIT_ANGLE(-1.73398244380951)}, + {SCALE_SPLIT_ANGLE(-0.43751952052116), + SCALE_SPLIT_ANGLE(-0.44262495636940), + SCALE_SPLIT_ANGLE(-0.45084837079048), + SCALE_SPLIT_ANGLE(-0.47435706853867), + SCALE_SPLIT_ANGLE(-0.50235128402710), + SCALE_SPLIT_ANGLE(-0.56287175416946), + SCALE_SPLIT_ANGLE(-0.76705116033554), + SCALE_SPLIT_ANGLE(-1.34888231754303)}, + {SCALE_SPLIT_ANGLE(-0.36364197731018), + SCALE_SPLIT_ANGLE(-0.36782836914063), + SCALE_SPLIT_ANGLE(-0.37456014752388), + SCALE_SPLIT_ANGLE(-0.39372298121452), + SCALE_SPLIT_ANGLE(-0.41636970639229), + SCALE_SPLIT_ANGLE(-0.46459695696831), + SCALE_SPLIT_ANGLE(-0.61803078651428), + SCALE_SPLIT_ANGLE(-0.96275907754898)}, + {SCALE_SPLIT_ANGLE(-0.30166232585907), + SCALE_SPLIT_ANGLE(-0.30497136712074), + SCALE_SPLIT_ANGLE(-0.31027451157570), + SCALE_SPLIT_ANGLE(-0.32524627447128), + SCALE_SPLIT_ANGLE(-0.34269106388092), + SCALE_SPLIT_ANGLE(-0.37887355685234), + SCALE_SPLIT_ANGLE(-0.48432540893555), + SCALE_SPLIT_ANGLE(-0.66878592967987)}, + {SCALE_SPLIT_ANGLE(-0.24960109591484), + SCALE_SPLIT_ANGLE(-0.25213342905045), + SCALE_SPLIT_ANGLE(-0.25617361068726), + SCALE_SPLIT_ANGLE(-0.26745575666428), + SCALE_SPLIT_ANGLE(-0.28036275506020), + SCALE_SPLIT_ANGLE(-0.30627736449242), + SCALE_SPLIT_ANGLE(-0.37490698695183), + SCALE_SPLIT_ANGLE(-0.47145301103592)}, + {SCALE_SPLIT_ANGLE(-0.18661488592625), + SCALE_SPLIT_ANGLE(-0.18822199106216), + SCALE_SPLIT_ANGLE(-0.19076594710350), + SCALE_SPLIT_ANGLE(-0.19773861765862), + SCALE_SPLIT_ANGLE(-0.20547652244568), + SCALE_SPLIT_ANGLE(-0.22024063766003), + SCALE_SPLIT_ANGLE(-0.25452125072479), + SCALE_SPLIT_ANGLE(-0.29236793518066)}, + {SCALE_SPLIT_ANGLE(-0.13821771740913), + SCALE_SPLIT_ANGLE(-0.13918289542198), + SCALE_SPLIT_ANGLE(-0.14069861173630), + SCALE_SPLIT_ANGLE(-0.14477686583996), + SCALE_SPLIT_ANGLE(-0.14917232096195), + SCALE_SPLIT_ANGLE(-0.15718193352222), + SCALE_SPLIT_ANGLE(-0.17394064366817), + SCALE_SPLIT_ANGLE(-0.18971265852451)}, + {SCALE_SPLIT_ANGLE(-0.10140904784203), + SCALE_SPLIT_ANGLE(-0.10196315497160), + SCALE_SPLIT_ANGLE(-0.10282710194588), + SCALE_SPLIT_ANGLE(-0.10511382669210), + SCALE_SPLIT_ANGLE(-0.10751703381538), + SCALE_SPLIT_ANGLE(-0.11173453181982), + SCALE_SPLIT_ANGLE(-0.11990433931351), + SCALE_SPLIT_ANGLE(-0.12683042883873)}, + {SCALE_SPLIT_ANGLE(-0.07378087192774), + SCALE_SPLIT_ANGLE(-0.07408788800240), + SCALE_SPLIT_ANGLE(-0.07456368207932), + SCALE_SPLIT_ANGLE(-0.07580613344908), + SCALE_SPLIT_ANGLE(-0.07708552479744), + SCALE_SPLIT_ANGLE(-0.07926639169455), + SCALE_SPLIT_ANGLE(-0.08326309919357), + SCALE_SPLIT_ANGLE(-0.08642497658730)}, + {SCALE_SPLIT_ANGLE(-0.05331044271588), + SCALE_SPLIT_ANGLE(-0.05347600579262), + SCALE_SPLIT_ANGLE(-0.05373133346438), + SCALE_SPLIT_ANGLE(-0.05439101532102), + SCALE_SPLIT_ANGLE(-0.05505971238017), + SCALE_SPLIT_ANGLE(-0.05617496743798), + SCALE_SPLIT_ANGLE(-0.05813983827829), + SCALE_SPLIT_ANGLE(-0.05962376296520)}, + {SCALE_SPLIT_ANGLE(-0.03066622652113), + SCALE_SPLIT_ANGLE(-0.03072291985154), + SCALE_SPLIT_ANGLE(-0.03080986253917), + SCALE_SPLIT_ANGLE(-0.03103173524141), + SCALE_SPLIT_ANGLE(-0.03125262632966), + SCALE_SPLIT_ANGLE(-0.03161224350333), + SCALE_SPLIT_ANGLE(-0.03221990913153), + SCALE_SPLIT_ANGLE(-0.03265778720379)}, + {SCALE_SPLIT_ANGLE(-0.01747439615428), + SCALE_SPLIT_ANGLE(-0.01749316416681), + SCALE_SPLIT_ANGLE(-0.01752184517682), + SCALE_SPLIT_ANGLE(-0.01759449020028), + SCALE_SPLIT_ANGLE(-0.01766604930162), + SCALE_SPLIT_ANGLE(-0.01778092049062), + SCALE_SPLIT_ANGLE(-0.01797054335475), + SCALE_SPLIT_ANGLE(-0.01810375973582)}, + {SCALE_SPLIT_ANGLE(-0.00990140344948), + SCALE_SPLIT_ANGLE(-0.00990749336779), + SCALE_SPLIT_ANGLE(-0.00991678331047), + SCALE_SPLIT_ANGLE(-0.00994021166116), + SCALE_SPLIT_ANGLE(-0.00996314454824), + SCALE_SPLIT_ANGLE(-0.00999966636300), + SCALE_SPLIT_ANGLE(-0.01005917042494), + SCALE_SPLIT_ANGLE(-0.01010039448738)}, + {SCALE_SPLIT_ANGLE(-0.00559204118326), + SCALE_SPLIT_ANGLE(-0.00559399509802), + SCALE_SPLIT_ANGLE(-0.00559697346762), + SCALE_SPLIT_ANGLE(-0.00560446362942), + SCALE_SPLIT_ANGLE(-0.00561177125201), + SCALE_SPLIT_ANGLE(-0.00562335411087), + SCALE_SPLIT_ANGLE(-0.00564208766446), + SCALE_SPLIT_ANGLE(-0.00565496599302)}, + {SCALE_SPLIT_ANGLE(-0.00000003162278), + SCALE_SPLIT_ANGLE(-0.00000003162278), + SCALE_SPLIT_ANGLE(-0.00000003162278), + SCALE_SPLIT_ANGLE(-0.00000003162278), + SCALE_SPLIT_ANGLE(-0.00000003162278), + SCALE_SPLIT_ANGLE(-0.00000003162278), + SCALE_SPLIT_ANGLE(-0.00000003162278), + SCALE_SPLIT_ANGLE(-0.00000003162278)}, + }, + { + {SCALE_SPLIT_ANGLE(-1.17809700965881), + SCALE_SPLIT_ANGLE(-1.17809700965881), + SCALE_SPLIT_ANGLE(-1.17809700965881), + SCALE_SPLIT_ANGLE(-1.17809700965881), + SCALE_SPLIT_ANGLE(-1.17809700965881), + SCALE_SPLIT_ANGLE(-1.17809700965881), + SCALE_SPLIT_ANGLE(-1.17809700965881), + SCALE_SPLIT_ANGLE(-1.17809700965881)}, + {SCALE_SPLIT_ANGLE(-1.17289507389069), + SCALE_SPLIT_ANGLE(-1.17289614677429), + SCALE_SPLIT_ANGLE(-1.17289793491364), + SCALE_SPLIT_ANGLE(-1.17290210723877), + SCALE_SPLIT_ANGLE(-1.17290627956390), + SCALE_SPLIT_ANGLE(-1.17291295528412), + SCALE_SPLIT_ANGLE(-1.17292356491089), + SCALE_SPLIT_ANGLE(-1.17293083667755)}, + {SCALE_SPLIT_ANGLE(-1.16883778572083), + SCALE_SPLIT_ANGLE(-1.16884136199951), + SCALE_SPLIT_ANGLE(-1.16884660720825), + SCALE_SPLIT_ANGLE(-1.16885995864868), + SCALE_SPLIT_ANGLE(-1.16887307167053), + SCALE_SPLIT_ANGLE(-1.16889369487762), + SCALE_SPLIT_ANGLE(-1.16892731189728), + SCALE_SPLIT_ANGLE(-1.16895043849945)}, + {SCALE_SPLIT_ANGLE(-1.16160643100739), + SCALE_SPLIT_ANGLE(-1.16161715984344), + SCALE_SPLIT_ANGLE(-1.16163349151611), + SCALE_SPLIT_ANGLE(-1.16167497634888), + SCALE_SPLIT_ANGLE(-1.16171550750732), + SCALE_SPLIT_ANGLE(-1.16178035736084), + SCALE_SPLIT_ANGLE(-1.16188645362854), + SCALE_SPLIT_ANGLE(-1.16196036338806)}, + {SCALE_SPLIT_ANGLE(-1.14870381355286), + SCALE_SPLIT_ANGLE(-1.14873635768890), + SCALE_SPLIT_ANGLE(-1.14878606796265), + SCALE_SPLIT_ANGLE(-1.14891242980957), + SCALE_SPLIT_ANGLE(-1.14903736114502), + SCALE_SPLIT_ANGLE(-1.14923870563507), + SCALE_SPLIT_ANGLE(-1.14957380294800), + SCALE_SPLIT_ANGLE(-1.14981114864349)}, + {SCALE_SPLIT_ANGLE(-1.12567472457886), + SCALE_SPLIT_ANGLE(-1.12576985359192), + SCALE_SPLIT_ANGLE(-1.12591588497162), + SCALE_SPLIT_ANGLE(-1.12629044055939), + SCALE_SPLIT_ANGLE(-1.12666571140289), + SCALE_SPLIT_ANGLE(-1.12728178501129), + SCALE_SPLIT_ANGLE(-1.12833738327026), + SCALE_SPLIT_ANGLE(-1.12910985946655)}, + {SCALE_SPLIT_ANGLE(-1.10394370555878), + SCALE_SPLIT_ANGLE(-1.10411989688873), + SCALE_SPLIT_ANGLE(-1.10439169406891), + SCALE_SPLIT_ANGLE(-1.10509419441223), + SCALE_SPLIT_ANGLE(-1.10580670833588), + SCALE_SPLIT_ANGLE(-1.10699570178986), + SCALE_SPLIT_ANGLE(-1.10909187793732), + SCALE_SPLIT_ANGLE(-1.11067557334900)}, + {SCALE_SPLIT_ANGLE(-1.07335841655731), + SCALE_SPLIT_ANGLE(-1.07367491722107), + SCALE_SPLIT_ANGLE(-1.07416582107544), + SCALE_SPLIT_ANGLE(-1.07544875144959), + SCALE_SPLIT_ANGLE(-1.07677149772644), + SCALE_SPLIT_ANGLE(-1.07902920246124), + SCALE_SPLIT_ANGLE(-1.08317422866821), + SCALE_SPLIT_ANGLE(-1.08645880222321)}, + {SCALE_SPLIT_ANGLE(-1.03070914745331), + SCALE_SPLIT_ANGLE(-1.03125369548798), + SCALE_SPLIT_ANGLE(-1.03210353851318), + SCALE_SPLIT_ANGLE(-1.03435730934143), + SCALE_SPLIT_ANGLE(-1.03673195838928), + SCALE_SPLIT_ANGLE(-1.04091215133667), + SCALE_SPLIT_ANGLE(-1.04904508590698), + SCALE_SPLIT_ANGLE(-1.05597043037415)}, + {SCALE_SPLIT_ANGLE(-0.97233015298843), + SCALE_SPLIT_ANGLE(-0.97321158647537), + SCALE_SPLIT_ANGLE(-0.97459846735001), + SCALE_SPLIT_ANGLE(-0.97834426164627), + SCALE_SPLIT_ANGLE(-0.98240232467651), + SCALE_SPLIT_ANGLE(-0.98984342813492), + SCALE_SPLIT_ANGLE(-1.00556397438049), + SCALE_SPLIT_ANGLE(-1.02053022384644)}, + {SCALE_SPLIT_ANGLE(-0.89506632089615), + SCALE_SPLIT_ANGLE(-0.89638078212738), + SCALE_SPLIT_ANGLE(-0.89846837520599), + SCALE_SPLIT_ANGLE(-0.90423023700714), + SCALE_SPLIT_ANGLE(-0.91068559885025), + SCALE_SPLIT_ANGLE(-0.92315053939819), + SCALE_SPLIT_ANGLE(-0.95268231630325), + SCALE_SPLIT_ANGLE(-0.98626488447189)}, + {SCALE_SPLIT_ANGLE(-0.83257317543030), + SCALE_SPLIT_ANGLE(-0.83419388532639), + SCALE_SPLIT_ANGLE(-0.83678513765335), + SCALE_SPLIT_ANGLE(-0.84404873847961), + SCALE_SPLIT_ANGLE(-0.85238862037659), + SCALE_SPLIT_ANGLE(-0.86914104223251), + SCALE_SPLIT_ANGLE(-0.91285753250122), + SCALE_SPLIT_ANGLE(-0.97222834825516)}, + {SCALE_SPLIT_ANGLE(-0.76227325201035), + SCALE_SPLIT_ANGLE(-0.76417011022568), + SCALE_SPLIT_ANGLE(-0.76722222566605), + SCALE_SPLIT_ANGLE(-0.77590954303741), + SCALE_SPLIT_ANGLE(-0.78613209724426), + SCALE_SPLIT_ANGLE(-0.80752629041672), + SCALE_SPLIT_ANGLE(-0.86987817287445), + SCALE_SPLIT_ANGLE(-0.97863042354584)}, + {SCALE_SPLIT_ANGLE(-0.68631613254547), + SCALE_SPLIT_ANGLE(-0.68841677904129), + SCALE_SPLIT_ANGLE(-0.69181627035141), + SCALE_SPLIT_ANGLE(-0.70162516832352), + SCALE_SPLIT_ANGLE(-0.71342802047729), + SCALE_SPLIT_ANGLE(-0.73910319805145), + SCALE_SPLIT_ANGLE(-0.82307589054108), + SCALE_SPLIT_ANGLE(-1.03222990036011)}, + {SCALE_SPLIT_ANGLE(-0.60781323909760), + SCALE_SPLIT_ANGLE(-0.61001539230347), + SCALE_SPLIT_ANGLE(-0.61359477043152), + SCALE_SPLIT_ANGLE(-0.62403184175491), + SCALE_SPLIT_ANGLE(-0.63681107759476), + SCALE_SPLIT_ANGLE(-0.66548812389374), + SCALE_SPLIT_ANGLE(-0.76931124925613), + SCALE_SPLIT_ANGLE(-1.19638121128082)}, + {SCALE_SPLIT_ANGLE(-0.53021627664566), + SCALE_SPLIT_ANGLE(-0.53240883350372), + SCALE_SPLIT_ANGLE(-0.53598141670227), + SCALE_SPLIT_ANGLE(-0.54646164178848), + SCALE_SPLIT_ANGLE(-0.55942356586456), + SCALE_SPLIT_ANGLE(-0.58904850482941), + SCALE_SPLIT_ANGLE(-0.70326185226440), + SCALE_SPLIT_ANGLE(-1.46822547912598)}, + {SCALE_SPLIT_ANGLE(-0.45655792951584), + SCALE_SPLIT_ANGLE(-0.45864021778107), + SCALE_SPLIT_ANGLE(-0.46203425526619), + SCALE_SPLIT_ANGLE(-0.47199884057045), + SCALE_SPLIT_ANGLE(-0.48433950543404), + SCALE_SPLIT_ANGLE(-0.51260894536972), + SCALE_SPLIT_ANGLE(-0.62212854623795), + SCALE_SPLIT_ANGLE(-1.20720005035400)}, + {SCALE_SPLIT_ANGLE(-0.38893285393715), + SCALE_SPLIT_ANGLE(-0.39082619547844), + SCALE_SPLIT_ANGLE(-0.39390665292740), + SCALE_SPLIT_ANGLE(-0.40291139483452), + SCALE_SPLIT_ANGLE(-0.41398155689240), + SCALE_SPLIT_ANGLE(-0.43899381160736), + SCALE_SPLIT_ANGLE(-0.53091597557068), + SCALE_SPLIT_ANGLE(-0.85221308469772)}, + {SCALE_SPLIT_ANGLE(-0.32840180397034), + SCALE_SPLIT_ANGLE(-0.33005377650261), + SCALE_SPLIT_ANGLE(-0.33273178339005), + SCALE_SPLIT_ANGLE(-0.34049153327942), + SCALE_SPLIT_ANGLE(-0.34989196062088), + SCALE_SPLIT_ANGLE(-0.37057077884674), + SCALE_SPLIT_ANGLE(-0.43990370631218), + SCALE_SPLIT_ANGLE(-0.60593050718307)}, + {SCALE_SPLIT_ANGLE(-0.27521026134491), + SCALE_SPLIT_ANGLE(-0.27659529447556), + SCALE_SPLIT_ANGLE(-0.27882954478264), + SCALE_SPLIT_ANGLE(-0.28522571921349), + SCALE_SPLIT_ANGLE(-0.29282191395760), + SCALE_SPLIT_ANGLE(-0.30895599722862), + SCALE_SPLIT_ANGLE(-0.35752710700035), + SCALE_SPLIT_ANGLE(-0.44366964697838)}, + {SCALE_SPLIT_ANGLE(-0.22909800708294), + SCALE_SPLIT_ANGLE(-0.23021571338177), + SCALE_SPLIT_ANGLE(-0.23200808465481), + SCALE_SPLIT_ANGLE(-0.23706813156605), + SCALE_SPLIT_ANGLE(-0.24294249713421), + SCALE_SPLIT_ANGLE(-0.25494650006294), + SCALE_SPLIT_ANGLE(-0.28743270039558), + SCALE_SPLIT_ANGLE(-0.33326250314713)}, + {SCALE_SPLIT_ANGLE(-0.17204396426678), + SCALE_SPLIT_ANGLE(-0.17280194163322), + SCALE_SPLIT_ANGLE(-0.17400610446930), + SCALE_SPLIT_ANGLE(-0.17733126878738), + SCALE_SPLIT_ANGLE(-0.18105843663216), + SCALE_SPLIT_ANGLE(-0.18825362622738), + SCALE_SPLIT_ANGLE(-0.20519737899303), + SCALE_SPLIT_ANGLE(-0.22397245466709)}, + {SCALE_SPLIT_ANGLE(-0.12763081490994), + SCALE_SPLIT_ANGLE(-0.12810991704464), + SCALE_SPLIT_ANGLE(-0.12886415421963), + SCALE_SPLIT_ANGLE(-0.13090406358242), + SCALE_SPLIT_ANGLE(-0.13311786949635), + SCALE_SPLIT_ANGLE(-0.13718487322330), + SCALE_SPLIT_ANGLE(-0.14578334987164), + SCALE_SPLIT_ANGLE(-0.15392091870308)}, + {SCALE_SPLIT_ANGLE(-0.09368772059679), + SCALE_SPLIT_ANGLE(-0.09397349506617), + SCALE_SPLIT_ANGLE(-0.09441984444857), + SCALE_SPLIT_ANGLE(-0.09560552984476), + SCALE_SPLIT_ANGLE(-0.09685768932104), + SCALE_SPLIT_ANGLE(-0.09906788170338), + SCALE_SPLIT_ANGLE(-0.10338337719440), + SCALE_SPLIT_ANGLE(-0.10706327110529)}, + {SCALE_SPLIT_ANGLE(-0.06817039847374), + SCALE_SPLIT_ANGLE(-0.06833326816559), + SCALE_SPLIT_ANGLE(-0.06858597695827), + SCALE_SPLIT_ANGLE(-0.06924756616354), + SCALE_SPLIT_ANGLE(-0.06993118673563), + SCALE_SPLIT_ANGLE(-0.07110133022070), + SCALE_SPLIT_ANGLE(-0.07325870543718), + SCALE_SPLIT_ANGLE(-0.07497420907021)}, + {SCALE_SPLIT_ANGLE(-0.04925632849336), + SCALE_SPLIT_ANGLE(-0.04934597387910), + SCALE_SPLIT_ANGLE(-0.04948435723782), + SCALE_SPLIT_ANGLE(-0.04984252154827), + SCALE_SPLIT_ANGLE(-0.05020647123456), + SCALE_SPLIT_ANGLE(-0.05081529170275), + SCALE_SPLIT_ANGLE(-0.05189274996519), + SCALE_SPLIT_ANGLE(-0.05270983278751)}, + {SCALE_SPLIT_ANGLE(-0.02833298221231), + SCALE_SPLIT_ANGLE(-0.02836437523365), + SCALE_SPLIT_ANGLE(-0.02841254323721), + SCALE_SPLIT_ANGLE(-0.02853557653725), + SCALE_SPLIT_ANGLE(-0.02865824848413), + SCALE_SPLIT_ANGLE(-0.02885829471052), + SCALE_SPLIT_ANGLE(-0.02919723838568), + SCALE_SPLIT_ANGLE(-0.02944211103022)}, + {SCALE_SPLIT_ANGLE(-0.01614447496831), + SCALE_SPLIT_ANGLE(-0.01615499891341), + SCALE_SPLIT_ANGLE(-0.01617108844221), + SCALE_SPLIT_ANGLE(-0.01621186546981), + SCALE_SPLIT_ANGLE(-0.01625206507742), + SCALE_SPLIT_ANGLE(-0.01631666161120), + SCALE_SPLIT_ANGLE(-0.01642346009612), + SCALE_SPLIT_ANGLE(-0.01649860478938)}, + {SCALE_SPLIT_ANGLE(-0.00914774928242), + SCALE_SPLIT_ANGLE(-0.00915119051933), + SCALE_SPLIT_ANGLE(-0.00915643945336), + SCALE_SPLIT_ANGLE(-0.00916968192905), + SCALE_SPLIT_ANGLE(-0.00918265059590), + SCALE_SPLIT_ANGLE(-0.00920331384987), + SCALE_SPLIT_ANGLE(-0.00923701003194), + SCALE_SPLIT_ANGLE(-0.00926037784666)}, + {SCALE_SPLIT_ANGLE(-0.00516638066620), + SCALE_SPLIT_ANGLE(-0.00516748940572), + SCALE_SPLIT_ANGLE(-0.00516917882487), + SCALE_SPLIT_ANGLE(-0.00517342938110), + SCALE_SPLIT_ANGLE(-0.00517757609487), + SCALE_SPLIT_ANGLE(-0.00518415309489), + SCALE_SPLIT_ANGLE(-0.00519479531795), + SCALE_SPLIT_ANGLE(-0.00520211551338)}, + {SCALE_SPLIT_ANGLE(-0.00000002921563), + SCALE_SPLIT_ANGLE(-0.00000002921563), + SCALE_SPLIT_ANGLE(-0.00000002921563), + SCALE_SPLIT_ANGLE(-0.00000002921563), + SCALE_SPLIT_ANGLE(-0.00000002921563), + SCALE_SPLIT_ANGLE(-0.00000002921563), + SCALE_SPLIT_ANGLE(-0.00000002921563), + SCALE_SPLIT_ANGLE(-0.00000002921563)}, + }, + { + {SCALE_SPLIT_ANGLE(-0.78539830446243), + SCALE_SPLIT_ANGLE(-0.78539830446243), + SCALE_SPLIT_ANGLE(-0.78539830446243), + SCALE_SPLIT_ANGLE(-0.78539830446243), + SCALE_SPLIT_ANGLE(-0.78539830446243), + SCALE_SPLIT_ANGLE(-0.78539830446243), + SCALE_SPLIT_ANGLE(-0.78539830446243), + SCALE_SPLIT_ANGLE(-0.78539830446243)}, + {SCALE_SPLIT_ANGLE(-0.78143131732941), + SCALE_SPLIT_ANGLE(-0.78143173456192), + SCALE_SPLIT_ANGLE(-0.78143233060837), + SCALE_SPLIT_ANGLE(-0.78143388032913), + SCALE_SPLIT_ANGLE(-0.78143537044525), + SCALE_SPLIT_ANGLE(-0.78143775463104), + SCALE_SPLIT_ANGLE(-0.78144156932831), + SCALE_SPLIT_ANGLE(-0.78144425153732)}, + {SCALE_SPLIT_ANGLE(-0.77835690975189), + SCALE_SPLIT_ANGLE(-0.77835816144943), + SCALE_SPLIT_ANGLE(-0.77836006879807), + SCALE_SPLIT_ANGLE(-0.77836489677429), + SCALE_SPLIT_ANGLE(-0.77836954593658), + SCALE_SPLIT_ANGLE(-0.77837705612183), + SCALE_SPLIT_ANGLE(-0.77838915586472), + SCALE_SPLIT_ANGLE(-0.77839756011963)}, + {SCALE_SPLIT_ANGLE(-0.77291876077652), + SCALE_SPLIT_ANGLE(-0.77292257547379), + SCALE_SPLIT_ANGLE(-0.77292835712433), + SCALE_SPLIT_ANGLE(-0.77294307947159), + SCALE_SPLIT_ANGLE(-0.77295756340027), + SCALE_SPLIT_ANGLE(-0.77298080921173), + SCALE_SPLIT_ANGLE(-0.77301901578903), + SCALE_SPLIT_ANGLE(-0.77304589748383)}, + {SCALE_SPLIT_ANGLE(-0.76334208250046), + SCALE_SPLIT_ANGLE(-0.76335340738297), + SCALE_SPLIT_ANGLE(-0.76337069272995), + SCALE_SPLIT_ANGLE(-0.76341491937637), + SCALE_SPLIT_ANGLE(-0.76345884799957), + SCALE_SPLIT_ANGLE(-0.76353019475937), + SCALE_SPLIT_ANGLE(-0.76365041732788), + SCALE_SPLIT_ANGLE(-0.76373666524887)}, + {SCALE_SPLIT_ANGLE(-0.74662196636200), + SCALE_SPLIT_ANGLE(-0.74665397405624), + SCALE_SPLIT_ANGLE(-0.74670332670212), + SCALE_SPLIT_ANGLE(-0.74683076143265), + SCALE_SPLIT_ANGLE(-0.74695968627930), + SCALE_SPLIT_ANGLE(-0.74717408418655), + SCALE_SPLIT_ANGLE(-0.74754965305328), + SCALE_SPLIT_ANGLE(-0.74783110618591)}, + {SCALE_SPLIT_ANGLE(-0.73124068975449), + SCALE_SPLIT_ANGLE(-0.73129838705063), + SCALE_SPLIT_ANGLE(-0.73138779401779), + SCALE_SPLIT_ANGLE(-0.73162090778351), + SCALE_SPLIT_ANGLE(-0.73186063766479), + SCALE_SPLIT_ANGLE(-0.73226791620255), + SCALE_SPLIT_ANGLE(-0.73300850391388), + SCALE_SPLIT_ANGLE(-0.73358756303787)}, + {SCALE_SPLIT_ANGLE(-0.71016567945480), + SCALE_SPLIT_ANGLE(-0.71026563644409), + SCALE_SPLIT_ANGLE(-0.71042138338089), + SCALE_SPLIT_ANGLE(-0.71083360910416), + SCALE_SPLIT_ANGLE(-0.71126639842987), + SCALE_SPLIT_ANGLE(-0.71202349662781), + SCALE_SPLIT_ANGLE(-0.71347558498383), + SCALE_SPLIT_ANGLE(-0.71468466520309)}, + {SCALE_SPLIT_ANGLE(-0.68173074722290), + SCALE_SPLIT_ANGLE(-0.68189489841461), + SCALE_SPLIT_ANGLE(-0.68215286731720), + SCALE_SPLIT_ANGLE(-0.68284797668457), + SCALE_SPLIT_ANGLE(-0.68359792232513), + SCALE_SPLIT_ANGLE(-0.68496227264404), + SCALE_SPLIT_ANGLE(-0.68778377771378), + SCALE_SPLIT_ANGLE(-0.69036662578583)}, + {SCALE_SPLIT_ANGLE(-0.64424312114716), + SCALE_SPLIT_ANGLE(-0.64449483156204), + SCALE_SPLIT_ANGLE(-0.64489442110062), + SCALE_SPLIT_ANGLE(-0.64599496126175), + SCALE_SPLIT_ANGLE(-0.64722281694412), + SCALE_SPLIT_ANGLE(-0.64957284927368), + SCALE_SPLIT_ANGLE(-0.65497392416000), + SCALE_SPLIT_ANGLE(-0.66069275140762)}, + {SCALE_SPLIT_ANGLE(-0.59645897150040), + SCALE_SPLIT_ANGLE(-0.59681385755539), + SCALE_SPLIT_ANGLE(-0.59738302230835), + SCALE_SPLIT_ANGLE(-0.59898990392685), + SCALE_SPLIT_ANGLE(-0.60085391998291), + SCALE_SPLIT_ANGLE(-0.60464876890182), + SCALE_SPLIT_ANGLE(-0.61471670866013), + SCALE_SPLIT_ANGLE(-0.62811452150345)}, + {SCALE_SPLIT_ANGLE(-0.55878317356110), + SCALE_SPLIT_ANGLE(-0.55920612812042), + SCALE_SPLIT_ANGLE(-0.55988919734955), + SCALE_SPLIT_ANGLE(-0.56185036897659), + SCALE_SPLIT_ANGLE(-0.56418758630753), + SCALE_SPLIT_ANGLE(-0.56916558742523), + SCALE_SPLIT_ANGLE(-0.58402240276337), + SCALE_SPLIT_ANGLE(-0.60877454280853)}, + {SCALE_SPLIT_ANGLE(-0.51690876483917), + SCALE_SPLIT_ANGLE(-0.51739066839218), + SCALE_SPLIT_ANGLE(-0.51817417144775), + SCALE_SPLIT_ANGLE(-0.52045887708664), + SCALE_SPLIT_ANGLE(-0.52325236797333), + SCALE_SPLIT_ANGLE(-0.52947425842285), + SCALE_SPLIT_ANGLE(-0.55062580108643), + SCALE_SPLIT_ANGLE(-0.59875679016113)}, + {SCALE_SPLIT_ANGLE(-0.47171202301979), + SCALE_SPLIT_ANGLE(-0.47223755717278), + SCALE_SPLIT_ANGLE(-0.47309651970863), + SCALE_SPLIT_ANGLE(-0.47563409805298), + SCALE_SPLIT_ANGLE(-0.47880497574806), + SCALE_SPLIT_ANGLE(-0.48615178465843), + SCALE_SPLIT_ANGLE(-0.51456993818283), + SCALE_SPLIT_ANGLE(-0.61478376388550)}, + {SCALE_SPLIT_ANGLE(-0.42445346713066), + SCALE_SPLIT_ANGLE(-0.42500337958336), + SCALE_SPLIT_ANGLE(-0.42590552568436), + SCALE_SPLIT_ANGLE(-0.42859482765198), + SCALE_SPLIT_ANGLE(-0.43200704455376), + SCALE_SPLIT_ANGLE(-0.44014206528664), + SCALE_SPLIT_ANGLE(-0.47505456209183), + SCALE_SPLIT_ANGLE(-0.70435559749603)}, + {SCALE_SPLIT_ANGLE(-0.37662348151207), + SCALE_SPLIT_ANGLE(-0.37717759609222), + SCALE_SPLIT_ANGLE(-0.37808811664581), + SCALE_SPLIT_ANGLE(-0.38081312179565), + SCALE_SPLIT_ANGLE(-0.38429382443428), + SCALE_SPLIT_ANGLE(-0.39269915223122), + SCALE_SPLIT_ANGLE(-0.43061137199402), + SCALE_SPLIT_ANGLE(-0.89949661493301)}, + {SCALE_SPLIT_ANGLE(-0.32972770929337), + SCALE_SPLIT_ANGLE(-0.33026665449142), + SCALE_SPLIT_ANGLE(-0.33115166425705), + SCALE_SPLIT_ANGLE(-0.33379596471786), + SCALE_SPLIT_ANGLE(-0.33716449141502), + SCALE_SPLIT_ANGLE(-0.34525626897812), + SCALE_SPLIT_ANGLE(-0.38098806142807), + SCALE_SPLIT_ANGLE(-0.66312354803085)}, + {SCALE_SPLIT_ANGLE(-0.28508266806602), + SCALE_SPLIT_ANGLE(-0.28558865189552), + SCALE_SPLIT_ANGLE(-0.28641721606255), + SCALE_SPLIT_ANGLE(-0.28887599706650), + SCALE_SPLIT_ANGLE(-0.29197183251381), + SCALE_SPLIT_ANGLE(-0.29924651980400), + SCALE_SPLIT_ANGLE(-0.32879725098610), + SCALE_SPLIT_ANGLE(-0.45467042922974)}, + {SCALE_SPLIT_ANGLE(-0.24368351697922), + SCALE_SPLIT_ANGLE(-0.24414126574993), + SCALE_SPLIT_ANGLE(-0.24488742649555), + SCALE_SPLIT_ANGLE(-0.24707718193531), + SCALE_SPLIT_ANGLE(-0.24978290498257), + SCALE_SPLIT_ANGLE(-0.25592407584190), + SCALE_SPLIT_ANGLE(-0.27806493639946), + SCALE_SPLIT_ANGLE(-0.33706212043762)}, + {SCALE_SPLIT_ANGLE(-0.20616291463375), + SCALE_SPLIT_ANGLE(-0.20656123757362), + SCALE_SPLIT_ANGLE(-0.20720669627190), + SCALE_SPLIT_ANGLE(-0.20907410979271), + SCALE_SPLIT_ANGLE(-0.21132779121399), + SCALE_SPLIT_ANGLE(-0.21623276174068), + SCALE_SPLIT_ANGLE(-0.23178002238274), + SCALE_SPLIT_ANGLE(-0.26115795969963)}, + {SCALE_SPLIT_ANGLE(-0.17282113432884), + SCALE_SPLIT_ANGLE(-0.17315419018269), + SCALE_SPLIT_ANGLE(-0.17369027435780), + SCALE_SPLIT_ANGLE(-0.17521676421165), + SCALE_SPLIT_ANGLE(-0.17701183259487), + SCALE_SPLIT_ANGLE(-0.18074958026409), + SCALE_SPLIT_ANGLE(-0.19124273955822), + SCALE_SPLIT_ANGLE(-0.20666226744652)}, + {SCALE_SPLIT_ANGLE(-0.13066087663174), + SCALE_SPLIT_ANGLE(-0.13089761137962), + SCALE_SPLIT_ANGLE(-0.13127478957176), + SCALE_SPLIT_ANGLE(-0.13232274353504), + SCALE_SPLIT_ANGLE(-0.13350811600685), + SCALE_SPLIT_ANGLE(-0.13582547008991), + SCALE_SPLIT_ANGLE(-0.14140743017197), + SCALE_SPLIT_ANGLE(-0.14774034917355)}, + {SCALE_SPLIT_ANGLE(-0.09729288518429), + SCALE_SPLIT_ANGLE(-0.09744837880135), + SCALE_SPLIT_ANGLE(-0.09769365936518), + SCALE_SPLIT_ANGLE(-0.09835996478796), + SCALE_SPLIT_ANGLE(-0.09908770024776), + SCALE_SPLIT_ANGLE(-0.10043605417013), + SCALE_SPLIT_ANGLE(-0.10332851856947), + SCALE_SPLIT_ANGLE(-0.10610698908567)}, + {SCALE_SPLIT_ANGLE(-0.07155896723270), + SCALE_SPLIT_ANGLE(-0.07165452837944), + SCALE_SPLIT_ANGLE(-0.07180399447680), + SCALE_SPLIT_ANGLE(-0.07220225781202), + SCALE_SPLIT_ANGLE(-0.07262473553419), + SCALE_SPLIT_ANGLE(-0.07337480783463), + SCALE_SPLIT_ANGLE(-0.07485358417034), + SCALE_SPLIT_ANGLE(-0.07612710446119)}, + {SCALE_SPLIT_ANGLE(-0.05212157964706), + SCALE_SPLIT_ANGLE(-0.05217728391290), + SCALE_SPLIT_ANGLE(-0.05226380378008), + SCALE_SPLIT_ANGLE(-0.05249079316854), + SCALE_SPLIT_ANGLE(-0.05272606760263), + SCALE_SPLIT_ANGLE(-0.05313043296337), + SCALE_SPLIT_ANGLE(-0.05388086661696), + SCALE_SPLIT_ANGLE(-0.05448163300753)}, + {SCALE_SPLIT_ANGLE(-0.03767966106534), + SCALE_SPLIT_ANGLE(-0.03771083801985), + SCALE_SPLIT_ANGLE(-0.03775899857283), + SCALE_SPLIT_ANGLE(-0.03788383677602), + SCALE_SPLIT_ANGLE(-0.03801096975803), + SCALE_SPLIT_ANGLE(-0.03822424262762), + SCALE_SPLIT_ANGLE(-0.03860339894891), + SCALE_SPLIT_ANGLE(-0.03889227285981)}, + {SCALE_SPLIT_ANGLE(-0.02168159000576), + SCALE_SPLIT_ANGLE(-0.02169271185994), + SCALE_SPLIT_ANGLE(-0.02170977741480), + SCALE_SPLIT_ANGLE(-0.02175341919065), + SCALE_SPLIT_ANGLE(-0.02179697901011), + SCALE_SPLIT_ANGLE(-0.02186813205481), + SCALE_SPLIT_ANGLE(-0.02198898792267), + SCALE_SPLIT_ANGLE(-0.02207653038204)}, + {SCALE_SPLIT_ANGLE(-0.01235581189394), + SCALE_SPLIT_ANGLE(-0.01235958002508), + SCALE_SPLIT_ANGLE(-0.01236534304917), + SCALE_SPLIT_ANGLE(-0.01237995456904), + SCALE_SPLIT_ANGLE(-0.01239436771721), + SCALE_SPLIT_ANGLE(-0.01241754833609), + SCALE_SPLIT_ANGLE(-0.01245592441410), + SCALE_SPLIT_ANGLE(-0.01248297002167)}, + {SCALE_SPLIT_ANGLE(-0.00700127193704), + SCALE_SPLIT_ANGLE(-0.00700251199305), + SCALE_SPLIT_ANGLE(-0.00700440304354), + SCALE_SPLIT_ANGLE(-0.00700917467475), + SCALE_SPLIT_ANGLE(-0.00701385131106), + SCALE_SPLIT_ANGLE(-0.00702130468562), + SCALE_SPLIT_ANGLE(-0.00703346915543), + SCALE_SPLIT_ANGLE(-0.00704191112891)}, + {SCALE_SPLIT_ANGLE(-0.00395415676758), + SCALE_SPLIT_ANGLE(-0.00395455863327), + SCALE_SPLIT_ANGLE(-0.00395516911522), + SCALE_SPLIT_ANGLE(-0.00395670579746), + SCALE_SPLIT_ANGLE(-0.00395820569247), + SCALE_SPLIT_ANGLE(-0.00396058475599), + SCALE_SPLIT_ANGLE(-0.00396443624049), + SCALE_SPLIT_ANGLE(-0.00396708631888)}, + {SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068)}, + }, + { + {SCALE_SPLIT_ANGLE(-0.39269906282425), + SCALE_SPLIT_ANGLE(-0.39269906282425), + SCALE_SPLIT_ANGLE(-0.39269906282425), + SCALE_SPLIT_ANGLE(-0.39269906282425), + SCALE_SPLIT_ANGLE(-0.39269906282425), + SCALE_SPLIT_ANGLE(-0.39269906282425), + SCALE_SPLIT_ANGLE(-0.39269906282425), + SCALE_SPLIT_ANGLE(-0.39269906282425)}, + {SCALE_SPLIT_ANGLE(-0.39055728912354), + SCALE_SPLIT_ANGLE(-0.39055734872818), + SCALE_SPLIT_ANGLE(-0.39055743813515), + SCALE_SPLIT_ANGLE(-0.39055764675140), + SCALE_SPLIT_ANGLE(-0.39055785536766), + SCALE_SPLIT_ANGLE(-0.39055821299553), + SCALE_SPLIT_ANGLE(-0.39055874943733), + SCALE_SPLIT_ANGLE(-0.39055910706520)}, + {SCALE_SPLIT_ANGLE(-0.38890448212624), + SCALE_SPLIT_ANGLE(-0.38890466094017), + SCALE_SPLIT_ANGLE(-0.38890489935875), + SCALE_SPLIT_ANGLE(-0.38890558481216), + SCALE_SPLIT_ANGLE(-0.38890624046326), + SCALE_SPLIT_ANGLE(-0.38890728354454), + SCALE_SPLIT_ANGLE(-0.38890898227692), + SCALE_SPLIT_ANGLE(-0.38891017436981)}, + {SCALE_SPLIT_ANGLE(-0.38599535822868), + SCALE_SPLIT_ANGLE(-0.38599589467049), + SCALE_SPLIT_ANGLE(-0.38599669933319), + SCALE_SPLIT_ANGLE(-0.38599872589111), + SCALE_SPLIT_ANGLE(-0.38600075244904), + SCALE_SPLIT_ANGLE(-0.38600397109985), + SCALE_SPLIT_ANGLE(-0.38600933551788), + SCALE_SPLIT_ANGLE(-0.38601312041283)}, + {SCALE_SPLIT_ANGLE(-0.38091570138931), + SCALE_SPLIT_ANGLE(-0.38091725111008), + SCALE_SPLIT_ANGLE(-0.38091960549355), + SCALE_SPLIT_ANGLE(-0.38092568516731), + SCALE_SPLIT_ANGLE(-0.38093173503876), + SCALE_SPLIT_ANGLE(-0.38094159960747), + SCALE_SPLIT_ANGLE(-0.38095837831497), + SCALE_SPLIT_ANGLE(-0.38097053766251)}, + {SCALE_SPLIT_ANGLE(-0.37216994166374), + SCALE_SPLIT_ANGLE(-0.37217423319817), + SCALE_SPLIT_ANGLE(-0.37218084931374), + SCALE_SPLIT_ANGLE(-0.37219804525375), + SCALE_SPLIT_ANGLE(-0.37221553921700), + SCALE_SPLIT_ANGLE(-0.37224486470222), + SCALE_SPLIT_ANGLE(-0.37229701876640), + SCALE_SPLIT_ANGLE(-0.37233671545982)}, + {SCALE_SPLIT_ANGLE(-0.36424961686134), + SCALE_SPLIT_ANGLE(-0.36425721645355), + SCALE_SPLIT_ANGLE(-0.36426901817322), + SCALE_SPLIT_ANGLE(-0.36429998278618), + SCALE_SPLIT_ANGLE(-0.36433207988739), + SCALE_SPLIT_ANGLE(-0.36438727378845), + SCALE_SPLIT_ANGLE(-0.36448964476585), + SCALE_SPLIT_ANGLE(-0.36457160115242)}, + {SCALE_SPLIT_ANGLE(-0.35356882214546), + SCALE_SPLIT_ANGLE(-0.35358169674873), + SCALE_SPLIT_ANGLE(-0.35360184311867), + SCALE_SPLIT_ANGLE(-0.35365554690361), + SCALE_SPLIT_ANGLE(-0.35371255874634), + SCALE_SPLIT_ANGLE(-0.35381379723549), + SCALE_SPLIT_ANGLE(-0.35401359200478), + SCALE_SPLIT_ANGLE(-0.35418573021889)}, + {SCALE_SPLIT_ANGLE(-0.33942580223083), + SCALE_SPLIT_ANGLE(-0.33944639563560), + SCALE_SPLIT_ANGLE(-0.33947893977165), + SCALE_SPLIT_ANGLE(-0.33956736326218), + SCALE_SPLIT_ANGLE(-0.33966410160065), + SCALE_SPLIT_ANGLE(-0.33984366059303), + SCALE_SPLIT_ANGLE(-0.34023004770279), + SCALE_SPLIT_ANGLE(-0.34060218930244)}, + {SCALE_SPLIT_ANGLE(-0.32115444540977), + SCALE_SPLIT_ANGLE(-0.32118517160416), + SCALE_SPLIT_ANGLE(-0.32123413681984), + SCALE_SPLIT_ANGLE(-0.32137045264244), + SCALE_SPLIT_ANGLE(-0.32152506709099), + SCALE_SPLIT_ANGLE(-0.32182860374451), + SCALE_SPLIT_ANGLE(-0.32256555557251), + SCALE_SPLIT_ANGLE(-0.32340887188911)}, + {SCALE_SPLIT_ANGLE(-0.29830518364906), + SCALE_SPLIT_ANGLE(-0.29834720492363), + SCALE_SPLIT_ANGLE(-0.29841497540474), + SCALE_SPLIT_ANGLE(-0.29860857129097), + SCALE_SPLIT_ANGLE(-0.29883739352226), + SCALE_SPLIT_ANGLE(-0.29931783676147), + SCALE_SPLIT_ANGLE(-0.30069103837013), + SCALE_SPLIT_ANGLE(-0.30275768041611)}, + {SCALE_SPLIT_ANGLE(-0.28050783276558), + SCALE_SPLIT_ANGLE(-0.28055709600449), + SCALE_SPLIT_ANGLE(-0.28063705563545), + SCALE_SPLIT_ANGLE(-0.28086939454079), + SCALE_SPLIT_ANGLE(-0.28115186095238), + SCALE_SPLIT_ANGLE(-0.28177401423454), + SCALE_SPLIT_ANGLE(-0.28380542993546), + SCALE_SPLIT_ANGLE(-0.28782635927200)}, + {SCALE_SPLIT_ANGLE(-0.26083284616470), + SCALE_SPLIT_ANGLE(-0.26088821887970), + SCALE_SPLIT_ANGLE(-0.26097869873047), + SCALE_SPLIT_ANGLE(-0.26124575734138), + SCALE_SPLIT_ANGLE(-0.26157894730568), + SCALE_SPLIT_ANGLE(-0.26234790682793), + SCALE_SPLIT_ANGLE(-0.26525342464447), + SCALE_SPLIT_ANGLE(-0.27373573184013)}, + {SCALE_SPLIT_ANGLE(-0.23960019648075), + SCALE_SPLIT_ANGLE(-0.23966008424759), + SCALE_SPLIT_ANGLE(-0.23975844681263), + SCALE_SPLIT_ANGLE(-0.24005250632763), + SCALE_SPLIT_ANGLE(-0.24042734503746), + SCALE_SPLIT_ANGLE(-0.24132779240608), + SCALE_SPLIT_ANGLE(-0.24525122344494), + SCALE_SPLIT_ANGLE(-0.26534584164619)}, + {SCALE_SPLIT_ANGLE(-0.21727462112904), + SCALE_SPLIT_ANGLE(-0.21733717620373), + SCALE_SPLIT_ANGLE(-0.21744027733803), + SCALE_SPLIT_ANGLE(-0.21775110065937), + SCALE_SPLIT_ANGLE(-0.21815298497677), + SCALE_SPLIT_ANGLE(-0.21914556622505), + SCALE_SPLIT_ANGLE(-0.22397416830063), + SCALE_SPLIT_ANGLE(-0.27997338771820)}, + {SCALE_SPLIT_ANGLE(-0.19442924857140), + SCALE_SPLIT_ANGLE(-0.19449259340763), + SCALE_SPLIT_ANGLE(-0.19459711015224), + SCALE_SPLIT_ANGLE(-0.19491319358349), + SCALE_SPLIT_ANGLE(-0.19532407820225), + SCALE_SPLIT_ANGLE(-0.19634953141212), + SCALE_SPLIT_ANGLE(-0.20156541466713), + SCALE_SPLIT_ANGLE(-0.33650863170624)}, + {SCALE_SPLIT_ANGLE(-0.17168678343296), + SCALE_SPLIT_ANGLE(-0.17174907028675), + SCALE_SPLIT_ANGLE(-0.17185172438622), + SCALE_SPLIT_ANGLE(-0.17216137051582), + SCALE_SPLIT_ANGLE(-0.17256210744381), + SCALE_SPLIT_ANGLE(-0.17355349659920), + SCALE_SPLIT_ANGLE(-0.17841055989265), + SCALE_SPLIT_ANGLE(-0.23922458291054)}, + {SCALE_SPLIT_ANGLE(-0.14965106546879), + SCALE_SPLIT_ANGLE(-0.14971044659615), + SCALE_SPLIT_ANGLE(-0.14980801939964), + SCALE_SPLIT_ANGLE(-0.15010000765324), + SCALE_SPLIT_ANGLE(-0.15047281980515), + SCALE_SPLIT_ANGLE(-0.15137127041817), + SCALE_SPLIT_ANGLE(-0.15533344447613), + SCALE_SPLIT_ANGLE(-0.17691853642464)}, + {SCALE_SPLIT_ANGLE(-0.12884500622749), + SCALE_SPLIT_ANGLE(-0.12889972329140), + SCALE_SPLIT_ANGLE(-0.12898920476437), + SCALE_SPLIT_ANGLE(-0.12925371527672), + SCALE_SPLIT_ANGLE(-0.12958449125290), + SCALE_SPLIT_ANGLE(-0.13035115599632), + SCALE_SPLIT_ANGLE(-0.13329000771046), + SCALE_SPLIT_ANGLE(-0.14226882159710)}, + {SCALE_SPLIT_ANGLE(-0.10966771095991), + SCALE_SPLIT_ANGLE(-0.10971628129482), + SCALE_SPLIT_ANGLE(-0.10979521274567), + SCALE_SPLIT_ANGLE(-0.11002496629953), + SCALE_SPLIT_ANGLE(-0.11030505597591), + SCALE_SPLIT_ANGLE(-0.11092507094145), + SCALE_SPLIT_ANGLE(-0.11297955363989), + SCALE_SPLIT_ANGLE(-0.11718675494194)}, + {SCALE_SPLIT_ANGLE(-0.09237615764141), + SCALE_SPLIT_ANGLE(-0.09241757541895), + SCALE_SPLIT_ANGLE(-0.09248440712690), + SCALE_SPLIT_ANGLE(-0.09267570078373), + SCALE_SPLIT_ANGLE(-0.09290252625942), + SCALE_SPLIT_ANGLE(-0.09338124096394), + SCALE_SPLIT_ANGLE(-0.09476861357689), + SCALE_SPLIT_ANGLE(-0.09691139310598)}, + {SCALE_SPLIT_ANGLE(-0.07020132243633), + SCALE_SPLIT_ANGLE(-0.07023159414530), + SCALE_SPLIT_ANGLE(-0.07027988135815), + SCALE_SPLIT_ANGLE(-0.07041461765766), + SCALE_SPLIT_ANGLE(-0.07056794315577), + SCALE_SPLIT_ANGLE(-0.07087046653032), + SCALE_SPLIT_ANGLE(-0.07161350548267), + SCALE_SPLIT_ANGLE(-0.07247892767191)}, + {SCALE_SPLIT_ANGLE(-0.05244029313326), + SCALE_SPLIT_ANGLE(-0.05246063694358), + SCALE_SPLIT_ANGLE(-0.05249277129769), + SCALE_SPLIT_ANGLE(-0.05258031189442), + SCALE_SPLIT_ANGLE(-0.05267634615302), + SCALE_SPLIT_ANGLE(-0.05285539105535), + SCALE_SPLIT_ANGLE(-0.05324416607618), + SCALE_SPLIT_ANGLE(-0.05362325906754)}, + {SCALE_SPLIT_ANGLE(-0.03864165395498), + SCALE_SPLIT_ANGLE(-0.03865438699722), + SCALE_SPLIT_ANGLE(-0.03867433220148), + SCALE_SPLIT_ANGLE(-0.03872758150101), + SCALE_SPLIT_ANGLE(-0.03878423944116), + SCALE_SPLIT_ANGLE(-0.03888526186347), + SCALE_SPLIT_ANGLE(-0.03908598423004), + SCALE_SPLIT_ANGLE(-0.03926040232182)}, + {SCALE_SPLIT_ANGLE(-0.02817477099597), + SCALE_SPLIT_ANGLE(-0.02818230539560), + SCALE_SPLIT_ANGLE(-0.02819401212037), + SCALE_SPLIT_ANGLE(-0.02822477370501), + SCALE_SPLIT_ANGLE(-0.02825672924519), + SCALE_SPLIT_ANGLE(-0.02831180207431), + SCALE_SPLIT_ANGLE(-0.02841453626752), + SCALE_SPLIT_ANGLE(-0.02849724888802)}, + {SCALE_SPLIT_ANGLE(-0.02037952840328), + SCALE_SPLIT_ANGLE(-0.02038379199803), + SCALE_SPLIT_ANGLE(-0.02039037644863), + SCALE_SPLIT_ANGLE(-0.02040746808052), + SCALE_SPLIT_ANGLE(-0.02042490057647), + SCALE_SPLIT_ANGLE(-0.02045419998467), + SCALE_SPLIT_ANGLE(-0.02050646580756), + SCALE_SPLIT_ANGLE(-0.02054643817246)}, + {SCALE_SPLIT_ANGLE(-0.01173160132021), + SCALE_SPLIT_ANGLE(-0.01173313893378), + SCALE_SPLIT_ANGLE(-0.01173550169915), + SCALE_SPLIT_ANGLE(-0.01174154412001), + SCALE_SPLIT_ANGLE(-0.01174758281559), + SCALE_SPLIT_ANGLE(-0.01175745390356), + SCALE_SPLIT_ANGLE(-0.01177425216883), + SCALE_SPLIT_ANGLE(-0.01178644038737)}, + {SCALE_SPLIT_ANGLE(-0.00668647419661), + SCALE_SPLIT_ANGLE(-0.00668699899688), + SCALE_SPLIT_ANGLE(-0.00668780226260), + SCALE_SPLIT_ANGLE(-0.00668983859941), + SCALE_SPLIT_ANGLE(-0.00669184979051), + SCALE_SPLIT_ANGLE(-0.00669508427382), + SCALE_SPLIT_ANGLE(-0.00670044496655), + SCALE_SPLIT_ANGLE(-0.00670422706753)}, + {SCALE_SPLIT_ANGLE(-0.00378898018971), + SCALE_SPLIT_ANGLE(-0.00378915364854), + SCALE_SPLIT_ANGLE(-0.00378941860981), + SCALE_SPLIT_ANGLE(-0.00379008613527), + SCALE_SPLIT_ANGLE(-0.00379074038938), + SCALE_SPLIT_ANGLE(-0.00379178440198), + SCALE_SPLIT_ANGLE(-0.00379348848946), + SCALE_SPLIT_ANGLE(-0.00379467150196)}, + {SCALE_SPLIT_ANGLE(-0.00213995948434), + SCALE_SPLIT_ANGLE(-0.00214001582935), + SCALE_SPLIT_ANGLE(-0.00214010151103), + SCALE_SPLIT_ANGLE(-0.00214031687938), + SCALE_SPLIT_ANGLE(-0.00214052735828), + SCALE_SPLIT_ANGLE(-0.00214086123742), + SCALE_SPLIT_ANGLE(-0.00214140163735), + SCALE_SPLIT_ANGLE(-0.00214177393354)}, + {SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151)}, + }, +}; #define SCALE_CLD(a) (FL2FXCONST_CFG(a)) diff --git a/libSACdec/src/sac_rom.h b/libSACdec/src/sac_rom.h index d366fb6..38f17f2 100644 --- a/libSACdec/src/sac_rom.h +++ b/libSACdec/src/sac_rom.h @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -147,7 +147,7 @@ amm-info@iis.fraunhofer.de #define CLIP_PROTECT_GAIN_1(x) FL2FXCONST_CFG(((x) / (float)(1 << 1))) #define CLIP_PROTECT_GAIN_2(x) FL2FXCONST_CFG(((x) / (float)(1 << 2))) -#define SF_CLD_C1C2 (8) +#define SF_CLD_C1C2 (9) extern const FIXP_CFG dequantCPC__FDK[]; extern const FIXP_CFG dequantICC__FDK[8]; @@ -160,6 +160,7 @@ extern const FIXP_CFG dequantCLD__FDK[31]; (FL2FXCONST_DBL(3.1415926535897932f / (float)(1 << (IPD_SCALE - 1)))) extern const FIXP_CFG dequantIPD__FDK[16]; +extern const FIXP_DBL dequantIPD_CLD_ICC_splitAngle__FDK[15][31][8]; extern const FIXP_CFG H11_nc[31][8]; extern const FIXP_CFG H12_nc[31][8]; diff --git a/libSBRdec/src/env_calc.cpp b/libSBRdec/src/env_calc.cpp index d7a8bb5..1242833 100644 --- a/libSBRdec/src/env_calc.cpp +++ b/libSBRdec/src/env_calc.cpp @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -493,7 +493,7 @@ static void mapSineFlags( } } -#define INTER_TES_SF_CHANGE 3 +#define INTER_TES_SF_CHANGE 4 typedef struct { FIXP_DBL subsample_power_low[(((1024) / (32) * (4) / 2) + (3 * (4)))]; @@ -626,7 +626,8 @@ static void apply_inter_tes(FIXP_DBL **qmfReal, FIXP_DBL **qmfImag, total_power_low >>= diff; total_power_low_sf = new_summand_sf; } else if (new_summand_sf < total_power_low_sf) { - new_summand >>= total_power_low_sf - new_summand_sf; + new_summand >>= + fMin(DFRACT_BITS - 1, total_power_low_sf - new_summand_sf); } total_power_low += (new_summand >> preShift2); @@ -638,7 +639,8 @@ static void apply_inter_tes(FIXP_DBL **qmfReal, FIXP_DBL **qmfImag, fMin(DFRACT_BITS - 1, new_summand_sf - total_power_high_sf); total_power_high_sf = new_summand_sf; } else if (new_summand_sf < total_power_high_sf) { - new_summand >>= total_power_high_sf - new_summand_sf; + new_summand >>= + fMin(DFRACT_BITS - 1, total_power_high_sf - new_summand_sf); } total_power_high += (new_summand >> preShift2); @@ -1561,13 +1563,14 @@ void calculateSbrEnvelope( adjustTimeSlotHQ_GainAndNoise( &analysBufferReal[j][lowSubband], &analysBufferImag[j][lowSubband], h_sbr_cal_env, pNrgs, - lowSubband, noSubbands, scale_change, smooth_ratio, noNoiseFlag, - filtBufferNoiseShift); + lowSubband, noSubbands, fMin(scale_change, DFRACT_BITS - 1), + smooth_ratio, noNoiseFlag, filtBufferNoiseShift); } else { adjustTimeSlotHQ(&analysBufferReal[j][lowSubband], &analysBufferImag[j][lowSubband], h_sbr_cal_env, - pNrgs, lowSubband, noSubbands, scale_change, - smooth_ratio, noNoiseFlag, filtBufferNoiseShift); + pNrgs, lowSubband, noSubbands, + fMin(scale_change, DFRACT_BITS - 1), smooth_ratio, + noNoiseFlag, filtBufferNoiseShift); } } else { FDK_ASSERT(!iTES_enable); /* not supported */ @@ -1575,13 +1578,14 @@ void calculateSbrEnvelope( /* FDKmemset(analysBufferReal[j], 0, 64 * sizeof(FIXP_DBL)); */ adjustTimeSlot_EldGrid(&analysBufferReal[j][lowSubband], pNrgs, &h_sbr_cal_env->harmIndex, lowSubband, - noSubbands, scale_change, noNoiseFlag, - &h_sbr_cal_env->phaseIndex, + noSubbands, + fMin(scale_change, DFRACT_BITS - 1), + noNoiseFlag, &h_sbr_cal_env->phaseIndex, EXP2SCALE(adj_e) - sbrScaleFactor->lb_scale); } else { adjustTimeSlotLC(&analysBufferReal[j][lowSubband], pNrgs, &h_sbr_cal_env->harmIndex, lowSubband, noSubbands, - scale_change, noNoiseFlag, + fMin(scale_change, DFRACT_BITS - 1), noNoiseFlag, &h_sbr_cal_env->phaseIndex); } } @@ -2321,7 +2325,15 @@ static void calcSubbandGain( } /* gain = nrgRef / B */ - FDK_divide_MantExp(nrgRef, nrgRef_e, b, b_e, ptrNrgGain, ptrNrgGain_e); + INT result_exp = 0; + *ptrNrgGain = fDivNorm(nrgRef, b, &result_exp); + *ptrNrgGain_e = (SCHAR)result_exp + (nrgRef_e - b_e); + + /* There could be a one bit diffs. This is important to compensate, + because later in the code values are compared by exponent only. */ + int headroom = CountLeadingBits(*ptrNrgGain); + *ptrNrgGain <<= headroom; + *ptrNrgGain_e -= headroom; } } @@ -2427,8 +2439,7 @@ static void adjustTimeSlot_EldGrid( sbNoise = *pNoiseLevel++; if (((INT)sineLevel_curr | noNoiseFlag) == 0) { signalReal += - (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[phaseIndex][0], sbNoise) - << 4); + fMult(FDK_sbrDecoder_sbr_randomPhase[phaseIndex][0], sbNoise); } signalReal += sineLevel_curr * p_harmonicPhase[0]; signalReal = @@ -2462,8 +2473,7 @@ static void adjustTimeSlot_EldGrid( sbNoise = *pNoiseLevel++; if (((INT)sineLevel_curr | noNoiseFlag) == 0) { signalReal += - (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[phaseIndex][0], sbNoise) - << 4); + fMult(FDK_sbrDecoder_sbr_randomPhase[phaseIndex][0], sbNoise); } signalReal += sineLevel_curr * p_harmonicPhase[0]; *ptrReal++ = signalReal; @@ -2523,8 +2533,7 @@ static void adjustTimeSlotLC( else if (!noNoiseFlag) /* Add noisefloor to the amplified signal */ signalReal += - (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0]) - << 4); + fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0]); { if (!(harmIndex & 0x1)) { @@ -2571,9 +2580,8 @@ static void adjustTimeSlotLC( !noNoiseFlag) { /* Add noisefloor to the amplified signal */ index &= (SBR_NF_NO_RANDOM_VAL - 1); - signalReal += (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], - pNoiseLevel[0]) - << 4); + signalReal += + fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0]); } /* The next multiplication constitutes the actual envelope adjustment of @@ -2598,9 +2606,8 @@ static void adjustTimeSlotLC( else if (!noNoiseFlag) { /* Add noisefloor to the amplified signal */ index &= (SBR_NF_NO_RANDOM_VAL - 1); - signalReal += (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], - pNoiseLevel[0]) - << 4); + signalReal += + fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0]); } pNoiseLevel++; @@ -2629,10 +2636,8 @@ static void adjustTimeSlotLC( else if (!noNoiseFlag) { /* Add noisefloor to the amplified signal */ index &= (SBR_NF_NO_RANDOM_VAL - 1); - signalReal = - signalReal + - (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0]) - << 4); + signalReal = signalReal + fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], + pNoiseLevel[0]); } if (!(harmIndex & 0x1)) { @@ -2737,11 +2742,9 @@ static void adjustTimeSlotHQ_GainAndNoise( /* Add noisefloor to the amplified signal */ index &= (SBR_NF_NO_RANDOM_VAL - 1); noiseReal = - fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise) - << 4; + fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise); noiseImag = - fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise) - << 4; + fMult(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise); *ptrReal++ = (signalReal + noiseReal); *ptrImag++ = (signalImag + noiseImag); } @@ -2759,13 +2762,12 @@ static void adjustTimeSlotHQ_GainAndNoise( smoothedNoise = noiseLevel[k]; index &= (SBR_NF_NO_RANDOM_VAL - 1); noiseReal = - fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise); + fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise); noiseImag = - fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise); + fMult(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise); - /* FDK_sbrDecoder_sbr_randomPhase is downscaled by 2^3 */ - signalReal += noiseReal << 4; - signalImag += noiseImag << 4; + signalReal += noiseReal; + signalImag += noiseImag; } *ptrReal++ = signalReal; *ptrImag++ = signalImag; @@ -2940,13 +2942,10 @@ static void adjustTimeSlotHQ( } else { /* Add noisefloor to the amplified signal */ index &= (SBR_NF_NO_RANDOM_VAL - 1); - /* FDK_sbrDecoder_sbr_randomPhase is downscaled by 2^3 */ noiseReal = - fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise) - << 4; + fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise); noiseImag = - fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise) - << 4; + fMult(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise); *ptrReal++ = (signalReal + noiseReal); *ptrImag++ = (signalImag + noiseImag); } @@ -2988,14 +2987,13 @@ static void adjustTimeSlotHQ( /* Add noisefloor to the amplified signal */ smoothedNoise = noiseLevel[k]; index &= (SBR_NF_NO_RANDOM_VAL - 1); - noiseReal = fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], - smoothedNoise); - noiseImag = fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][1], - smoothedNoise); - - /* FDK_sbrDecoder_sbr_randomPhase is downscaled by 2^3 */ - signalReal += noiseReal << 4; - signalImag += noiseImag << 4; + noiseReal = + fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise); + noiseImag = + fMult(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise); + + signalReal += noiseReal; + signalImag += noiseImag; } } *ptrReal++ = signalReal; diff --git a/libSBRdec/src/env_dec.cpp b/libSBRdec/src/env_dec.cpp index 88c92cd..95807c9 100644 --- a/libSBRdec/src/env_dec.cpp +++ b/libSBRdec/src/env_dec.cpp @@ -435,8 +435,8 @@ static void leanSbrConcealment( /* Noisefloor levels are always cleared ... */ h_sbr_data->domain_vec_noise[0] = 1; - for (i = 0; i < hHeaderData->freqBandData.nNfb; i++) - h_sbr_data->sbrNoiseFloorLevel[i] = FL2FXCONST_SGL(0.0f); + FDKmemclear(h_sbr_data->sbrNoiseFloorLevel, + sizeof(h_sbr_data->sbrNoiseFloorLevel)); /* ... and so are the sines */ FDKmemclear(h_sbr_data->addHarmonics, @@ -506,15 +506,20 @@ static void decodeEnvelope( */ for (i = 0; i < hHeaderData->freqBandData.nSfb[1]; i++) { /* Former Level-Channel will be used for both channels */ - if (h_prev_data->coupling == COUPLING_BAL) - h_prev_data->sfb_nrg_prev[i] = otherChannel->sfb_nrg_prev[i]; + if (h_prev_data->coupling == COUPLING_BAL) { + h_prev_data->sfb_nrg_prev[i] = + (otherChannel != NULL) ? otherChannel->sfb_nrg_prev[i] + : (FIXP_SGL)SBR_ENERGY_PAN_OFFSET; + } /* Former L/R will be combined as the new Level-Channel */ - else if (h_sbr_data->coupling == COUPLING_LEVEL) + else if (h_sbr_data->coupling == COUPLING_LEVEL && + otherChannel != NULL) { h_prev_data->sfb_nrg_prev[i] = (h_prev_data->sfb_nrg_prev[i] + otherChannel->sfb_nrg_prev[i]) >> 1; - else if (h_sbr_data->coupling == COUPLING_BAL) + } else if (h_sbr_data->coupling == COUPLING_BAL) { h_prev_data->sfb_nrg_prev[i] = (FIXP_SGL)SBR_ENERGY_PAN_OFFSET; + } } } } diff --git a/libSBRdec/src/env_extr.cpp b/libSBRdec/src/env_extr.cpp index e6ae6dc..5b7a0b1 100644 --- a/libSBRdec/src/env_extr.cpp +++ b/libSBRdec/src/env_extr.cpp @@ -1145,13 +1145,17 @@ static int sbrGetEnvelope( \brief Generates frame info for FIXFIXonly frame class used for low delay version - \return nothing + \return zero for error, one for correct. ****************************************************************************/ -static void generateFixFixOnly(FRAME_INFO *hSbrFrameInfo, int tranPosInternal, - int numberTimeSlots, const UINT flags) { +static int generateFixFixOnly(FRAME_INFO *hSbrFrameInfo, int tranPosInternal, + int numberTimeSlots, const UINT flags) { int nEnv, i, tranIdx; const int *pTable; + if (tranPosInternal >= numberTimeSlots) { + return 0; + } + switch (numberTimeSlots) { case 8: pTable = FDK_sbrDecoder_envelopeTable_8[tranPosInternal]; @@ -1159,12 +1163,11 @@ static void generateFixFixOnly(FRAME_INFO *hSbrFrameInfo, int tranPosInternal, case 15: pTable = FDK_sbrDecoder_envelopeTable_15[tranPosInternal]; break; - default: - FDK_ASSERT(0); - /* fall through */ case 16: pTable = FDK_sbrDecoder_envelopeTable_16[tranPosInternal]; break; + default: + return 0; } /* look number of envelopes in table */ @@ -1187,6 +1190,8 @@ static void generateFixFixOnly(FRAME_INFO *hSbrFrameInfo, int tranPosInternal, /* nEnv is always > 1, so nNoiseEnvelopes is always 2 (IEC 14496-3 4.6.19.3.2) */ hSbrFrameInfo->nNoiseEnvelopes = 2; + + return 1; } /*! @@ -1230,7 +1235,9 @@ static int extractLowDelayGrid( } /* calculate borders according to the transient position */ - generateFixFixOnly(pFrameInfo, temp, numberTimeSlots, flags); + if (!generateFixFixOnly(pFrameInfo, temp, numberTimeSlots, flags)) { + return 0; + } /* decode freq res: */ for (k = 0; k < pFrameInfo->nEnvelopes; k++) { diff --git a/libSBRdec/src/hbe.cpp b/libSBRdec/src/hbe.cpp index 53b21c9..1141e9c 100644 --- a/libSBRdec/src/hbe.cpp +++ b/libSBRdec/src/hbe.cpp @@ -1056,6 +1056,10 @@ SBR_ERROR QmfTransposerReInit(HANDLE_HBE_TRANSPOSER hQmfTransposer, const FIXP_QTW* tmp_t_sin; hQmfTransposer->startBand = FreqBandTable[0][0]; + FDK_ASSERT((!hQmfTransposer->bSbr41 && hQmfTransposer->startBand <= 32) || + (hQmfTransposer->bSbr41 && + hQmfTransposer->startBand <= + 16)); /* is checked by resetFreqBandTables() */ hQmfTransposer->stopBand = FreqBandTable[0][NSfb[0]]; hQmfTransposer->synthSize = diff --git a/libSBRdec/src/lpp_tran.cpp b/libSBRdec/src/lpp_tran.cpp index 2ef07eb..6acb626 100644 --- a/libSBRdec/src/lpp_tran.cpp +++ b/libSBRdec/src/lpp_tran.cpp @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -446,8 +446,26 @@ void lppTransposer( pSettings->nCols) + lowBandShift); } - dynamicScale = fixMax( - 0, dynamicScale - 1); /* one additional bit headroom to prevent -1.0 */ + + if (dynamicScale == 0) { + /* In this special case the available headroom bits as well as + ovLowBandShift and lowBandShift are zero. The spectrum is limited to + prevent -1.0, so negative values for dynamicScale can be avoided. */ + for (i = 0; i < (LPC_ORDER + pSettings->overlap + pSettings->nCols); + i++) { + lowBandReal[i] = fixMax(lowBandReal[i], (FIXP_DBL)0x80000001); + } + if (!useLP) { + for (i = 0; i < (LPC_ORDER + pSettings->overlap + pSettings->nCols); + i++) { + lowBandImag[i] = fixMax(lowBandImag[i], (FIXP_DBL)0x80000001); + } + } + } else { + dynamicScale = + fixMax(0, dynamicScale - + 1); /* one additional bit headroom to prevent -1.0 */ + } /* Scale temporal QMF buffer. diff --git a/libSBRdec/src/psbitdec.cpp b/libSBRdec/src/psbitdec.cpp index f40a156..82bb65b 100644 --- a/libSBRdec/src/psbitdec.cpp +++ b/libSBRdec/src/psbitdec.cpp @@ -312,6 +312,7 @@ int DecodePs(struct PS_DEC *h_ps_d, /*!< PS handle */ if (pBsData->bEnableIid) { pBsData->bFineIidQ = h_ps_d->specificTo.mpeg.bPrevFrameFineIidQ; + pBsData->freqResIid = h_ps_d->specificTo.mpeg.prevFreqResIid; for (gr = 0; gr < NO_HI_RES_IID_BINS; gr++) { pBsData->aaIidIndex[pBsData->noEnv - 1][gr] = h_ps_d->specificTo.mpeg.aIidPrevFrameIndex[gr]; @@ -323,6 +324,7 @@ int DecodePs(struct PS_DEC *h_ps_d, /*!< PS handle */ } if (pBsData->bEnableIcc) { + pBsData->freqResIcc = h_ps_d->specificTo.mpeg.prevFreqResIcc; for (gr = 0; gr < NO_HI_RES_ICC_BINS; gr++) { pBsData->aaIccIndex[pBsData->noEnv - 1][gr] = h_ps_d->specificTo.mpeg.aIccPrevFrameIndex[gr]; @@ -337,6 +339,12 @@ int DecodePs(struct PS_DEC *h_ps_d, /*!< PS handle */ /* Update previous frame Iid quantization */ h_ps_d->specificTo.mpeg.bPrevFrameFineIidQ = pBsData->bFineIidQ; + /* Update previous frequency resolution for IID */ + h_ps_d->specificTo.mpeg.prevFreqResIid = pBsData->freqResIid; + + /* Update previous frequency resolution for ICC */ + h_ps_d->specificTo.mpeg.prevFreqResIcc = pBsData->freqResIcc; + /* Update previous frame index buffers */ for (gr = 0; gr < NO_HI_RES_IID_BINS; gr++) { h_ps_d->specificTo.mpeg.aIidPrevFrameIndex[gr] = diff --git a/libSBRdec/src/psdec.h b/libSBRdec/src/psdec.h index 6ae1473..029eac4 100644 --- a/libSBRdec/src/psdec.h +++ b/libSBRdec/src/psdec.h @@ -275,7 +275,11 @@ struct PS_DEC { SCHAR aIccPrevFrameIndex[NO_HI_RES_ICC_BINS]; /*!< The ICC index for previous frame */ UCHAR - bPrevFrameFineIidQ; /*!< The IID quantization of the previous frame */ + bPrevFrameFineIidQ; /*!< The IID quantization of the previous frame */ + UCHAR prevFreqResIid; /*!< Frequency resolution for IID of the previous + frame */ + UCHAR prevFreqResIcc; /*!< Frequency resolution for ICC of the previous + frame */ UCHAR lastUsb; /*!< uppermost WMF delay band of last frame */ FIXP_DBL pHybridAnaStatesLFdmx diff --git a/libSBRdec/src/sbr_dec.cpp b/libSBRdec/src/sbr_dec.cpp index 2e18e6c..30611e7 100644 --- a/libSBRdec/src/sbr_dec.cpp +++ b/libSBRdec/src/sbr_dec.cpp @@ -1248,7 +1248,7 @@ resetSbrDec(HANDLE_SBR_DEC hSbrDec, HANDLE_SBR_HEADER_DATA hHeaderData, hSbrDec->savedStates = 0; - if (flags & SBRDEC_USAC_HARMONICSBR) { + if ((flags & SBRDEC_USAC_HARMONICSBR) && applySbrProc) { sbrError = QmfTransposerReInit(hSbrDec->hHBE, hHeaderData->freqBandData.freqBandTable, hHeaderData->freqBandData.nSfb); diff --git a/libSBRdec/src/sbr_rom.cpp b/libSBRdec/src/sbr_rom.cpp index 8a6688a..4c7e74a 100644 --- a/libSBRdec/src/sbr_rom.cpp +++ b/libSBRdec/src/sbr_rom.cpp @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -241,1030 +241,518 @@ const FIXP_SGL FDK_sbrDecoder_sbr_smoothFilter[4] = { random numbers. */ const FIXP_SGL FDK_sbrDecoder_sbr_randomPhase[SBR_NF_NO_RANDOM_VAL][2] = { - {FL2FXCONST_SGL(-0.99948153278296f / 8.0), - FL2FXCONST_SGL(-0.59483417516607f / 8.0)}, - {FL2FXCONST_SGL(0.97113454393991f / 8.0), - FL2FXCONST_SGL(-0.67528515225647f / 8.0)}, - {FL2FXCONST_SGL(0.14130051758487f / 8.0), - FL2FXCONST_SGL(-0.95090983575689f / 8.0)}, - {FL2FXCONST_SGL(-0.47005496701697f / 8.0), - FL2FXCONST_SGL(-0.37340549728647f / 8.0)}, - {FL2FXCONST_SGL(0.80705063769351f / 8.0), - FL2FXCONST_SGL(0.29653668284408f / 8.0)}, - {FL2FXCONST_SGL(-0.38981478896926f / 8.0), - FL2FXCONST_SGL(0.89572605717087f / 8.0)}, - {FL2FXCONST_SGL(-0.01053049862020f / 8.0), - FL2FXCONST_SGL(-0.66959058036166f / 8.0)}, - {FL2FXCONST_SGL(-0.91266367957293f / 8.0), - FL2FXCONST_SGL(-0.11522938140034f / 8.0)}, - {FL2FXCONST_SGL(0.54840422910309f / 8.0), - FL2FXCONST_SGL(0.75221367176302f / 8.0)}, - {FL2FXCONST_SGL(0.40009252867955f / 8.0), - FL2FXCONST_SGL(-0.98929400334421f / 8.0)}, - {FL2FXCONST_SGL(-0.99867974711855f / 8.0), - FL2FXCONST_SGL(-0.88147068645358f / 8.0)}, - {FL2FXCONST_SGL(-0.95531076805040f / 8.0), - FL2FXCONST_SGL(0.90908757154593f / 8.0)}, - {FL2FXCONST_SGL(-0.45725933317144f / 8.0), - FL2FXCONST_SGL(-0.56716323646760f / 8.0)}, - {FL2FXCONST_SGL(-0.72929675029275f / 8.0), - FL2FXCONST_SGL(-0.98008272727324f / 8.0)}, - {FL2FXCONST_SGL(0.75622801399036f / 8.0), - FL2FXCONST_SGL(0.20950329995549f / 8.0)}, - {FL2FXCONST_SGL(0.07069442601050f / 8.0), - FL2FXCONST_SGL(-0.78247898470706f / 8.0)}, - {FL2FXCONST_SGL(0.74496252926055f / 8.0), - FL2FXCONST_SGL(-0.91169004445807f / 8.0)}, - {FL2FXCONST_SGL(-0.96440182703856f / 8.0), - FL2FXCONST_SGL(-0.94739918296622f / 8.0)}, - {FL2FXCONST_SGL(0.30424629369539f / 8.0), - FL2FXCONST_SGL(-0.49438267012479f / 8.0)}, - {FL2FXCONST_SGL(0.66565033746925f / 8.0), - FL2FXCONST_SGL(0.64652935542491f / 8.0)}, - {FL2FXCONST_SGL(0.91697008020594f / 8.0), - FL2FXCONST_SGL(0.17514097332009f / 8.0)}, - {FL2FXCONST_SGL(-0.70774918760427f / 8.0), - FL2FXCONST_SGL(0.52548653416543f / 8.0)}, - {FL2FXCONST_SGL(-0.70051415345560f / 8.0), - FL2FXCONST_SGL(-0.45340028808763f / 8.0)}, - {FL2FXCONST_SGL(-0.99496513054797f / 8.0), - FL2FXCONST_SGL(-0.90071908066973f / 8.0)}, - {FL2FXCONST_SGL(0.98164490790123f / 8.0), - FL2FXCONST_SGL(-0.77463155528697f / 8.0)}, - {FL2FXCONST_SGL(-0.54671580548181f / 8.0), - FL2FXCONST_SGL(-0.02570928536004f / 8.0)}, - {FL2FXCONST_SGL(-0.01689629065389f / 8.0), - FL2FXCONST_SGL(0.00287506445732f / 8.0)}, - {FL2FXCONST_SGL(-0.86110349531986f / 8.0), - FL2FXCONST_SGL(0.42548583726477f / 8.0)}, - {FL2FXCONST_SGL(-0.98892980586032f / 8.0), - FL2FXCONST_SGL(-0.87881132267556f / 8.0)}, - {FL2FXCONST_SGL(0.51756627678691f / 8.0), - FL2FXCONST_SGL(0.66926784710139f / 8.0)}, - {FL2FXCONST_SGL(-0.99635026409640f / 8.0), - FL2FXCONST_SGL(-0.58107730574765f / 8.0)}, - {FL2FXCONST_SGL(-0.99969370862163f / 8.0), - FL2FXCONST_SGL(0.98369989360250f / 8.0)}, - {FL2FXCONST_SGL(0.55266258627194f / 8.0), - FL2FXCONST_SGL(0.59449057465591f / 8.0)}, - {FL2FXCONST_SGL(0.34581177741673f / 8.0), - FL2FXCONST_SGL(0.94879421061866f / 8.0)}, - {FL2FXCONST_SGL(0.62664209577999f / 8.0), - FL2FXCONST_SGL(-0.74402970906471f / 8.0)}, - {FL2FXCONST_SGL(-0.77149701404973f / 8.0), - FL2FXCONST_SGL(-0.33883658042801f / 8.0)}, - {FL2FXCONST_SGL(-0.91592244254432f / 8.0), - FL2FXCONST_SGL(0.03687901376713f / 8.0)}, - {FL2FXCONST_SGL(-0.76285492357887f / 8.0), - FL2FXCONST_SGL(-0.91371867919124f / 8.0)}, - {FL2FXCONST_SGL(0.79788337195331f / 8.0), - FL2FXCONST_SGL(-0.93180971199849f / 8.0)}, - {FL2FXCONST_SGL(0.54473080610200f / 8.0), - FL2FXCONST_SGL(-0.11919206037186f / 8.0)}, - {FL2FXCONST_SGL(-0.85639281671058f / 8.0), - FL2FXCONST_SGL(0.42429854760451f / 8.0)}, - {FL2FXCONST_SGL(-0.92882402971423f / 8.0), - FL2FXCONST_SGL(0.27871809078609f / 8.0)}, - {FL2FXCONST_SGL(-0.11708371046774f / 8.0), - FL2FXCONST_SGL(-0.99800843444966f / 8.0)}, - {FL2FXCONST_SGL(0.21356749817493f / 8.0), - FL2FXCONST_SGL(-0.90716295627033f / 8.0)}, - {FL2FXCONST_SGL(-0.76191692573909f / 8.0), - FL2FXCONST_SGL(0.99768118356265f / 8.0)}, - {FL2FXCONST_SGL(0.98111043100884f / 8.0), - FL2FXCONST_SGL(-0.95854459734407f / 8.0)}, - {FL2FXCONST_SGL(-0.85913269895572f / 8.0), - FL2FXCONST_SGL(0.95766566168880f / 8.0)}, - {FL2FXCONST_SGL(-0.93307242253692f / 8.0), - FL2FXCONST_SGL(0.49431757696466f / 8.0)}, - {FL2FXCONST_SGL(0.30485754879632f / 8.0), - FL2FXCONST_SGL(-0.70540034357529f / 8.0)}, - {FL2FXCONST_SGL(0.85289650925190f / 8.0), - FL2FXCONST_SGL(0.46766131791044f / 8.0)}, - {FL2FXCONST_SGL(0.91328082618125f / 8.0), - FL2FXCONST_SGL(-0.99839597361769f / 8.0)}, - {FL2FXCONST_SGL(-0.05890199924154f / 8.0), - FL2FXCONST_SGL(0.70741827819497f / 8.0)}, - {FL2FXCONST_SGL(0.28398686150148f / 8.0), - FL2FXCONST_SGL(0.34633555702188f / 8.0)}, - {FL2FXCONST_SGL(0.95258164539612f / 8.0), - FL2FXCONST_SGL(-0.54893416026939f / 8.0)}, - {FL2FXCONST_SGL(-0.78566324168507f / 8.0), - FL2FXCONST_SGL(-0.75568541079691f / 8.0)}, - {FL2FXCONST_SGL(-0.95789495447877f / 8.0), - FL2FXCONST_SGL(-0.20423194696966f / 8.0)}, - {FL2FXCONST_SGL(0.82411158711197f / 8.0), - FL2FXCONST_SGL(0.96654618432562f / 8.0)}, - {FL2FXCONST_SGL(-0.65185446735885f / 8.0), - FL2FXCONST_SGL(-0.88734990773289f / 8.0)}, - {FL2FXCONST_SGL(-0.93643603134666f / 8.0), - FL2FXCONST_SGL(0.99870790442385f / 8.0)}, - {FL2FXCONST_SGL(0.91427159529618f / 8.0), - FL2FXCONST_SGL(-0.98290505544444f / 8.0)}, - {FL2FXCONST_SGL(-0.70395684036886f / 8.0), - FL2FXCONST_SGL(0.58796798221039f / 8.0)}, - {FL2FXCONST_SGL(0.00563771969365f / 8.0), - FL2FXCONST_SGL(0.61768196727244f / 8.0)}, - {FL2FXCONST_SGL(0.89065051931895f / 8.0), - FL2FXCONST_SGL(0.52783352697585f / 8.0)}, - {FL2FXCONST_SGL(-0.68683707712762f / 8.0), - FL2FXCONST_SGL(0.80806944710339f / 8.0)}, - {FL2FXCONST_SGL(0.72165342518718f / 8.0), - FL2FXCONST_SGL(-0.69259857349564f / 8.0)}, - {FL2FXCONST_SGL(-0.62928247730667f / 8.0), - FL2FXCONST_SGL(0.13627037407335f / 8.0)}, - {FL2FXCONST_SGL(0.29938434065514f / 8.0), - FL2FXCONST_SGL(-0.46051329682246f / 8.0)}, - {FL2FXCONST_SGL(-0.91781958879280f / 8.0), - FL2FXCONST_SGL(-0.74012716684186f / 8.0)}, - {FL2FXCONST_SGL(0.99298717043688f / 8.0), - FL2FXCONST_SGL(0.40816610075661f / 8.0)}, - {FL2FXCONST_SGL(0.82368298622748f / 8.0), - FL2FXCONST_SGL(-0.74036047190173f / 8.0)}, - {FL2FXCONST_SGL(-0.98512833386833f / 8.0), - FL2FXCONST_SGL(-0.99972330709594f / 8.0)}, - {FL2FXCONST_SGL(-0.95915368242257f / 8.0), - FL2FXCONST_SGL(-0.99237800466040f / 8.0)}, - {FL2FXCONST_SGL(-0.21411126572790f / 8.0), - FL2FXCONST_SGL(-0.93424819052545f / 8.0)}, - {FL2FXCONST_SGL(-0.68821476106884f / 8.0), - FL2FXCONST_SGL(-0.26892306315457f / 8.0)}, - {FL2FXCONST_SGL(0.91851997982317f / 8.0), - FL2FXCONST_SGL(0.09358228901785f / 8.0)}, - {FL2FXCONST_SGL(-0.96062769559127f / 8.0), - FL2FXCONST_SGL(0.36099095133739f / 8.0)}, - {FL2FXCONST_SGL(0.51646184922287f / 8.0), - FL2FXCONST_SGL(-0.71373332873917f / 8.0)}, - {FL2FXCONST_SGL(0.61130721139669f / 8.0), - FL2FXCONST_SGL(0.46950141175917f / 8.0)}, - {FL2FXCONST_SGL(0.47336129371299f / 8.0), - FL2FXCONST_SGL(-0.27333178296162f / 8.0)}, - {FL2FXCONST_SGL(0.90998308703519f / 8.0), - FL2FXCONST_SGL(0.96715662938132f / 8.0)}, - {FL2FXCONST_SGL(0.44844799194357f / 8.0), - FL2FXCONST_SGL(0.99211574628306f / 8.0)}, - {FL2FXCONST_SGL(0.66614891079092f / 8.0), - FL2FXCONST_SGL(0.96590176169121f / 8.0)}, - {FL2FXCONST_SGL(0.74922239129237f / 8.0), - FL2FXCONST_SGL(-0.89879858826087f / 8.0)}, - {FL2FXCONST_SGL(-0.99571588506485f / 8.0), - FL2FXCONST_SGL(0.52785521494349f / 8.0)}, - {FL2FXCONST_SGL(0.97401082477563f / 8.0), - FL2FXCONST_SGL(-0.16855870075190f / 8.0)}, - {FL2FXCONST_SGL(0.72683747733879f / 8.0), - FL2FXCONST_SGL(-0.48060774432251f / 8.0)}, - {FL2FXCONST_SGL(0.95432193457128f / 8.0), - FL2FXCONST_SGL(0.68849603408441f / 8.0)}, - {FL2FXCONST_SGL(-0.72962208425191f / 8.0), - FL2FXCONST_SGL(-0.76608443420917f / 8.0)}, - {FL2FXCONST_SGL(-0.85359479233537f / 8.0), - FL2FXCONST_SGL(0.88738125901579f / 8.0)}, - {FL2FXCONST_SGL(-0.81412430338535f / 8.0), - FL2FXCONST_SGL(-0.97480768049637f / 8.0)}, - {FL2FXCONST_SGL(-0.87930772356786f / 8.0), - FL2FXCONST_SGL(0.74748307690436f / 8.0)}, - {FL2FXCONST_SGL(-0.71573331064977f / 8.0), - FL2FXCONST_SGL(-0.98570608178923f / 8.0)}, - {FL2FXCONST_SGL(0.83524300028228f / 8.0), - FL2FXCONST_SGL(0.83702537075163f / 8.0)}, - {FL2FXCONST_SGL(-0.48086065601423f / 8.0), - FL2FXCONST_SGL(-0.98848504923531f / 8.0)}, - {FL2FXCONST_SGL(0.97139128574778f / 8.0), - FL2FXCONST_SGL(0.80093621198236f / 8.0)}, - {FL2FXCONST_SGL(0.51992825347895f / 8.0), - FL2FXCONST_SGL(0.80247631400510f / 8.0)}, - {FL2FXCONST_SGL(-0.00848591195325f / 8.0), - FL2FXCONST_SGL(-0.76670128000486f / 8.0)}, - {FL2FXCONST_SGL(-0.70294374303036f / 8.0), - FL2FXCONST_SGL(0.55359910445577f / 8.0)}, - {FL2FXCONST_SGL(-0.95894428168140f / 8.0), - FL2FXCONST_SGL(-0.43265504344783f / 8.0)}, - {FL2FXCONST_SGL(0.97079252950321f / 8.0), - FL2FXCONST_SGL(0.09325857238682f / 8.0)}, - {FL2FXCONST_SGL(-0.92404293670797f / 8.0), - FL2FXCONST_SGL(0.85507704027855f / 8.0)}, - {FL2FXCONST_SGL(-0.69506469500450f / 8.0), - FL2FXCONST_SGL(0.98633412625459f / 8.0)}, - {FL2FXCONST_SGL(0.26559203620024f / 8.0), - FL2FXCONST_SGL(0.73314307966524f / 8.0)}, - {FL2FXCONST_SGL(0.28038443336943f / 8.0), - FL2FXCONST_SGL(0.14537913654427f / 8.0)}, - {FL2FXCONST_SGL(-0.74138124825523f / 8.0), - FL2FXCONST_SGL(0.99310339807762f / 8.0)}, - {FL2FXCONST_SGL(-0.01752795995444f / 8.0), - FL2FXCONST_SGL(-0.82616635284178f / 8.0)}, - {FL2FXCONST_SGL(-0.55126773094930f / 8.0), - FL2FXCONST_SGL(-0.98898543862153f / 8.0)}, - {FL2FXCONST_SGL(0.97960898850996f / 8.0), - FL2FXCONST_SGL(-0.94021446752851f / 8.0)}, - {FL2FXCONST_SGL(-0.99196309146936f / 8.0), - FL2FXCONST_SGL(0.67019017358456f / 8.0)}, - {FL2FXCONST_SGL(-0.67684928085260f / 8.0), - FL2FXCONST_SGL(0.12631491649378f / 8.0)}, - {FL2FXCONST_SGL(0.09140039465500f / 8.0), - FL2FXCONST_SGL(-0.20537731453108f / 8.0)}, - {FL2FXCONST_SGL(-0.71658965751996f / 8.0), - FL2FXCONST_SGL(-0.97788200391224f / 8.0)}, - {FL2FXCONST_SGL(0.81014640078925f / 8.0), - FL2FXCONST_SGL(0.53722648362443f / 8.0)}, - {FL2FXCONST_SGL(0.40616991671205f / 8.0), - FL2FXCONST_SGL(-0.26469008598449f / 8.0)}, - {FL2FXCONST_SGL(-0.67680188682972f / 8.0), - FL2FXCONST_SGL(0.94502052337695f / 8.0)}, - {FL2FXCONST_SGL(0.86849774348749f / 8.0), - FL2FXCONST_SGL(-0.18333598647899f / 8.0)}, - {FL2FXCONST_SGL(-0.99500381284851f / 8.0), - FL2FXCONST_SGL(-0.02634122068550f / 8.0)}, - {FL2FXCONST_SGL(0.84329189340667f / 8.0), - FL2FXCONST_SGL(0.10406957462213f / 8.0)}, - {FL2FXCONST_SGL(-0.09215968531446f / 8.0), - FL2FXCONST_SGL(0.69540012101253f / 8.0)}, - {FL2FXCONST_SGL(0.99956173327206f / 8.0), - FL2FXCONST_SGL(-0.12358542001404f / 8.0)}, - {FL2FXCONST_SGL(-0.79732779473535f / 8.0), - FL2FXCONST_SGL(-0.91582524736159f / 8.0)}, - {FL2FXCONST_SGL(0.96349973642406f / 8.0), - FL2FXCONST_SGL(0.96640458041000f / 8.0)}, - {FL2FXCONST_SGL(-0.79942778496547f / 8.0), - FL2FXCONST_SGL(0.64323902822857f / 8.0)}, - {FL2FXCONST_SGL(-0.11566039853896f / 8.0), - FL2FXCONST_SGL(0.28587846253726f / 8.0)}, - {FL2FXCONST_SGL(-0.39922954514662f / 8.0), - FL2FXCONST_SGL(0.94129601616966f / 8.0)}, - {FL2FXCONST_SGL(0.99089197565987f / 8.0), - FL2FXCONST_SGL(-0.92062625581587f / 8.0)}, - {FL2FXCONST_SGL(0.28631285179909f / 8.0), - FL2FXCONST_SGL(-0.91035047143603f / 8.0)}, - {FL2FXCONST_SGL(-0.83302725605608f / 8.0), - FL2FXCONST_SGL(-0.67330410892084f / 8.0)}, - {FL2FXCONST_SGL(0.95404443402072f / 8.0), - FL2FXCONST_SGL(0.49162765398743f / 8.0)}, - {FL2FXCONST_SGL(-0.06449863579434f / 8.0), - FL2FXCONST_SGL(0.03250560813135f / 8.0)}, - {FL2FXCONST_SGL(-0.99575054486311f / 8.0), - FL2FXCONST_SGL(0.42389784469507f / 8.0)}, - {FL2FXCONST_SGL(-0.65501142790847f / 8.0), - FL2FXCONST_SGL(0.82546114655624f / 8.0)}, - {FL2FXCONST_SGL(-0.81254441908887f / 8.0), - FL2FXCONST_SGL(-0.51627234660629f / 8.0)}, - {FL2FXCONST_SGL(-0.99646369485481f / 8.0), - FL2FXCONST_SGL(0.84490533520752f / 8.0)}, - {FL2FXCONST_SGL(0.00287840603348f / 8.0), - FL2FXCONST_SGL(0.64768261158166f / 8.0)}, - {FL2FXCONST_SGL(0.70176989408455f / 8.0), - FL2FXCONST_SGL(-0.20453028573322f / 8.0)}, - {FL2FXCONST_SGL(0.96361882270190f / 8.0), - FL2FXCONST_SGL(0.40706967140989f / 8.0)}, - {FL2FXCONST_SGL(-0.68883758192426f / 8.0), - FL2FXCONST_SGL(0.91338958840772f / 8.0)}, - {FL2FXCONST_SGL(-0.34875585502238f / 8.0), - FL2FXCONST_SGL(0.71472290693300f / 8.0)}, - {FL2FXCONST_SGL(0.91980081243087f / 8.0), - FL2FXCONST_SGL(0.66507455644919f / 8.0)}, - {FL2FXCONST_SGL(-0.99009048343881f / 8.0), - FL2FXCONST_SGL(0.85868021604848f / 8.0)}, - {FL2FXCONST_SGL(0.68865791458395f / 8.0), - FL2FXCONST_SGL(0.55660316809678f / 8.0)}, - {FL2FXCONST_SGL(-0.99484402129368f / 8.0), - FL2FXCONST_SGL(-0.20052559254934f / 8.0)}, - {FL2FXCONST_SGL(0.94214511408023f / 8.0), - FL2FXCONST_SGL(-0.99696425367461f / 8.0)}, - {FL2FXCONST_SGL(-0.67414626793544f / 8.0), - FL2FXCONST_SGL(0.49548221180078f / 8.0)}, - {FL2FXCONST_SGL(-0.47339353684664f / 8.0), - FL2FXCONST_SGL(-0.85904328834047f / 8.0)}, - {FL2FXCONST_SGL(0.14323651387360f / 8.0), - FL2FXCONST_SGL(-0.94145598222488f / 8.0)}, - {FL2FXCONST_SGL(-0.29268293575672f / 8.0), - FL2FXCONST_SGL(0.05759224927952f / 8.0)}, - {FL2FXCONST_SGL(0.43793861458754f / 8.0), - FL2FXCONST_SGL(-0.78904969892724f / 8.0)}, - {FL2FXCONST_SGL(-0.36345126374441f / 8.0), - FL2FXCONST_SGL(0.64874435357162f / 8.0)}, - {FL2FXCONST_SGL(-0.08750604656825f / 8.0), - FL2FXCONST_SGL(0.97686944362527f / 8.0)}, - {FL2FXCONST_SGL(-0.96495267812511f / 8.0), - FL2FXCONST_SGL(-0.53960305946511f / 8.0)}, - {FL2FXCONST_SGL(0.55526940659947f / 8.0), - FL2FXCONST_SGL(0.78891523734774f / 8.0)}, - {FL2FXCONST_SGL(0.73538215752630f / 8.0), - FL2FXCONST_SGL(0.96452072373404f / 8.0)}, - {FL2FXCONST_SGL(-0.30889773919437f / 8.0), - FL2FXCONST_SGL(-0.80664389776860f / 8.0)}, - {FL2FXCONST_SGL(0.03574995626194f / 8.0), - FL2FXCONST_SGL(-0.97325616900959f / 8.0)}, - {FL2FXCONST_SGL(0.98720684660488f / 8.0), - FL2FXCONST_SGL(0.48409133691962f / 8.0)}, - {FL2FXCONST_SGL(-0.81689296271203f / 8.0), - FL2FXCONST_SGL(-0.90827703628298f / 8.0)}, - {FL2FXCONST_SGL(0.67866860118215f / 8.0), - FL2FXCONST_SGL(0.81284503870856f / 8.0)}, - {FL2FXCONST_SGL(-0.15808569732583f / 8.0), - FL2FXCONST_SGL(0.85279555024382f / 8.0)}, - {FL2FXCONST_SGL(0.80723395114371f / 8.0), - FL2FXCONST_SGL(-0.24717418514605f / 8.0)}, - {FL2FXCONST_SGL(0.47788757329038f / 8.0), - FL2FXCONST_SGL(-0.46333147839295f / 8.0)}, - {FL2FXCONST_SGL(0.96367554763201f / 8.0), - FL2FXCONST_SGL(0.38486749303242f / 8.0)}, - {FL2FXCONST_SGL(-0.99143875716818f / 8.0), - FL2FXCONST_SGL(-0.24945277239809f / 8.0)}, - {FL2FXCONST_SGL(0.83081876925833f / 8.0), - FL2FXCONST_SGL(-0.94780851414763f / 8.0)}, - {FL2FXCONST_SGL(-0.58753191905341f / 8.0), - FL2FXCONST_SGL(0.01290772389163f / 8.0)}, - {FL2FXCONST_SGL(0.95538108220960f / 8.0), - FL2FXCONST_SGL(-0.85557052096538f / 8.0)}, - {FL2FXCONST_SGL(-0.96490920476211f / 8.0), - FL2FXCONST_SGL(-0.64020970923102f / 8.0)}, - {FL2FXCONST_SGL(-0.97327101028521f / 8.0), - FL2FXCONST_SGL(0.12378128133110f / 8.0)}, - {FL2FXCONST_SGL(0.91400366022124f / 8.0), - FL2FXCONST_SGL(0.57972471346930f / 8.0)}, - {FL2FXCONST_SGL(-0.99925837363824f / 8.0), - FL2FXCONST_SGL(0.71084847864067f / 8.0)}, - {FL2FXCONST_SGL(-0.86875903507313f / 8.0), - FL2FXCONST_SGL(-0.20291699203564f / 8.0)}, - {FL2FXCONST_SGL(-0.26240034795124f / 8.0), - FL2FXCONST_SGL(-0.68264554369108f / 8.0)}, - {FL2FXCONST_SGL(-0.24664412953388f / 8.0), - FL2FXCONST_SGL(-0.87642273115183f / 8.0)}, - {FL2FXCONST_SGL(0.02416275806869f / 8.0), - FL2FXCONST_SGL(0.27192914288905f / 8.0)}, - {FL2FXCONST_SGL(0.82068619590515f / 8.0), - FL2FXCONST_SGL(-0.85087787994476f / 8.0)}, - {FL2FXCONST_SGL(0.88547373760759f / 8.0), - FL2FXCONST_SGL(-0.89636802901469f / 8.0)}, - {FL2FXCONST_SGL(-0.18173078152226f / 8.0), - FL2FXCONST_SGL(-0.26152145156800f / 8.0)}, - {FL2FXCONST_SGL(0.09355476558534f / 8.0), - FL2FXCONST_SGL(0.54845123045604f / 8.0)}, - {FL2FXCONST_SGL(-0.54668414224090f / 8.0), - FL2FXCONST_SGL(0.95980774020221f / 8.0)}, - {FL2FXCONST_SGL(0.37050990604091f / 8.0), - FL2FXCONST_SGL(-0.59910140383171f / 8.0)}, - {FL2FXCONST_SGL(-0.70373594262891f / 8.0), - FL2FXCONST_SGL(0.91227665827081f / 8.0)}, - {FL2FXCONST_SGL(-0.34600785879594f / 8.0), - FL2FXCONST_SGL(-0.99441426144200f / 8.0)}, - {FL2FXCONST_SGL(-0.68774481731008f / 8.0), - FL2FXCONST_SGL(-0.30238837956299f / 8.0)}, - {FL2FXCONST_SGL(-0.26843291251234f / 8.0), - FL2FXCONST_SGL(0.83115668004362f / 8.0)}, - {FL2FXCONST_SGL(0.49072334613242f / 8.0), - FL2FXCONST_SGL(-0.45359708737775f / 8.0)}, - {FL2FXCONST_SGL(0.38975993093975f / 8.0), - FL2FXCONST_SGL(0.95515358099121f / 8.0)}, - {FL2FXCONST_SGL(-0.97757125224150f / 8.0), - FL2FXCONST_SGL(0.05305894580606f / 8.0)}, - {FL2FXCONST_SGL(-0.17325552859616f / 8.0), - FL2FXCONST_SGL(-0.92770672250494f / 8.0)}, - {FL2FXCONST_SGL(0.99948035025744f / 8.0), - FL2FXCONST_SGL(0.58285545563426f / 8.0)}, - {FL2FXCONST_SGL(-0.64946246527458f / 8.0), - FL2FXCONST_SGL(0.68645507104960f / 8.0)}, - {FL2FXCONST_SGL(-0.12016920576437f / 8.0), - FL2FXCONST_SGL(-0.57147322153312f / 8.0)}, - {FL2FXCONST_SGL(-0.58947456517751f / 8.0), - FL2FXCONST_SGL(-0.34847132454388f / 8.0)}, - {FL2FXCONST_SGL(-0.41815140454465f / 8.0), - FL2FXCONST_SGL(0.16276422358861f / 8.0)}, - {FL2FXCONST_SGL(0.99885650204884f / 8.0), - FL2FXCONST_SGL(0.11136095490444f / 8.0)}, - {FL2FXCONST_SGL(-0.56649614128386f / 8.0), - FL2FXCONST_SGL(-0.90494866361587f / 8.0)}, - {FL2FXCONST_SGL(0.94138021032330f / 8.0), - FL2FXCONST_SGL(0.35281916733018f / 8.0)}, - {FL2FXCONST_SGL(-0.75725076534641f / 8.0), - FL2FXCONST_SGL(0.53650549640587f / 8.0)}, - {FL2FXCONST_SGL(0.20541973692630f / 8.0), - FL2FXCONST_SGL(-0.94435144369918f / 8.0)}, - {FL2FXCONST_SGL(0.99980371023351f / 8.0), - FL2FXCONST_SGL(0.79835913565599f / 8.0)}, - {FL2FXCONST_SGL(0.29078277605775f / 8.0), - FL2FXCONST_SGL(0.35393777921520f / 8.0)}, - {FL2FXCONST_SGL(-0.62858772103030f / 8.0), - FL2FXCONST_SGL(0.38765693387102f / 8.0)}, - {FL2FXCONST_SGL(0.43440904467688f / 8.0), - FL2FXCONST_SGL(-0.98546330463232f / 8.0)}, - {FL2FXCONST_SGL(-0.98298583762390f / 8.0), - FL2FXCONST_SGL(0.21021524625209f / 8.0)}, - {FL2FXCONST_SGL(0.19513029146934f / 8.0), - FL2FXCONST_SGL(-0.94239832251867f / 8.0)}, - {FL2FXCONST_SGL(-0.95476662400101f / 8.0), - FL2FXCONST_SGL(0.98364554179143f / 8.0)}, - {FL2FXCONST_SGL(0.93379635304810f / 8.0), - FL2FXCONST_SGL(-0.70881994583682f / 8.0)}, - {FL2FXCONST_SGL(-0.85235410573336f / 8.0), - FL2FXCONST_SGL(-0.08342347966410f / 8.0)}, - {FL2FXCONST_SGL(-0.86425093011245f / 8.0), - FL2FXCONST_SGL(-0.45795025029466f / 8.0)}, - {FL2FXCONST_SGL(0.38879779059045f / 8.0), - FL2FXCONST_SGL(0.97274429344593f / 8.0)}, - {FL2FXCONST_SGL(0.92045124735495f / 8.0), - FL2FXCONST_SGL(-0.62433652524220f / 8.0)}, - {FL2FXCONST_SGL(0.89162532251878f / 8.0), - FL2FXCONST_SGL(0.54950955570563f / 8.0)}, - {FL2FXCONST_SGL(-0.36834336949252f / 8.0), - FL2FXCONST_SGL(0.96458298020975f / 8.0)}, - {FL2FXCONST_SGL(0.93891760988045f / 8.0), - FL2FXCONST_SGL(-0.89968353740388f / 8.0)}, - {FL2FXCONST_SGL(0.99267657565094f / 8.0), - FL2FXCONST_SGL(-0.03757034316958f / 8.0)}, - {FL2FXCONST_SGL(-0.94063471614176f / 8.0), - FL2FXCONST_SGL(0.41332338538963f / 8.0)}, - {FL2FXCONST_SGL(0.99740224117019f / 8.0), - FL2FXCONST_SGL(-0.16830494996370f / 8.0)}, - {FL2FXCONST_SGL(-0.35899413170555f / 8.0), - FL2FXCONST_SGL(-0.46633226649613f / 8.0)}, - {FL2FXCONST_SGL(0.05237237274947f / 8.0), - FL2FXCONST_SGL(-0.25640361602661f / 8.0)}, - {FL2FXCONST_SGL(0.36703583957424f / 8.0), - FL2FXCONST_SGL(-0.38653265641875f / 8.0)}, - {FL2FXCONST_SGL(0.91653180367913f / 8.0), - FL2FXCONST_SGL(-0.30587628726597f / 8.0)}, - {FL2FXCONST_SGL(0.69000803499316f / 8.0), - FL2FXCONST_SGL(0.90952171386132f / 8.0)}, - {FL2FXCONST_SGL(-0.38658751133527f / 8.0), - FL2FXCONST_SGL(0.99501571208985f / 8.0)}, - {FL2FXCONST_SGL(-0.29250814029851f / 8.0), - FL2FXCONST_SGL(0.37444994344615f / 8.0)}, - {FL2FXCONST_SGL(-0.60182204677608f / 8.0), - FL2FXCONST_SGL(0.86779651036123f / 8.0)}, - {FL2FXCONST_SGL(-0.97418588163217f / 8.0), - FL2FXCONST_SGL(0.96468523666475f / 8.0)}, - {FL2FXCONST_SGL(0.88461574003963f / 8.0), - FL2FXCONST_SGL(0.57508405276414f / 8.0)}, - {FL2FXCONST_SGL(0.05198933055162f / 8.0), - FL2FXCONST_SGL(0.21269661669964f / 8.0)}, - {FL2FXCONST_SGL(-0.53499621979720f / 8.0), - FL2FXCONST_SGL(0.97241553731237f / 8.0)}, - {FL2FXCONST_SGL(-0.49429560226497f / 8.0), - FL2FXCONST_SGL(0.98183865291903f / 8.0)}, - {FL2FXCONST_SGL(-0.98935142339139f / 8.0), - FL2FXCONST_SGL(-0.40249159006933f / 8.0)}, - {FL2FXCONST_SGL(-0.98081380091130f / 8.0), - FL2FXCONST_SGL(-0.72856895534041f / 8.0)}, - {FL2FXCONST_SGL(-0.27338148835532f / 8.0), - FL2FXCONST_SGL(0.99950922447209f / 8.0)}, - {FL2FXCONST_SGL(0.06310802338302f / 8.0), - FL2FXCONST_SGL(-0.54539587529618f / 8.0)}, - {FL2FXCONST_SGL(-0.20461677199539f / 8.0), - FL2FXCONST_SGL(-0.14209977628489f / 8.0)}, - {FL2FXCONST_SGL(0.66223843141647f / 8.0), - FL2FXCONST_SGL(0.72528579940326f / 8.0)}, - {FL2FXCONST_SGL(-0.84764345483665f / 8.0), - FL2FXCONST_SGL(0.02372316801261f / 8.0)}, - {FL2FXCONST_SGL(-0.89039863483811f / 8.0), - FL2FXCONST_SGL(0.88866581484602f / 8.0)}, - {FL2FXCONST_SGL(0.95903308477986f / 8.0), - FL2FXCONST_SGL(0.76744927173873f / 8.0)}, - {FL2FXCONST_SGL(0.73504123909879f / 8.0), - FL2FXCONST_SGL(-0.03747203173192f / 8.0)}, - {FL2FXCONST_SGL(-0.31744434966056f / 8.0), - FL2FXCONST_SGL(-0.36834111883652f / 8.0)}, - {FL2FXCONST_SGL(-0.34110827591623f / 8.0), - FL2FXCONST_SGL(0.40211222807691f / 8.0)}, - {FL2FXCONST_SGL(0.47803883714199f / 8.0), - FL2FXCONST_SGL(-0.39423219786288f / 8.0)}, - {FL2FXCONST_SGL(0.98299195879514f / 8.0), - FL2FXCONST_SGL(0.01989791390047f / 8.0)}, - {FL2FXCONST_SGL(-0.30963073129751f / 8.0), - FL2FXCONST_SGL(-0.18076720599336f / 8.0)}, - {FL2FXCONST_SGL(0.99992588229018f / 8.0), - FL2FXCONST_SGL(-0.26281872094289f / 8.0)}, - {FL2FXCONST_SGL(-0.93149731080767f / 8.0), - FL2FXCONST_SGL(-0.98313162570490f / 8.0)}, - {FL2FXCONST_SGL(0.99923472302773f / 8.0), - FL2FXCONST_SGL(-0.80142993767554f / 8.0)}, - {FL2FXCONST_SGL(-0.26024169633417f / 8.0), - FL2FXCONST_SGL(-0.75999759855752f / 8.0)}, - {FL2FXCONST_SGL(-0.35712514743563f / 8.0), - FL2FXCONST_SGL(0.19298963768574f / 8.0)}, - {FL2FXCONST_SGL(-0.99899084509530f / 8.0), - FL2FXCONST_SGL(0.74645156992493f / 8.0)}, - {FL2FXCONST_SGL(0.86557171579452f / 8.0), - FL2FXCONST_SGL(0.55593866696299f / 8.0)}, - {FL2FXCONST_SGL(0.33408042438752f / 8.0), - FL2FXCONST_SGL(0.86185953874709f / 8.0)}, - {FL2FXCONST_SGL(0.99010736374716f / 8.0), - FL2FXCONST_SGL(0.04602397576623f / 8.0)}, - {FL2FXCONST_SGL(-0.66694269691195f / 8.0), - FL2FXCONST_SGL(-0.91643611810148f / 8.0)}, - {FL2FXCONST_SGL(0.64016792079480f / 8.0), - FL2FXCONST_SGL(0.15649530836856f / 8.0)}, - {FL2FXCONST_SGL(0.99570534804836f / 8.0), - FL2FXCONST_SGL(0.45844586038111f / 8.0)}, - {FL2FXCONST_SGL(-0.63431466947340f / 8.0), - FL2FXCONST_SGL(0.21079116459234f / 8.0)}, - {FL2FXCONST_SGL(-0.07706847005931f / 8.0), - FL2FXCONST_SGL(-0.89581437101329f / 8.0)}, - {FL2FXCONST_SGL(0.98590090577724f / 8.0), - FL2FXCONST_SGL(0.88241721133981f / 8.0)}, - {FL2FXCONST_SGL(0.80099335254678f / 8.0), - FL2FXCONST_SGL(-0.36851896710853f / 8.0)}, - {FL2FXCONST_SGL(0.78368131392666f / 8.0), - FL2FXCONST_SGL(0.45506999802597f / 8.0)}, - {FL2FXCONST_SGL(0.08707806671691f / 8.0), - FL2FXCONST_SGL(0.80938994918745f / 8.0)}, - {FL2FXCONST_SGL(-0.86811883080712f / 8.0), - FL2FXCONST_SGL(0.39347308654705f / 8.0)}, - {FL2FXCONST_SGL(-0.39466529740375f / 8.0), - FL2FXCONST_SGL(-0.66809432114456f / 8.0)}, - {FL2FXCONST_SGL(0.97875325649683f / 8.0), - FL2FXCONST_SGL(-0.72467840967746f / 8.0)}, - {FL2FXCONST_SGL(-0.95038560288864f / 8.0), - FL2FXCONST_SGL(0.89563219587625f / 8.0)}, - {FL2FXCONST_SGL(0.17005239424212f / 8.0), - FL2FXCONST_SGL(0.54683053962658f / 8.0)}, - {FL2FXCONST_SGL(-0.76910792026848f / 8.0), - FL2FXCONST_SGL(-0.96226617549298f / 8.0)}, - {FL2FXCONST_SGL(0.99743281016846f / 8.0), - FL2FXCONST_SGL(0.42697157037567f / 8.0)}, - {FL2FXCONST_SGL(0.95437383549973f / 8.0), - FL2FXCONST_SGL(0.97002324109952f / 8.0)}, - {FL2FXCONST_SGL(0.99578905365569f / 8.0), - FL2FXCONST_SGL(-0.54106826257356f / 8.0)}, - {FL2FXCONST_SGL(0.28058259829990f / 8.0), - FL2FXCONST_SGL(-0.85361420634036f / 8.0)}, - {FL2FXCONST_SGL(0.85256524470573f / 8.0), - FL2FXCONST_SGL(-0.64567607735589f / 8.0)}, - {FL2FXCONST_SGL(-0.50608540105128f / 8.0), - FL2FXCONST_SGL(-0.65846015480300f / 8.0)}, - {FL2FXCONST_SGL(-0.97210735183243f / 8.0), - FL2FXCONST_SGL(-0.23095213067791f / 8.0)}, - {FL2FXCONST_SGL(0.95424048234441f / 8.0), - FL2FXCONST_SGL(-0.99240147091219f / 8.0)}, - {FL2FXCONST_SGL(-0.96926570524023f / 8.0), - FL2FXCONST_SGL(0.73775654896574f / 8.0)}, - {FL2FXCONST_SGL(0.30872163214726f / 8.0), - FL2FXCONST_SGL(0.41514960556126f / 8.0)}, - {FL2FXCONST_SGL(-0.24523839572639f / 8.0), - FL2FXCONST_SGL(0.63206633394807f / 8.0)}, - {FL2FXCONST_SGL(-0.33813265086024f / 8.0), - FL2FXCONST_SGL(-0.38661779441897f / 8.0)}, - {FL2FXCONST_SGL(-0.05826828420146f / 8.0), - FL2FXCONST_SGL(-0.06940774188029f / 8.0)}, - {FL2FXCONST_SGL(-0.22898461455054f / 8.0), - FL2FXCONST_SGL(0.97054853316316f / 8.0)}, - {FL2FXCONST_SGL(-0.18509915019881f / 8.0), - FL2FXCONST_SGL(0.47565762892084f / 8.0)}, - {FL2FXCONST_SGL(-0.10488238045009f / 8.0), - FL2FXCONST_SGL(-0.87769947402394f / 8.0)}, - {FL2FXCONST_SGL(-0.71886586182037f / 8.0), - FL2FXCONST_SGL(0.78030982480538f / 8.0)}, - {FL2FXCONST_SGL(0.99793873738654f / 8.0), - FL2FXCONST_SGL(0.90041310491497f / 8.0)}, - {FL2FXCONST_SGL(0.57563307626120f / 8.0), - FL2FXCONST_SGL(-0.91034337352097f / 8.0)}, - {FL2FXCONST_SGL(0.28909646383717f / 8.0), - FL2FXCONST_SGL(0.96307783970534f / 8.0)}, - {FL2FXCONST_SGL(0.42188998312520f / 8.0), - FL2FXCONST_SGL(0.48148651230437f / 8.0)}, - {FL2FXCONST_SGL(0.93335049681047f / 8.0), - FL2FXCONST_SGL(-0.43537023883588f / 8.0)}, - {FL2FXCONST_SGL(-0.97087374418267f / 8.0), - FL2FXCONST_SGL(0.86636445711364f / 8.0)}, - {FL2FXCONST_SGL(0.36722871286923f / 8.0), - FL2FXCONST_SGL(0.65291654172961f / 8.0)}, - {FL2FXCONST_SGL(-0.81093025665696f / 8.0), - FL2FXCONST_SGL(0.08778370229363f / 8.0)}, - {FL2FXCONST_SGL(-0.26240603062237f / 8.0), - FL2FXCONST_SGL(-0.92774095379098f / 8.0)}, - {FL2FXCONST_SGL(0.83996497984604f / 8.0), - FL2FXCONST_SGL(0.55839849139647f / 8.0)}, - {FL2FXCONST_SGL(-0.99909615720225f / 8.0), - FL2FXCONST_SGL(-0.96024605713970f / 8.0)}, - {FL2FXCONST_SGL(0.74649464155061f / 8.0), - FL2FXCONST_SGL(0.12144893606462f / 8.0)}, - {FL2FXCONST_SGL(-0.74774595569805f / 8.0), - FL2FXCONST_SGL(-0.26898062008959f / 8.0)}, - {FL2FXCONST_SGL(0.95781667469567f / 8.0), - FL2FXCONST_SGL(-0.79047927052628f / 8.0)}, - {FL2FXCONST_SGL(0.95472308713099f / 8.0), - FL2FXCONST_SGL(-0.08588776019550f / 8.0)}, - {FL2FXCONST_SGL(0.48708332746299f / 8.0), - FL2FXCONST_SGL(0.99999041579432f / 8.0)}, - {FL2FXCONST_SGL(0.46332038247497f / 8.0), - FL2FXCONST_SGL(0.10964126185063f / 8.0)}, - {FL2FXCONST_SGL(-0.76497004940162f / 8.0), - FL2FXCONST_SGL(0.89210929242238f / 8.0)}, - {FL2FXCONST_SGL(0.57397389364339f / 8.0), - FL2FXCONST_SGL(0.35289703373760f / 8.0)}, - {FL2FXCONST_SGL(0.75374316974495f / 8.0), - FL2FXCONST_SGL(0.96705214651335f / 8.0)}, - {FL2FXCONST_SGL(-0.59174397685714f / 8.0), - FL2FXCONST_SGL(-0.89405370422752f / 8.0)}, - {FL2FXCONST_SGL(0.75087906691890f / 8.0), - FL2FXCONST_SGL(-0.29612672982396f / 8.0)}, - {FL2FXCONST_SGL(-0.98607857336230f / 8.0), - FL2FXCONST_SGL(0.25034911730023f / 8.0)}, - {FL2FXCONST_SGL(-0.40761056640505f / 8.0), - FL2FXCONST_SGL(-0.90045573444695f / 8.0)}, - {FL2FXCONST_SGL(0.66929266740477f / 8.0), - FL2FXCONST_SGL(0.98629493401748f / 8.0)}, - {FL2FXCONST_SGL(-0.97463695257310f / 8.0), - FL2FXCONST_SGL(-0.00190223301301f / 8.0)}, - {FL2FXCONST_SGL(0.90145509409859f / 8.0), - FL2FXCONST_SGL(0.99781390365446f / 8.0)}, - {FL2FXCONST_SGL(-0.87259289048043f / 8.0), - FL2FXCONST_SGL(0.99233587353666f / 8.0)}, - {FL2FXCONST_SGL(-0.91529461447692f / 8.0), - FL2FXCONST_SGL(-0.15698707534206f / 8.0)}, - {FL2FXCONST_SGL(-0.03305738840705f / 8.0), - FL2FXCONST_SGL(-0.37205262859764f / 8.0)}, - {FL2FXCONST_SGL(0.07223051368337f / 8.0), - FL2FXCONST_SGL(-0.88805001733626f / 8.0)}, - {FL2FXCONST_SGL(0.99498012188353f / 8.0), - FL2FXCONST_SGL(0.97094358113387f / 8.0)}, - {FL2FXCONST_SGL(-0.74904939500519f / 8.0), - FL2FXCONST_SGL(0.99985483641521f / 8.0)}, - {FL2FXCONST_SGL(0.04585228574211f / 8.0), - FL2FXCONST_SGL(0.99812337444082f / 8.0)}, - {FL2FXCONST_SGL(-0.89054954257993f / 8.0), - FL2FXCONST_SGL(-0.31791913188064f / 8.0)}, - {FL2FXCONST_SGL(-0.83782144651251f / 8.0), - FL2FXCONST_SGL(0.97637632547466f / 8.0)}, - {FL2FXCONST_SGL(0.33454804933804f / 8.0), - FL2FXCONST_SGL(-0.86231516800408f / 8.0)}, - {FL2FXCONST_SGL(-0.99707579362824f / 8.0), - FL2FXCONST_SGL(0.93237990079441f / 8.0)}, - {FL2FXCONST_SGL(-0.22827527843994f / 8.0), - FL2FXCONST_SGL(0.18874759397997f / 8.0)}, - {FL2FXCONST_SGL(0.67248046289143f / 8.0), - FL2FXCONST_SGL(-0.03646211390569f / 8.0)}, - {FL2FXCONST_SGL(-0.05146538187944f / 8.0), - FL2FXCONST_SGL(-0.92599700120679f / 8.0)}, - {FL2FXCONST_SGL(0.99947295749905f / 8.0), - FL2FXCONST_SGL(0.93625229707912f / 8.0)}, - {FL2FXCONST_SGL(0.66951124390363f / 8.0), - FL2FXCONST_SGL(0.98905825623893f / 8.0)}, - {FL2FXCONST_SGL(-0.99602956559179f / 8.0), - FL2FXCONST_SGL(-0.44654715757688f / 8.0)}, - {FL2FXCONST_SGL(0.82104905483590f / 8.0), - FL2FXCONST_SGL(0.99540741724928f / 8.0)}, - {FL2FXCONST_SGL(0.99186510988782f / 8.0), - FL2FXCONST_SGL(0.72023001312947f / 8.0)}, - {FL2FXCONST_SGL(-0.65284592392918f / 8.0), - FL2FXCONST_SGL(0.52186723253637f / 8.0)}, - {FL2FXCONST_SGL(0.93885443798188f / 8.0), - FL2FXCONST_SGL(-0.74895312615259f / 8.0)}, - {FL2FXCONST_SGL(0.96735248738388f / 8.0), - FL2FXCONST_SGL(0.90891816978629f / 8.0)}, - {FL2FXCONST_SGL(-0.22225968841114f / 8.0), - FL2FXCONST_SGL(0.57124029781228f / 8.0)}, - {FL2FXCONST_SGL(-0.44132783753414f / 8.0), - FL2FXCONST_SGL(-0.92688840659280f / 8.0)}, - {FL2FXCONST_SGL(-0.85694974219574f / 8.0), - FL2FXCONST_SGL(0.88844532719844f / 8.0)}, - {FL2FXCONST_SGL(0.91783042091762f / 8.0), - FL2FXCONST_SGL(-0.46356892383970f / 8.0)}, - {FL2FXCONST_SGL(0.72556974415690f / 8.0), - FL2FXCONST_SGL(-0.99899555770747f / 8.0)}, - {FL2FXCONST_SGL(-0.99711581834508f / 8.0), - FL2FXCONST_SGL(0.58211560180426f / 8.0)}, - {FL2FXCONST_SGL(0.77638976371966f / 8.0), - FL2FXCONST_SGL(0.94321834873819f / 8.0)}, - {FL2FXCONST_SGL(0.07717324253925f / 8.0), - FL2FXCONST_SGL(0.58638399856595f / 8.0)}, - {FL2FXCONST_SGL(-0.56049829194163f / 8.0), - FL2FXCONST_SGL(0.82522301569036f / 8.0)}, - {FL2FXCONST_SGL(0.98398893639988f / 8.0), - FL2FXCONST_SGL(0.39467440420569f / 8.0)}, - {FL2FXCONST_SGL(0.47546946844938f / 8.0), - FL2FXCONST_SGL(0.68613044836811f / 8.0)}, - {FL2FXCONST_SGL(0.65675089314631f / 8.0), - FL2FXCONST_SGL(0.18331637134880f / 8.0)}, - {FL2FXCONST_SGL(0.03273375457980f / 8.0), - FL2FXCONST_SGL(-0.74933109564108f / 8.0)}, - {FL2FXCONST_SGL(-0.38684144784738f / 8.0), - FL2FXCONST_SGL(0.51337349030406f / 8.0)}, - {FL2FXCONST_SGL(-0.97346267944545f / 8.0), - FL2FXCONST_SGL(-0.96549364384098f / 8.0)}, - {FL2FXCONST_SGL(-0.53282156061942f / 8.0), - FL2FXCONST_SGL(-0.91423265091354f / 8.0)}, - {FL2FXCONST_SGL(0.99817310731176f / 8.0), - FL2FXCONST_SGL(0.61133572482148f / 8.0)}, - {FL2FXCONST_SGL(-0.50254500772635f / 8.0), - FL2FXCONST_SGL(-0.88829338134294f / 8.0)}, - {FL2FXCONST_SGL(0.01995873238855f / 8.0), - FL2FXCONST_SGL(0.85223515096765f / 8.0)}, - {FL2FXCONST_SGL(0.99930381973804f / 8.0), - FL2FXCONST_SGL(0.94578896296649f / 8.0)}, - {FL2FXCONST_SGL(0.82907767600783f / 8.0), - FL2FXCONST_SGL(-0.06323442598128f / 8.0)}, - {FL2FXCONST_SGL(-0.58660709669728f / 8.0), - FL2FXCONST_SGL(0.96840773806582f / 8.0)}, - {FL2FXCONST_SGL(-0.17573736667267f / 8.0), - FL2FXCONST_SGL(-0.48166920859485f / 8.0)}, - {FL2FXCONST_SGL(0.83434292401346f / 8.0), - FL2FXCONST_SGL(-0.13023450646997f / 8.0)}, - {FL2FXCONST_SGL(0.05946491307025f / 8.0), - FL2FXCONST_SGL(0.20511047074866f / 8.0)}, - {FL2FXCONST_SGL(0.81505484574602f / 8.0), - FL2FXCONST_SGL(-0.94685947861369f / 8.0)}, - {FL2FXCONST_SGL(-0.44976380954860f / 8.0), - FL2FXCONST_SGL(0.40894572671545f / 8.0)}, - {FL2FXCONST_SGL(-0.89746474625671f / 8.0), - FL2FXCONST_SGL(0.99846578838537f / 8.0)}, - {FL2FXCONST_SGL(0.39677256130792f / 8.0), - FL2FXCONST_SGL(-0.74854668609359f / 8.0)}, - {FL2FXCONST_SGL(-0.07588948563079f / 8.0), - FL2FXCONST_SGL(0.74096214084170f / 8.0)}, - {FL2FXCONST_SGL(0.76343198951445f / 8.0), - FL2FXCONST_SGL(0.41746629422634f / 8.0)}, - {FL2FXCONST_SGL(-0.74490104699626f / 8.0), - FL2FXCONST_SGL(0.94725911744610f / 8.0)}, - {FL2FXCONST_SGL(0.64880119792759f / 8.0), - FL2FXCONST_SGL(0.41336660830571f / 8.0)}, - {FL2FXCONST_SGL(0.62319537462542f / 8.0), - FL2FXCONST_SGL(-0.93098313552599f / 8.0)}, - {FL2FXCONST_SGL(0.42215817594807f / 8.0), - FL2FXCONST_SGL(-0.07712787385208f / 8.0)}, - {FL2FXCONST_SGL(0.02704554141885f / 8.0), - FL2FXCONST_SGL(-0.05417518053666f / 8.0)}, - {FL2FXCONST_SGL(0.80001773566818f / 8.0), - FL2FXCONST_SGL(0.91542195141039f / 8.0)}, - {FL2FXCONST_SGL(-0.79351832348816f / 8.0), - FL2FXCONST_SGL(-0.36208897989136f / 8.0)}, - {FL2FXCONST_SGL(0.63872359151636f / 8.0), - FL2FXCONST_SGL(0.08128252493444f / 8.0)}, - {FL2FXCONST_SGL(0.52890520960295f / 8.0), - FL2FXCONST_SGL(0.60048872455592f / 8.0)}, - {FL2FXCONST_SGL(0.74238552914587f / 8.0), - FL2FXCONST_SGL(0.04491915291044f / 8.0)}, - {FL2FXCONST_SGL(0.99096131449250f / 8.0), - FL2FXCONST_SGL(-0.19451182854402f / 8.0)}, - {FL2FXCONST_SGL(-0.80412329643109f / 8.0), - FL2FXCONST_SGL(-0.88513818199457f / 8.0)}, - {FL2FXCONST_SGL(-0.64612616129736f / 8.0), - FL2FXCONST_SGL(0.72198674804544f / 8.0)}, - {FL2FXCONST_SGL(0.11657770663191f / 8.0), - FL2FXCONST_SGL(-0.83662833815041f / 8.0)}, - {FL2FXCONST_SGL(-0.95053182488101f / 8.0), - FL2FXCONST_SGL(-0.96939905138082f / 8.0)}, - {FL2FXCONST_SGL(-0.62228872928622f / 8.0), - FL2FXCONST_SGL(0.82767262846661f / 8.0)}, - {FL2FXCONST_SGL(0.03004475787316f / 8.0), - FL2FXCONST_SGL(-0.99738896333384f / 8.0)}, - {FL2FXCONST_SGL(-0.97987214341034f / 8.0), - FL2FXCONST_SGL(0.36526129686425f / 8.0)}, - {FL2FXCONST_SGL(-0.99986980746200f / 8.0), - FL2FXCONST_SGL(-0.36021610299715f / 8.0)}, - {FL2FXCONST_SGL(0.89110648599879f / 8.0), - FL2FXCONST_SGL(-0.97894250343044f / 8.0)}, - {FL2FXCONST_SGL(0.10407960510582f / 8.0), - FL2FXCONST_SGL(0.77357793811619f / 8.0)}, - {FL2FXCONST_SGL(0.95964737821728f / 8.0), - FL2FXCONST_SGL(-0.35435818285502f / 8.0)}, - {FL2FXCONST_SGL(0.50843233159162f / 8.0), - FL2FXCONST_SGL(0.96107691266205f / 8.0)}, - {FL2FXCONST_SGL(0.17006334670615f / 8.0), - FL2FXCONST_SGL(-0.76854025314829f / 8.0)}, - {FL2FXCONST_SGL(0.25872675063360f / 8.0), - FL2FXCONST_SGL(0.99893303933816f / 8.0)}, - {FL2FXCONST_SGL(-0.01115998681937f / 8.0), - FL2FXCONST_SGL(0.98496019742444f / 8.0)}, - {FL2FXCONST_SGL(-0.79598702973261f / 8.0), - FL2FXCONST_SGL(0.97138411318894f / 8.0)}, - {FL2FXCONST_SGL(-0.99264708948101f / 8.0), - FL2FXCONST_SGL(-0.99542822402536f / 8.0)}, - {FL2FXCONST_SGL(-0.99829663752818f / 8.0), - FL2FXCONST_SGL(0.01877138824311f / 8.0)}, - {FL2FXCONST_SGL(-0.70801016548184f / 8.0), - FL2FXCONST_SGL(0.33680685948117f / 8.0)}, - {FL2FXCONST_SGL(-0.70467057786826f / 8.0), - FL2FXCONST_SGL(0.93272777501857f / 8.0)}, - {FL2FXCONST_SGL(0.99846021905254f / 8.0), - FL2FXCONST_SGL(-0.98725746254433f / 8.0)}, - {FL2FXCONST_SGL(-0.63364968534650f / 8.0), - FL2FXCONST_SGL(-0.16473594423746f / 8.0)}, - {FL2FXCONST_SGL(-0.16258217500792f / 8.0), - FL2FXCONST_SGL(-0.95939125400802f / 8.0)}, - {FL2FXCONST_SGL(-0.43645594360633f / 8.0), - FL2FXCONST_SGL(-0.94805030113284f / 8.0)}, - {FL2FXCONST_SGL(-0.99848471702976f / 8.0), - FL2FXCONST_SGL(0.96245166923809f / 8.0)}, - {FL2FXCONST_SGL(-0.16796458968998f / 8.0), - FL2FXCONST_SGL(-0.98987511890470f / 8.0)}, - {FL2FXCONST_SGL(-0.87979225745213f / 8.0), - FL2FXCONST_SGL(-0.71725725041680f / 8.0)}, - {FL2FXCONST_SGL(0.44183099021786f / 8.0), - FL2FXCONST_SGL(-0.93568974498761f / 8.0)}, - {FL2FXCONST_SGL(0.93310180125532f / 8.0), - FL2FXCONST_SGL(-0.99913308068246f / 8.0)}, - {FL2FXCONST_SGL(-0.93941931782002f / 8.0), - FL2FXCONST_SGL(-0.56409379640356f / 8.0)}, - {FL2FXCONST_SGL(-0.88590003188677f / 8.0), - FL2FXCONST_SGL(0.47624600491382f / 8.0)}, - {FL2FXCONST_SGL(0.99971463703691f / 8.0), - FL2FXCONST_SGL(-0.83889954253462f / 8.0)}, - {FL2FXCONST_SGL(-0.75376385639978f / 8.0), - FL2FXCONST_SGL(0.00814643438625f / 8.0)}, - {FL2FXCONST_SGL(0.93887685615875f / 8.0), - FL2FXCONST_SGL(-0.11284528204636f / 8.0)}, - {FL2FXCONST_SGL(0.85126435782309f / 8.0), - FL2FXCONST_SGL(0.52349251543547f / 8.0)}, - {FL2FXCONST_SGL(0.39701421446381f / 8.0), - FL2FXCONST_SGL(0.81779634174316f / 8.0)}, - {FL2FXCONST_SGL(-0.37024464187437f / 8.0), - FL2FXCONST_SGL(-0.87071656222959f / 8.0)}, - {FL2FXCONST_SGL(-0.36024828242896f / 8.0), - FL2FXCONST_SGL(0.34655735648287f / 8.0)}, - {FL2FXCONST_SGL(-0.93388812549209f / 8.0), - FL2FXCONST_SGL(-0.84476541096429f / 8.0)}, - {FL2FXCONST_SGL(-0.65298804552119f / 8.0), - FL2FXCONST_SGL(-0.18439575450921f / 8.0)}, - {FL2FXCONST_SGL(0.11960319006843f / 8.0), - FL2FXCONST_SGL(0.99899346780168f / 8.0)}, - {FL2FXCONST_SGL(0.94292565553160f / 8.0), - FL2FXCONST_SGL(0.83163906518293f / 8.0)}, - {FL2FXCONST_SGL(0.75081145286948f / 8.0), - FL2FXCONST_SGL(-0.35533223142265f / 8.0)}, - {FL2FXCONST_SGL(0.56721979748394f / 8.0), - FL2FXCONST_SGL(-0.24076836414499f / 8.0)}, - {FL2FXCONST_SGL(0.46857766746029f / 8.0), - FL2FXCONST_SGL(-0.30140233457198f / 8.0)}, - {FL2FXCONST_SGL(0.97312313923635f / 8.0), - FL2FXCONST_SGL(-0.99548191630031f / 8.0)}, - {FL2FXCONST_SGL(-0.38299976567017f / 8.0), - FL2FXCONST_SGL(0.98516909715427f / 8.0)}, - {FL2FXCONST_SGL(0.41025800019463f / 8.0), - FL2FXCONST_SGL(0.02116736935734f / 8.0)}, - {FL2FXCONST_SGL(0.09638062008048f / 8.0), - FL2FXCONST_SGL(0.04411984381457f / 8.0)}, - {FL2FXCONST_SGL(-0.85283249275397f / 8.0), - FL2FXCONST_SGL(0.91475563922421f / 8.0)}, - {FL2FXCONST_SGL(0.88866808958124f / 8.0), - FL2FXCONST_SGL(-0.99735267083226f / 8.0)}, - {FL2FXCONST_SGL(-0.48202429536989f / 8.0), - FL2FXCONST_SGL(-0.96805608884164f / 8.0)}, - {FL2FXCONST_SGL(0.27572582416567f / 8.0), - FL2FXCONST_SGL(0.58634753335832f / 8.0)}, - {FL2FXCONST_SGL(-0.65889129659168f / 8.0), - FL2FXCONST_SGL(0.58835634138583f / 8.0)}, - {FL2FXCONST_SGL(0.98838086953732f / 8.0), - FL2FXCONST_SGL(0.99994349600236f / 8.0)}, - {FL2FXCONST_SGL(-0.20651349620689f / 8.0), - FL2FXCONST_SGL(0.54593044066355f / 8.0)}, - {FL2FXCONST_SGL(-0.62126416356920f / 8.0), - FL2FXCONST_SGL(-0.59893681700392f / 8.0)}, - {FL2FXCONST_SGL(0.20320105410437f / 8.0), - FL2FXCONST_SGL(-0.86879180355289f / 8.0)}, - {FL2FXCONST_SGL(-0.97790548600584f / 8.0), - FL2FXCONST_SGL(0.96290806999242f / 8.0)}, - {FL2FXCONST_SGL(0.11112534735126f / 8.0), - FL2FXCONST_SGL(0.21484763313301f / 8.0)}, - {FL2FXCONST_SGL(-0.41368337314182f / 8.0), - FL2FXCONST_SGL(0.28216837680365f / 8.0)}, - {FL2FXCONST_SGL(0.24133038992960f / 8.0), - FL2FXCONST_SGL(0.51294362630238f / 8.0)}, - {FL2FXCONST_SGL(-0.66393410674885f / 8.0), - FL2FXCONST_SGL(-0.08249679629081f / 8.0)}, - {FL2FXCONST_SGL(-0.53697829178752f / 8.0), - FL2FXCONST_SGL(-0.97649903936228f / 8.0)}, - {FL2FXCONST_SGL(-0.97224737889348f / 8.0), - FL2FXCONST_SGL(0.22081333579837f / 8.0)}, - {FL2FXCONST_SGL(0.87392477144549f / 8.0), - FL2FXCONST_SGL(-0.12796173740361f / 8.0)}, - {FL2FXCONST_SGL(0.19050361015753f / 8.0), - FL2FXCONST_SGL(0.01602615387195f / 8.0)}, - {FL2FXCONST_SGL(-0.46353441212724f / 8.0), - FL2FXCONST_SGL(-0.95249041539006f / 8.0)}, - {FL2FXCONST_SGL(-0.07064096339021f / 8.0), - FL2FXCONST_SGL(-0.94479803205886f / 8.0)}, - {FL2FXCONST_SGL(-0.92444085484466f / 8.0), - FL2FXCONST_SGL(-0.10457590187436f / 8.0)}, - {FL2FXCONST_SGL(-0.83822593578728f / 8.0), - FL2FXCONST_SGL(-0.01695043208885f / 8.0)}, - {FL2FXCONST_SGL(0.75214681811150f / 8.0), - FL2FXCONST_SGL(-0.99955681042665f / 8.0)}, - {FL2FXCONST_SGL(-0.42102998829339f / 8.0), - FL2FXCONST_SGL(0.99720941999394f / 8.0)}, - {FL2FXCONST_SGL(-0.72094786237696f / 8.0), - FL2FXCONST_SGL(-0.35008961934255f / 8.0)}, - {FL2FXCONST_SGL(0.78843311019251f / 8.0), - FL2FXCONST_SGL(0.52851398958271f / 8.0)}, - {FL2FXCONST_SGL(0.97394027897442f / 8.0), - FL2FXCONST_SGL(-0.26695944086561f / 8.0)}, - {FL2FXCONST_SGL(0.99206463477946f / 8.0), - FL2FXCONST_SGL(-0.57010120849429f / 8.0)}, - {FL2FXCONST_SGL(0.76789609461795f / 8.0), - FL2FXCONST_SGL(-0.76519356730966f / 8.0)}, - {FL2FXCONST_SGL(-0.82002421836409f / 8.0), - FL2FXCONST_SGL(-0.73530179553767f / 8.0)}, - {FL2FXCONST_SGL(0.81924990025724f / 8.0), - FL2FXCONST_SGL(0.99698425250579f / 8.0)}, - {FL2FXCONST_SGL(-0.26719850873357f / 8.0), - FL2FXCONST_SGL(0.68903369776193f / 8.0)}, - {FL2FXCONST_SGL(-0.43311260380975f / 8.0), - FL2FXCONST_SGL(0.85321815947490f / 8.0)}, - {FL2FXCONST_SGL(0.99194979673836f / 8.0), - FL2FXCONST_SGL(0.91876249766422f / 8.0)}, - {FL2FXCONST_SGL(-0.80692001248487f / 8.0), - FL2FXCONST_SGL(-0.32627540663214f / 8.0)}, - {FL2FXCONST_SGL(0.43080003649976f / 8.0), - FL2FXCONST_SGL(-0.21919095636638f / 8.0)}, - {FL2FXCONST_SGL(0.67709491937357f / 8.0), - FL2FXCONST_SGL(-0.95478075822906f / 8.0)}, - {FL2FXCONST_SGL(0.56151770568316f / 8.0), - FL2FXCONST_SGL(-0.70693811747778f / 8.0)}, - {FL2FXCONST_SGL(0.10831862810749f / 8.0), - FL2FXCONST_SGL(-0.08628837174592f / 8.0)}, - {FL2FXCONST_SGL(0.91229417540436f / 8.0), - FL2FXCONST_SGL(-0.65987351408410f / 8.0)}, - {FL2FXCONST_SGL(-0.48972893932274f / 8.0), - FL2FXCONST_SGL(0.56289246362686f / 8.0)}, - {FL2FXCONST_SGL(-0.89033658689697f / 8.0), - FL2FXCONST_SGL(-0.71656563987082f / 8.0)}, - {FL2FXCONST_SGL(0.65269447475094f / 8.0), - FL2FXCONST_SGL(0.65916004833932f / 8.0)}, - {FL2FXCONST_SGL(0.67439478141121f / 8.0), - FL2FXCONST_SGL(-0.81684380846796f / 8.0)}, - {FL2FXCONST_SGL(-0.47770832416973f / 8.0), - FL2FXCONST_SGL(-0.16789556203025f / 8.0)}, - {FL2FXCONST_SGL(-0.99715979260878f / 8.0), - FL2FXCONST_SGL(-0.93565784007648f / 8.0)}, - {FL2FXCONST_SGL(-0.90889593602546f / 8.0), - FL2FXCONST_SGL(0.62034397054380f / 8.0)}, - {FL2FXCONST_SGL(-0.06618622548177f / 8.0), - FL2FXCONST_SGL(-0.23812217221359f / 8.0)}, - {FL2FXCONST_SGL(0.99430266919728f / 8.0), - FL2FXCONST_SGL(0.18812555317553f / 8.0)}, - {FL2FXCONST_SGL(0.97686402381843f / 8.0), - FL2FXCONST_SGL(-0.28664534366620f / 8.0)}, - {FL2FXCONST_SGL(0.94813650221268f / 8.0), - FL2FXCONST_SGL(-0.97506640027128f / 8.0)}, - {FL2FXCONST_SGL(-0.95434497492853f / 8.0), - FL2FXCONST_SGL(-0.79607978501983f / 8.0)}, - {FL2FXCONST_SGL(-0.49104783137150f / 8.0), - FL2FXCONST_SGL(0.32895214359663f / 8.0)}, - {FL2FXCONST_SGL(0.99881175120751f / 8.0), - FL2FXCONST_SGL(0.88993983831354f / 8.0)}, - {FL2FXCONST_SGL(0.50449166760303f / 8.0), - FL2FXCONST_SGL(-0.85995072408434f / 8.0)}, - {FL2FXCONST_SGL(0.47162891065108f / 8.0), - FL2FXCONST_SGL(-0.18680204049569f / 8.0)}, - {FL2FXCONST_SGL(-0.62081581361840f / 8.0), - FL2FXCONST_SGL(0.75000676218956f / 8.0)}, - {FL2FXCONST_SGL(-0.43867015250812f / 8.0), - FL2FXCONST_SGL(0.99998069244322f / 8.0)}, - {FL2FXCONST_SGL(0.98630563232075f / 8.0), - FL2FXCONST_SGL(-0.53578899600662f / 8.0)}, - {FL2FXCONST_SGL(-0.61510362277374f / 8.0), - FL2FXCONST_SGL(-0.89515019899997f / 8.0)}, - {FL2FXCONST_SGL(-0.03841517601843f / 8.0), - FL2FXCONST_SGL(-0.69888815681179f / 8.0)}, - {FL2FXCONST_SGL(-0.30102157304644f / 8.0), - FL2FXCONST_SGL(-0.07667808922205f / 8.0)}, - {FL2FXCONST_SGL(0.41881284182683f / 8.0), - FL2FXCONST_SGL(0.02188098922282f / 8.0)}, - {FL2FXCONST_SGL(-0.86135454941237f / 8.0), - FL2FXCONST_SGL(0.98947480909359f / 8.0)}, - {FL2FXCONST_SGL(0.67226861393788f / 8.0), - FL2FXCONST_SGL(-0.13494389011014f / 8.0)}, - {FL2FXCONST_SGL(-0.70737398842068f / 8.0), - FL2FXCONST_SGL(-0.76547349325992f / 8.0)}, - {FL2FXCONST_SGL(0.94044946687963f / 8.0), - FL2FXCONST_SGL(0.09026201157416f / 8.0)}, - {FL2FXCONST_SGL(-0.82386352534327f / 8.0), - FL2FXCONST_SGL(0.08924768823676f / 8.0)}, - {FL2FXCONST_SGL(-0.32070666698656f / 8.0), - FL2FXCONST_SGL(0.50143421908753f / 8.0)}, - {FL2FXCONST_SGL(0.57593163224487f / 8.0), - FL2FXCONST_SGL(-0.98966422921509f / 8.0)}, - {FL2FXCONST_SGL(-0.36326018419965f / 8.0), - FL2FXCONST_SGL(0.07440243123228f / 8.0)}, - {FL2FXCONST_SGL(0.99979044674350f / 8.0), - FL2FXCONST_SGL(-0.14130287347405f / 8.0)}, - {FL2FXCONST_SGL(-0.92366023326932f / 8.0), - FL2FXCONST_SGL(-0.97979298068180f / 8.0)}, - {FL2FXCONST_SGL(-0.44607178518598f / 8.0), - FL2FXCONST_SGL(-0.54233252016394f / 8.0)}, - {FL2FXCONST_SGL(0.44226800932956f / 8.0), - FL2FXCONST_SGL(0.71326756742752f / 8.0)}, - {FL2FXCONST_SGL(0.03671907158312f / 8.0), - FL2FXCONST_SGL(0.63606389366675f / 8.0)}, - {FL2FXCONST_SGL(0.52175424682195f / 8.0), - FL2FXCONST_SGL(-0.85396826735705f / 8.0)}, - {FL2FXCONST_SGL(-0.94701139690956f / 8.0), - FL2FXCONST_SGL(-0.01826348194255f / 8.0)}, - {FL2FXCONST_SGL(-0.98759606946049f / 8.0), - FL2FXCONST_SGL(0.82288714303073f / 8.0)}, - {FL2FXCONST_SGL(0.87434794743625f / 8.0), - FL2FXCONST_SGL(0.89399495655433f / 8.0)}, - {FL2FXCONST_SGL(-0.93412041758744f / 8.0), - FL2FXCONST_SGL(0.41374052024363f / 8.0)}, - {FL2FXCONST_SGL(0.96063943315511f / 8.0), - FL2FXCONST_SGL(0.93116709541280f / 8.0)}, - {FL2FXCONST_SGL(0.97534253457837f / 8.0), - FL2FXCONST_SGL(0.86150930812689f / 8.0)}, - {FL2FXCONST_SGL(0.99642466504163f / 8.0), - FL2FXCONST_SGL(0.70190043427512f / 8.0)}, - {FL2FXCONST_SGL(-0.94705089665984f / 8.0), - FL2FXCONST_SGL(-0.29580042814306f / 8.0)}, - {FL2FXCONST_SGL(0.91599807087376f / 8.0), - FL2FXCONST_SGL(-0.98147830385781f / 8.0)}}; + {FL2FXCONST_SGL(-0.99948153278296f), FL2FXCONST_SGL(-0.59483417516607f)}, + {FL2FXCONST_SGL(0.97113454393991f), FL2FXCONST_SGL(-0.67528515225647f)}, + {FL2FXCONST_SGL(0.14130051758487f), FL2FXCONST_SGL(-0.95090983575689f)}, + {FL2FXCONST_SGL(-0.47005496701697f), FL2FXCONST_SGL(-0.37340549728647f)}, + {FL2FXCONST_SGL(0.80705063769351f), FL2FXCONST_SGL(0.29653668284408f)}, + {FL2FXCONST_SGL(-0.38981478896926f), FL2FXCONST_SGL(0.89572605717087f)}, + {FL2FXCONST_SGL(-0.01053049862020f), FL2FXCONST_SGL(-0.66959058036166f)}, + {FL2FXCONST_SGL(-0.91266367957293f), FL2FXCONST_SGL(-0.11522938140034f)}, + {FL2FXCONST_SGL(0.54840422910309f), FL2FXCONST_SGL(0.75221367176302f)}, + {FL2FXCONST_SGL(0.40009252867955f), FL2FXCONST_SGL(-0.98929400334421f)}, + {FL2FXCONST_SGL(-0.99867974711855f), FL2FXCONST_SGL(-0.88147068645358f)}, + {FL2FXCONST_SGL(-0.95531076805040f), FL2FXCONST_SGL(0.90908757154593f)}, + {FL2FXCONST_SGL(-0.45725933317144f), FL2FXCONST_SGL(-0.56716323646760f)}, + {FL2FXCONST_SGL(-0.72929675029275f), FL2FXCONST_SGL(-0.98008272727324f)}, + {FL2FXCONST_SGL(0.75622801399036f), FL2FXCONST_SGL(0.20950329995549f)}, + {FL2FXCONST_SGL(0.07069442601050f), FL2FXCONST_SGL(-0.78247898470706f)}, + {FL2FXCONST_SGL(0.74496252926055f), FL2FXCONST_SGL(-0.91169004445807f)}, + {FL2FXCONST_SGL(-0.96440182703856f), FL2FXCONST_SGL(-0.94739918296622f)}, + {FL2FXCONST_SGL(0.30424629369539f), FL2FXCONST_SGL(-0.49438267012479f)}, + {FL2FXCONST_SGL(0.66565033746925f), FL2FXCONST_SGL(0.64652935542491f)}, + {FL2FXCONST_SGL(0.91697008020594f), FL2FXCONST_SGL(0.17514097332009f)}, + {FL2FXCONST_SGL(-0.70774918760427f), FL2FXCONST_SGL(0.52548653416543f)}, + {FL2FXCONST_SGL(-0.70051415345560f), FL2FXCONST_SGL(-0.45340028808763f)}, + {FL2FXCONST_SGL(-0.99496513054797f), FL2FXCONST_SGL(-0.90071908066973f)}, + {FL2FXCONST_SGL(0.98164490790123f), FL2FXCONST_SGL(-0.77463155528697f)}, + {FL2FXCONST_SGL(-0.54671580548181f), FL2FXCONST_SGL(-0.02570928536004f)}, + {FL2FXCONST_SGL(-0.01689629065389f), FL2FXCONST_SGL(0.00287506445732f)}, + {FL2FXCONST_SGL(-0.86110349531986f), FL2FXCONST_SGL(0.42548583726477f)}, + {FL2FXCONST_SGL(-0.98892980586032f), FL2FXCONST_SGL(-0.87881132267556f)}, + {FL2FXCONST_SGL(0.51756627678691f), FL2FXCONST_SGL(0.66926784710139f)}, + {FL2FXCONST_SGL(-0.99635026409640f), FL2FXCONST_SGL(-0.58107730574765f)}, + {FL2FXCONST_SGL(-0.99969370862163f), FL2FXCONST_SGL(0.98369989360250f)}, + {FL2FXCONST_SGL(0.55266258627194f), FL2FXCONST_SGL(0.59449057465591f)}, + {FL2FXCONST_SGL(0.34581177741673f), FL2FXCONST_SGL(0.94879421061866f)}, + {FL2FXCONST_SGL(0.62664209577999f), FL2FXCONST_SGL(-0.74402970906471f)}, + {FL2FXCONST_SGL(-0.77149701404973f), FL2FXCONST_SGL(-0.33883658042801f)}, + {FL2FXCONST_SGL(-0.91592244254432f), FL2FXCONST_SGL(0.03687901376713f)}, + {FL2FXCONST_SGL(-0.76285492357887f), FL2FXCONST_SGL(-0.91371867919124f)}, + {FL2FXCONST_SGL(0.79788337195331f), FL2FXCONST_SGL(-0.93180971199849f)}, + {FL2FXCONST_SGL(0.54473080610200f), FL2FXCONST_SGL(-0.11919206037186f)}, + {FL2FXCONST_SGL(-0.85639281671058f), FL2FXCONST_SGL(0.42429854760451f)}, + {FL2FXCONST_SGL(-0.92882402971423f), FL2FXCONST_SGL(0.27871809078609f)}, + {FL2FXCONST_SGL(-0.11708371046774f), FL2FXCONST_SGL(-0.99800843444966f)}, + {FL2FXCONST_SGL(0.21356749817493f), FL2FXCONST_SGL(-0.90716295627033f)}, + {FL2FXCONST_SGL(-0.76191692573909f), FL2FXCONST_SGL(0.99768118356265f)}, + {FL2FXCONST_SGL(0.98111043100884f), FL2FXCONST_SGL(-0.95854459734407f)}, + {FL2FXCONST_SGL(-0.85913269895572f), FL2FXCONST_SGL(0.95766566168880f)}, + {FL2FXCONST_SGL(-0.93307242253692f), FL2FXCONST_SGL(0.49431757696466f)}, + {FL2FXCONST_SGL(0.30485754879632f), FL2FXCONST_SGL(-0.70540034357529f)}, + {FL2FXCONST_SGL(0.85289650925190f), FL2FXCONST_SGL(0.46766131791044f)}, + {FL2FXCONST_SGL(0.91328082618125f), FL2FXCONST_SGL(-0.99839597361769f)}, + {FL2FXCONST_SGL(-0.05890199924154f), FL2FXCONST_SGL(0.70741827819497f)}, + {FL2FXCONST_SGL(0.28398686150148f), FL2FXCONST_SGL(0.34633555702188f)}, + {FL2FXCONST_SGL(0.95258164539612f), FL2FXCONST_SGL(-0.54893416026939f)}, + {FL2FXCONST_SGL(-0.78566324168507f), FL2FXCONST_SGL(-0.75568541079691f)}, + {FL2FXCONST_SGL(-0.95789495447877f), FL2FXCONST_SGL(-0.20423194696966f)}, + {FL2FXCONST_SGL(0.82411158711197f), FL2FXCONST_SGL(0.96654618432562f)}, + {FL2FXCONST_SGL(-0.65185446735885f), FL2FXCONST_SGL(-0.88734990773289f)}, + {FL2FXCONST_SGL(-0.93643603134666f), FL2FXCONST_SGL(0.99870790442385f)}, + {FL2FXCONST_SGL(0.91427159529618f), FL2FXCONST_SGL(-0.98290505544444f)}, + {FL2FXCONST_SGL(-0.70395684036886f), FL2FXCONST_SGL(0.58796798221039f)}, + {FL2FXCONST_SGL(0.00563771969365f), FL2FXCONST_SGL(0.61768196727244f)}, + {FL2FXCONST_SGL(0.89065051931895f), FL2FXCONST_SGL(0.52783352697585f)}, + {FL2FXCONST_SGL(-0.68683707712762f), FL2FXCONST_SGL(0.80806944710339f)}, + {FL2FXCONST_SGL(0.72165342518718f), FL2FXCONST_SGL(-0.69259857349564f)}, + {FL2FXCONST_SGL(-0.62928247730667f), FL2FXCONST_SGL(0.13627037407335f)}, + {FL2FXCONST_SGL(0.29938434065514f), FL2FXCONST_SGL(-0.46051329682246f)}, + {FL2FXCONST_SGL(-0.91781958879280f), FL2FXCONST_SGL(-0.74012716684186f)}, + {FL2FXCONST_SGL(0.99298717043688f), FL2FXCONST_SGL(0.40816610075661f)}, + {FL2FXCONST_SGL(0.82368298622748f), FL2FXCONST_SGL(-0.74036047190173f)}, + {FL2FXCONST_SGL(-0.98512833386833f), FL2FXCONST_SGL(-0.99972330709594f)}, + {FL2FXCONST_SGL(-0.95915368242257f), FL2FXCONST_SGL(-0.99237800466040f)}, + {FL2FXCONST_SGL(-0.21411126572790f), FL2FXCONST_SGL(-0.93424819052545f)}, + {FL2FXCONST_SGL(-0.68821476106884f), FL2FXCONST_SGL(-0.26892306315457f)}, + {FL2FXCONST_SGL(0.91851997982317f), FL2FXCONST_SGL(0.09358228901785f)}, + {FL2FXCONST_SGL(-0.96062769559127f), FL2FXCONST_SGL(0.36099095133739f)}, + {FL2FXCONST_SGL(0.51646184922287f), FL2FXCONST_SGL(-0.71373332873917f)}, + {FL2FXCONST_SGL(0.61130721139669f), FL2FXCONST_SGL(0.46950141175917f)}, + {FL2FXCONST_SGL(0.47336129371299f), FL2FXCONST_SGL(-0.27333178296162f)}, + {FL2FXCONST_SGL(0.90998308703519f), FL2FXCONST_SGL(0.96715662938132f)}, + {FL2FXCONST_SGL(0.44844799194357f), FL2FXCONST_SGL(0.99211574628306f)}, + {FL2FXCONST_SGL(0.66614891079092f), FL2FXCONST_SGL(0.96590176169121f)}, + {FL2FXCONST_SGL(0.74922239129237f), FL2FXCONST_SGL(-0.89879858826087f)}, + {FL2FXCONST_SGL(-0.99571588506485f), FL2FXCONST_SGL(0.52785521494349f)}, + {FL2FXCONST_SGL(0.97401082477563f), FL2FXCONST_SGL(-0.16855870075190f)}, + {FL2FXCONST_SGL(0.72683747733879f), FL2FXCONST_SGL(-0.48060774432251f)}, + {FL2FXCONST_SGL(0.95432193457128f), FL2FXCONST_SGL(0.68849603408441f)}, + {FL2FXCONST_SGL(-0.72962208425191f), FL2FXCONST_SGL(-0.76608443420917f)}, + {FL2FXCONST_SGL(-0.85359479233537f), FL2FXCONST_SGL(0.88738125901579f)}, + {FL2FXCONST_SGL(-0.81412430338535f), FL2FXCONST_SGL(-0.97480768049637f)}, + {FL2FXCONST_SGL(-0.87930772356786f), FL2FXCONST_SGL(0.74748307690436f)}, + {FL2FXCONST_SGL(-0.71573331064977f), FL2FXCONST_SGL(-0.98570608178923f)}, + {FL2FXCONST_SGL(0.83524300028228f), FL2FXCONST_SGL(0.83702537075163f)}, + {FL2FXCONST_SGL(-0.48086065601423f), FL2FXCONST_SGL(-0.98848504923531f)}, + {FL2FXCONST_SGL(0.97139128574778f), FL2FXCONST_SGL(0.80093621198236f)}, + {FL2FXCONST_SGL(0.51992825347895f), FL2FXCONST_SGL(0.80247631400510f)}, + {FL2FXCONST_SGL(-0.00848591195325f), FL2FXCONST_SGL(-0.76670128000486f)}, + {FL2FXCONST_SGL(-0.70294374303036f), FL2FXCONST_SGL(0.55359910445577f)}, + {FL2FXCONST_SGL(-0.95894428168140f), FL2FXCONST_SGL(-0.43265504344783f)}, + {FL2FXCONST_SGL(0.97079252950321f), FL2FXCONST_SGL(0.09325857238682f)}, + {FL2FXCONST_SGL(-0.92404293670797f), FL2FXCONST_SGL(0.85507704027855f)}, + {FL2FXCONST_SGL(-0.69506469500450f), FL2FXCONST_SGL(0.98633412625459f)}, + {FL2FXCONST_SGL(0.26559203620024f), FL2FXCONST_SGL(0.73314307966524f)}, + {FL2FXCONST_SGL(0.28038443336943f), FL2FXCONST_SGL(0.14537913654427f)}, + {FL2FXCONST_SGL(-0.74138124825523f), FL2FXCONST_SGL(0.99310339807762f)}, + {FL2FXCONST_SGL(-0.01752795995444f), FL2FXCONST_SGL(-0.82616635284178f)}, + {FL2FXCONST_SGL(-0.55126773094930f), FL2FXCONST_SGL(-0.98898543862153f)}, + {FL2FXCONST_SGL(0.97960898850996f), FL2FXCONST_SGL(-0.94021446752851f)}, + {FL2FXCONST_SGL(-0.99196309146936f), FL2FXCONST_SGL(0.67019017358456f)}, + {FL2FXCONST_SGL(-0.67684928085260f), FL2FXCONST_SGL(0.12631491649378f)}, + {FL2FXCONST_SGL(0.09140039465500f), FL2FXCONST_SGL(-0.20537731453108f)}, + {FL2FXCONST_SGL(-0.71658965751996f), FL2FXCONST_SGL(-0.97788200391224f)}, + {FL2FXCONST_SGL(0.81014640078925f), FL2FXCONST_SGL(0.53722648362443f)}, + {FL2FXCONST_SGL(0.40616991671205f), FL2FXCONST_SGL(-0.26469008598449f)}, + {FL2FXCONST_SGL(-0.67680188682972f), FL2FXCONST_SGL(0.94502052337695f)}, + {FL2FXCONST_SGL(0.86849774348749f), FL2FXCONST_SGL(-0.18333598647899f)}, + {FL2FXCONST_SGL(-0.99500381284851f), FL2FXCONST_SGL(-0.02634122068550f)}, + {FL2FXCONST_SGL(0.84329189340667f), FL2FXCONST_SGL(0.10406957462213f)}, + {FL2FXCONST_SGL(-0.09215968531446f), FL2FXCONST_SGL(0.69540012101253f)}, + {FL2FXCONST_SGL(0.99956173327206f), FL2FXCONST_SGL(-0.12358542001404f)}, + {FL2FXCONST_SGL(-0.79732779473535f), FL2FXCONST_SGL(-0.91582524736159f)}, + {FL2FXCONST_SGL(0.96349973642406f), FL2FXCONST_SGL(0.96640458041000f)}, + {FL2FXCONST_SGL(-0.79942778496547f), FL2FXCONST_SGL(0.64323902822857f)}, + {FL2FXCONST_SGL(-0.11566039853896f), FL2FXCONST_SGL(0.28587846253726f)}, + {FL2FXCONST_SGL(-0.39922954514662f), FL2FXCONST_SGL(0.94129601616966f)}, + {FL2FXCONST_SGL(0.99089197565987f), FL2FXCONST_SGL(-0.92062625581587f)}, + {FL2FXCONST_SGL(0.28631285179909f), FL2FXCONST_SGL(-0.91035047143603f)}, + {FL2FXCONST_SGL(-0.83302725605608f), FL2FXCONST_SGL(-0.67330410892084f)}, + {FL2FXCONST_SGL(0.95404443402072f), FL2FXCONST_SGL(0.49162765398743f)}, + {FL2FXCONST_SGL(-0.06449863579434f), FL2FXCONST_SGL(0.03250560813135f)}, + {FL2FXCONST_SGL(-0.99575054486311f), FL2FXCONST_SGL(0.42389784469507f)}, + {FL2FXCONST_SGL(-0.65501142790847f), FL2FXCONST_SGL(0.82546114655624f)}, + {FL2FXCONST_SGL(-0.81254441908887f), FL2FXCONST_SGL(-0.51627234660629f)}, + {FL2FXCONST_SGL(-0.99646369485481f), FL2FXCONST_SGL(0.84490533520752f)}, + {FL2FXCONST_SGL(0.00287840603348f), FL2FXCONST_SGL(0.64768261158166f)}, + {FL2FXCONST_SGL(0.70176989408455f), FL2FXCONST_SGL(-0.20453028573322f)}, + {FL2FXCONST_SGL(0.96361882270190f), FL2FXCONST_SGL(0.40706967140989f)}, + {FL2FXCONST_SGL(-0.68883758192426f), FL2FXCONST_SGL(0.91338958840772f)}, + {FL2FXCONST_SGL(-0.34875585502238f), FL2FXCONST_SGL(0.71472290693300f)}, + {FL2FXCONST_SGL(0.91980081243087f), FL2FXCONST_SGL(0.66507455644919f)}, + {FL2FXCONST_SGL(-0.99009048343881f), FL2FXCONST_SGL(0.85868021604848f)}, + {FL2FXCONST_SGL(0.68865791458395f), FL2FXCONST_SGL(0.55660316809678f)}, + {FL2FXCONST_SGL(-0.99484402129368f), FL2FXCONST_SGL(-0.20052559254934f)}, + {FL2FXCONST_SGL(0.94214511408023f), FL2FXCONST_SGL(-0.99696425367461f)}, + {FL2FXCONST_SGL(-0.67414626793544f), FL2FXCONST_SGL(0.49548221180078f)}, + {FL2FXCONST_SGL(-0.47339353684664f), FL2FXCONST_SGL(-0.85904328834047f)}, + {FL2FXCONST_SGL(0.14323651387360f), FL2FXCONST_SGL(-0.94145598222488f)}, + {FL2FXCONST_SGL(-0.29268293575672f), FL2FXCONST_SGL(0.05759224927952f)}, + {FL2FXCONST_SGL(0.43793861458754f), FL2FXCONST_SGL(-0.78904969892724f)}, + {FL2FXCONST_SGL(-0.36345126374441f), FL2FXCONST_SGL(0.64874435357162f)}, + {FL2FXCONST_SGL(-0.08750604656825f), FL2FXCONST_SGL(0.97686944362527f)}, + {FL2FXCONST_SGL(-0.96495267812511f), FL2FXCONST_SGL(-0.53960305946511f)}, + {FL2FXCONST_SGL(0.55526940659947f), FL2FXCONST_SGL(0.78891523734774f)}, + {FL2FXCONST_SGL(0.73538215752630f), FL2FXCONST_SGL(0.96452072373404f)}, + {FL2FXCONST_SGL(-0.30889773919437f), FL2FXCONST_SGL(-0.80664389776860f)}, + {FL2FXCONST_SGL(0.03574995626194f), FL2FXCONST_SGL(-0.97325616900959f)}, + {FL2FXCONST_SGL(0.98720684660488f), FL2FXCONST_SGL(0.48409133691962f)}, + {FL2FXCONST_SGL(-0.81689296271203f), FL2FXCONST_SGL(-0.90827703628298f)}, + {FL2FXCONST_SGL(0.67866860118215f), FL2FXCONST_SGL(0.81284503870856f)}, + {FL2FXCONST_SGL(-0.15808569732583f), FL2FXCONST_SGL(0.85279555024382f)}, + {FL2FXCONST_SGL(0.80723395114371f), FL2FXCONST_SGL(-0.24717418514605f)}, + {FL2FXCONST_SGL(0.47788757329038f), FL2FXCONST_SGL(-0.46333147839295f)}, + {FL2FXCONST_SGL(0.96367554763201f), FL2FXCONST_SGL(0.38486749303242f)}, + {FL2FXCONST_SGL(-0.99143875716818f), FL2FXCONST_SGL(-0.24945277239809f)}, + {FL2FXCONST_SGL(0.83081876925833f), FL2FXCONST_SGL(-0.94780851414763f)}, + {FL2FXCONST_SGL(-0.58753191905341f), FL2FXCONST_SGL(0.01290772389163f)}, + {FL2FXCONST_SGL(0.95538108220960f), FL2FXCONST_SGL(-0.85557052096538f)}, + {FL2FXCONST_SGL(-0.96490920476211f), FL2FXCONST_SGL(-0.64020970923102f)}, + {FL2FXCONST_SGL(-0.97327101028521f), FL2FXCONST_SGL(0.12378128133110f)}, + {FL2FXCONST_SGL(0.91400366022124f), FL2FXCONST_SGL(0.57972471346930f)}, + {FL2FXCONST_SGL(-0.99925837363824f), FL2FXCONST_SGL(0.71084847864067f)}, + {FL2FXCONST_SGL(-0.86875903507313f), FL2FXCONST_SGL(-0.20291699203564f)}, + {FL2FXCONST_SGL(-0.26240034795124f), FL2FXCONST_SGL(-0.68264554369108f)}, + {FL2FXCONST_SGL(-0.24664412953388f), FL2FXCONST_SGL(-0.87642273115183f)}, + {FL2FXCONST_SGL(0.02416275806869f), FL2FXCONST_SGL(0.27192914288905f)}, + {FL2FXCONST_SGL(0.82068619590515f), FL2FXCONST_SGL(-0.85087787994476f)}, + {FL2FXCONST_SGL(0.88547373760759f), FL2FXCONST_SGL(-0.89636802901469f)}, + {FL2FXCONST_SGL(-0.18173078152226f), FL2FXCONST_SGL(-0.26152145156800f)}, + {FL2FXCONST_SGL(0.09355476558534f), FL2FXCONST_SGL(0.54845123045604f)}, + {FL2FXCONST_SGL(-0.54668414224090f), FL2FXCONST_SGL(0.95980774020221f)}, + {FL2FXCONST_SGL(0.37050990604091f), FL2FXCONST_SGL(-0.59910140383171f)}, + {FL2FXCONST_SGL(-0.70373594262891f), FL2FXCONST_SGL(0.91227665827081f)}, + {FL2FXCONST_SGL(-0.34600785879594f), FL2FXCONST_SGL(-0.99441426144200f)}, + {FL2FXCONST_SGL(-0.68774481731008f), FL2FXCONST_SGL(-0.30238837956299f)}, + {FL2FXCONST_SGL(-0.26843291251234f), FL2FXCONST_SGL(0.83115668004362f)}, + {FL2FXCONST_SGL(0.49072334613242f), FL2FXCONST_SGL(-0.45359708737775f)}, + {FL2FXCONST_SGL(0.38975993093975f), FL2FXCONST_SGL(0.95515358099121f)}, + {FL2FXCONST_SGL(-0.97757125224150f), FL2FXCONST_SGL(0.05305894580606f)}, + {FL2FXCONST_SGL(-0.17325552859616f), FL2FXCONST_SGL(-0.92770672250494f)}, + {FL2FXCONST_SGL(0.99948035025744f), FL2FXCONST_SGL(0.58285545563426f)}, + {FL2FXCONST_SGL(-0.64946246527458f), FL2FXCONST_SGL(0.68645507104960f)}, + {FL2FXCONST_SGL(-0.12016920576437f), FL2FXCONST_SGL(-0.57147322153312f)}, + {FL2FXCONST_SGL(-0.58947456517751f), FL2FXCONST_SGL(-0.34847132454388f)}, + {FL2FXCONST_SGL(-0.41815140454465f), FL2FXCONST_SGL(0.16276422358861f)}, + {FL2FXCONST_SGL(0.99885650204884f), FL2FXCONST_SGL(0.11136095490444f)}, + {FL2FXCONST_SGL(-0.56649614128386f), FL2FXCONST_SGL(-0.90494866361587f)}, + {FL2FXCONST_SGL(0.94138021032330f), FL2FXCONST_SGL(0.35281916733018f)}, + {FL2FXCONST_SGL(-0.75725076534641f), FL2FXCONST_SGL(0.53650549640587f)}, + {FL2FXCONST_SGL(0.20541973692630f), FL2FXCONST_SGL(-0.94435144369918f)}, + {FL2FXCONST_SGL(0.99980371023351f), FL2FXCONST_SGL(0.79835913565599f)}, + {FL2FXCONST_SGL(0.29078277605775f), FL2FXCONST_SGL(0.35393777921520f)}, + {FL2FXCONST_SGL(-0.62858772103030f), FL2FXCONST_SGL(0.38765693387102f)}, + {FL2FXCONST_SGL(0.43440904467688f), FL2FXCONST_SGL(-0.98546330463232f)}, + {FL2FXCONST_SGL(-0.98298583762390f), FL2FXCONST_SGL(0.21021524625209f)}, + {FL2FXCONST_SGL(0.19513029146934f), FL2FXCONST_SGL(-0.94239832251867f)}, + {FL2FXCONST_SGL(-0.95476662400101f), FL2FXCONST_SGL(0.98364554179143f)}, + {FL2FXCONST_SGL(0.93379635304810f), FL2FXCONST_SGL(-0.70881994583682f)}, + {FL2FXCONST_SGL(-0.85235410573336f), FL2FXCONST_SGL(-0.08342347966410f)}, + {FL2FXCONST_SGL(-0.86425093011245f), FL2FXCONST_SGL(-0.45795025029466f)}, + {FL2FXCONST_SGL(0.38879779059045f), FL2FXCONST_SGL(0.97274429344593f)}, + {FL2FXCONST_SGL(0.92045124735495f), FL2FXCONST_SGL(-0.62433652524220f)}, + {FL2FXCONST_SGL(0.89162532251878f), FL2FXCONST_SGL(0.54950955570563f)}, + {FL2FXCONST_SGL(-0.36834336949252f), FL2FXCONST_SGL(0.96458298020975f)}, + {FL2FXCONST_SGL(0.93891760988045f), FL2FXCONST_SGL(-0.89968353740388f)}, + {FL2FXCONST_SGL(0.99267657565094f), FL2FXCONST_SGL(-0.03757034316958f)}, + {FL2FXCONST_SGL(-0.94063471614176f), FL2FXCONST_SGL(0.41332338538963f)}, + {FL2FXCONST_SGL(0.99740224117019f), FL2FXCONST_SGL(-0.16830494996370f)}, + {FL2FXCONST_SGL(-0.35899413170555f), FL2FXCONST_SGL(-0.46633226649613f)}, + {FL2FXCONST_SGL(0.05237237274947f), FL2FXCONST_SGL(-0.25640361602661f)}, + {FL2FXCONST_SGL(0.36703583957424f), FL2FXCONST_SGL(-0.38653265641875f)}, + {FL2FXCONST_SGL(0.91653180367913f), FL2FXCONST_SGL(-0.30587628726597f)}, + {FL2FXCONST_SGL(0.69000803499316f), FL2FXCONST_SGL(0.90952171386132f)}, + {FL2FXCONST_SGL(-0.38658751133527f), FL2FXCONST_SGL(0.99501571208985f)}, + {FL2FXCONST_SGL(-0.29250814029851f), FL2FXCONST_SGL(0.37444994344615f)}, + {FL2FXCONST_SGL(-0.60182204677608f), FL2FXCONST_SGL(0.86779651036123f)}, + {FL2FXCONST_SGL(-0.97418588163217f), FL2FXCONST_SGL(0.96468523666475f)}, + {FL2FXCONST_SGL(0.88461574003963f), FL2FXCONST_SGL(0.57508405276414f)}, + {FL2FXCONST_SGL(0.05198933055162f), FL2FXCONST_SGL(0.21269661669964f)}, + {FL2FXCONST_SGL(-0.53499621979720f), FL2FXCONST_SGL(0.97241553731237f)}, + {FL2FXCONST_SGL(-0.49429560226497f), FL2FXCONST_SGL(0.98183865291903f)}, + {FL2FXCONST_SGL(-0.98935142339139f), FL2FXCONST_SGL(-0.40249159006933f)}, + {FL2FXCONST_SGL(-0.98081380091130f), FL2FXCONST_SGL(-0.72856895534041f)}, + {FL2FXCONST_SGL(-0.27338148835532f), FL2FXCONST_SGL(0.99950922447209f)}, + {FL2FXCONST_SGL(0.06310802338302f), FL2FXCONST_SGL(-0.54539587529618f)}, + {FL2FXCONST_SGL(-0.20461677199539f), FL2FXCONST_SGL(-0.14209977628489f)}, + {FL2FXCONST_SGL(0.66223843141647f), FL2FXCONST_SGL(0.72528579940326f)}, + {FL2FXCONST_SGL(-0.84764345483665f), FL2FXCONST_SGL(0.02372316801261f)}, + {FL2FXCONST_SGL(-0.89039863483811f), FL2FXCONST_SGL(0.88866581484602f)}, + {FL2FXCONST_SGL(0.95903308477986f), FL2FXCONST_SGL(0.76744927173873f)}, + {FL2FXCONST_SGL(0.73504123909879f), FL2FXCONST_SGL(-0.03747203173192f)}, + {FL2FXCONST_SGL(-0.31744434966056f), FL2FXCONST_SGL(-0.36834111883652f)}, + {FL2FXCONST_SGL(-0.34110827591623f), FL2FXCONST_SGL(0.40211222807691f)}, + {FL2FXCONST_SGL(0.47803883714199f), FL2FXCONST_SGL(-0.39423219786288f)}, + {FL2FXCONST_SGL(0.98299195879514f), FL2FXCONST_SGL(0.01989791390047f)}, + {FL2FXCONST_SGL(-0.30963073129751f), FL2FXCONST_SGL(-0.18076720599336f)}, + {FL2FXCONST_SGL(0.99992588229018f), FL2FXCONST_SGL(-0.26281872094289f)}, + {FL2FXCONST_SGL(-0.93149731080767f), FL2FXCONST_SGL(-0.98313162570490f)}, + {FL2FXCONST_SGL(0.99923472302773f), FL2FXCONST_SGL(-0.80142993767554f)}, + {FL2FXCONST_SGL(-0.26024169633417f), FL2FXCONST_SGL(-0.75999759855752f)}, + {FL2FXCONST_SGL(-0.35712514743563f), FL2FXCONST_SGL(0.19298963768574f)}, + {FL2FXCONST_SGL(-0.99899084509530f), FL2FXCONST_SGL(0.74645156992493f)}, + {FL2FXCONST_SGL(0.86557171579452f), FL2FXCONST_SGL(0.55593866696299f)}, + {FL2FXCONST_SGL(0.33408042438752f), FL2FXCONST_SGL(0.86185953874709f)}, + {FL2FXCONST_SGL(0.99010736374716f), FL2FXCONST_SGL(0.04602397576623f)}, + {FL2FXCONST_SGL(-0.66694269691195f), FL2FXCONST_SGL(-0.91643611810148f)}, + {FL2FXCONST_SGL(0.64016792079480f), FL2FXCONST_SGL(0.15649530836856f)}, + {FL2FXCONST_SGL(0.99570534804836f), FL2FXCONST_SGL(0.45844586038111f)}, + {FL2FXCONST_SGL(-0.63431466947340f), FL2FXCONST_SGL(0.21079116459234f)}, + {FL2FXCONST_SGL(-0.07706847005931f), FL2FXCONST_SGL(-0.89581437101329f)}, + {FL2FXCONST_SGL(0.98590090577724f), FL2FXCONST_SGL(0.88241721133981f)}, + {FL2FXCONST_SGL(0.80099335254678f), FL2FXCONST_SGL(-0.36851896710853f)}, + {FL2FXCONST_SGL(0.78368131392666f), FL2FXCONST_SGL(0.45506999802597f)}, + {FL2FXCONST_SGL(0.08707806671691f), FL2FXCONST_SGL(0.80938994918745f)}, + {FL2FXCONST_SGL(-0.86811883080712f), FL2FXCONST_SGL(0.39347308654705f)}, + {FL2FXCONST_SGL(-0.39466529740375f), FL2FXCONST_SGL(-0.66809432114456f)}, + {FL2FXCONST_SGL(0.97875325649683f), FL2FXCONST_SGL(-0.72467840967746f)}, + {FL2FXCONST_SGL(-0.95038560288864f), FL2FXCONST_SGL(0.89563219587625f)}, + {FL2FXCONST_SGL(0.17005239424212f), FL2FXCONST_SGL(0.54683053962658f)}, + {FL2FXCONST_SGL(-0.76910792026848f), FL2FXCONST_SGL(-0.96226617549298f)}, + {FL2FXCONST_SGL(0.99743281016846f), FL2FXCONST_SGL(0.42697157037567f)}, + {FL2FXCONST_SGL(0.95437383549973f), FL2FXCONST_SGL(0.97002324109952f)}, + {FL2FXCONST_SGL(0.99578905365569f), FL2FXCONST_SGL(-0.54106826257356f)}, + {FL2FXCONST_SGL(0.28058259829990f), FL2FXCONST_SGL(-0.85361420634036f)}, + {FL2FXCONST_SGL(0.85256524470573f), FL2FXCONST_SGL(-0.64567607735589f)}, + {FL2FXCONST_SGL(-0.50608540105128f), FL2FXCONST_SGL(-0.65846015480300f)}, + {FL2FXCONST_SGL(-0.97210735183243f), FL2FXCONST_SGL(-0.23095213067791f)}, + {FL2FXCONST_SGL(0.95424048234441f), FL2FXCONST_SGL(-0.99240147091219f)}, + {FL2FXCONST_SGL(-0.96926570524023f), FL2FXCONST_SGL(0.73775654896574f)}, + {FL2FXCONST_SGL(0.30872163214726f), FL2FXCONST_SGL(0.41514960556126f)}, + {FL2FXCONST_SGL(-0.24523839572639f), FL2FXCONST_SGL(0.63206633394807f)}, + {FL2FXCONST_SGL(-0.33813265086024f), FL2FXCONST_SGL(-0.38661779441897f)}, + {FL2FXCONST_SGL(-0.05826828420146f), FL2FXCONST_SGL(-0.06940774188029f)}, + {FL2FXCONST_SGL(-0.22898461455054f), FL2FXCONST_SGL(0.97054853316316f)}, + {FL2FXCONST_SGL(-0.18509915019881f), FL2FXCONST_SGL(0.47565762892084f)}, + {FL2FXCONST_SGL(-0.10488238045009f), FL2FXCONST_SGL(-0.87769947402394f)}, + {FL2FXCONST_SGL(-0.71886586182037f), FL2FXCONST_SGL(0.78030982480538f)}, + {FL2FXCONST_SGL(0.99793873738654f), FL2FXCONST_SGL(0.90041310491497f)}, + {FL2FXCONST_SGL(0.57563307626120f), FL2FXCONST_SGL(-0.91034337352097f)}, + {FL2FXCONST_SGL(0.28909646383717f), FL2FXCONST_SGL(0.96307783970534f)}, + {FL2FXCONST_SGL(0.42188998312520f), FL2FXCONST_SGL(0.48148651230437f)}, + {FL2FXCONST_SGL(0.93335049681047f), FL2FXCONST_SGL(-0.43537023883588f)}, + {FL2FXCONST_SGL(-0.97087374418267f), FL2FXCONST_SGL(0.86636445711364f)}, + {FL2FXCONST_SGL(0.36722871286923f), FL2FXCONST_SGL(0.65291654172961f)}, + {FL2FXCONST_SGL(-0.81093025665696f), FL2FXCONST_SGL(0.08778370229363f)}, + {FL2FXCONST_SGL(-0.26240603062237f), FL2FXCONST_SGL(-0.92774095379098f)}, + {FL2FXCONST_SGL(0.83996497984604f), FL2FXCONST_SGL(0.55839849139647f)}, + {FL2FXCONST_SGL(-0.99909615720225f), FL2FXCONST_SGL(-0.96024605713970f)}, + {FL2FXCONST_SGL(0.74649464155061f), FL2FXCONST_SGL(0.12144893606462f)}, + {FL2FXCONST_SGL(-0.74774595569805f), FL2FXCONST_SGL(-0.26898062008959f)}, + {FL2FXCONST_SGL(0.95781667469567f), FL2FXCONST_SGL(-0.79047927052628f)}, + {FL2FXCONST_SGL(0.95472308713099f), FL2FXCONST_SGL(-0.08588776019550f)}, + {FL2FXCONST_SGL(0.48708332746299f), MAXVAL_SGL}, + {FL2FXCONST_SGL(0.46332038247497f), FL2FXCONST_SGL(0.10964126185063f)}, + {FL2FXCONST_SGL(-0.76497004940162f), FL2FXCONST_SGL(0.89210929242238f)}, + {FL2FXCONST_SGL(0.57397389364339f), FL2FXCONST_SGL(0.35289703373760f)}, + {FL2FXCONST_SGL(0.75374316974495f), FL2FXCONST_SGL(0.96705214651335f)}, + {FL2FXCONST_SGL(-0.59174397685714f), FL2FXCONST_SGL(-0.89405370422752f)}, + {FL2FXCONST_SGL(0.75087906691890f), FL2FXCONST_SGL(-0.29612672982396f)}, + {FL2FXCONST_SGL(-0.98607857336230f), FL2FXCONST_SGL(0.25034911730023f)}, + {FL2FXCONST_SGL(-0.40761056640505f), FL2FXCONST_SGL(-0.90045573444695f)}, + {FL2FXCONST_SGL(0.66929266740477f), FL2FXCONST_SGL(0.98629493401748f)}, + {FL2FXCONST_SGL(-0.97463695257310f), FL2FXCONST_SGL(-0.00190223301301f)}, + {FL2FXCONST_SGL(0.90145509409859f), FL2FXCONST_SGL(0.99781390365446f)}, + {FL2FXCONST_SGL(-0.87259289048043f), FL2FXCONST_SGL(0.99233587353666f)}, + {FL2FXCONST_SGL(-0.91529461447692f), FL2FXCONST_SGL(-0.15698707534206f)}, + {FL2FXCONST_SGL(-0.03305738840705f), FL2FXCONST_SGL(-0.37205262859764f)}, + {FL2FXCONST_SGL(0.07223051368337f), FL2FXCONST_SGL(-0.88805001733626f)}, + {FL2FXCONST_SGL(0.99498012188353f), FL2FXCONST_SGL(0.97094358113387f)}, + {FL2FXCONST_SGL(-0.74904939500519f), FL2FXCONST_SGL(0.99985483641521f)}, + {FL2FXCONST_SGL(0.04585228574211f), FL2FXCONST_SGL(0.99812337444082f)}, + {FL2FXCONST_SGL(-0.89054954257993f), FL2FXCONST_SGL(-0.31791913188064f)}, + {FL2FXCONST_SGL(-0.83782144651251f), FL2FXCONST_SGL(0.97637632547466f)}, + {FL2FXCONST_SGL(0.33454804933804f), FL2FXCONST_SGL(-0.86231516800408f)}, + {FL2FXCONST_SGL(-0.99707579362824f), FL2FXCONST_SGL(0.93237990079441f)}, + {FL2FXCONST_SGL(-0.22827527843994f), FL2FXCONST_SGL(0.18874759397997f)}, + {FL2FXCONST_SGL(0.67248046289143f), FL2FXCONST_SGL(-0.03646211390569f)}, + {FL2FXCONST_SGL(-0.05146538187944f), FL2FXCONST_SGL(-0.92599700120679f)}, + {FL2FXCONST_SGL(0.99947295749905f), FL2FXCONST_SGL(0.93625229707912f)}, + {FL2FXCONST_SGL(0.66951124390363f), FL2FXCONST_SGL(0.98905825623893f)}, + {FL2FXCONST_SGL(-0.99602956559179f), FL2FXCONST_SGL(-0.44654715757688f)}, + {FL2FXCONST_SGL(0.82104905483590f), FL2FXCONST_SGL(0.99540741724928f)}, + {FL2FXCONST_SGL(0.99186510988782f), FL2FXCONST_SGL(0.72023001312947f)}, + {FL2FXCONST_SGL(-0.65284592392918f), FL2FXCONST_SGL(0.52186723253637f)}, + {FL2FXCONST_SGL(0.93885443798188f), FL2FXCONST_SGL(-0.74895312615259f)}, + {FL2FXCONST_SGL(0.96735248738388f), FL2FXCONST_SGL(0.90891816978629f)}, + {FL2FXCONST_SGL(-0.22225968841114f), FL2FXCONST_SGL(0.57124029781228f)}, + {FL2FXCONST_SGL(-0.44132783753414f), FL2FXCONST_SGL(-0.92688840659280f)}, + {FL2FXCONST_SGL(-0.85694974219574f), FL2FXCONST_SGL(0.88844532719844f)}, + {FL2FXCONST_SGL(0.91783042091762f), FL2FXCONST_SGL(-0.46356892383970f)}, + {FL2FXCONST_SGL(0.72556974415690f), FL2FXCONST_SGL(-0.99899555770747f)}, + {FL2FXCONST_SGL(-0.99711581834508f), FL2FXCONST_SGL(0.58211560180426f)}, + {FL2FXCONST_SGL(0.77638976371966f), FL2FXCONST_SGL(0.94321834873819f)}, + {FL2FXCONST_SGL(0.07717324253925f), FL2FXCONST_SGL(0.58638399856595f)}, + {FL2FXCONST_SGL(-0.56049829194163f), FL2FXCONST_SGL(0.82522301569036f)}, + {FL2FXCONST_SGL(0.98398893639988f), FL2FXCONST_SGL(0.39467440420569f)}, + {FL2FXCONST_SGL(0.47546946844938f), FL2FXCONST_SGL(0.68613044836811f)}, + {FL2FXCONST_SGL(0.65675089314631f), FL2FXCONST_SGL(0.18331637134880f)}, + {FL2FXCONST_SGL(0.03273375457980f), FL2FXCONST_SGL(-0.74933109564108f)}, + {FL2FXCONST_SGL(-0.38684144784738f), FL2FXCONST_SGL(0.51337349030406f)}, + {FL2FXCONST_SGL(-0.97346267944545f), FL2FXCONST_SGL(-0.96549364384098f)}, + {FL2FXCONST_SGL(-0.53282156061942f), FL2FXCONST_SGL(-0.91423265091354f)}, + {FL2FXCONST_SGL(0.99817310731176f), FL2FXCONST_SGL(0.61133572482148f)}, + {FL2FXCONST_SGL(-0.50254500772635f), FL2FXCONST_SGL(-0.88829338134294f)}, + {FL2FXCONST_SGL(0.01995873238855f), FL2FXCONST_SGL(0.85223515096765f)}, + {FL2FXCONST_SGL(0.99930381973804f), FL2FXCONST_SGL(0.94578896296649f)}, + {FL2FXCONST_SGL(0.82907767600783f), FL2FXCONST_SGL(-0.06323442598128f)}, + {FL2FXCONST_SGL(-0.58660709669728f), FL2FXCONST_SGL(0.96840773806582f)}, + {FL2FXCONST_SGL(-0.17573736667267f), FL2FXCONST_SGL(-0.48166920859485f)}, + {FL2FXCONST_SGL(0.83434292401346f), FL2FXCONST_SGL(-0.13023450646997f)}, + {FL2FXCONST_SGL(0.05946491307025f), FL2FXCONST_SGL(0.20511047074866f)}, + {FL2FXCONST_SGL(0.81505484574602f), FL2FXCONST_SGL(-0.94685947861369f)}, + {FL2FXCONST_SGL(-0.44976380954860f), FL2FXCONST_SGL(0.40894572671545f)}, + {FL2FXCONST_SGL(-0.89746474625671f), FL2FXCONST_SGL(0.99846578838537f)}, + {FL2FXCONST_SGL(0.39677256130792f), FL2FXCONST_SGL(-0.74854668609359f)}, + {FL2FXCONST_SGL(-0.07588948563079f), FL2FXCONST_SGL(0.74096214084170f)}, + {FL2FXCONST_SGL(0.76343198951445f), FL2FXCONST_SGL(0.41746629422634f)}, + {FL2FXCONST_SGL(-0.74490104699626f), FL2FXCONST_SGL(0.94725911744610f)}, + {FL2FXCONST_SGL(0.64880119792759f), FL2FXCONST_SGL(0.41336660830571f)}, + {FL2FXCONST_SGL(0.62319537462542f), FL2FXCONST_SGL(-0.93098313552599f)}, + {FL2FXCONST_SGL(0.42215817594807f), FL2FXCONST_SGL(-0.07712787385208f)}, + {FL2FXCONST_SGL(0.02704554141885f), FL2FXCONST_SGL(-0.05417518053666f)}, + {FL2FXCONST_SGL(0.80001773566818f), FL2FXCONST_SGL(0.91542195141039f)}, + {FL2FXCONST_SGL(-0.79351832348816f), FL2FXCONST_SGL(-0.36208897989136f)}, + {FL2FXCONST_SGL(0.63872359151636f), FL2FXCONST_SGL(0.08128252493444f)}, + {FL2FXCONST_SGL(0.52890520960295f), FL2FXCONST_SGL(0.60048872455592f)}, + {FL2FXCONST_SGL(0.74238552914587f), FL2FXCONST_SGL(0.04491915291044f)}, + {FL2FXCONST_SGL(0.99096131449250f), FL2FXCONST_SGL(-0.19451182854402f)}, + {FL2FXCONST_SGL(-0.80412329643109f), FL2FXCONST_SGL(-0.88513818199457f)}, + {FL2FXCONST_SGL(-0.64612616129736f), FL2FXCONST_SGL(0.72198674804544f)}, + {FL2FXCONST_SGL(0.11657770663191f), FL2FXCONST_SGL(-0.83662833815041f)}, + {FL2FXCONST_SGL(-0.95053182488101f), FL2FXCONST_SGL(-0.96939905138082f)}, + {FL2FXCONST_SGL(-0.62228872928622f), FL2FXCONST_SGL(0.82767262846661f)}, + {FL2FXCONST_SGL(0.03004475787316f), FL2FXCONST_SGL(-0.99738896333384f)}, + {FL2FXCONST_SGL(-0.97987214341034f), FL2FXCONST_SGL(0.36526129686425f)}, + {FL2FXCONST_SGL(-0.99986980746200f), FL2FXCONST_SGL(-0.36021610299715f)}, + {FL2FXCONST_SGL(0.89110648599879f), FL2FXCONST_SGL(-0.97894250343044f)}, + {FL2FXCONST_SGL(0.10407960510582f), FL2FXCONST_SGL(0.77357793811619f)}, + {FL2FXCONST_SGL(0.95964737821728f), FL2FXCONST_SGL(-0.35435818285502f)}, + {FL2FXCONST_SGL(0.50843233159162f), FL2FXCONST_SGL(0.96107691266205f)}, + {FL2FXCONST_SGL(0.17006334670615f), FL2FXCONST_SGL(-0.76854025314829f)}, + {FL2FXCONST_SGL(0.25872675063360f), FL2FXCONST_SGL(0.99893303933816f)}, + {FL2FXCONST_SGL(-0.01115998681937f), FL2FXCONST_SGL(0.98496019742444f)}, + {FL2FXCONST_SGL(-0.79598702973261f), FL2FXCONST_SGL(0.97138411318894f)}, + {FL2FXCONST_SGL(-0.99264708948101f), FL2FXCONST_SGL(-0.99542822402536f)}, + {FL2FXCONST_SGL(-0.99829663752818f), FL2FXCONST_SGL(0.01877138824311f)}, + {FL2FXCONST_SGL(-0.70801016548184f), FL2FXCONST_SGL(0.33680685948117f)}, + {FL2FXCONST_SGL(-0.70467057786826f), FL2FXCONST_SGL(0.93272777501857f)}, + {FL2FXCONST_SGL(0.99846021905254f), FL2FXCONST_SGL(-0.98725746254433f)}, + {FL2FXCONST_SGL(-0.63364968534650f), FL2FXCONST_SGL(-0.16473594423746f)}, + {FL2FXCONST_SGL(-0.16258217500792f), FL2FXCONST_SGL(-0.95939125400802f)}, + {FL2FXCONST_SGL(-0.43645594360633f), FL2FXCONST_SGL(-0.94805030113284f)}, + {FL2FXCONST_SGL(-0.99848471702976f), FL2FXCONST_SGL(0.96245166923809f)}, + {FL2FXCONST_SGL(-0.16796458968998f), FL2FXCONST_SGL(-0.98987511890470f)}, + {FL2FXCONST_SGL(-0.87979225745213f), FL2FXCONST_SGL(-0.71725725041680f)}, + {FL2FXCONST_SGL(0.44183099021786f), FL2FXCONST_SGL(-0.93568974498761f)}, + {FL2FXCONST_SGL(0.93310180125532f), FL2FXCONST_SGL(-0.99913308068246f)}, + {FL2FXCONST_SGL(-0.93941931782002f), FL2FXCONST_SGL(-0.56409379640356f)}, + {FL2FXCONST_SGL(-0.88590003188677f), FL2FXCONST_SGL(0.47624600491382f)}, + {FL2FXCONST_SGL(0.99971463703691f), FL2FXCONST_SGL(-0.83889954253462f)}, + {FL2FXCONST_SGL(-0.75376385639978f), FL2FXCONST_SGL(0.00814643438625f)}, + {FL2FXCONST_SGL(0.93887685615875f), FL2FXCONST_SGL(-0.11284528204636f)}, + {FL2FXCONST_SGL(0.85126435782309f), FL2FXCONST_SGL(0.52349251543547f)}, + {FL2FXCONST_SGL(0.39701421446381f), FL2FXCONST_SGL(0.81779634174316f)}, + {FL2FXCONST_SGL(-0.37024464187437f), FL2FXCONST_SGL(-0.87071656222959f)}, + {FL2FXCONST_SGL(-0.36024828242896f), FL2FXCONST_SGL(0.34655735648287f)}, + {FL2FXCONST_SGL(-0.93388812549209f), FL2FXCONST_SGL(-0.84476541096429f)}, + {FL2FXCONST_SGL(-0.65298804552119f), FL2FXCONST_SGL(-0.18439575450921f)}, + {FL2FXCONST_SGL(0.11960319006843f), FL2FXCONST_SGL(0.99899346780168f)}, + {FL2FXCONST_SGL(0.94292565553160f), FL2FXCONST_SGL(0.83163906518293f)}, + {FL2FXCONST_SGL(0.75081145286948f), FL2FXCONST_SGL(-0.35533223142265f)}, + {FL2FXCONST_SGL(0.56721979748394f), FL2FXCONST_SGL(-0.24076836414499f)}, + {FL2FXCONST_SGL(0.46857766746029f), FL2FXCONST_SGL(-0.30140233457198f)}, + {FL2FXCONST_SGL(0.97312313923635f), FL2FXCONST_SGL(-0.99548191630031f)}, + {FL2FXCONST_SGL(-0.38299976567017f), FL2FXCONST_SGL(0.98516909715427f)}, + {FL2FXCONST_SGL(0.41025800019463f), FL2FXCONST_SGL(0.02116736935734f)}, + {FL2FXCONST_SGL(0.09638062008048f), FL2FXCONST_SGL(0.04411984381457f)}, + {FL2FXCONST_SGL(-0.85283249275397f), FL2FXCONST_SGL(0.91475563922421f)}, + {FL2FXCONST_SGL(0.88866808958124f), FL2FXCONST_SGL(-0.99735267083226f)}, + {FL2FXCONST_SGL(-0.48202429536989f), FL2FXCONST_SGL(-0.96805608884164f)}, + {FL2FXCONST_SGL(0.27572582416567f), FL2FXCONST_SGL(0.58634753335832f)}, + {FL2FXCONST_SGL(-0.65889129659168f), FL2FXCONST_SGL(0.58835634138583f)}, + {FL2FXCONST_SGL(0.98838086953732f), FL2FXCONST_SGL(0.99994349600236f)}, + {FL2FXCONST_SGL(-0.20651349620689f), FL2FXCONST_SGL(0.54593044066355f)}, + {FL2FXCONST_SGL(-0.62126416356920f), FL2FXCONST_SGL(-0.59893681700392f)}, + {FL2FXCONST_SGL(0.20320105410437f), FL2FXCONST_SGL(-0.86879180355289f)}, + {FL2FXCONST_SGL(-0.97790548600584f), FL2FXCONST_SGL(0.96290806999242f)}, + {FL2FXCONST_SGL(0.11112534735126f), FL2FXCONST_SGL(0.21484763313301f)}, + {FL2FXCONST_SGL(-0.41368337314182f), FL2FXCONST_SGL(0.28216837680365f)}, + {FL2FXCONST_SGL(0.24133038992960f), FL2FXCONST_SGL(0.51294362630238f)}, + {FL2FXCONST_SGL(-0.66393410674885f), FL2FXCONST_SGL(-0.08249679629081f)}, + {FL2FXCONST_SGL(-0.53697829178752f), FL2FXCONST_SGL(-0.97649903936228f)}, + {FL2FXCONST_SGL(-0.97224737889348f), FL2FXCONST_SGL(0.22081333579837f)}, + {FL2FXCONST_SGL(0.87392477144549f), FL2FXCONST_SGL(-0.12796173740361f)}, + {FL2FXCONST_SGL(0.19050361015753f), FL2FXCONST_SGL(0.01602615387195f)}, + {FL2FXCONST_SGL(-0.46353441212724f), FL2FXCONST_SGL(-0.95249041539006f)}, + {FL2FXCONST_SGL(-0.07064096339021f), FL2FXCONST_SGL(-0.94479803205886f)}, + {FL2FXCONST_SGL(-0.92444085484466f), FL2FXCONST_SGL(-0.10457590187436f)}, + {FL2FXCONST_SGL(-0.83822593578728f), FL2FXCONST_SGL(-0.01695043208885f)}, + {FL2FXCONST_SGL(0.75214681811150f), FL2FXCONST_SGL(-0.99955681042665f)}, + {FL2FXCONST_SGL(-0.42102998829339f), FL2FXCONST_SGL(0.99720941999394f)}, + {FL2FXCONST_SGL(-0.72094786237696f), FL2FXCONST_SGL(-0.35008961934255f)}, + {FL2FXCONST_SGL(0.78843311019251f), FL2FXCONST_SGL(0.52851398958271f)}, + {FL2FXCONST_SGL(0.97394027897442f), FL2FXCONST_SGL(-0.26695944086561f)}, + {FL2FXCONST_SGL(0.99206463477946f), FL2FXCONST_SGL(-0.57010120849429f)}, + {FL2FXCONST_SGL(0.76789609461795f), FL2FXCONST_SGL(-0.76519356730966f)}, + {FL2FXCONST_SGL(-0.82002421836409f), FL2FXCONST_SGL(-0.73530179553767f)}, + {FL2FXCONST_SGL(0.81924990025724f), FL2FXCONST_SGL(0.99698425250579f)}, + {FL2FXCONST_SGL(-0.26719850873357f), FL2FXCONST_SGL(0.68903369776193f)}, + {FL2FXCONST_SGL(-0.43311260380975f), FL2FXCONST_SGL(0.85321815947490f)}, + {FL2FXCONST_SGL(0.99194979673836f), FL2FXCONST_SGL(0.91876249766422f)}, + {FL2FXCONST_SGL(-0.80692001248487f), FL2FXCONST_SGL(-0.32627540663214f)}, + {FL2FXCONST_SGL(0.43080003649976f), FL2FXCONST_SGL(-0.21919095636638f)}, + {FL2FXCONST_SGL(0.67709491937357f), FL2FXCONST_SGL(-0.95478075822906f)}, + {FL2FXCONST_SGL(0.56151770568316f), FL2FXCONST_SGL(-0.70693811747778f)}, + {FL2FXCONST_SGL(0.10831862810749f), FL2FXCONST_SGL(-0.08628837174592f)}, + {FL2FXCONST_SGL(0.91229417540436f), FL2FXCONST_SGL(-0.65987351408410f)}, + {FL2FXCONST_SGL(-0.48972893932274f), FL2FXCONST_SGL(0.56289246362686f)}, + {FL2FXCONST_SGL(-0.89033658689697f), FL2FXCONST_SGL(-0.71656563987082f)}, + {FL2FXCONST_SGL(0.65269447475094f), FL2FXCONST_SGL(0.65916004833932f)}, + {FL2FXCONST_SGL(0.67439478141121f), FL2FXCONST_SGL(-0.81684380846796f)}, + {FL2FXCONST_SGL(-0.47770832416973f), FL2FXCONST_SGL(-0.16789556203025f)}, + {FL2FXCONST_SGL(-0.99715979260878f), FL2FXCONST_SGL(-0.93565784007648f)}, + {FL2FXCONST_SGL(-0.90889593602546f), FL2FXCONST_SGL(0.62034397054380f)}, + {FL2FXCONST_SGL(-0.06618622548177f), FL2FXCONST_SGL(-0.23812217221359f)}, + {FL2FXCONST_SGL(0.99430266919728f), FL2FXCONST_SGL(0.18812555317553f)}, + {FL2FXCONST_SGL(0.97686402381843f), FL2FXCONST_SGL(-0.28664534366620f)}, + {FL2FXCONST_SGL(0.94813650221268f), FL2FXCONST_SGL(-0.97506640027128f)}, + {FL2FXCONST_SGL(-0.95434497492853f), FL2FXCONST_SGL(-0.79607978501983f)}, + {FL2FXCONST_SGL(-0.49104783137150f), FL2FXCONST_SGL(0.32895214359663f)}, + {FL2FXCONST_SGL(0.99881175120751f), FL2FXCONST_SGL(0.88993983831354f)}, + {FL2FXCONST_SGL(0.50449166760303f), FL2FXCONST_SGL(-0.85995072408434f)}, + {FL2FXCONST_SGL(0.47162891065108f), FL2FXCONST_SGL(-0.18680204049569f)}, + {FL2FXCONST_SGL(-0.62081581361840f), FL2FXCONST_SGL(0.75000676218956f)}, + {FL2FXCONST_SGL(-0.43867015250812f), FL2FXCONST_SGL(0.99998069244322f)}, + {FL2FXCONST_SGL(0.98630563232075f), FL2FXCONST_SGL(-0.53578899600662f)}, + {FL2FXCONST_SGL(-0.61510362277374f), FL2FXCONST_SGL(-0.89515019899997f)}, + {FL2FXCONST_SGL(-0.03841517601843f), FL2FXCONST_SGL(-0.69888815681179f)}, + {FL2FXCONST_SGL(-0.30102157304644f), FL2FXCONST_SGL(-0.07667808922205f)}, + {FL2FXCONST_SGL(0.41881284182683f), FL2FXCONST_SGL(0.02188098922282f)}, + {FL2FXCONST_SGL(-0.86135454941237f), FL2FXCONST_SGL(0.98947480909359f)}, + {FL2FXCONST_SGL(0.67226861393788f), FL2FXCONST_SGL(-0.13494389011014f)}, + {FL2FXCONST_SGL(-0.70737398842068f), FL2FXCONST_SGL(-0.76547349325992f)}, + {FL2FXCONST_SGL(0.94044946687963f), FL2FXCONST_SGL(0.09026201157416f)}, + {FL2FXCONST_SGL(-0.82386352534327f), FL2FXCONST_SGL(0.08924768823676f)}, + {FL2FXCONST_SGL(-0.32070666698656f), FL2FXCONST_SGL(0.50143421908753f)}, + {FL2FXCONST_SGL(0.57593163224487f), FL2FXCONST_SGL(-0.98966422921509f)}, + {FL2FXCONST_SGL(-0.36326018419965f), FL2FXCONST_SGL(0.07440243123228f)}, + {FL2FXCONST_SGL(0.99979044674350f), FL2FXCONST_SGL(-0.14130287347405f)}, + {FL2FXCONST_SGL(-0.92366023326932f), FL2FXCONST_SGL(-0.97979298068180f)}, + {FL2FXCONST_SGL(-0.44607178518598f), FL2FXCONST_SGL(-0.54233252016394f)}, + {FL2FXCONST_SGL(0.44226800932956f), FL2FXCONST_SGL(0.71326756742752f)}, + {FL2FXCONST_SGL(0.03671907158312f), FL2FXCONST_SGL(0.63606389366675f)}, + {FL2FXCONST_SGL(0.52175424682195f), FL2FXCONST_SGL(-0.85396826735705f)}, + {FL2FXCONST_SGL(-0.94701139690956f), FL2FXCONST_SGL(-0.01826348194255f)}, + {FL2FXCONST_SGL(-0.98759606946049f), FL2FXCONST_SGL(0.82288714303073f)}, + {FL2FXCONST_SGL(0.87434794743625f), FL2FXCONST_SGL(0.89399495655433f)}, + {FL2FXCONST_SGL(-0.93412041758744f), FL2FXCONST_SGL(0.41374052024363f)}, + {FL2FXCONST_SGL(0.96063943315511f), FL2FXCONST_SGL(0.93116709541280f)}, + {FL2FXCONST_SGL(0.97534253457837f), FL2FXCONST_SGL(0.86150930812689f)}, + {FL2FXCONST_SGL(0.99642466504163f), FL2FXCONST_SGL(0.70190043427512f)}, + {FL2FXCONST_SGL(-0.94705089665984f), FL2FXCONST_SGL(-0.29580042814306f)}, + {FL2FXCONST_SGL(0.91599807087376f), FL2FXCONST_SGL(-0.98147830385781f)}}; //@} /* diff --git a/libSBRdec/src/sbrdecoder.cpp b/libSBRdec/src/sbrdecoder.cpp index 45712b5..58ab9a3 100644 --- a/libSBRdec/src/sbrdecoder.cpp +++ b/libSBRdec/src/sbrdecoder.cpp @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -871,11 +871,10 @@ INT sbrDecoder_Header(HANDLE_SBRDECODER self, HANDLE_FDK_BITSTREAM hBs, if (sbrError == SBRDEC_OK) { hSbrHeader->syncState = SBR_HEADER; hSbrHeader->status |= SBRDEC_HDR_STAT_UPDATE; + } else { + hSbrHeader->syncState = SBR_NOT_INITIALIZED; + hSbrHeader->status = HEADER_ERROR; } - /* else { - Since we already have overwritten the old SBR header the only way out - is UPSAMPLING! This will be prepared in the next step. - } */ } } } @@ -1150,6 +1149,11 @@ SBR_ERROR sbrDecoder_Parse(HANDLE_SBRDECODER self, HANDLE_FDK_BITSTREAM hBs, int lastSlot, lastHdrSlot = 0, thisHdrSlot = 0; + if (*count <= 0) { + setFrameErrorFlag(self->pSbrElement[elementIndex], FRAME_ERROR); + return SBRDEC_OK; + } + /* SBR sanity checks */ if (self == NULL) { errorStatus = SBRDEC_NOT_INITIALIZED; @@ -1677,6 +1681,9 @@ static SBR_ERROR sbrDecoder_DecodeElement( /* reset */ if (hSbrHeader->status & SBRDEC_HDR_STAT_RESET) { int ch; + int applySbrProc = (hSbrHeader->syncState == SBR_ACTIVE || + (hSbrHeader->frameErrorFlag == 0 && + hSbrHeader->syncState == SBR_HEADER)); for (ch = 0; ch < numElementChannels; ch++) { SBR_ERROR errorStatusTmp = SBRDEC_OK; @@ -1688,7 +1695,9 @@ static SBR_ERROR sbrDecoder_DecodeElement( hSbrHeader->syncState = UPSAMPLING; } } - hSbrHeader->status &= ~SBRDEC_HDR_STAT_RESET; + if (applySbrProc) { + hSbrHeader->status &= ~SBRDEC_HDR_STAT_RESET; + } } /* decoding */ diff --git a/libSYS/include/machine_type.h b/libSYS/include/machine_type.h index be8de37..b66d5ad 100644 --- a/libSYS/include/machine_type.h +++ b/libSYS/include/machine_type.h @@ -379,6 +379,17 @@ it. Hence, a fully platform-independant way to use alignment is not supported. #define LNK_SECTION_L1_DATA_A #define LNK_SECTION_L1_DATA_B +/************************************************** + * Macros regarding static code analysis + **************************************************/ +#if defined(__clang__) +#define FDK_FALLTHROUGH [[clang::fallthrough]] +#elif defined(__GNUC__) && (__GNUC__ >= 7) +#define FDK_FALLTHROUGH __attribute__((fallthrough)) +#else +#define FDK_FALLTHROUGH +#endif + #ifdef _MSC_VER /* * Sometimes certain features are excluded from compilation and therefore the |