From: Reimar Döffinger Date: Fri, 17 May 2013 18:28:03 +0000 (+0200) Subject: md5: avoid unnecessary copying. X-Git-Tag: android-x86-4.4-r1~3467 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=24c65eb29f05e9634ba1d32d81221e8644bbeb19;p=android-x86%2Fexternal-ffmpeg.git md5: avoid unnecessary copying. 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 --- 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);