Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. #include "layer3.h"
  2.  
  3. extern int                      m_channels;
  4. extern int                      m_ms_mode, m_is_mode;
  5.  
  6. extern SIDE_INFO        m_side_info;
  7.  
  8. int L3get_side_info1()
  9. {
  10.         int gr, ch, size;
  11.  
  12.         m_side_info.main_data_begin = bitget(9);
  13.         if (m_channels == 1) {
  14.                 m_side_info.private_bits = bitget(5);
  15.                 size = 17;
  16.         }
  17.         else {
  18.                 m_side_info.private_bits = bitget(3);
  19.                 size = 32;
  20.         }
  21.         for (ch = 0; ch < m_channels; ch ++)
  22.                 m_side_info.scfsi[ch] = bitget(4);
  23.  
  24.         for (gr = 0; gr < 2; gr ++) {
  25.                 for (ch = 0; ch < m_channels; ch ++) {
  26.                         GR_INFO* gr_info = &m_side_info.gr[gr][ch];
  27.                         gr_info->part2_3_length = bitget(12);
  28.                         gr_info->big_values = bitget(9);
  29.                         gr_info->global_gain = bitget(8);
  30.                         //gr_info->global_gain += gain_adjust;
  31.                         if (m_ms_mode) gr_info->global_gain -= 2;
  32.                         gr_info->scalefac_compress = bitget(4);
  33.                         gr_info->window_switching_flag = bitget(1);
  34.                         if (gr_info->window_switching_flag) {
  35.                                 gr_info->block_type = bitget(2);
  36.                                 gr_info->mixed_block_flag = bitget(1);
  37.                                 gr_info->table_select[0] = bitget(5);
  38.                                 gr_info->table_select[1] = bitget(5);
  39.                                 gr_info->subblock_gain[0] = bitget(3);
  40.                                 gr_info->subblock_gain[1] = bitget(3);
  41.                                 gr_info->subblock_gain[2] = bitget(3);
  42.                                 /* region count set in terms of long block cb's/bands */
  43.                                 /* r1 set so r0+r1+1 = 21 (lookup produces 576 bands ) */
  44.                                 /* if(window_switching_flag) always 36 samples in region0 */
  45.                                 gr_info->region0_count = (8 - 1);       /* 36 samples */
  46.                                 gr_info->region1_count = 20 - (8 - 1);
  47.                         }
  48.                         else {
  49.                                 gr_info->mixed_block_flag = 0;
  50.                                 gr_info->block_type = 0;
  51.                                 gr_info->table_select[0] = bitget(5);
  52.                                 gr_info->table_select[1] = bitget(5);
  53.                                 gr_info->table_select[2] = bitget(5);
  54.                                 gr_info->region0_count = bitget(4);
  55.                                 gr_info->region1_count = bitget(3);
  56.                         }
  57.                         gr_info->preflag = bitget(1);
  58.                         gr_info->scalefac_scale = bitget(1);
  59.                         gr_info->count1table_select = bitget(1);
  60.                 }
  61.         }
  62.         return size;
  63. }
  64.  
  65. int L3get_side_info2(int gr)
  66. {
  67.         int ch, size;
  68.  
  69.         m_side_info.main_data_begin = bitget(8);
  70.         if (m_channels == 1) {
  71.                 m_side_info.private_bits = bitget(1);
  72.                 size = 9;
  73.         }
  74.         else {
  75.                 m_side_info.private_bits = bitget(2);
  76.                 size = 17;
  77.         }
  78.         m_side_info.scfsi[0] = 0;
  79.         m_side_info.scfsi[1] = 0;
  80.  
  81.         for (ch = 0; ch < m_channels; ch ++) {
  82.                 m_side_info.gr[gr][ch].part2_3_length = bitget(12);
  83.                 m_side_info.gr[gr][ch].big_values = bitget(9);
  84.                 m_side_info.gr[gr][ch].global_gain = bitget(8);// + gain_adjust;
  85.                 if (m_ms_mode) m_side_info.gr[gr][ch].global_gain -= 2;
  86.                 m_side_info.gr[gr][ch].scalefac_compress = bitget(9);
  87.                 m_side_info.gr[gr][ch].window_switching_flag = bitget(1);
  88.                 if (m_side_info.gr[gr][ch].window_switching_flag) {
  89.                         m_side_info.gr[gr][ch].block_type = bitget(2);
  90.                         m_side_info.gr[gr][ch].mixed_block_flag = bitget(1);
  91.                         m_side_info.gr[gr][ch].table_select[0] = bitget(5);
  92.                         m_side_info.gr[gr][ch].table_select[1] = bitget(5);
  93.                         m_side_info.gr[gr][ch].subblock_gain[0] = bitget(3);
  94.                         m_side_info.gr[gr][ch].subblock_gain[1] = bitget(3);
  95.                         m_side_info.gr[gr][ch].subblock_gain[2] = bitget(3);
  96.                         /* region count set in terms of long block cb's/bands  */
  97.                         /* r1 set so r0+r1+1 = 21 (lookup produces 576 bands ) */
  98.                         /* bt=1 or 3       54 samples */
  99.                         /* bt=2 mixed=0    36 samples */
  100.                         /* bt=2 mixed=1    54 (8 long sf) samples? or maybe 36 */
  101.                         /* region0 discussion says 54 but this would mix long */
  102.                         /* and short in region0 if scale factors switch */
  103.                         /* at band 36 (6 long scale factors) */
  104.                         if ((m_side_info.gr[gr][ch].block_type == 2)) {
  105.                                 m_side_info.gr[gr][ch].region0_count = (6 - 1); /* 36 samples */
  106.                                 m_side_info.gr[gr][ch].region1_count = 20 - (6 - 1);
  107.                         }
  108.                         else {/* long block type 1 or 3 */
  109.                                 m_side_info.gr[gr][ch].region0_count = (8 - 1); /* 54 samples */
  110.                                 m_side_info.gr[gr][ch].region1_count = 20 - (8 - 1);
  111.                         }
  112.                 }
  113.                 else {
  114.                         m_side_info.gr[gr][ch].mixed_block_flag = 0;
  115.                         m_side_info.gr[gr][ch].block_type = 0;
  116.                         m_side_info.gr[gr][ch].table_select[0] = bitget(5);
  117.                         m_side_info.gr[gr][ch].table_select[1] = bitget(5);
  118.                         m_side_info.gr[gr][ch].table_select[2] = bitget(5);
  119.                         m_side_info.gr[gr][ch].region0_count = bitget(4);
  120.                         m_side_info.gr[gr][ch].region1_count = bitget(3);
  121.                 }
  122.                 m_side_info.gr[gr][ch].preflag = 0;
  123.                 m_side_info.gr[gr][ch].scalefac_scale = bitget(1);
  124.                 m_side_info.gr[gr][ch].count1table_select = bitget(1);
  125.         }
  126.         return size;
  127. }
  128.