mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-29 15:36:13 +00:00 
			
		
		
		
	git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2@7221 65c4cc65-6c06-0410-ace0-fbb531ad65f3
		
			
				
	
	
		
			176 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
		
			5.3 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 "packing.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;
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 |