

//#ifdef HAVE_CONFIG_H
#include "config.h"
//#endif

#define AUDIO_DECODER_C

#include "ssc_imdct.h"
#include "audio.h"
#include "ssc_int32.h"
#include "ssc_mode.h"
#include "rc_code.h"
#include "ssc_quant.h"
#include "ssc_pulsealloc.h"
#include "ssc_math.h"
#include "vector_quant.h"
#include "ssc.h"
#include "util.h"

#ifdef ENABLE_VSP

#include "SeamlessBufferManagement.h"




extern short prev_mode_info;
extern short SBM_effect_num;
extern short sbm_current_state;
extern short sbm_internal_count;
#endif


#ifdef SSC_MONOSUM
short ssc_mono_sum_info;
#endif

//#if 1	//hoon_test
#ifndef VC_PROJ
#include <xtensa/tie/xt_hifi2.h>
extern ae_int16 AE_SAT16X4_scalar(ae_int32 d0);
#endif
/**********************************************************************/
/*                                                                    */
/*                             DECODER                                */
/*                                                                    */
/**********************************************************************/

#define DECODE_BUFFER_SIZE 1888 //1024+864
#ifdef FRAME_CNT_ON
int frame_cnt;
#endif

#ifndef KALI_DEBUGGING
short SSC_shared_mem[1728];
#else
short SSC_shared_mem[1728+4];
#endif

short *SSC_restricted_local;


#ifdef HW_REVERSE_HEADROOM
int reverse_head_coef;
#endif

struct SSCCustomDecoder {
   const SSCCustomMode *mode;
  
 //  short channels;  
   short end;
   
   /* Everything beyond this point gets cleared on a reset */
#define DECODER_RESET_START rng
   unsigned int rng;
   short error;
   short postfilter_period;
//   short postfilter_period_old;
   short postfilter_gain;
//   short postfilter_gain_old;

#ifdef PLC_FRAME_20MS
   short plc_burst_cnt;
   short prev_plc;
   short longshort[3];
#endif

   int _decode_mem[1]; /* Size = channels*(DECODE_BUFFER_SIZE+mode->overlap) */
};

#ifdef ENABLE_VSP
//	float set_vsp_speed;
	int set_vsp_speed;
#endif








SSC_CUSTOM_NOSTATIC int ssc_custom_decoder_get_size(const AUDIOMode *mode, int channels)
{
#ifndef PLC_FRAME_20MS
	int size = sizeof(struct AUDIODecoder)
		+ (channels*(DECODE_BUFFER_SIZE+mode->overlap)-1)*sizeof(int)
		+ 3*2*mode->nbEBands*sizeof(short)
		+ 10;
#else
	int size = sizeof(struct AUDIODecoder)
		+ (channels*(DECODE_BUFFER_SIZE+(mode->overlap>>1)))*sizeof(int)
		+ 3*2*mode->nbEBands*sizeof(short)
		+ 864*2*sizeof(int)       // 20ms ´ëÀÀ 864*2ch*2°³frame
		+ 816*2*sizeof(int)       // 20ms ´ëÀÀ 864*2ch*2°³frame
		+ 10;
#endif

	return size;
}

int ssc_decoder_get_size(int channels)
{
   const AUDIOMode *mode = ssc_custom_mode_create(44100, 864, NULL);

   return ssc_custom_decoder_get_size(mode, channels);
}


SSC_CUSTOM_NOSTATIC int ssc_custom_decoder_init(AUDIODecoder *st, const AUDIOMode *mode, int channels)
{
	if (channels < 0 || channels > 2)
		return SSC_BAD_ARG;

	if (st==NULL)
		return SSC_ALLOC_FAIL;

	SSC_CLEAR((char*)st, ssc_custom_decoder_get_size(mode, channels));

#ifdef HW_REVERSE_HEADROOM
	reverse_head_coef = 32768;
#endif

	st->mode = mode;
#ifdef HW_FOR_BOXSLIM
	st->rng = 2796203;
#endif

	st->end = st->mode->nbEBands;

#ifdef PLC_FRAME_20MS
	st->plc_burst_cnt = 0;
	st->prev_plc = 0;
#endif
#ifdef ENABLE_VSP


	  prev_mode_info = 0;

	  SBM_effect_num = 0;
	  sbm_current_state = 0;
	  sbm_internal_count = 0;

	  SBM_Init();
	  SBM_SetPar(SBM_NORMAL_SPEED);                               // pitch, speed
	  set_vsp_speed = 65536;



#endif
	return SSC_OK;
}

int ssc_decoder_init(void *st_void, int channels, int sampling_rate)
{
   int ret;
   AUDIODecoder *st = (AUDIODecoder *)st_void;

   SSC_CLEAR((char*)st, ssc_decoder_get_size(channels));
   ret = ssc_custom_decoder_init(st, ssc_custom_mode_create(sampling_rate, 864, NULL), channels);



#ifdef FRAME_CNT_ON
   frame_cnt = 0;
#endif

   if (ret != SSC_OK)
      return ret;

   return SSC_OK;
}

#ifndef KHW_OPTI_HIFI
static SSC_INLINE short SIG2WORD16(int x)
{

   x = SSC_PSHR32(x, SIG_SHIFT);

#ifdef FOR_VISUAL_C_NO_ASSM
//#if 0	//hoon_test
#ifdef VC_PROJ
   x = MAX32(x, -32768);
   x = MIN32(x, 32767);
#else
   x = AE_SAT16X4_scalar(x);
#endif
#else
   x = __ssat(x,16);
#endif

   return SSC_toSHORT(x);
}
#endif

void deemphasis(int *in[], short *pcm, int N)
{
		int j;

		short  * y;


		int * x1;
		int * x2;

		x1 =in[0];
		x2 =in[1];
		y = pcm;

		for (j=N;j!=0;j--)	
		{
#ifndef KHW_OPTI_HIFI
			int tmp = (*x1++);

			*y++ = SCALEOUT(SIG2WORD16(tmp));
			tmp = *x2++;
			*y++ = SCALEOUT(SIG2WORD16(tmp));
#else
			*y++ = AE_SAT16X4_scalar(SSC_PSHR32((*x1++), SIG_SHIFT));
			*y++ = AE_SAT16X4_scalar(SSC_PSHR32((*x2++), SIG_SHIFT));
#endif
		}
}

void deemphasis_mono(int *x1, short *pcm, int N)
{
	int j;
	short  * y;

	y = pcm;

	for (j=N;j!=0;j--)	
	{
#ifndef KHW_OPTI_HIFI
		int tmp = (*x1++);
		*y++ = SCALEOUT(SIG2WORD16(tmp));
#else
		*y++ = AE_SAT16X4_scalar(SSC_PSHR32((*x1++), SIG_SHIFT));
#endif
	}
}



