drm_dec.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:48k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*
  2. ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR and PS decoding
  3. ** Copyright (C) 2003-2004 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. ** Commercial non-GPL licensing of this software is possible.
  23. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
  24. **
  25. ** $Id: drm_dec.c,v 1.5 2004/09/04 14:56:28 menno Exp $
  26. **/
  27. #include <stdlib.h>
  28. #include <stdio.h>
  29. #include <string.h>
  30. #include <math.h>
  31. #include "common.h"
  32. #ifdef DRM
  33. #include "sbr_dec.h"
  34. #include "drm_dec.h"
  35. #include "bits.h"
  36. /* constants */
  37. #define DECAY_CUTOFF         3
  38. #define DECAY_SLOPE          0.05f
  39. /* type definitaions */
  40. typedef const int8_t (*drm_ps_huff_tab)[2];
  41. /* binary search huffman tables */
  42. static const int8_t f_huffman_sa[][2] = 
  43. {
  44.     { /*0*/ -15, 1 },             /* index 0: 1 bits:  x */
  45.     { 2, 3 },                     /* index 1: 2 bits:  1x */
  46.     { /*7*/ -8, 4 },              /* index 2: 3 bits:  10x */
  47.     { 5, 6 },                     /* index 3: 3 bits:  11x */
  48.     { /*1*/ -14, /*-1*/ -16 },    /* index 4: 4 bits:  101x */
  49.     { /*-2*/ -17, 7 },            /* index 5: 4 bits:  110x */
  50.     { 8, 9 },                     /* index 6: 4 bits:  111x */
  51.     { /*2*/ -13, /*-3*/ -18 },    /* index 7: 5 bits:  1101x */
  52.     { /*3*/ -12, 10 },            /* index 8: 5 bits:  1110x */
  53.     { 11, 12 },                   /* index 9: 5 bits:  1111x */
  54.     { /*4*/ -11, /*5*/ -10 },     /* index 10: 6 bits: 11101x */
  55.     { /*-4*/ -19, /*-5*/ -20 },   /* index 11: 6 bits: 11110x */
  56.     { /*6*/ -9, 13 },             /* index 12: 6 bits: 11111x */
  57.     { /*-7*/ -22, /*-6*/ -21 }    /* index 13: 7 bits: 111111x */
  58. };
  59. static const int8_t t_huffman_sa[][2] = 
  60. {
  61.     { /*0*/ -15, 1 },             /* index 0: 1 bits: x */
  62.     { 2, 3 },                     /* index 1: 2 bits: 1x */
  63.     { /*-1*/ -16, /*1*/ -14 },    /* index 2: 3 bits: 10x */
  64.     { 4, 5 },                     /* index 3: 3 bits: 11x */
  65.     { /*-2*/ -17, /*2*/ -13 },    /* index 4: 4 bits: 110x */
  66.     { 6, 7 },                     /* index 5: 4 bits: 111x */
  67.     { /*-3*/ -18, /*3*/ -12 },    /* index 6: 5 bits: 1110x */
  68.     { 8, 9 },                     /* index 7: 5 bits: 1111x */
  69.     { /*-4*/ -19, /*4*/ -11 },    /* index 8: 6 bits: 11110x */
  70.     { 10, 11 },                   /* index 9: 6 bits: 11111x */
  71.     { /*-5*/ -20, /*5*/ -10 },    /* index 10: 7 bits: 111110x */
  72.     { /*-6*/ -21, 12 },           /* index 11: 7 bits: 111111x */
  73.     { /*-7*/ -22, 13 },           /* index 12: 8 bits: 1111111x */
  74.     { /*6*/ -9, /*7*/ -8 }        /* index 13: 9 bits: 11111111x */
  75. };
  76. static const int8_t f_huffman_pan[][2] = 
  77. {
  78.     { /*0*/ -15, 1 },             /* index 0: 1 bits: x */
  79.     { /*-1*/ -16, 2 },            /* index 1: 2 bits: 1x */
  80.     { /*1*/ -14, 3 },             /* index 2: 3 bits: 11x */
  81.     { 4, 5 },                     /* index 3: 4 bits: 111x */
  82.     { /*-2*/ -17, /*2*/ -13 },    /* index 4: 5 bits: 1110x */
  83.     { 6, 7 },                     /* index 5: 5 bits: 1111x */
  84.     { /*-3*/ -18, /*3*/ -12 },    /* index 6: 6 bits: 11110x */
  85.     { 8, 9 },                     /* index 7: 6 bits: 11111x */
  86.     { /*-4*/ -19, /*4*/ -11 },    /* index 8: 7 bits: 111110x */
  87.     { 10, 11 },                   /* index 9: 7 bits: 111111x */
  88.     { /*-5*/ -20, /*5*/ -10 },    /* index 10: 8 bits: 1111110x */
  89.     { 12, 13 },                   /* index 11: 8 bits: 1111111x */
  90.     { /*-6*/ -21, /*6*/ -9 },     /* index 12: 9 bits: 11111110x */
  91.     { /*-7*/ -22, 14 },           /* index 13: 9 bits: 11111111x */
  92.     { /*7*/ -8, 15 },             /* index 14: 10 bits: 111111111x */
  93.     { 16, 17 },                   /* index 15: 11 bits: 1111111111x */
  94.     { /*-8*/ -23, /*8*/ -7 },     /* index 16: 12 bits: 11111111110x */
  95.     { 18, 19 },                   /* index 17: 12 bits: 11111111111x */
  96.     { /*-10*/ -25, 20 },          /* index 18: 13 bits: 111111111110x */
  97.     { 21, 22 },                   /* index 19: 13 bits: 111111111111x */
  98.     { /*-9*/ -24, /*9*/ -6 },     /* index 20: 14 bits: 1111111111101x */
  99.     { /*10*/ -5, 23 },            /* index 21: 14 bits: 1111111111110x */
  100.     { 24, 25 },                   /* index 22: 14 bits: 1111111111111x */
  101.     { /*-13*/ -28, /*-11*/ -26 }, /* index 23: 15 bits: 11111111111101x */
  102.     { /*11*/ -4, /*13*/ -2 },     /* index 24: 15 bits: 11111111111110x */
  103.     { 26, 27 },                   /* index 25: 15 bits: 11111111111111x */
  104.     { /*-14*/ -29, /*-12*/ -27 }, /* index 26: 16 bits: 111111111111110x */
  105.     { /*12*/ -3, /*14*/ -1 }      /* index 27: 16 bits: 111111111111111x */
  106. };
  107. static const int8_t t_huffman_pan[][2] = 
  108. {
  109.     { /*0*/ -15, 1 },             /* index 0: 1 bits: x */
  110.     { /*-1*/ -16, 2 },            /* index 1: 2 bits: 1x */
  111.     { /*1*/ -14, 3 },             /* index 2: 3 bits: 11x */
  112.     { /*-2*/ -17, 4 },            /* index 3: 4 bits: 111x */
  113.     { /*2*/ -13, 5 },             /* index 4: 5 bits: 1111x */
  114.     { /*-3*/ -18, 6 },            /* index 5: 6 bits: 11111x */
  115.     { /*3*/ -12, 7 },             /* index 6: 7 bits: 111111x */
  116.     { /*-4*/ -19, 8 },            /* index 7: 8 bits: 1111111x */
  117.     { /*4*/ -11, 9 },             /* index 8: 9 bits: 11111111x */
  118.     { 10, 11 },                   /* index 9: 10 bits: 111111111x */
  119.     { /*-5*/ -20, /*5*/ -10 },    /* index 10: 11 bits: 1111111110x */
  120.     { 12, 13 },                   /* index 11: 11 bits: 1111111111x */
  121.     { /*-6*/ -21, /*6*/ -9 },     /* index 12: 12 bits: 11111111110x */
  122.     { 14, 15 },                   /* index 13: 12 bits: 11111111111x */
  123.     { /*-7*/ -22, /*7*/ -8 },     /* index 14: 13 bits: 111111111110x */
  124.     { 16, 17 },                   /* index 15: 13 bits: 111111111111x */
  125.     { /*-8*/ -23, /*8*/ -7 },     /* index 16: 14 bits: 1111111111110x */
  126.     { 18, 19 },                   /* index 17: 14 bits: 1111111111111x */
  127.     { /*-10*/ -25, /*10*/ -5 },   /* index 18: 15 bits: 11111111111110x */
  128.     { 20, 21 },                   /* index 19: 15 bits: 11111111111111x */
  129.     { /*-9*/ -24, /*9*/ -6 },     /* index 20: 16 bits: 111111111111110x */
  130.     { 22, 23 },                   /* index 21: 16 bits: 111111111111111x */
  131.     { 24, 25 },                   /* index 22: 17 bits: 1111111111111110x */
  132.     { 26, 27 },                   /* index 23: 17 bits: 1111111111111111x */
  133.     { /*-14*/ -29, /*-13*/ -28 }, /* index 24: 18 bits: 11111111111111100x */
  134.     { /*-12*/ -27, /*-11*/ -26 }, /* index 25: 18 bits: 11111111111111101x */
  135.     { /*11*/ -4, /*12*/ -3 },     /* index 26: 18 bits: 11111111111111110x */
  136.     { /*13*/ -2, /*14*/ -1 }      /* index 27: 18 bits: 11111111111111111x */
  137. };
  138. /* There are 3 classes in the standard but the last 2 are identical */
  139. static const real_t sa_quant[8][2] = 
  140. {
  141.     { FRAC_CONST(0.0000), FRAC_CONST(0.0000) },
  142.     { FRAC_CONST(0.0501), FRAC_CONST(0.1778) },
  143.     { FRAC_CONST(0.0706), FRAC_CONST(0.2818) },
  144.     { FRAC_CONST(0.0995), FRAC_CONST(0.4467) },
  145.     { FRAC_CONST(0.1399), FRAC_CONST(0.5623) },
  146.     { FRAC_CONST(0.1957), FRAC_CONST(0.7079) },
  147.     { FRAC_CONST(0.2713), FRAC_CONST(0.8913) },
  148.     { FRAC_CONST(0.3699), FRAC_CONST(1.0000) },
  149. };
  150. /* We don't need the actual quantizer values */
  151. #if 0
  152. static const real_t pan_quant[8][5] = 
  153. {
  154.     { COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000) },
  155.     { COEF_CONST(0.1661), COEF_CONST(0.1661), COEF_CONST(0.3322), COEF_CONST(0.3322), COEF_CONST(0.3322) },
  156.     { COEF_CONST(0.3322), COEF_CONST(0.3322), COEF_CONST(0.6644), COEF_CONST(0.8305), COEF_CONST(0.8305) },
  157.     { COEF_CONST(0.4983), COEF_CONST(0.6644), COEF_CONST(0.9966), COEF_CONST(1.4949), COEF_CONST(1.6610) },
  158.     { COEF_CONST(0.6644), COEF_CONST(0.9966), COEF_CONST(1.4949), COEF_CONST(2.1593), COEF_CONST(2.4914) },
  159.     { COEF_CONST(0.8305), COEF_CONST(1.3288), COEF_CONST(2.1593), COEF_CONST(2.9897), COEF_CONST(3.4880) },
  160.     { COEF_CONST(0.9966), COEF_CONST(1.8271), COEF_CONST(2.8236), COEF_CONST(3.8202), COEF_CONST(4.6507) },
  161.     { COEF_CONST(1.3288), COEF_CONST(2.3253), COEF_CONST(3.4880), COEF_CONST(4.6507), COEF_CONST(5.8134) },
  162. };
  163. #endif
  164. /* 2^(pan_quant[x][y] */
  165. static const real_t pan_pow_2_pos[8][5] = {
  166.     { REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000)  },
  167.     { REAL_CONST(1.1220021), REAL_CONST(1.1220021), REAL_CONST(1.2589312), REAL_CONST(1.2589312), REAL_CONST(1.2589312)  },
  168.     { REAL_CONST(1.2589312), REAL_CONST(1.2589312), REAL_CONST(1.5849090), REAL_CONST(1.7783016), REAL_CONST(1.7783016)  },
  169.     { REAL_CONST(1.4125481), REAL_CONST(1.5849090), REAL_CONST(1.9952921), REAL_CONST(2.8184461), REAL_CONST(3.1623565)  },
  170.     { REAL_CONST(1.5849090), REAL_CONST(1.9952922), REAL_CONST(2.8184461), REAL_CONST(4.4669806), REAL_CONST(5.6232337)  },
  171.     { REAL_CONST(1.7783016), REAL_CONST(2.5119365), REAL_CONST(4.4669806), REAL_CONST(7.9430881), REAL_CONST(11.219994)  },
  172.     { REAL_CONST(1.9952921), REAL_CONST(3.5482312), REAL_CONST(7.0792671), REAL_CONST(14.125206), REAL_CONST(25.118876)  },
  173.     { REAL_CONST(2.5119365), REAL_CONST(5.0116998), REAL_CONST(11.219994), REAL_CONST(25.118876), REAL_CONST(56.235140)  }
  174. };
  175. /* 2^(-pan_quant[x][y] */
  176. static const real_t pan_pow_2_neg[8][5] = {
  177.     { REAL_CONST(1),         REAL_CONST(1),         REAL_CONST(1),         REAL_CONST(1),         REAL_CONST(1)          },
  178.     { REAL_CONST(0.8912487), REAL_CONST(0.8912487), REAL_CONST(0.7943242), REAL_CONST(0.7943242), REAL_CONST(0.7943242)  },
  179.     { REAL_CONST(0.7943242), REAL_CONST(0.7943242), REAL_CONST(0.6309511), REAL_CONST(0.5623344), REAL_CONST(0.5623344)  },
  180.     { REAL_CONST(0.7079405), REAL_CONST(0.6309511), REAL_CONST(0.5011797), REAL_CONST(0.3548054), REAL_CONST(0.3162199)  },
  181.     { REAL_CONST(0.6309511), REAL_CONST(0.5011797), REAL_CONST(0.3548054), REAL_CONST(0.2238649), REAL_CONST(0.1778336)  },
  182.     { REAL_CONST(0.5623343), REAL_CONST(0.3980992), REAL_CONST(0.2238649), REAL_CONST(0.1258956), REAL_CONST(0.0891266)  },
  183.     { REAL_CONST(0.5011797), REAL_CONST(0.2818306), REAL_CONST(0.1412576), REAL_CONST(0.0707954), REAL_CONST(0.0398107)  },
  184.     { REAL_CONST(0.3980992), REAL_CONST(0.1995331), REAL_CONST(0.0891267), REAL_CONST(0.0398107), REAL_CONST(0.0177825)  }
  185. };
  186. /* 2^(pan_quant[x][y]/30) */
  187. static const real_t pan_pow_2_30_pos[8][5] = {
  188.     { COEF_CONST(1),           COEF_CONST(1),           COEF_CONST(1),           COEF_CONST(1),           COEF_CONST(1)           }, 
  189.     { COEF_CONST(1.003845098), COEF_CONST(1.003845098), COEF_CONST(1.007704982), COEF_CONST(1.007704982), COEF_CONST(1.007704982) }, 
  190.     { COEF_CONST(1.007704982), COEF_CONST(1.007704982), COEF_CONST(1.01546933),  COEF_CONST(1.019373909), COEF_CONST(1.019373909) }, 
  191.     { COEF_CONST(1.011579706), COEF_CONST(1.01546933),  COEF_CONST(1.023293502), COEF_CONST(1.035142941), COEF_CONST(1.039123167) }, 
  192.     { COEF_CONST(1.01546933),  COEF_CONST(1.023293502), COEF_CONST(1.035142941), COEF_CONST(1.051155908), COEF_CONST(1.059252598) },
  193.     { COEF_CONST(1.019373909), COEF_CONST(1.03117796),  COEF_CONST(1.051155908), COEF_CONST(1.071518432), COEF_CONST(1.0839263)   }, 
  194.     { COEF_CONST(1.023293502), COEF_CONST(1.043118698), COEF_CONST(1.067414119), COEF_CONST(1.092277933), COEF_CONST(1.113439626) }, 
  195.     { COEF_CONST(1.03117796),  COEF_CONST(1.055195268), COEF_CONST(1.0839263),   COEF_CONST(1.113439626), COEF_CONST(1.143756546) }
  196. };
  197. /* 2^(-pan_quant[x][y]/30) */
  198. static const real_t pan_pow_2_30_neg[8][5] = {
  199.     { COEF_CONST(1),           COEF_CONST(1),           COEF_CONST(1),           COEF_CONST(1),           COEF_CONST(1)           },
  200.     { COEF_CONST(0.99616963),  COEF_CONST(0.99616963),  COEF_CONST(0.992353931), COEF_CONST(0.992353931), COEF_CONST(0.99235393)  }, 
  201.     { COEF_CONST(0.992353931), COEF_CONST(0.992353931), COEF_CONST(0.984766325), COEF_CONST(0.980994305), COEF_CONST(0.980994305) }, 
  202.     { COEF_CONST(0.988552848), COEF_CONST(0.984766325), COEF_CONST(0.977236734), COEF_CONST(0.966050157), COEF_CONST(0.962349827) }, 
  203.     { COEF_CONST(0.984766325), COEF_CONST(0.977236734), COEF_CONST(0.966050157), COEF_CONST(0.951333663), COEF_CONST(0.944061881) }, 
  204.     { COEF_CONST(0.980994305), COEF_CONST(0.969764715), COEF_CONST(0.951333663), COEF_CONST(0.933255062), COEF_CONST(0.922571949) }, 
  205.     { COEF_CONST(0.977236734), COEF_CONST(0.958663671), COEF_CONST(0.936843519), COEF_CONST(0.915517901), COEF_CONST(0.898117847) }, 
  206.     { COEF_CONST(0.969764715), COEF_CONST(0.947691892), COEF_CONST(0.922571949), COEF_CONST(0.898117847), COEF_CONST(0.874311936) }
  207. };
  208. static const real_t g_decayslope[MAX_SA_BAND] = {
  209.     FRAC_CONST(1),   FRAC_CONST(1),   FRAC_CONST(1),   FRAC_CONST(0.95),FRAC_CONST(0.9), FRAC_CONST(0.85), FRAC_CONST(0.8), 
  210.     FRAC_CONST(0.75),FRAC_CONST(0.7), FRAC_CONST(0.65),FRAC_CONST(0.6), FRAC_CONST(0.55),FRAC_CONST(0.5),  FRAC_CONST(0.45), 
  211.     FRAC_CONST(0.4), FRAC_CONST(0.35),FRAC_CONST(0.3), FRAC_CONST(0.25),FRAC_CONST(0.2), FRAC_CONST(0.15), FRAC_CONST(0.1),
  212.     FRAC_CONST(0.05),FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),    FRAC_CONST(0), 
  213.     FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),    FRAC_CONST(0),  
  214.     FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),    FRAC_CONST(0),   
  215.     FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0)
  216. };
  217. static const real_t sa_sqrt_1_minus[8][2] = {
  218.     { FRAC_CONST(1),            FRAC_CONST(1)           },
  219.     { FRAC_CONST(0.998744206),  FRAC_CONST(0.984066644) },
  220.     { FRAC_CONST(0.997504707),  FRAC_CONST(0.959473168) },
  221.     { FRAC_CONST(0.995037562),  FRAC_CONST(0.894683804) },
  222.     { FRAC_CONST(0.990165638),  FRAC_CONST(0.826933317) },
  223.     { FRAC_CONST(0.980663811),  FRAC_CONST(0.706312672) },
  224.     { FRAC_CONST(0.962494836),  FRAC_CONST(0.45341406)  },
  225.     { FRAC_CONST(0.929071574),  FRAC_CONST(0)           }
  226. };
  227. static const uint8_t sa_freq_scale[9][2] = 
  228. {
  229.     { 0, 0},  
  230.     { 1, 1},  
  231.     { 2, 2},  
  232.     { 3, 3},  
  233.     { 5, 5},  
  234.     { 7, 7},  
  235.     {10,10},  
  236.     {13,13},  
  237.     {46,23}
  238. };
  239. static const uint8_t pan_freq_scale[21] = 
  240. {
  241.     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
  242.     11, 12, 13, 14, 15, 18, 22, 26, 32, 64
  243. };
  244. static const uint8_t pan_quant_class[20] = 
  245. {
  246.     0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  247.     2, 2, 2, 2, 3, 3, 3, 4, 4, 4
  248. };
  249. /* Inverse mapping lookup */
  250. static const uint8_t pan_inv_freq[64] = {
  251.      0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 
  252.     15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 
  253.     19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
  254.     19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19
  255. };
  256. static const uint8_t sa_inv_freq[MAX_SA_BAND] = {
  257.     0, 1, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6,
  258.     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
  259.     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
  260.     7, 7, 7, 7, 7, 7, 7
  261. };
  262. static const real_t filter_coeff[] = 
  263. {
  264.     FRAC_CONST(0.65143905754106),
  265.     FRAC_CONST(0.56471812200776),
  266.     FRAC_CONST(0.48954165955695)
  267. };
  268. static const uint8_t delay_length[][2] = 
  269. {
  270.     { 1, 3 }, { 2, 4 }, { 3, 5 }
  271. };
  272. static const real_t delay_fraction[] = 
  273. {
  274.     FRAC_CONST(0.43), FRAC_CONST(0.75), FRAC_CONST(0.347)
  275. };
  276. static const real_t peak_decay[2] = 
  277. {
  278.     FRAC_CONST(0.58664621951003), FRAC_CONST(0.76592833836465)
  279. };
  280. static const real_t smooth_coeff[2] = 
  281. {
  282.     FRAC_CONST(0.6), FRAC_CONST(0.25)
  283. };
  284. /* Please note that these are the same tables as in plain PS */
  285. static const complex_t Q_Fract_allpass_Qmf[][3] = {
  286.     { { FRAC_CONST(0.7804303765), FRAC_CONST(0.6252426505) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.8550928831), FRAC_CONST(0.5184748173) } },
  287.     { { FRAC_CONST(-0.4399392009), FRAC_CONST(0.8980275393) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.0643581524), FRAC_CONST(0.9979268909) } },
  288.     { { FRAC_CONST(-0.9723699093), FRAC_CONST(-0.2334454209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.9146071672), FRAC_CONST(0.4043435752) } },
  289.     { { FRAC_CONST(0.0157073960), FRAC_CONST(-0.9998766184) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7814115286), FRAC_CONST(-0.6240159869) } },
  290.     { { FRAC_CONST(0.9792228341), FRAC_CONST(-0.2027871907) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.1920081824), FRAC_CONST(-0.9813933372) } },
  291.     { { FRAC_CONST(0.4115142524), FRAC_CONST(0.9114032984) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9589683414), FRAC_CONST(-0.2835132182) } },
  292.     { { FRAC_CONST(-0.7996847630), FRAC_CONST(0.6004201174) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.6947838664), FRAC_CONST(0.7192186117) } },
  293.     { { FRAC_CONST(-0.7604058385), FRAC_CONST(-0.6494481564) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3164770305), FRAC_CONST(0.9486001730) } },
  294.     { { FRAC_CONST(0.4679299891), FRAC_CONST(-0.8837655187) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9874414206), FRAC_CONST(0.1579856575) } },
  295.     { { FRAC_CONST(0.9645573497), FRAC_CONST(0.2638732493) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.5966450572), FRAC_CONST(-0.8025052547) } },
  296.     { { FRAC_CONST(-0.0471066870), FRAC_CONST(0.9988898635) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.4357025325), FRAC_CONST(-0.9000906944) } },
  297.     { { FRAC_CONST(-0.9851093888), FRAC_CONST(0.1719288528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9995546937), FRAC_CONST(-0.0298405960) } },
  298.     { { FRAC_CONST(-0.3826831877), FRAC_CONST(-0.9238796234) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.4886211455), FRAC_CONST(0.8724960685) } },
  299.     { { FRAC_CONST(0.8181498647), FRAC_CONST(-0.5750049949) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.5477093458), FRAC_CONST(0.8366686702) } },
  300.     { { FRAC_CONST(0.7396308780), FRAC_CONST(0.6730127335) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9951074123), FRAC_CONST(-0.0987988561) } },
  301.     { { FRAC_CONST(-0.4954589605), FRAC_CONST(0.8686313629) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3725017905), FRAC_CONST(-0.9280315042) } },
  302.     { { FRAC_CONST(-0.9557929039), FRAC_CONST(-0.2940406799) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.6506417990), FRAC_CONST(-0.7593847513) } },
  303.     { { FRAC_CONST(0.0784594864), FRAC_CONST(-0.9969173074) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9741733670), FRAC_CONST(0.2258014232) } },
  304.     { { FRAC_CONST(0.9900237322), FRAC_CONST(-0.1409008205) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.2502108514), FRAC_CONST(0.9681913853) } },
  305.     { { FRAC_CONST(0.3534744382), FRAC_CONST(0.9354441762) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7427945137), FRAC_CONST(0.6695194840) } },
  306.     { { FRAC_CONST(-0.8358076215), FRAC_CONST(0.5490224361) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9370992780), FRAC_CONST(-0.3490629196) } },
  307.     { { FRAC_CONST(-0.7181259394), FRAC_CONST(-0.6959131360) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.1237744763), FRAC_CONST(-0.9923103452) } },
  308.     { { FRAC_CONST(0.5224990249), FRAC_CONST(-0.8526399136) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.8226406574), FRAC_CONST(-0.5685616732) } },
  309.     { { FRAC_CONST(0.9460852146), FRAC_CONST(0.3239179254) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.8844994903), FRAC_CONST(0.4665412009) } },
  310.     { { FRAC_CONST(-0.1097348556), FRAC_CONST(0.9939609170) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.0047125919), FRAC_CONST(0.9999889135) } },
  311.     { { FRAC_CONST(-0.9939610362), FRAC_CONST(0.1097337380) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8888573647), FRAC_CONST(0.4581840038) } },
  312.     { { FRAC_CONST(-0.3239168525), FRAC_CONST(-0.9460855722) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8172453642), FRAC_CONST(-0.5762898922) } },
  313.     { { FRAC_CONST(0.8526405096), FRAC_CONST(-0.5224980116) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.1331215799), FRAC_CONST(-0.9910997152) } },
  314.     { { FRAC_CONST(0.6959123611), FRAC_CONST(0.7181267142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9403476119), FRAC_CONST(-0.3402152061) } },
  315.     { { FRAC_CONST(-0.5490233898), FRAC_CONST(0.8358070254) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7364512086), FRAC_CONST(0.6764906645) } },
  316.     { { FRAC_CONST(-0.9354437590), FRAC_CONST(-0.3534754813) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2593250275), FRAC_CONST(0.9657900929) } },
  317.     { { FRAC_CONST(0.1409019381), FRAC_CONST(-0.9900235534) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9762582779), FRAC_CONST(0.2166097313) } },
  318.     { { FRAC_CONST(0.9969173670), FRAC_CONST(-0.0784583688) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.6434556246), FRAC_CONST(-0.7654833794) } },
  319.     { { FRAC_CONST(0.2940396070), FRAC_CONST(0.9557932615) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3812320232), FRAC_CONST(-0.9244794250) } },
  320.     { { FRAC_CONST(-0.8686318994), FRAC_CONST(0.4954580069) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9959943891), FRAC_CONST(-0.0894154981) } },
  321.     { { FRAC_CONST(-0.6730118990), FRAC_CONST(-0.7396316528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.5397993922), FRAC_CONST(0.8417937160) } },
  322.     { { FRAC_CONST(0.5750059485), FRAC_CONST(-0.8181492686) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.4968227744), FRAC_CONST(0.8678520322) } },
  323.     { { FRAC_CONST(0.9238792062), FRAC_CONST(0.3826842010) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9992290139), FRAC_CONST(-0.0392601527) } },
  324.     { { FRAC_CONST(-0.1719299555), FRAC_CONST(0.9851091504) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4271997511), FRAC_CONST(-0.9041572809) } },
  325.     { { FRAC_CONST(-0.9988899231), FRAC_CONST(0.0471055657) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.6041822433), FRAC_CONST(-0.7968461514) } },
  326.     { { FRAC_CONST(-0.2638721764), FRAC_CONST(-0.9645576477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9859085083), FRAC_CONST(0.1672853529) } },
  327.     { { FRAC_CONST(0.8837660551), FRAC_CONST(-0.4679289758) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3075223565), FRAC_CONST(0.9515408874) } },
  328.     { { FRAC_CONST(0.6494473219), FRAC_CONST(0.7604066133) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.7015317082), FRAC_CONST(0.7126382589) } },
  329.     { { FRAC_CONST(-0.6004210114), FRAC_CONST(0.7996840477) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9562535882), FRAC_CONST(-0.2925389707) } },
  330.     { { FRAC_CONST(-0.9114028811), FRAC_CONST(-0.4115152657) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.1827499419), FRAC_CONST(-0.9831594229) } },
  331.     { { FRAC_CONST(0.2027882934), FRAC_CONST(-0.9792225957) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7872582674), FRAC_CONST(-0.6166234016) } },
  332.     { { FRAC_CONST(0.9998766780), FRAC_CONST(-0.0157062728) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9107555747), FRAC_CONST(0.4129458666) } },
  333.     { { FRAC_CONST(0.2334443331), FRAC_CONST(0.9723701477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.0549497530), FRAC_CONST(0.9984891415) } },
  334.     { { FRAC_CONST(-0.8980280757), FRAC_CONST(0.4399381876) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.8599416018), FRAC_CONST(0.5103924870) } },
  335.     { { FRAC_CONST(-0.6252418160), FRAC_CONST(-0.7804310918) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8501682281), FRAC_CONST(-0.5265110731) } },
  336.     { { FRAC_CONST(0.6252435446), FRAC_CONST(-0.7804297209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.0737608299), FRAC_CONST(-0.9972759485) } },
  337.     { { FRAC_CONST(0.8980270624), FRAC_CONST(0.4399402142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9183775187), FRAC_CONST(-0.3957053721) } },
  338.     { { FRAC_CONST(-0.2334465086), FRAC_CONST(0.9723696709) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.7754954696), FRAC_CONST(0.6313531399) } },
  339.     { { FRAC_CONST(-0.9998766184), FRAC_CONST(-0.0157085191) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2012493610), FRAC_CONST(0.9795400500) } },
  340.     { { FRAC_CONST(-0.2027861029), FRAC_CONST(-0.9792230725) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9615978599), FRAC_CONST(0.2744622827) } },
  341.     { { FRAC_CONST(0.9114037752), FRAC_CONST(-0.4115132093) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.6879743338), FRAC_CONST(-0.7257350087) } },
  342.     { { FRAC_CONST(0.6004192233), FRAC_CONST(0.7996854186) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.3254036009), FRAC_CONST(-0.9455752373) } },
  343.     { { FRAC_CONST(-0.6494490504), FRAC_CONST(0.7604051232) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9888865948), FRAC_CONST(-0.1486719251) } },
  344.     { { FRAC_CONST(-0.8837650418), FRAC_CONST(-0.4679309726) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.5890548825), FRAC_CONST(0.8080930114) } },
  345.     { { FRAC_CONST(0.2638743520), FRAC_CONST(-0.9645570517) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.4441666007), FRAC_CONST(0.8959442377) } },
  346.     { { FRAC_CONST(0.9988898039), FRAC_CONST(0.0471078083) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9997915030), FRAC_CONST(0.0204183888) } },
  347.     { { FRAC_CONST(0.1719277352), FRAC_CONST(0.9851095676) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4803760946), FRAC_CONST(-0.8770626187) } },
  348.     { { FRAC_CONST(-0.9238800406), FRAC_CONST(0.3826821446) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.5555707216), FRAC_CONST(-0.8314692974) } },
  349.     { { FRAC_CONST(-0.5750041008), FRAC_CONST(-0.8181505203) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9941320419), FRAC_CONST(0.1081734300) } }
  350. };
  351. static const complex_t Phi_Fract_Qmf[] = {
  352.     { FRAC_CONST(0.8181497455), FRAC_CONST(0.5750052333) },
  353.     { FRAC_CONST(-0.2638730407), FRAC_CONST(0.9645574093) },
  354.     { FRAC_CONST(-0.9969173074), FRAC_CONST(0.0784590989) },
  355.     { FRAC_CONST(-0.4115143716), FRAC_CONST(-0.9114032984) },
  356.     { FRAC_CONST(0.7181262970), FRAC_CONST(-0.6959127784) },
  357.     { FRAC_CONST(0.8980275989), FRAC_CONST(0.4399391711) },
  358.     { FRAC_CONST(-0.1097343117), FRAC_CONST(0.9939609766) },
  359.     { FRAC_CONST(-0.9723699093), FRAC_CONST(0.2334453613) },
  360.     { FRAC_CONST(-0.5490227938), FRAC_CONST(-0.8358073831) },
  361.     { FRAC_CONST(0.6004202366), FRAC_CONST(-0.7996846437) },
  362.     { FRAC_CONST(0.9557930231), FRAC_CONST(0.2940403223) },
  363.     { FRAC_CONST(0.0471064523), FRAC_CONST(0.9988898635) },
  364.     { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) },
  365.     { FRAC_CONST(-0.6730124950), FRAC_CONST(-0.7396311164) },
  366.     { FRAC_CONST(0.4679298103), FRAC_CONST(-0.8837656379) },
  367.     { FRAC_CONST(0.9900236726), FRAC_CONST(0.1409012377) },
  368.     { FRAC_CONST(0.2027872950), FRAC_CONST(0.9792228341) },
  369.     { FRAC_CONST(-0.8526401520), FRAC_CONST(0.5224985480) },
  370.     { FRAC_CONST(-0.7804304361), FRAC_CONST(-0.6252426505) },
  371.     { FRAC_CONST(0.3239174187), FRAC_CONST(-0.9460853338) },
  372.     { FRAC_CONST(0.9998766184), FRAC_CONST(-0.0157073177) },
  373.     { FRAC_CONST(0.3534748554), FRAC_CONST(0.9354440570) },
  374.     { FRAC_CONST(-0.7604059577), FRAC_CONST(0.6494480371) },
  375.     { FRAC_CONST(-0.8686315417), FRAC_CONST(-0.4954586625) },
  376.     { FRAC_CONST(0.1719291061), FRAC_CONST(-0.9851093292) },
  377.     { FRAC_CONST(0.9851093292), FRAC_CONST(-0.1719291061) },
  378.     { FRAC_CONST(0.4954586625), FRAC_CONST(0.8686315417) },
  379.     { FRAC_CONST(-0.6494480371), FRAC_CONST(0.7604059577) },
  380.     { FRAC_CONST(-0.9354440570), FRAC_CONST(-0.3534748554) },
  381.     { FRAC_CONST(0.0157073177), FRAC_CONST(-0.9998766184) },
  382.     { FRAC_CONST(0.9460853338), FRAC_CONST(-0.3239174187) },
  383.     { FRAC_CONST(0.6252426505), FRAC_CONST(0.7804304361) },
  384.     { FRAC_CONST(-0.5224985480), FRAC_CONST(0.8526401520) },
  385.     { FRAC_CONST(-0.9792228341), FRAC_CONST(-0.2027872950) },
  386.     { FRAC_CONST(-0.1409012377), FRAC_CONST(-0.9900236726) },
  387.     { FRAC_CONST(0.8837656379), FRAC_CONST(-0.4679298103) },
  388.     { FRAC_CONST(0.7396311164), FRAC_CONST(0.6730124950) },
  389.     { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) },
  390.     { FRAC_CONST(-0.9988898635), FRAC_CONST(-0.0471064523) },
  391.     { FRAC_CONST(-0.2940403223), FRAC_CONST(-0.9557930231) },
  392.     { FRAC_CONST(0.7996846437), FRAC_CONST(-0.6004202366) },
  393.     { FRAC_CONST(0.8358073831), FRAC_CONST(0.5490227938) },
  394.     { FRAC_CONST(-0.2334453613), FRAC_CONST(0.9723699093) },
  395.     { FRAC_CONST(-0.9939609766), FRAC_CONST(0.1097343117) },
  396.     { FRAC_CONST(-0.4399391711), FRAC_CONST(-0.8980275989) },
  397.     { FRAC_CONST(0.6959127784), FRAC_CONST(-0.7181262970) },
  398.     { FRAC_CONST(0.9114032984), FRAC_CONST(0.4115143716) },
  399.     { FRAC_CONST(-0.0784590989), FRAC_CONST(0.9969173074) },
  400.     { FRAC_CONST(-0.9645574093), FRAC_CONST(0.2638730407) },
  401.     { FRAC_CONST(-0.5750052333), FRAC_CONST(-0.8181497455) },
  402.     { FRAC_CONST(0.5750052333), FRAC_CONST(-0.8181497455) },
  403.     { FRAC_CONST(0.9645574093), FRAC_CONST(0.2638730407) },
  404.     { FRAC_CONST(0.0784590989), FRAC_CONST(0.9969173074) },
  405.     { FRAC_CONST(-0.9114032984), FRAC_CONST(0.4115143716) },
  406.     { FRAC_CONST(-0.6959127784), FRAC_CONST(-0.7181262970) },
  407.     { FRAC_CONST(0.4399391711), FRAC_CONST(-0.8980275989) },
  408.     { FRAC_CONST(0.9939609766), FRAC_CONST(0.1097343117) },
  409.     { FRAC_CONST(0.2334453613), FRAC_CONST(0.9723699093) },
  410.     { FRAC_CONST(-0.8358073831), FRAC_CONST(0.5490227938) },
  411.     { FRAC_CONST(-0.7996846437), FRAC_CONST(-0.6004202366) },
  412.     { FRAC_CONST(0.2940403223), FRAC_CONST(-0.9557930231) },
  413.     { FRAC_CONST(0.9988898635), FRAC_CONST(-0.0471064523) },
  414.     { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) },
  415.     { FRAC_CONST(-0.7396311164), FRAC_CONST(0.6730124950) }
  416. };
  417. /* static function declarations */
  418. static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld);
  419. static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld);
  420. static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff);
  421. uint16_t drm_ps_data(drm_ps_info *ps, bitfile *ld)
  422. {
  423.     uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
  424.     ps->drm_ps_data_available = 1;
  425.     ps->bs_enable_sa = faad_get1bit(ld);
  426.     ps->bs_enable_pan = faad_get1bit(ld);
  427.     if (ps->bs_enable_sa)
  428.     {
  429.         drm_ps_sa_element(ps, ld);
  430.     }
  431.     if (ps->bs_enable_pan)
  432.     {
  433.         drm_ps_pan_element(ps, ld);
  434.     }
  435.     bits = (uint16_t)faad_get_processed_bits(ld) - bits;
  436.     return bits;
  437. }
  438. static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
  439. {
  440.     drm_ps_huff_tab huff;
  441.     uint8_t band;
  442.     ps->bs_sa_dt_flag = faad_get1bit(ld);
  443.     if (ps->bs_sa_dt_flag)
  444.     {
  445.         huff = t_huffman_sa;
  446.     } else {
  447.         huff = f_huffman_sa;
  448.     }
  449.     for (band = 0; band < DRM_NUM_SA_BANDS; band++)
  450.     {
  451.         ps->bs_sa_data[band] = huff_dec(ld, huff);
  452.     }
  453. }
  454. static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
  455. {
  456.     drm_ps_huff_tab huff;
  457.     uint8_t band;
  458.     ps->bs_pan_dt_flag = faad_get1bit(ld);
  459.     if (ps->bs_pan_dt_flag)
  460.     {
  461.         huff = t_huffman_pan;
  462.     } else {
  463.         huff = f_huffman_pan;
  464.     }
  465.     for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
  466.     {
  467.         ps->bs_pan_data[band] = huff_dec(ld, huff);
  468.     }
  469. }
  470. /* binary search huffman decoding */
  471. static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
  472. {
  473.     uint8_t bit;
  474.     int16_t index = 0;
  475.     while (index >= 0)
  476.     {
  477.         bit = (uint8_t)faad_get1bit(ld);
  478.         index = huff[index][bit];
  479.     }
  480.     return index + 15;
  481. }
  482. static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
  483. {
  484.     if (i < 0) {
  485.       /*  printf(" SAminclip %d", i); */
  486.         ps->sa_decode_error = 1;
  487.         return 0;
  488.     } else if (i > 7) {
  489.      /*   printf(" SAmaxclip %d", i); */
  490.         ps->sa_decode_error = 1;
  491.         return 7;
  492.     } else
  493.         return i;
  494. }
  495. static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
  496. {   
  497.     if (i < -7) {
  498.         /* printf(" PANminclip %d", i); */
  499.         ps->pan_decode_error = 1;
  500.         return -7;
  501.     } else if (i > 7) {
  502.        /* printf(" PANmaxclip %d", i);  */
  503.         ps->pan_decode_error = 1;
  504.         return 7;
  505.     } else
  506.         return i;
  507. }
  508. static void drm_ps_delta_decode(drm_ps_info *ps) 
  509. {
  510.     uint8_t band;    
  511.     if (ps->bs_enable_sa) 
  512.     {    
  513.         if (ps->bs_sa_dt_flag && !ps->g_last_had_sa) 
  514.         {        
  515.             for (band = 0; band < DRM_NUM_SA_BANDS; band++)
  516.             {   
  517.                 ps->g_prev_sa_index[band] = 0;
  518.             }           
  519.         }       
  520.         if (ps->bs_sa_dt_flag)
  521.         {
  522.             ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]);            
  523.         } else {
  524.             ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);          
  525.         }
  526.         
  527.         for (band = 1; band < DRM_NUM_SA_BANDS; band++)
  528.         {   
  529.             if (ps->bs_sa_dt_flag)
  530.             {
  531.                 ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]);
  532.             } else {
  533.                 ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);                
  534.             }
  535.         }
  536.     }
  537.     /* An error during SA decoding implies PAN data will be undecodable, too */
  538.     /* Also, we don't like on/off switching in PS, so we force to last settings */
  539.     if (ps->sa_decode_error) {
  540.         ps->pan_decode_error = 1;
  541.         ps->bs_enable_pan = ps->g_last_had_pan;
  542.         ps->bs_enable_sa = ps->g_last_had_sa;
  543.     }
  544.     
  545.        
  546.     if (ps->bs_enable_sa) 
  547.     {    
  548.         if (ps->sa_decode_error) {
  549.             for (band = 0; band < DRM_NUM_SA_BANDS; band++)
  550.             {   
  551.                 ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
  552.             }
  553.         } else {
  554.             for (band = 0; band < DRM_NUM_SA_BANDS; band++)
  555.             {   
  556.                 ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
  557.             }
  558.         }
  559.     }
  560.     
  561.     if (ps->bs_enable_pan) 
  562.     {
  563.         if (ps->bs_pan_dt_flag && !ps->g_last_had_pan) 
  564.         {
  565. /* The DRM PS spec doesn't say anything about this case. (deltacoded in time without a previous frame)
  566.    AAC PS spec you must tread previous frame as 0, so that's what we try. 
  567. */
  568.             for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
  569.             {   
  570.                 ps->g_prev_pan_index[band] = 0;
  571.             }
  572.         } 
  573.         if (ps->bs_pan_dt_flag)
  574.         {   
  575.              ps->g_pan_index[0] = pan_delta_clip(ps,  ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
  576.         } else {
  577.              ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
  578.         }
  579.     
  580.         for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
  581.         {   
  582.             if (ps->bs_pan_dt_flag)
  583.             {
  584.                 ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]);
  585.             } else {
  586.                 ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
  587.             }
  588.         }
  589.  
  590.         if (ps->pan_decode_error) {
  591.             for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
  592.             {   
  593.                 ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
  594.             }
  595.         } else {
  596.             for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
  597.             {   
  598.                 ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
  599.             }
  600.         }
  601.     }
  602. }
  603. static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64], uint8_t rateselect) 
  604. {      
  605.     uint8_t s, b, k;
  606.     complex_t qfrac, tmp0, tmp, in, R0;
  607.     real_t peakdiff;
  608.     real_t nrg;
  609.     real_t power;
  610.     real_t transratio;
  611.     real_t new_delay_slopes[NUM_OF_LINKS];
  612.     uint8_t temp_delay_ser[NUM_OF_LINKS];
  613.     complex_t Phi_Fract;
  614. #ifdef FIXED_POINT
  615.     uint32_t in_re, in_im;
  616. #endif
  617.     for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS][rateselect]; b++)
  618.     {
  619.         /* set delay indices */    
  620.         for (k = 0; k < NUM_OF_LINKS; k++)
  621.             temp_delay_ser[k] = ps->delay_buf_index_ser[k];
  622.         RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
  623.         IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
  624.         for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
  625.         {            
  626.             const real_t gamma = REAL_CONST(1.5);
  627.             const real_t sigma = REAL_CONST(1.5625);
  628.             RE(in) = QMF_RE(X[s][b]);
  629.             IM(in) = QMF_IM(X[s][b]);
  630. #ifdef FIXED_POINT
  631.             /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF
  632.             * meaning that P will be scaled by 2^(-10) compared to floating point version
  633.             */
  634.             in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
  635.             in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
  636.             power = in_re*in_re + in_im*in_im;
  637. #else
  638.             power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
  639. #endif
  640.             ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay[rateselect]);
  641.             if (ps->peakdecay_fast[b] < power)
  642.                 ps->peakdecay_fast[b] = power;
  643.             peakdiff = ps->prev_peakdiff[b];
  644.             peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff[rateselect]);
  645.             ps->prev_peakdiff[b] = peakdiff;
  646.             nrg = ps->prev_nrg[b];
  647.             nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff[rateselect]);
  648.             ps->prev_nrg[b] = nrg;
  649.             if (MUL_R(peakdiff, gamma) <= nrg) {
  650.                 transratio = sigma;
  651.             } else {
  652.                 transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
  653.             }
  654.             
  655.             for (k = 0; k < NUM_OF_LINKS; k++) 
  656.             {
  657.                 new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
  658.             }
  659.             RE(tmp0) = RE(ps->d_buff[0][b]);
  660.             IM(tmp0) = IM(ps->d_buff[0][b]);
  661.             RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
  662.             IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
  663.             RE(ps->d_buff[1][b]) = RE(in);
  664.             IM(ps->d_buff[1][b]) = IM(in);               
  665.             ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
  666.             RE(R0) = RE(tmp);
  667.             IM(R0) = IM(tmp);
  668.             for (k = 0; k < NUM_OF_LINKS; k++) 
  669.             {
  670.                 RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
  671.                 IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
  672.                 RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
  673.                 IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
  674.                 ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
  675.                 RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
  676.                 IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
  677.                 RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
  678.                 IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
  679.                 RE(R0) = RE(tmp);
  680.                 IM(R0) = IM(tmp);
  681.             }
  682.             QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
  683.             QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
  684.             for (k = 0; k < NUM_OF_LINKS; k++)
  685.             {
  686.                 if (++temp_delay_ser[k] >= delay_length[k][rateselect])
  687.                     temp_delay_ser[k] = 0;
  688.             }
  689.         }       
  690.     }
  691.     for (k = 0; k < NUM_OF_LINKS; k++)
  692.         ps->delay_buf_index_ser[k] = temp_delay_ser[k];
  693. }
  694. static void drm_add_ambiance(drm_ps_info *ps, uint8_t rateselect, qmf_t X_left[38][64], qmf_t X_right[38][64]) 
  695. {
  696.     uint8_t s, b, ifreq, qclass;    
  697.     real_t sa_map[MAX_SA_BAND], sa_dir_map[MAX_SA_BAND], k_sa_map[MAX_SA_BAND], k_sa_dir_map[MAX_SA_BAND];
  698.     real_t new_dir_map, new_sa_map;
  699.     
  700.     if (ps->bs_enable_sa)
  701.     {
  702.         /* Instead of dequantization and mapping, we use an inverse mapping
  703.            to look up all the values we need */
  704.         for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS][rateselect]; b++)
  705.         {
  706.             const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
  707.             ifreq = sa_inv_freq[b];
  708.             qclass = (b != 0);
  709.             sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
  710.             new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
  711.             k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));    
  712.             
  713.             sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];                        
  714.             new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
  715.                                                    
  716.             k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
  717.         }
  718.         for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
  719.         {
  720.             for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS][rateselect]; b++)
  721.             {                
  722.                 QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
  723.                 QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
  724.                 QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
  725.                 QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
  726.       
  727.                 sa_map[b]     += k_sa_map[b];
  728.                 sa_dir_map[b] += k_sa_dir_map[b];
  729.             }
  730.             for (b = sa_freq_scale[DRM_NUM_SA_BANDS][rateselect]; b < NUM_OF_QMF_CHANNELS; b++)
  731.             {                
  732.                 QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
  733.                 QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
  734.             }
  735.         }
  736.     } 
  737.     else {
  738.         for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
  739.         {
  740.             for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
  741.             {
  742.                 QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
  743.                 QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);                
  744.             }
  745.         }
  746.     }
  747. }
  748. static void drm_add_pan(drm_ps_info *ps, uint8_t rateselect, qmf_t X_left[38][64], qmf_t X_right[38][64]) 
  749. {
  750.     uint8_t s, b, qclass, ifreq;
  751.     real_t tmp, coeff1, coeff2;
  752.     real_t pan_base[MAX_PAN_BAND];
  753.     real_t pan_delta[MAX_PAN_BAND];
  754.     qmf_t temp_l, temp_r;
  755.     if (ps->bs_enable_pan)
  756.     {
  757.         for (b = 0; b < NUM_OF_QMF_CHANNELS; b++) 
  758.         {
  759.             /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
  760.                inverse mapping 64->20 and look up the 2^G(x,y) values directly */
  761.             ifreq = pan_inv_freq[b];
  762.             qclass = pan_quant_class[ifreq];
  763.             if (ps->g_prev_pan_index[ifreq] >= 0)
  764.             {
  765.                 pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass]; 
  766.             } else {
  767.                 pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
  768.             }
  769.             /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
  770.             /* a en b can be negative so we may need to inverse parts */
  771.             if (ps->g_pan_index[ifreq] >= 0)
  772.             {
  773.                 if (ps->g_prev_pan_index[ifreq] >= 0) 
  774.                 {
  775.                     pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
  776.                                          pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
  777.                 } else {
  778.                     pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
  779.                                          pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
  780.                 }
  781.             } else {
  782.                 if (ps->g_prev_pan_index[ifreq] >= 0) 
  783.                 {
  784.                     pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
  785.                                          pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
  786.                 } else {
  787.                     pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
  788.                                          pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
  789.                 }
  790.             }
  791.         }
  792.         for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
  793.         {
  794.             /* PAN always uses all 64 channels */
  795.             for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
  796.             {
  797.                 tmp = pan_base[b];
  798.                 coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
  799.                 coeff1 = MUL_R(coeff2, tmp);                
  800.                 QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
  801.                 QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
  802.                 QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
  803.                 QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
  804.                 QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
  805.                 QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
  806.                 QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
  807.                 QMF_IM(X_right[s][b]) = MUL_R(QMF_IM(temp_r), coeff2);
  808.                 
  809.                 /* 2^(a+k*b) = 2^a * 2^b * ... * 2^b */
  810.                 /*                   ^^^^^^^^^^^^^^^ k times */
  811.                 pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
  812.             }           
  813.         }       
  814.     }     
  815. }
  816. drm_ps_info *drm_ps_init(void)
  817. {
  818.     drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
  819.     memset(ps, 0, sizeof(drm_ps_info));     
  820.     return ps;
  821. }
  822. void drm_ps_free(drm_ps_info *ps)
  823. {
  824.     faad_free(ps);
  825. }
  826. /* main DRM PS decoding function */
  827. uint8_t drm_ps_decode(drm_ps_info *ps, uint8_t guess, uint32_t samplerate, qmf_t X_left[38][64], qmf_t X_right[38][64])
  828. {
  829.     uint8_t rateselect = (samplerate >= 24000);
  830.     
  831.     if (ps == NULL) 
  832.     {
  833.         memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
  834.         return 0;    
  835.     }     
  836.     if (!ps->drm_ps_data_available && !guess) 
  837.     {
  838.         memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
  839.         memset(ps->g_prev_sa_index, 0, sizeof(ps->g_prev_sa_index));
  840.         memset(ps->g_prev_pan_index, 0, sizeof(ps->g_prev_pan_index));
  841.         return 0;
  842.     }
  843.     /* if SBR CRC doesn't match out, we can assume decode errors to start with,
  844.        and we'll guess what the parameters should be */
  845.     if (!guess)
  846.     {
  847.         ps->sa_decode_error = 0;
  848.         ps->pan_decode_error = 0;
  849.         drm_ps_delta_decode(ps);
  850.     } else 
  851.     {
  852.         ps->sa_decode_error = 1;
  853.         ps->pan_decode_error = 1;
  854.         /* don't even bother decoding */
  855.     }
  856.   
  857.     ps->drm_ps_data_available = 0;
  858.     drm_calc_sa_side_signal(ps, X_left, rateselect);
  859.     drm_add_ambiance(ps, rateselect, X_left, X_right);
  860.     if (ps->bs_enable_sa)
  861.     {
  862.         ps->g_last_had_sa = 1;        
  863.         memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);       
  864.     } else {
  865.         ps->g_last_had_sa = 0;
  866.     }
  867.     
  868.     if (ps->bs_enable_pan)
  869.     {
  870.         drm_add_pan(ps, rateselect, X_left, X_right);
  871.     
  872.         ps->g_last_had_pan = 1;        
  873.         memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
  874.     } else {
  875.         ps->g_last_had_pan = 0;
  876.     }
  877.     return 0;
  878. }
  879. #endif