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

Windows CE

开发平台:

C/C++

  1. /*
  2. ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR 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: sbr_syntax.c,v 1.34 2004/09/04 14:56:28 menno Exp $
  26. **/
  27. #include "common.h"
  28. #include "structs.h"
  29. #ifdef SBR_DEC
  30. #include "sbr_syntax.h"
  31. #include "syntax.h"
  32. #include "sbr_huff.h"
  33. #include "sbr_fbt.h"
  34. #include "sbr_tf_grid.h"
  35. #include "sbr_e_nf.h"
  36. #include "bits.h"
  37. #ifdef PS_DEC
  38. #include "ps_dec.h"
  39. #endif
  40. #ifdef DRM_PS
  41. #include "drm_dec.h"
  42. #endif
  43. #include "analysis.h"
  44. /* static function declarations */
  45. static void sbr_header(bitfile *ld, sbr_info *sbr);
  46. static uint8_t calc_sbr_tables(sbr_info *sbr, uint8_t start_freq, uint8_t stop_freq,
  47.                                uint8_t samplerate_mode, uint8_t freq_scale,
  48.                                uint8_t alter_scale, uint8_t xover_band);
  49. static uint8_t sbr_data(bitfile *ld, sbr_info *sbr);
  50. static uint16_t sbr_extension(bitfile *ld, sbr_info *sbr,
  51.                               uint8_t bs_extension_id, uint16_t num_bits_left);
  52. static uint8_t sbr_single_channel_element(bitfile *ld, sbr_info *sbr);
  53. static uint8_t sbr_channel_pair_element(bitfile *ld, sbr_info *sbr);
  54. static uint8_t sbr_grid(bitfile *ld, sbr_info *sbr, uint8_t ch);
  55. static void sbr_dtdf(bitfile *ld, sbr_info *sbr, uint8_t ch);
  56. static void invf_mode(bitfile *ld, sbr_info *sbr, uint8_t ch);
  57. static void sinusoidal_coding(bitfile *ld, sbr_info *sbr, uint8_t ch);
  58. static void sbr_reset(sbr_info *sbr)
  59. {
  60. #if 0
  61.     printf("%dn", sbr->bs_start_freq_prev);
  62.     printf("%dn", sbr->bs_stop_freq_prev);
  63.     printf("%dn", sbr->bs_freq_scale_prev);
  64.     printf("%dn", sbr->bs_alter_scale_prev);
  65.     printf("%dn", sbr->bs_xover_band_prev);
  66.     printf("%dnn", sbr->bs_noise_bands_prev);
  67. #endif
  68.     /* if these are different from the previous frame: Reset = 1 */
  69.     if ((sbr->bs_start_freq != sbr->bs_start_freq_prev) ||
  70.         (sbr->bs_stop_freq != sbr->bs_stop_freq_prev) ||
  71.         (sbr->bs_freq_scale != sbr->bs_freq_scale_prev) ||
  72.         (sbr->bs_alter_scale != sbr->bs_alter_scale_prev) ||
  73.         (sbr->bs_xover_band != sbr->bs_xover_band_prev) ||
  74.         (sbr->bs_noise_bands != sbr->bs_noise_bands_prev))
  75.     {
  76.         sbr->Reset = 1;
  77.     } else {
  78.         sbr->Reset = 0;
  79.     }
  80.     sbr->bs_start_freq_prev = sbr->bs_start_freq;
  81.     sbr->bs_stop_freq_prev = sbr->bs_stop_freq;
  82.     sbr->bs_freq_scale_prev = sbr->bs_freq_scale;
  83.     sbr->bs_alter_scale_prev = sbr->bs_alter_scale;
  84.     sbr->bs_xover_band_prev = sbr->bs_xover_band;
  85.     sbr->bs_noise_bands_prev = sbr->bs_noise_bands;
  86. }
  87. static uint8_t calc_sbr_tables(sbr_info *sbr, uint8_t start_freq, uint8_t stop_freq,
  88.                                uint8_t samplerate_mode, uint8_t freq_scale,
  89.                                uint8_t alter_scale, uint8_t xover_band)
  90. {
  91.     uint8_t result = 0;
  92.     uint8_t k2;
  93.     /* calculate the Master Frequency Table */
  94.     sbr->k0 = qmf_start_channel(start_freq, samplerate_mode, sbr->sample_rate);
  95.     k2 = qmf_stop_channel(stop_freq, sbr->sample_rate, sbr->k0);
  96.     /* check k0 and k2 */
  97.     if (sbr->sample_rate >= 48000)
  98.     {
  99.         if ((k2 - sbr->k0) > 32)
  100.             result += 1;
  101.     } else if (sbr->sample_rate <= 32000) {
  102.         if ((k2 - sbr->k0) > 48)
  103.             result += 1;
  104.     } else { /* (sbr->sample_rate == 44100) */
  105.         if ((k2 - sbr->k0) > 45)
  106.             result += 1;
  107.     }
  108.     if (freq_scale == 0)
  109.     {
  110.         result += master_frequency_table_fs0(sbr, sbr->k0, k2, alter_scale);
  111.     } else {
  112.         result += master_frequency_table(sbr, sbr->k0, k2, freq_scale, alter_scale);
  113.     }
  114.     result += derived_frequency_table(sbr, xover_band, k2);
  115.     result = (result > 0) ? 1 : 0;
  116.     return result;
  117. }
  118. /* table 2 */
  119. uint8_t sbr_extension_data(bitfile *ld, sbr_info *sbr, uint16_t cnt)
  120. {
  121.     uint8_t result = 0;
  122.     uint16_t num_align_bits = 0;
  123.     uint16_t num_sbr_bits = (uint16_t)faad_get_processed_bits(ld);
  124.     uint8_t saved_start_freq, saved_samplerate_mode;
  125.     uint8_t saved_stop_freq, saved_freq_scale;
  126.     uint8_t saved_alter_scale, saved_xover_band;
  127. #ifdef DRM
  128.     if (!sbr->Is_DRM_SBR)
  129. #endif
  130.     {
  131.         uint8_t bs_extension_type = (uint8_t)faad_getbits(ld, 4
  132.             DEBUGVAR(1,198,"sbr_bitstream(): bs_extension_type"));
  133.         if (bs_extension_type == EXT_SBR_DATA_CRC)
  134.         {
  135.             sbr->bs_sbr_crc_bits = (uint16_t)faad_getbits(ld, 10
  136.                 DEBUGVAR(1,199,"sbr_bitstream(): bs_sbr_crc_bits"));
  137.         }
  138.     }
  139.     /* save old header values, in case the new ones are corrupted */
  140.     saved_start_freq = sbr->bs_start_freq;
  141.     saved_samplerate_mode = sbr->bs_samplerate_mode;
  142.     saved_stop_freq = sbr->bs_stop_freq;
  143.     saved_freq_scale = sbr->bs_freq_scale;
  144.     saved_alter_scale = sbr->bs_alter_scale;
  145.     saved_xover_band = sbr->bs_xover_band;
  146.     sbr->bs_header_flag = faad_get1bit(ld
  147.         DEBUGVAR(1,200,"sbr_bitstream(): bs_header_flag"));
  148.     if (sbr->bs_header_flag)
  149.         sbr_header(ld, sbr);
  150.     /* Reset? */
  151.     sbr_reset(sbr);
  152.     /* first frame should have a header */
  153.     //if (!(sbr->frame == 0 && sbr->bs_header_flag == 0))
  154.     if (sbr->header_count != 0)
  155.     {
  156.         if (sbr->Reset || (sbr->bs_header_flag && sbr->just_seeked))
  157.         {
  158.             uint8_t rt = calc_sbr_tables(sbr, sbr->bs_start_freq, sbr->bs_stop_freq,
  159.                 sbr->bs_samplerate_mode, sbr->bs_freq_scale,
  160.                 sbr->bs_alter_scale, sbr->bs_xover_band);
  161.             /* if an error occured with the new header values revert to the old ones */
  162.             if (rt > 0)
  163.             {
  164.                 calc_sbr_tables(sbr, saved_start_freq, saved_stop_freq,
  165.                     saved_samplerate_mode, saved_freq_scale,
  166.                     saved_alter_scale, saved_xover_band);
  167.             }
  168.         }
  169.         if (result == 0)
  170.         {
  171.             result = sbr_data(ld, sbr);
  172.             /* sbr_data() returning an error means that there was an error in
  173.                envelope_time_border_vector().
  174.                In this case the old time border vector is saved and all the previous
  175.                data normally read after sbr_grid() is saved.
  176.             */
  177.             /* to be on the safe side, calculate old sbr tables in case of error */
  178.             if ((result > 0) &&
  179.                 (sbr->Reset || (sbr->bs_header_flag && sbr->just_seeked)))
  180.             {
  181.                 calc_sbr_tables(sbr, saved_start_freq, saved_stop_freq,
  182.                     saved_samplerate_mode, saved_freq_scale,
  183.                     saved_alter_scale, saved_xover_band);
  184.             }
  185.             /* we should be able to safely set result to 0 now */
  186.             result = 0;
  187.         }
  188.     } else {
  189.         result = 1;
  190.     }
  191. #ifdef DRM
  192.     if (!sbr->Is_DRM_SBR)
  193. #endif
  194.     {
  195.         num_sbr_bits = (uint16_t)faad_get_processed_bits(ld) - num_sbr_bits;
  196.         /* check if we read more bits then were available for sbr */
  197.         if (8*cnt < num_sbr_bits)
  198.             return 1;
  199.         /* -4 does not apply, bs_extension_type is re-read in this function */
  200.         num_align_bits = 8*cnt /*- 4*/ - num_sbr_bits;
  201.         while (num_align_bits > 7)
  202.         {
  203.             faad_getbits(ld, 8
  204.                 DEBUGVAR(1,999,"sbr_bitstream(): num_align_bits"));
  205.             num_align_bits -= 8;
  206.         }
  207.         faad_getbits(ld, num_align_bits
  208.             DEBUGVAR(1,999,"sbr_bitstream(): num_align_bits"));
  209.     }
  210.     return result;
  211. }
  212. /* table 3 */
  213. static void sbr_header(bitfile *ld, sbr_info *sbr)
  214. {
  215.     uint8_t bs_header_extra_1, bs_header_extra_2;
  216.     sbr->header_count++;
  217.     sbr->bs_amp_res = faad_get1bit(ld
  218.         DEBUGVAR(1,203,"sbr_header(): bs_amp_res"));
  219.     /* bs_start_freq and bs_stop_freq must define a fequency band that does
  220.        not exceed 48 channels */
  221.     sbr->bs_start_freq = (uint8_t)faad_getbits(ld, 4
  222.         DEBUGVAR(1,204,"sbr_header(): bs_start_freq"));
  223.     sbr->bs_stop_freq = (uint8_t)faad_getbits(ld, 4
  224.         DEBUGVAR(1,205,"sbr_header(): bs_stop_freq"));
  225.     sbr->bs_xover_band = (uint8_t)faad_getbits(ld, 3
  226.         DEBUGVAR(1,206,"sbr_header(): bs_xover_band"));
  227.     faad_getbits(ld, 2
  228.         DEBUGVAR(1,207,"sbr_header(): bs_reserved_bits_hdr"));
  229.     bs_header_extra_1 = (uint8_t)faad_get1bit(ld
  230.         DEBUGVAR(1,208,"sbr_header(): bs_header_extra_1"));
  231.     bs_header_extra_2 = (uint8_t)faad_get1bit(ld
  232.         DEBUGVAR(1,209,"sbr_header(): bs_header_extra_2"));
  233.     if (bs_header_extra_1)
  234.     {
  235.         sbr->bs_freq_scale = (uint8_t)faad_getbits(ld, 2
  236.             DEBUGVAR(1,211,"sbr_header(): bs_freq_scale"));
  237.         sbr->bs_alter_scale = (uint8_t)faad_get1bit(ld
  238.             DEBUGVAR(1,212,"sbr_header(): bs_alter_scale"));
  239.         sbr->bs_noise_bands = (uint8_t)faad_getbits(ld, 2
  240.             DEBUGVAR(1,213,"sbr_header(): bs_noise_bands"));
  241.     } else {
  242.         /* Default values */
  243.         sbr->bs_freq_scale = 2;
  244.         sbr->bs_alter_scale = 1;
  245.         sbr->bs_noise_bands = 2;
  246.     }
  247.     if (bs_header_extra_2)
  248.     {
  249.         sbr->bs_limiter_bands = (uint8_t)faad_getbits(ld, 2
  250.             DEBUGVAR(1,214,"sbr_header(): bs_limiter_bands"));
  251.         sbr->bs_limiter_gains = (uint8_t)faad_getbits(ld, 2
  252.             DEBUGVAR(1,215,"sbr_header(): bs_limiter_gains"));
  253.         sbr->bs_interpol_freq = (uint8_t)faad_get1bit(ld
  254.             DEBUGVAR(1,216,"sbr_header(): bs_interpol_freq"));
  255.         sbr->bs_smoothing_mode = (uint8_t)faad_get1bit(ld
  256.             DEBUGVAR(1,217,"sbr_header(): bs_smoothing_mode"));
  257.     } else {
  258.         /* Default values */
  259.         sbr->bs_limiter_bands = 2;
  260.         sbr->bs_limiter_gains = 2;
  261.         sbr->bs_interpol_freq = 1;
  262.         sbr->bs_smoothing_mode = 1;
  263.     }
  264. #if 0
  265.     /* print the header to screen */
  266.     printf("bs_amp_res: %dn", sbr->bs_amp_res);
  267.     printf("bs_start_freq: %dn", sbr->bs_start_freq);
  268.     printf("bs_stop_freq: %dn", sbr->bs_stop_freq);
  269.     printf("bs_xover_band: %dn", sbr->bs_xover_band);
  270.     if (bs_header_extra_1)
  271.     {
  272.         printf("bs_freq_scale: %dn", sbr->bs_freq_scale);
  273.         printf("bs_alter_scale: %dn", sbr->bs_alter_scale);
  274.         printf("bs_noise_bands: %dn", sbr->bs_noise_bands);
  275.     }
  276.     if (bs_header_extra_2)
  277.     {
  278.         printf("bs_limiter_bands: %dn", sbr->bs_limiter_bands);
  279.         printf("bs_limiter_gains: %dn", sbr->bs_limiter_gains);
  280.         printf("bs_interpol_freq: %dn", sbr->bs_interpol_freq);
  281.         printf("bs_smoothing_mode: %dn", sbr->bs_smoothing_mode);
  282.     }
  283.     printf("n");
  284. #endif
  285. }
  286. /* table 4 */
  287. static uint8_t sbr_data(bitfile *ld, sbr_info *sbr)
  288. {
  289.     uint8_t result;
  290. #if 0
  291.     sbr->bs_samplerate_mode = faad_get1bit(ld
  292.         DEBUGVAR(1,219,"sbr_data(): bs_samplerate_mode"));
  293. #endif
  294.     sbr->rate = (sbr->bs_samplerate_mode) ? 2 : 1;
  295.     switch (sbr->id_aac)
  296.     {
  297.     case ID_SCE:
  298. if ((result = sbr_single_channel_element(ld, sbr)) > 0)
  299. return result;
  300.         break;
  301.     case ID_CPE:
  302. if ((result = sbr_channel_pair_element(ld, sbr)) > 0)
  303. return result;
  304.         break;
  305.     }
  306. return 0;
  307. }
  308. /* table 5 */
  309. static uint8_t sbr_single_channel_element(bitfile *ld, sbr_info *sbr)
  310. {
  311.     uint8_t result;
  312.     if (faad_get1bit(ld
  313.         DEBUGVAR(1,220,"sbr_single_channel_element(): bs_data_extra")))
  314.     {
  315.         faad_getbits(ld, 4
  316.             DEBUGVAR(1,221,"sbr_single_channel_element(): bs_reserved_bits_data"));
  317.     }
  318. #ifdef DRM
  319.     /* bs_coupling, from sbr_channel_pair_base_element(bs_amp_res) */
  320.     if (sbr->Is_DRM_SBR)
  321.         faad_get1bit(ld);
  322. #endif
  323.     if ((result = sbr_grid(ld, sbr, 0)) > 0)
  324.         return result;
  325.     sbr_dtdf(ld, sbr, 0);
  326.     invf_mode(ld, sbr, 0);
  327.     sbr_envelope(ld, sbr, 0);
  328.     sbr_noise(ld, sbr, 0);
  329. #ifndef FIXED_POINT
  330.     envelope_noise_dequantisation(sbr, 0);
  331. #endif
  332.     memset(sbr->bs_add_harmonic[0], 0, 64*sizeof(uint8_t));
  333.     sbr->bs_add_harmonic_flag[0] = faad_get1bit(ld
  334.         DEBUGVAR(1,223,"sbr_single_channel_element(): bs_add_harmonic_flag[0]"));
  335.     if (sbr->bs_add_harmonic_flag[0])
  336.         sinusoidal_coding(ld, sbr, 0);
  337.     sbr->bs_extended_data = faad_get1bit(ld
  338.         DEBUGVAR(1,224,"sbr_single_channel_element(): bs_extended_data[0]"));
  339.     if (sbr->bs_extended_data)
  340.     {
  341.         uint16_t nr_bits_left;
  342. #if (defined(PS_DEC) || defined(DRM_PS))
  343.         uint8_t ps_ext_read = 0;
  344. #endif
  345.         uint16_t cnt = (uint16_t)faad_getbits(ld, 4
  346.             DEBUGVAR(1,225,"sbr_single_channel_element(): bs_extension_size"));
  347.         if (cnt == 15)
  348.         {
  349.             cnt += (uint16_t)faad_getbits(ld, 8
  350.                 DEBUGVAR(1,226,"sbr_single_channel_element(): bs_esc_count"));
  351.         }
  352.         nr_bits_left = 8 * cnt;
  353.         while (nr_bits_left > 7)
  354.         {
  355.             uint16_t tmp_nr_bits = 0;
  356.             sbr->bs_extension_id = (uint8_t)faad_getbits(ld, 2
  357.                 DEBUGVAR(1,227,"sbr_single_channel_element(): bs_extension_id"));
  358.             tmp_nr_bits += 2;
  359.             /* allow only 1 PS extension element per extension data */
  360. #if (defined(PS_DEC) || defined(DRM_PS))
  361. #if (defined(PS_DEC) && defined(DRM_PS))
  362.             if (sbr->bs_extension_id == EXTENSION_ID_PS || sbr->bs_extension_id == DRM_PARAMETRIC_STEREO)
  363. #else
  364. #ifdef PS_DEC
  365.             if (sbr->bs_extension_id == EXTENSION_ID_PS)
  366. #else
  367. #ifdef DRM_PS
  368.             if (sbr->bs_extension_id == DRM_PARAMETRIC_STEREO)
  369. #endif
  370. #endif
  371. #endif
  372.             {
  373.                 if (ps_ext_read == 0)
  374.                 {
  375.                     ps_ext_read = 1;
  376.                 } else {
  377.                     /* to be safe make it 3, will switch to "default"
  378.                      * in sbr_extension() */
  379.                     sbr->bs_extension_id = 3;
  380.                 }
  381.             }
  382. #endif
  383.             tmp_nr_bits += sbr_extension(ld, sbr, sbr->bs_extension_id, nr_bits_left);
  384.             /* check if the data read is bigger than the number of available bits */
  385.             if (tmp_nr_bits > nr_bits_left)
  386.                 return 1;
  387.             nr_bits_left -= tmp_nr_bits;
  388.         }
  389.         /* Corrigendum */
  390.         if (nr_bits_left > 0)
  391.         {
  392.             faad_getbits(ld, nr_bits_left
  393.                 DEBUGVAR(1,280,"sbr_single_channel_element(): nr_bits_left"));
  394.         }
  395.     }
  396.     return 0;
  397. }
  398. /* table 6 */
  399. static uint8_t sbr_channel_pair_element(bitfile *ld, sbr_info *sbr)
  400. {
  401.     uint8_t n, result;
  402.     if (faad_get1bit(ld
  403.         DEBUGVAR(1,228,"sbr_single_channel_element(): bs_data_extra")))
  404.     {
  405.         faad_getbits(ld, 4
  406.             DEBUGVAR(1,228,"sbr_channel_pair_element(): bs_reserved_bits_data"));
  407.         faad_getbits(ld, 4
  408.             DEBUGVAR(1,228,"sbr_channel_pair_element(): bs_reserved_bits_data"));
  409.     }
  410.     sbr->bs_coupling = faad_get1bit(ld
  411.         DEBUGVAR(1,228,"sbr_channel_pair_element(): bs_coupling"));
  412.     if (sbr->bs_coupling)
  413.     {
  414.         if ((result = sbr_grid(ld, sbr, 0)) > 0)
  415.             return result;
  416.         /* need to copy some data from left to right */
  417.         sbr->bs_frame_class[1] = sbr->bs_frame_class[0];
  418.         sbr->L_E[1] = sbr->L_E[0];
  419.         sbr->L_Q[1] = sbr->L_Q[0];
  420.         sbr->bs_pointer[1] = sbr->bs_pointer[0];
  421.         for (n = 0; n <= sbr->L_E[0]; n++)
  422.         {
  423.             sbr->t_E[1][n] = sbr->t_E[0][n];
  424.             sbr->f[1][n] = sbr->f[0][n];
  425.         }
  426.         for (n = 0; n <= sbr->L_Q[0]; n++)
  427.             sbr->t_Q[1][n] = sbr->t_Q[0][n];
  428.         sbr_dtdf(ld, sbr, 0);
  429.         sbr_dtdf(ld, sbr, 1);
  430.         invf_mode(ld, sbr, 0);
  431.         /* more copying */
  432.         for (n = 0; n < sbr->N_Q; n++)
  433.             sbr->bs_invf_mode[1][n] = sbr->bs_invf_mode[0][n];
  434.         sbr_envelope(ld, sbr, 0);
  435.         sbr_noise(ld, sbr, 0);
  436.         sbr_envelope(ld, sbr, 1);
  437.         sbr_noise(ld, sbr, 1);
  438.         memset(sbr->bs_add_harmonic[0], 0, 64*sizeof(uint8_t));
  439.         memset(sbr->bs_add_harmonic[1], 0, 64*sizeof(uint8_t));
  440.         sbr->bs_add_harmonic_flag[0] = faad_get1bit(ld
  441.             DEBUGVAR(1,231,"sbr_channel_pair_element(): bs_add_harmonic_flag[0]"));
  442.         if (sbr->bs_add_harmonic_flag[0])
  443.             sinusoidal_coding(ld, sbr, 0);
  444.         sbr->bs_add_harmonic_flag[1] = faad_get1bit(ld
  445.             DEBUGVAR(1,232,"sbr_channel_pair_element(): bs_add_harmonic_flag[1]"));
  446.         if (sbr->bs_add_harmonic_flag[1])
  447.             sinusoidal_coding(ld, sbr, 1);
  448.     } else {
  449.         uint8_t saved_t_E[6] = {0}, saved_t_Q[3] = {0};
  450.         uint8_t saved_L_E = sbr->L_E[0];
  451.         uint8_t saved_L_Q = sbr->L_Q[0];
  452.         uint8_t saved_frame_class = sbr->bs_frame_class[0];
  453.         for (n = 0; n < saved_L_E; n++)
  454.             saved_t_E[n] = sbr->t_E[0][n];
  455.         for (n = 0; n < saved_L_Q; n++)
  456.             saved_t_Q[n] = sbr->t_Q[0][n];
  457.         if ((result = sbr_grid(ld, sbr, 0)) > 0)
  458.             return result;
  459.         if ((result = sbr_grid(ld, sbr, 1)) > 0)
  460.         {
  461.             /* restore first channel data as well */
  462.             sbr->bs_frame_class[0] = saved_frame_class;
  463.             sbr->L_E[0] = saved_L_E;
  464.             sbr->L_Q[0] = saved_L_Q;
  465.             for (n = 0; n < 6; n++)
  466.                 sbr->t_E[0][n] = saved_t_E[n];
  467.             for (n = 0; n < 3; n++)
  468.                 sbr->t_Q[0][n] = saved_t_Q[n];
  469.             return result;
  470.         }
  471.         sbr_dtdf(ld, sbr, 0);
  472.         sbr_dtdf(ld, sbr, 1);
  473.         invf_mode(ld, sbr, 0);
  474.         invf_mode(ld, sbr, 1);
  475.         sbr_envelope(ld, sbr, 0);
  476.         sbr_envelope(ld, sbr, 1);
  477.         sbr_noise(ld, sbr, 0);
  478.         sbr_noise(ld, sbr, 1);
  479.         memset(sbr->bs_add_harmonic[0], 0, 64*sizeof(uint8_t));
  480.         memset(sbr->bs_add_harmonic[1], 0, 64*sizeof(uint8_t));
  481.         sbr->bs_add_harmonic_flag[0] = faad_get1bit(ld
  482.             DEBUGVAR(1,239,"sbr_channel_pair_element(): bs_add_harmonic_flag[0]"));
  483.         if (sbr->bs_add_harmonic_flag[0])
  484.             sinusoidal_coding(ld, sbr, 0);
  485.         sbr->bs_add_harmonic_flag[1] = faad_get1bit(ld
  486.             DEBUGVAR(1,240,"sbr_channel_pair_element(): bs_add_harmonic_flag[1]"));
  487.         if (sbr->bs_add_harmonic_flag[1])
  488.             sinusoidal_coding(ld, sbr, 1);
  489.     }
  490. #ifndef FIXED_POINT
  491.     envelope_noise_dequantisation(sbr, 0);
  492.     envelope_noise_dequantisation(sbr, 1);
  493.     if (sbr->bs_coupling)
  494.         unmap_envelope_noise(sbr);
  495. #endif
  496.     sbr->bs_extended_data = faad_get1bit(ld
  497.         DEBUGVAR(1,233,"sbr_channel_pair_element(): bs_extended_data[0]"));
  498.     if (sbr->bs_extended_data)
  499.     {
  500.         uint16_t nr_bits_left;
  501.         uint16_t cnt = (uint16_t)faad_getbits(ld, 4
  502.             DEBUGVAR(1,234,"sbr_channel_pair_element(): bs_extension_size"));
  503.         if (cnt == 15)
  504.         {
  505.             cnt += (uint16_t)faad_getbits(ld, 8
  506.                 DEBUGVAR(1,235,"sbr_channel_pair_element(): bs_esc_count"));
  507.         }
  508.         nr_bits_left = 8 * cnt;
  509.         while (nr_bits_left > 7)
  510.         {
  511.             uint16_t tmp_nr_bits = 0;
  512.             sbr->bs_extension_id = (uint8_t)faad_getbits(ld, 2
  513.                 DEBUGVAR(1,236,"sbr_channel_pair_element(): bs_extension_id"));
  514.             tmp_nr_bits += 2;
  515.             tmp_nr_bits += sbr_extension(ld, sbr, sbr->bs_extension_id, nr_bits_left);
  516.             /* check if the data read is bigger than the number of available bits */
  517.             if (tmp_nr_bits > nr_bits_left)
  518.                 return 1;
  519.             nr_bits_left -= tmp_nr_bits;
  520.         }
  521.         /* Corrigendum */
  522.         if (nr_bits_left > 0)
  523.         {
  524.             faad_getbits(ld, nr_bits_left
  525.                 DEBUGVAR(1,280,"sbr_channel_pair_element(): nr_bits_left"));
  526.         }
  527.     }
  528.     return 0;
  529. }
  530. /* integer log[2](x): input range [0,10) */
  531. static int8_t sbr_log2(const int8_t val)
  532. {
  533.     static const int8_t log2tab[] = { 0, 0, 1, 2, 2, 3, 3, 3, 3, 4 };
  534.     if (val < 10 && val >= 0)
  535.         return log2tab[val];
  536.     else
  537.         return 0;
  538. }
  539. /* table 7 */
  540. static uint8_t sbr_grid(bitfile *ld, sbr_info *sbr, uint8_t ch)
  541. {
  542.     uint8_t i, env, rel, result;
  543.     uint8_t bs_abs_bord, bs_abs_bord_1;
  544.     uint8_t bs_num_env = 0;
  545.     uint8_t saved_L_E = sbr->L_E[ch];
  546.     uint8_t saved_L_Q = sbr->L_Q[ch];
  547.     uint8_t saved_frame_class = sbr->bs_frame_class[ch];
  548.     sbr->bs_frame_class[ch] = (uint8_t)faad_getbits(ld, 2
  549.         DEBUGVAR(1,248,"sbr_grid(): bs_frame_class"));
  550.     switch (sbr->bs_frame_class[ch])
  551.     {
  552.     case FIXFIX:
  553.         i = (uint8_t)faad_getbits(ld, 2
  554.             DEBUGVAR(1,249,"sbr_grid(): bs_num_env_raw"));
  555.         bs_num_env = min(1 << i, 5);
  556.         i = (uint8_t)faad_get1bit(ld
  557.             DEBUGVAR(1,250,"sbr_grid(): bs_freq_res_flag"));
  558.         for (env = 0; env < bs_num_env; env++)
  559.             sbr->f[ch][env] = i;
  560.         sbr->abs_bord_lead[ch] = 0;
  561.         sbr->abs_bord_trail[ch] = sbr->numTimeSlots;
  562.         sbr->n_rel_lead[ch] = bs_num_env - 1;
  563.         sbr->n_rel_trail[ch] = 0;
  564.         break;
  565.     case FIXVAR:
  566.         bs_abs_bord = (uint8_t)faad_getbits(ld, 2
  567.             DEBUGVAR(1,251,"sbr_grid(): bs_abs_bord")) + sbr->numTimeSlots;
  568.         bs_num_env = (uint8_t)faad_getbits(ld, 2
  569.             DEBUGVAR(1,252,"sbr_grid(): bs_num_env")) + 1;
  570.         for (rel = 0; rel < bs_num_env-1; rel++)
  571.         {
  572.             sbr->bs_rel_bord[ch][rel] = 2 * (uint8_t)faad_getbits(ld, 2
  573.                 DEBUGVAR(1,253,"sbr_grid(): bs_rel_bord")) + 2;
  574.         }
  575.         i = sbr_log2(bs_num_env + 1);
  576.         sbr->bs_pointer[ch] = (uint8_t)faad_getbits(ld, i
  577.             DEBUGVAR(1,254,"sbr_grid(): bs_pointer"));
  578.         for (env = 0; env < bs_num_env; env++)
  579.         {
  580.             sbr->f[ch][bs_num_env - env - 1] = (uint8_t)faad_get1bit(ld
  581.                 DEBUGVAR(1,255,"sbr_grid(): bs_freq_res"));
  582.         }
  583.         sbr->abs_bord_lead[ch] = 0;
  584.         sbr->abs_bord_trail[ch] = bs_abs_bord;
  585.         sbr->n_rel_lead[ch] = 0;
  586.         sbr->n_rel_trail[ch] = bs_num_env - 1;
  587.         break;
  588.     case VARFIX:
  589.         bs_abs_bord = (uint8_t)faad_getbits(ld, 2
  590.             DEBUGVAR(1,256,"sbr_grid(): bs_abs_bord"));
  591.         bs_num_env = (uint8_t)faad_getbits(ld, 2
  592.             DEBUGVAR(1,257,"sbr_grid(): bs_num_env")) + 1;
  593.         for (rel = 0; rel < bs_num_env-1; rel++)
  594.         {
  595.             sbr->bs_rel_bord[ch][rel] = 2 * (uint8_t)faad_getbits(ld, 2
  596.                 DEBUGVAR(1,258,"sbr_grid(): bs_rel_bord")) + 2;
  597.         }
  598.         i = sbr_log2(bs_num_env + 1);
  599.         sbr->bs_pointer[ch] = (uint8_t)faad_getbits(ld, i
  600.             DEBUGVAR(1,259,"sbr_grid(): bs_pointer"));
  601.         for (env = 0; env < bs_num_env; env++)
  602.         {
  603.             sbr->f[ch][env] = (uint8_t)faad_get1bit(ld
  604.                 DEBUGVAR(1,260,"sbr_grid(): bs_freq_res"));
  605.         }
  606.         sbr->abs_bord_lead[ch] = bs_abs_bord;
  607.         sbr->abs_bord_trail[ch] = sbr->numTimeSlots;
  608.         sbr->n_rel_lead[ch] = bs_num_env - 1;
  609.         sbr->n_rel_trail[ch] = 0;
  610.         break;
  611.     case VARVAR:
  612.         bs_abs_bord = (uint8_t)faad_getbits(ld, 2
  613.             DEBUGVAR(1,261,"sbr_grid(): bs_abs_bord_0"));
  614.         bs_abs_bord_1 = (uint8_t)faad_getbits(ld, 2
  615.             DEBUGVAR(1,262,"sbr_grid(): bs_abs_bord_1")) + sbr->numTimeSlots;
  616.         sbr->bs_num_rel_0[ch] = (uint8_t)faad_getbits(ld, 2
  617.             DEBUGVAR(1,263,"sbr_grid(): bs_num_rel_0"));
  618.         sbr->bs_num_rel_1[ch] = (uint8_t)faad_getbits(ld, 2
  619.             DEBUGVAR(1,264,"sbr_grid(): bs_num_rel_1"));
  620.         bs_num_env = min(5, sbr->bs_num_rel_0[ch] + sbr->bs_num_rel_1[ch] + 1);
  621.         for (rel = 0; rel < sbr->bs_num_rel_0[ch]; rel++)
  622.         {
  623.             sbr->bs_rel_bord_0[ch][rel] = 2 * (uint8_t)faad_getbits(ld, 2
  624.                 DEBUGVAR(1,265,"sbr_grid(): bs_rel_bord")) + 2;
  625.         }
  626.         for(rel = 0; rel < sbr->bs_num_rel_1[ch]; rel++)
  627.         {
  628.             sbr->bs_rel_bord_1[ch][rel] = 2 * (uint8_t)faad_getbits(ld, 2
  629.                 DEBUGVAR(1,266,"sbr_grid(): bs_rel_bord")) + 2;
  630.         }
  631.         i = sbr_log2(sbr->bs_num_rel_0[ch] + sbr->bs_num_rel_1[ch] + 2);
  632.         sbr->bs_pointer[ch] = (uint8_t)faad_getbits(ld, i
  633.             DEBUGVAR(1,267,"sbr_grid(): bs_pointer"));
  634.         for (env = 0; env < bs_num_env; env++)
  635.         {
  636.             sbr->f[ch][env] = (uint8_t)faad_get1bit(ld
  637.                 DEBUGVAR(1,268,"sbr_grid(): bs_freq_res"));
  638.         }
  639.         sbr->abs_bord_lead[ch] = bs_abs_bord;
  640.         sbr->abs_bord_trail[ch] = bs_abs_bord_1;
  641.         sbr->n_rel_lead[ch] = sbr->bs_num_rel_0[ch];
  642.         sbr->n_rel_trail[ch] = sbr->bs_num_rel_1[ch];
  643.         break;
  644.     }
  645.     if (sbr->bs_frame_class[ch] == VARVAR)
  646.         sbr->L_E[ch] = min(bs_num_env, 5);
  647.     else
  648.         sbr->L_E[ch] = min(bs_num_env, 4);
  649.     if (sbr->L_E[ch] <= 0)
  650.         return 1;
  651.     if (sbr->L_E[ch] > 1)
  652.         sbr->L_Q[ch] = 2;
  653.     else
  654.         sbr->L_Q[ch] = 1;
  655.     /* TODO: this code can probably be integrated into the code above! */
  656.     if ((result = envelope_time_border_vector(sbr, ch)) > 0)
  657.     {
  658.         sbr->bs_frame_class[ch] = saved_frame_class;
  659.         sbr->L_E[ch] = saved_L_E;
  660.         sbr->L_Q[ch] = saved_L_Q;
  661.         return result;
  662.     }
  663.     noise_floor_time_border_vector(sbr, ch);
  664. #if 0
  665.     for (env = 0; env < bs_num_env; env++)
  666.     {
  667.         printf("freq_res[ch:%d][env:%d]: %dn", ch, env, sbr->f[ch][env]);
  668.     }
  669. #endif
  670.     return 0;
  671. }
  672. /* table 8 */
  673. static void sbr_dtdf(bitfile *ld, sbr_info *sbr, uint8_t ch)
  674. {
  675.     uint8_t i;
  676.     for (i = 0; i < sbr->L_E[ch]; i++)
  677.     {
  678.         sbr->bs_df_env[ch][i] = faad_get1bit(ld
  679.             DEBUGVAR(1,269,"sbr_dtdf(): bs_df_env"));
  680.     }
  681.     for (i = 0; i < sbr->L_Q[ch]; i++)
  682.     {
  683.         sbr->bs_df_noise[ch][i] = faad_get1bit(ld
  684.             DEBUGVAR(1,270,"sbr_dtdf(): bs_df_noise"));
  685.     }
  686. }
  687. /* table 9 */
  688. static void invf_mode(bitfile *ld, sbr_info *sbr, uint8_t ch)
  689. {
  690.     uint8_t n;
  691.     for (n = 0; n < sbr->N_Q; n++)
  692.     {
  693.         sbr->bs_invf_mode[ch][n] = (uint8_t)faad_getbits(ld, 2
  694.             DEBUGVAR(1,271,"invf_mode(): bs_invf_mode"));
  695.     }
  696. }
  697. static uint16_t sbr_extension(bitfile *ld, sbr_info *sbr,
  698.                               uint8_t bs_extension_id, uint16_t num_bits_left)
  699. {
  700. #ifdef PS_DEC
  701.     uint8_t header;
  702.     uint16_t ret;
  703. #endif
  704.     switch (bs_extension_id)
  705.     {
  706. #ifdef PS_DEC
  707.     case EXTENSION_ID_PS:
  708.         if (!sbr->ps)
  709.         {
  710.             sbr->ps = ps_init(get_sr_index(sbr->sample_rate));
  711.         }
  712.         ret = ps_data(sbr->ps, ld, &header);
  713.         /* enable PS if and only if: a header has been decoded */
  714.         if (sbr->ps_used == 0 && header == 1)
  715.         {
  716.             sbr->ps_used = 1;
  717.         }
  718.         return ret;
  719. #endif
  720. #ifdef DRM_PS
  721.     case DRM_PARAMETRIC_STEREO:
  722.         sbr->ps_used = 1;
  723.         if (!sbr->drm_ps)
  724.         {
  725.             sbr->drm_ps = drm_ps_init();
  726.         }
  727.         return drm_ps_data(sbr->drm_ps, ld);
  728. #endif
  729.     default:
  730.         sbr->bs_extension_data = (uint8_t)faad_getbits(ld, 6
  731.             DEBUGVAR(1,279,"sbr_single_channel_element(): bs_extension_data"));
  732.         return 6;
  733.     }
  734. }
  735. /* table 12 */
  736. static void sinusoidal_coding(bitfile *ld, sbr_info *sbr, uint8_t ch)
  737. {
  738.     uint8_t n;
  739.     for (n = 0; n < sbr->N_high; n++)
  740.     {
  741.         sbr->bs_add_harmonic[ch][n] = faad_get1bit(ld
  742.             DEBUGVAR(1,278,"sinusoidal_coding(): bs_add_harmonic"));
  743.     }
  744. }
  745. #endif /* SBR_DEC */