Merge "Fix incorrect use of uv eobs in intra modes"
diff --git a/build/make/configure.sh b/build/make/configure.sh
index 78a1cee..571fd84 100755
--- a/build/make/configure.sh
+++ b/build/make/configure.sh
@@ -796,6 +796,8 @@
             add_cflags "--sysroot=${alt_libc}"
             add_ldflags "--sysroot=${alt_libc}"
 
+            add_cflags "-I${SDK_PATH}/sources/android/cpufeatures/"
+
             enable pic
             soft_enable realtime_only
             if [ ${tgt_isa} == "armv7" ]; then
diff --git a/vp8/encoder/sad_c.c b/vp8/encoder/sad_c.c
index 3b6e26c..f745bbd 100644
--- a/vp8/encoder/sad_c.c
+++ b/vp8/encoder/sad_c.c
@@ -13,40 +13,15 @@
 #include "vpx_config.h"
 #include "vpx/vpx_integer.h"
 
-unsigned int vp8_sad16x16_c(
-    const unsigned char *src_ptr,
-    int  src_stride,
-    const unsigned char *ref_ptr,
-    int  ref_stride,
-    int max_sad)
-{
-
-    int r, c;
-    unsigned int sad = 0;
-
-    for (r = 0; r < 16; r++)
-    {
-        for (c = 0; c < 16; c++)
-        {
-            sad += abs(src_ptr[c] - ref_ptr[c]);
-        }
-
-        src_ptr += src_stride;
-        ref_ptr += ref_stride;
-    }
-
-    return sad;
-}
-
-
 static __inline
 unsigned int sad_mx_n_c(
     const unsigned char *src_ptr,
     int  src_stride,
     const unsigned char *ref_ptr,
     int  ref_stride,
-    int m,
-    int n)
+    int  max_sad,
+    int  m,
+    int  n)
 {
 
     int r, c;
@@ -59,6 +34,9 @@
             sad += abs(src_ptr[c] - ref_ptr[c]);
         }
 
+        if (sad > max_sad)
+          break;
+
         src_ptr += src_stride;
         ref_ptr += ref_stride;
     }
@@ -66,16 +44,31 @@
     return sad;
 }
 
+/* max_sad is provided as an optional optimization point. Alternative
+ * implementations of these functions are not required to check it.
+ */
+
+unsigned int vp8_sad16x16_c(
+    const unsigned char *src_ptr,
+    int  src_stride,
+    const unsigned char *ref_ptr,
+    int  ref_stride,
+    int  max_sad)
+{
+
+    return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, max_sad, 16, 16);
+}
+
 
 unsigned int vp8_sad8x8_c(
     const unsigned char *src_ptr,
     int  src_stride,
     const unsigned char *ref_ptr,
     int  ref_stride,
-    int max_sad)
+    int  max_sad)
 {
 
-    return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 8, 8);
+    return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, max_sad, 8, 8);
 }
 
 
@@ -84,10 +77,10 @@
     int  src_stride,
     const unsigned char *ref_ptr,
     int  ref_stride,
-    int max_sad)
+    int  max_sad)
 {
 
-    return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 16, 8);
+    return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, max_sad, 16, 8);
 
 }
 
@@ -97,10 +90,10 @@
     int  src_stride,
     const unsigned char *ref_ptr,
     int  ref_stride,
-    int max_sad)
+    int  max_sad)
 {
 
-    return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 8, 16);
+    return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, max_sad, 8, 16);
 }
 
 
@@ -109,10 +102,10 @@
     int  src_stride,
     const unsigned char *ref_ptr,
     int  ref_stride,
-    int max_sad)
+    int  max_sad)
 {
 
-    return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 4, 4);
+    return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, max_sad, 4, 4);
 }
 
 void vp8_sad16x16x3_c(
diff --git a/vp8/encoder/x86/sad_sse2.asm b/vp8/encoder/x86/sad_sse2.asm
index fa8e3e3..0b01d7b 100644
--- a/vp8/encoder/x86/sad_sse2.asm
+++ b/vp8/encoder/x86/sad_sse2.asm
@@ -89,7 +89,7 @@
 ;    int  src_stride,
 ;    unsigned char *ref_ptr,
 ;    int  ref_stride,
-;    int  max_err)
+;    int  max_sad)
 global sym(vp8_sad8x16_wmt)
 sym(vp8_sad8x16_wmt):
     push        rbp
diff --git a/vp8/encoder/x86/sad_sse3.asm b/vp8/encoder/x86/sad_sse3.asm
index a255097..c2af3c8 100644
--- a/vp8/encoder/x86/sad_sse3.asm
+++ b/vp8/encoder/x86/sad_sse3.asm
@@ -19,7 +19,7 @@
   %define     end_ptr       rcx
   %define     ret_var       rbx
   %define     result_ptr    arg(4)
-  %define     max_err       arg(4)
+  %define     max_sad       arg(4)
   %define     height        dword ptr arg(4)
     push        rbp
     mov         rbp,        rsp
@@ -42,7 +42,7 @@
     %define     end_ptr     r10
     %define     ret_var     r11
     %define     result_ptr  [rsp+xmm_stack_space+8+4*8]
-    %define     max_err     [rsp+xmm_stack_space+8+4*8]
+    %define     max_sad     [rsp+xmm_stack_space+8+4*8]
     %define     height      dword ptr [rsp+xmm_stack_space+8+4*8]
   %else
     %define     src_ptr     rdi
@@ -52,7 +52,7 @@
     %define     end_ptr     r9
     %define     ret_var     r10
     %define     result_ptr  r8
-    %define     max_err     r8
+    %define     max_sad     r8
     %define     height      r8
   %endif
 %endif
@@ -67,7 +67,7 @@
   %define     end_ptr
   %define     ret_var
   %define     result_ptr
-  %define     max_err
+  %define     max_sad
   %define     height
 
 %if ABI_IS_32BIT
@@ -587,7 +587,7 @@
 ;    int  src_stride,
 ;    unsigned char *ref_ptr,
 ;    int  ref_stride,
-;    int  max_err)
+;    int  max_sad)
 ;%define lddqu movdqu
 global sym(vp8_sad16x16_sse3)
 sym(vp8_sad16x16_sse3):