⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 layeriiidecoder.java

📁 java mp3 player library. for play back mp3 audio
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
                    }
                    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 + -