Clarify 'max_sad' usage

Depending on implementation the optimized SAD functions may return early
when the calculated SAD exceeds max_sad.

Change-Id: I05ce5b2d34e6d45fb3ec2a450aa99c4f3343bf3a
This commit is contained in:
Johann
2012-01-27 11:44:01 -08:00
parent 3653fb473a
commit 6b151d436d
3 changed files with 35 additions and 42 deletions

View File

@@ -13,40 +13,15 @@
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx/vpx_integer.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 static __inline
unsigned int sad_mx_n_c( unsigned int sad_mx_n_c(
const unsigned char *src_ptr, const unsigned char *src_ptr,
int src_stride, int src_stride,
const unsigned char *ref_ptr, const unsigned char *ref_ptr,
int ref_stride, int ref_stride,
int m, int max_sad,
int n) int m,
int n)
{ {
int r, c; int r, c;
@@ -59,6 +34,9 @@ unsigned int sad_mx_n_c(
sad += abs(src_ptr[c] - ref_ptr[c]); sad += abs(src_ptr[c] - ref_ptr[c]);
} }
if (sad > max_sad)
break;
src_ptr += src_stride; src_ptr += src_stride;
ref_ptr += ref_stride; ref_ptr += ref_stride;
} }
@@ -66,16 +44,31 @@ unsigned int sad_mx_n_c(
return sad; 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( unsigned int vp8_sad8x8_c(
const unsigned char *src_ptr, const unsigned char *src_ptr,
int src_stride, int src_stride,
const unsigned char *ref_ptr, const unsigned char *ref_ptr,
int ref_stride, 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, int src_stride,
const unsigned char *ref_ptr, const unsigned char *ref_ptr,
int ref_stride, 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, int src_stride,
const unsigned char *ref_ptr, const unsigned char *ref_ptr,
int ref_stride, 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, int src_stride,
const unsigned char *ref_ptr, const unsigned char *ref_ptr,
int ref_stride, 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( void vp8_sad16x16x3_c(

View File

@@ -89,7 +89,7 @@ sym(vp8_sad16x16_wmt):
; int src_stride, ; int src_stride,
; unsigned char *ref_ptr, ; unsigned char *ref_ptr,
; int ref_stride, ; int ref_stride,
; int max_err) ; int max_sad)
global sym(vp8_sad8x16_wmt) global sym(vp8_sad8x16_wmt)
sym(vp8_sad8x16_wmt): sym(vp8_sad8x16_wmt):
push rbp push rbp

View File

@@ -19,7 +19,7 @@
%define end_ptr rcx %define end_ptr rcx
%define ret_var rbx %define ret_var rbx
%define result_ptr arg(4) %define result_ptr arg(4)
%define max_err arg(4) %define max_sad arg(4)
%define height dword ptr arg(4) %define height dword ptr arg(4)
push rbp push rbp
mov rbp, rsp mov rbp, rsp
@@ -42,7 +42,7 @@
%define end_ptr r10 %define end_ptr r10
%define ret_var r11 %define ret_var r11
%define result_ptr [rsp+xmm_stack_space+8+4*8] %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] %define height dword ptr [rsp+xmm_stack_space+8+4*8]
%else %else
%define src_ptr rdi %define src_ptr rdi
@@ -52,7 +52,7 @@
%define end_ptr r9 %define end_ptr r9
%define ret_var r10 %define ret_var r10
%define result_ptr r8 %define result_ptr r8
%define max_err r8 %define max_sad r8
%define height r8 %define height r8
%endif %endif
%endif %endif
@@ -67,7 +67,7 @@
%define end_ptr %define end_ptr
%define ret_var %define ret_var
%define result_ptr %define result_ptr
%define max_err %define max_sad
%define height %define height
%if ABI_IS_32BIT %if ABI_IS_32BIT
@@ -587,7 +587,7 @@ sym(vp8_sad4x4x3_sse3):
; int src_stride, ; int src_stride,
; unsigned char *ref_ptr, ; unsigned char *ref_ptr,
; int ref_stride, ; int ref_stride,
; int max_err) ; int max_sad)
;%define lddqu movdqu ;%define lddqu movdqu
global sym(vp8_sad16x16_sse3) global sym(vp8_sad16x16_sse3)
sym(vp8_sad16x16_sse3): sym(vp8_sad16x16_sse3):