From 5bac2d0c3020587a03cb14e8b6a664a0b92f26c2 Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Thu, 18 Oct 2012 19:27:51 +0200 Subject: avutil: Move memcpy_backptr() to mem.c The function is used elsewhere and does not belong with the LZO code. --- libavutil/mem.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'libavutil/mem.c') diff --git a/libavutil/mem.c b/libavutil/mem.c index 16c1adb014..feba3163b0 100644 --- a/libavutil/mem.c +++ b/libavutil/mem.c @@ -27,6 +27,7 @@ #include "config.h" #include +#include #include #include #if HAVE_MALLOC_H @@ -34,6 +35,7 @@ #endif #include "avutil.h" +#include "intreadwrite.h" #include "mem.h" /* here we can use OS-dependent allocation functions */ @@ -177,3 +179,38 @@ char *av_strdup(const char *s) } return ptr; } + +void av_memcpy_backptr(uint8_t *dst, int back, int cnt) +{ + const uint8_t *src = &dst[-back]; + if (back == 1) { + memset(dst, *src, cnt); + } else { + if (cnt >= 4) { + AV_COPY16U(dst, src); + AV_COPY16U(dst + 2, src + 2); + src += 4; + dst += 4; + cnt -= 4; + } + if (cnt >= 8) { + AV_COPY16U(dst, src); + AV_COPY16U(dst + 2, src + 2); + AV_COPY16U(dst + 4, src + 4); + AV_COPY16U(dst + 6, src + 6); + src += 8; + dst += 8; + cnt -= 8; + } + if (cnt > 0) { + int blocklen = back; + while (cnt > blocklen) { + memcpy(dst, src, blocklen); + dst += blocklen; + cnt -= blocklen; + blocklen <<= 1; + } + memcpy(dst, src, cnt); + } + } +} -- cgit v1.2.3