diff --git a/.gitignore b/.gitignore index dd939580aa..5c90bfb78e 100644 --- a/.gitignore +++ b/.gitignore @@ -67,6 +67,7 @@ /tools/fourcc2pixfmt /tools/ffescape /tools/ffeval +/tools/ffhash /tools/graph2dot /tools/ismindex /tools/pktdumper diff --git a/libavutil/Makefile b/libavutil/Makefile index f7852ee224..5dc61e1d2b 100644 --- a/libavutil/Makefile +++ b/libavutil/Makefile @@ -152,6 +152,6 @@ TESTPROGS = adler32 \ TESTPROGS-$(HAVE_LZO1X_999_COMPRESS) += lzo -TOOLS = ffadler ffeval ffescape +TOOLS = ffhash ffeval ffescape $(SUBDIR)lzo-test$(EXESUF): ELIBS = -llzo2 diff --git a/tools/ffadler.c b/tools/ffhash.c similarity index 50% rename from tools/ffadler.c rename to tools/ffhash.c index 97e62577c9..99b928de27 100644 --- a/tools/ffadler.c +++ b/tools/ffhash.c @@ -1,6 +1,7 @@ /* -* Copyright (c) 2002 Fabrice Bellard -* Copyright (c) 2013 Michael Niedermayer + * Copyright (c) 2002 Fabrice Bellard + * Copyright (c) 2013 Michael Niedermayer + * Copyright (c) 2013 James Almer * * This file is part of FFmpeg. * @@ -20,7 +21,9 @@ */ #include "config.h" -#include "libavutil/adler32.h" +#include "libavutil/error.h" +#include "libavutil/hash.h" +#include "libavutil/mem.h" #include #include @@ -36,34 +39,64 @@ #define SIZE 65536 +static struct AVHashContext *hash; +static uint8_t *res; + +static void usage(void) +{ + int i = 0; + const char *name; + + printf("usage: ffhash [algorithm] [input]...\n"); + printf("Supported hash algorithms:"); + do { + name = av_hash_names(i); + if (name) + printf(" %s", name); + i++; + } while(name); + printf("\n"); +} + +static void finish(void) +{ + int i, len = av_hash_get_size(hash); + + printf("%s=0x", av_hash_get_name(hash)); + av_hash_final(hash, res); + for (i = 0; i < len; i++) + printf("%02x", res[i]); +} + static int check(char *file) { uint8_t buffer[SIZE]; - uint32_t checksum = 1; int fd; int ret = 0; if (file) fd = open(file, O_RDONLY); else fd = 0; if (fd == -1) { - printf("A32=OPEN-FAILED-%d", errno); + printf("%s=OPEN-FAILED: %s:", av_hash_get_name(hash), strerror(errno)); ret = 1; goto end; } + av_hash_init(hash); for (;;) { ssize_t size = read(fd, buffer, SIZE); if (size < 0) { - printf("A32=0x%08x+READ-FAILED-%d", checksum, errno); + finish(); + printf("+READ-FAILED: %s", strerror(errno)); ret = 2; goto end; } else if(!size) break; - checksum = av_adler32_update(checksum, buffer, size); + av_hash_update(hash, buffer, size); } close(fd); - printf("A32=0x%08x", checksum); + finish(); end: if (file) printf(" *%s", file); @@ -77,11 +110,36 @@ int main(int argc, char **argv) int i; int ret = 0; - for (i = 1; i