annotate libgsmfr2/tfo_dtxd.c @ 538:4d596bfdf8d9

frtest: new program gsmfr-decode-tw5-r
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 21 Sep 2024 23:58:27 +0000
parents 5a3535470c95
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
532
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * The function implemented in this module is a post-processor to be invoked
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 * after Rx DTX preproc functions if the Rx DTX handler block is used as a
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 * TFO transform with DTXd enabled. It selectively transforms certain
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 * preproc output frames (CN and silence frames specifically) into SID,
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 * thereby allowing the network operator to reap the benefits of DTX on
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 * the radio downlink leg.
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 */
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 #include <stdint.h>
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 #include "tw_gsmfr.h"
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 #include "pp_state.h"
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 int gsmfr_tfo_xfrm_dtxd(struct gsmfr_preproc_state *st, uint8_t *frame)
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 {
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 uint8_t *p, sub;
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 if (!st->dtxd_sid_flag)
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 return 1; /* SP=1: output is a speech frame */
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 /* turn the output frame into SID */
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 p = frame + 5; /* skip magic+LARc */
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 for (sub = 0; sub < 4; sub++) {
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 *p++ = 0;
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 *p++ &= 0x1F; /* upper 5 bits of Xmaxc field */
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 *p++ &= 0x80; /* and the lsb spilling into the next byte */
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 *p++ = 0;
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 *p++ = 0;
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 *p++ = 0;
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 *p++ = 0;
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 }
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 return 0; /* SP=0: output is SID */
5a3535470c95 libgsmfr2 TFO: implement DTXd function
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 }