comparison libgsmefr/dtx_dec.c @ 192:0303ba213e1c

libgsmefr/dtx_dec.c: perf opt
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 03 Jan 2023 04:51:51 +0000
parents c1d53064b410
children 17f690749099
comparison
equal deleted inserted replaced
191:7bc011aceb7f 192:0303ba213e1c
108 /* Frame classification according to bfi-flag and ternary-valued 108 /* Frame classification according to bfi-flag and ternary-valued
109 SID flag. The frames between SID updates (not actually trans- 109 SID flag. The frames between SID updates (not actually trans-
110 mitted) are also classified here; they will be discarded later 110 mitted) are also classified here; they will be discarded later
111 and provided with "NO TRANSMISSION"-flag */ 111 and provided with "NO TRANSMISSION"-flag */
112 112
113 if ((sub (SID_flag, 2) == 0) && (bfi == 0)) 113 if ((SID_flag == 2) && (bfi == 0))
114 { 114 {
115 frame_type = VALID_SID_FRAME; move16 (); 115 frame_type = VALID_SID_FRAME; move16 ();
116 } 116 }
117 else if ((SID_flag == 0) && (bfi == 0)) 117 else if ((SID_flag == 0) && (bfi == 0))
118 { 118 {
129 129
130 /* Update of decoder state */ 130 /* Update of decoder state */
131 /* Previous frame was classified as a speech frame */ 131 /* Previous frame was classified as a speech frame */
132 if ((st->rxdtx_ctrl & RX_SP_FLAG) != 0) 132 if ((st->rxdtx_ctrl & RX_SP_FLAG) != 0)
133 { 133 {
134 if (sub (frame_type, VALID_SID_FRAME) == 0) 134 if (frame_type == VALID_SID_FRAME)
135 { 135 {
136 st->rxdtx_ctrl = RX_FIRST_SID_UPDATE; 136 st->rxdtx_ctrl = RX_FIRST_SID_UPDATE;
137 } 137 }
138 else if (sub (frame_type, INVALID_SID_FRAME) == 0) 138 else if (frame_type == INVALID_SID_FRAME)
139 { 139 {
140 st->rxdtx_ctrl = RX_FIRST_SID_UPDATE 140 st->rxdtx_ctrl = RX_FIRST_SID_UPDATE
141 | RX_INVALID_SID_FRAME; 141 | RX_INVALID_SID_FRAME;
142 } 142 }
143 else if (sub (frame_type, UNUSABLE_FRAME) == 0) 143 else if (frame_type == UNUSABLE_FRAME)
144 { 144 {
145 st->rxdtx_ctrl = RX_SP_FLAG; 145 st->rxdtx_ctrl = RX_SP_FLAG;
146 } 146 }
147 else if (sub (frame_type, GOOD_SPEECH_FRAME) == 0) 147 else if (frame_type == GOOD_SPEECH_FRAME)
148 { 148 {
149 st->rxdtx_ctrl = RX_SP_FLAG; 149 st->rxdtx_ctrl = RX_SP_FLAG;
150 } 150 }
151 } 151 }
152 else 152 else
153 { 153 {
154 if (sub (frame_type, VALID_SID_FRAME) == 0) 154 if (frame_type == VALID_SID_FRAME)
155 { 155 {
156 st->rxdtx_ctrl = RX_CONT_SID_UPDATE; 156 st->rxdtx_ctrl = RX_CONT_SID_UPDATE;
157 } 157 }
158 else if (sub (frame_type, INVALID_SID_FRAME) == 0) 158 else if (frame_type == INVALID_SID_FRAME)
159 { 159 {
160 st->rxdtx_ctrl = RX_CONT_SID_UPDATE 160 st->rxdtx_ctrl = RX_CONT_SID_UPDATE
161 | RX_INVALID_SID_FRAME; 161 | RX_INVALID_SID_FRAME;
162 } 162 }
163 else if (sub (frame_type, UNUSABLE_FRAME) == 0) 163 else if (frame_type == UNUSABLE_FRAME)
164 { 164 {
165 st->rxdtx_ctrl = RX_CNI_BFI; 165 st->rxdtx_ctrl = RX_CNI_BFI;
166 } 166 }
167 else if (sub (frame_type, GOOD_SPEECH_FRAME) == 0) 167 else if (frame_type == GOOD_SPEECH_FRAME)
168 { 168 {
169 /* If the previous frame (during CNI period) was muted, 169 /* If the previous frame (during CNI period) was muted,
170 raise the RX_PREV_DTX_MUTING flag */ 170 raise the RX_PREV_DTX_MUTING flag */
171 if ((st->rxdtx_ctrl & RX_DTX_MUTING) != 0) 171 if ((st->rxdtx_ctrl & RX_DTX_MUTING) != 0)
172 { 172 {
197 /* SID frame detected, but not the first SID */ 197 /* SID frame detected, but not the first SID */
198 if ((st->rxdtx_ctrl & RX_CONT_SID_UPDATE) != 0) 198 if ((st->rxdtx_ctrl & RX_CONT_SID_UPDATE) != 0)
199 { 199 {
200 st->prev_SID_frames_lost = 0; 200 st->prev_SID_frames_lost = 0;
201 201
202 if (sub (frame_type, VALID_SID_FRAME) == 0) 202 if (frame_type == VALID_SID_FRAME)
203 { 203 {
204 st->rx_dtx_state = 0; 204 st->rx_dtx_state = 0;
205 } 205 }
206 else if (sub (frame_type, INVALID_SID_FRAME) == 0) 206 else if (frame_type == INVALID_SID_FRAME)
207 { 207 {
208 if (sub(st->rx_dtx_state, (CN_INT_PERIOD - 1)) < 0) 208 if (st->rx_dtx_state < (CN_INT_PERIOD - 1))
209 { 209 {
210 st->rx_dtx_state = add(st->rx_dtx_state, 1); 210 st->rx_dtx_state++;
211 } 211 }
212 } 212 }
213 } 213 }
214 214
215 /* Bad frame received in CNI mode */ 215 /* Bad frame received in CNI mode */
216 if ((st->rxdtx_ctrl & RX_CNI_BFI) != 0) 216 if ((st->rxdtx_ctrl & RX_CNI_BFI) != 0)
217 { 217 {
218 if (sub (st->rx_dtx_state, (CN_INT_PERIOD - 1)) < 0) 218 if (st->rx_dtx_state < (CN_INT_PERIOD - 1))
219 { 219 {
220 st->rx_dtx_state = add (st->rx_dtx_state, 1); 220 st->rx_dtx_state++;
221 } 221 }
222 222
223 /* If an unusable frame is received during CNI period 223 /* If an unusable frame is received during CNI period
224 when TAF == 1, the frame is classified as a lost 224 when TAF == 1, the frame is classified as a lost
225 SID frame */ 225 SID frame */
226 if (sub (TAF, 1) == 0) 226 if (TAF == 1)
227 { 227 {
228 st->rxdtx_ctrl = st->rxdtx_ctrl | RX_LOST_SID_FRAME; 228 st->rxdtx_ctrl = st->rxdtx_ctrl | RX_LOST_SID_FRAME;
229 st->prev_SID_frames_lost = add (st->prev_SID_frames_lost, 1); 229 st->prev_SID_frames_lost = add (st->prev_SID_frames_lost, 1);
230 } 230 }
231 else /* No transmission occurred */ 231 else /* No transmission occurred */
232 { 232 {
233 st->rxdtx_ctrl = st->rxdtx_ctrl | RX_NO_TRANSMISSION; 233 st->rxdtx_ctrl = st->rxdtx_ctrl | RX_NO_TRANSMISSION;
234 } 234 }
235 235
236 if (sub (st->prev_SID_frames_lost, 1) > 0) 236 if (st->prev_SID_frames_lost > 1)
237 { 237 {
238 st->rxdtx_ctrl = st->rxdtx_ctrl | RX_DTX_MUTING; 238 st->rxdtx_ctrl = st->rxdtx_ctrl | RX_DTX_MUTING;
239 } 239 }
240 } 240 }
241 } 241 }
249 { 249 {
250 st->rxdtx_aver_period = DTX_HANGOVER; 250 st->rxdtx_aver_period = DTX_HANGOVER;
251 } 251 }
252 else 252 else
253 { 253 {
254 if (sub (st->rxdtx_N_elapsed, DTX_ELAPSED_THRESHOLD) > 0) 254 if (st->rxdtx_N_elapsed > DTX_ELAPSED_THRESHOLD)
255 { 255 {
256 st->rxdtx_ctrl |= RX_UPD_SID_QUANT_MEM; 256 st->rxdtx_ctrl |= RX_UPD_SID_QUANT_MEM;
257 st->rxdtx_N_elapsed = 0; 257 st->rxdtx_N_elapsed = 0;
258 st->rxdtx_aver_period = 0; 258 st->rxdtx_aver_period = 0;
259 st->L_pn_seed_rx = PN_INITIAL_SEED; 259 st->L_pn_seed_rx = PN_INITIAL_SEED;
262 { 262 {
263 st->rxdtx_N_elapsed = 0; 263 st->rxdtx_N_elapsed = 0;
264 } 264 }
265 else 265 else
266 { 266 {
267 st->rxdtx_aver_period = sub (st->rxdtx_aver_period, 1); 267 st->rxdtx_aver_period--;
268 } 268 }
269 } 269 }
270 270
271 return; 271 return;
272 } 272 }
298 ) 298 )
299 { 299 {
300 /* Circular buffer */ 300 /* Circular buffer */
301 st->gain_code_old_rx[st->buf_p_rx] = new_gain_code; 301 st->gain_code_old_rx[st->buf_p_rx] = new_gain_code;
302 302
303 if (sub (st->buf_p_rx, (4 * DTX_HANGOVER - 1)) == 0) 303 if (st->buf_p_rx == (4 * DTX_HANGOVER - 1))
304 { 304 {
305 st->buf_p_rx = 0; 305 st->buf_p_rx = 0;
306 } 306 }
307 else 307 else
308 { 308 {
309 st->buf_p_rx = add (st->buf_p_rx, 1); 309 st->buf_p_rx++;
310 } 310 }
311 311
312 return; 312 return;
313 } 313 }
314 314