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

多媒体编程

开发平台:

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: specrec.c,v 1.3 2005/11/01 21:41:43 gabest Exp $
  31. **/
  32. /*
  33.   Spectral reconstruction:
  34.    - grouping/sectioning
  35.    - inverse quantization
  36.    - applying scalefactors
  37. */
  38. #include "common.h"
  39. #include "structs.h"
  40. #include <string.h>
  41. #include <stdlib.h>
  42. #include "specrec.h"
  43. #include "filtbank.h"
  44. #include "syntax.h"
  45. #include "iq_table.h"
  46. #include "ms.h"
  47. #include "is.h"
  48. #include "pns.h"
  49. #include "tns.h"
  50. #include "drc.h"
  51. #include "lt_predict.h"
  52. #include "ic_predict.h"
  53. #ifdef SSR_DEC
  54. #include "ssr.h"
  55. #include "ssr_fb.h"
  56. #endif
  57. /* static function declarations */
  58. static uint8_t quant_to_spec(NeAACDecHandle hDecoder,
  59.                              ic_stream *ics, int16_t *quant_data,
  60.                              real_t *spec_data, uint16_t frame_len);
  61. #ifdef LD_DEC
  62. ALIGN static const uint8_t num_swb_512_window[] =
  63. {
  64.     0, 0, 0, 36, 36, 37, 31, 31, 0, 0, 0, 0
  65. };
  66. ALIGN static const uint8_t num_swb_480_window[] =
  67. {
  68.     0, 0, 0, 35, 35, 37, 30, 30, 0, 0, 0, 0
  69. };
  70. #endif
  71. ALIGN static const uint8_t num_swb_960_window[] =
  72. {
  73.     40, 40, 45, 49, 49, 49, 46, 46, 42, 42, 42, 40
  74. };
  75. ALIGN static const uint8_t num_swb_1024_window[] =
  76. {
  77.     41, 41, 47, 49, 49, 51, 47, 47, 43, 43, 43, 40
  78. };
  79. ALIGN static const uint8_t num_swb_128_window[] =
  80. {
  81.     12, 12, 12, 14, 14, 14, 15, 15, 15, 15, 15, 15
  82. };
  83. ALIGN static const uint16_t swb_offset_1024_96[] =
  84. {
  85.     0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56,
  86.     64, 72, 80, 88, 96, 108, 120, 132, 144, 156, 172, 188, 212, 240,
  87.     276, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024
  88. };
  89. ALIGN static const uint16_t swb_offset_128_96[] =
  90. {
  91.     0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128
  92. };
  93. ALIGN static const uint16_t swb_offset_1024_64[] =
  94. {
  95.     0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56,
  96.     64, 72, 80, 88, 100, 112, 124, 140, 156, 172, 192, 216, 240, 268,
  97.     304, 344, 384, 424, 464, 504, 544, 584, 624, 664, 704, 744, 784, 824,
  98.     864, 904, 944, 984, 1024
  99. };
  100. ALIGN static const uint16_t swb_offset_128_64[] =
  101. {
  102.     0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128
  103. };
  104. ALIGN static const uint16_t swb_offset_1024_48[] =
  105. {
  106.     0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72,
  107.     80, 88, 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292,
  108.     320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736,
  109.     768, 800, 832, 864, 896, 928, 1024
  110. };
  111. #ifdef LD_DEC
  112. ALIGN static const uint16_t swb_offset_512_48[] =
  113. {
  114.     0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 68, 76, 84,
  115.     92, 100, 112, 124, 136, 148, 164, 184, 208, 236, 268, 300, 332, 364, 396,
  116.     428, 460, 512
  117. };
  118. ALIGN static const uint16_t swb_offset_480_48[] =
  119. {
  120.     0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72 ,80 ,88,
  121.     96, 108, 120, 132, 144, 156, 172, 188, 212, 240, 272, 304, 336, 368, 400,
  122.     432, 480
  123. };
  124. #endif
  125. ALIGN static const uint16_t swb_offset_128_48[] =
  126. {
  127.     0, 4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 128
  128. };
  129. ALIGN static const uint16_t swb_offset_1024_32[] =
  130. {
  131.     0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72,
  132.     80, 88, 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292,
  133.     320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736,
  134.     768, 800, 832, 864, 896, 928, 960, 992, 1024
  135. };
  136. #ifdef LD_DEC
  137. ALIGN static const uint16_t swb_offset_512_32[] =
  138. {
  139.     0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72, 80,
  140.     88, 96, 108, 120, 132, 144, 160, 176, 192, 212, 236, 260, 288, 320, 352,
  141.     384, 416, 448, 480, 512
  142. };
  143. ALIGN static const uint16_t swb_offset_480_32[] =
  144. {
  145.     0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 72, 80,
  146.     88, 96, 104, 112, 124, 136, 148, 164, 180, 200, 224, 256, 288, 320, 352,
  147.     384, 416, 448, 480
  148. };
  149. #endif
  150. ALIGN static const uint16_t swb_offset_1024_24[] =
  151. {
  152.     0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68,
  153.     76, 84, 92, 100, 108, 116, 124, 136, 148, 160, 172, 188, 204, 220,
  154.     240, 260, 284, 308, 336, 364, 396, 432, 468, 508, 552, 600, 652, 704,
  155.     768, 832, 896, 960, 1024
  156. };
  157. #ifdef LD_DEC
  158. ALIGN static const uint16_t swb_offset_512_24[] =
  159. {
  160.     0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68,
  161.     80, 92, 104, 120, 140, 164, 192, 224, 256, 288, 320, 352, 384, 416,
  162.     448, 480, 512
  163. };
  164. ALIGN static const uint16_t swb_offset_480_24[] =
  165. {
  166.     0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, 80, 92, 104, 120,
  167.     140, 164, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480
  168. };
  169. #endif
  170. ALIGN static const uint16_t swb_offset_128_24[] =
  171. {
  172.     0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128
  173. };
  174. ALIGN static const uint16_t swb_offset_1024_16[] =
  175. {
  176.     0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 100, 112, 124,
  177.     136, 148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300, 320, 344,
  178.     368, 396, 424, 456, 492, 532, 572, 616, 664, 716, 772, 832, 896, 960, 1024
  179. };
  180. ALIGN static const uint16_t swb_offset_128_16[] =
  181. {
  182.     0, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 128
  183. };
  184. ALIGN static const uint16_t swb_offset_1024_8[] =
  185. {
  186.     0, 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, 172,
  187.     188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372, 396, 420, 448,
  188.     476, 508, 544, 580, 620, 664, 712, 764, 820, 880, 944, 1024
  189. };
  190. ALIGN static const uint16_t swb_offset_128_8[] =
  191. {
  192.     0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 128
  193. };
  194. ALIGN static const uint16_t *swb_offset_1024_window[] =
  195. {
  196.     swb_offset_1024_96,      /* 96000 */
  197.     swb_offset_1024_96,      /* 88200 */
  198.     swb_offset_1024_64,      /* 64000 */
  199.     swb_offset_1024_48,      /* 48000 */
  200.     swb_offset_1024_48,      /* 44100 */
  201.     swb_offset_1024_32,      /* 32000 */
  202.     swb_offset_1024_24,      /* 24000 */
  203.     swb_offset_1024_24,      /* 22050 */
  204.     swb_offset_1024_16,      /* 16000 */
  205.     swb_offset_1024_16,      /* 12000 */
  206.     swb_offset_1024_16,      /* 11025 */
  207.     swb_offset_1024_8        /* 8000  */
  208. };
  209. #ifdef LD_DEC
  210. ALIGN static const uint16_t *swb_offset_512_window[] =
  211. {
  212.     0,                       /* 96000 */
  213.     0,                       /* 88200 */
  214.     0,                       /* 64000 */
  215.     swb_offset_512_48,       /* 48000 */
  216.     swb_offset_512_48,       /* 44100 */
  217.     swb_offset_512_32,       /* 32000 */
  218.     swb_offset_512_24,       /* 24000 */
  219.     swb_offset_512_24,       /* 22050 */
  220.     0,                       /* 16000 */
  221.     0,                       /* 12000 */
  222.     0,                       /* 11025 */
  223.     0                        /* 8000  */
  224. };
  225. ALIGN static const uint16_t *swb_offset_480_window[] =
  226. {
  227.     0,                       /* 96000 */
  228.     0,                       /* 88200 */
  229.     0,                       /* 64000 */
  230.     swb_offset_480_48,       /* 48000 */
  231.     swb_offset_480_48,       /* 44100 */
  232.     swb_offset_480_32,       /* 32000 */
  233.     swb_offset_480_24,       /* 24000 */
  234.     swb_offset_480_24,       /* 22050 */
  235.     0,                       /* 16000 */
  236.     0,                       /* 12000 */
  237.     0,                       /* 11025 */
  238.     0                        /* 8000  */
  239. };
  240. #endif
  241. ALIGN static const  uint16_t *swb_offset_128_window[] =
  242. {
  243.     swb_offset_128_96,       /* 96000 */
  244.     swb_offset_128_96,       /* 88200 */
  245.     swb_offset_128_64,       /* 64000 */
  246.     swb_offset_128_48,       /* 48000 */
  247.     swb_offset_128_48,       /* 44100 */
  248.     swb_offset_128_48,       /* 32000 */
  249.     swb_offset_128_24,       /* 24000 */
  250.     swb_offset_128_24,       /* 22050 */
  251.     swb_offset_128_16,       /* 16000 */
  252.     swb_offset_128_16,       /* 12000 */
  253.     swb_offset_128_16,       /* 11025 */
  254.     swb_offset_128_8         /* 8000  */
  255. };
  256. #define bit_set(A, B) ((A) & (1<<(B)))
  257. /* 4.5.2.3.4 */
  258. /*
  259.   - determine the number of windows in a window_sequence named num_windows
  260.   - determine the number of window_groups named num_window_groups
  261.   - determine the number of windows in each group named window_group_length[g]
  262.   - determine the total number of scalefactor window bands named num_swb for
  263.     the actual window type
  264.   - determine swb_offset[swb], the offset of the first coefficient in
  265.     scalefactor window band named swb of the window actually used
  266.   - determine sect_sfb_offset[g][section],the offset of the first coefficient
  267.     in section named section. This offset depends on window_sequence and
  268.     scale_factor_grouping and is needed to decode the spectral_data().
  269. */
  270. uint8_t window_grouping_info(NeAACDecHandle hDecoder, ic_stream *ics)
  271. {
  272.     uint8_t i, g;
  273.     uint8_t sf_index = hDecoder->sf_index;
  274.     switch (ics->window_sequence) {
  275.     case ONLY_LONG_SEQUENCE:
  276.     case LONG_START_SEQUENCE:
  277.     case LONG_STOP_SEQUENCE:
  278.         ics->num_windows = 1;
  279.         ics->num_window_groups = 1;
  280.         ics->window_group_length[ics->num_window_groups-1] = 1;
  281. #ifdef LD_DEC
  282.         if (hDecoder->object_type == LD)
  283.         {
  284.             if (hDecoder->frameLength == 512)
  285.                 ics->num_swb = num_swb_512_window[sf_index];
  286.             else /* if (hDecoder->frameLength == 480) */
  287.                 ics->num_swb = num_swb_480_window[sf_index];
  288.         } else {
  289. #endif
  290.             if (hDecoder->frameLength == 1024)
  291.                 ics->num_swb = num_swb_1024_window[sf_index];
  292.             else /* if (hDecoder->frameLength == 960) */
  293.                 ics->num_swb = num_swb_960_window[sf_index];
  294. #ifdef LD_DEC
  295.         }
  296. #endif
  297.         if (ics->max_sfb > ics->num_swb)
  298.         {
  299.             return 32;
  300.         }
  301.         /* preparation of sect_sfb_offset for long blocks */
  302.         /* also copy the last value! */
  303. #ifdef LD_DEC
  304.         if (hDecoder->object_type == LD)
  305.         {
  306.             if (hDecoder->frameLength == 512)
  307.             {
  308.                 for (i = 0; i < ics->num_swb; i++)
  309.                 {
  310.                     ics->sect_sfb_offset[0][i] = swb_offset_512_window[sf_index][i];
  311.                     ics->swb_offset[i] = swb_offset_512_window[sf_index][i];
  312.                 }
  313.             } else /* if (hDecoder->frameLength == 480) */ {
  314.                 for (i = 0; i < ics->num_swb; i++)
  315.                 {
  316.                     ics->sect_sfb_offset[0][i] = swb_offset_480_window[sf_index][i];
  317.                     ics->swb_offset[i] = swb_offset_480_window[sf_index][i];
  318.                 }
  319.             }
  320.             ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength;
  321.             ics->swb_offset[ics->num_swb] = hDecoder->frameLength;
  322.         } else {
  323. #endif
  324.             for (i = 0; i < ics->num_swb; i++)
  325.             {
  326.                 ics->sect_sfb_offset[0][i] = swb_offset_1024_window[sf_index][i];
  327.                 ics->swb_offset[i] = swb_offset_1024_window[sf_index][i];
  328.             }
  329.             ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength;
  330.             ics->swb_offset[ics->num_swb] = hDecoder->frameLength;
  331. #ifdef LD_DEC
  332.         }
  333. #endif
  334.         return 0;
  335.     case EIGHT_SHORT_SEQUENCE:
  336.         ics->num_windows = 8;
  337.         ics->num_window_groups = 1;
  338.         ics->window_group_length[ics->num_window_groups-1] = 1;
  339.         ics->num_swb = num_swb_128_window[sf_index];
  340.         if (ics->max_sfb > ics->num_swb)
  341.         {
  342.             return 32;
  343.         }
  344.         for (i = 0; i < ics->num_swb; i++)
  345.             ics->swb_offset[i] = swb_offset_128_window[sf_index][i];
  346.         ics->swb_offset[ics->num_swb] = hDecoder->frameLength/8;
  347.         for (i = 0; i < ics->num_windows-1; i++) {
  348.             if (bit_set(ics->scale_factor_grouping, 6-i) == 0)
  349.             {
  350.                 ics->num_window_groups += 1;
  351.                 ics->window_group_length[ics->num_window_groups-1] = 1;
  352.             } else {
  353.                 ics->window_group_length[ics->num_window_groups-1] += 1;
  354.             }
  355.         }
  356.         /* preparation of sect_sfb_offset for short blocks */
  357.         for (g = 0; g < ics->num_window_groups; g++)
  358.         {
  359.             uint16_t width;
  360.             uint8_t sect_sfb = 0;
  361.             uint16_t offset = 0;
  362.             for (i = 0; i < ics->num_swb; i++)
  363.             {
  364.                 if (i+1 == ics->num_swb)
  365.                 {
  366.                     width = (hDecoder->frameLength/8) - swb_offset_128_window[sf_index][i];
  367.                 } else {
  368.                     width = swb_offset_128_window[sf_index][i+1] -
  369.                         swb_offset_128_window[sf_index][i];
  370.                 }
  371.                 width *= ics->window_group_length[g];
  372.                 ics->sect_sfb_offset[g][sect_sfb++] = offset;
  373.                 offset += width;
  374.             }
  375.             ics->sect_sfb_offset[g][sect_sfb] = offset;
  376.         }
  377.         return 0;
  378.     default:
  379.         return 32;
  380.     }
  381. }
  382. /* iquant() *
  383. /* output = sign(input)*abs(input)^(4/3) */
  384. /**/
  385. static INLINE real_t iquant(int16_t q, const real_t *tab, uint8_t *error)
  386. {
  387. #ifdef FIXED_POINT
  388. /* For FIXED_POINT the iq_table is prescaled by 3 bits (iq_table[]/8) */
  389. /* BIG_IQ_TABLE allows you to use the full 8192 value table, if this is not
  390.  * defined a 1026 value table and interpolation will be used
  391.  */
  392. #ifndef BIG_IQ_TABLE
  393.     static const real_t errcorr[] = {
  394.         REAL_CONST(0), REAL_CONST(1.0/8.0), REAL_CONST(2.0/8.0), REAL_CONST(3.0/8.0),
  395.         REAL_CONST(4.0/8.0),  REAL_CONST(5.0/8.0), REAL_CONST(6.0/8.0), REAL_CONST(7.0/8.0),
  396.         REAL_CONST(0)
  397.     };
  398.     real_t x1, x2;
  399. #endif
  400.     int16_t sgn = 1;
  401.     if (q < 0)
  402.     {
  403.         q = -q;
  404.         sgn = -1;
  405.     }
  406.     if (q < IQ_TABLE_SIZE)
  407.     {
  408. //#define IQUANT_PRINT
  409. #ifdef IQUANT_PRINT
  410.         //printf("0x%.8Xn", sgn * tab[q]);
  411.         printf("%dn", sgn * tab[q]);
  412. #endif
  413.         return sgn * tab[q];
  414.     }
  415. #ifndef BIG_IQ_TABLE
  416.     if (q >= 8192)
  417.     {
  418.         *error = 17;
  419.         return 0;
  420.     }
  421.     /* linear interpolation */
  422.     x1 = tab[q>>3];
  423.     x2 = tab[(q>>3) + 1];
  424.     return sgn * 16 * (MUL_R(errcorr[q&7],(x2-x1)) + x1);
  425. #else
  426.     *error = 17;
  427.     return 0;
  428. #endif
  429. #else
  430.     if (q < 0)
  431.     {
  432.         /* tab contains a value for all possible q [0,8192] */
  433.         if (-q < IQ_TABLE_SIZE)
  434.             return -tab[-q];
  435.         *error = 17;
  436.         return 0;
  437.     } else {
  438.         /* tab contains a value for all possible q [0,8192] */
  439.         if (q < IQ_TABLE_SIZE)
  440.             return tab[q];
  441.         *error = 17;
  442.         return 0;
  443.     }
  444. #endif
  445. }
  446. #ifndef FIXED_POINT
  447. ALIGN static const real_t pow2sf_tab[] = {
  448.     2.9802322387695313E-008, 5.9604644775390625E-008, 1.1920928955078125E-007,
  449.     2.384185791015625E-007, 4.76837158203125E-007, 9.5367431640625E-007,
  450.     1.9073486328125E-006, 3.814697265625E-006, 7.62939453125E-006,
  451.     1.52587890625E-005, 3.0517578125E-005, 6.103515625E-005,
  452.     0.0001220703125, 0.000244140625, 0.00048828125,
  453.     0.0009765625, 0.001953125, 0.00390625,
  454.     0.0078125, 0.015625, 0.03125,
  455.     0.0625, 0.125, 0.25,
  456.     0.5, 1.0, 2.0,
  457.     4.0, 8.0, 16.0, 32.0,
  458.     64.0, 128.0, 256.0,
  459.     512.0, 1024.0, 2048.0,
  460.     4096.0, 8192.0, 16384.0,
  461.     32768.0, 65536.0, 131072.0,
  462.     262144.0, 524288.0, 1048576.0,
  463.     2097152.0, 4194304.0, 8388608.0,
  464.     16777216.0, 33554432.0, 67108864.0,
  465.     134217728.0, 268435456.0, 536870912.0,
  466.     1073741824.0, 2147483648.0, 4294967296.0,
  467.     8589934592.0, 17179869184.0, 34359738368.0,
  468.     68719476736.0, 137438953472.0, 274877906944.0
  469. };
  470. #endif
  471. /* quant_to_spec: perform dequantisation and scaling
  472.  * and in case of short block it also does the deinterleaving
  473.  */
  474. /*
  475.   For ONLY_LONG_SEQUENCE windows (num_window_groups = 1,
  476.   window_group_length[0] = 1) the spectral data is in ascending spectral
  477.   order.
  478.   For the EIGHT_SHORT_SEQUENCE window, the spectral order depends on the
  479.   grouping in the following manner:
  480.   - Groups are ordered sequentially
  481.   - Within a group, a scalefactor band consists of the spectral data of all
  482.     grouped SHORT_WINDOWs for the associated scalefactor window band. To
  483.     clarify via example, the length of a group is in the range of one to eight
  484.     SHORT_WINDOWs.
  485.   - If there are eight groups each with length one (num_window_groups = 8,
  486.     window_group_length[0..7] = 1), the result is a sequence of eight spectra,
  487.     each in ascending spectral order.
  488.   - If there is only one group with length eight (num_window_groups = 1,
  489.     window_group_length[0] = 8), the result is that spectral data of all eight
  490.     SHORT_WINDOWs is interleaved by scalefactor window bands.
  491.   - Within a scalefactor window band, the coefficients are in ascending
  492.     spectral order.
  493. */
  494. static uint8_t quant_to_spec(NeAACDecHandle hDecoder,
  495.                              ic_stream *ics, int16_t *quant_data,
  496.                              real_t *spec_data, uint16_t frame_len)
  497. {
  498.     ALIGN static const real_t pow2_table[] =
  499.     {
  500.         COEF_CONST(1.0),
  501.         COEF_CONST(1.1892071150027210667174999705605), /* 2^0.25 */
  502.         COEF_CONST(1.4142135623730950488016887242097), /* 2^0.5 */
  503.         COEF_CONST(1.6817928305074290860622509524664) /* 2^0.75 */
  504.     };
  505.     const real_t *tab = iq_table;
  506.     uint8_t g, sfb, win;
  507.     uint16_t width, bin, k, gindex, wa, wb;
  508.     uint8_t error = 0; /* Init error flag */
  509. #ifndef FIXED_POINT
  510.     real_t scf;
  511. #endif
  512.     k = 0;
  513.     gindex = 0;
  514.     for (g = 0; g < ics->num_window_groups; g++)
  515.     {
  516.         uint16_t j = 0;
  517.         uint16_t gincrease = 0;
  518.         uint16_t win_inc = ics->swb_offset[ics->num_swb];
  519.         for (sfb = 0; sfb < ics->num_swb; sfb++)
  520.         {
  521.             int32_t exp, frac;
  522.             width = ics->swb_offset[sfb+1] - ics->swb_offset[sfb];
  523.             /* this could be scalefactor for IS or PNS, those can be negative or bigger then 255 */
  524.             /* just ignore them */
  525.             if (ics->scale_factors[g][sfb] < 0 || ics->scale_factors[g][sfb] > 255)
  526.             {
  527.                 exp = 0;
  528.                 frac = 0;
  529.             } else {
  530.                 /* ics->scale_factors[g][sfb] must be between 0 and 255 */
  531.                 exp = (ics->scale_factors[g][sfb] /* - 100 */) >> 2;
  532.                 /* frac must always be > 0 */
  533.                 frac = (ics->scale_factors[g][sfb] /* - 100 */) & 3;
  534.             }
  535. #ifdef FIXED_POINT
  536.             exp -= 25;
  537.             /* IMDCT pre-scaling */
  538.             if (hDecoder->object_type == LD)
  539.             {
  540.                 exp -= 6 /*9*/;
  541.             } else {
  542.                 if (ics->window_sequence == EIGHT_SHORT_SEQUENCE)
  543.                     exp -= 4 /*7*/;
  544.                 else
  545.                     exp -= 7 /*10*/;
  546.             }
  547. #endif
  548.             wa = gindex + j;
  549. #ifndef FIXED_POINT
  550.             scf = pow2sf_tab[exp/*+25*/] * pow2_table[frac];
  551. #endif
  552.             for (win = 0; win < ics->window_group_length[g]; win++)
  553.             {
  554.                 for (bin = 0; bin < width; bin += 4)
  555.                 {
  556. #ifndef FIXED_POINT
  557.                     wb = wa + bin;
  558.                     spec_data[wb+0] = iquant(quant_data[k+0], tab, &error) * scf;
  559.                     spec_data[wb+1] = iquant(quant_data[k+1], tab, &error) * scf;                        
  560.                     spec_data[wb+2] = iquant(quant_data[k+2], tab, &error) * scf;                        
  561.                     spec_data[wb+3] = iquant(quant_data[k+3], tab, &error) * scf;
  562.                         
  563. #else
  564.                     real_t iq0 = iquant(quant_data[k+0], tab, &error);
  565.                     real_t iq1 = iquant(quant_data[k+1], tab, &error);
  566.                     real_t iq2 = iquant(quant_data[k+2], tab, &error);
  567.                     real_t iq3 = iquant(quant_data[k+3], tab, &error);
  568.                     wb = wa + bin;
  569.                     if (exp < 0)
  570.                     {
  571.                         spec_data[wb+0] = iq0 >>= -exp;
  572.                         spec_data[wb+1] = iq1 >>= -exp;
  573.                         spec_data[wb+2] = iq2 >>= -exp;
  574.                         spec_data[wb+3] = iq3 >>= -exp;
  575.                     } else {
  576.                         spec_data[wb+0] = iq0 <<= exp;
  577.                         spec_data[wb+1] = iq1 <<= exp;
  578.                         spec_data[wb+2] = iq2 <<= exp;
  579.                         spec_data[wb+3] = iq3 <<= exp;
  580.                     }
  581.                     if (frac != 0)
  582.                     {
  583.                         spec_data[wb+0] = MUL_C(spec_data[wb+0],pow2_table[frac]);
  584.                         spec_data[wb+1] = MUL_C(spec_data[wb+1],pow2_table[frac]);
  585.                         spec_data[wb+2] = MUL_C(spec_data[wb+2],pow2_table[frac]);
  586.                         spec_data[wb+3] = MUL_C(spec_data[wb+3],pow2_table[frac]);
  587.                     }
  588. //#define SCFS_PRINT
  589. #ifdef SCFS_PRINT
  590.                     printf("%dn", spec_data[gindex+(win*win_inc)+j+bin+0]);
  591.                     printf("%dn", spec_data[gindex+(win*win_inc)+j+bin+1]);
  592.                     printf("%dn", spec_data[gindex+(win*win_inc)+j+bin+2]);
  593.                     printf("%dn", spec_data[gindex+(win*win_inc)+j+bin+3]);
  594.                     //printf("0x%.8Xn", spec_data[gindex+(win*win_inc)+j+bin+0]);
  595.                     //printf("0x%.8Xn", spec_data[gindex+(win*win_inc)+j+bin+1]);
  596.                     //printf("0x%.8Xn", spec_data[gindex+(win*win_inc)+j+bin+2]);
  597.                     //printf("0x%.8Xn", spec_data[gindex+(win*win_inc)+j+bin+3]);
  598. #endif
  599. #endif
  600.                     gincrease += 4;
  601.                     k += 4;
  602.                 }
  603.                 wa += win_inc;
  604.             }
  605.             j += width;
  606.         }
  607.         gindex += gincrease;
  608.     }
  609.     return error;
  610. }
  611. static uint8_t allocate_single_channel(NeAACDecHandle hDecoder, uint8_t channel,
  612.                                        uint8_t output_channels)
  613. {
  614.     uint8_t mul = 1;
  615. #ifdef MAIN_DEC
  616.     /* MAIN object type prediction */
  617.     if (hDecoder->object_type == MAIN)
  618.     {
  619.         /* allocate the state only when needed */
  620.         if (hDecoder->pred_stat[channel] != NULL)
  621.         {
  622.             faad_free(hDecoder->pred_stat[channel]);
  623.             hDecoder->pred_stat[channel] = NULL;
  624.         }
  625.         hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state));
  626.         reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength);
  627.     }
  628. #endif
  629. #ifdef LTP_DEC
  630.     if (is_ltp_ot(hDecoder->object_type))
  631.     {
  632.         /* allocate the state only when needed */
  633.         if (hDecoder->lt_pred_stat[channel] != NULL)
  634.         {
  635.             faad_free(hDecoder->lt_pred_stat[channel]);
  636.             hDecoder->lt_pred_stat[channel] = NULL;
  637.         }
  638.         hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t));
  639.         memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t));
  640.     }
  641. #endif
  642.     if (hDecoder->time_out[channel] != NULL)
  643.     {
  644.         faad_free(hDecoder->time_out[channel]);
  645.         hDecoder->time_out[channel] = NULL;
  646.     }
  647.     {
  648.         mul = 1;
  649. #ifdef SBR_DEC
  650.         hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0;
  651.         if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1))
  652.         {
  653.             /* SBR requires 2 times as much output data */
  654.             mul = 2;
  655.             hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1;
  656.         }
  657. #endif
  658.         hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t));
  659.         memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t));
  660.     }
  661. #if (defined(PS_DEC) || defined(DRM_PS))
  662.     if (output_channels == 2)
  663.     {
  664.         if (hDecoder->time_out[channel+1] != NULL)
  665.         {
  666.             faad_free(hDecoder->time_out[channel+1]);
  667.             hDecoder->time_out[channel+1] = NULL;
  668.         }
  669.         hDecoder->time_out[channel+1] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t));
  670.         memset(hDecoder->time_out[channel+1], 0, mul*hDecoder->frameLength*sizeof(real_t));
  671.     }
  672. #endif
  673.     if (hDecoder->fb_intermed[channel] != NULL)
  674.     {
  675.         faad_free(hDecoder->fb_intermed[channel]);
  676.         hDecoder->fb_intermed[channel] = NULL;
  677.     }
  678.     hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t));
  679.     memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t));
  680. #ifdef SSR_DEC
  681.     if (hDecoder->object_type == SSR)
  682.     {
  683.         if (hDecoder->ssr_overlap[channel] == NULL)
  684.         {
  685.             hDecoder->ssr_overlap[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t));
  686.             memset(hDecoder->ssr_overlap[channel], 0, 2*hDecoder->frameLength*sizeof(real_t));
  687.         }
  688.         if (hDecoder->prev_fmd[channel] == NULL)
  689.         {
  690.             uint16_t k;
  691.             hDecoder->prev_fmd[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t));
  692.             for (k = 0; k < 2*hDecoder->frameLength; k++)
  693.                 hDecoder->prev_fmd[channel][k] = REAL_CONST(-1);
  694.         }
  695.     }
  696. #endif
  697.     return 0;
  698. }
  699. static uint8_t allocate_channel_pair(NeAACDecHandle hDecoder,
  700.                                      uint8_t channel, uint8_t paired_channel)
  701. {
  702.     uint8_t mul = 1;
  703. #ifdef MAIN_DEC
  704.     /* MAIN object type prediction */
  705.     if (hDecoder->object_type == MAIN)
  706.     {
  707.         /* allocate the state only when needed */
  708.         if (hDecoder->pred_stat[channel] == NULL)
  709.         {
  710.             hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state));
  711.             reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength);
  712.         }
  713.         if (hDecoder->pred_stat[paired_channel] == NULL)
  714.         {
  715.             hDecoder->pred_stat[paired_channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state));
  716.             reset_all_predictors(hDecoder->pred_stat[paired_channel], hDecoder->frameLength);
  717.         }
  718.     }
  719. #endif
  720. #ifdef LTP_DEC
  721.     if (is_ltp_ot(hDecoder->object_type))
  722.     {
  723.         /* allocate the state only when needed */
  724.         if (hDecoder->lt_pred_stat[channel] == NULL)
  725.         {
  726.             hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t));
  727.             memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t));
  728.         }
  729.         if (hDecoder->lt_pred_stat[paired_channel] == NULL)
  730.         {
  731.             hDecoder->lt_pred_stat[paired_channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t));
  732.             memset(hDecoder->lt_pred_stat[paired_channel], 0, hDecoder->frameLength*4 * sizeof(int16_t));
  733.         }
  734.     }
  735. #endif
  736.     if (hDecoder->time_out[channel] == NULL)
  737.     {
  738.         mul = 1;
  739. #ifdef SBR_DEC
  740.         hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0;
  741.         if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1))
  742.         {
  743.             /* SBR requires 2 times as much output data */
  744.             mul = 2;
  745.             hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1;
  746.         }
  747. #endif
  748.         hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t));
  749.         memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t));
  750.     }
  751.     if (hDecoder->time_out[paired_channel] == NULL)
  752.     {
  753.         hDecoder->time_out[paired_channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t));
  754.         memset(hDecoder->time_out[paired_channel], 0, mul*hDecoder->frameLength*sizeof(real_t));
  755.     }
  756.     if (hDecoder->fb_intermed[channel] == NULL)
  757.     {
  758.         hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t));
  759.         memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t));
  760.     }
  761.     if (hDecoder->fb_intermed[paired_channel] == NULL)
  762.     {
  763.         hDecoder->fb_intermed[paired_channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t));
  764.         memset(hDecoder->fb_intermed[paired_channel], 0, hDecoder->frameLength*sizeof(real_t));
  765.     }
  766. #ifdef SSR_DEC
  767.     if (hDecoder->object_type == SSR)
  768.     {
  769.         if (hDecoder->ssr_overlap[cpe->channel] == NULL)
  770.         {
  771.             hDecoder->ssr_overlap[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t));
  772.             memset(hDecoder->ssr_overlap[cpe->channel], 0, 2*hDecoder->frameLength*sizeof(real_t));
  773.         }
  774.         if (hDecoder->ssr_overlap[cpe->paired_channel] == NULL)
  775.         {
  776.             hDecoder->ssr_overlap[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t));
  777.             memset(hDecoder->ssr_overlap[cpe->paired_channel], 0, 2*hDecoder->frameLength*sizeof(real_t));
  778.         }
  779.         if (hDecoder->prev_fmd[cpe->channel] == NULL)
  780.         {
  781.             uint16_t k;
  782.             hDecoder->prev_fmd[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t));
  783.             for (k = 0; k < 2*hDecoder->frameLength; k++)
  784.                 hDecoder->prev_fmd[cpe->channel][k] = REAL_CONST(-1);
  785.         }
  786.         if (hDecoder->prev_fmd[cpe->paired_channel] == NULL)
  787.         {
  788.             uint16_t k;
  789.             hDecoder->prev_fmd[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t));
  790.             for (k = 0; k < 2*hDecoder->frameLength; k++)
  791.                 hDecoder->prev_fmd[cpe->paired_channel][k] = REAL_CONST(-1);
  792.         }
  793.     }
  794. #endif
  795.     return 0;
  796. }
  797. uint8_t reconstruct_single_channel(NeAACDecHandle hDecoder, ic_stream *ics,
  798.                                    element *sce, int16_t *spec_data)
  799. {
  800.     uint8_t retval, output_channels;
  801.     ALIGN real_t spec_coef[1024];
  802. #ifdef PROFILE
  803.     int64_t count = faad_get_ts();
  804. #endif
  805.     /* always allocate 2 channels, PS can always "suddenly" turn up */
  806. #if ( (defined(DRM) && defined(DRM_PS)) )
  807.     output_channels = 2;
  808. #elif defined(PS_DEC)
  809.     if (hDecoder->ps_used[hDecoder->fr_ch_ele])
  810.         output_channels = 2;
  811.     else
  812.         output_channels = 1;
  813. #endif
  814.     if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0)
  815.     {
  816.         /* element_output_channels not set yet */
  817.         hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels;
  818.     } else if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] != output_channels) {
  819.         /* element inconsistency */
  820.         /* this only happens if PS is actually found but not in the first frame
  821.          * this means that there is only 1 bitstream element!
  822.          */
  823.         /* reset the allocation */
  824.         hDecoder->element_alloced[hDecoder->fr_ch_ele] = 0;
  825.         hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels;
  826.         //return 21;
  827.     }
  828.     if (hDecoder->element_alloced[hDecoder->fr_ch_ele] == 0)
  829.     {
  830.         retval = allocate_single_channel(hDecoder, sce->channel, output_channels);
  831.         if (retval > 0)
  832.             return retval;
  833.         hDecoder->element_alloced[hDecoder->fr_ch_ele] = 1;
  834.     }
  835.     /* dequantisation and scaling */
  836.     retval = quant_to_spec(hDecoder, ics, spec_data, spec_coef, hDecoder->frameLength);
  837.     if (retval > 0)
  838.         return retval;
  839. #ifdef PROFILE
  840.     count = faad_get_ts() - count;
  841.     hDecoder->requant_cycles += count;
  842. #endif
  843.     /* pns decoding */
  844.     pns_decode(ics, NULL, spec_coef, NULL, hDecoder->frameLength, 0, hDecoder->object_type);
  845. #ifdef MAIN_DEC
  846.     /* MAIN object type prediction */
  847.     if (hDecoder->object_type == MAIN)
  848.     {
  849.         /* intra channel prediction */
  850.         ic_prediction(ics, spec_coef, hDecoder->pred_stat[sce->channel], hDecoder->frameLength,
  851.             hDecoder->sf_index);
  852.         /* In addition, for scalefactor bands coded by perceptual
  853.            noise substitution the predictors belonging to the
  854.            corresponding spectral coefficients are reset.
  855.         */
  856.         pns_reset_pred_state(ics, hDecoder->pred_stat[sce->channel]);
  857.     }
  858. #endif
  859. #ifdef LTP_DEC
  860.     if (is_ltp_ot(hDecoder->object_type))
  861.     {
  862. #ifdef LD_DEC
  863.         if (hDecoder->object_type == LD)
  864.         {
  865.             if (ics->ltp.data_present)
  866.             {
  867.                 if (ics->ltp.lag_update)
  868.                     hDecoder->ltp_lag[sce->channel] = ics->ltp.lag;
  869.             }
  870.             ics->ltp.lag = hDecoder->ltp_lag[sce->channel];
  871.         }
  872. #endif
  873.         /* long term prediction */
  874.         lt_prediction(ics, &(ics->ltp), spec_coef, hDecoder->lt_pred_stat[sce->channel], hDecoder->fb,
  875.             ics->window_shape, hDecoder->window_shape_prev[sce->channel],
  876.             hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength);
  877.     }
  878. #endif
  879.     /* tns decoding */
  880.     tns_decode_frame(ics, &(ics->tns), hDecoder->sf_index, hDecoder->object_type,
  881.         spec_coef, hDecoder->frameLength);
  882.     /* drc decoding */
  883.     if (hDecoder->drc->present)
  884.     {
  885.         if (!hDecoder->drc->exclude_mask[sce->channel] || !hDecoder->drc->excluded_chns_present)
  886.             drc_decode(hDecoder->drc, spec_coef);
  887.     }
  888.     /* filter bank */
  889. #ifdef SSR_DEC
  890.     if (hDecoder->object_type != SSR)
  891.     {
  892. #endif
  893.         ifilter_bank(hDecoder->fb, ics->window_sequence, ics->window_shape,
  894.             hDecoder->window_shape_prev[sce->channel], spec_coef,
  895.             hDecoder->time_out[sce->channel], hDecoder->fb_intermed[sce->channel],
  896.             hDecoder->object_type, hDecoder->frameLength);
  897. #ifdef SSR_DEC
  898.     } else {
  899.         ssr_decode(&(ics->ssr), hDecoder->fb, ics->window_sequence, ics->window_shape,
  900.             hDecoder->window_shape_prev[sce->channel], spec_coef, hDecoder->time_out[sce->channel],
  901.             hDecoder->ssr_overlap[sce->channel], hDecoder->ipqf_buffer[sce->channel], hDecoder->prev_fmd[sce->channel],
  902.             hDecoder->frameLength);
  903.     }
  904. #endif
  905.     /* save window shape for next frame */
  906.     hDecoder->window_shape_prev[sce->channel] = ics->window_shape;
  907. #ifdef LTP_DEC
  908.     if (is_ltp_ot(hDecoder->object_type))
  909.     {
  910.         lt_update_state(hDecoder->lt_pred_stat[sce->channel], hDecoder->time_out[sce->channel],
  911.             hDecoder->fb_intermed[sce->channel], hDecoder->frameLength, hDecoder->object_type);
  912.     }
  913. #endif
  914. #ifdef SBR_DEC
  915.     if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1))
  916.         && hDecoder->sbr_alloced[hDecoder->fr_ch_ele])
  917.     {
  918.         uint8_t ele = hDecoder->fr_ch_ele;
  919.         uint8_t ch = sce->channel;
  920.         /* following case can happen when forceUpSampling == 1 */
  921.         if (hDecoder->sbr[ele] == NULL)
  922.         {
  923.             hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength,
  924.                 hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index),
  925.                 hDecoder->downSampledSBR
  926. #ifdef DRM
  927.                 , 0
  928. #endif
  929.                 );
  930.         }
  931.         if (sce->ics1.window_sequence == EIGHT_SHORT_SEQUENCE)
  932.             hDecoder->sbr[ele]->maxAACLine = 8*sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)];
  933.         else
  934.             hDecoder->sbr[ele]->maxAACLine = sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)];
  935.         /* check if any of the PS tools is used */
  936. #if (defined(PS_DEC) || defined(DRM_PS))
  937.         if (hDecoder->ps_used[ele] == 0)
  938.         {
  939. #endif
  940.             retval = sbrDecodeSingleFrame(hDecoder->sbr[ele], hDecoder->time_out[ch],
  941.                 hDecoder->postSeekResetFlag, hDecoder->downSampledSBR);
  942. #if (defined(PS_DEC) || defined(DRM_PS))
  943.         } else {
  944.             retval = sbrDecodeSingleFramePS(hDecoder->sbr[ele], hDecoder->time_out[ch],
  945.                 hDecoder->time_out[ch+1], hDecoder->postSeekResetFlag,
  946.                 hDecoder->downSampledSBR);
  947.         }
  948. #endif
  949.         if (retval > 0)
  950.             return retval;
  951.     } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1))
  952.         && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele])
  953.     {
  954.         return 23;
  955.     }
  956. #endif
  957.     /* copy L to R when no PS is used */
  958. #if (defined(PS_DEC) || defined(DRM_PS))
  959.     if ((hDecoder->ps_used[hDecoder->fr_ch_ele] == 0) &&
  960.         (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2))
  961.     {
  962.         uint8_t ele = hDecoder->fr_ch_ele;
  963.         uint8_t ch = sce->channel;
  964.         uint16_t frame_size = (hDecoder->sbr_alloced[ele]) ? 2 : 1;
  965.         frame_size *= hDecoder->frameLength*sizeof(real_t);
  966.         memcpy(hDecoder->time_out[ch+1], hDecoder->time_out[ch], frame_size);
  967.     }
  968. #endif
  969.     return 0;
  970. }
  971. uint8_t reconstruct_channel_pair(NeAACDecHandle hDecoder, ic_stream *ics1, ic_stream *ics2,
  972.                                  element *cpe, int16_t *spec_data1, int16_t *spec_data2)
  973. {
  974.     uint8_t retval;
  975.     ALIGN real_t spec_coef1[1024];
  976.     ALIGN real_t spec_coef2[1024];
  977. #ifdef PROFILE
  978.     int64_t count = faad_get_ts();
  979. #endif
  980.     if (hDecoder->element_alloced[hDecoder->fr_ch_ele] == 0)
  981.     {
  982.         retval = allocate_channel_pair(hDecoder, cpe->channel, (uint8_t)cpe->paired_channel);
  983.         if (retval > 0)
  984.             return retval;
  985.         hDecoder->element_alloced[hDecoder->fr_ch_ele] = 1;
  986.     }
  987.     /* dequantisation and scaling */
  988.     retval = quant_to_spec(hDecoder, ics1, spec_data1, spec_coef1, hDecoder->frameLength);
  989.     if (retval > 0)
  990.         return retval;
  991.     retval = quant_to_spec(hDecoder, ics2, spec_data2, spec_coef2, hDecoder->frameLength);
  992.     if (retval > 0)
  993.         return retval;
  994. #ifdef PROFILE
  995.     count = faad_get_ts() - count;
  996.     hDecoder->requant_cycles += count;
  997. #endif
  998.     /* pns decoding */
  999.     if (ics1->ms_mask_present)
  1000.     {
  1001.         pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 1, hDecoder->object_type);
  1002.     } else {
  1003.         pns_decode(ics1, NULL, spec_coef1, NULL, hDecoder->frameLength, 0, hDecoder->object_type);
  1004.         pns_decode(ics2, NULL, spec_coef2, NULL, hDecoder->frameLength, 0, hDecoder->object_type);
  1005.     }
  1006.     /* mid/side decoding */
  1007.     ms_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength);
  1008. #if 0
  1009.     {
  1010.         int i;
  1011.         for (i = 0; i < 1024; i++)
  1012.         {
  1013.             //printf("%dn", spec_coef1[i]);
  1014.             printf("0x%.8Xn", spec_coef1[i]);
  1015.         }
  1016.         for (i = 0; i < 1024; i++)
  1017.         {
  1018.             //printf("%dn", spec_coef2[i]);
  1019.             printf("0x%.8Xn", spec_coef2[i]);
  1020.         }
  1021.     }
  1022. #endif
  1023.     /* intensity stereo decoding */
  1024.     is_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength);
  1025. #if 0
  1026.     {
  1027.         int i;
  1028.         for (i = 0; i < 1024; i++)
  1029.         {
  1030.             printf("%dn", spec_coef1[i]);
  1031.             //printf("0x%.8Xn", spec_coef1[i]);
  1032.         }
  1033.         for (i = 0; i < 1024; i++)
  1034.         {
  1035.             printf("%dn", spec_coef2[i]);
  1036.             //printf("0x%.8Xn", spec_coef2[i]);
  1037.         }
  1038.     }
  1039. #endif
  1040. #ifdef MAIN_DEC
  1041.     /* MAIN object type prediction */
  1042.     if (hDecoder->object_type == MAIN)
  1043.     {
  1044.         /* intra channel prediction */
  1045.         ic_prediction(ics1, spec_coef1, hDecoder->pred_stat[cpe->channel], hDecoder->frameLength,
  1046.             hDecoder->sf_index);
  1047.         ic_prediction(ics2, spec_coef2, hDecoder->pred_stat[cpe->paired_channel], hDecoder->frameLength,
  1048.             hDecoder->sf_index);
  1049.         /* In addition, for scalefactor bands coded by perceptual
  1050.            noise substitution the predictors belonging to the
  1051.            corresponding spectral coefficients are reset.
  1052.         */
  1053.         pns_reset_pred_state(ics1, hDecoder->pred_stat[cpe->channel]);
  1054.         pns_reset_pred_state(ics2, hDecoder->pred_stat[cpe->paired_channel]);
  1055.     }
  1056. #endif
  1057. #ifdef LTP_DEC
  1058.     if (is_ltp_ot(hDecoder->object_type))
  1059.     {
  1060.         ltp_info *ltp1 = &(ics1->ltp);
  1061.         ltp_info *ltp2 = (cpe->common_window) ? &(ics2->ltp2) : &(ics2->ltp);
  1062. #ifdef LD_DEC
  1063.         if (hDecoder->object_type == LD)
  1064.         {
  1065.             if (ltp1->data_present)
  1066.             {
  1067.                 if (ltp1->lag_update)
  1068.                     hDecoder->ltp_lag[cpe->channel] = ltp1->lag;
  1069.             }
  1070.             ltp1->lag = hDecoder->ltp_lag[cpe->channel];
  1071.             if (ltp2->data_present)
  1072.             {
  1073.                 if (ltp2->lag_update)
  1074.                     hDecoder->ltp_lag[cpe->paired_channel] = ltp2->lag;
  1075.             }
  1076.             ltp2->lag = hDecoder->ltp_lag[cpe->paired_channel];
  1077.         }
  1078. #endif
  1079.         /* long term prediction */
  1080.         lt_prediction(ics1, ltp1, spec_coef1, hDecoder->lt_pred_stat[cpe->channel], hDecoder->fb,
  1081.             ics1->window_shape, hDecoder->window_shape_prev[cpe->channel],
  1082.             hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength);
  1083.         lt_prediction(ics2, ltp2, spec_coef2, hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->fb,
  1084.             ics2->window_shape, hDecoder->window_shape_prev[cpe->paired_channel],
  1085.             hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength);
  1086.     }
  1087. #endif
  1088.     /* tns decoding */
  1089.     tns_decode_frame(ics1, &(ics1->tns), hDecoder->sf_index, hDecoder->object_type,
  1090.         spec_coef1, hDecoder->frameLength);
  1091.     tns_decode_frame(ics2, &(ics2->tns), hDecoder->sf_index, hDecoder->object_type,
  1092.         spec_coef2, hDecoder->frameLength);
  1093.     /* drc decoding */
  1094.     if (hDecoder->drc->present)
  1095.     {
  1096.         if (!hDecoder->drc->exclude_mask[cpe->channel] || !hDecoder->drc->excluded_chns_present)
  1097.             drc_decode(hDecoder->drc, spec_coef1);
  1098.         if (!hDecoder->drc->exclude_mask[cpe->paired_channel] || !hDecoder->drc->excluded_chns_present)
  1099.             drc_decode(hDecoder->drc, spec_coef2);
  1100.     }
  1101.     /* filter bank */
  1102. #ifdef SSR_DEC
  1103.     if (hDecoder->object_type != SSR)
  1104.     {
  1105. #endif
  1106.         ifilter_bank(hDecoder->fb, ics1->window_sequence, ics1->window_shape,
  1107.             hDecoder->window_shape_prev[cpe->channel], spec_coef1,
  1108.             hDecoder->time_out[cpe->channel], hDecoder->fb_intermed[cpe->channel],
  1109.             hDecoder->object_type, hDecoder->frameLength);
  1110.         ifilter_bank(hDecoder->fb, ics2->window_sequence, ics2->window_shape,
  1111.             hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2,
  1112.             hDecoder->time_out[cpe->paired_channel], hDecoder->fb_intermed[cpe->paired_channel],
  1113.             hDecoder->object_type, hDecoder->frameLength);
  1114. #ifdef SSR_DEC
  1115.     } else {
  1116.         ssr_decode(&(ics1->ssr), hDecoder->fb, ics1->window_sequence, ics1->window_shape,
  1117.             hDecoder->window_shape_prev[cpe->channel], spec_coef1, hDecoder->time_out[cpe->channel],
  1118.             hDecoder->ssr_overlap[cpe->channel], hDecoder->ipqf_buffer[cpe->channel],
  1119.             hDecoder->prev_fmd[cpe->channel], hDecoder->frameLength);
  1120.         ssr_decode(&(ics2->ssr), hDecoder->fb, ics2->window_sequence, ics2->window_shape,
  1121.             hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, hDecoder->time_out[cpe->paired_channel],
  1122.             hDecoder->ssr_overlap[cpe->paired_channel], hDecoder->ipqf_buffer[cpe->paired_channel],
  1123.             hDecoder->prev_fmd[cpe->paired_channel], hDecoder->frameLength);
  1124.     }
  1125. #endif
  1126.     /* save window shape for next frame */
  1127.     hDecoder->window_shape_prev[cpe->channel] = ics1->window_shape;
  1128.     hDecoder->window_shape_prev[cpe->paired_channel] = ics2->window_shape;
  1129. #ifdef LTP_DEC
  1130.     if (is_ltp_ot(hDecoder->object_type))
  1131.     {
  1132.         lt_update_state(hDecoder->lt_pred_stat[cpe->channel], hDecoder->time_out[cpe->channel],
  1133.             hDecoder->fb_intermed[cpe->channel], hDecoder->frameLength, hDecoder->object_type);
  1134.         lt_update_state(hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->time_out[cpe->paired_channel],
  1135.             hDecoder->fb_intermed[cpe->paired_channel], hDecoder->frameLength, hDecoder->object_type);
  1136.     }
  1137. #endif
  1138. #ifdef SBR_DEC
  1139.     if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1))
  1140.         && hDecoder->sbr_alloced[hDecoder->fr_ch_ele])
  1141.     {
  1142.         uint8_t ele = hDecoder->fr_ch_ele;
  1143.         uint8_t ch0 = cpe->channel;
  1144.         uint8_t ch1 = cpe->paired_channel;
  1145.         /* following case can happen when forceUpSampling == 1 */
  1146.         if (hDecoder->sbr[ele] == NULL)
  1147.         {
  1148.             hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength,
  1149.                 hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index),
  1150.                 hDecoder->downSampledSBR
  1151. #ifdef DRM
  1152.                 , 0
  1153. #endif
  1154.                 );
  1155.         }
  1156.         if (cpe->ics1.window_sequence == EIGHT_SHORT_SEQUENCE)
  1157.             hDecoder->sbr[ele]->maxAACLine = 8*cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)];
  1158.         else
  1159.             hDecoder->sbr[ele]->maxAACLine = cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)];
  1160.         retval = sbrDecodeCoupleFrame(hDecoder->sbr[ele],
  1161.             hDecoder->time_out[ch0], hDecoder->time_out[ch1],
  1162.             hDecoder->postSeekResetFlag, hDecoder->downSampledSBR);
  1163.         if (retval > 0)
  1164.             return retval;
  1165.     } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1))
  1166.         && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele])
  1167.     {
  1168.         return 23;
  1169.     }
  1170. #endif
  1171.     return 0;
  1172. }