From 24c65eb29f05e9634ba1d32d81221e8644bbeb19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reimar=20D=C3=B6ffinger?= Date: Fri, 17 May 2013 20:28:03 +0200 Subject: [PATCH] md5: avoid unnecessary copying. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Where necessary use memcpy instead. Thanks to Giorgio Vazzana [mywing81 gmail] for spotting this loop as the cause for the bad performance. Signed-off-by: Reimar Döffinger --- libavutil/md5.c | 34 +++++++++++++++++++++++++++------- libavutil/md5.h | 2 +- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/libavutil/md5.c b/libavutil/md5.c index f8f08f130b..7375ce55a5 100644 --- a/libavutil/md5.c +++ b/libavutil/md5.c @@ -139,20 +139,40 @@ void av_md5_init(AVMD5 *ctx) ctx->ABCD[3] = 0x67452301; } -void av_md5_update(AVMD5 *ctx, const uint8_t *src, const int len) +void av_md5_update(AVMD5 *ctx, const uint8_t *src, int len) { - int i, j; + const uint8_t *end; + int j; j = ctx->len & 63; ctx->len += len; - for (i = 0; i < len; i++) { - ctx->block[j++] = src[i]; - if (j == 64) { - body(ctx->ABCD, (uint32_t *) ctx->block); - j = 0; + if (j) { + int cnt = FFMIN(len, 64 - j); + memcpy(ctx->block + j, src, cnt); + src += cnt; + len -= cnt; + if (j + cnt < 64) + return; + body(ctx->ABCD, (uint32_t *)ctx->block); + } + + end = src + (len & ~63); + if (HAVE_BIGENDIAN || (!HAVE_FAST_UNALIGNED && ((intptr_t)src & 3))) { + while (src < end) { + memcpy(ctx->block, src, 64); + body(ctx->ABCD, (uint32_t *) ctx->block); + src += 64; + } + } else { + while (src < end) { + body(ctx->ABCD, (uint32_t *)src); + src += 64; } } + len &= 63; + if (len > 0) + memcpy(ctx->block, src, len); } void av_md5_final(AVMD5 *ctx, uint8_t *dst) diff --git a/libavutil/md5.h b/libavutil/md5.h index 1d7be9ff53..60daa93a3c 100644 --- a/libavutil/md5.h +++ b/libavutil/md5.h @@ -38,7 +38,7 @@ struct AVMD5; struct AVMD5 *av_md5_alloc(void); void av_md5_init(struct AVMD5 *ctx); -void av_md5_update(struct AVMD5 *ctx, const uint8_t *src, const int len); +void av_md5_update(struct AVMD5 *ctx, const uint8_t *src, int len); void av_md5_final(struct AVMD5 *ctx, uint8_t *dst); void av_md5_sum(uint8_t *dst, const uint8_t *src, const int len);