summaryrefslogtreecommitdiff
path: root/vp9/encoder
diff options
context:
space:
mode:
authorJames Zern <jzern@google.com>2015-11-18 23:17:27 -0800
committerJames Zern <jzern@google.com>2015-11-20 14:35:38 -0800
commit3e0138edb72b2ef1a77d4b636d7c60f74a7abab9 (patch)
tree200c7937e620e59161c37bf6219a7b395c8fac68 /vp9/encoder
parent4993158ee5120b05dfee5cba23d45369c97b7df6 (diff)
downloadlibvpx-3e0138edb72b2ef1a77d4b636d7c60f74a7abab9.tar
libvpx-3e0138edb72b2ef1a77d4b636d7c60f74a7abab9.tar.gz
libvpx-3e0138edb72b2ef1a77d4b636d7c60f74a7abab9.tar.bz2
libvpx-3e0138edb72b2ef1a77d4b636d7c60f74a7abab9.zip
vp9_satd: return an int
the final sum may use up to 26 bits + add a unit test + disable the sse2 as the result will rollover; this will be fixed in a future commit Change-Id: I2a49811dfaa06abfd9fa1e1e65ed7cd68e4c97ce
Diffstat (limited to 'vp9/encoder')
-rw-r--r--vp9/encoder/vp9_avg.c4
-rw-r--r--vp9/encoder/vp9_pickmode.c2
-rw-r--r--vp9/encoder/x86/vp9_avg_intrin_sse2.c5
3 files changed, 7 insertions, 4 deletions
diff --git a/vp9/encoder/vp9_avg.c b/vp9/encoder/vp9_avg.c
index a9a4c3050..7baa09ae5 100644
--- a/vp9/encoder/vp9_avg.c
+++ b/vp9/encoder/vp9_avg.c
@@ -117,14 +117,14 @@ void vp9_hadamard_16x16_c(int16_t const *src_diff, int src_stride,
// coeff: 16 bits, dynamic range [-32640, 32640].
// length: value range {16, 64, 256, 1024}.
-int16_t vp9_satd_c(const int16_t *coeff, int length) {
+int vp9_satd_c(const int16_t *coeff, int length) {
int i;
int satd = 0;
for (i = 0; i < length; ++i)
satd += abs(coeff[i]);
// satd: 26 bits, dynamic range [-32640 * 1024, 32640 * 1024]
- return (int16_t)satd;
+ return satd;
}
// Integer projection onto row vectors.
diff --git a/vp9/encoder/vp9_pickmode.c b/vp9/encoder/vp9_pickmode.c
index 9db044f6b..266c15f4e 100644
--- a/vp9/encoder/vp9_pickmode.c
+++ b/vp9/encoder/vp9_pickmode.c
@@ -673,7 +673,7 @@ static void block_yrd(VP9_COMP *cpi, MACROBLOCK *x, int *rate, int64_t *dist,
if (*eob == 1)
*rate += (int)abs(qcoeff[0]);
else if (*eob > 1)
- *rate += (int)vp9_satd((const int16_t *)qcoeff, step << 4);
+ *rate += vp9_satd((const int16_t *)qcoeff, step << 4);
*dist += vp9_block_error_fp(coeff, dqcoeff, step << 4) >> shift;
}
diff --git a/vp9/encoder/x86/vp9_avg_intrin_sse2.c b/vp9/encoder/x86/vp9_avg_intrin_sse2.c
index 4531d794a..489bdfe55 100644
--- a/vp9/encoder/x86/vp9_avg_intrin_sse2.c
+++ b/vp9/encoder/x86/vp9_avg_intrin_sse2.c
@@ -283,7 +283,9 @@ void vp9_hadamard_16x16_sse2(int16_t const *src_diff, int src_stride,
}
}
-int16_t vp9_satd_sse2(const int16_t *coeff, int length) {
+// TODO(jingning): the sum needs to be accumulated in 32-bits to avoid rollover.
+#if 0
+int vp9_satd_sse2(const int16_t *coeff, int length) {
int i;
__m128i sum = _mm_load_si128((const __m128i *)coeff);
__m128i sign = _mm_srai_epi16(sum, 15);
@@ -309,6 +311,7 @@ int16_t vp9_satd_sse2(const int16_t *coeff, int length) {
return _mm_extract_epi16(sum, 0);
}
+#endif
void vp9_int_pro_row_sse2(int16_t *hbuf, uint8_t const*ref,
const int ref_stride, const int height) {