comparison libtwamr/ietf_out.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
children
comparison
equal deleted inserted replaced
440:bc736a8654af 441:ebe499058c63
1 /*
2 * The function implemented in this module is responsible for turning
3 * struct amr_param_frame (encoder output) into an RFC 4867 payload.
4 */
5
6 #include <stdint.h>
7 #include "tw_amr.h"
8 #include "typedef.h"
9 #include "namespace.h"
10 #include "cnst.h"
11 #include "int_defs.h"
12 #include "if1_func.h"
13
14 static const uint8_t total_bytes_per_ft[9] =
15 {13, 14, 16, 18, 20, 21, 27, 32, 6};
16
17 static const uint8_t first_octet_per_ft[9] =
18 {0x04, 0x0C, 0x14, 0x1C, 0x24, 0x2C, 0x34, 0x3C, 0x44};
19
20 unsigned amr_frame_to_ietf(const struct amr_param_frame *frame, uint8_t *bytes)
21 {
22 Word16 serial[MAX_SERIAL_SIZE];
23 Word16 sti;
24 enum Mode ft;
25
26 switch (frame->type) {
27 case TX_SPEECH_GOOD:
28 ft = frame->mode;
29 break;
30 case TX_SID_FIRST:
31 ft = MRDTX;
32 sti = 0;
33 break;
34 case TX_SID_UPDATE:
35 ft = MRDTX;
36 sti = 1;
37 break;
38 case TX_NO_DATA:
39 default:
40 bytes[0] = 0x7C;
41 return 1;
42 }
43 Prm2bits(ft, frame->param, serial);
44 bytes[0] = first_octet_per_ft[ft];
45 if1_pack_bytes(ft, serial, bytes + 1);
46 if (ft == MRDTX) {
47 if (sti)
48 bytes[5] |= 0x10;
49 if (frame->mode & 1)
50 bytes[5] |= 0x08;
51 if (frame->mode & 2)
52 bytes[5] |= 0x04;
53 if (frame->mode & 4)
54 bytes[5] |= 0x02;
55 }
56 return total_bytes_per_ft[ft];
57 }