void compute_inv_mdcts_one(const AUDIOMode *mode, int shortBlocks, int *X, int * out_mem[],int tmp)
{
	//   int c;
	int B;
	int N;
	int shift;
	const int overlap = OVERLAP(mode);

	if (shortBlocks)
	{
		B = 8;
		shift = 3;

		N = mode->shortMdctSize;
		clt_mdct_backward(mode->kfft[1], &X[0], out_mem[tmp], mode->window, overlap, shift, B);
		clt_mdct_backward(mode->kfft[1], &X[1], out_mem[tmp]+N, mode->window, overlap, shift, B);
		clt_mdct_backward(mode->kfft[1], &X[2], out_mem[tmp]+N*2, mode->window, overlap, shift, B);
		clt_mdct_backward(mode->kfft[1], &X[3], out_mem[tmp]+N*3, mode->window, overlap, shift, B);
		clt_mdct_backward(mode->kfft[1], &X[4], out_mem[tmp]+N*4, mode->window, overlap, shift, B);
		clt_mdct_backward(mode->kfft[1], &X[5], out_mem[tmp]+N*5, mode->window, overlap, shift, B);
		clt_mdct_backward(mode->kfft[1], &X[6], out_mem[tmp]+N*6, mode->window, overlap, shift, B);
		clt_mdct_backward(mode->kfft[1], &X[7], out_mem[tmp]+N*7, mode->window, overlap, shift, B);	
	} else {
		N = 864;
		shift = 0;
		clt_mdct_backward(mode->kfft[0], &X[0], out_mem[tmp], mode->window, overlap, shift, 1);
	}
}




static void tf_decode(short end, int isTransient, short *tf_res, ec_dec *dec)
{
   int i, curr, tf_select;
   int tf_select_rsv;
   int tf_changed;
   int logp;
   unsigned int budget;
   unsigned int tell;

   budget = dec->storage*8;
   tell = ec_tell(dec);
   logp = isTransient ? 2 : 4;

   tf_select_rsv = tell+logp+1<=budget;

   budget -= tf_select_rsv;
   tf_changed = curr = 0;

   for (i=0;i<end;i++)
   {
      if (tell+logp<=budget)
      {
         curr ^= rc_decode_logp_bit(dec, logp);
         tell = ec_tell(dec);
         tf_changed |= curr;
      }
      tf_res[i] = (short)curr;
      logp = isTransient ? 4 : 5;
   }
   tf_select = 0;


   if (tf_select_rsv &&
	   tf_select_table[(isTransient<<2)+tf_changed] !=
	   tf_select_table[(isTransient<<2)+2+tf_changed])
   {
      tf_select = rc_decode_logp_bit(dec, 1);
   }

   for (i=0;i<end;i++)
   {
	  tf_res[i] = tf_select_table[(isTransient<<2)+2*tf_select+tf_res[i]];
   }
}

static const short cache_caps50[22] = {	
	1072,1072,1072,1072,1072,1072,1072,1072,2120,2120,2120,2120,4192,4192,4192,6024,6024,7648,9792,9792,9792,9360,
};



#ifdef PLC_FRAME_20MS




static void plc_proc_short(int frame_size,int *freq, SSCDecoder *st,short inv, short plc_gain)
{
	short i,j;
	int frame_size_2ch = frame_size<<1;

	short B=8;    // 20msÀÏ¶§´Â 8
	short overlap = st->mode->overlap;

	short local_count = 0;


	short sign_l = 0;
	short sign_r = 0;
	short end_band = st->mode->eBands[22];

	int energy_l[8];
	int energy_r[8];

	int *l_rand = st->_decode_mem+512;
	int *r_rand = st->_decode_mem+1970+512;


	short gain_index[7] = {0,2,4,6,8,10,12};




#ifndef HW_BURST_BUG
	short tmp_idx = gain_index[ MIN32(st->plc_burst_cnt,6) ];
#else
	short burst_count = MIN32(st->plc_burst_cnt,6);
	short tmp_idx = gain_index[burst_count];
#endif

	if(inv == 0)
	{
		plc_gain = MAX32(2048,plc_gain - (tmp_idx<<12));
	}


	for(i = 0 ; i<B ; i++)
	{
		energy_l[i] = 0;
		energy_r[i] = 0;
		for(j = 0; j<end_band; j++)
		{
			energy_l[i] = energy_l[i] + ABS32(freq[(j*B) + i]);
			energy_r[i] = energy_r[i] + ABS32(freq[(j*B) + i+frame_size]);
		}
#ifndef HW_BURST_BUG
		energy_l[i] = (energy_l[i]*2*st->plc_burst_cnt)/(end_band*12);
		energy_r[i] = (energy_r[i]*2*st->plc_burst_cnt)/(end_band*12);
#else
		energy_l[i] = (energy_l[i]*2*burst_count)/(end_band*12);
		energy_r[i] = (energy_r[i]*2*burst_count)/(end_band*12);
#endif
	}

	if(inv != 0)
	{
		for(i = 0 ; i<B ; i++)
		{
			for(j = 0; j<end_band; j++)
			{
				freq[(j*B) + i] = SSC_MULT16x32_Q15(plc_gain, (freq[(j*B) + i] ));
				freq[(j*B) + i + frame_size] = SSC_MULT16x32_Q15(plc_gain, (freq[(j*B) + i +frame_size])      );
			}
		}
	}
	else
	{
		if(st->plc_burst_cnt>0)
		{
			for(i = 0 ; i<B ; i++)
			{
			
				plc_gain = MAX32(1024,plc_gain-(i*256));



				for(j = 0; j<end_band; j++)
				{
					sign_l = ((l_rand[i*B+j])&1);
					sign_l = (sign_l*2)-1;

					sign_r = ((r_rand[i*B+j])&1);
					sign_r = (sign_r*2)-1;

					freq[(j*B) + i] = SSC_MULT16x32_Q15(plc_gain, ((freq[(j*B) + i]*sign_l) + (energy_l[i]*sign_r))    );
					freq[(j*B) + i + frame_size] = SSC_MULT16x32_Q15(plc_gain, ((freq[(j*B) + i +frame_size]*sign_r)+ (energy_r[i]*sign_l))      );
				}
			}
		}
		else
		{
			for(i = 0 ; i<B ; i++)
			{

			
				plc_gain = MAX32(1024,plc_gain-(i*256));

				for(j = 0; j<end_band; j++)
				{
					sign_l = ((l_rand[i*B+j])&1);
					sign_l = (sign_l*2)-1;

					sign_r = ((r_rand[i*B+j])&1);
					sign_r = (sign_r*2)-1;

					freq[(j*B) + i] = SSC_MULT16x32_Q15(plc_gain, (freq[(j*B) + i] + (energy_l[i]*sign_l))    );
					freq[(j*B) + i + frame_size] = SSC_MULT16x32_Q15(plc_gain, (freq[(j*B) + i +frame_size]+ (energy_r[i]*sign_r))      );
				}
			}
		}
	}




	if(st->longshort[1]>0 && st->plc_burst_cnt == 0)
	{
		for(i = 0; i<(end_band*B); i++)
		{
#ifndef HW_BUG_MULTIPLE
			freq[i] = (freq[i]+freq[i+(frame_size*2)])>>1;
			freq[i+frame_size] = (freq[i+frame_size]+freq[i+(frame_size*3)])>>1;
#else
			freq[i] = SSC_MULT16x32_Q15(23170,(freq[i]+freq[i+(frame_size*2)]));
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//		freq[i+frame_size] = MULT16_32_Q15(23170,(freq[i+frame_size]+freq[i+(frame_size*3)]));
			freq[i+frame_size] = SSC_MULT16x32_Q15(23170,(freq[i+frame_size]+freq[i+(frame_size<<1)+(end_band*B)]));
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#endif
		}
	}



}

