⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 packing.cpp

📁 KphoneSI (kpsi) is a SIP (Session Initiation Protocol) user agent for Linux, with which you can in
💻 CPP
字号:
   /******************************************************************       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;           }       }   }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -