Home | History | Annotate | Download | only in src
      1 /* -----------------------------------------------------------------------------
      2 Software License for The Fraunhofer FDK AAC Codec Library for Android
      3 
      4  Copyright  1995 - 2018 Fraunhofer-Gesellschaft zur Frderung der angewandten
      5 Forschung e.V. All rights reserved.
      6 
      7  1.    INTRODUCTION
      8 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
      9 that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
     10 scheme for digital audio. This FDK AAC Codec software is intended to be used on
     11 a wide variety of Android devices.
     12 
     13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
     14 general perceptual audio codecs. AAC-ELD is considered the best-performing
     15 full-bandwidth communications codec by independent studies and is widely
     16 deployed. AAC has been standardized by ISO and IEC as part of the MPEG
     17 specifications.
     18 
     19 Patent licenses for necessary patent claims for the FDK AAC Codec (including
     20 those of Fraunhofer) may be obtained through Via Licensing
     21 (www.vialicensing.com) or through the respective patent owners individually for
     22 the purpose of encoding or decoding bit streams in products that are compliant
     23 with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
     24 Android devices already license these patent claims through Via Licensing or
     25 directly from the patent owners, and therefore FDK AAC Codec software may
     26 already be covered under those patent licenses when it is used for those
     27 licensed purposes only.
     28 
     29 Commercially-licensed AAC software libraries, including floating-point versions
     30 with enhanced sound quality, are also available from Fraunhofer. Users are
     31 encouraged to check the Fraunhofer website for additional applications
     32 information and documentation.
     33 
     34 2.    COPYRIGHT LICENSE
     35 
     36 Redistribution and use in source and binary forms, with or without modification,
     37 are permitted without payment of copyright license fees provided that you
     38 satisfy the following conditions:
     39 
     40 You must retain the complete text of this software license in redistributions of
     41 the FDK AAC Codec or your modifications thereto in source code form.
     42 
     43 You must retain the complete text of this software license in the documentation
     44 and/or other materials provided with redistributions of the FDK AAC Codec or
     45 your modifications thereto in binary form. You must make available free of
     46 charge copies of the complete source code of the FDK AAC Codec and your
     47 modifications thereto to recipients of copies in binary form.
     48 
     49 The name of Fraunhofer may not be used to endorse or promote products derived
     50 from this library without prior written permission.
     51 
     52 You may not charge copyright license fees for anyone to use, copy or distribute
     53 the FDK AAC Codec software or your modifications thereto.
     54 
     55 Your modified versions of the FDK AAC Codec must carry prominent notices stating
     56 that you changed the software and the date of any change. For modified versions
     57 of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
     58 must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
     59 AAC Codec Library for Android."
     60 
     61 3.    NO PATENT LICENSE
     62 
     63 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
     64 limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
     65 Fraunhofer provides no warranty of patent non-infringement with respect to this
     66 software.
     67 
     68 You may use this FDK AAC Codec software or modifications thereto only for
     69 purposes that are authorized by appropriate patent licenses.
     70 
     71 4.    DISCLAIMER
     72 
     73 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
     74 holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
     75 including but not limited to the implied warranties of merchantability and
     76 fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
     77 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
     78 or consequential damages, including but not limited to procurement of substitute
     79 goods or services; loss of use, data, or profits, or business interruption,
     80 however caused and on any theory of liability, whether in contract, strict
     81 liability, or tort (including negligence), arising in any way out of the use of
     82 this software, even if advised of the possibility of such damage.
     83 
     84 5.    CONTACT INFORMATION
     85 
     86 Fraunhofer Institute for Integrated Circuits IIS
     87 Attention: Audio and Multimedia Departments - FDK AAC LL
     88 Am Wolfsmantel 33
     89 91058 Erlangen, Germany
     90 
     91 www.iis.fraunhofer.de/amm
     92 amm-info (at) iis.fraunhofer.de
     93 ----------------------------------------------------------------------------- */
     94 
     95 /******************* Library for basic calculation routines ********************
     96 
     97    Author(s):
     98 
     99    Description:
    100 
    101 *******************************************************************************/
    102 
    103 /*!
    104   \file   dct.cpp
    105   \brief  DCT Implementations
    106   Library functions to calculate standard DCTs. This will most likely be
    107   replaced by hand-optimized functions for the specific target processor.
    108 
    109   Three different implementations of the dct type II and the dct type III
    110   transforms are provided.
    111 
    112   By default implementations which are based on a single, standard complex
    113   FFT-kernel are used (dctII_f() and dctIII_f()). These are specifically helpful
    114   in cases where optimized FFT libraries are already available. The FFT used in
    115   these implementation is FFT rad2 from FDK_tools.
    116 
    117   Of course, one might also use DCT-libraries should they be available. The DCT
    118   and DST type IV implementations are only available in a version based on a
    119   complex FFT kernel.
    120 */
    121 
    122 #include "dct.h"
    123 
    124 #include "FDK_tools_rom.h"
    125 #include "fft.h"
    126 
    127 #if defined(__arm__)
    128 #include "arm/dct_arm.cpp"
    129 #endif
    130 
    131 void dct_getTables(const FIXP_WTP **ptwiddle, const FIXP_STP **sin_twiddle,
    132                    int *sin_step, int length) {
    133   const FIXP_WTP *twiddle;
    134   int ld2_length;
    135 
    136   /* Get ld2 of length - 2 + 1
    137       -2: because first table entry is window of size 4
    138       +1: because we already include +1 because of ceil(log2(length)) */
    139   ld2_length = DFRACT_BITS - 1 - fNormz((FIXP_DBL)length) - 1;
    140 
    141   /* Extract sort of "eigenvalue" (the 4 left most bits) of length. */
    142   switch ((length) >> (ld2_length - 1)) {
    143     case 0x4: /* radix 2 */
    144       *sin_twiddle = SineTable1024;
    145       *sin_step = 1 << (10 - ld2_length);
    146       twiddle = windowSlopes[0][0][ld2_length - 1];
    147       break;
    148     case 0x7: /* 10 ms */
    149       *sin_twiddle = SineTable480;
    150       *sin_step = 1 << (8 - ld2_length);
    151       twiddle = windowSlopes[0][1][ld2_length];
    152       break;
    153     case 0x6: /* 3/4 of radix 2 */
    154       *sin_twiddle = SineTable384;
    155       *sin_step = 1 << (8 - ld2_length);
    156       twiddle = windowSlopes[0][2][ld2_length];
    157       break;
    158     case 0x5: /* 5/16 of radix 2*/
    159       *sin_twiddle = SineTable80;
    160       *sin_step = 1 << (6 - ld2_length);
    161       twiddle = windowSlopes[0][3][ld2_length];
    162       break;
    163     default:
    164       *sin_twiddle = NULL;
    165       *sin_step = 0;
    166       twiddle = NULL;
    167       break;
    168   }
    169 
    170   if (ptwiddle != NULL) {
    171     FDK_ASSERT(twiddle != NULL);
    172     *ptwiddle = twiddle;
    173   }
    174 
    175   FDK_ASSERT(*sin_step > 0);
    176 }
    177 
    178 #if !defined(FUNCTION_dct_III)
    179 void dct_III(FIXP_DBL *pDat, /*!< pointer to input/output */
    180              FIXP_DBL *tmp,  /*!< pointer to temporal working buffer */
    181              int L,          /*!< lenght of transform */
    182              int *pDat_e) {
    183   const FIXP_WTP *sin_twiddle;
    184   int i;
    185   FIXP_DBL xr, accu1, accu2;
    186   int inc, index;
    187   int M = L >> 1;
    188 
    189   FDK_ASSERT(L % 4 == 0);
    190   dct_getTables(NULL, &sin_twiddle, &inc, L);
    191   inc >>= 1;
    192 
    193   FIXP_DBL *pTmp_0 = &tmp[2];
    194   FIXP_DBL *pTmp_1 = &tmp[(M - 1) * 2];
    195 
    196   index = 4 * inc;
    197 
    198   /* This loop performs multiplication for index i (i*inc) */
    199   for (i = 1; i<M>> 1; i++, pTmp_0 += 2, pTmp_1 -= 2) {
    200     FIXP_DBL accu3, accu4, accu5, accu6;
    201 
    202     cplxMultDiv2(&accu2, &accu1, pDat[L - i], pDat[i], sin_twiddle[i * inc]);
    203     cplxMultDiv2(&accu4, &accu3, pDat[M + i], pDat[M - i],
    204                  sin_twiddle[(M - i) * inc]);
    205     accu3 >>= 1;
    206     accu4 >>= 1;
    207 
    208     /* This method is better for ARM926, that uses operand2 shifted right by 1
    209      * always */
    210     if (2 * i < (M / 2)) {
    211       cplxMultDiv2(&accu6, &accu5, (accu3 - (accu1 >> 1)),
    212                    ((accu2 >> 1) + accu4), sin_twiddle[index]);
    213     } else {
    214       cplxMultDiv2(&accu6, &accu5, ((accu2 >> 1) + accu4),
    215                    (accu3 - (accu1 >> 1)), sin_twiddle[index]);
    216       accu6 = -accu6;
    217     }
    218     xr = (accu1 >> 1) + accu3;
    219     pTmp_0[0] = (xr >> 1) - accu5;
    220     pTmp_1[0] = (xr >> 1) + accu5;
    221 
    222     xr = (accu2 >> 1) - accu4;
    223     pTmp_0[1] = (xr >> 1) - accu6;
    224     pTmp_1[1] = -((xr >> 1) + accu6);
    225 
    226     /* Create index helper variables for (4*i)*inc indexed equivalent values of
    227      * short tables. */
    228     if (2 * i < ((M / 2) - 1)) {
    229       index += 4 * inc;
    230     } else if (2 * i >= ((M / 2))) {
    231       index -= 4 * inc;
    232     }
    233   }
    234 
    235   xr = fMultDiv2(pDat[M], sin_twiddle[M * inc].v.re); /* cos((PI/(2*L))*M); */
    236   tmp[0] = ((pDat[0] >> 1) + xr) >> 1;
    237   tmp[1] = ((pDat[0] >> 1) - xr) >> 1;
    238 
    239   cplxMultDiv2(&accu2, &accu1, pDat[L - (M / 2)], pDat[M / 2],
    240                sin_twiddle[M * inc / 2]);
    241   tmp[M] = accu1 >> 1;
    242   tmp[M + 1] = accu2 >> 1;
    243 
    244   /* dit_fft expects 1 bit scaled input values */
    245   fft(M, tmp, pDat_e);
    246 
    247   /* ARM926: 12 cycles per 2-iteration, no overhead code by compiler */
    248   pTmp_1 = &tmp[L];
    249   for (i = M >> 1; i--;) {
    250     FIXP_DBL tmp1, tmp2, tmp3, tmp4;
    251     tmp1 = *tmp++;
    252     tmp2 = *tmp++;
    253     tmp3 = *--pTmp_1;
    254     tmp4 = *--pTmp_1;
    255     *pDat++ = tmp1;
    256     *pDat++ = tmp3;
    257     *pDat++ = tmp2;
    258     *pDat++ = tmp4;
    259   }
    260 
    261   *pDat_e += 2;
    262 }
    263 
    264 void dst_III(FIXP_DBL *pDat, /*!< pointer to input/output */
    265              FIXP_DBL *tmp,  /*!< pointer to temporal working buffer */
    266              int L,          /*!< lenght of transform */
    267              int *pDat_e) {
    268   int L2 = L >> 1;
    269   int i;
    270   FIXP_DBL t;
    271 
    272   /* note: DCT III is reused here, direct DST III implementation might be more
    273    * efficient */
    274 
    275   /* mirror input */
    276   for (i = 0; i < L2; i++) {
    277     t = pDat[i];
    278     pDat[i] = pDat[L - 1 - i];
    279     pDat[L - 1 - i] = t;
    280   }
    281 
    282   /* DCT-III */
    283   dct_III(pDat, tmp, L, pDat_e);
    284 
    285   /* flip signs at odd indices */
    286   for (i = 1; i < L; i += 2) pDat[i] = -pDat[i];
    287 }
    288 
    289 #endif
    290 
    291 #if !defined(FUNCTION_dct_II)
    292 void dct_II(
    293     FIXP_DBL *pDat, /*!< pointer to input/output */
    294     FIXP_DBL *tmp,  /*!< pointer to temporal working buffer */
    295     int L, /*!< lenght of transform (has to be a multiple of 8 (or 4 in case
    296               DCT_II_L_MULTIPLE_OF_4_SUPPORT is defined) */
    297     int *pDat_e) {
    298   const FIXP_WTP *sin_twiddle;
    299   FIXP_DBL accu1, accu2;
    300   FIXP_DBL *pTmp_0, *pTmp_1;
    301 
    302   int i;
    303   int inc, index = 0;
    304   int M = L >> 1;
    305 
    306   FDK_ASSERT(L % 4 == 0);
    307   dct_getTables(NULL, &sin_twiddle, &inc, L);
    308   inc >>= 1;
    309 
    310   {
    311     for (i = 0; i < M; i++) {
    312       tmp[i] = pDat[2 * i] >> 1; /* dit_fft expects 1 bit scaled input values */
    313       tmp[L - 1 - i] =
    314           pDat[2 * i + 1] >> 1; /* dit_fft expects 1 bit scaled input values */
    315     }
    316   }
    317 
    318   fft(M, tmp, pDat_e);
    319 
    320   pTmp_0 = &tmp[2];
    321   pTmp_1 = &tmp[(M - 1) * 2];
    322 
    323   index = inc * 4;
    324 
    325   for (i = 1; i<M>> 1; i++, pTmp_0 += 2, pTmp_1 -= 2) {
    326     FIXP_DBL a1, a2;
    327     FIXP_DBL accu3, accu4;
    328 
    329     a1 = ((pTmp_0[1] >> 1) + (pTmp_1[1] >> 1));
    330     a2 = ((pTmp_1[0] >> 1) - (pTmp_0[0] >> 1));
    331 
    332     if (2 * i < (M / 2)) {
    333       cplxMultDiv2(&accu1, &accu2, a2, a1, sin_twiddle[index]);
    334     } else {
    335       cplxMultDiv2(&accu1, &accu2, a1, a2, sin_twiddle[index]);
    336       accu1 = -accu1;
    337     }
    338     accu1 <<= 1;
    339     accu2 <<= 1;
    340 
    341     a1 = ((pTmp_0[0] >> 1) + (pTmp_1[0] >> 1));
    342     a2 = ((pTmp_0[1] >> 1) - (pTmp_1[1] >> 1));
    343 
    344     cplxMultDiv2(&accu3, &accu4, (a1 + accu2), -(accu1 + a2),
    345                  sin_twiddle[i * inc]);
    346     pDat[L - i] = accu4;
    347     pDat[i] = accu3;
    348 
    349     cplxMultDiv2(&accu3, &accu4, (a1 - accu2), -(accu1 - a2),
    350                  sin_twiddle[(M - i) * inc]);
    351     pDat[M + i] = accu4;
    352     pDat[M - i] = accu3;
    353 
    354     /* Create index helper variables for (4*i)*inc indexed equivalent values of
    355      * short tables. */
    356     if (2 * i < ((M / 2) - 1)) {
    357       index += 4 * inc;
    358     } else if (2 * i >= ((M / 2))) {
    359       index -= 4 * inc;
    360     }
    361   }
    362 
    363   cplxMultDiv2(&accu1, &accu2, tmp[M], tmp[M + 1], sin_twiddle[(M / 2) * inc]);
    364   pDat[L - (M / 2)] = accu2;
    365   pDat[M / 2] = accu1;
    366 
    367   pDat[0] = (tmp[0] >> 1) + (tmp[1] >> 1);
    368   pDat[M] = fMult(((tmp[0] >> 1) - (tmp[1] >> 1)),
    369                   sin_twiddle[M * inc].v.re); /* cos((PI/(2*L))*M); */
    370 
    371   *pDat_e += 2;
    372 }
    373 #endif
    374 
    375 #if !defined(FUNCTION_dct_IV)
    376 
    377 void dct_IV(FIXP_DBL *pDat, int L, int *pDat_e) {
    378   int sin_step = 0;
    379   int M = L >> 1;
    380 
    381   const FIXP_WTP *twiddle;
    382   const FIXP_STP *sin_twiddle;
    383 
    384   FDK_ASSERT(L >= 4);
    385 
    386   FDK_ASSERT(L >= 4);
    387 
    388   dct_getTables(&twiddle, &sin_twiddle, &sin_step, L);
    389 
    390 #ifdef FUNCTION_dct_IV_func1
    391   if (M >= 4 && (M & 3) == 0) {
    392     /* ARM926: 44 cycles for 2 iterations = 22 cycles/iteration */
    393     dct_IV_func1(M >> 2, twiddle, &pDat[0], &pDat[L - 1]);
    394   } else
    395 #endif /* FUNCTION_dct_IV_func1 */
    396   {
    397     FIXP_DBL *RESTRICT pDat_0 = &pDat[0];
    398     FIXP_DBL *RESTRICT pDat_1 = &pDat[L - 2];
    399     int i;
    400 
    401     /* 29 cycles on ARM926 */
    402     for (i = 0; i < M - 1; i += 2, pDat_0 += 2, pDat_1 -= 2) {
    403       FIXP_DBL accu1, accu2, accu3, accu4;
    404 
    405       accu1 = pDat_1[1];
    406       accu2 = pDat_0[0];
    407       accu3 = pDat_0[1];
    408       accu4 = pDat_1[0];
    409 
    410       cplxMultDiv2(&accu1, &accu2, accu1, accu2, twiddle[i]);
    411       cplxMultDiv2(&accu3, &accu4, accu4, accu3, twiddle[i + 1]);
    412 
    413       pDat_0[0] = accu2;
    414       pDat_0[1] = accu1;
    415       pDat_1[0] = accu4;
    416       pDat_1[1] = -accu3;
    417     }
    418     if (M & 1) {
    419       FIXP_DBL accu1, accu2;
    420 
    421       accu1 = pDat_1[1];
    422       accu2 = pDat_0[0];
    423 
    424       cplxMultDiv2(&accu1, &accu2, accu1, accu2, twiddle[i]);
    425 
    426       pDat_0[0] = accu2;
    427       pDat_0[1] = accu1;
    428     }
    429   }
    430 
    431   fft(M, pDat, pDat_e);
    432 
    433 #ifdef FUNCTION_dct_IV_func2
    434   if (M >= 4 && (M & 3) == 0) {
    435     /* ARM926: 42 cycles for 2 iterations = 21 cycles/iteration */
    436     dct_IV_func2(M >> 2, sin_twiddle, &pDat[0], &pDat[L], sin_step);
    437   } else
    438 #endif /* FUNCTION_dct_IV_func2 */
    439   {
    440     FIXP_DBL *RESTRICT pDat_0 = &pDat[0];
    441     FIXP_DBL *RESTRICT pDat_1 = &pDat[L - 2];
    442     FIXP_DBL accu1, accu2, accu3, accu4;
    443     int idx, i;
    444 
    445     /* Sin and Cos values are 0.0f and 1.0f */
    446     accu1 = pDat_1[0];
    447     accu2 = pDat_1[1];
    448 
    449     pDat_1[1] = -(pDat_0[1] >> 1);
    450     pDat_0[0] = (pDat_0[0] >> 1);
    451 
    452     /* 28 cycles for ARM926 */
    453     for (idx = sin_step, i = 1; i<(M + 1)>> 1; i++, idx += sin_step) {
    454       FIXP_STP twd = sin_twiddle[idx];
    455       cplxMultDiv2(&accu3, &accu4, accu1, accu2, twd);
    456       pDat_0[1] = accu3;
    457       pDat_1[0] = accu4;
    458 
    459       pDat_0 += 2;
    460       pDat_1 -= 2;
    461 
    462       cplxMultDiv2(&accu3, &accu4, pDat_0[1], pDat_0[0], twd);
    463 
    464       accu1 = pDat_1[0];
    465       accu2 = pDat_1[1];
    466 
    467       pDat_1[1] = -accu3;
    468       pDat_0[0] = accu4;
    469     }
    470 
    471     if ((M & 1) == 0) {
    472       /* Last Sin and Cos value pair are the same */
    473       accu1 = fMultDiv2(accu1, WTC(0x5a82799a));
    474       accu2 = fMultDiv2(accu2, WTC(0x5a82799a));
    475 
    476       pDat_1[0] = accu1 + accu2;
    477       pDat_0[1] = accu1 - accu2;
    478     }
    479   }
    480 
    481   /* Add twiddeling scale. */
    482   *pDat_e += 2;
    483 }
    484 #endif /* defined (FUNCTION_dct_IV) */
    485 
    486 #if !defined(FUNCTION_dst_IV)
    487 void dst_IV(FIXP_DBL *pDat, int L, int *pDat_e) {
    488   int sin_step = 0;
    489   int M = L >> 1;
    490 
    491   const FIXP_WTP *twiddle;
    492   const FIXP_STP *sin_twiddle;
    493 
    494   FDK_ASSERT(L >= 4);
    495 
    496   FDK_ASSERT(L >= 4);
    497 
    498   dct_getTables(&twiddle, &sin_twiddle, &sin_step, L);
    499 
    500 #ifdef FUNCTION_dst_IV_func1
    501   if ((M >= 4) && ((M & 3) == 0)) {
    502     dst_IV_func1(M, twiddle, &pDat[0], &pDat[L]);
    503   } else
    504 #endif
    505   {
    506     FIXP_DBL *RESTRICT pDat_0 = &pDat[0];
    507     FIXP_DBL *RESTRICT pDat_1 = &pDat[L - 2];
    508     int i;
    509 
    510     /* 34 cycles on ARM926 */
    511     for (i = 0; i < M - 1; i += 2, pDat_0 += 2, pDat_1 -= 2) {
    512       FIXP_DBL accu1, accu2, accu3, accu4;
    513 
    514       accu1 = pDat_1[1];
    515       accu2 = -pDat_0[0];
    516       accu3 = pDat_0[1];
    517       accu4 = -pDat_1[0];
    518 
    519       cplxMultDiv2(&accu1, &accu2, accu1, accu2, twiddle[i]);
    520       cplxMultDiv2(&accu3, &accu4, accu4, accu3, twiddle[i + 1]);
    521 
    522       pDat_0[0] = accu2;
    523       pDat_0[1] = accu1;
    524       pDat_1[0] = accu4;
    525       pDat_1[1] = -accu3;
    526     }
    527     if (M & 1) {
    528       FIXP_DBL accu1, accu2;
    529 
    530       accu1 = pDat_1[1];
    531       accu2 = -pDat_0[0];
    532 
    533       cplxMultDiv2(&accu1, &accu2, accu1, accu2, twiddle[i]);
    534 
    535       pDat_0[0] = accu2;
    536       pDat_0[1] = accu1;
    537     }
    538   }
    539 
    540   fft(M, pDat, pDat_e);
    541 
    542 #ifdef FUNCTION_dst_IV_func2
    543   if ((M >= 4) && ((M & 3) == 0)) {
    544     dst_IV_func2(M >> 2, sin_twiddle + sin_step, &pDat[0], &pDat[L - 1],
    545                  sin_step);
    546   } else
    547 #endif /* FUNCTION_dst_IV_func2 */
    548   {
    549     FIXP_DBL *RESTRICT pDat_0;
    550     FIXP_DBL *RESTRICT pDat_1;
    551     FIXP_DBL accu1, accu2, accu3, accu4;
    552     int idx, i;
    553 
    554     pDat_0 = &pDat[0];
    555     pDat_1 = &pDat[L - 2];
    556 
    557     /* Sin and Cos values are 0.0f and 1.0f */
    558     accu1 = pDat_1[0];
    559     accu2 = pDat_1[1];
    560 
    561     pDat_1[1] = -(pDat_0[0] >> 1);
    562     pDat_0[0] = (pDat_0[1] >> 1);
    563 
    564     for (idx = sin_step, i = 1; i<(M + 1)>> 1; i++, idx += sin_step) {
    565       FIXP_STP twd = sin_twiddle[idx];
    566 
    567       cplxMultDiv2(&accu3, &accu4, accu1, accu2, twd);
    568       pDat_1[0] = -accu3;
    569       pDat_0[1] = -accu4;
    570 
    571       pDat_0 += 2;
    572       pDat_1 -= 2;
    573 
    574       cplxMultDiv2(&accu3, &accu4, pDat_0[1], pDat_0[0], twd);
    575 
    576       accu1 = pDat_1[0];
    577       accu2 = pDat_1[1];
    578 
    579       pDat_0[0] = accu3;
    580       pDat_1[1] = -accu4;
    581     }
    582 
    583     if ((M & 1) == 0) {
    584       /* Last Sin and Cos value pair are the same */
    585       accu1 = fMultDiv2(accu1, WTC(0x5a82799a));
    586       accu2 = fMultDiv2(accu2, WTC(0x5a82799a));
    587 
    588       pDat_0[1] = -accu1 - accu2;
    589       pDat_1[0] = accu2 - accu1;
    590     }
    591   }
    592 
    593   /* Add twiddeling scale. */
    594   *pDat_e += 2;
    595 }
    596 #endif /* !defined(FUNCTION_dst_IV) */
    597