Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MorsGames
GitHub Repository: MorsGames/sm64plus
Path: blob/master/tools/sdk-tools/adpcm/vpredictor.c
7861 views
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include "vadpcm.h"
4
5
s32 readcodebook(FILE *fhandle, s32 ****table, s32 *order, s32 *npredictors)
6
{
7
s32 **table_entry;
8
s32 i;
9
s32 j;
10
s32 k;
11
12
fscanf(fhandle, "%d", order);
13
fscanf(fhandle, "%d", npredictors);
14
*table = malloc(*npredictors * sizeof(s32 **));
15
for (i = 0; i < *npredictors; i++)
16
{
17
(*table)[i] = malloc(8 * sizeof(s32 *));
18
for (j = 0; j < 8; j++)
19
{
20
(*table)[i][j] = malloc((*order + 8) * sizeof(s32));
21
}
22
}
23
24
for (i = 0; i < *npredictors; i++)
25
{
26
table_entry = (*table)[i];
27
for (j = 0; j < *order; j++)
28
{
29
for (k = 0; k < 8; k++)
30
{
31
fscanf(fhandle, "%d", &table_entry[k][j]);
32
}
33
}
34
35
for (k = 1; k < 8; k++)
36
{
37
table_entry[k][*order] = table_entry[k - 1][*order - 1];
38
}
39
40
table_entry[0][*order] = 1 << 11;
41
42
for (k = 1; k < 8; k++)
43
{
44
for (j = 0; j < k; j++)
45
{
46
table_entry[j][k + *order] = 0;
47
}
48
49
for (; j < 8; j++)
50
{
51
table_entry[j][k + *order] = table_entry[j - k][*order];
52
}
53
}
54
}
55
return 0;
56
}
57
58
s32 readaifccodebook(FILE *fhandle, s32 ****table, s16 *order, s16 *npredictors)
59
{
60
s32 **table_entry;
61
s32 i;
62
s32 j;
63
s32 k;
64
s16 ts;
65
66
fread(order, sizeof(s16), 1, fhandle);
67
BSWAP16(*order)
68
fread(npredictors, sizeof(s16), 1, fhandle);
69
BSWAP16(*npredictors)
70
*table = malloc(*npredictors * sizeof(s32 **));
71
for (i = 0; i < *npredictors; i++)
72
{
73
(*table)[i] = malloc(8 * sizeof(s32 *));
74
for (j = 0; j < 8; j++)
75
{
76
(*table)[i][j] = malloc((*order + 8) * sizeof(s32));
77
}
78
}
79
80
for (i = 0; i < *npredictors; i++)
81
{
82
table_entry = (*table)[i];
83
for (j = 0; j < *order; j++)
84
{
85
for (k = 0; k < 8; k++)
86
{
87
fread(&ts, sizeof(s16), 1, fhandle);
88
BSWAP16(ts)
89
table_entry[k][j] = ts;
90
}
91
}
92
93
for (k = 1; k < 8; k++)
94
{
95
table_entry[k][*order] = table_entry[k - 1][*order - 1];
96
}
97
98
table_entry[0][*order] = 1 << 11;
99
100
for (k = 1; k < 8; k++)
101
{
102
for (j = 0; j < k; j++)
103
{
104
table_entry[j][k + *order] = 0;
105
}
106
107
for (; j < 8; j++)
108
{
109
table_entry[j][k + *order] = table_entry[j - k][*order];
110
}
111
}
112
}
113
return 0;
114
}
115
116
s32 inner_product(s32 length, s32 *v1, s32 *v2)
117
{
118
s32 j;
119
s32 dout;
120
s32 fiout;
121
s32 out;
122
123
j = 0;
124
out = 0;
125
for (; j < length; j++)
126
{
127
out += *v1++ * *v2++;
128
}
129
130
// Compute "out / 2^11", rounded down.
131
dout = out / (1 << 11);
132
fiout = dout * (1 << 11);
133
if (out - fiout < 0)
134
{
135
return dout - 1;
136
}
137
else
138
{
139
return dout;
140
}
141
}
142
143