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

📄 layeriiidecoder.java

📁 java处理声音文件
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
	             si.ch[ch].gr[0].subblock_gain[1] = stream.get_bits(3);
	             si.ch[ch].gr[0].subblock_gain[2] = stream.get_bits(3);
	
	            // Set region_count parameters since they are implicit in this case.
	
	             if (si.ch[ch].gr[0].block_type == 0) {
	                // Side info bad: block_type == 0 in split block
	                return false;
	             } else if (si.ch[ch].gr[0].block_type == 2
	                      && si.ch[ch].gr[0].mixed_block_flag == 0) {
	             	 si.ch[ch].gr[0].region0_count = 8;
					 } else {
	             	 si.ch[ch].gr[0].region0_count = 7;
	                si.ch[ch].gr[0].region1_count = 20 -
	                											si.ch[ch].gr[0].region0_count;
	             }
	
	          } else {
	             si.ch[ch].gr[0].table_select[0] = stream.get_bits(5);
	             si.ch[ch].gr[0].table_select[1] = stream.get_bits(5);
	             si.ch[ch].gr[0].table_select[2] = stream.get_bits(5);
	             si.ch[ch].gr[0].region0_count = stream.get_bits(4);
	             si.ch[ch].gr[0].region1_count = stream.get_bits(3);
	             si.ch[ch].gr[0].block_type = 0;
	          }
	
	          si.ch[ch].gr[0].scalefac_scale = stream.get_bits(1);
	          si.ch[ch].gr[0].count1table_select = stream.get_bits(1);
	      }   // for(ch=0; ch<channels; ch++)
	   } // if (header.version() == MPEG1)
	  return true;	
	}
	
    /**
	 *
	 */
	private void get_scale_factors(int ch, int gr)
	{
	   int sfb, window;
	   gr_info_s gr_info = (si.ch[ch].gr[gr]);
	   int scale_comp   = gr_info.scalefac_compress;
	   int length0      = slen[0][scale_comp];
	   int length1      = slen[1][scale_comp];
	
		if ((gr_info.window_switching_flag != 0) && (gr_info.block_type == 2)) {
			if ((gr_info.mixed_block_flag) != 0) { // MIXED
				for (sfb = 0; sfb < 8; sfb++)
					scalefac[ch].l[sfb] = br.hgetbits(
						  slen[0][gr_info.scalefac_compress]);
				for (sfb = 3; sfb < 6; sfb++)
					for (window=0; window<3; window++)
						scalefac[ch].s[window][sfb] = br.hgetbits(
						  slen[0][gr_info.scalefac_compress]);
				for (sfb = 6; sfb < 12; sfb++)
					for (window=0; window<3; window++)
						scalefac[ch].s[window][sfb] = br.hgetbits(
						  slen[1][gr_info.scalefac_compress]);
				for (sfb=12,window=0; window<3; window++)
					scalefac[ch].s[window][sfb] = 0;
	
	      } else {  // SHORT
	
	         scalefac[ch].s[0][0]  = br.hgetbits(length0);
	         scalefac[ch].s[1][0]  = br.hgetbits(length0);
	         scalefac[ch].s[2][0]  = br.hgetbits(length0);
	         scalefac[ch].s[0][1]  = br.hgetbits(length0);
	         scalefac[ch].s[1][1]  = br.hgetbits(length0);
	         scalefac[ch].s[2][1]  = br.hgetbits(length0);
	         scalefac[ch].s[0][2]  = br.hgetbits(length0);
	         scalefac[ch].s[1][2]  = br.hgetbits(length0);
	         scalefac[ch].s[2][2]  = br.hgetbits(length0);
	         scalefac[ch].s[0][3]  = br.hgetbits(length0);
	         scalefac[ch].s[1][3]  = br.hgetbits(length0);
	         scalefac[ch].s[2][3]  = br.hgetbits(length0);
	         scalefac[ch].s[0][4]  = br.hgetbits(length0);
	         scalefac[ch].s[1][4]  = br.hgetbits(length0);
	         scalefac[ch].s[2][4]  = br.hgetbits(length0);
	         scalefac[ch].s[0][5]  = br.hgetbits(length0);
	         scalefac[ch].s[1][5]  = br.hgetbits(length0);
	         scalefac[ch].s[2][5]  = br.hgetbits(length0);
	         scalefac[ch].s[0][6]  = br.hgetbits(length1);
	         scalefac[ch].s[1][6]  = br.hgetbits(length1);
	         scalefac[ch].s[2][6]  = br.hgetbits(length1);
	         scalefac[ch].s[0][7]  = br.hgetbits(length1);
	         scalefac[ch].s[1][7]  = br.hgetbits(length1);
	         scalefac[ch].s[2][7]  = br.hgetbits(length1);
	         scalefac[ch].s[0][8]  = br.hgetbits(length1);
	         scalefac[ch].s[1][8]  = br.hgetbits(length1);
	         scalefac[ch].s[2][8]  = br.hgetbits(length1);
	         scalefac[ch].s[0][9]  = br.hgetbits(length1);
	         scalefac[ch].s[1][9]  = br.hgetbits(length1);
	         scalefac[ch].s[2][9]  = br.hgetbits(length1);
	         scalefac[ch].s[0][10] = br.hgetbits(length1);
	         scalefac[ch].s[1][10] = br.hgetbits(length1);
	         scalefac[ch].s[2][10] = br.hgetbits(length1);
	         scalefac[ch].s[0][11] = br.hgetbits(length1);
	         scalefac[ch].s[1][11] = br.hgetbits(length1);
	         scalefac[ch].s[2][11] = br.hgetbits(length1);
	         scalefac[ch].s[0][12] = 0;
				scalefac[ch].s[1][12] = 0;
				scalefac[ch].s[2][12] = 0;
			} // SHORT
	
		} else {   // LONG types 0,1,3
	
	      if ((si.ch[ch].scfsi[0] == 0) || (gr == 0)) {
	           scalefac[ch].l[0]  = br.hgetbits(length0);
	           scalefac[ch].l[1]  = br.hgetbits(length0);
	           scalefac[ch].l[2]  = br.hgetbits(length0);
	           scalefac[ch].l[3]  = br.hgetbits(length0);
	           scalefac[ch].l[4]  = br.hgetbits(length0);
	           scalefac[ch].l[5]  = br.hgetbits(length0);
			}
	      if ((si.ch[ch].scfsi[1] == 0) || (gr == 0)) {
	           scalefac[ch].l[6]  = br.hgetbits(length0);
	           scalefac[ch].l[7]  = br.hgetbits(length0);
	           scalefac[ch].l[8]  = br.hgetbits(length0);
	           scalefac[ch].l[9]  = br.hgetbits(length0);
	           scalefac[ch].l[10] = br.hgetbits(length0);
			}
	      if ((si.ch[ch].scfsi[2] == 0) || (gr == 0)) {
	           scalefac[ch].l[11] = br.hgetbits(length1);
	           scalefac[ch].l[12] = br.hgetbits(length1);
	           scalefac[ch].l[13] = br.hgetbits(length1);
	           scalefac[ch].l[14] = br.hgetbits(length1);
	           scalefac[ch].l[15] = br.hgetbits(length1);
			}
	      if ((si.ch[ch].scfsi[3] == 0) || (gr == 0)) {
	           scalefac[ch].l[16] = br.hgetbits(length1);
	           scalefac[ch].l[17] = br.hgetbits(length1);
	           scalefac[ch].l[18] = br.hgetbits(length1);
	           scalefac[ch].l[19] = br.hgetbits(length1);
	           scalefac[ch].l[20] = br.hgetbits(length1);
			}
	
	      scalefac[ch].l[21] = 0;
		  scalefac[ch].l[22] = 0;
		}
	}

    /**
	 *
	 */
	// MDM: new_slen is fully initialized before use, no need
	// to reallocate array.
	private final int[] new_slen = new int[4];
	
	private void get_LSF_scale_data(int ch, int gr)
	{
		
	  	int scalefac_comp, int_scalefac_comp;
	    int mode_ext = header.mode_extension();
		int m;
		int blocktypenumber;
		int blocknumber = 0;
	
		gr_info_s gr_info = (si.ch[ch].gr[gr]);
	
		scalefac_comp =  gr_info.scalefac_compress;
	
	    if (gr_info.block_type == 2) {
	     if (gr_info.mixed_block_flag == 0)
	      	blocktypenumber = 1;
	      else if (gr_info.mixed_block_flag == 1)
				blocktypenumber = 2;
	      else
	      	blocktypenumber = 0;
	    } else {
	   	blocktypenumber = 0;
	    }
	
	   if(!(((mode_ext == 1) || (mode_ext == 3)) && (ch == 1))) {
	
			if(scalefac_comp < 400) {
	
				new_slen[0] = (scalefac_comp >>> 4) / 5 ;
				new_slen[1] = (scalefac_comp >>> 4) % 5 ;
				new_slen[2] = (scalefac_comp & 0xF) >>> 2 ;
				new_slen[3] = (scalefac_comp & 3);
	         	si.ch[ch].gr[gr].preflag = 0;
	         	blocknumber = 0;
	
	       } else if (scalefac_comp  < 500) {
	
				new_slen[0] = ((scalefac_comp - 400) >>> 2) / 5 ;
				new_slen[1] = ((scalefac_comp - 400) >>> 2) % 5 ;
				new_slen[2] = (scalefac_comp - 400 ) & 3 ;
				new_slen[3] = 0;
	         	si.ch[ch].gr[gr].preflag = 0;
	         	blocknumber = 1;
	
		   } else if (scalefac_comp < 512) {
	
				new_slen[0] = (scalefac_comp - 500 ) / 3 ;
				new_slen[1] = (scalefac_comp - 500)  % 3 ;
				new_slen[2] = 0;
				new_slen[3] = 0;
	      		si.ch[ch].gr[gr].preflag = 1;
		      	blocknumber = 2;
	 	   }
	   }
	
	   if((((mode_ext == 1) || (mode_ext == 3)) && (ch == 1)))
	   {
	      int_scalefac_comp = scalefac_comp >>> 1;
	
	      if (int_scalefac_comp < 180)
	      {
				new_slen[0] = int_scalefac_comp  / 36 ;
				new_slen[1] = (int_scalefac_comp % 36 ) / 6 ;
				new_slen[2] = (int_scalefac_comp % 36) % 6;
				new_slen[3] = 0;
	         	si.ch[ch].gr[gr].preflag = 0;
	         	blocknumber = 3;
	      } else if (int_scalefac_comp < 244) {
				new_slen[0] = ((int_scalefac_comp - 180 )  & 0x3F) >>> 4 ;
				new_slen[1] = ((int_scalefac_comp - 180) & 0xF) >>> 2 ;
				new_slen[2] = (int_scalefac_comp - 180 ) & 3 ;
				new_slen[3] = 0;
	         	si.ch[ch].gr[gr].preflag = 0;
	         	blocknumber = 4;
	      } else if (int_scalefac_comp < 255) {
				new_slen[0] = (int_scalefac_comp - 244 ) / 3 ;
				new_slen[1] = (int_scalefac_comp - 244 )  % 3 ;
				new_slen[2] = 0 ;
				new_slen[3] = 0;
	         	si.ch[ch].gr[gr].preflag = 0;
	         	blocknumber = 5;
	      }
	   }
	
	   for (int x=0; x<45; x++) // why 45, not 54?
	   	scalefac_buffer[x] = 0;
	
	   m = 0;
	   for (int i=0; i<4;i++) {
	     	for (int j = 0; j < nr_of_sfb_block[blocknumber][blocktypenumber][i];
	      	 j++)
	      {
	        scalefac_buffer[m] = (new_slen[i] == 0) ? 0 :
	        							  br.hgetbits(new_slen[i]);
	        m++;
	
	      } // for (unint32 j ...
   		} // for (uint32 i ...
	}
	
	/**
	 *
	 */
    private void get_LSF_scale_factors(int ch, int gr)
	{
		int m = 0;
	    int sfb, window;
		gr_info_s gr_info = (si.ch[ch].gr[gr]);
	
	    get_LSF_scale_data(ch, gr);
	
	    if ((gr_info.window_switching_flag != 0) && (gr_info.block_type == 2)) {
	      if (gr_info.mixed_block_flag != 0) { 	// MIXED
	         for (sfb = 0; sfb < 8; sfb++)
	         {
	              scalefac[ch].l[sfb] = scalefac_buffer[m];
	              m++;
	         }
	         for (sfb = 3; sfb < 12; sfb++) {
	            for (window=0; window<3; window++)
	            {
	               scalefac[ch].s[window][sfb] = scalefac_buffer[m];
	               m++;
	            }
	         }
	         for (window=0; window<3; window++)
	            scalefac[ch].s[window][12] = 0;
	
	      } else {  // SHORT
	
	           for (sfb = 0; sfb < 12; sfb++) {
	               for (window=0; window<3; window++)
	               {
	                  scalefac[ch].s[window][sfb] = scalefac_buffer[m];
	                  m++;
	               }
	           }
	
	           for (window=0; window<3; window++)
	               scalefac[ch].s[window][12] = 0;
	      }
	   } else {   // LONG types 0,1,3
	
	      for (sfb = 0; sfb < 21; sfb++) {
	          scalefac[ch].l[sfb] = scalefac_buffer[m];
	          m++;
	      }
	      scalefac[ch].l[21] = 0; // Jeff
	      scalefac[ch].l[22] = 0;
		}
	}
	
	/**
	 *
	 */
    int[] x = {0};
	int[] y = {0};
	int[] v = {0};
	int[] w = {0};
	private void huffman_decode(int ch, int gr)
	{
		x[0] = 0;
		y[0] = 0;
		v[0] = 0;
		w[0] = 0;
		
	   	int part2_3_end = part2_start + si.ch[ch].gr[gr].part2_3_length;
	   	int num_bits;
		int region1Start;
		int region2Start;
	    int index;
	 	huffcodetab h;
	
		// Find region boundary for short block case
	
		if ( ((si.ch[ch].gr[gr].window_switching_flag) != 0) &&
			  (si.ch[ch].gr[gr].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
	
			region1Start = sfBandIndex[sfreq].l[si.ch[ch].gr[gr].region0_count
	                                             + 1];
			region2Start = sfBandIndex[sfreq].l[si.ch[ch].gr[gr].region0_count +
											   si.ch[ch].gr[gr].region1_count + 2]; /* MI */
	   }
	
	   index = 0;
		// Read bigvalues area
		for (int i=0; i<(si.ch[ch].gr[gr].big_values<<1); i+=2) {
			if      (i<region1Start) h = huffcodetab.ht[si.ch[ch].gr[gr].table_select[0]];
			else if (i<region2Start) h = huffcodetab.ht[si.ch[ch].gr[gr].table_select[1]];
				  else                h = huffcodetab.ht[si.ch[ch].gr[gr].table_select[2]];
	
			huffcodetab.huffman_decoder(h, x, y, v, w, br);
	
	      is_1d[index++] = x[0];
	      is_1d[index++] = y[0];
	      CheckSumHuff = CheckSumHuff + x[0] + y[0];
	      // System.out.println("x = "+x[0]+" y = "+y[0]);
		}
	
		// Read count1 area
		h = huffcodetab.ht[si.ch[ch].gr[gr].count1table_select+32];
	    num_bits = br.hsstell();
	
		while ((num_bits < part2_3_end) && (index < 576)) {
	
			huffcodetab.huffman_decoder(h, x, y, v, w, br);
	
	      is_1d[index++] = v[0];
	      is_1d[index++] = w[0];
	      is_1d[index++] = x[0];
	      is_1d[index++] = y[0];
          CheckSumHuff = CheckSumHuff + v[0] + w[0] + x[0] + y[0];
	      // System.out.println("v = "+v[0]+" w = "+w[0]);
	      // System.out.println("x = "+x[0]+" y = "+y[0]);
	      num_bits = br.hsstell();
	   }
	
		if (num_bits > part2_3_end) {
			br.rewindNbits(num_bits - part2_3_end);
	      index-=4;
	   }
	
	   num_bits = br.hsstell();
	
		// Dismiss stuffing bits
		if (num_bits < part2_3_end)
	   	br.hgetbits(part2_3_end - num_bits);
	
		// Zero out rest
	
	   if (index < 576)
		   nonzero[ch] = index;
	   else
	   	nonzero[ch] = 576;
	
	   // may not be necessary
	   for (; index<576; index++)
   		is_1d[index] = 0;
	}
	
	/**

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -