annotate libgsmfr2/full_dec.c @ 282:9ee8ad3d4d30

frtest: rm gsmfr-hand-test and gsmfr-max-out utils These hack programs were never properly documented and were written only as part of a debug chase, in pursuit of a bug that ultimately turned out to be in our then-hacky patch to osmo-bts-sysmo, before beginning of proper patches in Osmocom. These hack programs need to be dropped from the present sw package because they depend on old libgsm, and we are eliminating that dependency.
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 14 Apr 2024 05:44:47 +0000
parents 4db5fc10fd1a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
279
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * This module implements the "full decoder" functionality of libgsmfr2:
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 * first the Rx DTX handler, then the regular GSM 06.10 decoder. This full
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 * decoder also implements the optional homing feature, resetting both
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 * components upon receiving DHF.
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 */
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 #include <stdint.h>
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 #include <stdlib.h>
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 #include <string.h>
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 #include "tw_gsmfr.h"
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 #include "typedef.h"
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 #include "ed_state.h"
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 #include "pp_state.h"
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 struct gsmfr_fulldec_state {
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 struct gsmfr_0610_state dec_0610;
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 struct gsmfr_preproc_state rx_dtx;
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 int is_homed;
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 };
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 struct gsmfr_fulldec_state *gsmfr_fulldec_create(void)
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 {
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 struct gsmfr_fulldec_state *st;
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 st = malloc(sizeof(struct gsmfr_fulldec_state));
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 if (st)
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 gsmfr_fulldec_reset(st);
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 return st;
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 }
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 void gsmfr_fulldec_reset(struct gsmfr_fulldec_state *st)
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 {
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 gsmfr_0610_reset(&st->dec_0610);
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 gsmfr_preproc_reset(&st->rx_dtx);
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 st->is_homed = 1;
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 }
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 static void emit_ehf_output(int16_t *pcm_out)
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 {
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 unsigned n;
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 for (n = 0; n < 160; n++)
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 pcm_out[n] = 0x0008;
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 }
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 void gsmfr_fulldec_good_frame(struct gsmfr_fulldec_state *st,
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 const uint8_t *frame_in, int16_t *pcm_out)
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 {
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 uint8_t frame_mod[GSMFR_RTP_FRAME_LEN];
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 if (st->is_homed && !memcmp(frame_in, gsmfr_decoder_homing_frame, 12)) {
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 emit_ehf_output(pcm_out);
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 return;
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 }
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 memcpy(frame_mod, frame_in, GSMFR_RTP_FRAME_LEN);
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 gsmfr_preproc_good_frame(&st->rx_dtx, frame_mod);
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 gsmfr_0610_decode_frame(&st->dec_0610, frame_mod, pcm_out);
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 if (!memcmp(frame_in, gsmfr_decoder_homing_frame, GSMFR_RTP_FRAME_LEN))
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 gsmfr_fulldec_reset(st);
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 else
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 st->is_homed = 0;
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 }
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 void gsmfr_fulldec_bfi(struct gsmfr_fulldec_state *st, int taf,
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 int16_t *pcm_out)
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 {
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 uint8_t frame_mod[GSMFR_RTP_FRAME_LEN];
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 if (st->is_homed) {
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 memset(pcm_out, 0, sizeof(int16_t) * 160);
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 return;
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 }
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 gsmfr_preproc_bfi(&st->rx_dtx, taf, frame_mod);
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 gsmfr_0610_decode_frame(&st->dec_0610, frame_mod, pcm_out);
4db5fc10fd1a libgsmfr2: implement full decoder
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 }