summaryrefslogtreecommitdiff
path: root/libavutil/mem.c
diff options
context:
space:
mode:
authorDiego Biurrun <diego@biurrun.de>2012-10-18 19:27:51 +0200
committerDiego Biurrun <diego@biurrun.de>2012-10-25 11:36:57 +0200
commit5bac2d0c3020587a03cb14e8b6a664a0b92f26c2 (patch)
tree08c6ccffd567aabf43301cc5d3dee357580d3eed /libavutil/mem.c
parenta6e9d6497739b7b60e3284f03b27883514bbc94a (diff)
avutil: Move memcpy_backptr() to mem.c
The function is used elsewhere and does not belong with the LZO code.
Diffstat (limited to 'libavutil/mem.c')
-rw-r--r--libavutil/mem.c37
1 files changed, 37 insertions, 0 deletions
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 <limits.h>
+#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#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);
+ }
+ }
+}