25 #define FFMIN(a,b) ((a) > (b) ? (b) : (a))
26 #define FFMAX(a,b) ((a) > (b) ? (a) : (b))
29 int64_t
end, pos = ftell(f);
30 fseek(f, 0, SEEK_END);
32 fseek(f, pos, SEEK_SET);
36 int main(
int argc,
char **argv) {
43 int16_t *signal, *
data;
47 printf(
"audiomatch <testfile> <reffile>\n");
48 printf(
"WAV headers are skipped automatically.\n");
52 f[0] = fopen(argv[1],
"rb");
53 f[1] = fopen(argv[2],
"rb");
55 fprintf(stderr,
"Could not open input files.\n");
59 for (i = 0; i < 2; i++) {
61 if (fread(p, 1, 12, f[i]) != 12)
63 if (!memcmp(p,
"RIFF", 4) &&
64 !memcmp(p + 8,
"WAVE", 4)) {
65 if (fread(p, 1, 8, f[i]) != 8)
67 while (memcmp(p,
"data", 4)) {
68 int s = p[4] | p[5] << 8 | p[6] << 16 | p[7] << 24;
69 fseek(f[i], s, SEEK_CUR);
70 if (fread(p, 1, 8, f[i]) != 8)
74 fseek(f[i], -12, SEEK_CUR);
78 datlen =
fsize(f[0]) - ftell(f[0]);
79 siglen =
fsize(f[1]) - ftell(f[1]);
80 data = malloc(datlen *
sizeof(*data));
81 signal = malloc(siglen *
sizeof(*signal));
83 if (fread(data , 1, datlen, f[0]) != datlen)
85 if (fread(signal, 1, siglen, f[1]) != siglen)
90 for (i = 0; i < siglen; i++) {
91 signal[i] = ((
uint8_t*)(signal + i))[0] + 256*((
uint8_t*)(signal + i))[1];
92 sigamp += signal[i] * signal[i];
94 for (i = 0; i < datlen; i++)
95 data[i] = ((
uint8_t*)(data + i))[0] + 256*((
uint8_t*)(data + i))[1];
97 for (pos = 0; pos < maxshift; pos = pos < 0 ? -pos: -pos-1) {
99 int testlen =
FFMIN(siglen, datlen-pos);
100 for (i =
FFMAX(0, -pos); i < testlen; i++) {
102 c += signal[i] * data[j];
104 if (fabs(c) > sigamp * 0.94)
105 maxshift =
FFMIN(maxshift, fabs(pos)+32);
106 if (fabs(c) > fabs(bestc)) {
111 printf(
"presig: %d postsig:%d c:%7.4f lenerr:%d\n", bestpos, datlen - siglen - bestpos, bestc / sigamp, datlen - siglen);
ptrdiff_t const GLvoid * data
int main(int argc, char **argv)
static av_cold int end(AVCodecContext *avctx)
static int64_t fsize(FILE *f)