in pdq/java/src/main/java/pdqhashing/tools/PDQPhotoHasherTool.java [54:160]
public static void main(String[] args) {
boolean filesOnStdin = false;
boolean doPDQHash = true;
boolean doPDQDih = false;
boolean doPDQDihAcross = false;
boolean doDetailedOutput = false;
boolean doTimings = true;
boolean keepGoingAfterErrors = false;
// Parse command-line flags. I'm explicitly not using gflags or other such
// libraries, to minimize the number of external dependencies for this
// project.
int argi = 0;
int argc = args.length;
for (argi = 0; argi < argc; argi++) {
if (!args[argi].startsWith("-")) {
break;
}
if (args[argi].equals("-h") || args[argi].equals("--help")) {
usage(0);
} else if (args[argi].equals("-i") || args[argi].equals("--files-on-stdin")) {
filesOnStdin = true;
continue;
} else if (args[argi].equals("-d") || args[argi].equals("--details")) {
doDetailedOutput = true;
continue;
} else if (args[argi].equals("--no-timings")) {
doTimings = false;
continue;
} else if (args[argi].equals("--pdq")) {
doPDQHash = true;
doPDQDih = false;
continue;
} else if (args[argi].equals("--pdqdih")) {
doPDQHash = false;
doPDQDih = true;
doPDQDihAcross = false;
continue;
} else if (args[argi].equals("--pdqdih-across")) {
doPDQHash = false;
doPDQDih = true;
doPDQDihAcross = true;
continue;
} else if (args[argi].equals("-k")) {
keepGoingAfterErrors = true;
continue;
} else {
usage(1);
}
}
PDQHasher pdqHasher = new PDQHasher();
Context context = new Context(
0, // numPDQHash
null, // pdqHashPrev
false); // hadError
// Iterate over image-file names. One file at a time, compute per-file hash
// and hamming distance to previous. (E.g. for video frame-taps).
if (filesOnStdin) {
if (argi < argc) {
usage(1);
}
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String filename = null;
int lno = 1;
try {
while ((filename = reader.readLine()) != null) { // In Java, line-terminators already stripped for us
lno++;
context.numPDQHash++;
processFile(pdqHasher, filename, doPDQHash, doPDQDih, doPDQDihAcross,
doDetailedOutput, doTimings, keepGoingAfterErrors, context);
System.out.flush();
}
} catch (IOException e) {
System.err.printf("Couldn't read line %d of standard input.\n", lno);
System.exit(1);
}
} else {
if (argi >= argc) {
usage(1);
}
for ( ; argi < argc; argi++) {
String filename = args[argi];
context.numPDQHash++;
processFile(pdqHasher, filename, doPDQHash, doPDQDih, doPDQDihAcross,
doDetailedOutput, doTimings, keepGoingAfterErrors, context);
System.out.flush();
}
}
if (context.hadError) {
System.exit(1);
}
}