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:
@@ -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(
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user