Correctly initialize "ones" value in neon quantize
authorJohann <johannkoenig@google.com>
Thu, 20 Nov 2014 21:24:55 +0000 (13:24 -0800)
committerJohann <johannkoenig@google.com>
Fri, 21 Nov 2014 02:34:45 +0000 (18:34 -0800)
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

test/quantize_test.cc
vp8/encoder/arm/neon/fastquantizeb_neon.c

index 756d0f6..329227b 100644 (file)
@@ -147,6 +147,14 @@ TEST_P(QuantizeTest, TestZeroInput) {
   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();
index caa7637..e5824bf 100644 (file)
@@ -19,7 +19,7 @@ static const uint16_t inv_zig_zag[16] = {
 };
 
 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),