2 * This file is part of FFmpeg.
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 #define FFMIN(a,b) ((a) > (b) ? (b) : (a))
26 #define FFMAX(a,b) ((a) > (b) ? (a) : (b))
27 #define FFABS(a) ((a) >= 0 ? (a) : (-(a)))
29 static int64_t fsize(FILE *f
) {
30 int64_t end
, pos
= ftell(f
);
31 fseek(f
, 0, SEEK_END
);
33 fseek(f
, pos
, SEEK_SET
);
37 int main(int argc
, char **argv
) {
44 int16_t *signal
, *data
;
48 printf("audiomatch <testfile> <reffile>\n");
49 printf("WAV headers are skipped automatically.\n");
53 f
[0] = fopen(argv
[1], "rb");
54 f
[1] = fopen(argv
[2], "rb");
56 fprintf(stderr
, "Could not open input files.\n");
60 for (i
= 0; i
< 2; i
++) {
62 if (fread(p
, 1, 12, f
[i
]) != 12)
64 if (!memcmp(p
, "RIFF", 4) &&
65 !memcmp(p
+ 8, "WAVE", 4)) {
66 if (fread(p
, 1, 8, f
[i
]) != 8)
68 while (memcmp(p
, "data", 4)) {
69 int s
= p
[4] | p
[5] << 8 | p
[6] << 16 | p
[7] << 24;
70 fseek(f
[i
], s
, SEEK_CUR
);
71 if (fread(p
, 1, 8, f
[i
]) != 8)
75 fseek(f
[i
], -12, SEEK_CUR
);
79 datlen
= fsize(f
[0]) - ftell(f
[0]);
80 siglen
= fsize(f
[1]) - ftell(f
[1]);
81 data
= malloc(datlen
* sizeof(*data
));
82 signal
= malloc(siglen
* sizeof(*signal
));
84 if (fread(data
, 1, datlen
, f
[0]) != datlen
)
86 if (fread(signal
, 1, siglen
, f
[1]) != siglen
)
91 for (i
= 0; i
< siglen
; i
++) {
92 signal
[i
] = ((uint8_t*)(signal
+ i
))[0] + 256*((uint8_t*)(signal
+ i
))[1];
93 sigamp
+= signal
[i
] * signal
[i
];
95 for (i
= 0; i
< datlen
; i
++)
96 data
[i
] = ((uint8_t*)(data
+ i
))[0] + 256*((uint8_t*)(data
+ i
))[1];
98 for (pos
= 0; pos
< maxshift
; pos
= pos
< 0 ? -pos
: -pos
-1) {
100 int testlen
= FFMIN(siglen
, datlen
-pos
);
101 for (i
= FFMAX(0, -pos
); i
< testlen
; i
++) {
103 c
+= signal
[i
] * data
[j
];
105 if (FFABS(c
) > sigamp
* 0.94)
106 maxshift
= FFMIN(maxshift
, FFABS(pos
)+32);
107 if (FFABS(c
) > FFABS(bestc
)) {
112 printf("presig: %d postsig:%d c:%7.4f lenerr:%d\n", bestpos
, datlen
- siglen
- bestpos
, bestc
/ sigamp
, datlen
- siglen
);