FreeCalypso > hg > gsm-codec-lib
annotate libgsmefr/enc_main.c @ 183:452c1d5a6268
libgsmefr BFI w/o data: emit zero output after decoder reset
In real-life usage, each EFR decoder session will most likely begin
with lots of BFI frames before the first real frame arrives. However,
because the spec-defined home state of the decoder is speech rather
than CN, our regular logic for BFI w/o data would have to feed
pseudorandom noise to the decoder (in the "fixed codebook excitation
pulses" part), which is silly to do at the beginning of the decoder
session right out of reset. Therefore, let's check reset_flag_old,
and if we are still in the reset state, simply emit zero output.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 03 Jan 2023 00:12:18 +0000 |
parents | 035424a6ca83 |
children |
rev | line source |
---|---|
112
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 * This module contains our GSM EFR encoder main function, EFR_encode_params(), |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 * that stands at the boundary between our public interface and the guts of |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 * ETSI-based codec. |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 */ |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 #include "gsm_efr.h" |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 #include "typedef.h" |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 #include "namespace.h" |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 #include "basic_op.h" |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 #include "cnst.h" |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 #include "codec.h" |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 #include "sig_proc.h" |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 #include "memops.h" |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 #include "enc_state.h" |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 #include "e_homing.h" |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 #include "dtx.h" |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 void EFR_encode_params(struct EFR_encoder_state *st, const int16_t *pcm_in, |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 int16_t *params, int *sp_out, int *vad_out) |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 { |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 Word16 *new_speech = st->old_speech + L_TOTAL - L_FRAME; |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 Word16 syn[L_FRAME]; |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 Word16 reset_flag; |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 Word16 i; |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 /* Check whether this frame is an encoder homing frame */ |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 reset_flag = encoder_homing_frame_test (pcm_in); |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 for (i = 0; i < L_FRAME; i++) /* Delete the 3 LSBs (13-bit input) */ |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 { |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 new_speech[i] = pcm_in[i] & 0xfff8; |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 } |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 Pre_Process (st, new_speech, L_FRAME); /* filter + downscaling */ |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 Coder_12k2 (st, params, syn); /* Find speech parameters */ |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 if ((st->txdtx_ctrl & TX_SP_FLAG) == 0) |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 { |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 /* Write comfort noise parameters into the parameter frame. |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 Use old parameters in case SID frame is not to be updated */ |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 CN_encoding (st, params, st->txdtx_ctrl); |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 } |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 /* VAD and SP flag outputs */ |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 if (vad_out) |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 *vad_out = ((st->txdtx_ctrl & TX_VAD_FLAG) != 0); |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 if (sp_out) |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 *sp_out = ((st->txdtx_ctrl & TX_SP_FLAG) != 0); |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 if (reset_flag != 0) |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 { |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 /* Bring the encoder, VAD and DTX to the home state */ |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 EFR_encoder_reset(st, st->dtx_mode); |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 } |
035424a6ca83
libgsmefr: encoder main function put together
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 } |