media/libtheora/lib/bitpack.c

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/media/libtheora/lib/bitpack.c	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,114 @@
     1.4 +/********************************************************************
     1.5 + *                                                                  *
     1.6 + * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE.   *
     1.7 + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
     1.8 + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
     1.9 + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
    1.10 + *                                                                  *
    1.11 + * THE OggTheora SOURCE CODE IS (C) COPYRIGHT 1994-2009             *
    1.12 + * by the Xiph.Org Foundation and contributors http://www.xiph.org/ *
    1.13 + *                                                                  *
    1.14 + ********************************************************************
    1.15 +
    1.16 +  function: packing variable sized words into an octet stream
    1.17 +  last mod: $Id: bitpack.c 17410 2010-09-21 21:53:48Z tterribe $
    1.18 +
    1.19 + ********************************************************************/
    1.20 +#include <string.h>
    1.21 +#include <stdlib.h>
    1.22 +#include "bitpack.h"
    1.23 +
    1.24 +/*We're 'MSb' endian; if we write a word but read individual bits,
    1.25 +   then we'll read the MSb first.*/
    1.26 +
    1.27 +void oc_pack_readinit(oc_pack_buf *_b,unsigned char *_buf,long _bytes){
    1.28 +  memset(_b,0,sizeof(*_b));
    1.29 +  _b->ptr=_buf;
    1.30 +  _b->stop=_buf+_bytes;
    1.31 +}
    1.32 +
    1.33 +static oc_pb_window oc_pack_refill(oc_pack_buf *_b,int _bits){
    1.34 +  const unsigned char *ptr;
    1.35 +  const unsigned char *stop;
    1.36 +  oc_pb_window         window;
    1.37 +  int                  available;
    1.38 +  unsigned             shift;
    1.39 +  stop=_b->stop;
    1.40 +  ptr=_b->ptr;
    1.41 +  window=_b->window;
    1.42 +  available=_b->bits;
    1.43 +  shift=OC_PB_WINDOW_SIZE-available;
    1.44 +  while(7<shift&&ptr<stop){
    1.45 +    shift-=8;
    1.46 +    window|=(oc_pb_window)*ptr++<<shift;
    1.47 +  }
    1.48 +  _b->ptr=ptr;
    1.49 +  available=OC_PB_WINDOW_SIZE-shift;
    1.50 +  if(_bits>available){
    1.51 +    if(ptr>=stop){
    1.52 +      _b->eof=1;
    1.53 +      available=OC_LOTS_OF_BITS;
    1.54 +    }
    1.55 +    else window|=*ptr>>(available&7);
    1.56 +  }
    1.57 +  _b->bits=available;
    1.58 +  return window;
    1.59 +}
    1.60 +
    1.61 +int oc_pack_look1(oc_pack_buf *_b){
    1.62 +  oc_pb_window window;
    1.63 +  int          available;
    1.64 +  window=_b->window;
    1.65 +  available=_b->bits;
    1.66 +  if(available<1)_b->window=window=oc_pack_refill(_b,1);
    1.67 +  return window>>OC_PB_WINDOW_SIZE-1;
    1.68 +}
    1.69 +
    1.70 +void oc_pack_adv1(oc_pack_buf *_b){
    1.71 +  _b->window<<=1;
    1.72 +  _b->bits--;
    1.73 +}
    1.74 +
    1.75 +/*Here we assume that 0<=_bits&&_bits<=32.*/
    1.76 +long oc_pack_read_c(oc_pack_buf *_b,int _bits){
    1.77 +  oc_pb_window window;
    1.78 +  int          available;
    1.79 +  long         result;
    1.80 +  window=_b->window;
    1.81 +  available=_b->bits;
    1.82 +  if(_bits==0)return 0;
    1.83 +  if(available<_bits){
    1.84 +    window=oc_pack_refill(_b,_bits);
    1.85 +    available=_b->bits;
    1.86 +  }
    1.87 +  result=window>>OC_PB_WINDOW_SIZE-_bits;
    1.88 +  available-=_bits;
    1.89 +  window<<=1;
    1.90 +  window<<=_bits-1;
    1.91 +  _b->window=window;
    1.92 +  _b->bits=available;
    1.93 +  return result;
    1.94 +}
    1.95 +
    1.96 +int oc_pack_read1_c(oc_pack_buf *_b){
    1.97 +  oc_pb_window window;
    1.98 +  int          available;
    1.99 +  int          result;
   1.100 +  window=_b->window;
   1.101 +  available=_b->bits;
   1.102 +  if(available<1){
   1.103 +    window=oc_pack_refill(_b,1);
   1.104 +    available=_b->bits;
   1.105 +  }
   1.106 +  result=window>>OC_PB_WINDOW_SIZE-1;
   1.107 +  available--;
   1.108 +  window<<=1;
   1.109 +  _b->window=window;
   1.110 +  _b->bits=available;
   1.111 +  return result;
   1.112 +}
   1.113 +
   1.114 +long oc_pack_bytes_left(oc_pack_buf *_b){
   1.115 +  if(_b->eof)return -1;
   1.116 +  return _b->stop-_b->ptr+(_b->bits>>3);
   1.117 +}

mercurial