]> granicus.if.org Git - libvpx/commitdiff
Clarify 'max_sad' usage
authorJohann <johannkoenig@google.com>
Fri, 27 Jan 2012 19:44:01 +0000 (11:44 -0800)
committerJohann <johannkoenig@google.com>
Thu, 16 Feb 2012 23:17:44 +0000 (15:17 -0800)
Depending on implementation the optimized SAD functions may return early
when the calculated SAD exceeds max_sad.

Change-Id: I05ce5b2d34e6d45fb3ec2a450aa99c4f3343bf3a

vp8/encoder/sad_c.c
vp8/encoder/x86/sad_sse2.asm
vp8/encoder/x86/sad_sse3.asm

index 3b6e26c4e9a9feb45ae6f903c960c18851f6546d..f745bbd3d58e69c3d8dda24bfeea04befc266359 100644 (file)
 #include "vpx_config.h"
 #include "vpx/vpx_integer.h"
 
-unsigned int vp8_sad16x16_c(
+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 max_sad)
+    int  max_sad,
+    int  m,
+    int  n)
 {
 
     int r, c;
     unsigned int sad = 0;
 
-    for (r = 0; r < 16; r++)
+    for (r = 0; r < n; r++)
     {
-        for (c = 0; c < 16; c++)
+        for (c = 0; c < m; c++)
         {
             sad += abs(src_ptr[c] - ref_ptr[c]);
         }
 
+        if (sad > max_sad)
+          break;
+
         src_ptr += src_stride;
         ref_ptr += ref_stride;
     }
@@ -38,32 +44,19 @@ unsigned int vp8_sad16x16_c(
     return sad;
 }
 
+/* max_sad is provided as an optional optimization point. Alternative
+ * implementations of these functions are not required to check it.
+ */
 
-static __inline
-unsigned int sad_mx_n_c(
+unsigned int vp8_sad16x16_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 r, c;
-    unsigned int sad = 0;
-
-    for (r = 0; r < n; r++)
-    {
-        for (c = 0; c < m; c++)
-        {
-            sad += abs(src_ptr[c] - ref_ptr[c]);
-        }
-
-        src_ptr += src_stride;
-        ref_ptr += ref_stride;
-    }
-
-    return sad;
+    return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, max_sad, 16, 16);
 }
 
 
@@ -72,10 +65,10 @@ unsigned int vp8_sad8x8_c(
     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 @@ unsigned int vp8_sad16x8_c(
     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 @@ unsigned int vp8_sad8x16_c(
     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 @@ unsigned int vp8_sad4x4_c(
     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(
index fa8e3e3f8c31b41fb1b8d1eedd1796c8f0e3c954..0b01d7b6128ddc2b4f4eaf069269d45001b200ec 100644 (file)
@@ -89,7 +89,7 @@ sym(vp8_sad16x16_wmt):
 ;    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
index a2550974cf282bf3d48bb1f0332e07066bbd0e18..c2af3c86f263d03d18a9061863c7bbaeff3a931c 100644 (file)
@@ -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 @@ sym(vp8_sad4x4x3_sse3):
 ;    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):