annotate tremor/bitwise.c @ 26286:fc1724f6552c

Darwin and Win32 DVD support libs are handled separately, take them back out of the combined system and DVD header test in the dvdread check.
author diego
date Tue, 01 Apr 2008 21:59:39 +0000
parents e891ff7a7b6c
children e83eef58b30a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14280
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
1 /********************************************************************
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
2 * *
15250
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
3 * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
5 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
6 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
14280
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
7 * *
15250
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
8 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 *
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
9 * by the Xiph.Org Foundation http://www.xiph.org/ *
14280
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
10 * *
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
11 ********************************************************************
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
12
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
13 function: packing variable sized words into an octet stream
15250
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
14 last mod: $Id$
14280
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
15
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
16 ********************************************************************/
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
17
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
18 /* We're 'LSb' endian; if we write a word but read individual bits,
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
19 then we'll read the lsb first */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
20
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
21 #include <string.h>
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
22 #include <stdlib.h>
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
23 #include "ogg.h"
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
24
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
25 #define BUFFER_INCREMENT 256
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
26
15250
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
27 static const unsigned long mask[]=
14280
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
28 {0x00000000,0x00000001,0x00000003,0x00000007,0x0000000f,
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
29 0x0000001f,0x0000003f,0x0000007f,0x000000ff,0x000001ff,
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
30 0x000003ff,0x000007ff,0x00000fff,0x00001fff,0x00003fff,
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
31 0x00007fff,0x0000ffff,0x0001ffff,0x0003ffff,0x0007ffff,
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
32 0x000fffff,0x001fffff,0x003fffff,0x007fffff,0x00ffffff,
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
33 0x01ffffff,0x03ffffff,0x07ffffff,0x0fffffff,0x1fffffff,
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
34 0x3fffffff,0x7fffffff,0xffffffff };
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
35
15250
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
36 static const unsigned int mask8B[]=
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
37 {0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
38
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
39 void oggpack_writeinit(oggpack_buffer *b){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
40 memset(b,0,sizeof(*b));
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
41 b->ptr=b->buffer=_ogg_malloc(BUFFER_INCREMENT);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
42 b->buffer[0]='\0';
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
43 b->storage=BUFFER_INCREMENT;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
44 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
45
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
46 void oggpackB_writeinit(oggpack_buffer *b){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
47 oggpack_writeinit(b);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
48 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
49
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
50 void oggpack_writetrunc(oggpack_buffer *b,long bits){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
51 long bytes=bits>>3;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
52 bits-=bytes*8;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
53 b->ptr=b->buffer+bytes;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
54 b->endbit=bits;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
55 b->endbyte=bytes;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
56 *b->ptr&=mask[bits];
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
57 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
58
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
59 void oggpackB_writetrunc(oggpack_buffer *b,long bits){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
60 long bytes=bits>>3;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
61 bits-=bytes*8;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
62 b->ptr=b->buffer+bytes;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
63 b->endbit=bits;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
64 b->endbyte=bytes;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
65 *b->ptr&=mask8B[bits];
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
66 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
67
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
68 /* Takes only up to 32 bits. */
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
69 void oggpack_write(oggpack_buffer *b,unsigned long value,int bits){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
70 if(b->endbyte+4>=b->storage){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
71 b->buffer=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
72 b->storage+=BUFFER_INCREMENT;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
73 b->ptr=b->buffer+b->endbyte;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
74 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
75
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
76 value&=mask[bits];
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
77 bits+=b->endbit;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
78
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
79 b->ptr[0]|=value<<b->endbit;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
80
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
81 if(bits>=8){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
82 b->ptr[1]=(unsigned char)(value>>(8-b->endbit));
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
83 if(bits>=16){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
84 b->ptr[2]=(unsigned char)(value>>(16-b->endbit));
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
85 if(bits>=24){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
86 b->ptr[3]=(unsigned char)(value>>(24-b->endbit));
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
87 if(bits>=32){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
88 if(b->endbit)
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
89 b->ptr[4]=(unsigned char)(value>>(32-b->endbit));
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
90 else
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
91 b->ptr[4]=0;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
92 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
93 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
94 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
95 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
96
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
97 b->endbyte+=bits/8;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
98 b->ptr+=bits/8;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
99 b->endbit=bits&7;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
100 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
101
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
102 /* Takes only up to 32 bits. */
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
103 void oggpackB_write(oggpack_buffer *b,unsigned long value,int bits){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
104 if(b->endbyte+4>=b->storage){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
105 b->buffer=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
106 b->storage+=BUFFER_INCREMENT;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
107 b->ptr=b->buffer+b->endbyte;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
108 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
109
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
110 value=(value&mask[bits])<<(32-bits);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
111 bits+=b->endbit;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
112
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
113 b->ptr[0]|=value>>(24+b->endbit);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
114
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
115 if(bits>=8){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
116 b->ptr[1]=(unsigned char)(value>>(16+b->endbit));
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
117 if(bits>=16){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
118 b->ptr[2]=(unsigned char)(value>>(8+b->endbit));
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
119 if(bits>=24){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
120 b->ptr[3]=(unsigned char)(value>>(b->endbit));
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
121 if(bits>=32){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
122 if(b->endbit)
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
123 b->ptr[4]=(unsigned char)(value<<(8-b->endbit));
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
124 else
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
125 b->ptr[4]=0;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
126 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
127 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
128 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
129 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
130
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
131 b->endbyte+=bits/8;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
132 b->ptr+=bits/8;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
133 b->endbit=bits&7;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
134 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
135
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
136 void oggpack_writealign(oggpack_buffer *b){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
137 int bits=8-b->endbit;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
138 if(bits<8)
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
139 oggpack_write(b,0,bits);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
140 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
141
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
142 void oggpackB_writealign(oggpack_buffer *b){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
143 int bits=8-b->endbit;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
144 if(bits<8)
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
145 oggpackB_write(b,0,bits);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
146 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
147
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
148 static void oggpack_writecopy_helper(oggpack_buffer *b,
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
149 void *source,
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
150 long bits,
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
151 void (*w)(oggpack_buffer *,
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
152 unsigned long,
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
153 int),
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
154 int msb){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
155 unsigned char *ptr=(unsigned char *)source;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
156
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
157 long bytes=bits/8;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
158 bits-=bytes*8;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
159
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
160 if(b->endbit){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
161 int i;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
162 /* unaligned copy. Do it the hard way. */
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
163 for(i=0;i<bytes;i++)
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
164 w(b,(unsigned long)(ptr[i]),8);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
165 }else{
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
166 /* aligned block copy */
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
167 if(b->endbyte+bytes+1>=b->storage){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
168 b->storage=b->endbyte+bytes+BUFFER_INCREMENT;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
169 b->buffer=_ogg_realloc(b->buffer,b->storage);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
170 b->ptr=b->buffer+b->endbyte;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
171 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
172
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
173 memmove(b->ptr,source,bytes);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
174 b->ptr+=bytes;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
175 b->endbyte+=bytes;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
176 *b->ptr=0;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
177
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
178 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
179 if(bits){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
180 if(msb)
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
181 w(b,(unsigned long)(ptr[bytes]>>(8-bits)),bits);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
182 else
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
183 w(b,(unsigned long)(ptr[bytes]),bits);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
184 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
185 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
186
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
187 void oggpack_writecopy(oggpack_buffer *b,void *source,long bits){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
188 oggpack_writecopy_helper(b,source,bits,oggpack_write,0);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
189 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
190
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
191 void oggpackB_writecopy(oggpack_buffer *b,void *source,long bits){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
192 oggpack_writecopy_helper(b,source,bits,oggpackB_write,1);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
193 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
194
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
195 void oggpack_reset(oggpack_buffer *b){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
196 b->ptr=b->buffer;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
197 b->buffer[0]=0;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
198 b->endbit=b->endbyte=0;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
199 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
200
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
201 void oggpackB_reset(oggpack_buffer *b){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
202 oggpack_reset(b);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
203 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
204
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
205 void oggpack_writeclear(oggpack_buffer *b){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
206 _ogg_free(b->buffer);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
207 memset(b,0,sizeof(*b));
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
208 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
209
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
210 void oggpackB_writeclear(oggpack_buffer *b){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
211 oggpack_writeclear(b);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
212 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
213
14280
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
214 void oggpack_readinit(oggpack_buffer *b,unsigned char *buf,int bytes){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
215 memset(b,0,sizeof(*b));
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
216 b->buffer=b->ptr=buf;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
217 b->storage=bytes;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
218 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
219
15250
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
220 void oggpackB_readinit(oggpack_buffer *b,unsigned char *buf,int bytes){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
221 oggpack_readinit(b,buf,bytes);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
222 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
223
14280
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
224 /* Read in bits without advancing the bitptr; bits <= 32 */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
225 long oggpack_look(oggpack_buffer *b,int bits){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
226 unsigned long ret;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
227 unsigned long m=mask[bits];
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
228
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
229 bits+=b->endbit;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
230
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
231 if(b->endbyte+4>=b->storage){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
232 /* not the main path */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
233 if(b->endbyte*8+bits>b->storage*8)return(-1);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
234 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
235
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
236 ret=b->ptr[0]>>b->endbit;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
237 if(bits>8){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
238 ret|=b->ptr[1]<<(8-b->endbit);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
239 if(bits>16){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
240 ret|=b->ptr[2]<<(16-b->endbit);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
241 if(bits>24){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
242 ret|=b->ptr[3]<<(24-b->endbit);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
243 if(bits>32 && b->endbit)
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
244 ret|=b->ptr[4]<<(32-b->endbit);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
245 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
246 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
247 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
248 return(m&ret);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
249 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
250
15250
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
251 /* Read in bits without advancing the bitptr; bits <= 32 */
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
252 long oggpackB_look(oggpack_buffer *b,int bits){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
253 unsigned long ret;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
254 int m=32-bits;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
255
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
256 bits+=b->endbit;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
257
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
258 if(b->endbyte+4>=b->storage){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
259 /* not the main path */
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
260 if(b->endbyte*8+bits>b->storage*8)return(-1);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
261 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
262
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
263 ret=b->ptr[0]<<(24+b->endbit);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
264 if(bits>8){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
265 ret|=b->ptr[1]<<(16+b->endbit);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
266 if(bits>16){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
267 ret|=b->ptr[2]<<(8+b->endbit);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
268 if(bits>24){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
269 ret|=b->ptr[3]<<(b->endbit);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
270 if(bits>32 && b->endbit)
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
271 ret|=b->ptr[4]>>(8-b->endbit);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
272 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
273 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
274 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
275 return ((ret&0xffffffff)>>(m>>1))>>((m+1)>>1);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
276 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
277
14280
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
278 long oggpack_look1(oggpack_buffer *b){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
279 if(b->endbyte>=b->storage)return(-1);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
280 return((b->ptr[0]>>b->endbit)&1);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
281 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
282
15250
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
283 long oggpackB_look1(oggpack_buffer *b){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
284 if(b->endbyte>=b->storage)return(-1);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
285 return((b->ptr[0]>>(7-b->endbit))&1);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
286 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
287
14280
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
288 void oggpack_adv(oggpack_buffer *b,int bits){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
289 bits+=b->endbit;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
290 b->ptr+=bits/8;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
291 b->endbyte+=bits/8;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
292 b->endbit=bits&7;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
293 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
294
15250
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
295 void oggpackB_adv(oggpack_buffer *b,int bits){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
296 oggpack_adv(b,bits);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
297 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
298
14280
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
299 void oggpack_adv1(oggpack_buffer *b){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
300 if(++(b->endbit)>7){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
301 b->endbit=0;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
302 b->ptr++;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
303 b->endbyte++;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
304 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
305 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
306
15250
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
307 void oggpackB_adv1(oggpack_buffer *b){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
308 oggpack_adv1(b);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
309 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
310
14280
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
311 /* bits <= 32 */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
312 long oggpack_read(oggpack_buffer *b,int bits){
15250
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
313 long ret;
14280
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
314 unsigned long m=mask[bits];
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
315
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
316 bits+=b->endbit;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
317
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
318 if(b->endbyte+4>=b->storage){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
319 /* not the main path */
15250
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
320 ret=-1L;
14280
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
321 if(b->endbyte*8+bits>b->storage*8)goto overflow;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
322 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
323
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
324 ret=b->ptr[0]>>b->endbit;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
325 if(bits>8){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
326 ret|=b->ptr[1]<<(8-b->endbit);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
327 if(bits>16){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
328 ret|=b->ptr[2]<<(16-b->endbit);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
329 if(bits>24){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
330 ret|=b->ptr[3]<<(24-b->endbit);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
331 if(bits>32 && b->endbit){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
332 ret|=b->ptr[4]<<(32-b->endbit);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
333 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
334 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
335 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
336 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
337 ret&=m;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
338
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
339 overflow:
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
340
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
341 b->ptr+=bits/8;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
342 b->endbyte+=bits/8;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
343 b->endbit=bits&7;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
344 return(ret);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
345 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
346
15250
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
347 /* bits <= 32 */
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
348 long oggpackB_read(oggpack_buffer *b,int bits){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
349 long ret;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
350 long m=32-bits;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
351
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
352 bits+=b->endbit;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
353
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
354 if(b->endbyte+4>=b->storage){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
355 /* not the main path */
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
356 ret=-1L;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
357 if(b->endbyte*8+bits>b->storage*8)goto overflow;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
358 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
359
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
360 ret=b->ptr[0]<<(24+b->endbit);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
361 if(bits>8){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
362 ret|=b->ptr[1]<<(16+b->endbit);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
363 if(bits>16){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
364 ret|=b->ptr[2]<<(8+b->endbit);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
365 if(bits>24){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
366 ret|=b->ptr[3]<<(b->endbit);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
367 if(bits>32 && b->endbit)
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
368 ret|=b->ptr[4]>>(8-b->endbit);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
369 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
370 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
371 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
372 ret=((ret&0xffffffffUL)>>(m>>1))>>((m+1)>>1);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
373
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
374 overflow:
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
375
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
376 b->ptr+=bits/8;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
377 b->endbyte+=bits/8;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
378 b->endbit=bits&7;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
379 return(ret);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
380 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
381
14280
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
382 long oggpack_read1(oggpack_buffer *b){
15250
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
383 long ret;
14280
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
384
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
385 if(b->endbyte>=b->storage){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
386 /* not the main path */
15250
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
387 ret=-1L;
14280
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
388 goto overflow;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
389 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
390
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
391 ret=(b->ptr[0]>>b->endbit)&1;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
392
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
393 overflow:
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
394
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
395 b->endbit++;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
396 if(b->endbit>7){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
397 b->endbit=0;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
398 b->ptr++;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
399 b->endbyte++;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
400 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
401 return(ret);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
402 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
403
15250
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
404 long oggpackB_read1(oggpack_buffer *b){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
405 long ret;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
406
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
407 if(b->endbyte>=b->storage){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
408 /* not the main path */
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
409 ret=-1L;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
410 goto overflow;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
411 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
412
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
413 ret=(b->ptr[0]>>(7-b->endbit))&1;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
414
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
415 overflow:
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
416
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
417 b->endbit++;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
418 if(b->endbit>7){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
419 b->endbit=0;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
420 b->ptr++;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
421 b->endbyte++;
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
422 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
423 return(ret);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
424 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
425
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
426 long oggpack_bytes(oggpack_buffer *b){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
427 return(b->endbyte+(b->endbit+7)/8);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
428 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
429
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
430 long oggpack_bits(oggpack_buffer *b){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
431 return(b->endbyte*8+b->endbit);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
432 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
433
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
434 long oggpackB_bytes(oggpack_buffer *b){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
435 return oggpack_bytes(b);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
436 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
437
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
438 long oggpackB_bits(oggpack_buffer *b){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
439 return oggpack_bits(b);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
440 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
441
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
442 unsigned char *oggpack_get_buffer(oggpack_buffer *b){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
443 return(b->buffer);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
444 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
445
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
446 unsigned char *oggpackB_get_buffer(oggpack_buffer *b){
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
447 return oggpack_get_buffer(b);
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
448 }
e891ff7a7b6c update to libogg 1.1.2 (needed for Theora)
henry
parents: 14280
diff changeset
449
14280
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
450 #undef BUFFER_INCREMENT