static void plc_proc_long_zero(int frame_size,int *freq, SSCDecoder *st, short t_gain)      // index = 0 ¸ðµÎ 0,  index = 1 ÀÏ¶§´Â 
{
	short i;
	short end_band = (st->mode->eBands[22]<<3);

	int energy_l = 0;
	int energy_r = 0;

	int *l_rand = st->_decode_mem+512;
	int *r_rand = st->_decode_mem+1970;

	int *plc_freq = freq + (frame_size<<1);


	short sign_l = 0;
	short sign_r = 0; 

	short gain_index[7] = {0,1,2,4,5,8,9};

#ifndef HW_BURST_BUG
	short tmp_idx = gain_index[ MIN32(st->plc_burst_cnt,6) ];
#else
	short burst_count = MIN32(st->plc_burst_cnt,6);
	short tmp_idx = gain_index[burst_count];
#endif







	t_gain = MAX32(2048,t_gain - (tmp_idx<<12));


	for(i=0; i<end_band; i++)
	{
//		energy_l = energy_l + ABS32((( freq[i]+freq[i+frame_size*2])>>1));
//		energy_r = energy_r + ABS32( ((freq[i+frame_size]+freq[i+frame_size*3])>>1));
#ifndef HW_BUG_MULTIPLE
		energy_l = energy_l + ABS32((( freq[i]+plc_freq[i])>>1));
		energy_r = energy_r + ABS32( ((freq[i+frame_size]+plc_freq[i+end_band])>>1));
#else
		energy_l = energy_l + ((ABS32(freq[i])+ABS32(plc_freq[i]))>>1);
		energy_r = energy_r + ((ABS32(freq[i+frame_size])+ABS32(plc_freq[i+end_band]))>>1);
#endif
	}





#ifndef HW_BURST_BUG
	energy_l = (energy_l*(st->plc_burst_cnt))/(end_band*8);
	energy_r = (energy_r*(st->plc_burst_cnt))/(end_band*8);
#else
	energy_l = (energy_l*(burst_count))/(end_band*8);
	energy_r = (energy_r*(burst_count))/(end_band*8);

#endif


	if(st->plc_burst_cnt>1)
	{
		for(i=0; i<end_band; i++)
		{
			sign_l = ((l_rand[i])&1);
			sign_l = (sign_l<<1)-1;

			sign_r = ((r_rand[i])&1);
			sign_r = (sign_r<<1)-1;

//			freq[i] = SSC_MULT16x32_Q15(t_gain, (((ABS32(freq[i])+ABS32(freq[i+(frame_size<<1)]))>>1)*sign_l)+(energy_l*sign_r) ) ;
//			freq[i+frame_size] = SSC_MULT16x32_Q15(t_gain, (((ABS32(freq[i+frame_size])+ABS32(freq[i+frame_size*3]))>>1)*sign_r)+(energy_r*sign_l) );
			freq[i] = SSC_MULT16x32_Q15(t_gain, (((ABS32(freq[i])+ABS32(plc_freq[i]))>>1)*sign_l)+(energy_l*sign_r) ) ;
			freq[i+frame_size] = SSC_MULT16x32_Q15(t_gain, (((ABS32(freq[i+frame_size])+ABS32(plc_freq[i+end_band]))>>1)*sign_r)+(energy_r*sign_l) );
		}
	}
	else
	{
		for(i=0; i<end_band; i++)
		{
			sign_l = ((l_rand[i])&1);
			sign_l = (sign_l<<1)-1;

			sign_r = ((l_rand[i])&1);
			sign_r = (sign_l<<1)-1;

	//		freq[i] = SSC_MULT16x32_Q15(t_gain, ((freq[i]+freq[i+(frame_size<<1)])>>1)+(energy_l*sign_l) ) ;
	//		freq[i+frame_size] = SSC_MULT16x32_Q15(t_gain, ((freq[i+frame_size]+freq[i+frame_size*3])>>1)+(energy_r*sign_r) );
#ifndef HW_BUG_MULTIPLE
			freq[i] = SSC_MULT16x32_Q15(t_gain, ((freq[i]+plc_freq[i])>>1)+(energy_l*sign_l) ) ;
			freq[i+frame_size] = SSC_MULT16x32_Q15(t_gain, ((freq[i+frame_size]+plc_freq[i+end_band])>>1)+(energy_r*sign_r) );
#else
			freq[i] = SSC_MULT16x32_Q15(t_gain, SSC_MULT16x32_Q15(23170,(freq[i]+plc_freq[i]))+(energy_l*sign_l) ) ;
			freq[i+frame_size] = SSC_MULT16x32_Q15(t_gain, SSC_MULT16x32_Q15(23170,(freq[i+frame_size]+plc_freq[i+end_band]))+(energy_r*sign_r) );
#endif
		}
	}


}


