diff --git a/libavcodec/lzo.c b/libavcodec/lzo.c index 340b552cd8..39accac8b9 100644 --- a/libavcodec/lzo.c +++ b/libavcodec/lzo.c @@ -66,6 +66,19 @@ static inline int get_len(LZOContext *c, int x, int mask) { return cnt; } +//#define UNALIGNED_LOADSTORE +#define BUILTIN_MEMCPY +#ifdef UNALIGNED_LOADSTORE +#define COPY2(d, s) *(uint16_t *)(d) = *(uint16_t *)(s); +#define COPY4(d, s) *(uint32_t *)(d) = *(uint32_t *)(s); +#elif defined(BUILTIN_MEMCPY) +#define COPY2(d, s) memcpy(d, s, 2); +#define COPY4(d, s) memcpy(d, s, 4); +#else +#define COPY2(d, s) (d)[0] = (s)[0]; (d)[1] = (s)[1]; +#define COPY4(d, s) (d)[0] = (s)[0]; (d)[1] = (s)[1]; (d)[2] = (s)[2]; (d)[3] = (s)[3]; +#endif + /** * \brief copy bytes from input to output buffer with checking * \param cnt number of bytes to copy, must be > 0 @@ -82,10 +95,7 @@ static inline void copy(LZOContext *c, int cnt) { c->error |= LZO_OUTPUT_FULL; } #if defined(INBUF_PADDED) && defined(OUTBUF_PADDED) - dst[0] = src[0]; - dst[1] = src[1]; - dst[2] = src[2]; - dst[3] = src[3]; + COPY4(dst, src); src += 4; dst += 4; cnt -= 4; @@ -120,22 +130,16 @@ static inline void copy_backptr(LZOContext *c, int back, int cnt) { dst += cnt; } else { #ifdef OUTBUF_PADDED - dst[0] = src[0]; - dst[1] = src[1]; - dst[2] = src[2]; - dst[3] = src[3]; + COPY2(dst, src); + COPY2(dst + 2, src + 2); src += 4; dst += 4; cnt -= 4; if (cnt > 0) { - dst[0] = src[0]; - dst[1] = src[1]; - dst[2] = src[2]; - dst[3] = src[3]; - dst[4] = src[4]; - dst[5] = src[5]; - dst[6] = src[6]; - dst[7] = src[7]; + COPY2(dst, src); + COPY2(dst + 2, src + 2); + COPY2(dst + 4, src + 4); + COPY2(dst + 6, src + 6); src += 8; dst += 8; cnt -= 8;