diff amrconv/param_asm.c @ 211:78d1a6513393

amrconv: new program amr-cod-parse
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 20 Apr 2023 01:30:46 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/amrconv/param_asm.c	Thu Apr 20 01:30:46 2023 +0000
@@ -0,0 +1,143 @@
+/*
+ * This C module is common between amr-cod-parse and amr-ietf-parse
+ * utilities.  It contains the function that takes an array of bits
+ * in the codec's natural order and reassembles these bits into
+ * an array of codec parameters.
+ */
+
+#include <stdint.h>
+#include "amr_defs.h"
+
+/* parameter sizes (# of bits), one table per mode */
+
+static const uint8_t bitno_MR475[PRMNO_MR475] = {
+   8, 8, 7,                                 /* LSP VQ          */
+   8, 7, 2, 8,                              /* first subframe  */
+   4, 7, 2,                                 /* second subframe */
+   4, 7, 2, 8,                              /* third subframe  */
+   4, 7, 2,                                 /* fourth subframe */
+};
+
+static const uint8_t bitno_MR515[PRMNO_MR515] = {
+   8, 8, 7,                                 /* LSP VQ          */
+   8, 7, 2, 6,                              /* first subframe  */
+   4, 7, 2, 6,                              /* second subframe */
+   4, 7, 2, 6,                              /* third subframe  */
+   4, 7, 2, 6,                              /* fourth subframe */
+};
+
+static const uint8_t bitno_MR59[PRMNO_MR59] = {
+   8, 9, 9,                                 /* LSP VQ          */
+   8, 9, 2, 6,                              /* first subframe  */
+   4, 9, 2, 6,                              /* second subframe */
+   8, 9, 2, 6,                              /* third subframe  */
+   4, 9, 2, 6,                              /* fourth subframe */
+};
+
+static const uint8_t bitno_MR67[PRMNO_MR67] = {
+   8, 9, 9,                                 /* LSP VQ          */
+   8, 11, 3, 7,                             /* first subframe  */
+   4, 11, 3, 7,                             /* second subframe */
+   8, 11, 3, 7,                             /* third subframe  */
+   4, 11, 3, 7,                             /* fourth subframe */
+};
+
+static const uint8_t bitno_MR74[PRMNO_MR74] = {
+   8, 9, 9,                                 /* LSP VQ          */
+   8, 13, 4, 7,                             /* first subframe  */
+   5, 13, 4, 7,                             /* second subframe */
+   8, 13, 4, 7,                             /* third subframe  */
+   5, 13, 4, 7,                             /* fourth subframe */
+};
+
+static const uint8_t bitno_MR795[PRMNO_MR795] = {
+   9, 9, 9,                                 /* LSP VQ          */
+   8, 13, 4, 4, 5,                          /* first subframe  */
+   6, 13, 4, 4, 5,                          /* second subframe */
+   8, 13, 4, 4, 5,                          /* third subframe  */
+   6, 13, 4, 4, 5,                          /* fourth subframe */
+};
+
+static const uint8_t bitno_MR102[PRMNO_MR102] = {
+   8, 9, 9,                                 /* LSP VQ          */
+   8, 1, 1, 1, 1, 10, 10, 7, 7,             /* first subframe  */
+   5, 1, 1, 1, 1, 10, 10, 7, 7,             /* second subframe */
+   8, 1, 1, 1, 1, 10, 10, 7, 7,             /* third subframe  */
+   5, 1, 1, 1, 1, 10, 10, 7, 7,             /* fourth subframe */
+};
+
+static const uint8_t bitno_MR122[PRMNO_MR122] = {
+   7, 8, 9, 8, 6,                           /* LSP VQ          */
+   9, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 5,   /* first subframe  */
+   6, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 5,   /* second subframe */
+   9, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 5,   /* third subframe  */
+   6, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 5    /* fourth subframe */
+};
+
+static const uint8_t bitno_MRDTX[PRMNO_MRDTX] = {
+  3,
+  8, 9, 9,
+  6
+};
+
+static void
+bits_to_params(bits, params, table, nparam)
+	const uint8_t *bits;
+	uint16_t *params;
+	const uint8_t *table;
+	unsigned nparam;
+{
+	const uint8_t *p = bits;
+	const uint8_t *t = table;
+	unsigned n, m, acc;
+
+	for (n = 0; n < nparam; n++) {
+		acc = 0;
+		for (m = 0; m < *t; m++) {
+			acc <<= 1;
+			if (*p)
+				acc |= 1;
+			p++;
+		}
+		params[n] = acc;
+		t++;
+	}
+}
+
+reassemble_amr_params(bits, params, mode)
+	const uint8_t *bits;
+	uint16_t *params;
+	unsigned mode;
+{
+	switch (mode) {
+	case MR475:
+		bits_to_params(bits, params, bitno_MR475, PRMNO_MR475);
+		return(0);
+	case MR515:
+		bits_to_params(bits, params, bitno_MR515, PRMNO_MR515);
+		return(0);
+	case MR59:
+		bits_to_params(bits, params, bitno_MR59, PRMNO_MR59);
+		return(0);
+	case MR67:
+		bits_to_params(bits, params, bitno_MR67, PRMNO_MR67);
+		return(0);
+	case MR74:
+		bits_to_params(bits, params, bitno_MR74, PRMNO_MR74);
+		return(0);
+	case MR795:
+		bits_to_params(bits, params, bitno_MR795, PRMNO_MR795);
+		return(0);
+	case MR102:
+		bits_to_params(bits, params, bitno_MR102, PRMNO_MR102);
+		return(0);
+	case MR122:            
+		bits_to_params(bits, params, bitno_MR122, PRMNO_MR122);
+		return(0);
+	case MRDTX:
+		bits_to_params(bits, params, bitno_MRDTX, PRMNO_MRDTX);
+		return(0);
+	default:
+		return(-1);
+	}
+}