static void plc_proc_long_one(int frame_size,int *freq, SSCDecoder *st,short t_gain,short inv)     //  index = 1 ÀÏ¶§´Â ¾Õ¿¡ ÇÏ³ª°¡Áö°í¸¸,
{


	short i;
	short end_band = (st->mode->eBands[22]<<3);

	int energy_l = 0;
	int energy_r = 0;
	int *l_rand = st->_decode_mem+512;  
	int *r_rand = st->_decode_mem+1970+512;
	short sign_l = 0;
	short sign_r = 0;

	short gain_index[7] = {0,2,4,6,7,8,9};

#ifndef HW_BURST_BUG
	short tmp_idx = gain_index[ (MIN32(st->plc_burst_cnt,6)) ];
#else
	short burst_count = MIN32(st->plc_burst_cnt,6);
	short tmp_idx = gain_index[burst_count];
#endif

	if(inv == 0)
	{
		t_gain = (MAX32(2048,t_gain - (tmp_idx<<12)));
	}





	for(i=0; i<end_band; i++)
	{
		energy_l = energy_l + (ABS32((freq[i])));
		energy_r = energy_r + (ABS32( (freq[i+frame_size])));
	}

#ifndef HW_BURST_BUG
	energy_l = (energy_l*(st->plc_burst_cnt))/(end_band<<3);
	energy_r = (energy_r*(st->plc_burst_cnt))/(end_band<<3);
#else
	energy_l = (energy_l*(burst_count))/(end_band<<3);
	energy_r = (energy_r*(burst_count))/(end_band<<3);
#endif

//	printf("\n");
//	printf("t_gain = %d, energy_l = %d, energy_r = %d\n",t_gain,energy_l,energy_r);



	if(inv != 0)
	{
		for(i=0; i<end_band; i++)
		{
			freq[i] = SSC_MULT16x32_Q15(t_gain,freq[i]);
			freq[i+frame_size] = SSC_MULT16x32_Q15(t_gain,freq[i+frame_size]);
		}
	}
	else
	{
		if(st->plc_burst_cnt>0)
		{
			for(i=0; i<end_band; i++)
			{
				sign_l = ((l_rand[i])&1);
				sign_l = (sign_l<<1)-1;

				sign_r = ((r_rand[i])&1);
				sign_r = (sign_r<<1)-1;

				freq[i] = SSC_MULT16x32_Q15(t_gain,(freq[i]*sign_l)+(energy_l*sign_r));
				freq[i+frame_size] = SSC_MULT16x32_Q15(t_gain,(freq[i+frame_size]*sign_r)+(energy_r*sign_l));
			}
		}
		else
		{
			for(i=0; i<end_band; i++)
			{
				sign_l = ((l_rand[i])&1);
				sign_l = (sign_l<<1)-1;

				sign_r = ((r_rand[i])&1);
				sign_r = (sign_r<<1)-1;

				freq[i] = SSC_MULT16x32_Q15(t_gain,freq[i]+(energy_l*sign_l));
				freq[i+frame_size] = SSC_MULT16x32_Q15(t_gain,freq[i+frame_size]+(energy_r*sign_r));
			}
		}
	}
}

#endif








