FreeCalypso > hg > gsm-codec-lib
annotate libgsmfrp/good_frame.c @ 212:0beafaa0623f
amr-cod-parse: handle Mode=-1 in NO_DATA frames
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 20 Apr 2023 02:23:35 +0000 |
parents | 4812e00bc100 |
children | f081a6850fb5 |
rev | line source |
---|---|
5
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 * In this module we implement preprocessing of received good frames. |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 */ |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 #include <stdint.h> |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 #include <string.h> |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 #include "gsm_fr_preproc.h" |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 #include "internal.h" |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 void gsmfr_preproc_good_frame(struct gsmfr_preproc_state *st, gsm_byte *frame) |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 { |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 int sid; |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 /* always set correct magic */ |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 frame[0] = 0xD0 | frame[0] & 0x0F; |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 /* now classify by SID */ |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 sid = gsmfr_preproc_sid_classify(frame); |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 switch (sid) { |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 case 0: /* good speech frame */ |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 memcpy(&st->speech_frame, frame, sizeof(gsm_frame)); |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 st->rx_state = SPEECH; |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 return; |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 case 1: /* invalid SID frame */ |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 if (st->got_valid_sid) { |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 st->rx_state = COMFORT_NOISE; |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 gsmfr_preproc_gen_cn(st, frame); |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 } else { |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 st->rx_state = NO_DATA; |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 memcpy(frame, &gsmfr_preproc_silence_frame, |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 sizeof(gsm_frame)); |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 } |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 return; |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 case 2: /* valid SID frame */ |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 st->got_valid_sid = 1; |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 memcpy(st->sid_prefix, frame, 5); |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 st->sid_xmaxc[0] = ((frame[6] & 0x1F) << 1) | (frame[7] >> 7); |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 st->sid_xmaxc[1] = ((frame[13] & 0x1F) << 1) | (frame[14] >> 7); |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 st->sid_xmaxc[2] = ((frame[20] & 0x1F) << 1) | (frame[21] >> 7); |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 st->sid_xmaxc[3] = ((frame[27] & 0x1F) << 1) | (frame[28] >> 7); |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 st->rx_state = COMFORT_NOISE; |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 gsmfr_preproc_gen_cn(st, frame); |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 return; |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 } |
4812e00bc100
libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 } |