diff options
author | James Zern <jzern@google.com> | 2015-11-18 23:17:27 -0800 |
---|---|---|
committer | James Zern <jzern@google.com> | 2015-11-20 14:35:38 -0800 |
commit | 3e0138edb72b2ef1a77d4b636d7c60f74a7abab9 (patch) | |
tree | 200c7937e620e59161c37bf6219a7b395c8fac68 /vp9/encoder | |
parent | 4993158ee5120b05dfee5cba23d45369c97b7df6 (diff) | |
download | libvpx-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.c | 4 | ||||
-rw-r--r-- | vp9/encoder/vp9_pickmode.c | 2 | ||||
-rw-r--r-- | vp9/encoder/x86/vp9_avg_intrin_sse2.c | 5 |
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) { |