Mercurial > hg > audiostuff
diff intercom/ilbc/packing.c @ 2:13be24d74cd2
import intercom-0.4.1
author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
---|---|
date | Fri, 25 Jun 2010 09:57:52 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/intercom/ilbc/packing.c Fri Jun 25 09:57:52 2010 +0200 @@ -0,0 +1,170 @@ + + /****************************************************************** + + iLBC Speech Coder ANSI-C Source Code + + packing.c + + Copyright (C) The Internet Society (2004). + All Rights Reserved. + + ******************************************************************/ + +#include <math.h> +#include <stdlib.h> + +#include "iLBC_define.h" +#include "constants.h" +#include "helpfun.h" +#include "string.h" + + /*----------------------------------------------------------------* + * splitting an integer into first most significant bits and + * remaining least significant bits + *---------------------------------------------------------------*/ + +void packsplit(int *index, /* (i) the value to split */ + int *firstpart, /* (o) the value specified by most + significant bits */ + int *rest, /* (o) the value specified by least + significant bits */ + int bitno_firstpart, /* (i) number of bits in most + significant part */ + int bitno_total /* (i) number of bits in full range + of value */ + ) +{ + int bitno_rest = bitno_total - bitno_firstpart; + + *firstpart = *index >> (bitno_rest); + *rest = *index - (*firstpart << (bitno_rest)); +} + + /*----------------------------------------------------------------* + * combining a value corresponding to msb's with a value + * corresponding to lsb's + *---------------------------------------------------------------*/ + +void packcombine(int *index, /* (i/o) the msb value in the + combined value out */ + int rest, /* (i) the lsb value */ + int bitno_rest /* (i) the number of bits in the + lsb part */ + ) +{ + *index = *index << bitno_rest; + *index += rest; +} + + /*----------------------------------------------------------------* + * packing of bits into bitstream, i.e., vector of bytes + *---------------------------------------------------------------*/ + +void dopack(unsigned char **bitstream, /* (i/o) on entrance pointer to + place in bitstream to pack + new data, on exit pointer + to place in bitstream to + pack future data */ + int index, /* (i) the value to pack */ + int bitno, /* (i) the number of bits that the + value will fit within */ + int *pos /* (i/o) write position in the + current byte */ + ) +{ + int posLeft; + + /* Clear the bits before starting in a new byte */ + + if ((*pos) == 0) { + + + + + + **bitstream = 0; + } + + while (bitno > 0) { + + /* Jump to the next byte if end of this byte is reached */ + + if (*pos == 8) { + *pos = 0; + (*bitstream)++; + **bitstream = 0; + } + + posLeft = 8 - (*pos); + + /* Insert index into the bitstream */ + + if (bitno <= posLeft) { + **bitstream |= (unsigned char) (index << (posLeft - bitno)); + *pos += bitno; + bitno = 0; + } else { + **bitstream |= (unsigned char) (index >> (bitno - posLeft)); + + *pos = 8; + index -= ((index >> (bitno - posLeft)) << (bitno - posLeft)); + + bitno -= posLeft; + } + } +} + + /*----------------------------------------------------------------* + * unpacking of bits from bitstream, i.e., vector of bytes + *---------------------------------------------------------------*/ + +void unpack(unsigned char **bitstream, /* (i/o) on entrance pointer to + place in bitstream to + unpack new data from, on + exit pointer to place in + bitstream to unpack future + data from */ + int *index, /* (o) resulting value */ + int bitno, /* (i) number of bits used to + represent the value */ + int *pos /* (i/o) read position in the + current byte */ + ) +{ + int BitsLeft; + + *index = 0; + + while (bitno > 0) { + + /* move forward in bitstream when the end of the + byte is reached */ + + if (*pos == 8) { + *pos = 0; + (*bitstream)++; + } + + BitsLeft = 8 - (*pos); + + /* Extract bits to index */ + + if (BitsLeft >= bitno) { + *index += ((((**bitstream) << (*pos)) & 0xFF) >> (8 - bitno)); + + *pos += bitno; + bitno = 0; + } else { + + if ((8 - bitno) > 0) { + *index += ((((**bitstream) << (*pos)) & 0xFF) >> (8 - bitno)); + *pos = 8; + } else { + *index += (((int) (((**bitstream) << (*pos)) & 0xFF)) << + (bitno - 8)); + *pos = 8; + } + bitno -= BitsLeft; + } + } +}