Mercurial > hg > audiostuff
view intercom/ilbc/packing.c @ 4:26cd8f1ef0b1
import spandsp-0.0.6pre17
author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
---|---|
date | Fri, 25 Jun 2010 15:50:58 +0200 |
parents | 13be24d74cd2 |
children |
line wrap: on
line source
/****************************************************************** 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; } } }