annotate doc/FR1-library-API @ 556:18aca50d68df default tip

doc/Calypso-TCH-downlink: update for FR1 BFI-with-data
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 11 Oct 2024 01:54:00 +0000
parents a3300483ae74
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
297
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 Libgsmfr2 general usage
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 =======================
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 The external public interface to Themyscira libgsmfr2 consists of a single
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 header file <tw_gsmfr.h>; it should be installed in some system include
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 directory.
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 The dialect of C used by all Themyscira GSM codec libraries is ANSI C (function
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 prototypes), const qualifier is used where appropriate, and the interface is
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 defined in terms of <stdint.h> types; <tw_gsmfr.h> includes <stdint.h>. The
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 use of old libgsm defined types (gsm_byte, gsm_frame and gsm_signal) has been
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 abolished in the migration from libgsm+libgsmfrp to libgsmfr2.
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 GSM 06.10 encoder and decoder
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 =============================
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 Both the encoder and the decoder are stateful; each running instance of either
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 element needs its own state structure. However, this GSM 06.10 component of
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 libgsmfr2 shares a peculiar property with old libgsm from which it was derived:
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 the same state structure (struct gsmfr_0610_state) is used by both entities.
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 Needless to say, each given instance of struct gsmfr_0610_state must be used
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 for only one purpose, either for the encoder or for the decoder; mixing calls
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 to encoder and decoder functions with the same state structure is an invalid
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 operation with undefined results.
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 State structures for the basic encoder or decoder are allocated with this
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 function:
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 struct gsmfr_0610_state *gsmfr_0610_create(void);
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 This function allocates dynamic memory for the state structure with malloc()
535
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
32 and returns a pointer to the allocated and initialized struct if successful, or
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
33 NULL if malloc() fails. The state structure is malloc'ed as a single chunk,
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
34 hence when you are done with it, simply free() it.
297
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 The initialization or reset portion of gsmfr_0610_create() operation can always
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 be repeated with this function:
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 void gsmfr_0610_reset(struct gsmfr_0610_state *state);
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40
535
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
41 To support applications that need (or prefer) to use some different method of
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
42 managing their memory allocations, the library also exports this const datum:
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
43
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
44 extern const unsigned gsmfr_0610_state_size;
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
45
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
46 Using this feature, one can replace gsmfr_0610_create() with something like the
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
47 following (example for applications based on Osmocom libraries):
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
48
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
49 struct gsmfr_0610_state *st;
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
50 st = talloc_size(ctx, gsmfr_0610_state_size);
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
51 if (st)
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
52 gsmfr_0610_reset(st);
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
53
297
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 Immediately after gsmfr_0610_create() or gsmfr_0610_reset(), the "virgin" state
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 structure can be used either for the encoder or for the decoder; however, once
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 that state struct has been passed to functions of either group, it can only be
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 used for that functional group.
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 Encoder specifics
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 -----------------
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 The most elementary single-frame processing function of libgsmfr2 GSM 06.10
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 encoder is:
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 void gsmfr_0610_encode_params(struct gsmfr_0610_state *st, const int16_t *pcm,
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 struct gsmfr_param_frame *param);
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 The input is an array of 160 linear PCM samples (left-justified in int16_t),
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 and the output is this structure:
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 struct gsmfr_param_frame {
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 int16_t LARc[8];
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 int16_t Nc[4];
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 int16_t bc[4];
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 int16_t Mc[4];
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 int16_t xmaxc[4];
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 int16_t xMc[4][13];
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 };
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 Most of the time the following wrapper function is more useful:
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 void gsmfr_0610_encode_frame(struct gsmfr_0610_state *st, const int16_t *pcm,
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 uint8_t *frame);
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 The output is a 33-byte buffer, filled with the encoded GSM-FR speech frame in
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 the RTP format specified in ETSI TS 101 318 and IETF RFC 3551.
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 If the optional encoder homing feature is desired, call this function right
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 after the call to gsmfr_0610_encode_frame() or gsmfr_0610_encode_params():
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 void gsmfr_0610_encoder_homing(struct gsmfr_0610_state *st, const int16_t *pcm);
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 This function checks to see if the PCM frame (160 linear PCM samples) is an EHF;
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 if the input frame is indeed EHF, the function calls gsmfr_0610_reset().
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96 Decoder specifics
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97 -----------------
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 The internal native form of the 06.10 decoder once again uses
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 struct gsmfr_param_frame:
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102 void gsmfr_0610_decode_params(struct gsmfr_0610_state *st,
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103 const struct gsmfr_param_frame *param,
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104 int16_t *pcm);
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
105
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106 The more commonly used RTP-format version is:
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108 void gsmfr_0610_decode_frame(struct gsmfr_0610_state *st, const uint8_t *frame,
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109 int16_t *pcm);
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111 Please note:
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113 1) The basic GSM 06.10 decoder is just that: there is no SID recognition or DTX
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 handling, every possible input bit pattern will be interpreted and decoded
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115 as a GSM 06.10 speech frame.
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117 2) There is no decoder homing function at this layer, and no check for DHF.
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119 3) The RTP signature nibble 0xD is ignored (not checked) by
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
120 gsmfr_0610_decode_frame().
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
121
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
122 Rx DTX preprocessor block
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
123 =========================
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
124
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
125 The Rx DTX preprocessor is its own stateful element, independent from the 06.10
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
126 decoder to which it is usually coupled. Libgsmfr2 provides a "fulldec" wrapper
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
127 that incorporates both elements, but the ability to use the Rx DTX preprocessor
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
128 by itself still remains, unchanged from our previous libgsmfrp offering. One
535
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
129 significant application for this preprocessor by itself, without immediately
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
130 following it with the GSM 06.10 decode step, is the TFO/TrFO transform of 3GPP
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
131 TS 28.062 section C.3.2.1.1 for GSM-FR: our Rx DTX preprocessor does exactly
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
132 what that section calls for, specifically in "case 1" where the input UL frame
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
133 stream may contain SIDs and BFI frame gaps, but the output must be 100% valid
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
134 frames and SID-free. The current version of libgsmfr2 includes some additional
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
135 provisions for using our preprocessor block as a TFO transform in both non-DTXd
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
136 and DTXd-enabled configurations, as detailed in a later section of this
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
137 document.
297
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
138
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
139 The state structure for this block is struct gsmfr_preproc_state, and it is
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
140 allocated with this function:
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
141
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
142 struct gsmfr_preproc_state *gsmfr_preproc_create(void);
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
143
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
144 Like other state structures in Themyscira GSM codec libraries, this opaque
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
145 state is malloc'ed as a single chunk and can be simply freed afterward. A
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
146 reset function is also provided:
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
147
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
148 void gsmfr_preproc_reset(struct gsmfr_preproc_state *state);
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
149
535
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
150 There is also a public const datum with the size of this structure, allowing
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
151 use of talloc and other alternative schemes:
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
152
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
153 extern const unsigned gsmfr_preproc_state_size;
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
154
297
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
155 Preprocessing good frames
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
156 -------------------------
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
157
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
158 For every good traffic frame (BFI=0) you receive from the radio subsystem, you
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
159 need to call this preprocessor function:
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
160
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
161 void gsmfr_preproc_good_frame(struct gsmfr_preproc_state *state,
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
162 uint8_t *frame);
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
163
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
164 The second argument is both input and output, i.e., the frame is modified in
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
165 place. If the received frame is not SID (specifically, if the SID field
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
166 deviates from the SID codeword by 16 or more bits, per GSM 06.31 section 6.1.1),
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
167 then the frame (considered a good speech frame) will be left unmodified (i.e.,
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
168 it is to be passed unchanged to the GSM 06.10 decoder), but preprocessor state
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
169 will be updated. OTOH, if the received frame is classified as either valid or
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
170 invalid SID per GSM 06.31, then the output frame will contain comfort noise
535
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
171 generated by the preprocessor using a PRNG, or a speech muting or silence frame
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
172 in some corner cases involving invalid SID.
297
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
173
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
174 GSM-FR RTP (originally libgsm) 0xD magic: the upper nibble of the first byte
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
175 can be anything on input to gsmfr_preproc_good_frame(), but the output frame
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
176 will always have the correct magic in it.
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
177
535
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
178 There is also a variant of this function (implemented as a wrapper) that applies
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
179 homing logic:
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
180
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
181 void gsmfr_preproc_good_frame_hm(struct gsmfr_preproc_state *state,
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
182 uint8_t *frame);
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
183
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
184 This function operates just like plain gsmfr_preproc_good_frame() except for
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
185 one difference: if the input matches the decoder homing frame (DHF), the state
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
186 is reset with an internal call to gsmfr_preproc_reset(). (Because the DHF is
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
187 still a good speech frame, it is always passed through to the output unchanged
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
188 by both functions - the only difference is the effect on subsequent state.)
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
189 The homing version of good frame preproc is intended for TFO applications, and
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
190 is invoked internally by gsmfr_tfo_xfrm_main() function described in a later
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
191 section of this document.
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
192
297
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
193 Handling BFI conditions
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
194 -----------------------
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
195
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
196 If you received a lost/missing frame indication instead of a good traffic frame,
535
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
197 call one of these preprocessor functions:
297
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
198
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
199 void gsmfr_preproc_bfi(struct gsmfr_preproc_state *state, int taf,
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
200 uint8_t *frame_out);
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
201
535
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
202 or
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
203
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
204 void gsmfr_preproc_bfi_bits(struct gsmfr_preproc_state *state,
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
205 const uint8_t *bad_frame, int taf,
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
206 uint8_t *frame_out);
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
207
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
208 gsmfr_preproc_bfi_bits() should be called if you received payload bits along
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
209 with the BFI flag; plain gsmfr_preproc_bfi() should be called if you received
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
210 BFI with no data. The bad frame passed to gsmfr_preproc_bfi_bits() is used
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
211 only to check if the BFI should be handled as an invalid SID rather than the
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
212 more common case of an unusable frame - see GSM 06.31 for definitions of these
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
213 terms. Past the SID check, the bad frame content is a don't-care, and there is
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
214 no provision for making any use of erroneous frames like in EFR.
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
215
297
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
216 TAF is a flag defined in GSM 06.31 section 6.1.1; if you don't have this flag,
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
217 pass 0 - you will lose the function of comfort noise muting in the event of
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
218 prolonged SID loss, but all other Rx DTX functions will still work the same.
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
219
535
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
220 With both functions the 33-byte buffer pointed to by frame_out is only an
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
221 output, i.e., prior buffer content is a don't-care. The frame generated by the
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
222 preprocessor may be substitution/muting, comfort noise or silence depending on
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
223 the state.
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
224
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
225 gsmfr_preproc_bfi_bits() arguments bad_frame and frame_out can point to the
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
226 same memory: the function finishes analyzing bad_frame input before it starts
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
227 writing to frame_out.
297
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
228
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
229 GSM-FR full decoder
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
230 ===================
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
231
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
232 The full decoder is a high-level feature of libgsmfr2, incorporating both the
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
233 Rx DTX preprocessor block and the GSM 06.10 decoder block. The state structure
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
234 for the full decoder (struct gsmfr_fulldec_state) internally incorporates both
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
235 struct gsmfr_0610_state and gsmfr_preproc_state, but because it is implemented
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
236 inside libgsmfr2, it is still malloc'ed as a single chunk and can thus be
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
237 released with a single free() call. The functions for allocating and
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
238 initializing this state follow the established pattern:
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
239
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
240 struct gsmfr_fulldec_state *gsmfr_fulldec_create(void);
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
241
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
242 void gsmfr_fulldec_reset(struct gsmfr_fulldec_state *state);
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
243
535
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
244 extern const unsigned gsmfr_fulldec_state_size;
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
245
297
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
246 The reset function internally calls gsmfr_0610_reset() and
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
247 gsmfr_preproc_reset(), initializing both processing blocks.
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
248
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
249 Frame processing functions are also straightforward:
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
250
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
251 void gsmfr_fulldec_good_frame(struct gsmfr_fulldec_state *state,
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
252 const uint8_t *frame, int16_t *pcm);
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
253
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
254 void gsmfr_fulldec_bfi(struct gsmfr_fulldec_state *state, int taf,
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
255 int16_t *pcm);
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
256
535
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
257 void gsmfr_fulldec_bfi_bits(struct gsmfr_fulldec_state *state,
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
258 const uint8_t *bad_frame, int taf, int16_t *pcm);
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
259
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
260 These functions follow the same pattern as gsmfr_preproc_good_frame(),
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
261 gsmfr_preproc_bfi() and gsmfr_preproc_bfi_bits(), but the output is a 160-sample
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
262 linear PCM buffer. Also note that the frame input to gsmfr_fulldec_good_frame()
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
263 is const, unlike the situation with gsmfr_preproc_good_frame() - the copying
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
264 into a scratchpad buffer (on the stack) happens inside this "fulldec" wrapper.
297
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
265
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
266 The "fulldec" layer also adds the decoder homing feature:
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
267 gsmfr_fulldec_good_frame() detects decoder homing frames and invokes
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
268 gsmfr_fulldec_reset() when required, and also implements EHF output per the
6b479cfb06a4 beginning of libgsmfr2 documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
269 spec.
298
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
270
535
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
271 Full decoder RTP input
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
272 ----------------------
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
273
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
274 If a network element is receiving GSM-FR input via RTP and needs to feed this
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
275 input to the decoder, the RTP payload handler needs to support both the basic
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
276 RTP format of ETSI TS 101 318 (also RFC 3551) and the extended RTP format of
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
277 TW-TS-001. Depending on the format received, and depending on bit flags in the
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
278 TEH octet in the case of TW-TS-001, one of the 3 main processing functions
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
279 listed above will need to be called. Seeing that this complex logic should be
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
280 abstracted away from applications into the library, we've added the following
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
281 wrapper function:
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
282
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
283 int gsmfr_fulldec_rtp_in(struct gsmfr_fulldec_state *state,
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
284 const uint8_t *rtp_pl, unsigned rtp_pl_len,
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
285 int16_t *pcm);
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
286
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
287 The input is the received RTP payload: array of bytes and length. It is
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
288 acceptable to pass 0 as rtp_pl_len, in which case rtp_pl pointer can be NULL.
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
289 The function proceeds as follows:
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
290
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
291 * If the input is valid RTP format for GSM-FR (either basic or extended), it is
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
292 passed to the appropriate main processing function. Unlike the permissive
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
293 stance taken in lower-level functions, RTP input validation includes a check
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
294 of 0xD signature of GSM-FR, as well as validation of TEH octet signature and
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
295 consistency in the case of TW-TS-001. The return value is 0, indicating that
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
296 good input was received.
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
297
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
298 * If the input is a zero-length payload (rtp_pl_len is 0, rtp_pl may be NULL),
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
299 it is treated like BFI-no-data with TAF=0. The return value is 0, meaning
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
300 that this input is still considered valid.
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
301
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
302 * All other inputs are considered invalid. Linear PCM output is still generated
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
303 by calling gsmfr_fulldec_bfi(), but the return value is -1, signaling invalid
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
304 RTP input.
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
305
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
306 TFO transform
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
307 =============
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
308
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
309 "TFO transform" is the term adopted by Themyscira Wireless for the non-trivial
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
310 transform on GSM codec frames called for by the TFO spec, 3GPP TS 28.062
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
311 section C.3.2.1.1. For each of the 3 classic GSM codecs, this transform can
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
312 operate in two modes:
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
313
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
314 DTXd=0: the input UL frame stream from call leg A may contain SIDs and BFI
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
315 frame gaps, but the output to call leg B DL must be 100% valid frames and
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
316 SID-free.
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
317
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
318 DTXd=1: the output to call leg B DL is allowed to contain both good speech and
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
319 valid SID frames, just like the output of a DTX-enabled speech encoder.
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
320 Furthermore, it can be presumed that network operators who enable DTXd seek to
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
321 reap its benefits in terms of radio interference reduction, hence the
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
322 DTXd-enabled TFO transform should actually make use of DTXd capability.
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
323
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
324 In the case of GSM-FR codec, the TFO transform with DTXd=0 is identical to the
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
325 Rx DTX preprocessor part of the standard endpoint decoder, hence our "preproc"
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
326 block is directly suited to serve as such. OTOH, the case of DTXd=1 is
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
327 different: heeding the implied need to actually make use of DTXd when possible
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
328 requires implementing a transform that is not the same as the preprocessor to
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
329 be applied just prior to local GSM 06.10 decoding, hence the DTXd-enabled TFO
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
330 transform is a different entity.
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
331
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
332 The approach implemented in Themyscira libgsmfr2 is a hybrid:
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
333
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
334 * The preprocessor block described earlier in this document functions both as
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
335 the necessary component of the full endpoint decoder and as the TFO transform
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
336 for DTXd=0.
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
337
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
338 * TFO transform for DTXd=1 is implemented as a two-step process:
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
339
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
340 1) Regular main processing functions of the preproc block produce output that
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
341 is SID-free, containing synthetic "speech" frames in the case of comfort
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
342 noise or silence.
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
343
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
344 2) A special post-processor function needs to be called immediately afterward.
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
345 This function selectively transforms some output frames into SIDs based on
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
346 a flag set in the state structure.
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
347
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
348 In order to make this approach possible, all main processing functions of the
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
349 preproc block do a little bit of extra housekeeping to keep track of whether or
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
350 not their output can be replaced with SID, logic that is unnecessary when this
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
351 block functions as part of the full endpoint decoder or as non-DTXd TFO
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
352 transform. However, this logic is very simple and the overhead is very light.
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
353
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
354 TFO transform API
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
355 -----------------
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
356
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
357 The state structure was already described earlier: it is
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
358 struct gsmfr_preproc_state, created either with gsmfr_preproc_create() or by
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
359 externally allocating the needed memory based on gsmfr_preproc_state_size and
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
360 then initializing it with gsmfr_preproc_reset(). The following API functions
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
361 are then available:
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
362
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
363 int gsmfr_tfo_xfrm_main(struct gsmfr_preproc_state *state,
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
364 const uint8_t *rtp_in, unsigned rtp_in_len,
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
365 uint8_t *frame_out);
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
366
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
367 int gsmfr_tfo_xfrm_dtxd(struct gsmfr_preproc_state *state, uint8_t *frame_out);
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
368
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
369 gsmfr_tfo_xfrm_main() is the TFO transform counterpart to
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
370 gsmfr_fulldec_rtp_in(), described in detail earlier. It is also possible (and
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
371 allowed) to call gsmfr_preproc_* main processing functions directly, but the
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
372 RTP wrapper is convenient for the same reasons as in the case of the full
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
373 decoder. In this mode of usage, the only difference between the full decoder
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
374 and the TFO transform is that the former emits linear PCM output, whereas the
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
375 latter emits 33-byte GSM-FR codec frames to be sent to call leg B downlink.
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
376
536
a3300483ae74 doc/FR1-library-API: document return value from gsmfr_tfo_xfrm_*
Mychaela Falconia <falcon@freecalypso.org>
parents: 535
diff changeset
377 The return value from gsmfr_tfo_xfrm_main() is the same as that of
a3300483ae74 doc/FR1-library-API: document return value from gsmfr_tfo_xfrm_*
Mychaela Falconia <falcon@freecalypso.org>
parents: 535
diff changeset
378 gsmfr_fulldec_rtp_in(): 0 if the the RTP input was considered good or -1 if it
a3300483ae74 doc/FR1-library-API: document return value from gsmfr_tfo_xfrm_*
Mychaela Falconia <falcon@freecalypso.org>
parents: 535
diff changeset
379 is invalid. In the case of invalid RTP input that produces -1 return value,
a3300483ae74 doc/FR1-library-API: document return value from gsmfr_tfo_xfrm_*
Mychaela Falconia <falcon@freecalypso.org>
parents: 535
diff changeset
380 gsmfr_tfo_xfrm_main() calls gsmfr_preproc_bfi(), just like how
a3300483ae74 doc/FR1-library-API: document return value from gsmfr_tfo_xfrm_*
Mychaela Falconia <falcon@freecalypso.org>
parents: 535
diff changeset
381 gsmfr_fulldec_rtp_in() calls gsmfr_fulldec_bfi() under the same conditions.
a3300483ae74 doc/FR1-library-API: document return value from gsmfr_tfo_xfrm_*
Mychaela Falconia <falcon@freecalypso.org>
parents: 535
diff changeset
382
535
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
383 If DTXd is in use, then the call to gsmfr_tfo_xfrm_main() needs to be directly
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
384 followed by a call to gsmfr_tfo_xfrm_dtxd(), operating on the same output buffer
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
385 with the same state structure. The output will then be changed to SID when
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
386 appropriate for the current state.
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
387
536
a3300483ae74 doc/FR1-library-API: document return value from gsmfr_tfo_xfrm_*
Mychaela Falconia <falcon@freecalypso.org>
parents: 535
diff changeset
388 The return value from gsmfr_tfo_xfrm_dtxd() is the SP flag of GSM 06.31: 1 if
a3300483ae74 doc/FR1-library-API: document return value from gsmfr_tfo_xfrm_*
Mychaela Falconia <falcon@freecalypso.org>
parents: 535
diff changeset
389 the output frame is speech or 0 if it is SID.
a3300483ae74 doc/FR1-library-API: document return value from gsmfr_tfo_xfrm_*
Mychaela Falconia <falcon@freecalypso.org>
parents: 535
diff changeset
390
535
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
391 TFO transform homing
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
392 --------------------
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
393
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
394 3GPP specs are silent on whether or not TFO transforms should implement homing,
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
395 i.e., whether or not they should reset to home state when a decoder homing frame
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
396 passes through. However, at Themyscira Wireless we believe in building
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
397 deterministic systems whose bit-exact behavior can be modeled and relied upon;
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
398 for this reason, our implementation of TFO transform does include in-band
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
399 homing. In accord with this design decision, gsmfr_tfo_xfrm_main() internally
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
400 calls gsmfr_preproc_good_frame_hm() described earlier instead of plain
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
401 gsmfr_preproc_good_frame().
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
402
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
403 With DTXd=1, if a stream of DHFs is input to the TFO transform, the same stream
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
404 of DHFs will appear on the output, i.e., DTXd won't kick in. (The same behavior
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
405 occurs in a standard 3GPP-compliant speech encoder whose input is a stream of
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
406 0xD5 octets in PCMA or 0xFE in PCMU.) However, any BFIs following this DHF
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
407 will be immediately converted to SID, under the same conditions when our TFO
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
408 transform with DTXd=0 emits silence frames of GSM 06.11.
bf7bbc7d494f doc/FR1-library-API: document new additions
Mychaela Falconia <falcon@freecalypso.org>
parents: 299
diff changeset
409
298
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
410 Stateless utility functions
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
411 ===========================
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
412
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
413 Conversions between RTP packed format and broken-down codec parameters are
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
414 stateless and implemented with highly efficient code. There are two versions;
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
415 this version converts between packed frames and struct gsmfr_param_frame used
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
416 by 06.10 encoder and decoder functions:
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
417
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
418 void gsmfr_pack_frame(const struct gsmfr_param_frame *param, uint8_t *frame);
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
419 void gsmfr_unpack_frame(const uint8_t *frame, struct gsmfr_param_frame *param);
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
420
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
421 and this version converts between packed frames and a straight linear array of
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
422 76 parameters:
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
423
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
424 void gsmfr_pack_from_array(const int16_t *params, uint8_t *frame);
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
425 void gsmfr_unpack_to_array(const uint8_t *frame, int16_t *params);
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
426
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
427 The latter functions gsmfr_pack_from_array() and gsmfr_unpack_to_array() are
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
428 drop-in replacements for gsm_implode() and gsm_explode() from old libgsm. The
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
429 order of parameters in this array is the canonical one: first all LARc, then
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
430 all params for the first subframe, then the second subframe, then the third and
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
431 the fourth. OTOH, struct gsmfr_param_frame uses functional grouping, chosen
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
432 for ease of porting of original libgsm code.
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
433
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
434 Both unpacking functions (gsmfr_unpack_frame() and gsmfr_unpack_to_array())
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
435 ignore the upper nibble of the first byte, i.e., the 0xD signature is not
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
436 enforced. However, this signature is always set correctly by gsmfr_pack_frame()
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
437 and gsmfr_pack_from_array(), and also by gsmfr_0610_encode_frame() function
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
438 which calls gsmfr_pack_frame() as its finishing step.
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
439
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
440 The last remaining stateless utility function performs SID classification of
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
441 received GSM-FR frames:
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
442
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
443 int gsmfr_preproc_sid_classify(const uint8_t *frame);
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
444
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
445 This function analyzes an RTP-encoded FR frame (the upper nibble of the first
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
446 byte is NOT checked for 0xD signature) for the SID codeword of GSM 06.12 and
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
447 classifies the frame as SID=0, SID=1 or SID=2 per the rules of GSM 06.31
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
448 section 6.1.1. This classification is the first processing step performed by
a45f806cada9 doc/FR1-library-API: document stateless utility functions
Mychaela Falconia <falcon@freecalypso.org>
parents: 297
diff changeset
449 gsmfr_preproc_good_frame().
299
59751c8fc773 doc/FR1-library-API: finish in first pass
Mychaela Falconia <falcon@freecalypso.org>
parents: 298
diff changeset
450
59751c8fc773 doc/FR1-library-API: finish in first pass
Mychaela Falconia <falcon@freecalypso.org>
parents: 298
diff changeset
451 Public constant definitions
59751c8fc773 doc/FR1-library-API: finish in first pass
Mychaela Falconia <falcon@freecalypso.org>
parents: 298
diff changeset
452 ===========================
59751c8fc773 doc/FR1-library-API: finish in first pass
Mychaela Falconia <falcon@freecalypso.org>
parents: 298
diff changeset
453
59751c8fc773 doc/FR1-library-API: finish in first pass
Mychaela Falconia <falcon@freecalypso.org>
parents: 298
diff changeset
454 Our public header file <tw_gsmfr.h> provides these constant definitions, which
59751c8fc773 doc/FR1-library-API: finish in first pass
Mychaela Falconia <falcon@freecalypso.org>
parents: 298
diff changeset
455 should be self-explanatory:
59751c8fc773 doc/FR1-library-API: finish in first pass
Mychaela Falconia <falcon@freecalypso.org>
parents: 298
diff changeset
456
59751c8fc773 doc/FR1-library-API: finish in first pass
Mychaela Falconia <falcon@freecalypso.org>
parents: 298
diff changeset
457 #define GSMFR_RTP_FRAME_LEN 33
59751c8fc773 doc/FR1-library-API: finish in first pass
Mychaela Falconia <falcon@freecalypso.org>
parents: 298
diff changeset
458 #define GSMFR_NUM_PARAMS 76
59751c8fc773 doc/FR1-library-API: finish in first pass
Mychaela Falconia <falcon@freecalypso.org>
parents: 298
diff changeset
459
59751c8fc773 doc/FR1-library-API: finish in first pass
Mychaela Falconia <falcon@freecalypso.org>
parents: 298
diff changeset
460 Public const data items
59751c8fc773 doc/FR1-library-API: finish in first pass
Mychaela Falconia <falcon@freecalypso.org>
parents: 298
diff changeset
461 =======================
59751c8fc773 doc/FR1-library-API: finish in first pass
Mychaela Falconia <falcon@freecalypso.org>
parents: 298
diff changeset
462
59751c8fc773 doc/FR1-library-API: finish in first pass
Mychaela Falconia <falcon@freecalypso.org>
parents: 298
diff changeset
463 There are two special GSM-FR frame bit patterns defined in the specs: there is
59751c8fc773 doc/FR1-library-API: finish in first pass
Mychaela Falconia <falcon@freecalypso.org>
parents: 298
diff changeset
464 the silence frame of GSM 06.11, and there is the decoder homing frame specified
59751c8fc773 doc/FR1-library-API: finish in first pass
Mychaela Falconia <falcon@freecalypso.org>
parents: 298
diff changeset
465 in later versions of GSM 06.10. RTP-packed representations of both frames are
59751c8fc773 doc/FR1-library-API: finish in first pass
Mychaela Falconia <falcon@freecalypso.org>
parents: 298
diff changeset
466 included in libgsmfr2, and are made public:
59751c8fc773 doc/FR1-library-API: finish in first pass
Mychaela Falconia <falcon@freecalypso.org>
parents: 298
diff changeset
467
59751c8fc773 doc/FR1-library-API: finish in first pass
Mychaela Falconia <falcon@freecalypso.org>
parents: 298
diff changeset
468 extern const uint8_t gsmfr_preproc_silence_frame[GSMFR_RTP_FRAME_LEN];
59751c8fc773 doc/FR1-library-API: finish in first pass
Mychaela Falconia <falcon@freecalypso.org>
parents: 298
diff changeset
469 extern const uint8_t gsmfr_decoder_homing_frame[GSMFR_RTP_FRAME_LEN];