FreeCalypso > hg > gsm-codec-lib
annotate frtest/dlcap-sync.c @ 581:e2d5cad04cbf
libgsmhr1 RxFE: store CN R0+LPC separately from speech
In the original GSM 06.06 code the ECU for speech mode is entirely
separate from the CN generator, maintaining separate state. (The
main intertie between them is the speech vs CN state variable,
distinguishing between speech and CN BFIs, in addition to the
CN-specific function of distinguishing between initial and update
SIDs.)
In the present RxFE implementation I initially thought that we could
use the same saved_frame buffer for both ECU and CN, overwriting
just the first 4 params (R0 and LPC) when a valid SID comes in.
However, I now realize it was a bad idea: the original code has a
corner case (long sequence of speech-mode BFIs to put the ECU in
state 6, then SID and CN-mode BFIs, then a good speech frame) that
would be broken by that buffer reuse approach. We could eliminate
this corner case by resetting the ECU state when passing through
a CN insertion period, but doing so would needlessly increase
the behavioral diffs between GSM 06.06 and our version.
Solution: use a separate CN-specific buffer for CN R0+LPC parameters,
and match the behavior of GSM 06.06 code in this regard.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 13 Feb 2025 10:02:45 +0000 |
parents | 285381a001fc |
children |
rev | line source |
---|---|
468
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
474
285381a001fc
new program gsmfr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
472
diff
changeset
|
2 * This program reads a TCH/FS downlink capture file from a FreeCalypso GSM MS |
285381a001fc
new program gsmfr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
472
diff
changeset
|
3 * that was produced in a session in which seqsync PCMA or PCMU input |
285381a001fc
new program gsmfr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
472
diff
changeset
|
4 * (seqsyn_[au].inp) was fed into the test call from IP-PSTN side. It looks |
285381a001fc
new program gsmfr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
472
diff
changeset
|
5 * for FRv1 DHF followed by specific frame patterns given by ETSI in |
285381a001fc
new program gsmfr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
472
diff
changeset
|
6 * syn???_[au].cod files, and reports what it finds. Matches indicate |
285381a001fc
new program gsmfr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
472
diff
changeset
|
7 * a particular alignment between the input sequence and encoder frame |
285381a001fc
new program gsmfr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
472
diff
changeset
|
8 * boundaries, if the network speech transcoder implements the encoder |
285381a001fc
new program gsmfr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
472
diff
changeset
|
9 * homing feature which is optional for FRv1. |
468
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 */ |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 #include <ctype.h> |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 #include <stdio.h> |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 #include <stdint.h> |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 #include <stdlib.h> |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 #include <string.h> |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 #include <strings.h> |
474
285381a001fc
new program gsmfr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
472
diff
changeset
|
18 #include "../libgsmfr2/tw_gsmfr.h" |
468
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 |
474
285381a001fc
new program gsmfr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
472
diff
changeset
|
20 extern const uint8_t sync_from_pcma[160*33]; |
285381a001fc
new program gsmfr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
472
diff
changeset
|
21 extern const uint8_t sync_from_pcmu[160*33]; |
468
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 static int |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 check_for_match(input, table) |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 const uint8_t *input, *table; |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 { |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 unsigned n; |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 |
474
285381a001fc
new program gsmfr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
472
diff
changeset
|
29 for (n = 0; n < 160; n++) { |
285381a001fc
new program gsmfr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
472
diff
changeset
|
30 if (!bcmp(input, table + n * 33, 33)) |
468
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 return n; |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 } |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 return -1; |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 } |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 main(argc, argv) |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 char **argv; |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 { |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 FILE *inf; |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 char linebuf[128]; |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 int lineno, rc; |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 uint16_t status_words[3]; |
474
285381a001fc
new program gsmfr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
472
diff
changeset
|
43 uint8_t tidsp_bytes[33], libgsm_bytes[33]; |
468
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 const uint8_t *match_table; |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 int dhf_state; |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 if (argc != 3) { |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 usage: fprintf(stderr, "usage: %s dlcap-file alaw|ulaw\n", argv[0]); |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 exit(1); |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 } |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 inf = fopen(argv[1], "r"); |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 if (!inf) { |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 perror(argv[1]); |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 exit(1); |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 } |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 if (!strcmp(argv[2], "alaw")) |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 match_table = sync_from_pcma; |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 else if (!strcmp(argv[2], "ulaw")) |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 match_table = sync_from_pcmu; |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 else |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 goto usage; |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 dhf_state = 0; |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 for (lineno = 1; fgets(linebuf, sizeof linebuf, inf); lineno++) { |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 /* support both old and new formats */ |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 if (isxdigit(linebuf[0]) && isxdigit(linebuf[1]) && |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 isxdigit(linebuf[2]) && isxdigit(linebuf[3])) { |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 rc = parse_dlcap_common(linebuf, status_words, |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 tidsp_bytes); |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 if (rc < 0) { |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 invalid: fprintf(stderr, |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 "error: %s is not in the expected format\n", |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 argv[1]); |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 exit(1); |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 } |
474
285381a001fc
new program gsmfr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
472
diff
changeset
|
75 } else if (!strncmp(linebuf, "FR ", 3)) { |
285381a001fc
new program gsmfr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
472
diff
changeset
|
76 rc = parse_dlcap_common(linebuf + 3, status_words, |
468
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 tidsp_bytes); |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 if (rc < 0) |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 goto invalid; |
474
285381a001fc
new program gsmfr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
472
diff
changeset
|
80 if (linebuf[84] != ' ') |
468
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 goto invalid; |
474
285381a001fc
new program gsmfr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
472
diff
changeset
|
82 if (!isdigit(linebuf[85])) |
468
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 goto invalid; |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 } else |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 goto invalid; |
474
285381a001fc
new program gsmfr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
472
diff
changeset
|
86 if ((status_words[0] & 0xC004) != 0xC000) { |
468
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 dhf_state = 0; |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 continue; |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 } |
474
285381a001fc
new program gsmfr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
472
diff
changeset
|
90 gsm0610_tidsp_to_libgsm(tidsp_bytes, libgsm_bytes); |
285381a001fc
new program gsmfr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
472
diff
changeset
|
91 if (!bcmp(libgsm_bytes, gsmfr_decoder_homing_frame, 33)) { |
468
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 dhf_state = 1; |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 continue; |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 } |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 if (!dhf_state) |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 continue; |
474
285381a001fc
new program gsmfr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
472
diff
changeset
|
97 rc = check_for_match(libgsm_bytes, match_table); |
468
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 if (rc >= 0 && rc <= 159) { |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 printf( |
474
285381a001fc
new program gsmfr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
472
diff
changeset
|
100 "line %d: match to expected sync frame for offset %d\n", |
468
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 lineno, rc); |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 } |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 dhf_state = 0; |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 } |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 exit(0); |
4104b0390fab
efrtest: new program gsmefr-dlcap-sync
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 } |