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;
}
}
}
}