//int ssc_decode(void *st_void, const unsigned char *data, short *pcm, int frame_size, short plc_on, float speed)
#ifndef SSC_MONOSUM
int ssc_decode(void *st_void, const unsigned char *data, short *pcm, int frame_size, short plc_on)
#else
int ssc_decode(void *st_void, const unsigned char *data, short *pcm, int frame_size, short plc_on, short decoding_channel)
#endif
{
   int i,N;
   int spread_decision;
   int bits;
   ec_dec _dec;
   int *freq;
   SSCDecoder *st = (SSCDecoder *)st_void;

   short *X = SSC_shared_mem; 

//////////////////////////// 1452 ~ 1539  /////////////////////
   short *fine_quant;
   short *pulses;
   short *fine_priority;
   short *tf_res;
///////////////////////////////////////////////////////


   const short *cap;
//////////////////////////// 0 ~  21 /////////////////////
   short *offsets; // = shared_local;			//nbEBands
//////////////////////////////////////////////////////////
   unsigned char collapse_masks[44];
   int *decode_mem[2];
   int *out_syn[2];
   short *oldBandE, *oldLogE, *oldLogE2;

   int shortBlocks;
   int isTransient;
   int intra_ener;
   int LM, M;
   int effEnd;
   int codedBands;
   int alloc_trim;
   short postfilter_pitch;
   short postfilter_gain;

   int intensity=0;
   int dual_stereo=0;
   int total_bits;
   int balance;
   int tell;
   int dynalloc_logp;

   int anti_collapse_rsv;
   int anti_collapse_on=0;
   int silence;

//   int C = st->channels;
   const SSCCustomMode *mode;
   short nbEBands;
   short overlap;
   const short *eBands;

   ec_dec *dec;

#ifdef HW_FULL_MANDA
   int hw_tmp;
#endif
   int len;
   int bitrate;
   int offset = 4;	// reserved for header(1) and sync byte(2) and count(1)

#ifdef HW_EXTENDS
   int extend_flag;
#endif
   

#ifdef PLC_FRAME_20MS
   int *plc_freq;
#endif

#ifdef SSC_MONOSUM
	ssc_mono_sum_info = decoding_channel;
#endif
/////////////////////////////////////////////////////
 //  X_pointer = X;
////////////////////////////////////////////////////

   N = 864;

/*
   for(i=0;i<484;i++)
   {
	   printf("data[%d]=%d\n",i,data[i]);
   }
*/

   mode = st->mode;
   nbEBands = mode->nbEBands;
   overlap = mode->overlap;
   eBands = mode->eBands;




   


   decode_mem[0] = st->_decode_mem;
 //  printf("pointer decode_mem[0] = %d\n",decode_mem[0]);

   decode_mem[1] = st->_decode_mem + 1942; 
 //  printf("pointer decode_mem[1] = %d\n", decode_mem[1]);

//   oldBandE = (short*)(st->_decode_mem+3992); 
   oldBandE = (short*)(st->_decode_mem+3884); 
//   printf("pointer oldBandE = %d\n", oldBandE);


   oldLogE = oldBandE + 2*nbEBands;
//   printf("pointer oldLogE = %d\n", oldLogE);
   oldLogE2 = oldLogE + 2*nbEBands;
//   printf("pointer oldLogE2 = %d\n", oldLogE2);



#ifdef  PLC_FRAME_20MS
   freq = (int *)(oldLogE2 + 2*nbEBands);  // ²À °ýÈ£ ÇØÁÖ¾î¾ß ÇÑ´Ù. ¾ÈÇÏ¸é int* ·Î 4byte¾¿ ¶Ú´Ù.

//   printf("pointer freq = %d\n",freq);

   plc_freq = freq+(frame_size*2);

 //  printf("pointer plc_freq = %d\n",plc_freq);

   SSC_restricted_local = (short *)freq;
   offsets = SSC_restricted_local;

   //////////////////////////// 1452 ~ 1539  /////////////////////
   fine_quant = &(SSC_restricted_local[1452]);
   pulses = fine_quant+22;
   fine_priority = fine_quant+44;
   tf_res = fine_quant+66;
   ///////////////////////////////////////////////////////


   if(plc_on == 1)
   {
	   postfilter_gain = 0;
	   postfilter_pitch = 0;
	   st->mode = ssc_custom_mode_create(44100, frame_size, NULL);

	   dec = &_dec;



 
 //  if(dec->buf[-2] == 0)
/*
   {
	   printf("\n");
	   printf("first\n");

	   for(i=0;i<1728;i++)
	   {
		     printf("freq[%d] = %d\n",i,freq[i]);
	   }
	   printf("end first\n");
   }
*/


#ifndef HW_BURST_BUG
	   if(st->longshort[0]>0)
#else
	   if(st->plc_burst_cnt>30)
	   {
		   short i;
		   for(i=0;i<1728; i++)
		   {
			   freq[i] = 0;
		   }
	   }
	   else if(st->longshort[0]>0)
#endif
	   {
		   plc_proc_short(frame_size,freq,st,0,29456 );  // Á÷Àü FrameÀÌ shortÀÎ°æ¿ì´Â ¹«Á¶°Ç
		   shortBlocks = 8;
	//	   plc_proc_long_one(frame_size,freq,st,28476,0);
	//	   shortBlocks = 0;
		   if(st->plc_burst_cnt>1)
		   {
			   st->longshort[0] = 0;
		   }

	   }
	   else if(st->longshort[1] > 0)
	   {	  
		   plc_proc_long_one(frame_size,freq,st,30476,0);    // Á÷Àü frameÀÌ long, ±× Àü¿£ short
		    shortBlocks = 0;
	   }
	   else
	   {
/*
			 for(i=0;i<1632;i++)
			 {
			 		printf("plc_freq[%d]=%d\n",i,plc_freq[i]);
			 }
*/
		    plc_proc_long_zero(frame_size,freq,st,31476);   // Á÷Àü frameÀÌ long, ±× Àü¿£ short, Á÷Àüµµ ±× ÀÌÀüµµ ¸ðµÎ long // 31476
	//	    plc_proc_long_one(frame_size,freq,st,28476,0);
			shortBlocks = 0;
/*
			 for(i=0;i<1728;i++)
			 {
				 printf("freq[%d]=%d\n",i,freq[i]);
			 }
*/

	   }


	//   if(dec->buf[-2] == 0)
/*
	   {
		   printf("\n");
		   printf("second\n");

		   for(i=0;i<1728;i++)
		   {
			   printf("freq[%d] = %d\n",i,freq[i]);
		   }
		   printf("end second\n");
	   }
*/

	   st->plc_burst_cnt++;
	   st->prev_plc = 1;
	   goto HW_PLC_LOC;
   }

#endif



#ifdef HW_EXTENDS
   extend_flag = (data[3]>>2)&2;
#endif

   st->mode = ssc_custom_mode_create(44100, 864, NULL);

#ifndef HW_EXTENDS
   switch (data[3])
#else
   switch (data[3]&0xf7)
#endif
   {
   case 0xF0:
	   bitrate = 88000;
	   break;
   case 0xF1:
	   bitrate = 96000;
	   break;
   case 0xF2:
	   bitrate = 128000;
	   break;
   case 0xF3:
	   bitrate = 192000;
	   break;

   default:
	   bitrate = 128000;
	   break;
   }


   /////// SAMPLING RATE  ///////////////////////
   len = bitrate*108/44100;
   //////////////////////////////////////////////

#ifdef HW_FULL_MANDA
   hw_tmp = (len*3)>>7;
   len = hw_tmp+len;
#endif


#ifdef HW_AIROHA_BYTE
   len = len+((len & 1)^1);   // ´õÇÏ±â¸¦ ÇÒÁö »©±â¸¦ ÇÒÁö °áÁ¤ÇØ¾ß ÇÔ.
#endif

   dec = &_dec;
   data += offset;
#ifdef HW_EXTENDS
   data += extend_flag;
#endif

   len = len - offset;
   len = len+3;
   rc_dec_init(dec,(unsigned char*)data,len);

/*
   if(dec->buf[-2] == 0)
   {
	   printf("after [rc_dec_init]\n");
	   printf("storage = %d\n",dec->storage);
	   printf("end_offs = %d\n",dec->end_offs);
	   printf("end_window = %d\n",dec->end_window);
	   printf("nend_bits = %d\n",dec->nend_bits);
	   printf("nbits_total = %d\n",dec->nbits_total);
	   printf("offs = %d\n",dec->offs);
	   printf("rng = %d\n",dec->rng);
	   printf("val = %d\n",dec->val);
	   printf("ext = %d\n",dec->ext);
	   printf("rem = %d\n",dec->rem);
	   printf("error = %d\n",dec->error);
   }
*/


   LM = 3;
   M=1<<LM;






   if (pcm==NULL)
	   return SSC_BAD_ARG;



   total_bits = len<<3;
   tell = ec_tell(dec);
   effEnd = st->end;

   if (tell >= total_bits)
      silence = 1;
   else if (tell==1)
      silence = rc_decode_logp_bit(dec, 15);
   else
      silence = 0;

  /*
   if(dec->buf[-2] == 0)
   {
	   printf("\n after [silence decoding]\n");
	   printf("storage = %d\n",dec->storage);
	   printf("end_offs = %d\n",dec->end_offs);
	   printf("end_window = %d\n",dec->end_window);
	   printf("nend_bits = %d\n",dec->nend_bits);
	   printf("nbits_total = %d\n",dec->nbits_total);
	   printf("offs = %d\n",dec->offs);
	   printf("rng = %d\n",dec->rng);
	   printf("val = %d\n",dec->val);
	   printf("ext = %d\n",dec->ext);
	   printf("rem = %d\n",dec->rem);
	   printf("error = %d\n",dec->error);
   }
*/


   if (silence)
   {

	  tell = len<<3;
      dec->nbits_total+=tell-ec_tell(dec);
   }

   postfilter_gain = 0;
   postfilter_pitch = 0;

   ////////////////////////////////////////////
	if (total_bits-tell >= 16)
	{
		if (rc_decode_logp_bit(dec, 1))
		{
			int tmp;
			tmp = rc_decode_uint(dec, 6);
			postfilter_pitch = (16 << tmp) + ec_dec_bits(dec, 4 + tmp) - 1;
			tmp = ec_dec_bits(dec, 3);
			postfilter_gain = 3072 * (tmp + 1);
		}
		tell = ec_tell(dec);
	}
	////////////////////////////////////////////////////////
/*
	if(dec->buf[-2] == 0)
	{
		printf("\n after [pitch_decoding]\n");
		printf("storage = %d\n",dec->storage);
		printf("end_offs = %d\n",dec->end_offs);
		printf("end_window = %d\n",dec->end_window);
		printf("nend_bits = %d\n",dec->nend_bits);
		printf("nbits_total = %d\n",dec->nbits_total);
		printf("offs = %d\n",dec->offs);
		printf("rng = %d\n",dec->rng);
		printf("val = %d\n",dec->val);
		printf("ext = %d\n",dec->ext);
		printf("rem = %d\n",dec->rem);
		printf("error = %d\n",dec->error);
	}
*/

	/////////////////////////////////////////////////////////
	if (total_bits-tell >= 3)
   {
      isTransient = rc_decode_logp_bit(dec, 3);
      tell = ec_tell(dec);
	  intra_ener = rc_decode_logp_bit(dec, 3);
   }
	else
	{
		isTransient = 0;
		intra_ener = 0;
	}

   shortBlocks = isTransient ? M : 0;


/*
   if(dec->buf[-2] == 0)
   {
	   printf("\n before [SSC_COPY32_merge]\n");
	   printf("storage = %d\n",dec->storage);
	   printf("end_offs = %d\n",dec->end_offs);
	   printf("end_window = %d\n",dec->end_window);
	   printf("nend_bits = %d\n",dec->nend_bits);
	   printf("nbits_total = %d\n",dec->nbits_total);
	   printf("offs = %d\n",dec->offs);
	   printf("rng = %d\n",dec->rng);
	   printf("val = %d\n",dec->val);
	   printf("ext = %d\n",dec->ext);
	   printf("rem = %d\n",dec->rem);
	   printf("error = %d\n",dec->error);
   }
*/
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
#ifdef PLC_FRAME_20MS
   st->plc_burst_cnt = 0;

   st->longshort[2] = st->longshort[1];
   st->longshort[1] = st->longshort[0];
   st->longshort[0] = shortBlocks;


///////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////  PLC ÇÒ¶§ ¼öÁ¤ ÇÊ¿ä //////////////////////////////////////////////

#ifndef SSC_MONOSUM_SCALABLE  
  SSC_COPY32_merge(plc_freq, freq,plc_freq+(eBands[22]<<3), freq+N, eBands[22]<<3);  /////////////////////
#else
   if(decoding_channel == 0)
   {
	   SSC_COPY32(plc_freq, freq, eBands[22]<<3);
	   SSC_CLEAR_int(plc_freq+(eBands[22]<<3), eBands[22]<<3);
   }
   else if(decoding_channel == 1)
   {
	   SSC_CLEAR_int(plc_freq, eBands[22]<<3);
	   SSC_COPY32(plc_freq+(eBands[22]<<3), freq+N, eBands[22]<<3);
   }
   else
   {
	   SSC_COPY32(plc_freq, freq, eBands[22]<<3);
	   SSC_COPY32(plc_freq+(eBands[22]<<3), freq+N, eBands[22]<<3);
   }
#endif






///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////

#endif
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
/*
   if(dec->buf[-2] == 0)
   {
	   printf("\n after [SSC_COPY32_merge]\n");
	   printf("storage = %d\n",dec->storage);
	   printf("end_offs = %d\n",dec->end_offs);
	   printf("end_window = %d\n",dec->end_window);
	   printf("nend_bits = %d\n",dec->nend_bits);
	   printf("nbits_total = %d\n",dec->nbits_total);
	   printf("offs = %d\n",dec->offs);
	   printf("rng = %d\n",dec->rng);
	   printf("val = %d\n",dec->val);
	   printf("ext = %d\n",dec->ext);
	   printf("rem = %d\n",dec->rem);
	   printf("error = %d\n",dec->error);
   }
*/

   unquant_coarse_energy(mode, st->end, oldBandE,intra_ener, dec);
   tf_decode(st->end, isTransient, tf_res, dec);

   tell = ec_tell(dec);
   spread_decision = Default_SPR;

   if (total_bits-tell >= 4)
      spread_decision = rc_decode_cdf(dec, spread_icdf, 5);

   total_bits = total_bits<<3;
   tell = ec_tell_frac(dec);
   cap = cache_caps50;
   dynalloc_logp = 6;

   i = 0;
   do
   {
      short width, quanta;
      short boost;
	  int dynalloc_loop_logp = dynalloc_logp;

      width = (eBands[i+1]-eBands[i])<<(LM+1);
	  quanta = (48 > width) ? 48 : width;

      boost = 0;
      while (tell+(dynalloc_loop_logp<<3) < total_bits && boost < cap[i])
	  {
         int flag;
         flag = rc_decode_logp_bit(dec, dynalloc_loop_logp);
         tell = ec_tell_frac(dec);
         if (!flag)
            break;
         boost = boost + quanta;
         total_bits = total_bits - quanta;
         dynalloc_loop_logp = 1;
      }
      offsets[i] = boost;

      if (boost>0)
         dynalloc_logp = (dynalloc_logp < 3) ? 2 : (dynalloc_logp - 1);
   } while (++i < nbEBands);

   if(offsets[18]>1000 && offsets[19] == 0)
   {
	   if( (oldBandE[19]> (oldBandE[18]>>1) ) || (oldBandE[19]>7000) )
	   {
		   offsets[19] =  offsets[18];
	   }
   }
   else if(offsets[19]>1000 && offsets[20] == 0)
   {
	   if( (oldBandE[20]> (oldBandE[19]>>1) ) || (oldBandE[20]>7000) )
	   {
		   offsets[20] =  offsets[19];
	   }
   }
   else if(offsets[20]>1000 && offsets[21] == 0)
   {
	   if( (oldBandE[21]> (oldBandE[20]>>1) ) || (oldBandE[21]>7000) )
	   {
		   offsets[21] =  offsets[20];
	   }
   }

   alloc_trim = tell+(6<<BITRES) <= total_bits ?
         rc_decode_cdf(dec, trim_icdf, 7) : 5;

   bits = (len<<6) - ec_tell_frac(dec) - 1;
   anti_collapse_rsv = isTransient&&bits>=32 ? 8 : 0;

   bits -= anti_collapse_rsv;


   codedBands = calculate_bitalloc(mode, st->end, offsets, cap,
	   alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses,
	   fine_quant, fine_priority, dec
	   );

   unquant_fine_energy(mode, st->end, oldBandE, fine_quant, dec);

/*
   if(dec->buf[-2] == 0)
   {
	   printf("\n after [unquant_fine_energy_merge]\n");
	   printf("storage = %d\n",dec->storage);
	   printf("end_offs = %d\n",dec->end_offs);
	   printf("end_window = %d\n",dec->end_window);
	   printf("nend_bits = %d\n",dec->nend_bits);
	   printf("nbits_total = %d\n",dec->nbits_total);
	   printf("offs = %d\n",dec->offs);
	   printf("rng = %d\n",dec->rng);
	   printf("val = %d\n",dec->val);
	   printf("ext = %d\n",dec->ext);
	   printf("rem = %d\n",dec->rem);
	   printf("error = %d\n",dec->error);
   }
*/

/*
   if(dec->buf[-2] == 0)
   {
		for(i=0;i<44;i++)
		{
			printf("oldBandE[%d] = %d\n",i,oldBandE[i]);
		}
		for(i=0;i<22;i++)
		{
			printf("fine_quant[%d] = %d\n",i,fine_quant[i]);
		}
   }
*/


   all_subband_quantization( mode,  st->end, X, X+N, collapse_masks,
	   pulses, shortBlocks, spread_decision, dual_stereo, intensity, tf_res,
	   len*(8<<BITRES)-anti_collapse_rsv, balance, dec, codedBands, &st->rng//, (short *)freq   
	   );

//    printf("after all_subband_quantization\n");
//    printf("st->rng = %d\n", st->rng);
/*
   if(st->prev_plc == 2)
   {
	   for(i = 0; i<1728; i++)
	   {
		   printf("X[%d] = %d\n",i,X[i]);
	   }
   }
*/

   if (anti_collapse_rsv > 0)
   {
      anti_collapse_on = ec_dec_bits(dec, 1);
   }

   unquant_energy_finalise(mode, st->end, oldBandE,
	   fine_quant, fine_priority, len*8-ec_tell(dec), dec);


   if (anti_collapse_on)
   {
	   coll_prevent(mode, X, collapse_masks, N,
		   st->end, oldBandE, oldLogE, oldLogE2, pulses, st->rng);
   }

/*
#ifdef PLC_FRAME_20MS	
   st->longshort[2] = st->longshort[1];
   st->longshort[1] = st->longshort[0];
   st->longshort[0] = shortBlocks;


   SSC_COPY32_merge(plc_freq, freq,plc_freq+N, freq+N, eBands[22]<<3);


#endif
*/

#ifndef PLC_FRAME_20MS
   if(isTransient)
   {
	   freq = (int *)shared_local;
   }
   else
   {
	   freq = decode_mem[0]+1078;   // 1024+54
   }
#endif

/*
   if(st->prev_plc == 2)
   {
	   for(i = 0; i<1728; i++)
	   {
		   printf("X[%d] = %d\n",i,X[i]);
	   }

	   for(i=0; i<44; i++)
	   {
		   printf("oldBandE[%d] = %d\n",i,oldBandE[i]);
	   }

   }
*/


   if (silence)
   {
	   for (i=0;i<(nbEBands<<1);i++)
	   {
		   oldBandE[i] = -28672;
	   }
	   for (i=0;i<(N<<1);i++)
		   freq[i] = 0;
   } else 
   {
#ifndef SSC_MONOSUM_SCALABLE
	   mono_band_denorm(mode, X, freq, oldBandE, effEnd);
	   mono_band_denorm(mode, &X[864], &freq[864], &oldBandE[22], effEnd);
#else
	   if(ssc_mono_sum_info == 0)
	   {
		   mono_band_denorm(mode, X, freq, oldBandE, effEnd);
		   SSC_CLEAR_int(&freq[N], N);
	   }
	   else if(ssc_mono_sum_info == 1)
	   {
		   SSC_CLEAR_int(freq, N);
		   mono_band_denorm(mode, &X[864], &freq[864], &oldBandE[22], effEnd);

	   }
	   else
	   {
		   mono_band_denorm(mode, X, freq, oldBandE, effEnd);
		   mono_band_denorm(mode, &X[864], &freq[864], &oldBandE[22], effEnd);
	   }
#endif
   }

   if(st->prev_plc == 2)
   {
	//   for(i = 0; i<1728; i++)
	//   {
	//	   printf("freq[%d] = %d\n",i,freq[i]);
	//   }



	   if(shortBlocks>0)
	   {
	//	    plc_proc_short(frame_size,freq,st,1,28456);
		    plc_proc_short(frame_size,freq,st,1,29456);
	   }
	   else
	   {
		//    plc_proc_long_one(frame_size,freq,st,30476,1);
			  plc_proc_long_one(frame_size,freq,st,31376,1);
	   }


//	   for(i = 0; i<1728; i++)
//	   {
//		   printf("freq[%d] = %d\n",i,freq[i]);
//	   }


   }

HW_PLC_LOC:

#ifndef SSC_MONOSUM_SCALABLE
   SSC_COPY32_merge(decode_mem[0], decode_mem[0]+N,decode_mem[1], decode_mem[1]+N, 1078);
#endif
//   SSC_COPY32(decode_mem[0], decode_mem[0]+N, 1078);  // DECODE_BUFFER_SIZE-N+overlap/2 = 1024
//   SSC_COPY32(decode_mem[1], decode_mem[1]+N, 1078);

   out_syn[0] = decode_mem[0]+1024;    // DECODE_BUFFER_SIZE-N = 1024
   out_syn[1] = decode_mem[1]+1024;    // DECODE_BUFFER_SIZE-N = 1024

#ifndef SSC_MONOSUM_SCALABLE
   compute_inv_mdcts_one(mode, shortBlocks, freq, out_syn,0);
   compute_inv_mdcts_one(mode, shortBlocks, &freq[864], out_syn,1);
#else
   if(ssc_mono_sum_info == 0)
   {
	   SSC_COPY32(decode_mem[0], decode_mem[0]+N, 1078);
	   compute_inv_mdcts_one(mode, shortBlocks, freq, out_syn,0);
   }
   else if(ssc_mono_sum_info == 1)
   {
	   SSC_COPY32(decode_mem[1], decode_mem[1]+N, 1078);
	   compute_inv_mdcts_one(mode, shortBlocks, &freq[864], out_syn,1);
   }
   else
   {
	   SSC_COPY32_merge(decode_mem[0], decode_mem[0]+N,decode_mem[1], decode_mem[1]+N, 1078);
	   compute_inv_mdcts_one(mode, shortBlocks, freq, out_syn,0);
	   compute_inv_mdcts_one(mode, shortBlocks, &freq[864], out_syn,1);
   }
#endif
#ifndef PLC_FRAME_20MS
   if(isTransient)
   {
	   freq = (int *)shared_local;
   }
   else
   {
#ifndef HW_REMOVE_PITCH_BUF 
	   freq = decode_mem[1]+1078;   // 1024+54
#else
	   freq2 = decode_mem[1]+54;   // 1024+54
#endif
   }

  
   if (silence)
   {
	   for (i=0;i<nbEBands;i++)
	   {
		   oldBandE[i] = -28672;
	   }
	   for (i=0;i<N;i++)
		   freq[i] = 0;
   } else {
	   mono_band_denorm(mode, &X[864], freq, &oldBandE[22], effEnd);
   }

   out_syn[1] = decode_mem[1]+1024;    // DECODE_BUFFER_SIZE-N = 1024

   compute_inv_mdcts_one(mode, shortBlocks, freq, out_syn,1);
#endif

   st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD);
