Mercurial > hg > audiostuff
comparison 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 |
comparison
equal
deleted
inserted
replaced
| 1:9cadc470e3da | 2:13be24d74cd2 |
|---|---|
| 1 | |
| 2 /****************************************************************** | |
| 3 | |
| 4 iLBC Speech Coder ANSI-C Source Code | |
| 5 | |
| 6 packing.c | |
| 7 | |
| 8 Copyright (C) The Internet Society (2004). | |
| 9 All Rights Reserved. | |
| 10 | |
| 11 ******************************************************************/ | |
| 12 | |
| 13 #include <math.h> | |
| 14 #include <stdlib.h> | |
| 15 | |
| 16 #include "iLBC_define.h" | |
| 17 #include "constants.h" | |
| 18 #include "helpfun.h" | |
| 19 #include "string.h" | |
| 20 | |
| 21 /*----------------------------------------------------------------* | |
| 22 * splitting an integer into first most significant bits and | |
| 23 * remaining least significant bits | |
| 24 *---------------------------------------------------------------*/ | |
| 25 | |
| 26 void packsplit(int *index, /* (i) the value to split */ | |
| 27 int *firstpart, /* (o) the value specified by most | |
| 28 significant bits */ | |
| 29 int *rest, /* (o) the value specified by least | |
| 30 significant bits */ | |
| 31 int bitno_firstpart, /* (i) number of bits in most | |
| 32 significant part */ | |
| 33 int bitno_total /* (i) number of bits in full range | |
| 34 of value */ | |
| 35 ) | |
| 36 { | |
| 37 int bitno_rest = bitno_total - bitno_firstpart; | |
| 38 | |
| 39 *firstpart = *index >> (bitno_rest); | |
| 40 *rest = *index - (*firstpart << (bitno_rest)); | |
| 41 } | |
| 42 | |
| 43 /*----------------------------------------------------------------* | |
| 44 * combining a value corresponding to msb's with a value | |
| 45 * corresponding to lsb's | |
| 46 *---------------------------------------------------------------*/ | |
| 47 | |
| 48 void packcombine(int *index, /* (i/o) the msb value in the | |
| 49 combined value out */ | |
| 50 int rest, /* (i) the lsb value */ | |
| 51 int bitno_rest /* (i) the number of bits in the | |
| 52 lsb part */ | |
| 53 ) | |
| 54 { | |
| 55 *index = *index << bitno_rest; | |
| 56 *index += rest; | |
| 57 } | |
| 58 | |
| 59 /*----------------------------------------------------------------* | |
| 60 * packing of bits into bitstream, i.e., vector of bytes | |
| 61 *---------------------------------------------------------------*/ | |
| 62 | |
| 63 void dopack(unsigned char **bitstream, /* (i/o) on entrance pointer to | |
| 64 place in bitstream to pack | |
| 65 new data, on exit pointer | |
| 66 to place in bitstream to | |
| 67 pack future data */ | |
| 68 int index, /* (i) the value to pack */ | |
| 69 int bitno, /* (i) the number of bits that the | |
| 70 value will fit within */ | |
| 71 int *pos /* (i/o) write position in the | |
| 72 current byte */ | |
| 73 ) | |
| 74 { | |
| 75 int posLeft; | |
| 76 | |
| 77 /* Clear the bits before starting in a new byte */ | |
| 78 | |
| 79 if ((*pos) == 0) { | |
| 80 | |
| 81 | |
| 82 | |
| 83 | |
| 84 | |
| 85 **bitstream = 0; | |
| 86 } | |
| 87 | |
| 88 while (bitno > 0) { | |
| 89 | |
| 90 /* Jump to the next byte if end of this byte is reached */ | |
| 91 | |
| 92 if (*pos == 8) { | |
| 93 *pos = 0; | |
| 94 (*bitstream)++; | |
| 95 **bitstream = 0; | |
| 96 } | |
| 97 | |
| 98 posLeft = 8 - (*pos); | |
| 99 | |
| 100 /* Insert index into the bitstream */ | |
| 101 | |
| 102 if (bitno <= posLeft) { | |
| 103 **bitstream |= (unsigned char) (index << (posLeft - bitno)); | |
| 104 *pos += bitno; | |
| 105 bitno = 0; | |
| 106 } else { | |
| 107 **bitstream |= (unsigned char) (index >> (bitno - posLeft)); | |
| 108 | |
| 109 *pos = 8; | |
| 110 index -= ((index >> (bitno - posLeft)) << (bitno - posLeft)); | |
| 111 | |
| 112 bitno -= posLeft; | |
| 113 } | |
| 114 } | |
| 115 } | |
| 116 | |
| 117 /*----------------------------------------------------------------* | |
| 118 * unpacking of bits from bitstream, i.e., vector of bytes | |
| 119 *---------------------------------------------------------------*/ | |
| 120 | |
| 121 void unpack(unsigned char **bitstream, /* (i/o) on entrance pointer to | |
| 122 place in bitstream to | |
| 123 unpack new data from, on | |
| 124 exit pointer to place in | |
| 125 bitstream to unpack future | |
| 126 data from */ | |
| 127 int *index, /* (o) resulting value */ | |
| 128 int bitno, /* (i) number of bits used to | |
| 129 represent the value */ | |
| 130 int *pos /* (i/o) read position in the | |
| 131 current byte */ | |
| 132 ) | |
| 133 { | |
| 134 int BitsLeft; | |
| 135 | |
| 136 *index = 0; | |
| 137 | |
| 138 while (bitno > 0) { | |
| 139 | |
| 140 /* move forward in bitstream when the end of the | |
| 141 byte is reached */ | |
| 142 | |
| 143 if (*pos == 8) { | |
| 144 *pos = 0; | |
| 145 (*bitstream)++; | |
| 146 } | |
| 147 | |
| 148 BitsLeft = 8 - (*pos); | |
| 149 | |
| 150 /* Extract bits to index */ | |
| 151 | |
| 152 if (BitsLeft >= bitno) { | |
| 153 *index += ((((**bitstream) << (*pos)) & 0xFF) >> (8 - bitno)); | |
| 154 | |
| 155 *pos += bitno; | |
| 156 bitno = 0; | |
| 157 } else { | |
| 158 | |
| 159 if ((8 - bitno) > 0) { | |
| 160 *index += ((((**bitstream) << (*pos)) & 0xFF) >> (8 - bitno)); | |
| 161 *pos = 8; | |
| 162 } else { | |
| 163 *index += (((int) (((**bitstream) << (*pos)) & 0xFF)) << | |
| 164 (bitno - 8)); | |
| 165 *pos = 8; | |
| 166 } | |
| 167 bitno -= BitsLeft; | |
| 168 } | |
| 169 } | |
| 170 } |
