diff trau-decode/extr-fr.c @ 9:0565aaa84b17

trau-decode: implement trau-extr program
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 24 May 2024 19:44:14 +0000
parents trau-decode/parse-fr.c@64b15810dc4c
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trau-decode/extr-fr.c	Fri May 24 19:44:14 2024 +0000
@@ -0,0 +1,75 @@
+/*
+ * This module implements the FR decoding part of trau-extr.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <tw_gsmfr.h>
+
+/* this corresponds to the bit-lengths of the individual codec
+ * parameters as indicated in Table 1.1 of TS 46.010 */
+static const uint8_t gsm_fr_map[GSMFR_NUM_PARAMS] = {
+	6, 6, 5, 5, 4, 4, 3, 3,
+	7, 2, 2, 6, 3, 3, 3, 3,
+	3, 3, 3, 3, 3, 3, 3, 3,
+	3, 7, 2, 2, 6, 3, 3, 3,
+	3, 3, 3, 3, 3, 3, 3, 3,
+	3, 3, 7, 2, 2, 6, 3, 3,
+	3, 3, 3, 3, 3, 3, 3, 3,
+	3, 3, 3, 7, 2, 2, 6, 3,
+	3, 3, 3, 3, 3, 3, 3, 3,
+	3, 3, 3, 3
+};
+
+static unsigned
+get_le(bits, nbits)
+	uint8_t *bits;
+	unsigned nbits;
+{
+	unsigned accum, mask;
+	unsigned n;
+
+	accum = 0;
+	mask = 1;
+	for (n = 0; n < nbits; n++) {
+		if (*bits)
+			accum |= mask;
+		bits++;
+		mask <<= 1;
+	}
+	return accum;
+}
+
+static void
+dbits_to_params(d_bits, params)
+	uint8_t *d_bits;
+	int16_t *params;
+{
+	unsigned np, len;
+	uint8_t *ip;
+	int16_t *op;
+
+	ip = d_bits;
+	op = params;
+	for (np = 0; np < GSMFR_NUM_PARAMS; np++) {
+		len = gsm_fr_map[np];
+		*op++ = get_le(ip, len);
+		ip += len;
+	}
+}
+
+void
+convert_fr_frame(d_bits, outf)
+	uint8_t *d_bits;
+	FILE *outf;
+{
+	int16_t params[GSMFR_NUM_PARAMS];
+	uint8_t rtp_pack[GSMFR_RTP_FRAME_LEN];
+
+	dbits_to_params(d_bits, params);
+	gsmfr_pack_from_array(params, rtp_pack);
+	fwrite(rtp_pack, 1, GSMFR_RTP_FRAME_LEN, outf);
+}