annotate tremor/misc.h @ 18708:9e2b300db17b

Change free_sh_audio() to take demuxer and stream id as parameters (same as new_sh_audio()) instead of sh_audio_t *, use those to remove the pointer from demuxer->a_streams[] before freeing it. Some demuxers use free_sh_audio() to undo the creation of an already-allocated audio stream in case of error. These uses were unsafe since free_sh_audio() freed the data structure but left the pointer in demuxer->a_streams[], leading to double free later in free_demuxer() (and perhaps use of the freed stream before that, I didn't check).
author uau
date Wed, 14 Jun 2006 14:05:59 +0000
parents 8631a3803289
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 * *
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
3 * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. *
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
4 * *
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
5 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
6 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
7 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
8 * *
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
9 * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 *
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
10 * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ *
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
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
14 function: miscellaneous math and prototypes
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 #ifndef _V_RANDOM_H_
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
19 #define _V_RANDOM_H_
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
20 #include "ivorbiscodec.h"
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
21 #include "os_types.h"
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
22
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
23 #include "asm_arm.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 #ifndef _V_WIDE_MATH
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
26 #define _V_WIDE_MATH
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
27
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
28 #ifndef _LOW_ACCURACY_
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
29 /* 64 bit multiply */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
30
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
31 #include <sys/types.h>
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
32 #include "config.h"
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
33
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
34 #ifndef WORDS_BIGENDIAN
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
35 union magic {
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
36 struct {
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
37 ogg_int32_t lo;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
38 ogg_int32_t hi;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
39 } halves;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
40 ogg_int64_t whole;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
41 };
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
42 #else
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
43 union magic {
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
44 struct {
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
45 ogg_int32_t hi;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
46 ogg_int32_t lo;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
47 } halves;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
48 ogg_int64_t whole;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
49 };
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
50 #endif
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
51
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
52 static inline ogg_int32_t MULT32(ogg_int32_t x, ogg_int32_t y) {
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
53 union magic magic;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
54 magic.whole = (ogg_int64_t)x * y;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
55 return magic.halves.hi;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
56 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
57
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
58 static inline ogg_int32_t MULT31(ogg_int32_t x, ogg_int32_t y) {
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
59 return MULT32(x,y)<<1;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
60 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
61
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
62 static inline ogg_int32_t MULT31_SHIFT15(ogg_int32_t x, ogg_int32_t y) {
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
63 union magic magic;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
64 magic.whole = (ogg_int64_t)x * y;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
65 return ((ogg_uint32_t)(magic.halves.lo)>>15) | ((magic.halves.hi)<<17);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
66 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
67
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
68 #else
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
69 /* 32 bit multiply, more portable but less accurate */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
70
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
71 /*
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
72 * Note: Precision is biased towards the first argument therefore ordering
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
73 * is important. Shift values were chosen for the best sound quality after
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
74 * many listening tests.
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
75 */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
76
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
77 /*
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
78 * For MULT32 and MULT31: The second argument is always a lookup table
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
79 * value already preshifted from 31 to 8 bits. We therefore take the
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
80 * opportunity to save on text space and use unsigned char for those
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
81 * tables in this case.
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
82 */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
83
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
84 static inline ogg_int32_t MULT32(ogg_int32_t x, ogg_int32_t y) {
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
85 return (x >> 9) * y; /* y preshifted >>23 */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
86 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
87
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
88 static inline ogg_int32_t MULT31(ogg_int32_t x, ogg_int32_t y) {
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
89 return (x >> 8) * y; /* y preshifted >>23 */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
90 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
91
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
92 static inline ogg_int32_t MULT31_SHIFT15(ogg_int32_t x, ogg_int32_t y) {
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
93 return (x >> 6) * y; /* y preshifted >>9 */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
94 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
95
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
96 #endif
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
97
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
98 /*
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
99 * This should be used as a memory barrier, forcing all cached values in
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
100 * registers to wr writen back to memory. Might or might not be beneficial
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
101 * depending on the architecture and compiler.
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
102 */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
103 #define MB()
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
104
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
105 /*
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
106 * The XPROD functions are meant to optimize the cross products found all
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
107 * over the place in mdct.c by forcing memory operation ordering to avoid
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
108 * unnecessary register reloads as soon as memory is being written to.
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
109 * However this is only beneficial on CPUs with a sane number of general
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
110 * purpose registers which exclude the Intel x86. On Intel, better let the
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
111 * compiler actually reload registers directly from original memory by using
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
112 * macros.
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
113 */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
114
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
115 #ifdef __i386__
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
116
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
117 #define XPROD32(_a, _b, _t, _v, _x, _y) \
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
118 { *(_x)=MULT32(_a,_t)+MULT32(_b,_v); \
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
119 *(_y)=MULT32(_b,_t)-MULT32(_a,_v); }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
120 #define XPROD31(_a, _b, _t, _v, _x, _y) \
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
121 { *(_x)=MULT31(_a,_t)+MULT31(_b,_v); \
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
122 *(_y)=MULT31(_b,_t)-MULT31(_a,_v); }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
123 #define XNPROD31(_a, _b, _t, _v, _x, _y) \
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
124 { *(_x)=MULT31(_a,_t)-MULT31(_b,_v); \
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
125 *(_y)=MULT31(_b,_t)+MULT31(_a,_v); }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
126
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
127 #else
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
128
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
129 static inline void XPROD32(ogg_int32_t a, ogg_int32_t b,
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
130 ogg_int32_t t, ogg_int32_t v,
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
131 ogg_int32_t *x, ogg_int32_t *y)
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
132 {
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
133 *x = MULT32(a, t) + MULT32(b, v);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
134 *y = MULT32(b, t) - MULT32(a, v);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
135 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
136
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
137 static inline void XPROD31(ogg_int32_t a, ogg_int32_t b,
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
138 ogg_int32_t t, ogg_int32_t v,
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
139 ogg_int32_t *x, ogg_int32_t *y)
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
140 {
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
141 *x = MULT31(a, t) + MULT31(b, v);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
142 *y = MULT31(b, t) - MULT31(a, v);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
143 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
144
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
145 static inline void XNPROD31(ogg_int32_t a, ogg_int32_t b,
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
146 ogg_int32_t t, ogg_int32_t v,
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
147 ogg_int32_t *x, ogg_int32_t *y)
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
148 {
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
149 *x = MULT31(a, t) - MULT31(b, v);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
150 *y = MULT31(b, t) + MULT31(a, v);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
151 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
152
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
153 #endif
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
154
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
155 #endif
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
156
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
157 #ifndef _V_CLIP_MATH
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
158 #define _V_CLIP_MATH
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
159
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
160 static inline ogg_int32_t CLIP_TO_15(ogg_int32_t x) {
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
161 int ret=x;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
162 ret-= ((x<=32767)-1)&(x-32767);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
163 ret-= ((x>=-32768)-1)&(x+32768);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
164 return(ret);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
165 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
166
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
167 #endif
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
168
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
169 static inline ogg_int32_t VFLOAT_MULT(ogg_int32_t a,ogg_int32_t ap,
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
170 ogg_int32_t b,ogg_int32_t bp,
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
171 ogg_int32_t *p){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
172 if(a && b){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
173 #ifndef _LOW_ACCURACY_
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
174 *p=ap+bp+32;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
175 return MULT32(a,b);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
176 #else
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
177 *p=ap+bp+31;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
178 return (a>>15)*(b>>16);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
179 #endif
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
180 }else
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
181 return 0;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
182 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
183
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
184 static inline ogg_int32_t VFLOAT_MULTI(ogg_int32_t a,ogg_int32_t ap,
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
185 ogg_int32_t i,
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
186 ogg_int32_t *p){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
187
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
188 int ip=_ilog(abs(i))-31;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
189 return VFLOAT_MULT(a,ap,i<<-ip,ip,p);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
190 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
191
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
192 static inline ogg_int32_t VFLOAT_ADD(ogg_int32_t a,ogg_int32_t ap,
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
193 ogg_int32_t b,ogg_int32_t bp,
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
194 ogg_int32_t *p){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
195
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
196 if(!a){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
197 *p=bp;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
198 return b;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
199 }else if(!b){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
200 *p=ap;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
201 return a;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
202 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
203
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
204 /* yes, this can leak a bit. */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
205 if(ap>bp){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
206 int shift=ap-bp+1;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
207 *p=ap+1;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
208 a>>=1;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
209 if(shift<32){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
210 b=(b+(1<<(shift-1)))>>shift;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
211 }else{
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
212 b=0;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
213 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
214 }else{
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
215 int shift=bp-ap+1;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
216 *p=bp+1;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
217 b>>=1;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
218 if(shift<32){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
219 a=(a+(1<<(shift-1)))>>shift;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
220 }else{
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
221 a=0;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
222 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
223 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
224
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
225 a+=b;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
226 if((a&0xc0000000)==0xc0000000 ||
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
227 (a&0xc0000000)==0){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
228 a<<=1;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
229 (*p)--;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
230 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
231 return(a);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
232 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
233
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
234 #endif
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
235
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
236
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
237
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
238