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 +}