FreeCalypso > hg > gsm-codec-lib
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); + } +}