FreeCalypso > hg > gsm-codec-lib
comparison libtwamr/if1_unpack.c @ 441:ebe499058c63
libtwamr: implement API functions for RFC 4867 I/O
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 09 May 2024 07:06:31 +0000 |
parents | amrconv/if1_unpack.c@934cf92a1c45 |
children |
comparison
equal
deleted
inserted
replaced
440:bc736a8654af | 441:ebe499058c63 |
---|---|
1 /* | |
2 * In this module we implement our function for unpacking bits from AMR IF1 | |
3 * and reshuffling them into the codec's natural bit order. | |
4 */ | |
5 | |
6 #include <stdint.h> | |
7 #include "tw_amr.h" | |
8 #include "typedef.h" | |
9 #include "namespace.h" | |
10 #include "int_defs.h" | |
11 #include "if1_func.h" | |
12 | |
13 static inline Word16 msb_get_bit(const uint8_t *buf, Word16 bn) | |
14 { | |
15 Word16 pos_byte = bn >> 3; | |
16 Word16 pos_bit = 7 - (bn & 7); | |
17 | |
18 return (buf[pos_byte] >> pos_bit) & 1; | |
19 } | |
20 | |
21 static void unpack_bits(const uint8_t *if1_bytes, Word16 *codec_bits, | |
22 Word16 nbits, const uint8_t *table) | |
23 { | |
24 Word16 n, nb; | |
25 | |
26 for (n = 0; n < nbits; n++) { | |
27 if (table) | |
28 nb = table[n]; | |
29 else | |
30 nb = n; | |
31 codec_bits[nb] = msb_get_bit(if1_bytes, n); | |
32 } | |
33 } | |
34 | |
35 void if1_unpack_bytes(enum Mode mode, const uint8_t *if1_bytes, | |
36 Word16 *serial_bits) | |
37 { | |
38 switch (mode) { | |
39 case MR475: | |
40 unpack_bits(if1_bytes, serial_bits, AMR_NBITS_475, sort_475); | |
41 return; | |
42 case MR515: | |
43 unpack_bits(if1_bytes, serial_bits, AMR_NBITS_515, sort_515); | |
44 return; | |
45 case MR59: | |
46 unpack_bits(if1_bytes, serial_bits, AMR_NBITS_59, sort_59); | |
47 return; | |
48 case MR67: | |
49 unpack_bits(if1_bytes, serial_bits, AMR_NBITS_67, sort_67); | |
50 return; | |
51 case MR74: | |
52 unpack_bits(if1_bytes, serial_bits, AMR_NBITS_74, sort_74); | |
53 return; | |
54 case MR795: | |
55 unpack_bits(if1_bytes, serial_bits, AMR_NBITS_795, sort_795); | |
56 return; | |
57 case MR102: | |
58 unpack_bits(if1_bytes, serial_bits, AMR_NBITS_102, sort_102); | |
59 return; | |
60 case MR122: | |
61 unpack_bits(if1_bytes, serial_bits, AMR_NBITS_122, sort_122); | |
62 return; | |
63 case MRDTX: | |
64 unpack_bits(if1_bytes, serial_bits, AMR_NBITS_SID, | |
65 (const uint8_t *) 0); | |
66 return; | |
67 } | |
68 } |