diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/intercom/ilbc/packing.c	Fri Jun 25 09:57:52 2010 +0200
@@ -0,0 +1,170 @@
+
+   /******************************************************************
+
+       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;
+    }
+  }
+}

Repositories maintained by Peter Meerwald, pmeerw@pmeerw.net.