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

📄 layeriiidecoder.java

📁 java处理声音文件
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
	            	int sfbcnt;
						sfbcnt = -1;
						for( sfb=12; sfb >=0; sfb-- )
						{
							temp = sfBandIndex[sfreq].s[sfb];
	                  lines = sfBandIndex[sfreq].s[sfb+1] - temp;
	                  i = (temp << 2) - temp + (j+1) * lines - 1;
	
							while (lines > 0) {
								if (ro[1][i/18][i%18] != 0.0f) {
								// MDM: in java, array access is very slow.
								// Is quicker to compute div and mod values.
								//if (ro[1][ss_div[i]][ss_mod[i]] != 0.0f) {
	                     	sfbcnt = sfb;
									sfb = -10;
									lines = -10;
								}
								lines--;
								i--;
							} // while (lines > 0) */
	
						} // for (sfb=12 ...
						sfb = sfbcnt + 1;
						while(sfb<12) {
							temp = sfBandIndex[sfreq].s[sfb];
	                  sb   = sfBandIndex[sfreq].s[sfb+1] - temp;
	                  i    = (temp << 2) - temp + j * sb;
							for ( ; sb > 0; sb--) {
	                  	is_pos[i] = scalefac[1].s[j][sfb];
								if (is_pos[i] != 7)
		                      if (lsf)
	                           i_stereo_k_values(is_pos[i], io_type, i);
	                         else
	                        	is_ratio[i] = TAN12[is_pos[i]];
								i++;
							} // for (; sb>0 ...
							sfb++;
						} // while (sfb<12)
	
						temp = sfBandIndex[sfreq].s[10];
	               temp2= sfBandIndex[sfreq].s[11];
	               sb   = temp2 - temp;
	               sfb  = (temp << 2) - temp + j * sb;
	               sb   = sfBandIndex[sfreq].s[12] - temp2;
	               i    = (temp2 << 2) - temp2 + j * sb;
	
						for (; sb>0; sb--) {
	               	is_pos[i] = is_pos[sfb];
	
			            if (lsf) {
			               k[0][i] = k[0][sfb];
					         k[1][i] = k[1][sfb];
	      		      } else {
	               		is_ratio[i] = is_ratio[sfb];
	                  }
							i++;
						} // for (; sb>0 ...
					} // for (sfb=12
				} // for (j=0 ...
			} else { // if (gr_info.window_switching_flag ...
	      	i = 31;
				ss = 17;
				sb = 0;
				while (i >= 0) {
	         	if (ro[1][i][ss] != 0.0f) {
	            	sb = (i<<4) + (i<<1) + ss;
						i = -1;
					} else {
	            	ss--;
						if (ss < 0) {
	               	i--;
							ss = 17;
						}
					}
				}
				i = 0;
				while (sfBandIndex[sfreq].l[i] <= sb)
					i++;
	
				sfb = i;
				i = sfBandIndex[sfreq].l[i];
				for (; sfb<21; sfb++) {
	         	sb = sfBandIndex[sfreq].l[sfb+1] - sfBandIndex[sfreq].l[sfb];
	         	for (; sb > 0; sb--) {
	            	is_pos[i] = scalefac[1].l[sfb];
						if (is_pos[i] != 7)
	                  if (lsf)
	                     i_stereo_k_values(is_pos[i], io_type, i);
	                  else
	                   	is_ratio[i] = TAN12[is_pos[i]];
						i++;
					}
				}
				sfb = sfBandIndex[sfreq].l[20];
				for (sb = 576 - sfBandIndex[sfreq].l[21]; (sb > 0) && (i<576); sb--)
				{
	         	is_pos[i] = is_pos[sfb]; // error here : i >=576
	
	            if (lsf) {
	               k[0][i] = k[0][sfb];
			         k[1][i] = k[1][sfb];
	            } else {
	  					is_ratio[i] = is_ratio[sfb];
	            }
					i++;
				} // if (gr_info.mixed_block_flag)
			} // if (gr_info.window_switching_flag ...
		} // if (i_stereo)
	
	   	i = 0;
			for(sb=0;sb<SBLIMIT;sb++)
				for(ss=0;ss<SSLIMIT;ss++) {
					if (is_pos[i] == 7) {
						if (ms_stereo) {
							lr[0][sb][ss] = (ro[0][sb][ss]+ro[1][sb][ss]) * 0.707106781f;
							lr[1][sb][ss] = (ro[0][sb][ss]-ro[1][sb][ss]) * 0.707106781f;
						} else {
							lr[0][sb][ss] = ro[0][sb][ss];
							lr[1][sb][ss] = ro[1][sb][ss];
						}
					}
					else if (i_stereo) {
	
	            	if (lsf) {
	                  lr[0][sb][ss] = ro[0][sb][ss] * k[0][i];
	                  lr[1][sb][ss] = ro[0][sb][ss] * k[1][i];
	               } else {
	               	lr[1][sb][ss] = ro[0][sb][ss] / (float) (1 + is_ratio[i]);
		  				   lr[0][sb][ss] = lr[1][sb][ss] * is_ratio[i];
	               }
					}
	/*				else {
						System.out.println("Error in stereo processing\n");
					} */
	            i++;
				}
	
    	} // channels == 2
	
	}
	
    /**
	 *
	 */
	private void antialias(int ch, int gr)
	{
	   int sb18, ss, sb18lim;
	   gr_info_s gr_info = (si.ch[ch].gr[gr]);
	   // 31 alias-reduction operations between each pair of sub-bands
	   // with 8 butterflies between each pair
	
		if  ((gr_info.window_switching_flag !=0) && (gr_info.block_type == 2) &&
			 !(gr_info.mixed_block_flag != 0) )
	       return;
	
		if ((gr_info.window_switching_flag !=0) && (gr_info.mixed_block_flag != 0)&&
		    (gr_info.block_type == 2)) {
	      sb18lim = 18;
		} else {
			sb18lim = 558;
	   }
	
	   for (sb18=0; sb18 < sb18lim; sb18+=18) {
	      for (ss=0;ss<8;ss++) {
	      	int src_idx1 = sb18 + 17 - ss;
	         int src_idx2 = sb18 + 18 + ss;
	      	float bu = out_1d[src_idx1];
				float bd = out_1d[src_idx2];
				out_1d[src_idx1] = (bu * cs[ss]) - (bd * ca[ss]);
				out_1d[src_idx2] = (bd * cs[ss]) + (bu * ca[ss]);
	      }
   	  }
	}
	
	/**
	 *
	 */
	
	// MDM: tsOutCopy and rawout do not need initializing, so the arrays
	// can be reused. 
	float[] tsOutCopy = new float[18];
	float[] rawout = new float[36];
	
	private void hybrid(int ch, int gr)
	{	   
	   int bt;
	   int sb18;
	   gr_info_s gr_info = (si.ch[ch].gr[gr]);
	   float[] tsOut;
	   
	   float[][] prvblk;
	
	   for(sb18=0;sb18<576;sb18+=18) 
	   {
			bt = ((gr_info.window_switching_flag !=0 ) && (gr_info.mixed_block_flag !=0) &&
					 (sb18 < 36)) ? 0 : gr_info.block_type;
	
		   tsOut = out_1d;
	       // Modif E.B 02/22/99
	       for (int cc = 0;cc<18;cc++) 
			   tsOutCopy[cc] = tsOut[cc+sb18];
	      
		   inv_mdct(tsOutCopy, rawout, bt);
		   
		   
		   for (int cc = 0;cc<18;cc++) 
			   tsOut[cc+sb18] = tsOutCopy[cc];
		   // Fin Modif
	
			// overlap addition
		   prvblk = prevblck;
	
		   tsOut[0 + sb18]   = rawout[0]  + prvblk[ch][sb18 + 0];
		   prvblk[ch][sb18 + 0]  = rawout[18];
		   tsOut[1 + sb18]   = rawout[1]  + prvblk[ch][sb18 + 1];
		   prvblk[ch][sb18 + 1]  = rawout[19];
		   tsOut[2 + sb18]   = rawout[2]  + prvblk[ch][sb18 + 2];
		   prvblk[ch][sb18 + 2]  = rawout[20];
		   tsOut[3 + sb18]   = rawout[3]  + prvblk[ch][sb18 + 3];
		   prvblk[ch][sb18 + 3]  = rawout[21];
		   tsOut[4 + sb18]   = rawout[4]  + prvblk[ch][sb18 + 4];
		   prvblk[ch][sb18 + 4]  = rawout[22];
		   tsOut[5 + sb18]   = rawout[5]  + prvblk[ch][sb18 + 5];
		   prvblk[ch][sb18 + 5]  = rawout[23];
		   tsOut[6 + sb18]   = rawout[6]  + prvblk[ch][sb18 + 6];
		   prvblk[ch][sb18 + 6]  = rawout[24];
		   tsOut[7 + sb18]   = rawout[7]  + prvblk[ch][sb18 + 7];
		   prvblk[ch][sb18 + 7]  = rawout[25];
		   tsOut[8 + sb18]   = rawout[8]  + prvblk[ch][sb18 + 8];
		   prvblk[ch][sb18 + 8]  = rawout[26];
		   tsOut[9 + sb18]   = rawout[9]  + prvblk[ch][sb18 + 9];
		   prvblk[ch][sb18 + 9]  = rawout[27];
	   	   tsOut[10 + sb18]  = rawout[10] + prvblk[ch][sb18 + 10];
	   	   prvblk[ch][sb18 + 10] = rawout[28];
	 	   tsOut[11 + sb18]  = rawout[11] + prvblk[ch][sb18 + 11];
	 	   prvblk[ch][sb18 + 11] = rawout[29];
	 	   tsOut[12 + sb18]  = rawout[12] + prvblk[ch][sb18 + 12];
	 	   prvblk[ch][sb18 + 12] = rawout[30];
	 	   tsOut[13 + sb18]  = rawout[13] + prvblk[ch][sb18 + 13];
	 	   prvblk[ch][sb18 + 13] = rawout[31];
	 	   tsOut[14 + sb18]  = rawout[14] + prvblk[ch][sb18 + 14];
	 	   prvblk[ch][sb18 + 14] = rawout[32];
	 	   tsOut[15 + sb18]  = rawout[15] + prvblk[ch][sb18 + 15];
	 	   prvblk[ch][sb18 + 15] = rawout[33];
	 	   tsOut[16 + sb18]  = rawout[16] + prvblk[ch][sb18 + 16];
	 	   prvblk[ch][sb18 + 16] = rawout[34];
	 	   tsOut[17 + sb18]  = rawout[17] + prvblk[ch][sb18 + 17];
	 	   prvblk[ch][sb18 + 17] = rawout[35];
   	  }
	}
	
    /**
	 *
	 */
	private void do_downmix()
	{
		for (int sb=0; sb<SSLIMIT; sb++) {
	   	for (int ss=0; ss<SSLIMIT; ss+=3) {
	      	lr[0][sb][ss]   = (lr[0][sb][ss]   + lr[1][sb][ss])   * 0.5f;
	      	lr[0][sb][ss+1] = (lr[0][sb][ss+1] + lr[1][sb][ss+1]) * 0.5f;
	      	lr[0][sb][ss+2] = (lr[0][sb][ss+2] + lr[1][sb][ss+2]) * 0.5f;
	      }
   		}
	}
	
	/**
	 * Fast INV_MDCT.
	 */
	
	public void inv_mdct(float[] in, float[] out, int block_type)
	{		 
		 float[] win_bt;
	     int   i;
		 
		float tmpf_0, tmpf_1, tmpf_2, tmpf_3, tmpf_4, tmpf_5, tmpf_6, tmpf_7, tmpf_8, tmpf_9;
		float tmpf_10, tmpf_11, tmpf_12, tmpf_13, tmpf_14, tmpf_15, tmpf_16, tmpf_17;
	  
		tmpf_0 = tmpf_1 = tmpf_2 = tmpf_3 = tmpf_4 = tmpf_5 = tmpf_6 = tmpf_7 = tmpf_8 = tmpf_9 = 
		tmpf_10 = tmpf_11 = tmpf_12 = tmpf_13 = tmpf_14 = tmpf_15 = tmpf_16 = tmpf_17 = 0.0f;
		 
		
		
		 if(block_type == 2)
		 {
			 
	/*
	 *		
	 *		Under MicrosoftVM 2922, This causes a GPF, or
	 *		At best, an ArrayIndexOutOfBoundsExceptin.
			for(int p=0;p<36;p+=9)
		   {
		   	  out[p]   = out[p+1] = out[p+2] = out[p+3] =
		      out[p+4] = out[p+5] = out[p+6] = out[p+7] =
		      out[p+8] = 0.0f;
		   }
	*/		
			out[0] = 0.0f;
			out[1] = 0.0f;
			out[2] = 0.0f;
			out[3] = 0.0f;
			out[4] = 0.0f;
			out[5] = 0.0f;
			out[6] = 0.0f;
			out[7] = 0.0f;
			out[8] = 0.0f;
			out[9] = 0.0f;
			out[10] = 0.0f;
			out[11] = 0.0f;
			out[12] = 0.0f;
			out[13] = 0.0f;
			out[14] = 0.0f;
			out[15] = 0.0f;
			out[16] = 0.0f;
			out[17] = 0.0f;
			out[18] = 0.0f;
			out[19] = 0.0f;
			out[20] = 0.0f;
			out[21] = 0.0f;
			out[22] = 0.0f;
			out[23] = 0.0f;
			out[24] = 0.0f;
			out[25] = 0.0f;
			out[26] = 0.0f;
			out[27] = 0.0f;
			out[28] = 0.0f;
			out[29] = 0.0f;
			out[30] = 0.0f;
			out[31] = 0.0f;
			out[32] = 0.0f;
			out[33] = 0.0f;
			out[34] = 0.0f;
			out[35] = 0.0f;
			 
	       int six_i = 0;
	
		   for(i=0;i<3;i++)
	   	   {
	      		// 12 point IMDCT
	       		// Begin 12 point IDCT
	   			// Input aliasing for 12 pt IDCT
		   		in[15+i] += in[12+i]; in[12+i] += in[9+i]; in[9+i]  +=  in[6+i];
	   			in[6+i]  += in[3+i];  in[3+i]  += in[0+i];
		
		   		// Input aliasing on odd indices (for 6 point IDCT)
	   			in[15+i] += in[9+i];  in[9+i]  += in[3+i];
		
		   		// 3 point IDCT on even indices
		  		float 	pp1, pp2, sum;
		    	pp2 = in[12+i] * 0.500000000f;
		   		pp1 = in[ 6+i] * 0.866025403f;
		   		sum = in[0+i] + pp2;
		   		tmpf_1 = in[0+i] - in[12+i];
		   		tmpf_0 = sum + pp1;
		   		tmpf_2 = sum - pp1;
		
	      		// End 3 point IDCT on even indices
		   		// 3 point IDCT on odd indices (for 6 point IDCT)
		    	pp2 = in[15+i] * 0.500000000f;
	   			pp1 = in[ 9+i] * 0.866025403f;
		   		sum = in[ 3+i] + pp2;
		   		tmpf_4 = in[3+i] - in[15+i];
		   		tmpf_5 = sum + pp1;
		   		tmpf_3 = sum - pp1;
	   	    	// End 3 point IDCT on odd indices
	   			// Twiddle factors on odd indices (for 6 point IDCT)
		
	   			tmpf_3 *= 1.931851653f;
	   			tmpf_4 *= 0.707106781f;
	   			tmpf_5 *= 0.517638090f;
		
		   		// Output butterflies on 2 3 point IDCT's (for 6 point IDCT)
	   			float save = tmpf_0;
	   			tmpf_0 += tmpf_5;
	   			tmpf_5 = save - tmpf_5;
		   		save = tmpf_1;
		   		tmpf_1 += tmpf_4;
		   		tmpf_4 = save - tmpf_4;
		   		save = tmpf_2;
		   		tmpf_2 += tmpf_3;
		   		tmpf_3 = save - tmpf_3;
	
	   			// End 6 point IDCT
		   		// Twiddle factors on indices (for 12 point IDCT)
	
		   		tmpf_0  *=  0.504314480f;
		   		tmpf_1  *=  0.541196100f;
		   		tmpf_2  *=  0.630236207f;
		   		tmpf_3  *=  0.821339815f;
		   		tmpf_4  *=  1.306562965f;
		   		tmpf_5  *=  3.830648788f;
	
	      		// End 12 point IDCT
	
		   		// Shift to 12 point modified IDCT, multiply by window type 2
		   		tmpf_8  = -tmpf_0 * 0.793353340f;

⌨️ 快捷键说明

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