📄 layeriiidecoder.java
字号:
s.scalefac_compress = stream.readbits(9);
s.window_switching_flag = stream.readbits(1);
if ((s.window_switching_flag) != 0) {
s.block_type = stream.readbits(2);
s.mixed_block_flag = stream.readbits(1);
s.table_select[0] = stream.readbits(5);
s.table_select[1] = stream.readbits(5);
s.subblock_gain[0] = stream.readbits(3);
s.subblock_gain[1] = stream.readbits(3);
s.subblock_gain[2] = stream.readbits(3);
// Set region_count parameters since they are implicit in this case.
if (s.block_type == 0) {
// Side info bad: block_type == 0 in split block
return false;
} else if (s.block_type == 2 && s.mixed_block_flag == 0) {
s.region0_count = 8;
} else {
s.region0_count = 7;
s.region1_count = 20 - s.region0_count;
}
} else {
s.table_select[0] = stream.readbits(5);
s.table_select[1] = stream.readbits(5);
s.table_select[2] = stream.readbits(5);
s.region0_count = stream.readbits(4);
s.region1_count = stream.readbits(3);
s.block_type = 0;
}
s.scalefac_scale = stream.readbits(1);
s.count1table_select = stream.readbits(1);
}
}
return true;
}
private final void get_scale_factors(final int ch,final int gr) {
GRInfo gr_info = (si.ch[ch].gr[gr]);
int scale_comp = gr_info.scalefac_compress;
int length0 = slen0[scale_comp];
int length1 = slen1[scale_comp];
int l[] = null;
int s[][] = null;
if(ch==0){
l = scalefac0L;
s = scalefac0S;
}
else{
l = scalefac1L;
s = scalefac1S;
}
if ((gr_info.window_switching_flag != 0) && (gr_info.block_type == 2)) {
if ((gr_info.mixed_block_flag) != 0) {
// MIXED
for (int sfb = 0; sfb < 8; sfb++) {
l[sfb] = br.hgetbits(slen0[gr_info.scalefac_compress]);
}
for (int sfb = 3; sfb < 6; sfb++) {
for (int window = 0; window < 3; window++) {
s[window][sfb] = br.hgetbits(slen0[gr_info.scalefac_compress]);
}
}
for (int sfb = 6; sfb < 12; sfb++) {
for (int window = 0; window < 3; window++) {
s[window][sfb] = br.hgetbits(slen1[gr_info.scalefac_compress]);
}
}
for (int sfb = 12,window = 0; window < 3; window++) {
s[window][sfb] = 0;
}
}
else {
// SHORT
s[0][0] = br.hgetbits(length0);
s[1][0] = br.hgetbits(length0);
s[2][0] = br.hgetbits(length0);
s[0][1] = br.hgetbits(length0);
s[1][1] = br.hgetbits(length0);
s[2][1] = br.hgetbits(length0);
s[0][2] = br.hgetbits(length0);
s[1][2] = br.hgetbits(length0);
s[2][2] = br.hgetbits(length0);
s[0][3] = br.hgetbits(length0);
s[1][3] = br.hgetbits(length0);
s[2][3] = br.hgetbits(length0);
s[0][4] = br.hgetbits(length0);
s[1][4] = br.hgetbits(length0);
s[2][4] = br.hgetbits(length0);
s[0][5] = br.hgetbits(length0);
s[1][5] = br.hgetbits(length0);
s[2][5] = br.hgetbits(length0);
s[0][6] = br.hgetbits(length1);
s[1][6] = br.hgetbits(length1);
s[2][6] = br.hgetbits(length1);
s[0][7] = br.hgetbits(length1);
s[1][7] = br.hgetbits(length1);
s[2][7] = br.hgetbits(length1);
s[0][8] = br.hgetbits(length1);
s[1][8] = br.hgetbits(length1);
s[2][8] = br.hgetbits(length1);
s[0][9] = br.hgetbits(length1);
s[1][9] = br.hgetbits(length1);
s[2][9] = br.hgetbits(length1);
s[0][10] = br.hgetbits(length1);
s[1][10] = br.hgetbits(length1);
s[2][10] = br.hgetbits(length1);
s[0][11] = br.hgetbits(length1);
s[1][11] = br.hgetbits(length1);
s[2][11] = br.hgetbits(length1);
s[0][12] = s[1][12] = s[2][12] = 0;
}
// SHORT
} else {
// LONG types 0,1,3
int si_t[] = si.ch[ch].scfsi;
if (gr == 0) {
l[0] = br.hgetbits(length0);
l[1] = br.hgetbits(length0);
l[2] = br.hgetbits(length0);
l[3] = br.hgetbits(length0);
l[4] = br.hgetbits(length0);
l[5] = br.hgetbits(length0);
l[6] = br.hgetbits(length0);
l[7] = br.hgetbits(length0);
l[8] = br.hgetbits(length0);
l[9] = br.hgetbits(length0);
l[10] = br.hgetbits(length0);
l[11] = br.hgetbits(length1);
l[12] = br.hgetbits(length1);
l[13] = br.hgetbits(length1);
l[14] = br.hgetbits(length1);
l[15] = br.hgetbits(length1);
l[16] = br.hgetbits(length1);
l[17] = br.hgetbits(length1);
l[18] = br.hgetbits(length1);
l[19] = br.hgetbits(length1);
l[20] = br.hgetbits(length1);
}
else{
if (si_t[0] == 0) {
l[0] = br.hgetbits(length0);
l[1] = br.hgetbits(length0);
l[2] = br.hgetbits(length0);
l[3] = br.hgetbits(length0);
l[4] = br.hgetbits(length0);
l[5] = br.hgetbits(length0);
}
if (si_t[1] == 0) {
l[6] = br.hgetbits(length0);
l[7] = br.hgetbits(length0);
l[8] = br.hgetbits(length0);
l[9] = br.hgetbits(length0);
l[10] = br.hgetbits(length0);
}
if (si_t[2] == 0) {
l[11] = br.hgetbits(length1);
l[12] = br.hgetbits(length1);
l[13] = br.hgetbits(length1);
l[14] = br.hgetbits(length1);
l[15] = br.hgetbits(length1);
}
if (si_t[3] == 0) {
l[16] = br.hgetbits(length1);
l[17] = br.hgetbits(length1);
l[18] = br.hgetbits(length1);
l[19] = br.hgetbits(length1);
l[20] = br.hgetbits(length1);
}
}
l[21] = l[22] = 0;
}
}
private final void huffman_decode(final int ch,final int gr) {
//huff.x = huff.y = huff.v = huff.w= 0;
GRInfo s = si.ch[ch].gr[gr];
int part2_3_end = part2_start + s.part2_3_length;
int num_bits=0;
int region1Start=0;
int region2Start=0;
int index;
int buf;
int buf1;
// Find region boundary for short block case
if (((s.window_switching_flag) != 0) && (s.block_type == 2)) {
// Region2.
region1Start = 36;
// sfb[9/3]*3=36
region2Start = 576;
// No Region2 for short block case
} else {
// Find region boundary for long block case
buf = s.region0_count + 1;
buf1 = buf + s.region1_count + 1;
if (buf1 > sfBandIndexL.length - 1) {
buf1 = sfBandIndexL.length - 1;
}
region1Start = sfBandIndexL[buf];
region2Start = sfBandIndexL[buf1];
}
index = 0;
// Read bigvalues area
int big_val_max,is_1d_max;
big_val_max = s.big_values << 1;
is_1d_max = is_1d.length;
// for (int i = 0; (i < (s.big_values << 1)) && (i<is_1d.length); i += 2) {
for (int i = 0; (i<big_val_max) && (i<is_1d_max); i += 2) {
if (i < region1Start) {
h = HuffmanTables.ht[s.table_select[0]];
}
else if (i < region2Start) {
h = HuffmanTables.ht[s.table_select[1]];
}
else {
h = HuffmanTables.ht[s.table_select[2]];
}
HuffmanTables.decode(h,huff,br);
is_1d[index++] = HuffmanTables.Huffman.x;
is_1d[index++] = HuffmanTables.Huffman.y;
}
h = HuffmanTables.ht[s.count1table_select + 32];
num_bits = BitReserve.totbit;
while ((num_bits < part2_3_end) && (index < 576)) {
HuffmanTables.decode(h,huff,br);
is_1d[index++] = HuffmanTables.Huffman.v;
is_1d[index++] = HuffmanTables.Huffman.w;
is_1d[index++] = HuffmanTables.Huffman.x;
is_1d[index++] = HuffmanTables.Huffman.y;
num_bits = BitReserve.totbit;
}
if (num_bits > part2_3_end) {
br.rewindNbits(num_bits - part2_3_end);
index -= 4;
}
num_bits = BitReserve.totbit;
// Dismiss stuffing bits
if (num_bits < part2_3_end) {
br.hgetbits(part2_3_end - num_bits);
}
// Zero out rest
if (index < 576) {
if(ch==0)
nonzero0 = index;
else
nonzero1 = index;
} else {
if(ch==0)
nonzero0 = 576;
else
nonzero1 = 576;
}
if (index < 0) {
index = 0;
}
}
private final void dequantize_sample(final float xr[][],final int ch,final int gr) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -