ps_dec.c
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:71k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /*
  2. ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
  3. ** Copyright (C) 2003-2005 M. Bakker, Ahead Software AG, http://www.nero.com
  4. **  
  5. ** This program is free software; you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation; either version 2 of the License, or
  8. ** (at your option) any later version.
  9. ** 
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. ** GNU General Public License for more details.
  14. ** 
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program; if not, write to the Free Software 
  17. ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  18. **
  19. ** Any non-GPL usage of this software or parts of this software is strictly
  20. ** forbidden.
  21. **
  22. ** Software using this code must display the following message visibly in the
  23. ** software:
  24. ** "FAAD2 AAC/HE-AAC/HE-AACv2/DRM decoder (c) Ahead Software, www.nero.com"
  25. ** in, for example, the about-box or help/startup screen.
  26. **
  27. ** Commercial non-GPL licensing of this software is possible.
  28. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
  29. **
  30. ** $Id: ps_dec.c,v 1.3 2005/11/01 21:41:43 gabest Exp $
  31. **/
  32. #include "common.h"
  33. #ifdef PS_DEC
  34. #include <stdlib.h>
  35. #include "ps_dec.h"
  36. #include "ps_tables.h"
  37. /* constants */
  38. #define NEGATE_IPD_MASK            (0x1000)
  39. #define DECAY_SLOPE                FRAC_CONST(0.05)
  40. #define COEF_SQRT2                 COEF_CONST(1.4142135623731)
  41. /* tables */
  42. /* filters are mirrored in coef 6, second half left out */
  43. static const real_t p8_13_20[7] =
  44. {
  45.     FRAC_CONST(0.00746082949812),
  46.     FRAC_CONST(0.02270420949825),
  47.     FRAC_CONST(0.04546865930473),
  48.     FRAC_CONST(0.07266113929591),
  49.     FRAC_CONST(0.09885108575264),
  50.     FRAC_CONST(0.11793710567217),
  51.     FRAC_CONST(0.125)
  52. };
  53. static const real_t p2_13_20[7] =
  54. {
  55.     FRAC_CONST(0.0),
  56.     FRAC_CONST(0.01899487526049),
  57.     FRAC_CONST(0.0),
  58.     FRAC_CONST(-0.07293139167538),
  59.     FRAC_CONST(0.0),
  60.     FRAC_CONST(0.30596630545168),
  61.     FRAC_CONST(0.5)
  62. };
  63. static const real_t p12_13_34[7] =
  64. {
  65.     FRAC_CONST(0.04081179924692),
  66.     FRAC_CONST(0.03812810994926),
  67.     FRAC_CONST(0.05144908135699),
  68.     FRAC_CONST(0.06399831151592),
  69.     FRAC_CONST(0.07428313801106),
  70.     FRAC_CONST(0.08100347892914),
  71.     FRAC_CONST(0.08333333333333)
  72. };
  73. static const real_t p8_13_34[7] =
  74. {
  75.     FRAC_CONST(0.01565675600122),
  76.     FRAC_CONST(0.03752716391991),
  77.     FRAC_CONST(0.05417891378782),
  78.     FRAC_CONST(0.08417044116767),
  79.     FRAC_CONST(0.10307344158036),
  80.     FRAC_CONST(0.12222452249753),
  81.     FRAC_CONST(0.125)
  82. };
  83. static const real_t p4_13_34[7] =
  84. {
  85.     FRAC_CONST(-0.05908211155639),
  86.     FRAC_CONST(-0.04871498374946),
  87.     FRAC_CONST(0.0),
  88.     FRAC_CONST(0.07778723915851),
  89.     FRAC_CONST(0.16486303567403),
  90.     FRAC_CONST(0.23279856662996),
  91.     FRAC_CONST(0.25)
  92. };
  93. #ifdef PARAM_32KHZ
  94. static const uint8_t delay_length_d[2][NO_ALLPASS_LINKS] = {
  95.     { 1, 2, 3 } /* d_24kHz */,
  96.     { 3, 4, 5 } /* d_48kHz */
  97. };
  98. #else
  99. static const uint8_t delay_length_d[NO_ALLPASS_LINKS] = {
  100.     3, 4, 5 /* d_48kHz */
  101. };
  102. #endif
  103. static const real_t filter_a[NO_ALLPASS_LINKS] = { /* a(m) = exp(-d_48kHz(m)/7) */
  104.     FRAC_CONST(0.65143905753106),
  105.     FRAC_CONST(0.56471812200776),
  106.     FRAC_CONST(0.48954165955695)
  107. };
  108. static const uint8_t group_border20[10+12 + 1] =
  109. {
  110.     6, 7, 0, 1, 2, 3, /* 6 subqmf subbands */
  111.     9, 8,             /* 2 subqmf subbands */
  112.     10, 11,           /* 2 subqmf subbands */
  113.     3, 4, 5, 6, 7, 8, 9, 11, 14, 18, 23, 35, 64
  114. };
  115. static const uint8_t group_border34[32+18 + 1] =
  116. {
  117.      0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, /* 12 subqmf subbands */
  118.      12, 13, 14, 15, 16, 17, 18, 19,                 /*  8 subqmf subbands */
  119.      20, 21, 22, 23,                                 /*  4 subqmf subbands */
  120.      24, 25, 26, 27,                                 /*  4 subqmf subbands */
  121.      28, 29, 30, 31,                                 /*  4 subqmf subbands */
  122.      32-27, 33-27, 34-27, 35-27, 36-27, 37-27, 38-27, 40-27, 42-27, 44-27, 46-27, 48-27, 51-27, 54-27, 57-27, 60-27, 64-27, 68-27, 91-27
  123. };
  124. static const uint16_t map_group2bk20[10+12] =
  125. {
  126.     (NEGATE_IPD_MASK | 1), (NEGATE_IPD_MASK | 0),
  127.     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19
  128. };
  129. static const uint16_t map_group2bk34[32+18] =
  130. {
  131.     0,  1,  2,  3,  4,  5,  6,  6,  7, (NEGATE_IPD_MASK | 2), (NEGATE_IPD_MASK | 1), (NEGATE_IPD_MASK | 0),
  132.     10, 10, 4,  5,  6,  7,  8,  9,
  133.     10, 11, 12, 9,
  134.     14, 11, 12, 13,
  135.     14, 15, 16, 13,
  136.     16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33
  137. };
  138. /* type definitions */
  139. typedef struct
  140. {
  141.     uint8_t frame_len;
  142.     uint8_t resolution20[3];
  143.     uint8_t resolution34[5];
  144.     qmf_t *work;
  145.     qmf_t **buffer;
  146.     qmf_t **temp;
  147. } hyb_info;
  148. /* static function declarations */
  149. static void ps_data_decode(ps_info *ps);
  150. static hyb_info *hybrid_init();
  151. static void channel_filter2(hyb_info *hyb, uint8_t frame_len, const real_t *filter,
  152.                             qmf_t *buffer, qmf_t **X_hybrid);
  153. static void INLINE DCT3_4_unscaled(real_t *y, real_t *x);
  154. static void channel_filter8(hyb_info *hyb, uint8_t frame_len, const real_t *filter,
  155.                             qmf_t *buffer, qmf_t **X_hybrid);
  156. static void hybrid_analysis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32],
  157.                             uint8_t use34);
  158. static void hybrid_synthesis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32],
  159.                              uint8_t use34);
  160. static int8_t delta_clip(int8_t i, int8_t min, int8_t max);
  161. static void delta_decode(uint8_t enable, int8_t *index, int8_t *index_prev,
  162.                          uint8_t dt_flag, uint8_t nr_par, uint8_t stride,
  163.                          int8_t min_index, int8_t max_index);
  164. static void delta_modulo_decode(uint8_t enable, int8_t *index, int8_t *index_prev,
  165.                                 uint8_t dt_flag, uint8_t nr_par, uint8_t stride,
  166.                                 int8_t and_modulo);
  167. static void map20indexto34(int8_t *index, uint8_t bins);
  168. #ifdef PS_LOW_POWER
  169. static void map34indexto20(int8_t *index, uint8_t bins);
  170. #endif
  171. static void ps_data_decode(ps_info *ps);
  172. static void ps_decorrelate(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64],
  173.                            qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]);
  174. static void ps_mix_phase(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64],
  175.                          qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]);
  176. /*  */
  177. static hyb_info *hybrid_init()
  178. {
  179.     uint8_t i;
  180.     hyb_info *hyb = (hyb_info*)faad_malloc(sizeof(hyb_info));
  181.     hyb->resolution34[0] = 12;
  182.     hyb->resolution34[1] = 8;
  183.     hyb->resolution34[2] = 4;
  184.     hyb->resolution34[3] = 4;
  185.     hyb->resolution34[4] = 4;
  186.     hyb->resolution20[0] = 8;
  187.     hyb->resolution20[1] = 2;
  188.     hyb->resolution20[2] = 2;
  189.     hyb->frame_len = 32;
  190.     hyb->work = (qmf_t*)faad_malloc((hyb->frame_len+12) * sizeof(qmf_t));
  191.     memset(hyb->work, 0, (hyb->frame_len+12) * sizeof(qmf_t));
  192.     hyb->buffer = (qmf_t**)faad_malloc(5 * sizeof(qmf_t*));
  193.     for (i = 0; i < 5; i++)
  194.     {
  195.         hyb->buffer[i] = (qmf_t*)faad_malloc(hyb->frame_len * sizeof(qmf_t));
  196.         memset(hyb->buffer[i], 0, hyb->frame_len * sizeof(qmf_t));
  197.     }
  198.     hyb->temp = (qmf_t**)faad_malloc(hyb->frame_len * sizeof(qmf_t*));
  199.     for (i = 0; i < hyb->frame_len; i++)
  200.     {
  201.         hyb->temp[i] = (qmf_t*)faad_malloc(12 /*max*/ * sizeof(qmf_t));
  202.     }
  203.     return hyb;
  204. }
  205. static void hybrid_free(hyb_info *hyb)
  206. {
  207.     uint8_t i;
  208.     if (hyb->work)
  209.         faad_free(hyb->work);
  210.     for (i = 0; i < 5; i++)
  211.     {
  212.         if (hyb->buffer[i])
  213.             faad_free(hyb->buffer[i]);
  214.     }
  215.     if (hyb->buffer)
  216.         faad_free(hyb->buffer);
  217.     for (i = 0; i < hyb->frame_len; i++)
  218.     {
  219.         if (hyb->temp[i])
  220.             faad_free(hyb->temp[i]);
  221.     }
  222.     if (hyb->temp)
  223.         faad_free(hyb->temp);
  224. }
  225. /* real filter, size 2 */
  226. static void channel_filter2(hyb_info *hyb, uint8_t frame_len, const real_t *filter,
  227.                             qmf_t *buffer, qmf_t **X_hybrid)
  228. {
  229.     uint8_t i;
  230.     for (i = 0; i < frame_len; i++)
  231.     {
  232.         real_t r0 = MUL_F(filter[0],(QMF_RE(buffer[0+i]) + QMF_RE(buffer[12+i])));
  233.         real_t r1 = MUL_F(filter[1],(QMF_RE(buffer[1+i]) + QMF_RE(buffer[11+i])));
  234.         real_t r2 = MUL_F(filter[2],(QMF_RE(buffer[2+i]) + QMF_RE(buffer[10+i])));
  235.         real_t r3 = MUL_F(filter[3],(QMF_RE(buffer[3+i]) + QMF_RE(buffer[9+i])));
  236.         real_t r4 = MUL_F(filter[4],(QMF_RE(buffer[4+i]) + QMF_RE(buffer[8+i])));
  237.         real_t r5 = MUL_F(filter[5],(QMF_RE(buffer[5+i]) + QMF_RE(buffer[7+i])));
  238.         real_t r6 = MUL_F(filter[6],QMF_RE(buffer[6+i]));
  239.         real_t i0 = MUL_F(filter[0],(QMF_IM(buffer[0+i]) + QMF_IM(buffer[12+i])));
  240.         real_t i1 = MUL_F(filter[1],(QMF_IM(buffer[1+i]) + QMF_IM(buffer[11+i])));
  241.         real_t i2 = MUL_F(filter[2],(QMF_IM(buffer[2+i]) + QMF_IM(buffer[10+i])));
  242.         real_t i3 = MUL_F(filter[3],(QMF_IM(buffer[3+i]) + QMF_IM(buffer[9+i])));
  243.         real_t i4 = MUL_F(filter[4],(QMF_IM(buffer[4+i]) + QMF_IM(buffer[8+i])));
  244.         real_t i5 = MUL_F(filter[5],(QMF_IM(buffer[5+i]) + QMF_IM(buffer[7+i])));
  245.         real_t i6 = MUL_F(filter[6],QMF_IM(buffer[6+i]));
  246.         /* q = 0 */
  247.         QMF_RE(X_hybrid[i][0]) = r0 + r1 + r2 + r3 + r4 + r5 + r6;
  248.         QMF_IM(X_hybrid[i][0]) = i0 + i1 + i2 + i3 + i4 + i5 + i6;
  249.         /* q = 1 */
  250.         QMF_RE(X_hybrid[i][1]) = r0 - r1 + r2 - r3 + r4 - r5 + r6;
  251.         QMF_IM(X_hybrid[i][1]) = i0 - i1 + i2 - i3 + i4 - i5 + i6;
  252.     }
  253. }
  254. /* complex filter, size 4 */
  255. static void channel_filter4(hyb_info *hyb, uint8_t frame_len, const real_t *filter,
  256.                             qmf_t *buffer, qmf_t **X_hybrid)
  257. {
  258.     uint8_t i;
  259.     real_t input_re1[2], input_re2[2], input_im1[2], input_im2[2];
  260.     for (i = 0; i < frame_len; i++)
  261.     {
  262.         input_re1[0] = -MUL_F(filter[2], (QMF_RE(buffer[i+2]) + QMF_RE(buffer[i+10]))) +
  263.             MUL_F(filter[6], QMF_RE(buffer[i+6]));
  264.         input_re1[1] = MUL_F(FRAC_CONST(-0.70710678118655),
  265.             (MUL_F(filter[1], (QMF_RE(buffer[i+1]) + QMF_RE(buffer[i+11]))) +
  266.             MUL_F(filter[3], (QMF_RE(buffer[i+3]) + QMF_RE(buffer[i+9]))) -
  267.             MUL_F(filter[5], (QMF_RE(buffer[i+5]) + QMF_RE(buffer[i+7])))));
  268.         input_im1[0] = MUL_F(filter[0], (QMF_IM(buffer[i+0]) - QMF_IM(buffer[i+12]))) -
  269.             MUL_F(filter[4], (QMF_IM(buffer[i+4]) - QMF_IM(buffer[i+8])));
  270.         input_im1[1] = MUL_F(FRAC_CONST(0.70710678118655),
  271.             (MUL_F(filter[1], (QMF_IM(buffer[i+1]) - QMF_IM(buffer[i+11]))) -
  272.             MUL_F(filter[3], (QMF_IM(buffer[i+3]) - QMF_IM(buffer[i+9]))) -
  273.             MUL_F(filter[5], (QMF_IM(buffer[i+5]) - QMF_IM(buffer[i+7])))));
  274.         input_re2[0] = MUL_F(filter[0], (QMF_RE(buffer[i+0]) - QMF_RE(buffer[i+12]))) -
  275.             MUL_F(filter[4], (QMF_RE(buffer[i+4]) - QMF_RE(buffer[i+8])));
  276.         input_re2[1] = MUL_F(FRAC_CONST(0.70710678118655),
  277.             (MUL_F(filter[1], (QMF_RE(buffer[i+1]) - QMF_RE(buffer[i+11]))) -
  278.             MUL_F(filter[3], (QMF_RE(buffer[i+3]) - QMF_RE(buffer[i+9]))) -
  279.             MUL_F(filter[5], (QMF_RE(buffer[i+5]) - QMF_RE(buffer[i+7])))));
  280.         input_im2[0] = -MUL_F(filter[2], (QMF_IM(buffer[i+2]) + QMF_IM(buffer[i+10]))) +
  281.             MUL_F(filter[6], QMF_IM(buffer[i+6]));
  282.         input_im2[1] = MUL_F(FRAC_CONST(-0.70710678118655),
  283.             (MUL_F(filter[1], (QMF_IM(buffer[i+1]) + QMF_IM(buffer[i+11]))) +
  284.             MUL_F(filter[3], (QMF_IM(buffer[i+3]) + QMF_IM(buffer[i+9]))) -
  285.             MUL_F(filter[5], (QMF_IM(buffer[i+5]) + QMF_IM(buffer[i+7])))));
  286.         /* q == 0 */
  287.         QMF_RE(X_hybrid[i][0]) =  input_re1[0] + input_re1[1] + input_im1[0] + input_im1[1];
  288.         QMF_IM(X_hybrid[i][0]) = -input_re2[0] - input_re2[1] + input_im2[0] + input_im2[1];
  289.         /* q == 1 */
  290.         QMF_RE(X_hybrid[i][1]) =  input_re1[0] - input_re1[1] - input_im1[0] + input_im1[1];
  291.         QMF_IM(X_hybrid[i][1]) =  input_re2[0] - input_re2[1] + input_im2[0] - input_im2[1];
  292.         /* q == 2 */
  293.         QMF_RE(X_hybrid[i][2]) =  input_re1[0] - input_re1[1] + input_im1[0] - input_im1[1];
  294.         QMF_IM(X_hybrid[i][2]) = -input_re2[0] + input_re2[1] + input_im2[0] - input_im2[1];
  295.         /* q == 3 */
  296.         QMF_RE(X_hybrid[i][3]) =  input_re1[0] + input_re1[1] - input_im1[0] - input_im1[1];
  297.         QMF_IM(X_hybrid[i][3]) =  input_re2[0] + input_re2[1] + input_im2[0] + input_im2[1];
  298.     }
  299. }
  300. static void INLINE DCT3_4_unscaled(real_t *y, real_t *x)
  301. {
  302.     real_t f0, f1, f2, f3, f4, f5, f6, f7, f8;
  303.     f0 = MUL_F(x[2], FRAC_CONST(0.7071067811865476));
  304.     f1 = x[0] - f0;
  305.     f2 = x[0] + f0;
  306.     f3 = x[1] + x[3];
  307.     f4 = MUL_C(x[1], COEF_CONST(1.3065629648763766));
  308.     f5 = MUL_F(f3, FRAC_CONST(-0.9238795325112866));
  309.     f6 = MUL_F(x[3], FRAC_CONST(-0.5411961001461967));
  310.     f7 = f4 + f5;
  311.     f8 = f6 - f5;
  312.     y[3] = f2 - f8;
  313.     y[0] = f2 + f8;
  314.     y[2] = f1 - f7;
  315.     y[1] = f1 + f7;
  316. }
  317. /* complex filter, size 8 */
  318. static void channel_filter8(hyb_info *hyb, uint8_t frame_len, const real_t *filter,
  319.                             qmf_t *buffer, qmf_t **X_hybrid)
  320. {
  321.     uint8_t i, n;
  322.     real_t input_re1[4], input_re2[4], input_im1[4], input_im2[4];
  323.     real_t x[4];
  324.     for (i = 0; i < frame_len; i++)
  325.     {
  326.         input_re1[0] =  MUL_F(filter[6],QMF_RE(buffer[6+i]));
  327.         input_re1[1] =  MUL_F(filter[5],(QMF_RE(buffer[5+i]) + QMF_RE(buffer[7+i])));
  328.         input_re1[2] = -MUL_F(filter[0],(QMF_RE(buffer[0+i]) + QMF_RE(buffer[12+i]))) + MUL_F(filter[4],(QMF_RE(buffer[4+i]) + QMF_RE(buffer[8+i])));
  329.         input_re1[3] = -MUL_F(filter[1],(QMF_RE(buffer[1+i]) + QMF_RE(buffer[11+i]))) + MUL_F(filter[3],(QMF_RE(buffer[3+i]) + QMF_RE(buffer[9+i])));
  330.         input_im1[0] = MUL_F(filter[5],(QMF_IM(buffer[7+i]) - QMF_IM(buffer[5+i])));
  331.         input_im1[1] = MUL_F(filter[0],(QMF_IM(buffer[12+i]) - QMF_IM(buffer[0+i]))) + MUL_F(filter[4],(QMF_IM(buffer[8+i]) - QMF_IM(buffer[4+i])));
  332.         input_im1[2] = MUL_F(filter[1],(QMF_IM(buffer[11+i]) - QMF_IM(buffer[1+i]))) + MUL_F(filter[3],(QMF_IM(buffer[9+i]) - QMF_IM(buffer[3+i])));
  333.         input_im1[3] = MUL_F(filter[2],(QMF_IM(buffer[10+i]) - QMF_IM(buffer[2+i])));
  334.         for (n = 0; n < 4; n++)
  335.         {
  336.             x[n] = input_re1[n] - input_im1[3-n];
  337.         }
  338.         DCT3_4_unscaled(x, x);
  339.         QMF_RE(X_hybrid[i][7]) = x[0];
  340.         QMF_RE(X_hybrid[i][5]) = x[2];
  341.         QMF_RE(X_hybrid[i][3]) = x[3];
  342.         QMF_RE(X_hybrid[i][1]) = x[1];
  343.         for (n = 0; n < 4; n++)
  344.         {
  345.             x[n] = input_re1[n] + input_im1[3-n];
  346.         }
  347.         DCT3_4_unscaled(x, x);
  348.         QMF_RE(X_hybrid[i][6]) = x[1];
  349.         QMF_RE(X_hybrid[i][4]) = x[3];
  350.         QMF_RE(X_hybrid[i][2]) = x[2];
  351.         QMF_RE(X_hybrid[i][0]) = x[0];
  352.         input_im2[0] =  MUL_F(filter[6],QMF_IM(buffer[6+i]));
  353.         input_im2[1] =  MUL_F(filter[5],(QMF_IM(buffer[5+i]) + QMF_IM(buffer[7+i])));
  354.         input_im2[2] = -MUL_F(filter[0],(QMF_IM(buffer[0+i]) + QMF_IM(buffer[12+i]))) + MUL_F(filter[4],(QMF_IM(buffer[4+i]) + QMF_IM(buffer[8+i])));
  355.         input_im2[3] = -MUL_F(filter[1],(QMF_IM(buffer[1+i]) + QMF_IM(buffer[11+i]))) + MUL_F(filter[3],(QMF_IM(buffer[3+i]) + QMF_IM(buffer[9+i])));
  356.         input_re2[0] = MUL_F(filter[5],(QMF_RE(buffer[7+i]) - QMF_RE(buffer[5+i])));
  357.         input_re2[1] = MUL_F(filter[0],(QMF_RE(buffer[12+i]) - QMF_RE(buffer[0+i]))) + MUL_F(filter[4],(QMF_RE(buffer[8+i]) - QMF_RE(buffer[4+i])));
  358.         input_re2[2] = MUL_F(filter[1],(QMF_RE(buffer[11+i]) - QMF_RE(buffer[1+i]))) + MUL_F(filter[3],(QMF_RE(buffer[9+i]) - QMF_RE(buffer[3+i])));
  359.         input_re2[3] = MUL_F(filter[2],(QMF_RE(buffer[10+i]) - QMF_RE(buffer[2+i])));
  360.         for (n = 0; n < 4; n++)
  361.         {
  362.             x[n] = input_im2[n] + input_re2[3-n];
  363.         }
  364.         DCT3_4_unscaled(x, x);
  365.         QMF_IM(X_hybrid[i][7]) = x[0];
  366.         QMF_IM(X_hybrid[i][5]) = x[2];
  367.         QMF_IM(X_hybrid[i][3]) = x[3];
  368.         QMF_IM(X_hybrid[i][1]) = x[1];
  369.         for (n = 0; n < 4; n++)
  370.         {
  371.             x[n] = input_im2[n] - input_re2[3-n];
  372.         }
  373.         DCT3_4_unscaled(x, x);
  374.         QMF_IM(X_hybrid[i][6]) = x[1];
  375.         QMF_IM(X_hybrid[i][4]) = x[3];
  376.         QMF_IM(X_hybrid[i][2]) = x[2];
  377.         QMF_IM(X_hybrid[i][0]) = x[0];
  378.     }
  379. }
  380. static void INLINE DCT3_6_unscaled(real_t *y, real_t *x)
  381. {
  382.     real_t f0, f1, f2, f3, f4, f5, f6, f7;
  383.     f0 = MUL_F(x[3], FRAC_CONST(0.70710678118655));
  384.     f1 = x[0] + f0;
  385.     f2 = x[0] - f0;
  386.     f3 = MUL_F((x[1] - x[5]), FRAC_CONST(0.70710678118655));
  387.     f4 = MUL_F(x[2], FRAC_CONST(0.86602540378444)) + MUL_F(x[4], FRAC_CONST(0.5));
  388.     f5 = f4 - x[4];
  389.     f6 = MUL_F(x[1], FRAC_CONST(0.96592582628907)) + MUL_F(x[5], FRAC_CONST(0.25881904510252));
  390.     f7 = f6 - f3;
  391.     y[0] = f1 + f6 + f4;
  392.     y[1] = f2 + f3 - x[4];
  393.     y[2] = f7 + f2 - f5;
  394.     y[3] = f1 - f7 - f5;
  395.     y[4] = f1 - f3 - x[4];
  396.     y[5] = f2 - f6 + f4;
  397. }
  398. /* complex filter, size 12 */
  399. static void channel_filter12(hyb_info *hyb, uint8_t frame_len, const real_t *filter,
  400.                              qmf_t *buffer, qmf_t **X_hybrid)
  401. {
  402.     uint8_t i, n;
  403.     real_t input_re1[6], input_re2[6], input_im1[6], input_im2[6];
  404.     real_t out_re1[6], out_re2[6], out_im1[6], out_im2[6];
  405.     for (i = 0; i < frame_len; i++)
  406.     {
  407.         for (n = 0; n < 6; n++)
  408.         {
  409.             if (n == 0)
  410.             {
  411.                 input_re1[0] = MUL_F(QMF_RE(buffer[6+i]), filter[6]);
  412.                 input_re2[0] = MUL_F(QMF_IM(buffer[6+i]), filter[6]);
  413.             } else {
  414.                 input_re1[6-n] = MUL_F((QMF_RE(buffer[n+i]) + QMF_RE(buffer[12-n+i])), filter[n]);
  415.                 input_re2[6-n] = MUL_F((QMF_IM(buffer[n+i]) + QMF_IM(buffer[12-n+i])), filter[n]);
  416.             }
  417.             input_im2[n] = MUL_F((QMF_RE(buffer[n+i]) - QMF_RE(buffer[12-n+i])), filter[n]);
  418.             input_im1[n] = MUL_F((QMF_IM(buffer[n+i]) - QMF_IM(buffer[12-n+i])), filter[n]);
  419.         }
  420.         DCT3_6_unscaled(out_re1, input_re1);
  421.         DCT3_6_unscaled(out_re2, input_re2);
  422.         DCT3_6_unscaled(out_im1, input_im1);
  423.         DCT3_6_unscaled(out_im2, input_im2);
  424.         for (n = 0; n < 6; n += 2)
  425.         {
  426.             QMF_RE(X_hybrid[i][n]) = out_re1[n] - out_im1[n];
  427.             QMF_IM(X_hybrid[i][n]) = out_re2[n] + out_im2[n];
  428.             QMF_RE(X_hybrid[i][n+1]) = out_re1[n+1] + out_im1[n+1];
  429.             QMF_IM(X_hybrid[i][n+1]) = out_re2[n+1] - out_im2[n+1];
  430.             QMF_RE(X_hybrid[i][10-n]) = out_re1[n+1] - out_im1[n+1];
  431.             QMF_IM(X_hybrid[i][10-n]) = out_re2[n+1] + out_im2[n+1];
  432.             QMF_RE(X_hybrid[i][11-n]) = out_re1[n] + out_im1[n];
  433.             QMF_IM(X_hybrid[i][11-n]) = out_re2[n] - out_im2[n];
  434.         }
  435.     }
  436. }
  437. /* Hybrid analysis: further split up QMF subbands
  438.  * to improve frequency resolution
  439.  */
  440. static void hybrid_analysis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32],
  441.                             uint8_t use34)
  442. {
  443.     uint8_t k, n, band;
  444.     uint8_t offset = 0;
  445.     uint8_t qmf_bands = (use34) ? 5 : 3;
  446.     uint8_t *resolution = (use34) ? hyb->resolution34 : hyb->resolution20;
  447.     for (band = 0; band < qmf_bands; band++)
  448.     {
  449.         /* build working buffer */
  450.         memcpy(hyb->work, hyb->buffer[band], 12 * sizeof(qmf_t));
  451.         /* add new samples */
  452.         for (n = 0; n < hyb->frame_len; n++)
  453.         {
  454.             QMF_RE(hyb->work[12 + n]) = QMF_RE(X[n + 6 /*delay*/][band]);
  455.             QMF_IM(hyb->work[12 + n]) = QMF_IM(X[n + 6 /*delay*/][band]);
  456.         }
  457.         /* store samples */
  458.         memcpy(hyb->buffer[band], hyb->work + hyb->frame_len, 12 * sizeof(qmf_t));
  459.         switch(resolution[band])
  460.         {
  461.         case 2:
  462.             /* Type B real filter, Q[p] = 2 */
  463.             channel_filter2(hyb, hyb->frame_len, p2_13_20, hyb->work, hyb->temp);
  464.             break;
  465.         case 4:
  466.             /* Type A complex filter, Q[p] = 4 */
  467.             channel_filter4(hyb, hyb->frame_len, p4_13_34, hyb->work, hyb->temp);
  468.             break;
  469.         case 8:
  470.             /* Type A complex filter, Q[p] = 8 */
  471.             channel_filter8(hyb, hyb->frame_len, (use34) ? p8_13_34 : p8_13_20,
  472.                 hyb->work, hyb->temp);
  473.             break;
  474.         case 12:
  475.             /* Type A complex filter, Q[p] = 12 */
  476.             channel_filter12(hyb, hyb->frame_len, p12_13_34, hyb->work, hyb->temp);
  477.             break;
  478.         }
  479.         for (n = 0; n < hyb->frame_len; n++)
  480.         {
  481.             for (k = 0; k < resolution[band]; k++)
  482.             {
  483.                 QMF_RE(X_hybrid[n][offset + k]) = QMF_RE(hyb->temp[n][k]);
  484.                 QMF_IM(X_hybrid[n][offset + k]) = QMF_IM(hyb->temp[n][k]);
  485.             }
  486.         }
  487.         offset += resolution[band];
  488.     }
  489.     /* group hybrid channels */
  490.     if (!use34)
  491.     {
  492.         for (n = 0; n < 32 /*30?*/; n++)
  493.         {
  494.             QMF_RE(X_hybrid[n][3]) += QMF_RE(X_hybrid[n][4]);
  495.             QMF_IM(X_hybrid[n][3]) += QMF_IM(X_hybrid[n][4]);
  496.             QMF_RE(X_hybrid[n][4]) = 0;
  497.             QMF_IM(X_hybrid[n][4]) = 0;
  498.             QMF_RE(X_hybrid[n][2]) += QMF_RE(X_hybrid[n][5]);
  499.             QMF_IM(X_hybrid[n][2]) += QMF_IM(X_hybrid[n][5]);
  500.             QMF_RE(X_hybrid[n][5]) = 0;
  501.             QMF_IM(X_hybrid[n][5]) = 0;
  502.         }
  503.     }
  504. }
  505. static void hybrid_synthesis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32],
  506.                              uint8_t use34)
  507. {
  508.     uint8_t k, n, band;
  509.     uint8_t offset = 0;
  510.     uint8_t qmf_bands = (use34) ? 5 : 3;
  511.     uint8_t *resolution = (use34) ? hyb->resolution34 : hyb->resolution20;
  512.     for(band = 0; band < qmf_bands; band++)
  513.     {
  514.         for (n = 0; n < hyb->frame_len; n++)
  515.         {
  516.             QMF_RE(X[n][band]) = 0;
  517.             QMF_IM(X[n][band]) = 0;
  518.             for (k = 0; k < resolution[band]; k++)
  519.             {
  520.                 QMF_RE(X[n][band]) += QMF_RE(X_hybrid[n][offset + k]);
  521.                 QMF_IM(X[n][band]) += QMF_IM(X_hybrid[n][offset + k]);
  522.             }
  523.         }
  524.         offset += resolution[band];
  525.     }
  526. }
  527. /* limits the value i to the range [min,max] */
  528. static int8_t delta_clip(int8_t i, int8_t min, int8_t max)
  529. {
  530.     if (i < min)
  531.         return min;
  532.     else if (i > max)
  533.         return max;
  534.     else
  535.         return i;
  536. }
  537. //int iid = 0;
  538. /* delta decode array */
  539. static void delta_decode(uint8_t enable, int8_t *index, int8_t *index_prev,
  540.                          uint8_t dt_flag, uint8_t nr_par, uint8_t stride,
  541.                          int8_t min_index, int8_t max_index)
  542. {
  543.     int8_t i;
  544.     if (enable == 1)
  545.     {
  546.         if (dt_flag == 0)
  547.         {
  548.             /* delta coded in frequency direction */
  549.             index[0] = 0 + index[0];
  550.             index[0] = delta_clip(index[0], min_index, max_index);
  551.             for (i = 1; i < nr_par; i++)
  552.             {
  553.                 index[i] = index[i-1] + index[i];
  554.                 index[i] = delta_clip(index[i], min_index, max_index);
  555.             }
  556.         } else {
  557.             /* delta coded in time direction */
  558.             for (i = 0; i < nr_par; i++)
  559.             {
  560.                 //int8_t tmp2;
  561.                 //int8_t tmp = index[i];
  562.                 //printf("%d %dn", index_prev[i*stride], index[i]);
  563.                 //printf("%dn", index[i]);
  564.                 index[i] = index_prev[i*stride] + index[i];
  565.                 //tmp2 = index[i];
  566.                 index[i] = delta_clip(index[i], min_index, max_index);
  567.                 //if (iid)
  568.                 //{
  569.                 //    if (index[i] == 7)
  570.                 //    {
  571.                 //        printf("%d %d %dn", index_prev[i*stride], tmp, tmp2);
  572.                 //    }
  573.                 //}
  574.             }
  575.         }
  576.     } else {
  577.         /* set indices to zero */
  578.         for (i = 0; i < nr_par; i++)
  579.         {
  580.             index[i] = 0;
  581.         }
  582.     }
  583.     /* coarse */
  584.     if (stride == 2)
  585.     {
  586.         for (i = (nr_par<<1)-1; i > 0; i--)
  587.         {
  588.             index[i] = index[i>>1];
  589.         }
  590.     }
  591. }
  592. /* delta modulo decode array */
  593. /* in: log2 value of the modulo value to allow using AND instead of MOD */
  594. static void delta_modulo_decode(uint8_t enable, int8_t *index, int8_t *index_prev,
  595.                                 uint8_t dt_flag, uint8_t nr_par, uint8_t stride,
  596.                                 int8_t and_modulo)
  597. {
  598.     int8_t i;
  599.     if (enable == 1)
  600.     {
  601.         if (dt_flag == 0)
  602.         {
  603.             /* delta coded in frequency direction */
  604.             index[0] = 0 + index[0];
  605.             index[0] &= and_modulo;
  606.             for (i = 1; i < nr_par; i++)
  607.             {
  608.                 index[i] = index[i-1] + index[i];
  609.                 index[i] &= and_modulo;
  610.             }
  611.         } else {
  612.             /* delta coded in time direction */
  613.             for (i = 0; i < nr_par; i++)
  614.             {
  615.                 index[i] = index_prev[i*stride] + index[i];
  616.                 index[i] &= and_modulo;
  617.             }
  618.         }
  619.     } else {
  620.         /* set indices to zero */
  621.         for (i = 0; i < nr_par; i++)
  622.         {
  623.             index[i] = 0;
  624.         }
  625.     }
  626.     /* coarse */
  627.     if (stride == 2)
  628.     {
  629.         index[0] = 0;
  630.         for (i = (nr_par<<1)-1; i > 0; i--)
  631.         {
  632.             index[i] = index[i>>1];
  633.         }
  634.     }
  635. }
  636. #ifdef PS_LOW_POWER
  637. static void map34indexto20(int8_t *index, uint8_t bins)
  638. {
  639.     index[0] = (2*index[0]+index[1])/3;
  640.     index[1] = (index[1]+2*index[2])/3;
  641.     index[2] = (2*index[3]+index[4])/3;
  642.     index[3] = (index[4]+2*index[5])/3;
  643.     index[4] = (index[6]+index[7])/2;
  644.     index[5] = (index[8]+index[9])/2;
  645.     index[6] = index[10];
  646.     index[7] = index[11];
  647.     index[8] = (index[12]+index[13])/2;
  648.     index[9] = (index[14]+index[15])/2;
  649.     index[10] = index[16];
  650.     if (bins == 34)
  651.     {
  652.         index[11] = index[17];
  653.         index[12] = index[18];
  654.         index[13] = index[19];
  655.         index[14] = (index[20]+index[21])/2;
  656.         index[15] = (index[22]+index[23])/2;
  657.         index[16] = (index[24]+index[25])/2;
  658.         index[17] = (index[26]+index[27])/2;
  659.         index[18] = (index[28]+index[29]+index[30]+index[31])/4;
  660.         index[19] = (index[32]+index[33])/2;
  661.     }
  662. }
  663. #endif
  664. static void map20indexto34(int8_t *index, uint8_t bins)
  665. {
  666.     index[0] = index[0];
  667.     index[1] = (index[0] + index[1])/2;
  668.     index[2] = index[1];
  669.     index[3] = index[2];
  670.     index[4] = (index[2] + index[3])/2;
  671.     index[5] = index[3];
  672.     index[6] = index[4];
  673.     index[7] = index[4];
  674.     index[8] = index[5];
  675.     index[9] = index[5];
  676.     index[10] = index[6];
  677.     index[11] = index[7];
  678.     index[12] = index[8];
  679.     index[13] = index[8];
  680.     index[14] = index[9];
  681.     index[15] = index[9];
  682.     index[16] = index[10];
  683.     if (bins == 34)
  684.     {
  685.         index[17] = index[11];
  686.         index[18] = index[12];
  687.         index[19] = index[13];
  688.         index[20] = index[14];
  689.         index[21] = index[14];
  690.         index[22] = index[15];
  691.         index[23] = index[15];
  692.         index[24] = index[16];
  693.         index[25] = index[16];
  694.         index[26] = index[17];
  695.         index[27] = index[17];
  696.         index[28] = index[18];
  697.         index[29] = index[18];
  698.         index[30] = index[18];
  699.         index[31] = index[18];
  700.         index[32] = index[19];
  701.         index[33] = index[19];
  702.     }
  703. }
  704. /* parse the bitstream data decoded in ps_data() */
  705. static void ps_data_decode(ps_info *ps)
  706. {
  707.     uint8_t env, bin;
  708.     /* ps data not available, use data from previous frame */
  709.     if (ps->ps_data_available == 0)
  710.     {
  711.         ps->num_env = 0;
  712.     }
  713.     for (env = 0; env < ps->num_env; env++)
  714.     {
  715.         int8_t *iid_index_prev;
  716.         int8_t *icc_index_prev;
  717.         int8_t *ipd_index_prev;
  718.         int8_t *opd_index_prev;
  719.         int8_t num_iid_steps = (ps->iid_mode < 3) ? 7 : 15 /*fine quant*/;
  720.         if (env == 0)
  721.         {
  722.             /* take last envelope from previous frame */
  723.             iid_index_prev = ps->iid_index_prev;
  724.             icc_index_prev = ps->icc_index_prev;
  725.             ipd_index_prev = ps->ipd_index_prev;
  726.             opd_index_prev = ps->opd_index_prev;
  727.         } else {
  728.             /* take index values from previous envelope */
  729.             iid_index_prev = ps->iid_index[env - 1];
  730.             icc_index_prev = ps->icc_index[env - 1];
  731.             ipd_index_prev = ps->ipd_index[env - 1];
  732.             opd_index_prev = ps->opd_index[env - 1];
  733.         }
  734. //        iid = 1;
  735.         /* delta decode iid parameters */
  736.         delta_decode(ps->enable_iid, ps->iid_index[env], iid_index_prev,
  737.             ps->iid_dt[env], ps->nr_iid_par,
  738.             (ps->iid_mode == 0 || ps->iid_mode == 3) ? 2 : 1,
  739.             -num_iid_steps, num_iid_steps);
  740. //        iid = 0;
  741.         /* delta decode icc parameters */
  742.         delta_decode(ps->enable_icc, ps->icc_index[env], icc_index_prev,
  743.             ps->icc_dt[env], ps->nr_icc_par,
  744.             (ps->icc_mode == 0 || ps->icc_mode == 3) ? 2 : 1,
  745.             0, 7);
  746.         /* delta modulo decode ipd parameters */
  747.         delta_modulo_decode(ps->enable_ipdopd, ps->ipd_index[env], ipd_index_prev,
  748.             ps->ipd_dt[env], ps->nr_ipdopd_par, 1, 7);
  749.         /* delta modulo decode opd parameters */
  750.         delta_modulo_decode(ps->enable_ipdopd, ps->opd_index[env], opd_index_prev,
  751.             ps->opd_dt[env], ps->nr_ipdopd_par, 1, 7);
  752.     }
  753.     /* handle error case */
  754.     if (ps->num_env == 0)
  755.     {
  756.         /* force to 1 */
  757.         ps->num_env = 1;
  758.         if (ps->enable_iid)
  759.         {
  760.             for (bin = 0; bin < 34; bin++)
  761.                 ps->iid_index[0][bin] = ps->iid_index_prev[bin];
  762.         } else {
  763.             for (bin = 0; bin < 34; bin++)
  764.                 ps->iid_index[0][bin] = 0;
  765.         }
  766.         if (ps->enable_icc)
  767.         {
  768.             for (bin = 0; bin < 34; bin++)
  769.                 ps->icc_index[0][bin] = ps->icc_index_prev[bin];
  770.         } else {
  771.             for (bin = 0; bin < 34; bin++)
  772.                 ps->icc_index[0][bin] = 0;
  773.         }
  774.         if (ps->enable_ipdopd)
  775.         {
  776.             for (bin = 0; bin < 17; bin++)
  777.             {
  778.                 ps->ipd_index[0][bin] = ps->ipd_index_prev[bin];
  779.                 ps->opd_index[0][bin] = ps->opd_index_prev[bin];
  780.             }
  781.         } else {
  782.             for (bin = 0; bin < 17; bin++)
  783.             {
  784.                 ps->ipd_index[0][bin] = 0;
  785.                 ps->opd_index[0][bin] = 0;
  786.             }
  787.         }
  788.     }
  789.     /* update previous indices */
  790.     for (bin = 0; bin < 34; bin++)
  791.         ps->iid_index_prev[bin] = ps->iid_index[ps->num_env-1][bin];
  792.     for (bin = 0; bin < 34; bin++)
  793.         ps->icc_index_prev[bin] = ps->icc_index[ps->num_env-1][bin];
  794.     for (bin = 0; bin < 17; bin++)
  795.     {
  796.         ps->ipd_index_prev[bin] = ps->ipd_index[ps->num_env-1][bin];
  797.         ps->opd_index_prev[bin] = ps->opd_index[ps->num_env-1][bin];
  798.     }
  799.     ps->ps_data_available = 0;
  800.     if (ps->frame_class == 0)
  801.     {
  802.         ps->border_position[0] = 0;
  803.         for (env = 1; env < ps->num_env; env++)
  804.         {
  805.             ps->border_position[env] = (env * 32 /* 30 for 960? */) / ps->num_env;
  806.         }
  807.         ps->border_position[ps->num_env] = 32 /* 30 for 960? */;
  808.     } else {
  809.         ps->border_position[0] = 0;
  810.         if (ps->border_position[ps->num_env] < 32 /* 30 for 960? */)
  811.         {
  812.             ps->num_env++;
  813.             ps->border_position[ps->num_env] = 32 /* 30 for 960? */;
  814.             for (bin = 0; bin < 34; bin++)
  815.             {
  816.                 ps->iid_index[ps->num_env][bin] = ps->iid_index[ps->num_env-1][bin];
  817.                 ps->icc_index[ps->num_env][bin] = ps->icc_index[ps->num_env-1][bin];
  818.             }
  819.             for (bin = 0; bin < 17; bin++)
  820.             {
  821.                 ps->ipd_index[ps->num_env][bin] = ps->ipd_index[ps->num_env-1][bin];
  822.                 ps->opd_index[ps->num_env][bin] = ps->opd_index[ps->num_env-1][bin];
  823.             }
  824.         }
  825.         for (env = 1; env < ps->num_env; env++)
  826.         {
  827.             int8_t thr = 32 /* 30 for 960? */ - (ps->num_env - env);
  828.             if (ps->border_position[env] > thr)
  829.             {
  830.                 ps->border_position[env] = thr;
  831.             } else {
  832.                 thr = ps->border_position[env-1]+1;
  833.                 if (ps->border_position[env] < thr)
  834.                 {
  835.                     ps->border_position[env] = thr;
  836.                 }
  837.             }
  838.         }
  839.     }
  840.     /* make sure that the indices of all parameters can be mapped
  841.      * to the same hybrid synthesis filterbank
  842.      */
  843. #ifdef PS_LOW_POWER
  844.     for (env = 0; env < ps->num_env; env++)
  845.     {
  846.         if (ps->iid_mode == 2 || ps->iid_mode == 5)
  847.             map34indexto20(ps->iid_index[env], 34);
  848.         if (ps->icc_mode == 2 || ps->icc_mode == 5)
  849.             map34indexto20(ps->icc_index[env], 34);
  850.         /* disable ipd/opd */
  851.         for (bin = 0; bin < 17; bin++)
  852.         {
  853.             ps->aaIpdIndex[env][bin] = 0;
  854.             ps->aaOpdIndex[env][bin] = 0;
  855.         }
  856.     }
  857. #else
  858.     if (ps->use34hybrid_bands)
  859.     {
  860.         for (env = 0; env < ps->num_env; env++)
  861.         {
  862.             if (ps->iid_mode != 2 && ps->iid_mode != 5)
  863.                 map20indexto34(ps->iid_index[env], 34);
  864.             if (ps->icc_mode != 2 && ps->icc_mode != 5)
  865.                 map20indexto34(ps->icc_index[env], 34);
  866.             if (ps->ipd_mode != 2 && ps->ipd_mode != 5)
  867.             {
  868.                 map20indexto34(ps->ipd_index[env], 17);
  869.                 map20indexto34(ps->opd_index[env], 17);
  870.             }
  871.         }
  872.     }
  873. #endif
  874. #if 0
  875.     for (env = 0; env < ps->num_env; env++)
  876.     {
  877.         printf("iid[env:%d]:", env);
  878.         for (bin = 0; bin < 34; bin++)
  879.         {
  880.             printf(" %d", ps->iid_index[env][bin]);
  881.         }
  882.         printf("n");
  883.     }
  884.     for (env = 0; env < ps->num_env; env++)
  885.     {
  886.         printf("icc[env:%d]:", env);
  887.         for (bin = 0; bin < 34; bin++)
  888.         {
  889.             printf(" %d", ps->icc_index[env][bin]);
  890.         }
  891.         printf("n");
  892.     }
  893.     for (env = 0; env < ps->num_env; env++)
  894.     {
  895.         printf("ipd[env:%d]:", env);
  896.         for (bin = 0; bin < 17; bin++)
  897.         {
  898.             printf(" %d", ps->ipd_index[env][bin]);
  899.         }
  900.         printf("n");
  901.     }
  902.     for (env = 0; env < ps->num_env; env++)
  903.     {
  904.         printf("opd[env:%d]:", env);
  905.         for (bin = 0; bin < 17; bin++)
  906.         {
  907.             printf(" %d", ps->opd_index[env][bin]);
  908.         }
  909.         printf("n");
  910.     }
  911.     printf("n");
  912. #endif
  913. }
  914. /* decorrelate the mono signal using an allpass filter */
  915. static void ps_decorrelate(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64],
  916.                            qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32])
  917. {
  918.     uint8_t gr, n, m, bk;
  919.     uint8_t temp_delay;
  920.     uint8_t sb, maxsb;
  921.     const complex_t *Phi_Fract_SubQmf;
  922.     uint8_t temp_delay_ser[NO_ALLPASS_LINKS];
  923.     real_t P_SmoothPeakDecayDiffNrg, nrg;
  924.     real_t P[32][34];
  925.     real_t G_TransientRatio[32][34] = {{0}};
  926.     complex_t inputLeft;
  927.     /* chose hybrid filterbank: 20 or 34 band case */
  928.     if (ps->use34hybrid_bands)
  929.     {
  930.         Phi_Fract_SubQmf = Phi_Fract_SubQmf34;
  931.     } else{
  932.         Phi_Fract_SubQmf = Phi_Fract_SubQmf20;
  933.     }
  934.     /* clear the energy values */
  935.     for (n = 0; n < 32; n++)
  936.     {
  937.         for (bk = 0; bk < 34; bk++)
  938.         {
  939.             P[n][bk] = 0;
  940.         }
  941.     }
  942.     /* calculate the energy in each parameter band b(k) */
  943.     for (gr = 0; gr < ps->num_groups; gr++)
  944.     {
  945.         /* select the parameter index b(k) to which this group belongs */
  946.         bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr];
  947.         /* select the upper subband border for this group */
  948.         maxsb = (gr < ps->num_hybrid_groups) ? ps->group_border[gr]+1 : ps->group_border[gr+1];
  949.         for (sb = ps->group_border[gr]; sb < maxsb; sb++)
  950.         {
  951.             for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++)
  952.             {
  953. #ifdef FIXED_POINT
  954.                 uint32_t in_re, in_im;
  955. #endif
  956.                 /* input from hybrid subbands or QMF subbands */
  957.                 if (gr < ps->num_hybrid_groups)
  958.                 {
  959.                     RE(inputLeft) = QMF_RE(X_hybrid_left[n][sb]);
  960.                     IM(inputLeft) = QMF_IM(X_hybrid_left[n][sb]);
  961.                 } else {
  962.                     RE(inputLeft) = QMF_RE(X_left[n][sb]);
  963.                     IM(inputLeft) = QMF_IM(X_left[n][sb]);
  964.                 }
  965.                 /* accumulate energy */
  966. #ifdef FIXED_POINT
  967.                 /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF
  968.                  * meaning that P will be scaled by 2^(-10) compared to floating point version
  969.                  */
  970.                 in_re = ((abs(RE(inputLeft))+(1<<(REAL_BITS-1)))>>REAL_BITS);
  971.                 in_im = ((abs(IM(inputLeft))+(1<<(REAL_BITS-1)))>>REAL_BITS);
  972.                 P[n][bk] += in_re*in_re + in_im*in_im;
  973. #else
  974.                 P[n][bk] += MUL_R(RE(inputLeft),RE(inputLeft)) + MUL_R(IM(inputLeft),IM(inputLeft));
  975. #endif
  976.             }
  977.         }
  978.     }
  979. #if 0
  980.     for (n = 0; n < 32; n++)
  981.     {
  982.         for (bk = 0; bk < 34; bk++)
  983.         {
  984. #ifdef FIXED_POINT
  985.             printf("%d %d: %dn", n, bk, P[n][bk] /*/(float)REAL_PRECISION*/);
  986. #else
  987.             printf("%d %d: %fn", n, bk, P[n][bk]/1024.0);
  988. #endif
  989.         }
  990.     }
  991. #endif
  992.     /* calculate transient reduction ratio for each parameter band b(k) */
  993.     for (bk = 0; bk < ps->nr_par_bands; bk++)
  994.     {
  995.         for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++)
  996.         {
  997.             const real_t gamma = COEF_CONST(1.5);
  998.             ps->P_PeakDecayNrg[bk] = MUL_F(ps->P_PeakDecayNrg[bk], ps->alpha_decay);
  999.             if (ps->P_PeakDecayNrg[bk] < P[n][bk])
  1000.                 ps->P_PeakDecayNrg[bk] = P[n][bk];
  1001.             /* apply smoothing filter to peak decay energy */
  1002.             P_SmoothPeakDecayDiffNrg = ps->P_SmoothPeakDecayDiffNrg_prev[bk];
  1003.             P_SmoothPeakDecayDiffNrg += MUL_F((ps->P_PeakDecayNrg[bk] - P[n][bk] - ps->P_SmoothPeakDecayDiffNrg_prev[bk]), ps->alpha_smooth);
  1004.             ps->P_SmoothPeakDecayDiffNrg_prev[bk] = P_SmoothPeakDecayDiffNrg;
  1005.             /* apply smoothing filter to energy */
  1006.             nrg = ps->P_prev[bk];
  1007.             nrg += MUL_F((P[n][bk] - ps->P_prev[bk]), ps->alpha_smooth);
  1008.             ps->P_prev[bk] = nrg;
  1009.             /* calculate transient ratio */
  1010.             if (MUL_C(P_SmoothPeakDecayDiffNrg, gamma) <= nrg)
  1011.             {
  1012.                 G_TransientRatio[n][bk] = REAL_CONST(1.0);
  1013.             } else {
  1014.                 G_TransientRatio[n][bk] = DIV_R(nrg, (MUL_C(P_SmoothPeakDecayDiffNrg, gamma)));
  1015.             }
  1016.         }
  1017.     }
  1018. #if 0
  1019.     for (n = 0; n < 32; n++)
  1020.     {
  1021.         for (bk = 0; bk < 34; bk++)
  1022.         {
  1023. #ifdef FIXED_POINT
  1024.             printf("%d %d: %fn", n, bk, G_TransientRatio[n][bk]/(float)REAL_PRECISION);
  1025. #else
  1026.             printf("%d %d: %fn", n, bk, G_TransientRatio[n][bk]);
  1027. #endif
  1028.         }
  1029.     }
  1030. #endif
  1031.     /* apply stereo decorrelation filter to the signal */
  1032.     for (gr = 0; gr < ps->num_groups; gr++)
  1033.     {
  1034.         if (gr < ps->num_hybrid_groups)
  1035.             maxsb = ps->group_border[gr] + 1;
  1036.         else
  1037.             maxsb = ps->group_border[gr + 1];
  1038.         /* QMF channel */
  1039.         for (sb = ps->group_border[gr]; sb < maxsb; sb++)
  1040.         {
  1041.             real_t g_DecaySlope;
  1042.             real_t g_DecaySlope_filt[NO_ALLPASS_LINKS];
  1043.             /* g_DecaySlope: [0..1] */
  1044.             if (gr < ps->num_hybrid_groups || sb <= ps->decay_cutoff)
  1045.             {
  1046.                 g_DecaySlope = FRAC_CONST(1.0);
  1047.             } else {
  1048.                 int8_t decay = ps->decay_cutoff - sb;
  1049.                 if (decay <= -20 /* -1/DECAY_SLOPE */)
  1050.                 {
  1051.                     g_DecaySlope = 0;
  1052.                 } else {
  1053.                     /* decay(int)*decay_slope(frac) = g_DecaySlope(frac) */
  1054.                     g_DecaySlope = FRAC_CONST(1.0) + DECAY_SLOPE * decay;
  1055.                 }
  1056.             }
  1057.             /* calculate g_DecaySlope_filt for every m multiplied by filter_a[m] */
  1058.             for (m = 0; m < NO_ALLPASS_LINKS; m++)
  1059.             {
  1060.                 g_DecaySlope_filt[m] = MUL_F(g_DecaySlope, filter_a[m]);
  1061.             }
  1062.             /* set delay indices */
  1063.             temp_delay = ps->saved_delay;
  1064.             for (n = 0; n < NO_ALLPASS_LINKS; n++)
  1065.                 temp_delay_ser[n] = ps->delay_buf_index_ser[n];
  1066.             for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++)
  1067.             {
  1068.                 complex_t tmp, tmp0, R0;
  1069.                 if (gr < ps->num_hybrid_groups)
  1070.                 {
  1071.                     /* hybrid filterbank input */
  1072.                     RE(inputLeft) = QMF_RE(X_hybrid_left[n][sb]);
  1073.                     IM(inputLeft) = QMF_IM(X_hybrid_left[n][sb]);
  1074.                 } else {
  1075.                     /* QMF filterbank input */
  1076.                     RE(inputLeft) = QMF_RE(X_left[n][sb]);
  1077.                     IM(inputLeft) = QMF_IM(X_left[n][sb]);
  1078.                 }
  1079.                 if (sb > ps->nr_allpass_bands && gr >= ps->num_hybrid_groups)
  1080.                 {
  1081.                     /* delay */
  1082.                     /* never hybrid subbands here, always QMF subbands */
  1083.                     RE(tmp) = RE(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]);
  1084.                     IM(tmp) = IM(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]);
  1085.                     RE(R0) = RE(tmp);
  1086.                     IM(R0) = IM(tmp);
  1087.                     RE(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]) = RE(inputLeft);
  1088.                     IM(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]) = IM(inputLeft);
  1089.                 } else {
  1090.                     /* allpass filter */
  1091.                     uint8_t m;
  1092.                     complex_t Phi_Fract;
  1093.                     /* fetch parameters */
  1094.                     if (gr < ps->num_hybrid_groups)
  1095.                     {
  1096.                         /* select data from the hybrid subbands */
  1097.                         RE(tmp0) = RE(ps->delay_SubQmf[temp_delay][sb]);
  1098.                         IM(tmp0) = IM(ps->delay_SubQmf[temp_delay][sb]);
  1099.                         RE(ps->delay_SubQmf[temp_delay][sb]) = RE(inputLeft);
  1100.                         IM(ps->delay_SubQmf[temp_delay][sb]) = IM(inputLeft);
  1101.                         RE(Phi_Fract) = RE(Phi_Fract_SubQmf[sb]);
  1102.                         IM(Phi_Fract) = IM(Phi_Fract_SubQmf[sb]);
  1103.                     } else {
  1104.                         /* select data from the QMF subbands */
  1105.                         RE(tmp0) = RE(ps->delay_Qmf[temp_delay][sb]);
  1106.                         IM(tmp0) = IM(ps->delay_Qmf[temp_delay][sb]);
  1107.                         RE(ps->delay_Qmf[temp_delay][sb]) = RE(inputLeft);
  1108.                         IM(ps->delay_Qmf[temp_delay][sb]) = IM(inputLeft);
  1109.                         RE(Phi_Fract) = RE(Phi_Fract_Qmf[sb]);
  1110.                         IM(Phi_Fract) = IM(Phi_Fract_Qmf[sb]);
  1111.                     }
  1112.                     /* z^(-2) * Phi_Fract[k] */
  1113.                     ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
  1114.                     RE(R0) = RE(tmp);
  1115.                     IM(R0) = IM(tmp);
  1116.                     for (m = 0; m < NO_ALLPASS_LINKS; m++)
  1117.                     {
  1118.                         complex_t Q_Fract_allpass, tmp2;
  1119.                         /* fetch parameters */
  1120.                         if (gr < ps->num_hybrid_groups)
  1121.                         {
  1122.                             /* select data from the hybrid subbands */
  1123.                             RE(tmp0) = RE(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]);
  1124.                             IM(tmp0) = IM(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]);
  1125.                             if (ps->use34hybrid_bands)
  1126.                             {
  1127.                                 RE(Q_Fract_allpass) = RE(Q_Fract_allpass_SubQmf34[sb][m]);
  1128.                                 IM(Q_Fract_allpass) = IM(Q_Fract_allpass_SubQmf34[sb][m]);
  1129.                             } else {
  1130.                                 RE(Q_Fract_allpass) = RE(Q_Fract_allpass_SubQmf20[sb][m]);
  1131.                                 IM(Q_Fract_allpass) = IM(Q_Fract_allpass_SubQmf20[sb][m]);
  1132.                             }
  1133.                         } else {
  1134.                             /* select data from the QMF subbands */
  1135.                             RE(tmp0) = RE(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]);
  1136.                             IM(tmp0) = IM(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]);
  1137.                             RE(Q_Fract_allpass) = RE(Q_Fract_allpass_Qmf[sb][m]);
  1138.                             IM(Q_Fract_allpass) = IM(Q_Fract_allpass_Qmf[sb][m]);
  1139.                         }
  1140.                         /* delay by a fraction */
  1141.                         /* z^(-d(m)) * Q_Fract_allpass[k,m] */
  1142.                         ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Q_Fract_allpass), IM(Q_Fract_allpass));
  1143.                         /* -a(m) * g_DecaySlope[k] */
  1144.                         RE(tmp) += -MUL_F(g_DecaySlope_filt[m], RE(R0));
  1145.                         IM(tmp) += -MUL_F(g_DecaySlope_filt[m], IM(R0));
  1146.                         /* -a(m) * g_DecaySlope[k] * Q_Fract_allpass[k,m] * z^(-d(m)) */
  1147.                         RE(tmp2) = RE(R0) + MUL_F(g_DecaySlope_filt[m], RE(tmp));
  1148.                         IM(tmp2) = IM(R0) + MUL_F(g_DecaySlope_filt[m], IM(tmp));
  1149.                         /* store sample */
  1150.                         if (gr < ps->num_hybrid_groups)
  1151.                         {
  1152.                             RE(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]) = RE(tmp2);
  1153.                             IM(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]) = IM(tmp2);
  1154.                         } else {
  1155.                             RE(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]) = RE(tmp2);
  1156.                             IM(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]) = IM(tmp2);
  1157.                         }
  1158.                         /* store for next iteration (or as output value if last iteration) */
  1159.                         RE(R0) = RE(tmp);
  1160.                         IM(R0) = IM(tmp);
  1161.                     }
  1162.                 }
  1163.                 /* select b(k) for reading the transient ratio */
  1164.                 bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr];
  1165.                 /* duck if a past transient is found */
  1166.                 RE(R0) = MUL_R(G_TransientRatio[n][bk], RE(R0));
  1167.                 IM(R0) = MUL_R(G_TransientRatio[n][bk], IM(R0));
  1168.                 if (gr < ps->num_hybrid_groups)
  1169.                 {
  1170.                     /* hybrid */
  1171.                     QMF_RE(X_hybrid_right[n][sb]) = RE(R0);
  1172.                     QMF_IM(X_hybrid_right[n][sb]) = IM(R0);
  1173.                 } else {
  1174.                     /* QMF */
  1175.                     QMF_RE(X_right[n][sb]) = RE(R0);
  1176.                     QMF_IM(X_right[n][sb]) = IM(R0);
  1177.                 }
  1178.                 /* Update delay buffer index */
  1179.                 if (++temp_delay >= 2)
  1180.                 {
  1181.                     temp_delay = 0;
  1182.                 }
  1183.                 /* update delay indices */
  1184.                 if (sb > ps->nr_allpass_bands && gr >= ps->num_hybrid_groups)
  1185.                 {
  1186.                     /* delay_D depends on the samplerate, it can hold the values 14 and 1 */
  1187.                     if (++ps->delay_buf_index_delay[sb] >= ps->delay_D[sb])
  1188.                     {
  1189.                         ps->delay_buf_index_delay[sb] = 0;
  1190.                     }
  1191.                 }
  1192.                 for (m = 0; m < NO_ALLPASS_LINKS; m++)
  1193.                 {
  1194.                     if (++temp_delay_ser[m] >= ps->num_sample_delay_ser[m])
  1195.                     {
  1196.                         temp_delay_ser[m] = 0;
  1197.                     }
  1198.                 }
  1199.             }
  1200.         }
  1201.     }
  1202.     /* update delay indices */
  1203.     ps->saved_delay = temp_delay;
  1204.     for (m = 0; m < NO_ALLPASS_LINKS; m++)
  1205.         ps->delay_buf_index_ser[m] = temp_delay_ser[m];
  1206. }
  1207. #ifdef FIXED_POINT
  1208. #define step(shift) 
  1209.     if ((0x40000000l >> shift) + root <= value)       
  1210.     {                                                 
  1211.         value -= (0x40000000l >> shift) + root;       
  1212.         root = (root >> 1) | (0x40000000l >> shift);  
  1213.     } else {                                          
  1214.         root = root >> 1;                             
  1215.     }
  1216. /* fixed point square root approximation */
  1217. static real_t ps_sqrt(real_t value)
  1218. {
  1219.     real_t root = 0;
  1220.     step( 0); step( 2); step( 4); step( 6);
  1221.     step( 8); step(10); step(12); step(14);
  1222.     step(16); step(18); step(20); step(22);
  1223.     step(24); step(26); step(28); step(30);
  1224.     if (root < value)
  1225.         ++root;
  1226.     root <<= (REAL_BITS/2);
  1227.     return root;
  1228. }
  1229. #else
  1230. #define ps_sqrt(A) sqrt(A)
  1231. #endif
  1232. static const real_t ipdopd_cos_tab[] = {
  1233.     FRAC_CONST(1.000000000000000),
  1234.     FRAC_CONST(0.707106781186548),
  1235.     FRAC_CONST(0.000000000000000),
  1236.     FRAC_CONST(-0.707106781186547),
  1237.     FRAC_CONST(-1.000000000000000),
  1238.     FRAC_CONST(-0.707106781186548),
  1239.     FRAC_CONST(-0.000000000000000),
  1240.     FRAC_CONST(0.707106781186547),
  1241.     FRAC_CONST(1.000000000000000)
  1242. };
  1243. static const real_t ipdopd_sin_tab[] = {
  1244.     FRAC_CONST(0.000000000000000),
  1245.     FRAC_CONST(0.707106781186547),
  1246.     FRAC_CONST(1.000000000000000),
  1247.     FRAC_CONST(0.707106781186548),
  1248.     FRAC_CONST(0.000000000000000),
  1249.     FRAC_CONST(-0.707106781186547),
  1250.     FRAC_CONST(-1.000000000000000),
  1251.     FRAC_CONST(-0.707106781186548),
  1252.     FRAC_CONST(-0.000000000000000)
  1253. };
  1254. static real_t magnitude_c(complex_t c)
  1255. {
  1256. #ifdef FIXED_POINT
  1257. #define ps_abs(A) (((A) > 0) ? (A) : (-(A)))
  1258. #define ALPHA FRAC_CONST(0.948059448969)
  1259. #define BETA  FRAC_CONST(0.392699081699)
  1260.     real_t abs_inphase = ps_abs(RE(c));
  1261.     real_t abs_quadrature = ps_abs(IM(c));
  1262.     if (abs_inphase > abs_quadrature) {
  1263.         return MUL_F(abs_inphase, ALPHA) + MUL_F(abs_quadrature, BETA);
  1264.     } else {
  1265.         return MUL_F(abs_quadrature, ALPHA) + MUL_F(abs_inphase, BETA);
  1266.     }
  1267. #else
  1268.     return sqrt(RE(c)*RE(c) + IM(c)*IM(c));
  1269. #endif
  1270. }
  1271. static void ps_mix_phase(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64],
  1272.                          qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32])
  1273. {
  1274.     uint8_t n;
  1275.     uint8_t gr;
  1276.     uint8_t bk = 0;
  1277.     uint8_t sb, maxsb;
  1278.     uint8_t env;
  1279.     uint8_t nr_ipdopd_par;
  1280.     complex_t h11, h12, h21, h22;
  1281.     complex_t H11, H12, H21, H22;
  1282.     complex_t deltaH11, deltaH12, deltaH21, deltaH22;
  1283.     complex_t tempLeft;
  1284.     complex_t tempRight;
  1285.     complex_t phaseLeft;
  1286.     complex_t phaseRight;
  1287.     real_t L;
  1288.     const real_t *sf_iid;
  1289.     uint8_t no_iid_steps;
  1290.     if (ps->iid_mode >= 3)
  1291.     {
  1292.         no_iid_steps = 15;
  1293.         sf_iid = sf_iid_fine;
  1294.     } else {
  1295.         no_iid_steps = 7;
  1296.         sf_iid = sf_iid_normal;
  1297.     }
  1298.     if (ps->ipd_mode == 0 || ps->ipd_mode == 3)
  1299.     {
  1300.         nr_ipdopd_par = 11; /* resolution */
  1301.     } else {
  1302.         nr_ipdopd_par = ps->nr_ipdopd_par;
  1303.     }
  1304.     for (gr = 0; gr < ps->num_groups; gr++)
  1305.     {
  1306.         bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr];
  1307.         /* use one channel per group in the subqmf domain */
  1308.         maxsb = (gr < ps->num_hybrid_groups) ? ps->group_border[gr] + 1 : ps->group_border[gr + 1];
  1309.         for (env = 0; env < ps->num_env; env++)
  1310.         {
  1311.             if (ps->icc_mode < 3)
  1312.             {
  1313.                 /* type 'A' mixing as described in 8.6.4.6.2.1 */
  1314.                 real_t c_1, c_2;
  1315.                 real_t cosa, sina;
  1316.                 real_t cosb, sinb;
  1317.                 real_t ab1, ab2;
  1318.                 real_t ab3, ab4;
  1319.                 /*
  1320.                 c_1 = sqrt(2.0 / (1.0 + pow(10.0, quant_iid[no_iid_steps + iid_index] / 10.0)));
  1321.                 c_2 = sqrt(2.0 / (1.0 + pow(10.0, quant_iid[no_iid_steps - iid_index] / 10.0)));
  1322.                 alpha = 0.5 * acos(quant_rho[icc_index]);
  1323.                 beta = alpha * ( c_1 - c_2 ) / sqrt(2.0);
  1324.                 */
  1325.                 //printf("%dn", ps->iid_index[env][bk]);
  1326.                 /* calculate the scalefactors c_1 and c_2 from the intensity differences */
  1327.                 c_1 = sf_iid[no_iid_steps + ps->iid_index[env][bk]];
  1328.                 c_2 = sf_iid[no_iid_steps - ps->iid_index[env][bk]];
  1329.                 /* calculate alpha and beta using the ICC parameters */
  1330.                 cosa = cos_alphas[ps->icc_index[env][bk]];
  1331.                 sina = sin_alphas[ps->icc_index[env][bk]];
  1332.                 if (ps->iid_mode >= 3)
  1333.                 {
  1334.                     if (ps->iid_index[env][bk] < 0)
  1335.                     {
  1336.                         cosb =  cos_betas_fine[-ps->iid_index[env][bk]][ps->icc_index[env][bk]];
  1337.                         sinb = -sin_betas_fine[-ps->iid_index[env][bk]][ps->icc_index[env][bk]];
  1338.                     } else {
  1339.                         cosb = cos_betas_fine[ps->iid_index[env][bk]][ps->icc_index[env][bk]];
  1340.                         sinb = sin_betas_fine[ps->iid_index[env][bk]][ps->icc_index[env][bk]];
  1341.                     }
  1342.                 } else {
  1343.                     if (ps->iid_index[env][bk] < 0)
  1344.                     {
  1345.                         cosb =  cos_betas_normal[-ps->iid_index[env][bk]][ps->icc_index[env][bk]];
  1346.                         sinb = -sin_betas_normal[-ps->iid_index[env][bk]][ps->icc_index[env][bk]];
  1347.                     } else {
  1348.                         cosb = cos_betas_normal[ps->iid_index[env][bk]][ps->icc_index[env][bk]];
  1349.                         sinb = sin_betas_normal[ps->iid_index[env][bk]][ps->icc_index[env][bk]];
  1350.                     }
  1351.                 }
  1352.                 ab1 = MUL_C(cosb, cosa);
  1353.                 ab2 = MUL_C(sinb, sina);
  1354.                 ab3 = MUL_C(sinb, cosa);
  1355.                 ab4 = MUL_C(cosb, sina);
  1356.                 /* h_xy: COEF */
  1357.                 RE(h11) = MUL_C(c_2, (ab1 - ab2));
  1358.                 RE(h12) = MUL_C(c_1, (ab1 + ab2));
  1359.                 RE(h21) = MUL_C(c_2, (ab3 + ab4));
  1360.                 RE(h22) = MUL_C(c_1, (ab3 - ab4));
  1361.             } else {
  1362.                 /* type 'B' mixing as described in 8.6.4.6.2.2 */
  1363.                 real_t sina, cosa;
  1364.                 real_t cosg, sing;
  1365.                 /*
  1366.                 real_t c, rho, mu, alpha, gamma;
  1367.                 uint8_t i;
  1368.                 i = ps->iid_index[env][bk];
  1369.                 c = (real_t)pow(10.0, ((i)?(((i>0)?1:-1)*quant_iid[((i>0)?i:-i)-1]):0.)/20.0);
  1370.                 rho = quant_rho[ps->icc_index[env][bk]];
  1371.                 if (rho == 0.0f && c == 1.)
  1372.                 {
  1373.                     alpha = (real_t)M_PI/4.0f;
  1374.                     rho = 0.05f;
  1375.                 } else {
  1376.                     if (rho <= 0.05f)
  1377.                     {
  1378.                         rho = 0.05f;
  1379.                     }
  1380.                     alpha = 0.5f*(real_t)atan( (2.0f*c*rho) / (c*c-1.0f) );
  1381.                     if (alpha < 0.)
  1382.                     {
  1383.                         alpha += (real_t)M_PI/2.0f;
  1384.                     }
  1385.                     if (rho < 0.)
  1386.                     {
  1387.                         alpha += (real_t)M_PI;
  1388.                     }
  1389.                 }
  1390.                 mu = c+1.0f/c;
  1391.                 mu = 1+(4.0f*rho*rho-4.0f)/(mu*mu);
  1392.                 gamma = (real_t)atan(sqrt((1.0f-sqrt(mu))/(1.0f+sqrt(mu))));
  1393.                 */
  1394.                 if (ps->iid_mode >= 3)
  1395.                 {
  1396.                     uint8_t abs_iid = abs(ps->iid_index[env][bk]);
  1397.                     cosa = sincos_alphas_B_fine[no_iid_steps + ps->iid_index[env][bk]][ps->icc_index[env][bk]];
  1398.                     sina = sincos_alphas_B_fine[30 - (no_iid_steps + ps->iid_index[env][bk])][ps->icc_index[env][bk]];
  1399.                     cosg = cos_gammas_fine[abs_iid][ps->icc_index[env][bk]];
  1400.                     sing = sin_gammas_fine[abs_iid][ps->icc_index[env][bk]];
  1401.                 } else {
  1402.                     uint8_t abs_iid = abs(ps->iid_index[env][bk]);
  1403.                     cosa = sincos_alphas_B_normal[no_iid_steps + ps->iid_index[env][bk]][ps->icc_index[env][bk]];
  1404.                     sina = sincos_alphas_B_normal[14 - (no_iid_steps + ps->iid_index[env][bk])][ps->icc_index[env][bk]];
  1405.                     cosg = cos_gammas_normal[abs_iid][ps->icc_index[env][bk]];
  1406.                     sing = sin_gammas_normal[abs_iid][ps->icc_index[env][bk]];
  1407.                 }
  1408.                 RE(h11) = MUL_C(COEF_SQRT2, MUL_C(cosa, cosg));
  1409.                 RE(h12) = MUL_C(COEF_SQRT2, MUL_C(sina, cosg));
  1410.                 RE(h21) = MUL_C(COEF_SQRT2, MUL_C(-cosa, sing));
  1411.                 RE(h22) = MUL_C(COEF_SQRT2, MUL_C(sina, sing));
  1412.             }
  1413.             /* calculate phase rotation parameters H_xy */
  1414.             /* note that the imaginary part of these parameters are only calculated when
  1415.                IPD and OPD are enabled
  1416.              */
  1417.             if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par))
  1418.             {
  1419.                 int8_t i;
  1420.                 real_t xy, pq, xypq;
  1421.                 /* ringbuffer index */
  1422.                 i = ps->phase_hist;
  1423.                 /* previous value */
  1424. #ifdef FIXED_POINT
  1425.                 /* divide by 4, shift right 2 bits */
  1426.                 RE(tempLeft)  = RE(ps->ipd_prev[bk][i]) >> 2;
  1427.                 IM(tempLeft)  = IM(ps->ipd_prev[bk][i]) >> 2;
  1428.                 RE(tempRight) = RE(ps->opd_prev[bk][i]) >> 2;
  1429.                 IM(tempRight) = IM(ps->opd_prev[bk][i]) >> 2;
  1430. #else
  1431.                 RE(tempLeft)  = MUL_F(RE(ps->ipd_prev[bk][i]), FRAC_CONST(0.25));
  1432.                 IM(tempLeft)  = MUL_F(IM(ps->ipd_prev[bk][i]), FRAC_CONST(0.25));
  1433.                 RE(tempRight) = MUL_F(RE(ps->opd_prev[bk][i]), FRAC_CONST(0.25));
  1434.                 IM(tempRight) = MUL_F(IM(ps->opd_prev[bk][i]), FRAC_CONST(0.25));
  1435. #endif
  1436.                 /* save current value */
  1437.                 RE(ps->ipd_prev[bk][i]) = ipdopd_cos_tab[abs(ps->ipd_index[env][bk])];
  1438.                 IM(ps->ipd_prev[bk][i]) = ipdopd_sin_tab[abs(ps->ipd_index[env][bk])];
  1439.                 RE(ps->opd_prev[bk][i]) = ipdopd_cos_tab[abs(ps->opd_index[env][bk])];
  1440.                 IM(ps->opd_prev[bk][i]) = ipdopd_sin_tab[abs(ps->opd_index[env][bk])];
  1441.                 /* add current value */
  1442.                 RE(tempLeft)  += RE(ps->ipd_prev[bk][i]);
  1443.                 IM(tempLeft)  += IM(ps->ipd_prev[bk][i]);
  1444.                 RE(tempRight) += RE(ps->opd_prev[bk][i]);
  1445.                 IM(tempRight) += IM(ps->opd_prev[bk][i]);
  1446.                 /* ringbuffer index */
  1447.                 if (i == 0)
  1448.                 {
  1449.                     i = 2;
  1450.                 }
  1451.                 i--;
  1452.                 /* get value before previous */
  1453. #ifdef FIXED_POINT
  1454.                 /* dividing by 2, shift right 1 bit */
  1455.                 RE(tempLeft)  += (RE(ps->ipd_prev[bk][i]) >> 1);
  1456.                 IM(tempLeft)  += (IM(ps->ipd_prev[bk][i]) >> 1);
  1457.                 RE(tempRight) += (RE(ps->opd_prev[bk][i]) >> 1);
  1458.                 IM(tempRight) += (IM(ps->opd_prev[bk][i]) >> 1);
  1459. #else
  1460.                 RE(tempLeft)  += MUL_F(RE(ps->ipd_prev[bk][i]), FRAC_CONST(0.5));
  1461.                 IM(tempLeft)  += MUL_F(IM(ps->ipd_prev[bk][i]), FRAC_CONST(0.5));
  1462.                 RE(tempRight) += MUL_F(RE(ps->opd_prev[bk][i]), FRAC_CONST(0.5));
  1463.                 IM(tempRight) += MUL_F(IM(ps->opd_prev[bk][i]), FRAC_CONST(0.5));
  1464. #endif
  1465. #if 0 /* original code */
  1466.                 ipd = (float)atan2(IM(tempLeft), RE(tempLeft));
  1467.                 opd = (float)atan2(IM(tempRight), RE(tempRight));
  1468.                 /* phase rotation */
  1469.                 RE(phaseLeft) = (float)cos(opd);
  1470.                 IM(phaseLeft) = (float)sin(opd);
  1471.                 opd -= ipd;
  1472.                 RE(phaseRight) = (float)cos(opd);
  1473.                 IM(phaseRight) = (float)sin(opd);
  1474. #else
  1475.                 // x = IM(tempLeft)
  1476.                 // y = RE(tempLeft)
  1477.                 // p = IM(tempRight)
  1478.                 // q = RE(tempRight)
  1479.                 // cos(atan2(x,y)) = y/sqrt((x*x) + (y*y))
  1480.                 // sin(atan2(x,y)) = x/sqrt((x*x) + (y*y))
  1481.                 // cos(atan2(x,y)-atan2(p,q)) = (y*q + x*p) / ( sqrt((x*x) + (y*y)) * sqrt((p*p) + (q*q)) );
  1482.                 // sin(atan2(x,y)-atan2(p,q)) = (x*q - y*p) / ( sqrt((x*x) + (y*y)) * sqrt((p*p) + (q*q)) );
  1483.                 xy = magnitude_c(tempRight);
  1484.                 pq = magnitude_c(tempLeft);
  1485.                 if (xy != 0)
  1486.                 {
  1487.                     RE(phaseLeft) = DIV_R(RE(tempRight), xy);
  1488.                     IM(phaseLeft) = DIV_R(IM(tempRight), xy);
  1489.                 } else {
  1490.                     RE(phaseLeft) = 0;
  1491.                     IM(phaseLeft) = 0;
  1492.                 }
  1493.                 xypq = MUL_R(xy, pq);
  1494.                 if (xypq != 0)
  1495.                 {
  1496.                     real_t tmp1 = MUL_R(RE(tempRight), RE(tempLeft)) + MUL_R(IM(tempRight), IM(tempLeft));
  1497.                     real_t tmp2 = MUL_R(IM(tempRight), RE(tempLeft)) - MUL_R(RE(tempRight), IM(tempLeft));
  1498.                     RE(phaseRight) = DIV_R(tmp1, xypq);
  1499.                     IM(phaseRight) = DIV_R(tmp2, xypq);
  1500.                 } else {
  1501.                     RE(phaseRight) = 0;
  1502.                     IM(phaseRight) = 0;
  1503.                 }
  1504. #endif
  1505.                 /* MUL_F(COEF, REAL) = COEF */
  1506.                 IM(h11) = MUL_R(RE(h11), IM(phaseLeft));
  1507.                 IM(h12) = MUL_R(RE(h12), IM(phaseRight));
  1508.                 IM(h21) = MUL_R(RE(h21), IM(phaseLeft));
  1509.                 IM(h22) = MUL_R(RE(h22), IM(phaseRight));
  1510.                 RE(h11) = MUL_R(RE(h11), RE(phaseLeft));
  1511.                 RE(h12) = MUL_R(RE(h12), RE(phaseRight));
  1512.                 RE(h21) = MUL_R(RE(h21), RE(phaseLeft));
  1513.                 RE(h22) = MUL_R(RE(h22), RE(phaseRight));
  1514.             }
  1515.             /* length of the envelope n_e+1 - n_e (in time samples) */
  1516.             /* 0 < L <= 32: integer */
  1517.             L = (real_t)(ps->border_position[env + 1] - ps->border_position[env]);
  1518.             /* obtain final H_xy by means of linear interpolation */
  1519.             RE(deltaH11) = (RE(h11) - RE(ps->h11_prev[gr])) / L;
  1520.             RE(deltaH12) = (RE(h12) - RE(ps->h12_prev[gr])) / L;
  1521.             RE(deltaH21) = (RE(h21) - RE(ps->h21_prev[gr])) / L;
  1522.             RE(deltaH22) = (RE(h22) - RE(ps->h22_prev[gr])) / L;
  1523.             RE(H11) = RE(ps->h11_prev[gr]);
  1524.             RE(H12) = RE(ps->h12_prev[gr]);
  1525.             RE(H21) = RE(ps->h21_prev[gr]);
  1526.             RE(H22) = RE(ps->h22_prev[gr]);
  1527.             RE(ps->h11_prev[gr]) = RE(h11);
  1528.             RE(ps->h12_prev[gr]) = RE(h12);
  1529.             RE(ps->h21_prev[gr]) = RE(h21);
  1530.             RE(ps->h22_prev[gr]) = RE(h22);
  1531.             /* only calculate imaginary part when needed */
  1532.             if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par))
  1533.             {
  1534.                 /* obtain final H_xy by means of linear interpolation */
  1535.                 IM(deltaH11) = (IM(h11) - IM(ps->h11_prev[gr])) / L;
  1536.                 IM(deltaH12) = (IM(h12) - IM(ps->h12_prev[gr])) / L;
  1537.                 IM(deltaH21) = (IM(h21) - IM(ps->h21_prev[gr])) / L;
  1538.                 IM(deltaH22) = (IM(h22) - IM(ps->h22_prev[gr])) / L;
  1539.                 IM(H11) = IM(ps->h11_prev[gr]);
  1540.                 IM(H12) = IM(ps->h12_prev[gr]);
  1541.                 IM(H21) = IM(ps->h21_prev[gr]);
  1542.                 IM(H22) = IM(ps->h22_prev[gr]);
  1543.                 if ((NEGATE_IPD_MASK & ps->map_group2bk[gr]) != 0)
  1544.                 {
  1545.                     IM(deltaH11) = -IM(deltaH11);
  1546.                     IM(deltaH12) = -IM(deltaH12);
  1547.                     IM(deltaH21) = -IM(deltaH21);
  1548.                     IM(deltaH22) = -IM(deltaH22);
  1549.                     IM(H11) = -IM(H11);
  1550.                     IM(H12) = -IM(H12);
  1551.                     IM(H21) = -IM(H21);
  1552.                     IM(H22) = -IM(H22);
  1553.                 }
  1554.                 IM(ps->h11_prev[gr]) = IM(h11);
  1555.                 IM(ps->h12_prev[gr]) = IM(h12);
  1556.                 IM(ps->h21_prev[gr]) = IM(h21);
  1557.                 IM(ps->h22_prev[gr]) = IM(h22);
  1558.             }
  1559.             /* apply H_xy to the current envelope band of the decorrelated subband */
  1560.             for (n = ps->border_position[env]; n < ps->border_position[env + 1]; n++)
  1561.             {
  1562.                 /* addition finalises the interpolation over every n */
  1563.                 RE(H11) += RE(deltaH11);
  1564.                 RE(H12) += RE(deltaH12);
  1565.                 RE(H21) += RE(deltaH21);
  1566.                 RE(H22) += RE(deltaH22);
  1567.                 if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par))
  1568.                 {
  1569.                     IM(H11) += IM(deltaH11);
  1570.                     IM(H12) += IM(deltaH12);
  1571.                     IM(H21) += IM(deltaH21);
  1572.                     IM(H22) += IM(deltaH22);
  1573.                 }
  1574.                 /* channel is an alias to the subband */
  1575.                 for (sb = ps->group_border[gr]; sb < maxsb; sb++)
  1576.                 {
  1577.                     complex_t inLeft, inRight;
  1578.                     /* load decorrelated samples */
  1579.                     if (gr < ps->num_hybrid_groups)
  1580.                     {
  1581.                         RE(inLeft) =  RE(X_hybrid_left[n][sb]);
  1582.                         IM(inLeft) =  IM(X_hybrid_left[n][sb]);
  1583.                         RE(inRight) = RE(X_hybrid_right[n][sb]);
  1584.                         IM(inRight) = IM(X_hybrid_right[n][sb]);
  1585.                     } else {
  1586.                         RE(inLeft) =  RE(X_left[n][sb]);
  1587.                         IM(inLeft) =  IM(X_left[n][sb]);
  1588.                         RE(inRight) = RE(X_right[n][sb]);
  1589.                         IM(inRight) = IM(X_right[n][sb]);
  1590.                     }
  1591.                     /* apply mixing */
  1592.                     RE(tempLeft) =  MUL_C(RE(H11), RE(inLeft)) + MUL_C(RE(H21), RE(inRight));
  1593.                     IM(tempLeft) =  MUL_C(RE(H11), IM(inLeft)) + MUL_C(RE(H21), IM(inRight));
  1594.                     RE(tempRight) = MUL_C(RE(H12), RE(inLeft)) + MUL_C(RE(H22), RE(inRight));
  1595.                     IM(tempRight) = MUL_C(RE(H12), IM(inLeft)) + MUL_C(RE(H22), IM(inRight));
  1596.                     /* only perform imaginary operations when needed */
  1597.                     if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par))
  1598.                     {
  1599.                         /* apply rotation */
  1600.                         RE(tempLeft)  -= MUL_C(IM(H11), IM(inLeft)) + MUL_C(IM(H21), IM(inRight));
  1601.                         IM(tempLeft)  += MUL_C(IM(H11), RE(inLeft)) + MUL_C(IM(H21), RE(inRight));
  1602.                         RE(tempRight) -= MUL_C(IM(H12), IM(inLeft)) + MUL_C(IM(H22), IM(inRight));
  1603.                         IM(tempRight) += MUL_C(IM(H12), RE(inLeft)) + MUL_C(IM(H22), RE(inRight));
  1604.                     }
  1605.                     /* store final samples */
  1606.                     if (gr < ps->num_hybrid_groups)
  1607.                     {
  1608.                         RE(X_hybrid_left[n][sb])  = RE(tempLeft);
  1609.                         IM(X_hybrid_left[n][sb])  = IM(tempLeft);
  1610.                         RE(X_hybrid_right[n][sb]) = RE(tempRight);
  1611.                         IM(X_hybrid_right[n][sb]) = IM(tempRight);
  1612.                     } else {
  1613.                         RE(X_left[n][sb])  = RE(tempLeft);
  1614.                         IM(X_left[n][sb])  = IM(tempLeft);
  1615.                         RE(X_right[n][sb]) = RE(tempRight);
  1616.                         IM(X_right[n][sb]) = IM(tempRight);
  1617.                     }
  1618.                 }
  1619.             }
  1620.             /* shift phase smoother's circular buffer index */
  1621.             ps->phase_hist++;
  1622.             if (ps->phase_hist == 2)
  1623.             {
  1624.                 ps->phase_hist = 0;
  1625.             }
  1626.         }
  1627.     }
  1628. }
  1629. void ps_free(ps_info *ps)
  1630. {
  1631.     /* free hybrid filterbank structures */
  1632.     hybrid_free(ps->hyb);
  1633.     faad_free(ps);
  1634. }
  1635. ps_info *ps_init(uint8_t sr_index)
  1636. {
  1637.     uint8_t i;
  1638.     uint8_t short_delay_band;
  1639.     ps_info *ps = (ps_info*)faad_malloc(sizeof(ps_info));
  1640.     memset(ps, 0, sizeof(ps_info));
  1641.     ps->hyb = hybrid_init();
  1642.     ps->ps_data_available = 0;
  1643.     /* delay stuff*/
  1644.     ps->saved_delay = 0;
  1645.     for (i = 0; i < 64; i++)
  1646.     {
  1647.         ps->delay_buf_index_delay[i] = 0;
  1648.     }
  1649.     for (i = 0; i < NO_ALLPASS_LINKS; i++)
  1650.     {
  1651.         ps->delay_buf_index_ser[i] = 0;
  1652. #ifdef PARAM_32KHZ
  1653.         if (sr_index <= 5) /* >= 32 kHz*/
  1654.         {
  1655.             ps->num_sample_delay_ser[i] = delay_length_d[1][i];
  1656.         } else {
  1657.             ps->num_sample_delay_ser[i] = delay_length_d[0][i];
  1658.         }
  1659. #else
  1660.         /* THESE ARE CONSTANTS NOW */
  1661.         ps->num_sample_delay_ser[i] = delay_length_d[i];
  1662. #endif
  1663.     }
  1664. #ifdef PARAM_32KHZ
  1665.     if (sr_index <= 5) /* >= 32 kHz*/
  1666.     {
  1667.         short_delay_band = 35;
  1668.         ps->nr_allpass_bands = 22;
  1669.         ps->alpha_decay = FRAC_CONST(0.76592833836465);
  1670.         ps->alpha_smooth = FRAC_CONST(0.25);
  1671.     } else {
  1672.         short_delay_band = 64;
  1673.         ps->nr_allpass_bands = 45;
  1674.         ps->alpha_decay = FRAC_CONST(0.58664621951003);
  1675.         ps->alpha_smooth = FRAC_CONST(0.6);
  1676.     }
  1677. #else
  1678.     /* THESE ARE CONSTANTS NOW */
  1679.     short_delay_band = 35;
  1680.     ps->nr_allpass_bands = 22;
  1681.     ps->alpha_decay = FRAC_CONST(0.76592833836465);
  1682.     ps->alpha_smooth = FRAC_CONST(0.25);
  1683. #endif
  1684.     /* THESE ARE CONSTANT NOW IF PS IS INDEPENDANT OF SAMPLERATE */
  1685.     for (i = 0; i < short_delay_band; i++)
  1686.     {
  1687.         ps->delay_D[i] = 14;
  1688.     }
  1689.     for (i = short_delay_band; i < 64; i++)
  1690.     {
  1691.         ps->delay_D[i] = 1;
  1692.     }
  1693.     /* mixing and phase */
  1694.     for (i = 0; i < 50; i++)
  1695.     {
  1696.         RE(ps->h11_prev[i]) = 1;
  1697.         IM(ps->h12_prev[i]) = 1;
  1698.         RE(ps->h11_prev[i]) = 1;
  1699.         IM(ps->h12_prev[i]) = 1;
  1700.     }
  1701.     ps->phase_hist = 0;
  1702.     for (i = 0; i < 20; i++)
  1703.     {
  1704.         RE(ps->ipd_prev[i][0]) = 0;
  1705.         IM(ps->ipd_prev[i][0]) = 0;
  1706.         RE(ps->ipd_prev[i][1]) = 0;
  1707.         IM(ps->ipd_prev[i][1]) = 0;
  1708.         RE(ps->opd_prev[i][0]) = 0;
  1709.         IM(ps->opd_prev[i][0]) = 0;
  1710.         RE(ps->opd_prev[i][1]) = 0;
  1711.         IM(ps->opd_prev[i][1]) = 0;
  1712.     }
  1713.     return ps;
  1714. }
  1715. /* main Parametric Stereo decoding function */
  1716. uint8_t ps_decode(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
  1717. {
  1718.     qmf_t X_hybrid_left[32][32] = {{0}};
  1719.     qmf_t X_hybrid_right[32][32] = {{0}};
  1720.     /* delta decoding of the bitstream data */
  1721.     ps_data_decode(ps);
  1722.     /* set up some parameters depending on filterbank type */
  1723.     if (ps->use34hybrid_bands)
  1724.     {
  1725.         ps->group_border = (uint8_t*)group_border34;
  1726.         ps->map_group2bk = (uint16_t*)map_group2bk34;
  1727.         ps->num_groups = 32+18;
  1728.         ps->num_hybrid_groups = 32;
  1729.         ps->nr_par_bands = 34;
  1730.         ps->decay_cutoff = 5;
  1731.     } else {
  1732.         ps->group_border = (uint8_t*)group_border20;
  1733.         ps->map_group2bk = (uint16_t*)map_group2bk20;
  1734.         ps->num_groups = 10+12;
  1735.         ps->num_hybrid_groups = 10;
  1736.         ps->nr_par_bands = 20;
  1737.         ps->decay_cutoff = 3;
  1738.     }
  1739.     /* Perform further analysis on the lowest subbands to get a higher
  1740.      * frequency resolution
  1741.      */
  1742.     hybrid_analysis((hyb_info*)ps->hyb, X_left, X_hybrid_left,
  1743.         ps->use34hybrid_bands);
  1744.     /* decorrelate mono signal */
  1745.     ps_decorrelate(ps, X_left, X_right, X_hybrid_left, X_hybrid_right);
  1746.     /* apply mixing and phase parameters */
  1747.     ps_mix_phase(ps, X_left, X_right, X_hybrid_left, X_hybrid_right);
  1748.     /* hybrid synthesis, to rebuild the SBR QMF matrices */
  1749.     hybrid_synthesis((hyb_info*)ps->hyb, X_left, X_hybrid_left,
  1750.         ps->use34hybrid_bands);
  1751.     hybrid_synthesis((hyb_info*)ps->hyb, X_right, X_hybrid_right,
  1752.         ps->use34hybrid_bands);
  1753.     return 0;
  1754. }
  1755. #endif