From dc0f479d6a0e76ba26b7bf8cd1ee33d99d5bee6a Mon Sep 17 00:00:00 2001
From: James Zern <jzern@google.com>
Date: Thu, 3 Jul 2014 23:06:06 -0700
Subject: [PATCH] configure: add --enable-aligned

forces aligned memory reads (via memcpy) in the VP8 bit reader, useful
for platforms that don't support unaligned loads.

Change-Id: Ifa44a9a1677fbdc6a929520f9340b7e3fcbd6692
---
 configure.ac               | 13 +++++++++++++
 src/utils/bit_reader_inl.h | 13 ++++++++++++-
 2 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/configure.ac b/configure.ac
index 665647d4..617abf65 100644
--- a/configure.ac
+++ b/configure.ac
@@ -410,6 +410,19 @@ if test "$target_os" = "mingw32" -a "$enable_wic" = "yes"; then
   fi
 fi
 
+dnl === If --enable-aligned is defined, define WEBP_FORCE_ALIGNED
+
+AC_MSG_CHECKING(if --enable-aligned option is specified)
+AC_ARG_ENABLE([aligned],
+              AS_HELP_STRING([--enable-aligned],
+                             [Force aligned memory operations in non-dsp code
+                              (may be slower)]))
+if test "$enable_aligned" = "yes"; then
+  AC_DEFINE(WEBP_FORCE_ALIGNED, [1],
+            [Define to 1 to force aligned memory operations])
+fi
+AC_MSG_RESULT(${enable_aligned-no})
+
 dnl === If --enable-swap-16bit-csp is defined, add -DWEBP_SWAP_16BIT_CSP
 
 USE_SWAP_16BIT_CSP=""
diff --git a/src/utils/bit_reader_inl.h b/src/utils/bit_reader_inl.h
index 24a375bc..24ae93bc 100644
--- a/src/utils/bit_reader_inl.h
+++ b/src/utils/bit_reader_inl.h
@@ -16,6 +16,14 @@
 #ifndef WEBP_UTILS_BIT_READER_INL_H_
 #define WEBP_UTILS_BIT_READER_INL_H_
 
+#ifdef HAVE_CONFIG_H
+#include "../webp/config.h"
+#endif
+
+#ifdef WEBP_FORCE_ALIGNED
+#include <string.h>  // memcpy
+#endif
+
 #include "./bit_reader.h"
 #include "./endian_inl.h"
 
@@ -52,7 +60,10 @@ static WEBP_INLINE void VP8LoadNewBytes(VP8BitReader* const br) {
   if (br->buf_ + sizeof(lbit_t) <= br->buf_end_) {
     // convert memory type to register type (with some zero'ing!)
     bit_t bits;
-#if defined(__mips__)                          // MIPS
+#if defined(WEBP_FORCE_ALIGNED)
+    lbit_t in_bits;
+    memcpy(&in_bits, br->buf_, sizeof(in_bits));
+#elif defined(__mips__)                        // MIPS
     // This is needed because of un-aligned read.
     lbit_t in_bits;
     lbit_t* p_buf_ = (lbit_t*)br->buf_;