182 lines
5.5 KiB
C
182 lines
5.5 KiB
C
|
|
||
|
/******************************************************************
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
}
|
||
|
}
|