1 /* ------------------------------------------------------------------ 2 * Copyright (C) 1998-2009 PacketVideo 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13 * express or implied. 14 * See the License for the specific language governing permissions 15 * and limitations under the License. 16 * ------------------------------------------------------------------- 17 */ 18 /**************************************************************************************** 19 Portions of this file are derived from the following 3GPP standard: 20 21 3GPP TS 26.173 22 ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec 23 Available from http://www.3gpp.org 24 25 (C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC) 26 Permission to distribute, modify and use this file under the standard license 27 terms listed above has been obtained from the copyright holder. 28 ****************************************************************************************/ 29 /* 30 ------------------------------------------------------------------------------ 31 32 33 34 Pathname: ./cpp/include/dtx.h 35 36 Date: 01/04/2007 37 38 ------------------------------------------------------------------------------ 39 REVISION HISTORY 40 41 Description: 42 ------------------------------------------------------------------------------ 43 INCLUDE DESCRIPTION 44 Static memory, constants and frametypes for the DTX 45 ------------------------------------------------------------------------------ 46 */ 47 #ifndef DTX_H 48 #define DTX_H 49 50 51 /*---------------------------------------------------------------------------- 52 ; INCLUDES 53 ----------------------------------------------------------------------------*/ 54 55 #ifdef __cplusplus 56 extern "C" 57 { 58 #endif 59 60 /*---------------------------------------------------------------------------- 61 ; MACROS 62 ; Define module specific macros here 63 ----------------------------------------------------------------------------*/ 64 65 /*---------------------------------------------------------------------------- 66 ; EXTERNAL VARIABLES REFERENCES 67 ----------------------------------------------------------------------------*/ 68 69 /*---------------------------------------------------------------------------- 70 ; DEFINES AND SIMPLE TYPEDEF'S 71 ----------------------------------------------------------------------------*/ 72 73 #define DTX_MAX_EMPTY_THRESH 50 74 #define DTX_HIST_SIZE 8 75 #define DTX_HIST_SIZE_MIN_ONE 7 76 #define DTX_ELAPSED_FRAMES_THRESH (24 + 7 -1) 77 #define DTX_HANG_CONST 7 /* yields eight frames of SP HANGOVER */ 78 #define INV_MED_THRESH 14564 79 #define ISF_GAP 128 /* 50 */ 80 #define ONE_MINUS_ISF_GAP (16384 - ISF_GAP) 81 82 #define ISF_GAP 128 83 #define ISF_DITH_GAP 448 84 #define ISF_FACTOR_LOW 256 85 #define ISF_FACTOR_STEP 2 86 87 #define GAIN_THR 180 88 #define GAIN_FACTOR 75 89 90 typedef struct 91 { 92 int16 isf_hist[M * DTX_HIST_SIZE]; 93 int16 log_en_hist[DTX_HIST_SIZE]; 94 int16 hist_ptr; 95 int16 log_en_index; 96 int16 cng_seed; 97 98 /* DTX handler stuff */ 99 int16 dtxHangoverCount; 100 int16 decAnaElapsedCount; 101 int32 D[28]; 102 int32 sumD[DTX_HIST_SIZE]; 103 } dtx_encState; 104 105 #define SPEECH 0 106 #define DTX 1 107 #define DTX_MUTE 2 108 109 #define TX_SPEECH 0 110 #define TX_SID_FIRST 1 111 #define TX_SID_UPDATE 2 112 #define TX_NO_DATA 3 113 114 #define RX_SPEECH_GOOD 0 115 #define RX_SPEECH_PROBABLY_DEGRADED 1 116 #define RX_SPEECH_LOST 2 117 #define RX_SPEECH_BAD 3 118 #define RX_SID_FIRST 4 119 #define RX_SID_UPDATE 5 120 #define RX_SID_BAD 6 121 #define RX_NO_DATA 7 122 123 /***************************************************************************** 124 * 125 * DEFINITION OF DATA TYPES 126 *****************************************************************************/ 127 128 typedef struct 129 { 130 int16 since_last_sid; 131 int16 true_sid_period_inv; 132 int16 log_en; 133 int16 old_log_en; 134 int16 level; 135 int16 isf[M]; 136 int16 isf_old[M]; 137 int16 cng_seed; 138 139 int16 isf_hist[M * DTX_HIST_SIZE]; 140 int16 log_en_hist[DTX_HIST_SIZE]; 141 int16 hist_ptr; 142 143 int16 dtxHangoverCount; 144 int16 decAnaElapsedCount; 145 146 int16 sid_frame; 147 int16 valid_data; 148 int16 dtxHangoverAdded; 149 150 int16 dtxGlobalState; /* contains previous state */ 151 /* updated in main decoder */ 152 153 int16 data_updated; /* marker to know if CNI data is ever renewed */ 154 155 int16 dither_seed; 156 int16 CN_dith; 157 158 } dtx_decState; 159 160 int16 dtx_enc_init(dtx_encState ** st, int16 isf_init[]); 161 int16 dtx_enc_reset(dtx_encState * st, int16 isf_init[]); 162 void dtx_enc_exit(dtx_encState ** st); 163 164 int16 dtx_enc( 165 dtx_encState * st, /* i/o : State struct */ 166 int16 isf[M], /* o : CN ISF vector */ 167 int16 * exc2, /* o : CN excitation */ 168 int16 ** prms 169 ); 170 171 int16 dtx_buffer( 172 dtx_encState * st, /* i/o : State struct */ 173 int16 isf_new[], /* i : isf vector */ 174 int32 enr, /* i : residual energy (in L_FRAME) */ 175 int16 codec_mode 176 ); 177 178 void tx_dtx_handler(dtx_encState * st, /* i/o : State struct */ 179 int16 vad_flag, /* i : vad decision */ 180 int16 * usedMode /* i/o : mode changed or not */ 181 ); 182 183 void Qisf_ns( 184 int16 * isf1, /* input : ISF in the frequency domain (0..0.5) */ 185 int16 * isf_q, /* output: quantized ISF */ 186 int16 * indice /* output: quantization indices */ 187 ); 188 189 190 int16 dtx_dec_amr_wb_reset(dtx_decState * st, const int16 isf_init[]); 191 192 int16 dtx_dec_amr_wb( 193 dtx_decState * st, /* i/o : State struct */ 194 int16 * exc2, /* o : CN excitation */ 195 int16 new_state, /* i : New DTX state */ 196 int16 isf[], /* o : CN ISF vector */ 197 int16 ** prms 198 ); 199 200 void dtx_dec_amr_wb_activity_update( 201 dtx_decState * st, 202 int16 isf[], 203 int16 exc[]); 204 205 206 int16 rx_amr_wb_dtx_handler( 207 dtx_decState * st, /* i/o : State struct */ 208 int16 frame_type /* i : Frame type */ 209 ); 210 211 void Disf_ns( 212 int16 * indice, /* input: quantization indices */ 213 int16 * isf_q /* input : ISF in the frequency domain (0..0.5) */ 214 ); 215 216 void aver_isf_history( 217 int16 isf_old[], 218 int16 indices[], 219 int32 isf_aver[] 220 ); 221 void find_frame_indices( 222 int16 isf_old_tx[], 223 int16 indices[], 224 dtx_encState * st 225 ); 226 227 int16 dithering_control( 228 dtx_encState * st 229 ); 230 void CN_dithering( 231 int16 isf[M], 232 int32 * L_log_en_int, 233 int16 * dither_seed 234 ); 235 236 #ifdef __cplusplus 237 } 238 #endif 239 240 #endif /* DTX_H */ 241 242 243