www.pudn.com > AVS_M_ver10.rar > cod_cp_state.c


/* 
*********************************************************************** 
* COPYRIGHT AND WARRANTY INFORMATION 
* 
* Copyright 2007  Audio Video Coding Standard, Part ¢ú 
* 
* This software module was developed by AVS Audio sub-group 
* 
* 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  
#include  
#include  
#include  
#include "../include/amr_plus.h" 
#include "..\lib_amr\typedef.h" 
#include "..\lib_amr\enc_main.h" 
#include "..\include\mem.h" 
#include "..\include\proto_func.h" 
#include "..\include\options.h" 
#ifndef WB_enc_if_state 
typedef struct 
{ 
   Word16 sid_update_counter;   /* Number of frames since last SID */ 
   Word16 sid_handover_debt;    /* Number of extra SID_UPD frames to schedule */ 
   Word16 prev_ft;              /* Type of the previous frame */ 
   void *encoder_state;         /* Points encoder state structure */ 
} WB_enc_if_state; 
#endif 
#define Q_MAX        8        /* scaling max for signal                 */ 
void E_MAIN_reset(void *st, Word16 reset_all); 
void copy_coder_state( 
				   Coder_State_Plus *wbP,	/* AMR-WB+ state struct */ 
				   void *st,				/* AMR-WB state struct  */ 
				   short sw,					/* sw=0 -> switch from WB to WB+, sw=1 -> switch from WB+ to WB */ 
				   short use_case_mode 
) 
{ 
	Word16 Q_new, tmp, tmp2; 
	Word32 i; 
	float ftemp; 
	WB_enc_if_state *s1; 
	Coder_State *wb; 
	s1 = (WB_enc_if_state *)st; 
	wb = (Coder_State *)(s1->encoder_state); 
	if (sw == 0) 
	{ short t; 
		init_coder_amrwb_plus(wbP, 1, 0, use_case_mode, 1); 
		mvr2r(wb->mem_isf, wbP->isfold, M); 
		mvs2r(wb->mem_isf_q, wbP->past_isfq, M); 
		mvr2r(wb->mem_isp, wbP->ispold, M); 
		for (i = 0; i < M; i++) 
		{ 
		   wbP->ispold_q[i] = (float)(wb->mem_isp_q[i]*1024); 
		   wbP->ispold_q[i] = wbP->ispold_q[i]/(1024*32767); 
		}  
		mvi2i((int*)wb->mem_ol_lag, (int*)wbP->old_ol_lag, 5); 
		wbP->old_T0_med = (int)(wb->mem_T0_med);		 
		mvr2r(wb->mem_decim, wbP->right.mem_decim, 30); 
    mvr2r(wb->mem_sig_in, wbP->right.mem_sig_in, 4); 
		wbP->right.mem_preemph = wb->mem_preemph; 
		mvr2r(wb->mem_speech + 48, wbP->old_speech_pe, 16 + 512); 
    t = PIT_MAX_MAX ;//- PIT_MAX; 
		mvr2r(wb->mem_wsp, wbP->old_d_wsp + (PIT_MAX_MAX/OPL_DECIM) - (PIT_MAX/OPL_DECIM), PIT_MAX / OPL_DECIM); 
		mvr2r(wb->mem_hp_wsp, wbP->hp_old_wsp + (PIT_MAX_MAX/OPL_DECIM) - (PIT_MAX/OPL_DECIM), PIT_MAX / OPL_DECIM); 
		wbP->mem_wsp = wb->mem_wsp_df; 
		mvr2r(wb->mem_decim2, wbP->mem_lp_decim2, 3); 
		wbP->old_T0_med = wb->mem_T0_med; 
		wbP->ol_gain = wb->mem_ol_gain; 
		mvr2r(wb->mem_hf_wsp + 2, wbP->hp_ol_ltp_mem, 7); 
		wbP->ada_w = wb->mem_ada_w; 
		wbP->ol_wght_flg = (short)wb->mem_ol_wght_flg; 
		wbP->old_mem_w0 = wb->mem_w0; 
		mvr2r(wb->mem_syn, wbP->old_synth, M); 
		for(i = 0; i < PIT_MAX + L_INTERPOL; i++) 
		{ 
		   wbP->old_exc[PIT_MAX_MAX - PIT_MAX + i] = (float)(wb->mem_exc[i] * pow(2, -(wb->mem_q))); 
		} 
		wbP->old_ovlp_size = 0; 
		wbP->SwitchFlagPlusToWB = 1; 
		if (use_case_mode == USE_CASE_B) 
		{ 
			mvr2r(wb->vadSt->mem_bckr_est, wbP->vadSt->bckr_est, 12); 
			mvr2r(wb->vadSt->mem_ave_level, wbP->vadSt->ave_level, 12); 
			mvr2r(wb->vadSt->mem_level, wbP->vadSt->old_level, 12); 
			mvr2r(wb->vadSt->mem_sub_level, wbP->vadSt->sub_level, 12); 
			mvr2r(&(wb->vadSt->mem_a_data5[0][0]), &(wbP->vadSt->a_data5[0][0]), 10); 
			mvr2r(wb->vadSt->mem_a_data3, wbP->vadSt->a_data3, 6); 
			wbP->vadSt->sp_max = wb->vadSt->mem_sp_max; 
			wbP->vadSt->speech_level = wb->vadSt->mem_speech_level; 
			wbP->vadSt->burst_count = wb->vadSt->mem_burst_count; 
			wbP->vadSt->hang_count = wb->vadSt->mem_hang_count; 
			wbP->vadSt->stat_count = wb->vadSt->mem_stat_count; 
			wbP->vadSt->vadreg = wb->vadSt->mem_vadreg; 
			wbP->vadSt->pitch_tone = wb->vadSt->mem_pitch_tone; 
			wbP->vadSt->sp_est_cnt = wb->vadSt->mem_sp_est_cnt; 
			wbP->vadSt->sp_max_cnt = wb->vadSt->mem_sp_max_cnt; 
			if (wbP->stClass->StatClassCount == 0) 
			{ 
				wbP->stClass->StatClassCount = 15; 
			} 
		} 
	} 
	else if (sw == 1) 
	{ 
		E_MAIN_reset((void*)wb, 1); 
		mvr2r(wbP->isfold, wb->mem_isf, M); 
		mvr2s(wbP->past_isfq, wb->mem_isf_q, M); 
		mvr2r(wbP->ispold, wb->mem_isp, M); 
		for (i = 0; i < M; i++) 
		{ 
		   wb->mem_isp_q[i] = (short)(wbP->ispold_q[i]*32767);  
		} 
		mvi2i((int*)wbP->old_ol_lag, (int*)wb->mem_ol_lag, 5); 
		wb->mem_T0_med = (Word32)(wbP->old_T0_med); 
 
		mvr2r(wbP->right.mem_decim, wb->mem_decim, 30); 
		mvr2r(wbP->right.mem_sig_in, wb->mem_sig_in, 4); 
		wb->mem_preemph = wbP->right.mem_preemph; 
		mvr2r(wbP->old_speech_pe, wb->mem_speech + 48, 16 + 512); 
 
		for (i = 0; i < 48; i++)	wb->mem_speech[i] = 0.0f;	      // done in the reset 
 
    mvr2r(wbP->old_d_wsp + (PIT_MAX_MAX/OPL_DECIM) - (PIT_MAX/OPL_DECIM), wb->mem_wsp, PIT_MAX / OPL_DECIM); 
		mvr2r(wbP->hp_old_wsp  + (PIT_MAX_MAX/OPL_DECIM) - (PIT_MAX/OPL_DECIM), wb->mem_hp_wsp, PIT_MAX / OPL_DECIM); 
    wb->mem_wsp_df = wbP->mem_wsp; 
		mvr2r(wbP->mem_lp_decim2, wb->mem_decim2, 3); 
		wb->mem_ol_gain = wbP->ol_gain; 
		mvr2r(wbP->hp_ol_ltp_mem, wb->mem_hf_wsp + 2, 7);	wb->mem_hf_wsp[0] = 0.0f;	wb->mem_hf_wsp[1] = 0.0f; 
		wb->mem_ada_w = wbP->ada_w; 
		wb->mem_ol_wght_flg = (UWord8)wbP->ol_wght_flg; 
		wb->mem_w0 = wbP->old_mem_w0; 
		if (wbP->prev_mod == 0) 
		{ 
			for (i = 0; i < 4; i++) 
			{ 
				ftemp = 20.0f * (float)log10((float)wbP->mem_gain_code[3-i]) * 1024.0f; 
				if (ftemp < -32768.0f)		wb->mem_gain_q[i] = -32768; 
				else if (ftemp > 32767.0f)	wb->mem_gain_q[i] = 32767; 
				else						wb->mem_gain_q[i] = (Word16)ftemp; 
			} 
		} 
		mvr2r(wbP->old_synth, wb->mem_syn, M); 
		mvr2r(wbP->old_synth, wb->mem_syn2, M); 
		Q_new = 0; 
		wb->mem_q = 0; 
		tmp = (Word16)(fabs(wbP->old_exc[0])); 
		for (i = 0; i < (PIT_MAX + L_INTERPOL); i++) 
		{ 
			tmp2 = (Word16)(fabs(wbP->old_exc[PIT_MAX_MAX - PIT_MAX + i])); 
			if (tmp < tmp2) tmp = tmp2;  
		} 
		while ((tmp < 0x4000) && (Q_new < 3)) { 
			tmp = (tmp << 1); 
			Q_new = Q_new + 1; 
		} 
		for (i = 0; i < (PIT_MAX + L_INTERPOL); i++) { 
			wb->mem_exc[i] = ((Word16)(wbP->old_exc[PIT_MAX_MAX - PIT_MAX + i])) << Q_new; 
		} 
		wb->mem_q = (Word16)Q_new; 
		for (i = 0; i < 4; i++)	wb->mem_subfr_q[i] = (Word16)Q_new; 
		if (use_case_mode == USE_CASE_B) 
		{ 
			mvr2r(wbP->vadSt->bckr_est, wb->vadSt->mem_bckr_est, 12); 
			mvr2r(wbP->vadSt->ave_level, wb->vadSt->mem_ave_level, 12); 
			mvr2r(wbP->vadSt->old_level, wb->vadSt->mem_level, 12); 
			mvr2r(wbP->vadSt->sub_level, wb->vadSt->mem_sub_level, 12); 
			mvr2r(&(wbP->vadSt->a_data5[0][0]), &(wb->vadSt->mem_a_data5[0][0]), 10); 
			mvr2r(wbP->vadSt->a_data3, wb->vadSt->mem_a_data3, 6); 
			wb->vadSt->mem_sp_max = wbP->vadSt->sp_max; 
			wb->vadSt->mem_speech_level = wbP->vadSt->speech_level; 
			wb->vadSt->mem_burst_count = wbP->vadSt->burst_count; 
			wb->vadSt->mem_hang_count = wbP->vadSt->hang_count; 
			wb->vadSt->mem_stat_count = wbP->vadSt->stat_count; 
			wb->vadSt->mem_vadreg = wbP->vadSt->vadreg; 
			wb->vadSt->mem_pitch_tone = wbP->vadSt->pitch_tone; 
			wb->vadSt->mem_sp_est_cnt = wbP->vadSt->sp_est_cnt; 
			wb->vadSt->mem_sp_max_cnt = wbP->vadSt->sp_max_cnt; 
		} 
	} 
	else 
	{ 
		fprintf(stderr, " Unknown mode switching paramer: %d \n", sw); 
		exit(-1); 
	} 
	return; 
}