Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MorsGames
GitHub Repository: MorsGames/sm64plus
Path: blob/master/tools/sdk-tools/adpcm/vdecode.c
7861 views
1
#include <stdio.h>
2
#include "vadpcm.h"
3
4
void vdecodeframe(FILE *ifile, s32 *outp, s32 order, s32 ***coefTable)
5
{
6
s32 optimalp;
7
s32 scale;
8
s32 maxlevel;
9
s32 i;
10
s32 j;
11
s32 in_vec[16];
12
s32 ix[16];
13
u8 header;
14
u8 c;
15
16
maxlevel = 7;
17
fread(&header, 1, 1, ifile);
18
scale = 1 << (header >> 4);
19
optimalp = header & 0xf;
20
21
for (i = 0; i < 16; i += 2)
22
{
23
fread(&c, 1, 1, ifile);
24
ix[i] = c >> 4;
25
ix[i + 1] = c & 0xf;
26
27
if (ix[i] <= maxlevel)
28
{
29
ix[i] *= scale;
30
}
31
else
32
{
33
ix[i] = (-0x10 - -ix[i]) * scale;
34
}
35
36
if (ix[i + 1] <= maxlevel)
37
{
38
ix[i + 1] *= scale;
39
}
40
else
41
{
42
ix[i + 1] = (-0x10 - -ix[i + 1]) * scale;
43
}
44
}
45
46
for (j = 0; j < 2; j++)
47
{
48
for (i = 0; i < 8; i++)
49
{
50
in_vec[i + order] = ix[j * 8 + i];
51
}
52
53
if (j == 0)
54
{
55
for (i = 0; i < order; i++)
56
{
57
in_vec[i] = outp[16 - order + i];
58
}
59
}
60
else
61
{
62
for (i = 0; i < order; i++)
63
{
64
in_vec[i] = outp[j * 8 - order + i];
65
}
66
}
67
68
for (i = 0; i < 8; i++)
69
{
70
outp[i + j * 8] = inner_product(order + 8, coefTable[optimalp][i], in_vec);
71
}
72
}
73
}
74
75