//   st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD);


#ifdef PLC_FRAME_20MS
   if(plc_on)
   {
	     postfilter_gain = SSC_MULT16x16_Q15(30320,st->postfilter_gain);
		 postfilter_pitch = st->postfilter_period;
   }
#endif

#ifndef SSC_MONOSUM_SCALABLE
   comb_filter(*out_syn, st->postfilter_period, st->postfilter_period, mode->shortMdctSize,
	   st->postfilter_gain, st->postfilter_gain,overlap);

   comb_filter((*out_syn)+mode->shortMdctSize, st->postfilter_period, postfilter_pitch, N-mode->shortMdctSize,
	   st->postfilter_gain, postfilter_gain,overlap);

   comb_filter((*(out_syn+1)), st->postfilter_period, st->postfilter_period, mode->shortMdctSize,
	   st->postfilter_gain, st->postfilter_gain,overlap);

   comb_filter((*(out_syn+1))+mode->shortMdctSize, st->postfilter_period, postfilter_pitch, N-mode->shortMdctSize,
	   st->postfilter_gain, postfilter_gain,overlap);
#else
   if(ssc_mono_sum_info < 2)
   {	   
	   comb_filter((*(out_syn+ssc_mono_sum_info)), st->postfilter_period, st->postfilter_period, mode->shortMdctSize,
		   st->postfilter_gain, st->postfilter_gain,overlap);

	   comb_filter((*(out_syn+ssc_mono_sum_info))+mode->shortMdctSize, st->postfilter_period, postfilter_pitch, N-mode->shortMdctSize,
		   st->postfilter_gain, postfilter_gain,overlap);
   }
   else
   {
	   comb_filter(*out_syn, st->postfilter_period, st->postfilter_period, mode->shortMdctSize,
		   st->postfilter_gain, st->postfilter_gain,overlap);

	   comb_filter((*out_syn)+mode->shortMdctSize, st->postfilter_period, postfilter_pitch, N-mode->shortMdctSize,
		   st->postfilter_gain, postfilter_gain,overlap);


	   comb_filter((*(out_syn+1)), st->postfilter_period, st->postfilter_period, mode->shortMdctSize,
		   st->postfilter_gain, st->postfilter_gain,overlap);

	   comb_filter((*(out_syn+1))+mode->shortMdctSize, st->postfilter_period, postfilter_pitch, N-mode->shortMdctSize,
		   st->postfilter_gain, postfilter_gain,overlap);
   }
