annotate libgsmhr1/rtp_in.c @ 587:7bce90c844c2 default tip

tw5b-dump: support verbose invalid SID per TW-TS-002 v1.2.0
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 12 Mar 2025 20:38:23 +0000
parents b21ea4ab586d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
492
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * The function implemented in this module takes whatever HRv1 payload format
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 * came in from RTP (can be RFC 5993 with or without TW-TS-002 extensions,
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 * can be bare TS 101 318, can be zero-length or missing payload) and turns it
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 * into canonical TW-TS-002 format, be it for storage or for immediate
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 * further processing.
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 */
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 #include <stdint.h>
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 #include <string.h>
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 #include "tw_gsmhr.h"
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 int gsmhr_rtp_in_preen(const uint8_t *rtp_in, unsigned rtp_in_len,
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 uint8_t *canon_pl)
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 {
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 int ft;
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 switch (rtp_in_len) {
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 case 0:
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 /* BFI-no-data, but not an invalid RTP input per se */
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 canon_pl[0] = 0x70;
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 return 0;
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 case 1:
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 /*
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 * This length is valid only if the payload is in
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 * RFC 5993 or TW-TS-002 format with FT=1 or FT=7.
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 */
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 if (rtp_in[0] & 0x80)
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 goto bad_rtp_input;
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 ft = rtp_in[0] >> 4;
586
b21ea4ab586d libgsmhr1: update for TW-TS-002 version 1.2.0
Mychaela Falconia <falcon@freecalypso.org>
parents: 492
diff changeset
31 switch (ft) {
b21ea4ab586d libgsmhr1: update for TW-TS-002 version 1.2.0
Mychaela Falconia <falcon@freecalypso.org>
parents: 492
diff changeset
32 case 1:
b21ea4ab586d libgsmhr1: update for TW-TS-002 version 1.2.0
Mychaela Falconia <falcon@freecalypso.org>
parents: 492
diff changeset
33 if (rtp_in[0] & 0x04)
b21ea4ab586d libgsmhr1: update for TW-TS-002 version 1.2.0
Mychaela Falconia <falcon@freecalypso.org>
parents: 492
diff changeset
34 goto bad_rtp_input;
b21ea4ab586d libgsmhr1: update for TW-TS-002 version 1.2.0
Mychaela Falconia <falcon@freecalypso.org>
parents: 492
diff changeset
35 /* FALL THRU */
b21ea4ab586d libgsmhr1: update for TW-TS-002 version 1.2.0
Mychaela Falconia <falcon@freecalypso.org>
parents: 492
diff changeset
36 case 7:
492
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 canon_pl[0] = rtp_in[0];
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 return 0;
586
b21ea4ab586d libgsmhr1: update for TW-TS-002 version 1.2.0
Mychaela Falconia <falcon@freecalypso.org>
parents: 492
diff changeset
39 default:
492
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 goto bad_rtp_input;
586
b21ea4ab586d libgsmhr1: update for TW-TS-002 version 1.2.0
Mychaela Falconia <falcon@freecalypso.org>
parents: 492
diff changeset
41 }
492
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 case GSMHR_FRAME_LEN_RPF:
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 /*
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 * The length is that of a TS 101 318 payload.
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 * No further checks can be done: every possible
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 * bit pattern is a valid payload in this format.
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 * But we do need to check for a perfect SID
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 * (the only kind of SID this format allows)
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 * and mark it accordingly in the output.
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 */
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 canon_pl[0] = gsmhr_ts101318_is_perfect_sid(rtp_in) << 4;
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 memcpy(canon_pl + 1, rtp_in, GSMHR_FRAME_LEN_RPF);
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 return 0;
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 case GSMHR_FRAME_LEN_5993:
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 /*
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 * This length is valid only if the payload is in
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 * RFC 5993 or TW-TS-002 format with FT=0, FT=2 or FT=6.
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 */
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 if (rtp_in[0] & 0x80)
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 goto bad_rtp_input;
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 ft = rtp_in[0] >> 4;
586
b21ea4ab586d libgsmhr1: update for TW-TS-002 version 1.2.0
Mychaela Falconia <falcon@freecalypso.org>
parents: 492
diff changeset
62 switch (ft) {
b21ea4ab586d libgsmhr1: update for TW-TS-002 version 1.2.0
Mychaela Falconia <falcon@freecalypso.org>
parents: 492
diff changeset
63 case 1:
b21ea4ab586d libgsmhr1: update for TW-TS-002 version 1.2.0
Mychaela Falconia <falcon@freecalypso.org>
parents: 492
diff changeset
64 if (!(rtp_in[0] & 0x04))
b21ea4ab586d libgsmhr1: update for TW-TS-002 version 1.2.0
Mychaela Falconia <falcon@freecalypso.org>
parents: 492
diff changeset
65 goto bad_rtp_input;
b21ea4ab586d libgsmhr1: update for TW-TS-002 version 1.2.0
Mychaela Falconia <falcon@freecalypso.org>
parents: 492
diff changeset
66 /* FALL THRU */
b21ea4ab586d libgsmhr1: update for TW-TS-002 version 1.2.0
Mychaela Falconia <falcon@freecalypso.org>
parents: 492
diff changeset
67 case 0:
b21ea4ab586d libgsmhr1: update for TW-TS-002 version 1.2.0
Mychaela Falconia <falcon@freecalypso.org>
parents: 492
diff changeset
68 case 2:
b21ea4ab586d libgsmhr1: update for TW-TS-002 version 1.2.0
Mychaela Falconia <falcon@freecalypso.org>
parents: 492
diff changeset
69 case 6:
492
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 memcpy(canon_pl, rtp_in, GSMHR_FRAME_LEN_5993);
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 return 0;
586
b21ea4ab586d libgsmhr1: update for TW-TS-002 version 1.2.0
Mychaela Falconia <falcon@freecalypso.org>
parents: 492
diff changeset
72 default:
492
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 goto bad_rtp_input;
586
b21ea4ab586d libgsmhr1: update for TW-TS-002 version 1.2.0
Mychaela Falconia <falcon@freecalypso.org>
parents: 492
diff changeset
74 }
492
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 default:
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 bad_rtp_input:
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 /*
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 * Treat it like BFI-no-data, and tell the caller
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 * that we received an invalid RTP payload.
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 */
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 canon_pl[0] = 0x70;
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 return -1;
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 }
cc3a831712a4 libgsmhr1: implement arbitrary RTP input
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 }