1 /********************************************************************
3 * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. *
5 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
6 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
7 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
9 * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 *
10 * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ *
12 ********************************************************************
14 function: packing variable sized words into an octet stream
16 ********************************************************************/
18 /* We're 'LSb' endian; if we write a word but read individual bits,
19 then we'll read the lsb first */
21 #include "config-tremor.h"
25 const unsigned long oggpack_mask
[] ICONST_ATTR
=
26 {0x00000000,0x00000001,0x00000003,0x00000007,0x0000000f,
27 0x0000001f,0x0000003f,0x0000007f,0x000000ff,0x000001ff,
28 0x000003ff,0x000007ff,0x00000fff,0x00001fff,0x00003fff,
29 0x00007fff,0x0000ffff,0x0001ffff,0x0003ffff,0x0007ffff,
30 0x000fffff,0x001fffff,0x003fffff,0x007fffff,0x00ffffff,
31 0x01ffffff,0x03ffffff,0x07ffffff,0x0fffffff,0x1fffffff,
32 0x3fffffff,0x7fffffff,0xffffffff };
34 void oggpack_readinit(oggpack_buffer
*b
,ogg_reference
*r
){
35 memset(b
,0,sizeof(*b
));
39 b
->headptr
=b
->head
->buffer
->data
+b
->head
->begin
;
40 b
->headend
=b
->head
->length
;
44 #define _lookspan() while(!end){\
47 ptr=head->buffer->data + head->begin;\
51 /* Read in bits without advancing the bitptr; bits <= 32 */
52 long oggpack_look_full(oggpack_buffer
*b
,int bits
) ICODE_ATTR_TREMOR_NOT_MDCT
;
53 long oggpack_look_full(oggpack_buffer
*b
,int bits
){
54 unsigned long m
=oggpack_mask
[bits
];
59 if(bits
>= b
->headend
<<3){
61 unsigned char *ptr
=b
->headptr
;
62 ogg_reference
*head
=b
->head
;
68 ret
=*ptr
++>>b
->headbit
;
72 ret
|=*ptr
++<<(8-b
->headbit
);
76 ret
|=*ptr
++<<(16-b
->headbit
);
80 ret
|=*ptr
++<<(24-b
->headbit
);
81 if(bits
>32 && b
->headbit
){
84 ret
|=*ptr
<<(32-b
->headbit
);
93 /* make this a switch jump-table */
94 ret
=b
->headptr
[0]>>b
->headbit
;
96 ret
|=b
->headptr
[1]<<(8-b
->headbit
);
98 ret
|=b
->headptr
[2]<<(16-b
->headbit
);
100 ret
|=b
->headptr
[3]<<(24-b
->headbit
);
101 if(bits
>32 && b
->headbit
)
102 ret
|=b
->headptr
[4]<<(32-b
->headbit
);
112 /* spans forward and finds next byte. Never halts */
113 static void _span_one(oggpack_buffer
*b
){
116 b
->count
+=b
->head
->length
;
117 b
->head
=b
->head
->next
;
118 b
->headptr
=b
->head
->buffer
->data
+b
->head
->begin
;
119 b
->headend
=b
->head
->length
;
125 static int _halt_one(oggpack_buffer
*b
){
134 long oggpack_read(oggpack_buffer
*b
,register int bits
) ICODE_ATTR_TREMOR_NOT_MDCT
;
135 long oggpack_read(oggpack_buffer
*b
,register int bits
){
136 unsigned long m
=oggpack_mask
[bits
];
141 if(bits
>= b
->headend
<<3){
143 if(b
->headend
<0)return -1;
146 if (_halt_one(b
)) return -1;
147 ret
=*b
->headptr
>>b
->headbit
;
154 if (_halt_one(b
)) return -1;
155 ret
|=*b
->headptr
<<(8-b
->headbit
);
162 if (_halt_one(b
)) return -1;
163 ret
|=*b
->headptr
<<(16-b
->headbit
);
170 if (_halt_one(b
)) return -1;
171 ret
|=*b
->headptr
<<(24-b
->headbit
);
178 if (_halt_one(b
)) return -1;
179 if(b
->headbit
)ret
|=*b
->headptr
<<(32-b
->headbit
);
192 ret
=b
->headptr
[0]>>b
->headbit
;
194 ret
|=b
->headptr
[1]<<(8-b
->headbit
);
196 ret
|=b
->headptr
[2]<<(16-b
->headbit
);
198 ret
|=b
->headptr
[3]<<(24-b
->headbit
);
199 if(bits
>32 && b
->headbit
){
200 ret
|=b
->headptr
[4]<<(32-b
->headbit
);
206 b
->headptr
+=((unsigned)bits
)/8;
207 b
->headend
-=((unsigned)bits
)/8;