FreeCalypso > hg > gsm-codec-lib
diff amrconv/if1_pack.c @ 215:4c4649a5fec3
amrconv: new program amr-cod2ietf
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 21 Apr 2023 06:30:29 +0000 |
parents | amrconv/if1_unpack.c@934cf92a1c45 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/amrconv/if1_pack.c Fri Apr 21 06:30:29 2023 +0000 @@ -0,0 +1,89 @@ +/* + * In this module we implement our function for packing AMR codec bits + * from an array containing them in the codec's natural bit order + * into the octet form of AMR IF1 and RFC 4867. + */ + +#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 +pack_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; + msb_set_bit(if1_bytes, n, codec_bits[nb]); + } +} + +amr_if1_pack(if1_bytes, codec_bits, mode) + uint8_t *if1_bytes, *codec_bits; + unsigned mode; +{ + switch (mode) { + case MR475: + pack_bits(if1_bytes, codec_bits, AMR_NBITS_475, + amr_475_bit_order); + if1_bytes[11] &= 0xFE; + return(0); + case MR515: + pack_bits(if1_bytes, codec_bits, AMR_NBITS_515, + amr_515_bit_order); + if1_bytes[12] &= 0xFE; + return(0); + case MR59: + pack_bits(if1_bytes, codec_bits, AMR_NBITS_59, + amr_59_bit_order); + if1_bytes[14] &= 0xFC; + return(0); + case MR67: + pack_bits(if1_bytes, codec_bits, AMR_NBITS_67, + amr_67_bit_order); + if1_bytes[16] &= 0xFC; + return(0); + case MR74: + pack_bits(if1_bytes, codec_bits, AMR_NBITS_74, + amr_74_bit_order); + if1_bytes[18] &= 0xF0; + return(0); + case MR795: + pack_bits(if1_bytes, codec_bits, AMR_NBITS_795, + amr_795_bit_order); + if1_bytes[19] &= 0xFE; + return(0); + case MR102: + pack_bits(if1_bytes, codec_bits, AMR_NBITS_102, + amr_102_bit_order); + if1_bytes[25] &= 0xF0; + return(0); + case MR122: + pack_bits(if1_bytes, codec_bits, AMR_NBITS_122, + amr_122_bit_order); + if1_bytes[30] &= 0xF0; + return(0); + case MRDTX: + pack_bits(if1_bytes, codec_bits, AMR_NBITS_SID, + (const uint8_t *) 0); + if1_bytes[4] &= 0xE0; + return(0); + default: + return(-1); + } +}