📄 layeriiidecoder.java
字号:
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++] = huff.x;
is_1d[index++] = huff.y;
}
h = HuffmanTables.ht[s.count1table_select + 32];
num_bits = br.totbit;
while ((num_bits < part2_3_end) && (index < 576)) {
HuffmanTables.decode(h, huff, br);
is_1d[index++] = huff.v;
is_1d[index++] = huff.w;
is_1d[index++] = huff.x;
is_1d[index++] = huff.y;
num_bits = br.totbit;
}
if (num_bits > part2_3_end) {
br.rewindNbits(num_bits - part2_3_end);
index -= 4;
}
num_bits = br.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) {
GRInfo gr_info = (si.ch[ch].gr[gr]);
int cb = 0;
int next_cb_boundary =0;
int cb_begin = 0;
int cb_width = 0;
float g_gain = 0.0f;
// choose correct scalefactor band per block type, initalize boundary
if ((gr_info.window_switching_flag != 0) && (gr_info.block_type == 2)) {
if (gr_info.mixed_block_flag != 0) {
next_cb_boundary = sfBandIndexL[1];
}
// LONG blocks: 0,1,3
else {
cb_width = sfBandIndexS[1];
next_cb_boundary = (cb_width << 2) - cb_width;
cb_begin = 0;
}
} else {
next_cb_boundary = sfBandIndexL[1];
// LONG blocks: 0,1,3
}
// Compute overall (global) scaling.
g_gain = (float) Math.pow(2.0, (0.25 * (gr_info.global_gain - 210.0)));
int maxNonZero = (ch == 0) ? nonzero0 : nonzero1;
for (int j = 0; j < maxNonZero; j++) {
reste = j % SSLIMIT;
quotien = (int) ((j - reste) / SSLIMIT);
if (is_1d[j] == 0) {
xr[quotien][reste] = 0.0f;
}
else {
int abv = is_1d[j];
if (is_1d[j] > 0) {
xr[quotien][reste] = g_gain * t_43[abv];
}
else {
xr[quotien][reste] = -g_gain * t_43[-abv];
}
}
}
// apply formula per block type
for (int i=0, j = 0; j < maxNonZero; j++,i++) {
reste = j % SSLIMIT;
quotien = (int) ((j - reste) / SSLIMIT);
if (i == next_cb_boundary) {
/*
* Adjust critical band boundary
*/
if ((gr_info.window_switching_flag != 0) && (gr_info.block_type == 2)) {
if (gr_info.mixed_block_flag != 0) {
if (i == sfBandIndexL[8]) {
next_cb_boundary = sfBandIndexS[4];
next_cb_boundary = (next_cb_boundary << 2) - next_cb_boundary;
cb = 3;
cb_width = sfBandIndexS[4] - sfBandIndexS[3];
cb_begin = sfBandIndexS[3];
cb_begin = (cb_begin << 2) - cb_begin;
} else if (i < sfBandIndexL[8]) {
next_cb_boundary = sfBandIndexL[(++cb) + 1];
} else {
next_cb_boundary = sfBandIndexS[(++cb) + 1];
next_cb_boundary = (next_cb_boundary << 2) - next_cb_boundary;
cb_begin = sfBandIndexS[cb];
cb_width = sfBandIndexS[cb + 1] - cb_begin;
cb_begin = (cb_begin << 2) - cb_begin;
}
} else {
next_cb_boundary = sfBandIndexS[(++cb) + 1];
next_cb_boundary = (next_cb_boundary << 2) - next_cb_boundary;
cb_begin = sfBandIndexS[cb];
cb_width = sfBandIndexS[cb + 1] - cb_begin;
cb_begin = (cb_begin << 2) - cb_begin;
}
} else {
// long blocks
next_cb_boundary = sfBandIndexL[(++cb) + 1];
}
}
int s[][] = (ch==0)?scalefac0S:scalefac1S;
int l[] = (ch==0)?scalefac0L:scalefac1L;
// Do long/short dependent scaling operations
if ((gr_info.window_switching_flag != 0) && (((gr_info.block_type == 2) && (gr_info.mixed_block_flag == 0)) || ((gr_info.block_type == 2) && (gr_info.mixed_block_flag != 0) && (j >= 36)))) {
int t_index = (i - cb_begin) / cb_width;
int idx = s[t_index][cb] << gr_info.scalefac_scale;
idx += (gr_info.subblock_gain[t_index] << 2);
xr[quotien][reste] *= two_to_negative_half_pow[idx];
} else {
// LONG block types 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -