FreeCalypso > hg > gsm-codec-lib
view libgsmefr/sid_class.c @ 105:ecfbced76fea
gsm-amr2efr: add -w option to simulate common wrong implementation
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 27 Nov 2022 05:59:10 +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; }