kolibrios-fun/programs/media/ac97snd/trunk/mp3dec/l3side.c
heavyiron 3eda462807 Kernel: Smoothing image code from Mario79, build scripts for skin and drivers/build.bat
Programs: fasm updated to 1.67.14, small fixes in desktop, stackcfg, calc, board, pipes, freecell, big cleanup of unused programs, added some applications from 0.6.3.0 distr...

git-svn-id: svn://kolibrios.org@205 a494cfbc-eb01-0410-851d-a64ba20cac60
2006-11-02 14:18:23 +00:00

128 lines
4.3 KiB
C

#include "layer3.h"
extern int m_channels;
extern int m_ms_mode, m_is_mode;
extern SIDE_INFO m_side_info;
int L3get_side_info1()
{
int gr, ch, size;
m_side_info.main_data_begin = bitget(9);
if (m_channels == 1) {
m_side_info.private_bits = bitget(5);
size = 17;
}
else {
m_side_info.private_bits = bitget(3);
size = 32;
}
for (ch = 0; ch < m_channels; ch ++)
m_side_info.scfsi[ch] = bitget(4);
for (gr = 0; gr < 2; gr ++) {
for (ch = 0; ch < m_channels; ch ++) {
GR_INFO* gr_info = &m_side_info.gr[gr][ch];
gr_info->part2_3_length = bitget(12);
gr_info->big_values = bitget(9);
gr_info->global_gain = bitget(8);
//gr_info->global_gain += gain_adjust;
if (m_ms_mode) gr_info->global_gain -= 2;
gr_info->scalefac_compress = bitget(4);
gr_info->window_switching_flag = bitget(1);
if (gr_info->window_switching_flag) {
gr_info->block_type = bitget(2);
gr_info->mixed_block_flag = bitget(1);
gr_info->table_select[0] = bitget(5);
gr_info->table_select[1] = bitget(5);
gr_info->subblock_gain[0] = bitget(3);
gr_info->subblock_gain[1] = bitget(3);
gr_info->subblock_gain[2] = bitget(3);
/* region count set in terms of long block cb's/bands */
/* r1 set so r0+r1+1 = 21 (lookup produces 576 bands ) */
/* if(window_switching_flag) always 36 samples in region0 */
gr_info->region0_count = (8 - 1); /* 36 samples */
gr_info->region1_count = 20 - (8 - 1);
}
else {
gr_info->mixed_block_flag = 0;
gr_info->block_type = 0;
gr_info->table_select[0] = bitget(5);
gr_info->table_select[1] = bitget(5);
gr_info->table_select[2] = bitget(5);
gr_info->region0_count = bitget(4);
gr_info->region1_count = bitget(3);
}
gr_info->preflag = bitget(1);
gr_info->scalefac_scale = bitget(1);
gr_info->count1table_select = bitget(1);
}
}
return size;
}
int L3get_side_info2(int gr)
{
int ch, size;
m_side_info.main_data_begin = bitget(8);
if (m_channels == 1) {
m_side_info.private_bits = bitget(1);
size = 9;
}
else {
m_side_info.private_bits = bitget(2);
size = 17;
}
m_side_info.scfsi[0] = 0;
m_side_info.scfsi[1] = 0;
for (ch = 0; ch < m_channels; ch ++) {
m_side_info.gr[gr][ch].part2_3_length = bitget(12);
m_side_info.gr[gr][ch].big_values = bitget(9);
m_side_info.gr[gr][ch].global_gain = bitget(8);// + gain_adjust;
if (m_ms_mode) m_side_info.gr[gr][ch].global_gain -= 2;
m_side_info.gr[gr][ch].scalefac_compress = bitget(9);
m_side_info.gr[gr][ch].window_switching_flag = bitget(1);
if (m_side_info.gr[gr][ch].window_switching_flag) {
m_side_info.gr[gr][ch].block_type = bitget(2);
m_side_info.gr[gr][ch].mixed_block_flag = bitget(1);
m_side_info.gr[gr][ch].table_select[0] = bitget(5);
m_side_info.gr[gr][ch].table_select[1] = bitget(5);
m_side_info.gr[gr][ch].subblock_gain[0] = bitget(3);
m_side_info.gr[gr][ch].subblock_gain[1] = bitget(3);
m_side_info.gr[gr][ch].subblock_gain[2] = bitget(3);
/* region count set in terms of long block cb's/bands */
/* r1 set so r0+r1+1 = 21 (lookup produces 576 bands ) */
/* bt=1 or 3 54 samples */
/* bt=2 mixed=0 36 samples */
/* bt=2 mixed=1 54 (8 long sf) samples? or maybe 36 */
/* region0 discussion says 54 but this would mix long */
/* and short in region0 if scale factors switch */
/* at band 36 (6 long scale factors) */
if ((m_side_info.gr[gr][ch].block_type == 2)) {
m_side_info.gr[gr][ch].region0_count = (6 - 1); /* 36 samples */
m_side_info.gr[gr][ch].region1_count = 20 - (6 - 1);
}
else {/* long block type 1 or 3 */
m_side_info.gr[gr][ch].region0_count = (8 - 1); /* 54 samples */
m_side_info.gr[gr][ch].region1_count = 20 - (8 - 1);
}
}
else {
m_side_info.gr[gr][ch].mixed_block_flag = 0;
m_side_info.gr[gr][ch].block_type = 0;
m_side_info.gr[gr][ch].table_select[0] = bitget(5);
m_side_info.gr[gr][ch].table_select[1] = bitget(5);
m_side_info.gr[gr][ch].table_select[2] = bitget(5);
m_side_info.gr[gr][ch].region0_count = bitget(4);
m_side_info.gr[gr][ch].region1_count = bitget(3);
}
m_side_info.gr[gr][ch].preflag = 0;
m_side_info.gr[gr][ch].scalefac_scale = bitget(1);
m_side_info.gr[gr][ch].count1table_select = bitget(1);
}
return size;
}