#endif
 //  st->postfilter_period_old = st->postfilter_period;
   st->postfilter_period = postfilter_pitch;

//   st->postfilter_gain_old = st->postfilter_gain;
   st->postfilter_gain = postfilter_gain;


   if (!isTransient)
   {

	   for (i=0;i<nbEBands<<1;i++)
	   {
		   oldLogE2[i] = oldLogE[i];
		   oldLogE[i] = oldBandE[i];
	   }

   } else {
      for (i=0;(i<nbEBands<<1);i++)
         oldLogE[i] = MIN16(oldLogE[i], oldBandE[i]);
   }

#ifndef PLC_FRAME_20MS
	   st->rng = dec->rng;
#else
   if(plc_on != 1)
	   st->rng = dec->rng;
#endif


//   printf("before deemphasis\n");
//   printf("st->rng = %d\n", st->rng);

#ifndef ENABLE_VSP


#ifndef SSC_MONOSUM
    deemphasis(out_syn, pcm, N);
#else
   if(ssc_mono_sum_info == 0)
   {
	   deemphasis_mono(out_syn[0], pcm, N);
   }
   else if(decoding_channel == 1)
   {
	   deemphasis_mono(out_syn[1], pcm, N);
   }
   else
   {
	   deemphasis(out_syn, pcm, N);
   }

