Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
BitchX
GitHub Repository: BitchX/BitchX1.3
Path: blob/master/dll/amp/huffman.c
1072 views
1
/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
2
*/
3
4
/* huffman.c huffman decoding
5
*
6
* Created by: tomislav uzelac Mar,Apr 1996
7
* Last modified by: tomislav uzelac Mar 8 97
8
*/
9
#include "audio.h"
10
#include "getbits.h"
11
12
#define HUFFMAN
13
#include "huffman.h"
14
15
static inline unsigned int viewbits(int n)
16
{
17
unsigned int pos,ret_value;
18
19
pos = data >> 3;
20
ret_value = buffer[pos] << 24 |
21
buffer[pos+1] << 16 |
22
buffer[pos+2] << 8 |
23
buffer[pos+3];
24
ret_value <<= data & 7;
25
ret_value >>= 32 - n;
26
27
return ret_value;
28
}
29
30
static inline void sackbits(int n)
31
{
32
data += n;
33
data &= 8*BUFFER_SIZE-1;
34
}
35
36
/* huffman_decode() is supposed to be faster now
37
* decodes one codeword and returns no. of bits
38
*/
39
static inline int huffman_decode(int tbl,int *x,int *y)
40
{
41
unsigned int chunk;
42
register unsigned int *h_tab;
43
register unsigned int lag = 0;
44
register unsigned int half_lag;
45
int len;
46
47
h_tab=tables[tbl];
48
chunk=viewbits(19);
49
50
h_tab += h_cue[tbl][chunk >> (19-NC_O)];
51
52
len=(*h_tab>>8)&0x1f;
53
54
/* check for an immediate hit, so we can decode those short codes very fast
55
*/
56
if ((*h_tab>>(32-len)) != (chunk>>(19-len))) {
57
if (chunk >> (19-NC_O) < N_CUE-1)
58
lag=(h_cue[tbl][(chunk >> (19-NC_O))+1] -
59
h_cue[tbl][chunk >> (19-NC_O)]);
60
else {
61
/* we strongly depend on h_cue[N_CUE-1] to point to
62
* the last entry in the huffman table, so we should
63
* noT get here anyway. if it didn't, we'd have to
64
* have another table with huffman tables lengths, and
65
* it would be a mess. just in case, scream&shout.
66
*/
67
/*printf(" h_cue clobbered. this is a bug. blip.\n");*/
68
_exit (-1);
69
}
70
chunk <<= 32-19;
71
chunk |= 0x1ff;
72
73
half_lag = lag >> 1;
74
75
h_tab += half_lag;
76
lag -= half_lag;
77
78
while (lag > 1) {
79
half_lag = lag >> 1;
80
81
if (*h_tab < chunk)
82
h_tab += half_lag;
83
else
84
h_tab -= half_lag;
85
86
lag -= half_lag;
87
}
88
89
len=(*h_tab>>8)&0x1f;
90
if ((*h_tab>>(32-len)) != (chunk>>(32-len))) {
91
if (*h_tab > chunk)
92
h_tab--;
93
else
94
h_tab++;
95
96
len=(*h_tab>>8)&0x1f;
97
}
98
}
99
sackbits(len);
100
*x=(*h_tab>>4)&0xf;
101
*y=*h_tab&0xf;
102
return len;
103
}
104
105
static inline int _qsign(int x,int *q)
106
{
107
int ret_value=0,i;
108
for (i=3;i>=0;i--)
109
if ((x>>i) & 1) {
110
if (getbits(1)) *q++=-1;
111
else *q++=1;
112
ret_value++;
113
}
114
else *q++=0;
115
return ret_value;
116
}
117
118
int decode_huffman_data(struct SIDE_INFO *info,int gr,int ch,int ssize)
119
{
120
int l,i,cnt,x,y;
121
int q[4],r[3],linbits[3],tr[4]={0,0,0,0};
122
int big_value = info->big_values[gr][ch] << 1;
123
124
for (l=0;l<3;l++) {
125
tr[l]=info->table_select[gr][ch][l];
126
linbits[l]=t_linbits[info->table_select[gr][ch][l]];
127
}
128
129
tr[3]=32+info->count1table_select[gr][ch];
130
131
/* we have to be careful here because big_values are not necessarily
132
* aligned with sfb boundaries
133
*/
134
if (!info->window_switching_flag[gr][ch] && info->block_type[gr][ch]==0) {
135
136
/* this code needed some cleanup
137
*/
138
r[0]=t_l[info->region0_count[gr][ch]] + 1;
139
if (r[0] > big_value)
140
r[0]=r[1]=big_value;
141
else {
142
r[1]=t_l[ info->region0_count[gr][ch] + info->region1_count[gr][ch] + 1 ] + 1;
143
if (r[1] > big_value)
144
r[1]=big_value;
145
}
146
r[2]=big_value;
147
148
} else {
149
150
if (info->block_type[gr][ch]==2 && info->mixed_block_flag[gr][ch]==0)
151
r[0]=3*(t_s[2]+1);
152
else
153
r[0]=t_l[7]+1;
154
155
if (r[0] > big_value)
156
r[0]=big_value;
157
158
r[1]=r[2]=big_value;
159
}
160
161
l=0; cnt=0;
162
for (i=0;i<3;i++) {
163
for (;l<r[i];l+=2) {
164
int j = linbits[i];
165
166
cnt+=huffman_decode(tr[i],&x,&y);
167
168
if (x==15 && j>0) {
169
x+=getbits(j);
170
cnt+=j;
171
}
172
if (x) {
173
if (getbits(1)) x=-x;
174
cnt++;
175
}
176
if (y==15 && j>0) {
177
y+=getbits(j);
178
cnt+=j;
179
}
180
if (y) {
181
if (getbits(1)) y=-y;
182
cnt++;
183
}
184
185
is[ch][l]=x;
186
is[ch][l+1]=y;
187
}
188
}
189
while ((cnt < info->part2_3_length[gr][ch]-ssize) && (l<576)) {
190
cnt+=huffman_decode(tr[3],&x,&y);
191
cnt+=_qsign(x,q);
192
for (i=0;i<4;i++) is[ch][l+i]=q[i]; /* ziher je ziher, is[578]*/
193
l+=4;
194
}
195
196
/* set position to start of the next gr/ch
197
*/
198
if (cnt != info->part2_3_length[gr][ch] - ssize ) {
199
data-=cnt-(info->part2_3_length[gr][ch] - ssize);
200
data&= 8*BUFFER_SIZE - 1;
201
}
202
if (l<576) non_zero[ch]=l;
203
else non_zero[ch]=576;
204
/* zero out everything else
205
*/
206
for (;l<576;l++) is[ch][l]=0;
207
return 1;
208
}
209
210