2 * Create an ADPCM codebook either by extracting it from an AIFF section, or
3 * by executing tabledesign.
5 #define _XOPEN_SOURCE 500
15 typedef unsigned char u8
;
16 typedef unsigned int u32
;
18 #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
22 # define BSWAP16(x) x = __builtin_bswap16(x)
23 # define BSWAP32(x) x = __builtin_bswap32(x)
26 #define NORETURN __attribute__((noreturn))
27 #define UNUSED __attribute__((unused))
37 static const char usage
[] = "input.aiff";
38 static const char *progname
, *infilename
;
40 #define checked_fread(a, b, c, d) if (fread(a, b, c, d) != c) fail_parse("error parsing file")
43 void fail_parse(const char *fmt
, ...)
45 char *formatted
= NULL
;
48 int size
= vsnprintf(NULL
, 0, fmt
, ap
);
52 formatted
= malloc(size
);
53 if (formatted
!= NULL
) {
55 size
= vsnprintf(formatted
, size
, fmt
, ap
);
64 if (formatted
!= NULL
) {
65 fprintf(stderr
, "%s: %s [%s]\n", progname
, formatted
, infilename
);
71 s32
readaifccodebook(FILE *fhandle
, s32
****table
, s16
*order
, s16
*npredictors
)
73 checked_fread(order
, sizeof(s16
), 1, fhandle
);
75 checked_fread(npredictors
, sizeof(s16
), 1, fhandle
);
76 BSWAP16(*npredictors
);
77 *table
= malloc(*npredictors
* sizeof(s32
**));
78 for (s32 i
= 0; i
< *npredictors
; i
++) {
79 (*table
)[i
] = malloc(8 * sizeof(s32
*));
80 for (s32 j
= 0; j
< 8; j
++) {
81 (*table
)[i
][j
] = malloc((*order
+ 8) * sizeof(s32
));
85 for (s32 i
= 0; i
< *npredictors
; i
++) {
86 s32
**table_entry
= (*table
)[i
];
87 for (s32 j
= 0; j
< *order
; j
++) {
88 for (s32 k
= 0; k
< 8; k
++) {
90 checked_fread(&ts
, sizeof(s16
), 1, fhandle
);
92 table_entry
[k
][j
] = ts
;
96 for (s32 k
= 1; k
< 8; k
++) {
97 table_entry
[k
][*order
] = table_entry
[k
- 1][*order
- 1];
100 table_entry
[0][*order
] = 1 << 11;
102 for (s32 k
= 1; k
< 8; k
++) {
105 table_entry
[j
][k
+ *order
] = 0;
109 table_entry
[j
][k
+ *order
] = table_entry
[j
- k
][*order
];
116 int main(int argc
, char **argv
)
119 s16 npredictors
= -1;
120 s32
***coefTable
= NULL
;
125 fprintf(stderr
, "%s %s\n", progname
, usage
);
129 infilename
= argv
[1];
131 if ((ifile
= fopen(infilename
, "rb")) == NULL
) {
132 fail_parse("AIFF file could not be opened");
137 checked_fread(buf
, 4, 1, ifile
);
138 if (strcmp(buf
, "FORM") != 0) fail_parse("not an AIFF file");
139 checked_fread(buf
, 4, 1, ifile
);
140 checked_fread(buf
, 4, 1, ifile
);
141 if (strcmp(buf
, "AIFF") != 0 && strcmp(buf
, "AIFC") != 0) {
142 fail_parse("not an AIFF file");
147 if (!fread(buf
, 4, 1, ifile
) || !fread(&size
, 4, 1, ifile
)) break;
149 s32 nextOffset
= ftell(ifile
) + ((size
+ 1) & ~1);
151 if (strcmp(buf
, "APPL") == 0) {
152 checked_fread(buf
, 4, 1, ifile
);
153 if (strcmp(buf
, "stoc") == 0) {
155 checked_fread(&len
, 1, 1, ifile
);
159 checked_fread(chunkName
, 11, 1, ifile
);
160 chunkName
[11] = '\0';
161 if (strcmp(chunkName
, "VADPCMCODES") == 0) {
162 checked_fread(&version
, sizeof(s16
), 1, ifile
);
165 readaifccodebook(ifile
, &coefTable
, &order
, &npredictors
);
172 fseek(ifile
, nextOffset
, SEEK_SET
);
176 if (coefTable
== NULL
) {
177 execl("./tools/tabledesign", "tabledesign", "-s", "1", infilename
, NULL
);
179 printf("%d\n%d\n", order
, npredictors
);
180 for (s32 i
= 0; i
< npredictors
; i
++) {
181 for (s32 j
= 0; j
< order
; j
++) {
182 for (s32 k
= 0; k
< 8; k
++) {
183 printf("% 5d ", coefTable
[i
][k
][j
]);