view libgsmefr/sid_class.c @ 273:0be493a1e0d6

libgsmfr2: implement gsmfr_0610_decode_frame() wrapper
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 14 Apr 2024 02:51:12 +0000
parents b5726d659915
children
line wrap: on
line source

/*
 * 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;
}