Merge "OS X shell is incompatible with echo -n"
diff --git a/vp8/encoder/rdopt.c b/vp8/encoder/rdopt.c
index 433412d..528e6be 100644
--- a/vp8/encoder/rdopt.c
+++ b/vp8/encoder/rdopt.c
@@ -1737,6 +1737,7 @@
int best_intra_rd = INT_MAX;
int rate2, distortion2;
int uv_intra_rate, uv_intra_distortion, uv_intra_rate_tokenonly;
+ int uv_intra_tteob = 0;
int rate_y, UNINITIALIZED_IS_SAFE(rate_uv);
int distortion_uv;
int best_yrd = INT_MAX;
@@ -1787,6 +1788,13 @@
x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME;
rd_pick_intra_mbuv_mode(cpi, x, &uv_intra_rate, &uv_intra_rate_tokenonly, &uv_intra_distortion);
uv_intra_mode = x->e_mbd.mode_info_context->mbmi.uv_mode;
+ /*
+ * Total of the eobs is used later to further adjust rate2. Since uv block's
+ * intra eobs will be overwritten when we check inter modes in following
+ * for-loop, we need to save uv_intra_tteob here.
+ */
+ for (i = 16; i < 24; i++)
+ uv_intra_tteob += x->e_mbd.eobs[i];
for (mode_index = 0; mode_index < MAX_MODES; mode_index++)
{
@@ -2209,9 +2217,18 @@
tteob = 0;
- for (i = 0; i <= 24; i++)
+ if (x->e_mbd.mode_info_context->mbmi.ref_frame)
{
- tteob += x->e_mbd.eobs[i];
+ for (i = 0; i <= 24; i++)
+ tteob += x->e_mbd.eobs[i];
+ }
+ else
+ {
+ for (i = 0; i < 16; i++)
+ tteob += x->e_mbd.eobs[i];
+
+ tteob += uv_intra_tteob;
+ tteob += x->e_mbd.eobs[24];
}
if (tteob == 0)
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):