/* pHash, the open source perceptual hash library Copyright (C) 2009 Aetilius, Inc. All rights reserved. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Evan Klinger - eklinger@phash.org David Starkweather - dstarkweather@phash.org */ #include #include #include "audiophash.h" int main(int argc, char **argv) { struct option long_option[] = { {"help", 0, NULL, 'h'}, {"file1", 1, 0, 'f'}, {"file2", 1, 0, 'g'}, {"threshold", 1, 0, 't'}, {"block_size", 1, NULL, 'b'}, {NULL, 0, NULL, 0}, }; char *file1, *file2; float threshold = 0.30; int block_size = 256; int morehelp = 0; while (1) { int c; if ((c = getopt_long(argc, argv, "f:g:hb:t:", long_option, NULL)) < 0) break; switch (c) { case 'h': morehelp++; break; case 'f': file1 = optarg; break; case 'g': file2 = optarg; break; case 't': threshold = atof(optarg); break; case 'b': block_size = atoi(optarg); } } printf("file1: %s\n", file1); printf("file2: %s\n", file2); printf("threshold: %f\n", threshold); printf("blocksize: %d\n", block_size); int sr = 8000; int channels = 1; int N = 0; float *buf = ph_readaudio(file1, sr, channels, NULL, N); if (!buf) { fprintf(stderr, " cannot read file %s, no such file\n", file1); return -1; } int N2 = 0; float *buf2 = ph_readaudio(file2, sr, channels, NULL, N2); if (!buf2) { fprintf(stderr, " cannot read file %s, no such file", file2); return -1; } int nb_frames = 0; uint32_t *hash = ph_audiohash(buf, N, sr, nb_frames); if (!hash) { fprintf(stderr, "unable to calculate hash for %s\n", file1); return -1; } int nb_frames2 = 0; uint32_t *hash2 = ph_audiohash(buf2, N2, sr, nb_frames2); if (!hash2) { fprintf(stderr, "unable to calculate hash for %s\n", file2); return -1; } int Nc = 0; double maxC = 0; double *C = ph_audio_distance_ber(hash, nb_frames, hash2, nb_frames2, threshold, block_size, Nc); printf("Nc = %d, ", Nc); for (int i = 0; i < Nc; i++) { if (C[i] > maxC) maxC = C[i]; } printf("cs = %f\n", maxC); free(buf); free(buf2); free(hash); free(hash2); free(C); return 0; }