📄 layeriiidecoder.java
字号:
}
s.preflag = stream.readbits(1);
s.scalefac_scale = stream.readbits(1);
s.count1table_select = stream.readbits(1);
}
}
} else {
//unused currently
// MPEG-2 LSF
si.main_data_begin = stream.readbits(8);
if (channels == 1) {
si.private_bits = stream.readbits(1);
} else {
si.private_bits = stream.readbits(2);
}
for (ch = 0; ch < channels; ch++) {
LayerIIIDecoder.GRInfo s = si.ch[ch].gr[0];
s.part2_3_length = stream.readbits(12);
s.big_values = stream.readbits(9);
s.global_gain = stream.readbits(8);
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.mixed_block_flag = 0;
}
s.scalefac_scale = stream.readbits(1);
s.count1table_select = stream.readbits(1);
}
}
return true;
}
private static final byte stab[][][] = {
{ { 6, 5, 5,5 } , { 6, 5, 7,3 } , { 11,10,0,0} ,
{ 7, 7, 7,0 } , { 6, 6, 6,3 } , { 8, 8,5,0} } ,
{ { 9, 9, 9,9 } , { 9, 9,12,6 } , { 18,18,0,0} ,
{12,12,12,0 } , {12, 9, 9,6 } , { 15,12,9,0} } ,
{ { 6, 9, 9,9 } , { 6, 9,12,6 } , { 15,18,0,0} ,
{ 6,15,12,0 } , { 6,12, 9,6 } , { 6,18,9,0} } };
private static int n_slen2[] = new int[512]; /* MPEG 2.0 slen for 'normal' mode */
private static int i_slen2[] = new int[256]; /* MPEG 2.0 slen for intensity stereo */
static {
int i,j,k,l;
for(i=0;i<5;i++) {
for(j=0;j<6;j++) {
for(k=0;k<6;k++) {
int n = k + j * 6 + i * 36;
i_slen2[n] = i|(j<<3)|(k<<6)|(3<<12);
}
}
}
for(i=0;i<4;i++) {
for(j=0;j<4;j++) {
for(k=0;k<4;k++) {
int n = k + j * 4 + i * 16;
i_slen2[n+180] = i|(j<<3)|(k<<6)|(4<<12);
}
}
}
for(i=0;i<4;i++) {
for(j=0;j<3;j++) {
int n = j + i * 3;
i_slen2[n+244] = i|(j<<3) | (5<<12);
n_slen2[n+500] = i|(j<<3) | (2<<12) | (1<<15);
}
}
for(i=0;i<5;i++) {
for(j=0;j<5;j++) {
for(k=0;k<4;k++) {
for(l=0;l<4;l++) {
int n = l + k * 4 + j * 16 + i * 80;
n_slen2[n] = i|(j<<3)|(k<<6)|(l<<9)|(0<<12);
}
}
}
}
for(i=0;i<5;i++) {
for(j=0;j<5;j++) {
for(k=0;k<4;k++) {
int n = k + j * 4 + i * 20;
n_slen2[n+400] = i|(j<<3)|(k<<6)|(1<<12);
}
}
}
}
private final void get_scale_factors_2(final int ch, final int gr)
{
byte[] pnt;
int i,j, k;
int slen;
int n = 0;
int numbits = 0;
int l[] = null;
int s[][] = null;
int scf = 0;
boolean i_stereo = ((header.mode() == Header.JOINT_STEREO) && ((header.mode_extension() & 0x1) != 0));
GRInfo gr_info = (si.ch[ch].gr[gr]);
if(ch == 0){
l = scalefac0L;
s = scalefac0S;
}
else{
l = scalefac1L;
s = scalefac1S;
}
if((ch > 0) && i_stereo) /* i_stereo AND second channel -> do_layer3() checks this */
slen = i_slen2[gr_info.scalefac_compress >> 1];
else
slen = n_slen2[gr_info.scalefac_compress];
gr_info.preflag = (slen >> 15) & 0x1;
n = 0;
if( gr_info.block_type == 2 ) {
n++;
if ((gr_info.mixed_block_flag) != 0) {
// TODO add mixed mode support
System.out.println("mixed mode is unsupported!");
n++;
}
pnt = stab[n][(slen>>12) & 0x7];
for(i = 0; i < 4; i++) {
int num = slen & 0x7;
slen >>= 3;
if(num != 0) {
for(j = 0; j < pnt[i]; j+=3) {
for(k = 0; k < 3; k++) {
s[k][scf] = br.hgetbits(num);
}
scf++;
}
numbits += pnt[i] * num;
}
else {
for(j = 0; j < pnt[i]; j+=3) {
for(k = 0; k < 3; k++) {
s[k][scf] = 0;
}
scf++;
}
}
}
n = (n << 1) + 1;
for(i = 0; i < n; i+=3) {
for(k = 0; k < 3; k++) {
s[k][scf] = 0;
}
scf++;
}
} else {
pnt = stab[n][(slen>>12) & 0x7];
for(i = 0; i < 4; i++) {
int num = slen & 0x7;
slen >>= 3;
if(num != 0) {
for(j = 0; j < pnt[i]; j++) {
l[scf++] = br.hgetbits(num);
}
numbits += pnt[i] * num;
}
else {
for(j = 0; j < pnt[i]; j++)
l[scf++] = 0;
}
}
n = (n << 1) + 1;
for(i = 0; i < n; i++) {
l[scf++] = 0;
}
}
}
private final void get_scale_factors_1(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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -