shithub: libvpx

Download patch

ref: 08ad7e4db57ab5be05a5304ad518c0886e18ad17
parent: 72522dbc86673569c03127f37f0f42d244ed7b73
author: Johann <johannkoenig@google.com>
date: Thu Nov 20 08:24:55 EST 2014

Correctly initialize "ones" value in neon quantize

By using 0xff for a short it was not setting the high bits. When
comparing the output with vtst to find non-zero elements it was skipping
vaules which had no low bits set such as -512 / 0xFE00.

Using -8191 as the first element of coeff will generate this condition.

BUG=883

Change-Id: Ia1e10fb809d1e7866f28c56769fe703e6231a657

--- a/test/quantize_test.cc
+++ b/test/quantize_test.cc
@@ -147,6 +147,14 @@
   RunComparison();
 }
 
+TEST_P(QuantizeTest, TestLargeNegativeInput) {
+  FillCoeffConstant(0);
+  // Generate a qcoeff which contains 512/-512 (0x0100/0xFE00) to catch issues
+  // like BUG=883 where the constant being compared was incorrectly initialized.
+  vp8_comp_->mb.coeff[0] = -8191;
+  RunComparison();
+}
+
 TEST_P(QuantizeTest, TestRandomInput) {
   FillCoeffRandom();
   RunComparison();
--- a/vp8/encoder/arm/neon/fastquantizeb_neon.c
+++ b/vp8/encoder/arm/neon/fastquantizeb_neon.c
@@ -19,7 +19,7 @@
 };
 
 void vp8_fast_quantize_b_neon(BLOCK *b, BLOCKD *d) {
-    const int16x8_t one_q = vdupq_n_s16(0xff),
+    const int16x8_t one_q = vdupq_n_s16(-1),
                     z0 = vld1q_s16(b->coeff),
                     z1 = vld1q_s16(b->coeff + 8),
                     round0 = vld1q_s16(b->round),