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

多媒体编程

开发平台:

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: sbr_huff.c,v 1.2 2005/11/01 21:41:43 gabest Exp $
  31. **/
  32. #include "common.h"
  33. #include "structs.h"
  34. #ifdef SBR_DEC
  35. #include "sbr_syntax.h"
  36. #include "bits.h"
  37. #include "sbr_huff.h"
  38. #include "sbr_e_nf.h"
  39. typedef const int8_t (*sbr_huff_tab)[2];
  40. static const int8_t t_huffman_env_1_5dB[120][2] = {
  41.     {   1,   2 },    { -64, -65 },    {   3,   4 },    { -63, -66 },
  42.     {   5,   6 },    { -62, -67 },    {   7,   8 },    { -61, -68 },
  43.     {   9,  10 },    { -60, -69 },    {  11,  12 },    { -59, -70 },
  44.     {  13,  14 },    { -58, -71 },    {  15,  16 },    { -57, -72 },
  45.     {  17,  18 },    { -73, -56 },    {  19,  21 },    { -74,  20 },
  46.     { -55, -75 },    {  22,  26 },    {  23,  24 },    { -54, -76 },
  47.     { -77,  25 },    { -53, -78 },    {  27,  34 },    {  28,  29 },
  48.     { -52, -79 },    {  30,  31 },    { -80, -51 },    {  32,  33 },
  49.     { -83, -82 },    { -81, -50 },    {  35,  57 },    {  36,  40 },
  50.     {  37,  38 },    { -88, -84 },    { -48,  39 },    { -90, -85 },
  51.     {  41,  46 },    {  42,  43 },    { -49, -87 },    {  44,  45 },
  52.     { -89, -86 },    {-124,-123 },    {  47,  50 },    {  48,  49 },
  53.     {-122,-121 },    {-120,-119 },    {  51,  54 },    {  52,  53 },
  54.     {-118,-117 },    {-116,-115 },    {  55,  56 },    {-114,-113 },
  55.     {-112,-111 },    {  58,  89 },    {  59,  74 },    {  60,  67 },
  56.     {  61,  64 },    {  62,  63 },    {-110,-109 },    {-108,-107 },
  57.     {  65,  66 },    {-106,-105 },    {-104,-103 },    {  68,  71 },
  58.     {  69,  70 },    {-102,-101 },    {-100, -99 },    {  72,  73 },
  59.     { -98, -97 },    { -96, -95 },    {  75,  82 },    {  76,  79 },
  60.     {  77,  78 },    { -94, -93 },    { -92, -91 },    {  80,  81 },
  61.     { -47, -46 },    { -45, -44 },    {  83,  86 },    {  84,  85 },
  62.     { -43, -42 },    { -41, -40 },    {  87,  88 },    { -39, -38 },
  63.     { -37, -36 },    {  90, 105 },    {  91,  98 },    {  92,  95 },
  64.     {  93,  94 },    { -35, -34 },    { -33, -32 },    {  96,  97 },
  65.     { -31, -30 },    { -29, -28 },    {  99, 102 },    { 100, 101 },
  66.     { -27, -26 },    { -25, -24 },    { 103, 104 },    { -23, -22 },
  67.     { -21, -20 },    { 106, 113 },    { 107, 110 },    { 108, 109 },
  68.     { -19, -18 },    { -17, -16 },    { 111, 112 },    { -15, -14 },
  69.     { -13, -12 },    { 114, 117 },    { 115, 116 },    { -11, -10 },
  70.     {  -9,  -8 },    { 118, 119 },    {  -7,  -6 },    {  -5,  -4 }
  71. };
  72. static const int8_t f_huffman_env_1_5dB[120][2] = {
  73.     {   1,   2 },    { -64, -65 },    {   3,   4 },    { -63, -66 },
  74.     {   5,   6 },    { -67, -62 },    {   7,   8 },    { -68, -61 },
  75.     {   9,  10 },    { -69, -60 },    {  11,  13 },    { -70,  12 },
  76.     { -59, -71 },    {  14,  16 },    { -58,  15 },    { -72, -57 },
  77.     {  17,  19 },    { -73,  18 },    { -56, -74 },    {  20,  23 },
  78.     {  21,  22 },    { -55, -75 },    { -54, -53 },    {  24,  27 },
  79.     {  25,  26 },    { -76, -52 },    { -77, -51 },    {  28,  31 },
  80.     {  29,  30 },    { -50, -78 },    { -79, -49 },    {  32,  36 },
  81.     {  33,  34 },    { -48, -47 },    { -80,  35 },    { -81, -82 },
  82.     {  37,  47 },    {  38,  41 },    {  39,  40 },    { -83, -46 },
  83.     { -45, -84 },    {  42,  44 },    { -85,  43 },    { -44, -43 },
  84.     {  45,  46 },    { -88, -87 },    { -86, -90 },    {  48,  66 },
  85.     {  49,  56 },    {  50,  53 },    {  51,  52 },    { -92, -42 },
  86.     { -41, -39 },    {  54,  55 },    {-105, -89 },    { -38, -37 },
  87.     {  57,  60 },    {  58,  59 },    { -94, -91 },    { -40, -36 },
  88.     {  61,  63 },    { -20,  62 },    {-115,-110 },    {  64,  65 },
  89.     {-108,-107 },    {-101, -97 },    {  67,  89 },    {  68,  75 },
  90.     {  69,  72 },    {  70,  71 },    { -95, -93 },    { -34, -27 },
  91.     {  73,  74 },    { -22, -17 },    { -16,-124 },    {  76,  82 },
  92.     {  77,  79 },    {-123,  78 },    {-122,-121 },    {  80,  81 },
  93.     {-120,-119 },    {-118,-117 },    {  83,  86 },    {  84,  85 },
  94.     {-116,-114 },    {-113,-112 },    {  87,  88 },    {-111,-109 },
  95.     {-106,-104 },    {  90, 105 },    {  91,  98 },    {  92,  95 },
  96.     {  93,  94 },    {-103,-102 },    {-100, -99 },    {  96,  97 },
  97.     { -98, -96 },    { -35, -33 },    {  99, 102 },    { 100, 101 },
  98.     { -32, -31 },    { -30, -29 },    { 103, 104 },    { -28, -26 },
  99.     { -25, -24 },    { 106, 113 },    { 107, 110 },    { 108, 109 },
  100.     { -23, -21 },    { -19, -18 },    { 111, 112 },    { -15, -14 },
  101.     { -13, -12 },    { 114, 117 },    { 115, 116 },    { -11, -10 },
  102.     {  -9,  -8 },    { 118, 119 },    {  -7,  -6 },    {  -5,  -4 }
  103. };
  104. static const int8_t t_huffman_env_bal_1_5dB[48][2] = {
  105.     { -64,   1 },    { -63,   2 },    { -65,   3 },    { -62,   4 },
  106.     { -66,   5 },    { -61,   6 },    { -67,   7 },    { -60,   8 },
  107.     { -68,   9 },    {  10,  11 },    { -69, -59 },    {  12,  13 },
  108.     { -70, -58 },    {  14,  28 },    {  15,  21 },    {  16,  18 },
  109.     { -57,  17 },    { -71, -56 },    {  19,  20 },    { -88, -87 },
  110.     { -86, -85 },    {  22,  25 },    {  23,  24 },    { -84, -83 },
  111.     { -82, -81 },    {  26,  27 },    { -80, -79 },    { -78, -77 },
  112.     {  29,  36 },    {  30,  33 },    {  31,  32 },    { -76, -75 },
  113.     { -74, -73 },    {  34,  35 },    { -72, -55 },    { -54, -53 },
  114.     {  37,  41 },    {  38,  39 },    { -52, -51 },    { -50,  40 },
  115.     { -49, -48 },    {  42,  45 },    {  43,  44 },    { -47, -46 },
  116.     { -45, -44 },    {  46,  47 },    { -43, -42 },    { -41, -40 }
  117. };
  118. static const int8_t f_huffman_env_bal_1_5dB[48][2] = {
  119.     { -64,   1 },    { -65,   2 },    { -63,   3 },    { -66,   4 },
  120.     { -62,   5 },    { -61,   6 },    { -67,   7 },    { -68,   8 },
  121.     { -60,   9 },    {  10,  11 },    { -69, -59 },    { -70,  12 },
  122.     { -58,  13 },    {  14,  17 },    { -71,  15 },    { -57,  16 },
  123.     { -56, -73 },    {  18,  32 },    {  19,  25 },    {  20,  22 },
  124.     { -72,  21 },    { -88, -87 },    {  23,  24 },    { -86, -85 },
  125.     { -84, -83 },    {  26,  29 },    {  27,  28 },    { -82, -81 },
  126.     { -80, -79 },    {  30,  31 },    { -78, -77 },    { -76, -75 },
  127.     {  33,  40 },    {  34,  37 },    {  35,  36 },    { -74, -55 },
  128.     { -54, -53 },    {  38,  39 },    { -52, -51 },    { -50, -49 },
  129.     {  41,  44 },    {  42,  43 },    { -48, -47 },    { -46, -45 },
  130.     {  45,  46 },    { -44, -43 },    { -42,  47 },    { -41, -40 }
  131. };
  132. static const int8_t t_huffman_env_3_0dB[62][2] = {
  133.     { -64,   1 },    { -65,   2 },    { -63,   3 },    { -66,   4 },
  134.     { -62,   5 },    { -67,   6 },    { -61,   7 },    { -68,   8 },
  135.     { -60,   9 },    {  10,  11 },    { -69, -59 },    {  12,  14 },
  136.     { -70,  13 },    { -71, -58 },    {  15,  18 },    {  16,  17 },
  137.     { -72, -57 },    { -73, -74 },    {  19,  22 },    { -56,  20 },
  138.     { -55,  21 },    { -54, -77 },    {  23,  31 },    {  24,  25 },
  139.     { -75, -76 },    {  26,  27 },    { -78, -53 },    {  28,  29 },
  140.     { -52, -95 },    { -94,  30 },    { -93, -92 },    {  32,  47 },
  141.     {  33,  40 },    {  34,  37 },    {  35,  36 },    { -91, -90 },
  142.     { -89, -88 },    {  38,  39 },    { -87, -86 },    { -85, -84 },
  143.     {  41,  44 },    {  42,  43 },    { -83, -82 },    { -81, -80 },
  144.     {  45,  46 },    { -79, -51 },    { -50, -49 },    {  48,  55 },
  145.     {  49,  52 },    {  50,  51 },    { -48, -47 },    { -46, -45 },
  146.     {  53,  54 },    { -44, -43 },    { -42, -41 },    {  56,  59 },
  147.     {  57,  58 },    { -40, -39 },    { -38, -37 },    {  60,  61 },
  148.     { -36, -35 },    { -34, -33 }
  149. };
  150. static const int8_t f_huffman_env_3_0dB[62][2] = {
  151.     { -64,   1 },    { -65,   2 },    { -63,   3 },    { -66,   4 },
  152.     { -62,   5 },    { -67,   6 },    {   7,   8 },    { -61, -68 },
  153.     {   9,  10 },    { -60, -69 },    {  11,  12 },    { -59, -70 },
  154.     {  13,  14 },    { -58, -71 },    {  15,  16 },    { -57, -72 },
  155.     {  17,  19 },    { -56,  18 },    { -55, -73 },    {  20,  24 },
  156.     {  21,  22 },    { -74, -54 },    { -53,  23 },    { -75, -76 },
  157.     {  25,  30 },    {  26,  27 },    { -52, -51 },    {  28,  29 },
  158.     { -77, -79 },    { -50, -49 },    {  31,  39 },    {  32,  35 },
  159.     {  33,  34 },    { -78, -46 },    { -82, -88 },    {  36,  37 },
  160.     { -83, -48 },    { -47,  38 },    { -86, -85 },    {  40,  47 },
  161.     {  41,  44 },    {  42,  43 },    { -80, -44 },    { -43, -42 },
  162.     {  45,  46 },    { -39, -87 },    { -84, -40 },    {  48,  55 },
  163.     {  49,  52 },    {  50,  51 },    { -95, -94 },    { -93, -92 },
  164.     {  53,  54 },    { -91, -90 },    { -89, -81 },    {  56,  59 },
  165.     {  57,  58 },    { -45, -41 },    { -38, -37 },    {  60,  61 },
  166.     { -36, -35 },    { -34, -33 }
  167. };
  168. static const int8_t t_huffman_env_bal_3_0dB[24][2] = {
  169.     { -64,   1 },    { -63,   2 },    { -65,   3 },    { -66,   4 },
  170.     { -62,   5 },    { -61,   6 },    { -67,   7 },    { -68,   8 },
  171.     { -60,   9 },    {  10,  16 },    {  11,  13 },    { -69,  12 },
  172.     { -76, -75 },    {  14,  15 },    { -74, -73 },    { -72, -71 },
  173.     {  17,  20 },    {  18,  19 },    { -70, -59 },    { -58, -57 },
  174.     {  21,  22 },    { -56, -55 },    { -54,  23 },    { -53, -52 }
  175. };
  176. static const int8_t f_huffman_env_bal_3_0dB[24][2] = {
  177.     { -64,   1 },    { -65,   2 },    { -63,   3 },    { -66,   4 },
  178.     { -62,   5 },    { -61,   6 },    { -67,   7 },    { -68,   8 },
  179.     { -60,   9 },    {  10,  13 },    { -69,  11 },    { -59,  12 },
  180.     { -58, -76 },    {  14,  17 },    {  15,  16 },    { -75, -74 },
  181.     { -73, -72 },    {  18,  21 },    {  19,  20 },    { -71, -70 },
  182.     { -57, -56 },    {  22,  23 },    { -55, -54 },    { -53, -52 }
  183. };
  184. static const int8_t t_huffman_noise_3_0dB[62][2] = {
  185.     { -64,   1 },    { -63,   2 },    { -65,   3 },    { -66,   4 },
  186.     { -62,   5 },    { -67,   6 },    {   7,   8 },    { -61, -68 },
  187.     {   9,  30 },    {  10,  15 },    { -60,  11 },    { -69,  12 },
  188.     {  13,  14 },    { -59, -53 },    { -95, -94 },    {  16,  23 },
  189.     {  17,  20 },    {  18,  19 },    { -93, -92 },    { -91, -90 },
  190.     {  21,  22 },    { -89, -88 },    { -87, -86 },    {  24,  27 },
  191.     {  25,  26 },    { -85, -84 },    { -83, -82 },    {  28,  29 },
  192.     { -81, -80 },    { -79, -78 },    {  31,  46 },    {  32,  39 },
  193.     {  33,  36 },    {  34,  35 },    { -77, -76 },    { -75, -74 },
  194.     {  37,  38 },    { -73, -72 },    { -71, -70 },    {  40,  43 },
  195.     {  41,  42 },    { -58, -57 },    { -56, -55 },    {  44,  45 },
  196.     { -54, -52 },    { -51, -50 },    {  47,  54 },    {  48,  51 },
  197.     {  49,  50 },    { -49, -48 },    { -47, -46 },    {  52,  53 },
  198.     { -45, -44 },    { -43, -42 },    {  55,  58 },    {  56,  57 },
  199.     { -41, -40 },    { -39, -38 },    {  59,  60 },    { -37, -36 },
  200.     { -35,  61 },    { -34, -33 }
  201. };
  202. static const int8_t t_huffman_noise_bal_3_0dB[24][2] = {
  203.     { -64,   1 },    { -65,   2 },    { -63,   3 },    {   4,   9 },
  204.     { -66,   5 },    { -62,   6 },    {   7,   8 },    { -76, -75 },
  205.     { -74, -73 },    {  10,  17 },    {  11,  14 },    {  12,  13 },
  206.     { -72, -71 },    { -70, -69 },    {  15,  16 },    { -68, -67 },
  207.     { -61, -60 },    {  18,  21 },    {  19,  20 },    { -59, -58 },
  208.     { -57, -56 },    {  22,  23 },    { -55, -54 },    { -53, -52 }
  209. };
  210. static INLINE int16_t sbr_huff_dec(bitfile *ld, sbr_huff_tab t_huff)
  211. {
  212.     uint8_t bit;
  213.     int16_t index = 0;
  214.     while (index >= 0)
  215.     {
  216.         bit = (uint8_t)faad_get1bit(ld);
  217.         index = t_huff[index][bit];
  218.     }
  219.     return index + 64;
  220. }
  221. /* table 10 */
  222. void sbr_envelope(bitfile *ld, sbr_info *sbr, uint8_t ch)
  223. {
  224.     uint8_t env, band;
  225.     int8_t delta = 0;
  226.     sbr_huff_tab t_huff, f_huff;
  227.     if ((sbr->L_E[ch] == 1) && (sbr->bs_frame_class[ch] == FIXFIX))
  228.         sbr->amp_res[ch] = 0;
  229.     else
  230.         sbr->amp_res[ch] = sbr->bs_amp_res;
  231.     if ((sbr->bs_coupling) && (ch == 1))
  232.     {
  233.         delta = 1;
  234.         if (sbr->amp_res[ch])
  235.         {
  236.             t_huff = t_huffman_env_bal_3_0dB;
  237.             f_huff = f_huffman_env_bal_3_0dB;
  238.         } else {
  239.             t_huff = t_huffman_env_bal_1_5dB;
  240.             f_huff = f_huffman_env_bal_1_5dB;
  241.         }
  242.     } else {
  243.         delta = 0;
  244.         if (sbr->amp_res[ch])
  245.         {
  246.             t_huff = t_huffman_env_3_0dB;
  247.             f_huff = f_huffman_env_3_0dB;
  248.         } else {
  249.             t_huff = t_huffman_env_1_5dB;
  250.             f_huff = f_huffman_env_1_5dB;
  251.         }
  252.     }
  253.     for (env = 0; env < sbr->L_E[ch]; env++)
  254.     {
  255.         if (sbr->bs_df_env[ch][env] == 0)
  256.         {
  257.             if ((sbr->bs_coupling == 1) && (ch == 1))
  258.             {
  259.                 if (sbr->amp_res[ch])
  260.                 {
  261.                     sbr->E[ch][0][env] = (uint16_t)(faad_getbits(ld, 5
  262.                         DEBUGVAR(1,272,"sbr_envelope(): bs_data_env")) << delta);
  263.                 } else {
  264.                     sbr->E[ch][0][env] = (uint16_t)(faad_getbits(ld, 6
  265.                         DEBUGVAR(1,273,"sbr_envelope(): bs_data_env")) << delta);
  266.                 }
  267.             } else {
  268.                 if (sbr->amp_res[ch])
  269.                 {
  270.                     sbr->E[ch][0][env] = (uint16_t)(faad_getbits(ld, 6
  271.                         DEBUGVAR(1,274,"sbr_envelope(): bs_data_env")) << delta);
  272.                 } else {
  273.                     sbr->E[ch][0][env] = (uint16_t)(faad_getbits(ld, 7
  274.                         DEBUGVAR(1,275,"sbr_envelope(): bs_data_env")) << delta);
  275.                 }
  276.             }
  277.             for (band = 1; band < sbr->n[sbr->f[ch][env]]; band++)
  278.             {
  279.                 sbr->E[ch][band][env] = (sbr_huff_dec(ld, f_huff) << delta);
  280.             }
  281.         } else {
  282.             for (band = 0; band < sbr->n[sbr->f[ch][env]]; band++)
  283.             {
  284.                 sbr->E[ch][band][env] = (sbr_huff_dec(ld, t_huff) << delta);
  285.             }
  286.         }
  287.     }
  288.     extract_envelope_data(sbr, ch);
  289. }
  290. /* table 11 */
  291. void sbr_noise(bitfile *ld, sbr_info *sbr, uint8_t ch)
  292. {
  293.     uint8_t noise, band;
  294.     int8_t delta = 0;
  295.     sbr_huff_tab t_huff, f_huff;
  296.     if ((sbr->bs_coupling == 1) && (ch == 1))
  297.     {
  298.         delta = 1;
  299.         t_huff = t_huffman_noise_bal_3_0dB;
  300.         f_huff = f_huffman_env_bal_3_0dB;
  301.     } else {
  302.         delta = 0;
  303.         t_huff = t_huffman_noise_3_0dB;
  304.         f_huff = f_huffman_env_3_0dB;
  305.     }
  306.     for (noise = 0; noise < sbr->L_Q[ch]; noise++)
  307.     {
  308.         if(sbr->bs_df_noise[ch][noise] == 0)
  309.         {
  310.             if ((sbr->bs_coupling == 1) && (ch == 1))
  311.             {
  312.                 sbr->Q[ch][0][noise] = (faad_getbits(ld, 5
  313.                     DEBUGVAR(1,276,"sbr_noise(): bs_data_noise")) << delta);
  314.             } else {
  315.                 sbr->Q[ch][0][noise] = (faad_getbits(ld, 5
  316.                     DEBUGVAR(1,277,"sbr_noise(): bs_data_noise")) << delta);
  317.             }
  318.             for (band = 1; band < sbr->N_Q; band++)
  319.             {
  320.                 sbr->Q[ch][band][noise] = (sbr_huff_dec(ld, f_huff) << delta);
  321.             }
  322.         } else {
  323.             for (band = 0; band < sbr->N_Q; band++)
  324.             {
  325.                 sbr->Q[ch][band][noise] = (sbr_huff_dec(ld, t_huff) << delta);
  326.             }
  327.         }
  328.     }
  329.     extract_noise_floor_data(sbr, ch);
  330. }
  331. #endif