FreeCalypso > hg > gsm-codec-lib
diff amrconv/if1_unpack.c @ 214:934cf92a1c45
amrconv: new program amr-ietf-parse
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 20 Apr 2023 22:48:22 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/amrconv/if1_unpack.c Thu Apr 20 22:48:22 2023 +0000 @@ -0,0 +1,79 @@ +/* + * In this module we implement our function for unpacking bits from AMR IF1 + * and reshuffling them into the codec's natural bit order. + */ + +#include <stdint.h> +#include "amr_defs.h" + +extern const uint8_t amr_475_bit_order[95]; +extern const uint8_t amr_515_bit_order[103]; +extern const uint8_t amr_59_bit_order[118]; +extern const uint8_t amr_67_bit_order[134]; +extern const uint8_t amr_74_bit_order[148]; +extern const uint8_t amr_795_bit_order[159]; +extern const uint8_t amr_102_bit_order[204]; +extern const uint8_t amr_122_bit_order[244]; + +static void +unpack_bits(if1_bytes, codec_bits, nbits, table) + uint8_t *if1_bytes, *codec_bits; + unsigned nbits; + const uint8_t *table; +{ + unsigned n, nb; + + for (n = 0; n < nbits; n++) { + if (table) + nb = table[n]; + else + nb = n; + codec_bits[nb] = msb_get_bit(if1_bytes, n); + } +} + +amr_if1_unpack(if1_bytes, codec_bits, mode) + uint8_t *if1_bytes, *codec_bits; + unsigned mode; +{ + switch (mode) { + case MR475: + unpack_bits(if1_bytes, codec_bits, AMR_NBITS_475, + amr_475_bit_order); + return(0); + case MR515: + unpack_bits(if1_bytes, codec_bits, AMR_NBITS_515, + amr_515_bit_order); + return(0); + case MR59: + unpack_bits(if1_bytes, codec_bits, AMR_NBITS_59, + amr_59_bit_order); + return(0); + case MR67: + unpack_bits(if1_bytes, codec_bits, AMR_NBITS_67, + amr_67_bit_order); + return(0); + case MR74: + unpack_bits(if1_bytes, codec_bits, AMR_NBITS_74, + amr_74_bit_order); + return(0); + case MR795: + unpack_bits(if1_bytes, codec_bits, AMR_NBITS_795, + amr_795_bit_order); + return(0); + case MR102: + unpack_bits(if1_bytes, codec_bits, AMR_NBITS_102, + amr_102_bit_order); + return(0); + case MR122: + unpack_bits(if1_bytes, codec_bits, AMR_NBITS_122, + amr_122_bit_order); + return(0); + case MRDTX: + unpack_bits(if1_bytes, codec_bits, AMR_NBITS_SID, + (const uint8_t *) 0); + return(0); + default: + return(-1); + } +}