changeset 31:19a90fa1f608

libgsmefr: implement SID classification
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 23 Nov 2022 08:40:08 +0000
parents 2272ba6f6879
children 9639a44ae2e7
files libgsmefr/Makefile libgsmefr/sidclass.c
diffstat 2 files changed, 71 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libgsmefr/Makefile	Wed Nov 23 08:40:08 2022 +0000
@@ -0,0 +1,21 @@
+CC=	gcc
+CFLAGS=	-O2
+OBJS=	sidclass.o
+LIB=	libgsmefr.a
+
+INSTALL_PREFIX=	/usr/local
+
+all:	${LIB}
+
+${LIB}:	${OBJS}
+	ar rcu $@ ${OBJS}
+	ranlib $@
+
+install:
+	mkdir -p ${INSTALL_PREFIX}/include
+	install -c -m 444 gsm_efr.h ${INSTALL_PREFIX}/include
+	mkdir -p ${INSTALL_PREFIX}/lib
+	install -c -m 444 ${LIB} ${INSTALL_PREFIX}/lib
+
+clean:
+	rm -f *.[oa] errs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libgsmefr/sidclass.c	Wed Nov 23 08:40:08 2022 +0000
@@ -0,0 +1,50 @@
+/*
+ * EFR_sid_classify() utility function classifies an EFR frame
+ * in RTP encoding according to the rules of GSM 06.81 section 6.1.1,
+ * judging it as SID=0, SID=1 or SID=2.
+ */
+
+#include "gsm_efr.h"
+
+static const uint8_t SID_codeword_bit_idx[95] =
+{
+     45,  46,  48,  49,  50,  51,  52,  53,  54,  55,
+     56,  57,  58,  59,  60,  61,  62,  63,  64,  65,
+     66,  67,  68,  94,  95,  96,  98,  99, 100, 101,
+    102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
+    112, 113, 114, 115, 116, 117, 118, 148, 149, 150,
+    151, 152, 153, 154, 155, 156, 157, 158, 159, 160,
+    161, 162, 163, 164, 165, 166, 167, 168, 169, 170,
+    171, 196, 197, 198, 199, 200, 201, 202, 203, 204,
+    205, 206, 207, 208, 209, 212, 213, 214, 215, 216,
+    217, 218, 219, 220, 221
+};
+
+static inline int get_bit(const uint8_t *frame, unsigned bitnum)
+{
+	unsigned bytenum = bitnum >> 3;
+	unsigned bit_in_byte = 7 - (bitnum & 7);
+	unsigned bitmask = 1 << bit_in_byte;
+
+	if (frame[bytenum] & bitmask)
+		return 1;
+	else
+		return 0;
+}
+
+int EFR_sid_classify(const uint8_t *frame)
+{
+	unsigned idx, n;
+
+	n = 0;
+	for (idx = 0; idx < 95; idx++) {
+		if (!get_bit(frame, SID_codeword_bit_idx[idx] + 4))
+			n++;
+		if (n >= 16)
+			return 0;
+	}
+	if (n < 2)
+		return 2;
+	else
+		return 1;
+}