www.pudn.com > av3dec_20050318.zip > polar.c


/* 
*********************************************************************** 
* COPYRIGHT AND WARRANTY INFORMATION 
* 
* Copyright 2004,  Audio Video Coding Standard, Part III 
* 
* This software module was originally developed by 
* edited by 
* 
* DISCLAIMER OF WARRANTY 
* 
* These software programs are available to the users without any 
* license fee or royalty on an "as is" basis. The AVS disclaims 
* any and all warranties, whether express, implied, or statutory, 
* including any implied warranties of merchantability or of fitness 
* for a particular purpose. In no event shall the contributors or  
* the AVS be liable for any incidental, punitive, or consequential 
* damages of any kind whatsoever arising from the use of this program. 
* 
* This disclaimer of warranty extends to the user of this program 
* and user's customers, employees, agents, transferees, successors, 
* and assigns. 
* 
* The AVS does not represent or warrant that the program furnished 
* hereunder are free of infringement of any third-party patents. 
* Commercial implementations of AVS, including shareware, may be 
* subject to royalty fees to patent holders. Information regarding 
* the AVS patent policy is available from the AVS Web site at 
* http://www.avs.org.cn 
* 
* THIS IS NOT A GRANT OF PATENT RIGHTS - SEE THE AVS PATENT POLICY. 
************************************************************************ 
*/ 
 
 
#include "polar.h" 
 
static void decouple_lossless(real_t*	spectrum_pair0,  
							  real_t*	spectrum_pair1,  
							  int		length) 
{ 
    int i; 
 
	for(i = 0; i < length; i++) 
    { 
        double temp; 
        if(spectrum_pair0[i] > 0){ 
            if(spectrum_pair1[i] > 0){ 
                spectrum_pair1[i] = spectrum_pair0[i] - spectrum_pair1[i]; 
            }else{ 
                temp = spectrum_pair1[i]; 
                spectrum_pair1[i] = spectrum_pair0[i]; 
                spectrum_pair0[i] = spectrum_pair0[i] + temp; 
            } 
        }else{ 
            if(spectrum_pair1[i] > 0){ 
                spectrum_pair1[i] = spectrum_pair0[i] + spectrum_pair1[i]; 
            }else{ 
                temp = spectrum_pair1[i]; 
                spectrum_pair1[i] = spectrum_pair0[i]; 
                spectrum_pair0[i] = spectrum_pair0[i] - temp; 
            } 
        } 
    } 
}  
 
void polar_decode(real_t*		l_spec,				  
				  real_t*		r_spec,				 
				  int           ps_present,  
                  int*          ps_used,     
				  int           num_window_groups, 
				  int*          window_group_length, 
				  int*          swb_offset, 
				  int			max_sfb, 
				  int			frame_len)	 
{ 
	int		g;    
	int		b; /*window counter within a group*/ 
	int		sfb;   
	int		win_offset; 
	int		win_short; 
	 
	win_short= frame_len >> 3; 
 
	if( ps_present >= 1){ 
		win_offset = 0; 
		for(g = 0; g < num_window_groups; g++) 
		{ 
			for(b = 0; b < window_group_length[g]; b++) 
			{ 
				for(sfb = 0; sfb < max_sfb; sfb++) 
				{ 
					if(ps_present == 2 || ps_used[g*max_sfb + sfb]) 
 						decouple_lossless(l_spec + win_offset + swb_offset[sfb], 
										  r_spec + win_offset + swb_offset[sfb], 
										  swb_offset[sfb+1] - swb_offset[sfb]);	 
				} 
				win_offset += win_short;				 
			} 
		} 
	} 
}