FreeCalypso > hg > gsm-codec-lib
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtwamr/ietf_out.c Thu May 09 07:06:31 2024 +0000 @@ -0,0 +1,57 @@ +/* + * The function implemented in this module is responsible for turning + * struct amr_param_frame (encoder output) into an RFC 4867 payload. + */ + +#include <stdint.h> +#include "tw_amr.h" +#include "typedef.h" +#include "namespace.h" +#include "cnst.h" +#include "int_defs.h" +#include "if1_func.h" + +static const uint8_t total_bytes_per_ft[9] = + {13, 14, 16, 18, 20, 21, 27, 32, 6}; + +static const uint8_t first_octet_per_ft[9] = + {0x04, 0x0C, 0x14, 0x1C, 0x24, 0x2C, 0x34, 0x3C, 0x44}; + +unsigned amr_frame_to_ietf(const struct amr_param_frame *frame, uint8_t *bytes) +{ + Word16 serial[MAX_SERIAL_SIZE]; + Word16 sti; + enum Mode ft; + + switch (frame->type) { + case TX_SPEECH_GOOD: + ft = frame->mode; + break; + case TX_SID_FIRST: + ft = MRDTX; + sti = 0; + break; + case TX_SID_UPDATE: + ft = MRDTX; + sti = 1; + break; + case TX_NO_DATA: + default: + bytes[0] = 0x7C; + return 1; + } + Prm2bits(ft, frame->param, serial); + bytes[0] = first_octet_per_ft[ft]; + if1_pack_bytes(ft, serial, bytes + 1); + if (ft == MRDTX) { + if (sti) + bytes[5] |= 0x10; + if (frame->mode & 1) + bytes[5] |= 0x08; + if (frame->mode & 2) + bytes[5] |= 0x04; + if (frame->mode & 4) + bytes[5] |= 0x02; + } + return total_bytes_per_ft[ft]; +}