#endif

#else

#ifndef SSC_MONOSUM   // After Kali update   
	deemphasis(out_syn, SSC_shared_mem, N);
#else
   if(ssc_mono_sum_info == 0)
   {
	   deemphasis_mono(out_syn[0], SSC_shared_mem, N);
   }
   else if(decoding_channel == 1)
   {
	   deemphasis_mono(out_syn[1], SSC_shared_mem, N);
   }
   else
   {
	   deemphasis(out_syn, SSC_shared_mem, N);
   }

#endif


#endif
#ifdef FRAME_CNT_ON
   frame_cnt++; 
#endif

#ifdef PLC_FRAME_20MS
   if(st->prev_plc>3)   // st->prev_plc == 2ÀÎ°æ¿ì¿Í 3ÀÎ°æ¿ì
   {
	   st->prev_plc = 0;
   }
   else if(st->prev_plc>0)
   {
	   st->prev_plc++;
   }
#endif

   
   
#ifndef PLC_FRAME_20MS   
   if (ec_tell(dec) > 8*len)
      return SSC_INTERNAL_ERROR;

   if(ec_get_error(dec))
      st->error = 1;
#else
   if(plc_on != 1)
   {
	   if (ec_tell(dec) > 8*len)
		   return SSC_INTERNAL_ERROR;

	   if(ec_get_error(dec))
		   st->error = 1;
   }

#endif

////////////////////////////////////////////////////


   //VSP
////////////////////////////////////////////////////
#ifdef ENABLE_VSP


   frame_size = SBM_Exe(pcm, SSC_shared_mem, frame_size);

/*
   if(frame_size<500)
   {
	   printf("sdf");
   }
*/
#endif
   return frame_size;

}
