The helpers use local memory to compute the final hash, making AV_HASH_MAX_SIZE safe to use.tags/n2.3
| @@ -15,6 +15,9 @@ libavutil: 2012-10-22 | |||||
| API changes, most recent first: | API changes, most recent first: | ||||
| 2014-04-29 - xxxxxxx - lavu 52.80.0 - hash.h | |||||
| Add av_hash_final_bin(), av_hash_final_hex() and av_hash_final_b64(). | |||||
| 2014-03-07 - 8b2a130 - lavc 55.50.0 / 55.53.100 - dxva2.h | 2014-03-07 - 8b2a130 - lavc 55.50.0 / 55.53.100 - dxva2.h | ||||
| Add FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO for old Intel GPUs. | Add FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO for old Intel GPUs. | ||||
| @@ -29,6 +29,7 @@ | |||||
| #include "sha512.h" | #include "sha512.h" | ||||
| #include "avstring.h" | #include "avstring.h" | ||||
| #include "base64.h" | |||||
| #include "error.h" | #include "error.h" | ||||
| #include "intreadwrite.h" | #include "intreadwrite.h" | ||||
| #include "mem.h" | #include "mem.h" | ||||
| @@ -196,6 +197,40 @@ void av_hash_final(AVHashContext *ctx, uint8_t *dst) | |||||
| } | } | ||||
| } | } | ||||
| void av_hash_final_bin(struct AVHashContext *ctx, uint8_t *dst, int size) | |||||
| { | |||||
| uint8_t buf[AV_HASH_MAX_SIZE]; | |||||
| unsigned rsize = av_hash_get_size(ctx); | |||||
| av_hash_final(ctx, buf); | |||||
| memcpy(dst, buf, FFMIN(size, rsize)); | |||||
| if (size > rsize) | |||||
| memset(dst + rsize, 0, size - rsize); | |||||
| } | |||||
| void av_hash_final_hex(struct AVHashContext *ctx, uint8_t *dst, int size) | |||||
| { | |||||
| uint8_t buf[AV_HASH_MAX_SIZE]; | |||||
| unsigned rsize = av_hash_get_size(ctx), i; | |||||
| av_hash_final(ctx, buf); | |||||
| for (i = 0; i < FFMIN(rsize, size / 2); i++) | |||||
| snprintf(dst + i * 2, size - i * 2, "%02x", buf[i]); | |||||
| } | |||||
| void av_hash_final_b64(struct AVHashContext *ctx, uint8_t *dst, int size) | |||||
| { | |||||
| uint8_t buf[AV_HASH_MAX_SIZE], b64[AV_BASE64_SIZE(AV_HASH_MAX_SIZE)]; | |||||
| unsigned rsize = av_hash_get_size(ctx), osize; | |||||
| av_hash_final(ctx, buf); | |||||
| av_base64_encode(b64, sizeof(b64), buf, rsize); | |||||
| osize = AV_BASE64_SIZE(rsize); | |||||
| memcpy(dst, b64, FFMIN(osize, size)); | |||||
| if (size < osize) | |||||
| dst[size - 1] = 0; | |||||
| } | |||||
| void av_hash_freep(AVHashContext **ctx) | void av_hash_freep(AVHashContext **ctx) | ||||
| { | { | ||||
| if (*ctx) | if (*ctx) | ||||
| @@ -82,6 +82,28 @@ void av_hash_update(struct AVHashContext *ctx, const uint8_t *src, int len); | |||||
| */ | */ | ||||
| void av_hash_final(struct AVHashContext *ctx, uint8_t *dst); | void av_hash_final(struct AVHashContext *ctx, uint8_t *dst); | ||||
| /** | |||||
| * Finalize a hash context and compute the actual hash value. | |||||
| * If size is smaller than the hash size, the hash is truncated; | |||||
| * if size is larger, the buffer is padded with 0. | |||||
| */ | |||||
| void av_hash_final_bin(struct AVHashContext *ctx, uint8_t *dst, int size); | |||||
| /** | |||||
| * Finalize a hash context and compute the actual hash value as a hex string. | |||||
| * The string is always 0-terminated. | |||||
| * If size is smaller than 2 * hash_size + 1, the hex string is truncated. | |||||
| */ | |||||
| void av_hash_final_hex(struct AVHashContext *ctx, uint8_t *dst, int size); | |||||
| /** | |||||
| * Finalize a hash context and compute the actual hash value as a base64 string. | |||||
| * The string is always 0-terminated. | |||||
| * If size is smaller than AV_BASE64_SIZE(hash_size), the base64 string is | |||||
| * truncated. | |||||
| */ | |||||
| void av_hash_final_b64(struct AVHashContext *ctx, uint8_t *dst, int size); | |||||
| /** | /** | ||||
| * Free hash context. | * Free hash context. | ||||
| */ | */ | ||||
| @@ -56,7 +56,7 @@ | |||||
| */ | */ | ||||
| #define LIBAVUTIL_VERSION_MAJOR 52 | #define LIBAVUTIL_VERSION_MAJOR 52 | ||||
| #define LIBAVUTIL_VERSION_MINOR 79 | |||||
| #define LIBAVUTIL_VERSION_MINOR 80 | |||||
| #define LIBAVUTIL_VERSION_MICRO 100 | #define LIBAVUTIL_VERSION_MICRO 100 | ||||
| #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ | #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ | ||||