Skip to content

Commit ad3f0f2

Browse files
committed
Generate Huffman lookup and IMDCT tables at runtime
1 parent c9b9866 commit ad3f0f2

11 files changed

Lines changed: 605 additions & 2707 deletions

C/decinit.c

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@
44
#include "structures.h"
55
#include "tables.h"
66
#include <string.h>
7+
#include <math.h>
8+
#include "utility.h"
79

810
static int BlockTypeToChannelCount(BlockType block_type);
911

1012
at9_status init_decoder(atrac9_handle* handle, unsigned char* config_data, int wlength)
1113
{
1214
ERROR_CHECK(init_config_data(&handle->config, config_data));
1315
ERROR_CHECK(init_frame(handle));
16+
init_mdct_tables(handle->config.FrameSamplesPower);
17+
init_huffman_codebooks();
1418
handle->wlength = wlength;
1519
handle->initialized = 1;
1620
return ERR_SUCCESS;
@@ -94,6 +98,80 @@ at9_status init_channel(channel* channel, block* parent_block, int channel_index
9498
return ERR_SUCCESS;
9599
}
96100

101+
void init_huffman_codebooks()
102+
{
103+
init_huffman_set(HuffmanScaleFactorsUnsigned, sizeof(HuffmanScaleFactorsUnsigned) / sizeof(HuffmanCodebook));
104+
init_huffman_set(HuffmanScaleFactorsSigned, sizeof(HuffmanScaleFactorsSigned) / sizeof(HuffmanCodebook));
105+
init_huffman_set(HuffmanSpectrum, sizeof(HuffmanSpectrum) / sizeof(HuffmanCodebook));
106+
}
107+
108+
void init_huffman_set(const HuffmanCodebook* codebooks, int count)
109+
{
110+
for (int i = 0; i < count; i++)
111+
{
112+
InitHuffmanCodebook(&codebooks[i]);
113+
}
114+
}
115+
116+
void init_mdct_tables(int frameSizePower)
117+
{
118+
for (int i = 0; i < 9; i++)
119+
{
120+
GenerateTrigTables(i);
121+
GenerateShuffleTable(i);
122+
}
123+
GenerateMdctWindow(frameSizePower);
124+
GenerateImdctWindow(frameSizePower);
125+
}
126+
127+
void GenerateTrigTables(int sizeBits)
128+
{
129+
const int size = 1 << sizeBits;
130+
double* sinTab = SinTables[sizeBits];
131+
double* cosTab = CosTables[sizeBits];
132+
133+
for (int i = 0; i < size; i++)
134+
{
135+
const double value = M_PI * (4 * i + 1) / (4 * size);
136+
sinTab[i] = sin(value);
137+
cosTab[i] = cos(value);
138+
}
139+
}
140+
141+
void GenerateShuffleTable(int sizeBits)
142+
{
143+
const int size = 1 << sizeBits;
144+
int* table = ShuffleTables[sizeBits];
145+
146+
for (int i = 0; i < size; i++)
147+
{
148+
table[i] = BitReverse32(i ^ (i / 2), sizeBits);
149+
}
150+
}
151+
152+
void GenerateMdctWindow(int frameSizePower)
153+
{
154+
const int frameSize = 1 << frameSizePower;
155+
double* mdct = MdctWindow[frameSizePower - 6];
156+
157+
for (int i = 0; i < frameSize; i++)
158+
{
159+
mdct[i] = (sin(((i + 0.5) / frameSize - 0.5) * M_PI) + 1.0) * 0.5;
160+
}
161+
}
162+
163+
void GenerateImdctWindow(int frameSizePower)
164+
{
165+
const int frameSize = 1 << frameSizePower;
166+
double* imdct = ImdctWindow[frameSizePower - 6];
167+
double* mdct = MdctWindow[frameSizePower - 6];
168+
169+
for (int i = 0; i < frameSize; i++)
170+
{
171+
imdct[i] = mdct[i] / (mdct[frameSize - 1 - i] * mdct[frameSize - 1 - i] + mdct[i] * mdct[i]);
172+
}
173+
}
174+
97175
static int BlockTypeToChannelCount(BlockType block_type)
98176
{
99177
switch (block_type)

C/decinit.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,18 @@
22

33
#include "error_codes.h"
44
#include "structures.h"
5+
#include "huffCodes.h"
56

67
at9_status init_decoder(atrac9_handle* handle, unsigned char * config_data, int wlength);
78
at9_status init_config_data(ConfigData* config, unsigned char * config_data);
89
at9_status read_config_data(ConfigData* config);
910
at9_status init_frame(atrac9_handle* handle);
1011
at9_status init_block(block* block, frame* parent_frame, int block_index);
11-
at9_status init_channel(channel* channel, block* parent_block, int channel_index);
12+
at9_status init_channel(channel* channel, block* parent_block, int channel_index);
13+
void init_huffman_codebooks();
14+
void init_huffman_set(const HuffmanCodebook* codebooks, int count);
15+
void GenerateTrigTables(int sizeBits);
16+
void GenerateShuffleTable(int sizeBits);
17+
void init_mdct_tables(int frameSizePower);
18+
void GenerateMdctWindow(int frameSizePower);
19+
void GenerateImdctWindow(int frameSizePower);

C/decoder.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@ at9_status Decode(atrac9_handle* handle, const unsigned char* audio, unsigned ch
1717

1818
PcmFloatToShort(&handle->frame, (short*)pcm);
1919

20-
21-
*bytesUsed = br.position / 8;
20+
*bytesUsed = br.position / 8;
2221
return ERR_SUCCESS;
2322
}
2423

C/huffCodes.c

Lines changed: 126 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,129 @@ void DecodeHuffmanValues(int* spectrum, int index, int bandCount, const HuffmanC
2424
value >>= huff->ValueBits;
2525
}
2626
}
27-
}
27+
}
28+
29+
void InitHuffmanCodebook(const HuffmanCodebook* codebook)
30+
{
31+
const int huffLength = codebook->Length;
32+
if (huffLength == 0) return;
33+
34+
unsigned char* dest = codebook->Lookup;
35+
36+
for (int i = 0; i < huffLength; i++)
37+
{
38+
if (codebook->Bits[i] == 0) continue;
39+
const int unusedBits = codebook->MaxBitSize - codebook->Bits[i];
40+
41+
const int start = codebook->Codes[i] << unusedBits;
42+
const int length = 1 << unusedBits;
43+
const int end = start + length;
44+
45+
for (int j = start; j < end; j++)
46+
{
47+
dest[j] = i;
48+
}
49+
}
50+
}
51+
52+
HuffmanCodebook HuffmanScaleFactorsUnsigned[7] = {
53+
{0},
54+
{ScaleFactorsA1Bits, ScaleFactorsA1Codes, ScaleFactorsA1Lookup, 2, 1, 0, 1, 2, 1},
55+
{ScaleFactorsA2Bits, ScaleFactorsA2Codes, ScaleFactorsA2Lookup, 4, 1, 0, 2, 4, 3},
56+
{ScaleFactorsA3Bits, ScaleFactorsA3Codes, ScaleFactorsA3Lookup, 8, 1, 0, 3, 8, 6},
57+
{ScaleFactorsA4Bits, ScaleFactorsA4Codes, ScaleFactorsA4Lookup, 16, 1, 0, 4, 16, 8},
58+
{ScaleFactorsA5Bits, ScaleFactorsA5Codes, ScaleFactorsA5Lookup, 32, 1, 0, 5, 32, 8},
59+
{ScaleFactorsA6Bits, ScaleFactorsA6Codes, ScaleFactorsA6Lookup, 64, 1, 0, 6, 64, 8},
60+
};
61+
62+
HuffmanCodebook HuffmanScaleFactorsSigned[6] = {
63+
{0},
64+
{0},
65+
{ScaleFactorsB2Bits, ScaleFactorsB2Codes, ScaleFactorsB2Lookup, 4, 1, 0, 2, 4, 2},
66+
{ScaleFactorsB3Bits, ScaleFactorsB3Codes, ScaleFactorsB3Lookup, 8, 1, 0, 3, 8, 6},
67+
{ScaleFactorsB4Bits, ScaleFactorsB4Codes, ScaleFactorsB4Lookup, 16, 1, 0, 4, 16, 8},
68+
{ScaleFactorsB5Bits, ScaleFactorsB5Codes, ScaleFactorsB5Lookup, 32, 1, 0, 5, 32, 8},
69+
};
70+
71+
HuffmanCodebook HuffmanSpectrum[2][8][4] = {
72+
{
73+
{0},
74+
{0},
75+
{
76+
{SpectrumA21Bits, SpectrumA21Codes, SpectrumA21Lookup, 16, 2, 1, 2, 4, 3},
77+
{SpectrumA22Bits, SpectrumA22Codes, SpectrumA22Lookup, 256, 4, 2, 2, 4, 8},
78+
{SpectrumA23Bits, SpectrumA23Codes, SpectrumA23Lookup, 256, 4, 2, 2, 4, 9},
79+
{SpectrumA24Bits, SpectrumA24Codes, SpectrumA24Lookup, 256, 4, 2, 2, 4, 10}
80+
},
81+
{
82+
{SpectrumA31Bits, SpectrumA31Codes, SpectrumA31Lookup, 64, 2, 1, 3, 8, 7},
83+
{SpectrumA32Bits, SpectrumA32Codes, SpectrumA32Lookup, 64, 2, 1, 3, 8, 7},
84+
{SpectrumA33Bits, SpectrumA33Codes, SpectrumA33Lookup, 64, 2, 1, 3, 8, 8},
85+
{SpectrumA34Bits, SpectrumA34Codes, SpectrumA34Lookup, 64, 2, 1, 3, 8, 10}
86+
},
87+
{
88+
{SpectrumA41Bits, SpectrumA41Codes, SpectrumA41Lookup, 256, 2, 1, 4, 16, 9},
89+
{SpectrumA42Bits, SpectrumA42Codes, SpectrumA42Lookup, 256, 2, 1, 4, 16, 10},
90+
{SpectrumA43Bits, SpectrumA43Codes, SpectrumA43Lookup, 256, 2, 1, 4, 16, 10},
91+
{SpectrumA44Bits, SpectrumA44Codes, SpectrumA44Lookup, 256, 2, 1, 4, 16, 10}
92+
},
93+
{
94+
{SpectrumA51Bits, SpectrumA51Codes, SpectrumA51Lookup, 32, 1, 0, 5, 32, 6},
95+
{SpectrumA52Bits, SpectrumA52Codes, SpectrumA52Lookup, 32, 1, 0, 5, 32, 6},
96+
{SpectrumA53Bits, SpectrumA53Codes, SpectrumA53Lookup, 32, 1, 0, 5, 32, 7},
97+
{SpectrumA54Bits, SpectrumA54Codes, SpectrumA54Lookup, 32, 1, 0, 5, 32, 8}
98+
},
99+
{
100+
{SpectrumA61Bits, SpectrumA61Codes, SpectrumA61Lookup, 64, 1, 0, 6, 64, 7},
101+
{SpectrumA62Bits, SpectrumA62Codes, SpectrumA62Lookup, 64, 1, 0, 6, 64, 7},
102+
{SpectrumA63Bits, SpectrumA63Codes, SpectrumA63Lookup, 64, 1, 0, 6, 64, 8},
103+
{SpectrumA64Bits, SpectrumA64Codes, SpectrumA64Lookup, 64, 1, 0, 6, 64, 9}
104+
},
105+
{
106+
{SpectrumA71Bits, SpectrumA71Codes, SpectrumA71Lookup, 128, 1, 0, 7, 128, 8},
107+
{SpectrumA72Bits, SpectrumA72Codes, SpectrumA72Lookup, 128, 1, 0, 7, 128, 8},
108+
{SpectrumA73Bits, SpectrumA73Codes, SpectrumA73Lookup, 128, 1, 0, 7, 128, 9},
109+
{SpectrumA74Bits, SpectrumA74Codes, SpectrumA74Lookup, 128, 1, 0, 7, 128, 10}
110+
}
111+
},
112+
{
113+
{0},
114+
{0},
115+
{
116+
{0},
117+
{SpectrumB22Bits, SpectrumB22Codes, SpectrumB22Lookup, 256, 4, 2, 2, 4, 10},
118+
{SpectrumB23Bits, SpectrumB23Codes, SpectrumB23Lookup, 256, 4, 2, 2, 4, 10},
119+
{SpectrumB24Bits, SpectrumB24Codes, SpectrumB24Lookup, 256, 4, 2, 2, 4, 10}
120+
},
121+
{
122+
{0},
123+
{SpectrumB32Bits, SpectrumB32Codes, SpectrumB32Lookup, 64, 2, 1, 3, 8, 9},
124+
{SpectrumB33Bits, SpectrumB33Codes, SpectrumB33Lookup, 64, 2, 1, 3, 8, 10},
125+
{SpectrumB34Bits, SpectrumB34Codes, SpectrumB34Lookup, 64, 2, 1, 3, 8, 10}
126+
},
127+
{
128+
{0},
129+
{SpectrumB42Bits, SpectrumB42Codes, SpectrumB42Lookup, 256, 2, 1, 4, 16, 10},
130+
{SpectrumB43Bits, SpectrumB43Codes, SpectrumB43Lookup, 256, 2, 1, 4, 16, 10},
131+
{SpectrumB44Bits, SpectrumB44Codes, SpectrumB44Lookup, 256, 2, 1, 4, 16, 10}
132+
},
133+
{
134+
{0},
135+
{SpectrumB52Bits, SpectrumB52Codes, SpectrumB52Lookup, 32, 1, 0, 5, 32, 7},
136+
{SpectrumB53Bits, SpectrumB53Codes, SpectrumB53Lookup, 32, 1, 0, 5, 32, 8},
137+
{SpectrumB54Bits, SpectrumB54Codes, SpectrumB54Lookup, 32, 1, 0, 5, 32, 9}
138+
},
139+
{
140+
{0},
141+
{SpectrumB62Bits, SpectrumB62Codes, SpectrumB62Lookup, 64, 1, 0, 6, 64, 8},
142+
{SpectrumB63Bits, SpectrumB63Codes, SpectrumB63Lookup, 64, 1, 0, 6, 64, 9},
143+
{SpectrumB64Bits, SpectrumB64Codes, SpectrumB64Lookup, 64, 1, 0, 6, 64, 10}
144+
},
145+
{
146+
{0},
147+
{SpectrumB72Bits, SpectrumB72Codes, SpectrumB72Lookup, 128, 1, 0, 7, 128, 9},
148+
{SpectrumB73Bits, SpectrumB73Codes, SpectrumB73Lookup, 128, 1, 0, 7, 128, 10},
149+
{SpectrumB74Bits, SpectrumB74Codes, SpectrumB74Lookup, 128, 1, 0, 7, 128, 10}
150+
}
151+
}
152+
};

0 commit comments

Comments
 (0)