|
@@ -21,6 +21,7 @@
|
|
|
*/
|
|
|
|
|
|
#include "config.h"
|
|
|
+#include "libavutil/avstring.h"
|
|
|
#include "libavutil/error.h"
|
|
|
#include "libavutil/hash.h"
|
|
|
#include "libavutil/mem.h"
|
|
@@ -40,13 +41,14 @@
|
|
|
#define SIZE 65536
|
|
|
|
|
|
static struct AVHashContext *hash;
|
|
|
+static int out_b64;
|
|
|
|
|
|
static void usage(void)
|
|
|
{
|
|
|
int i = 0;
|
|
|
const char *name;
|
|
|
|
|
|
- printf("usage: ffhash [algorithm] [input]...\n");
|
|
|
+ printf("usage: ffhash [b64:]algorithm [input]...\n");
|
|
|
printf("Supported hash algorithms:");
|
|
|
do {
|
|
|
name = av_hash_names(i);
|
|
@@ -59,10 +61,16 @@ static void usage(void)
|
|
|
|
|
|
static void finish(void)
|
|
|
{
|
|
|
- char res[2 * AV_HASH_MAX_SIZE + 1];
|
|
|
-
|
|
|
- av_hash_final_hex(hash, res, sizeof(res));
|
|
|
- printf("%s=0x%s", av_hash_get_name(hash), res);
|
|
|
+ char res[2 * AV_HASH_MAX_SIZE + 4];
|
|
|
+
|
|
|
+ printf("%s=", av_hash_get_name(hash));
|
|
|
+ if (out_b64) {
|
|
|
+ av_hash_final_b64(hash, res, sizeof(res));
|
|
|
+ printf("b64:%s", res);
|
|
|
+ } else {
|
|
|
+ av_hash_final_hex(hash, res, sizeof(res));
|
|
|
+ printf("0x%s", res);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static int check(char *file)
|
|
@@ -110,16 +118,19 @@ int main(int argc, char **argv)
|
|
|
{
|
|
|
int i;
|
|
|
int ret = 0;
|
|
|
+ const char *hash_name;
|
|
|
|
|
|
if (argc == 1) {
|
|
|
usage();
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- if ((ret = av_hash_alloc(&hash, argv[1])) < 0) {
|
|
|
+ hash_name = argv[1];
|
|
|
+ out_b64 = av_strstart(hash_name, "b64:", &hash_name);
|
|
|
+ if ((ret = av_hash_alloc(&hash, hash_name)) < 0) {
|
|
|
switch(ret) {
|
|
|
case AVERROR(EINVAL):
|
|
|
- printf("Invalid hash type: %s\n", argv[1]);
|
|
|
+ printf("Invalid hash type: %s\n", hash_name);
|
|
|
break;
|
|
|
case AVERROR(ENOMEM):
|
|
|
printf("%s\n", strerror(errno));
|